From 50f3b8f0cb6ccbdc5c1ea8f916f3d95b197d3d04 Mon Sep 17 00:00:00 2001 From: Leo C Date: Thu, 4 Jun 2015 12:17:38 +0200 Subject: [PATCH] file reorg. move routines, that are mainly used in initialization to banked area --- cbios/.gitignore | 2 +- cbios/Makefile | 2 +- cbios/ascip.180 | 9 +- cbios/bioskrnl.180 | 219 +------------------------ cbios/boot.180 | 21 ++- cbios/chario.180 | 14 +- cbios/conbuf.180 | 7 +- cbios/misc.180 | 196 +---------------------- cbios/msgbuf.180 | 2 - cbios/sdio.180 | 4 +- cbios/time.180 | 39 +++-- cbios/utils.180 | 388 +++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 450 insertions(+), 453 deletions(-) create mode 100644 cbios/utils.180 diff --git a/cbios/.gitignore b/cbios/.gitignore index f474f34..babe1d8 100644 --- a/cbios/.gitignore +++ b/cbios/.gitignore @@ -4,6 +4,6 @@ *.sym *.map *.rel +*.hex *.spr cpm3.sys - diff --git a/cbios/Makefile b/cbios/Makefile index 65cdd7b..7090dee 100644 --- a/cbios/Makefile +++ b/cbios/Makefile @@ -1,7 +1,7 @@ SRC := bioskrnl.180 boot.180 chario.180 drvtbl.180 -SRC += move.180 misc.180 time.180 mm.180 +SRC += move.180 time.180 mm.180 misc.180 utils.180 SRC += msgbuf.180 conbuf.180 ascip.180 sdio.180 SRC += scb.180 diff --git a/cbios/ascip.180 b/cbios/ascip.180 index ed814aa..4bb2f09 100644 --- a/cbios/ascip.180 +++ b/cbios/ascip.180 @@ -20,8 +20,6 @@ ;-------------------------------------------------------------- -; -; ; TC = (f PHI /(2*baudrate*Clock_mode)) - 2 ; ; Clock_mode == 16 @@ -30,13 +28,14 @@ ; br150 = baudrate/150 ; TC = (f PHI / (32 * 150 * br150)) - 2 ; TC = (f PHI / (32 * 150 * br150)) - 2 -; - cseg + ; ; Init Serial I/O for console input and output (ASCI1) ; + dseg + as0init: ld hl,initab0 jr as_init @@ -124,6 +123,8 @@ initab1: ;-------------------------------------------------------------- + cseg + as0ista: in0 a,(stat0) and M_RDRF diff --git a/cbios/bioskrnl.180 b/cbios/bioskrnl.180 index 993e60e..f2cfde8 100644 --- a/cbios/bioskrnl.180 +++ b/cbios/bioskrnl.180 @@ -20,9 +20,6 @@ ; can be combined to support a particular system ; configuration. -cr equ 13 -lf equ 10 -bell equ 7 ctlQ equ 'Q'-'@' ctlS equ 'S'-'@' @@ -65,16 +62,6 @@ ccp equ 0100h ; Console Command Processor gets loaded extrn ?time ; signal time operation - ; general utility routines - - public ?pmsg ; print message - public pr.dec,pr.decl ; print 16 or 32 bit decimal number - public ?pderr ; print BIOS disk error message header - public pr.inln,pr.crlf ; print message inline - public phex4,phex2 ; print 4 digit hex (HL), or 2 digit hex (A) - - extrn div32_16 ; divide 32 bit by 16 bit number - include modebaud.inc ; define mode bits @@ -285,12 +272,12 @@ co$next: add hl,hl ; shift out next bit jr nc,not$out$device push hl ; save the vector - push bc ; save the count and character -not$out$ready: - call coster - or a - jp z,not$out$ready - pop bc +; push bc ; save the count and character +;not$out$ready: +; call coster +; or a +; jr z,not$out$ready +; pop bc push bc ; restore and resave the character and device call ?co ; if device selected, print it pop bc ; recover count and character @@ -489,189 +476,6 @@ ipchl: ; vectored CALL point jp (hl) -;------------------------------------------------------------------------------- -; print message @ up to a null -; saves & - -?pmsg: - push bc - push de -pmsg$loop: - ld a,(hl) - or a - jr z,pmsg$exit - ld c,a - push hl - call ?cono - pop hl - inc hl - jr pmsg$loop -pmsg$exit: - pop de - pop bc - ret - -;------------------------------------------------------------------------------- -; print message inline up to a null -; saves all registers - -pr.inln: - ex (sp),hl - push af - call ?pmsg - pop af - ex (sp),hl - ret - -;------------------------------------------------------------------------------- -; print -; saves all registers - -pr.crlf: - call pr.inln - db 13,10,0 - ret - -;------------------------------------------------------------------------------- -; print hl as a 4 digit hexadecimal number -; saves all registers - -phex4: - ld a,h - call phex2 - ld a,l - ; fall thru - -;------------------------------------------------------------------------------- -; print a as a 2 digit hexadecimal number -; saves all registers - -phex2: - push af - rra - rra - rra - rra - call print.digit - pop af - -print.digit: - push hl - push de - push bc - push af - and 00fh - cp 10 - jr c,prd_1 - add a,007h -prd_1: - add a,'0' - - ld c,a - call ?cono - pop af - pop bc - pop de - pop hl - ret - - -;------------------------------------------------------------------------------- -; print decimal 16 bit number from HL -; -; HL: unsigned binary number to print -; C: minimum print field width -; number is prined right-aligned -; B: pad character, typically ' ' or '0' - -pr.dec: - push de - ld de,0 - call pr.decl - pop de - ret - -;------------------------------------------------------------------------------- -; print decimal 32 bit number from DEHL -; -; DEHL: unsigned binary number to print -; C: minimum print field width -; number is prined right-aligned -; B: pad character, typically ' ' or '0' - -pr.decl: - push bc ;save width and fillchar - push bc - exx ;(alt) - ex (sp),hl ;save hl', get width and fill - push de ;save de' - - xor a - ld d,a ;clear counter - ld e,a - push af ; string terminator - inc sp - -prd_divloop: ;do - exx ; (main) - ld bc,10 ; - call div32_16 ; get a digit - ld a,c ; - add a,'0' ; make it printable - push af ; - - ld a,h ; - or l ; - or d ; - or e ; - exx ; (alt) - inc sp ; - inc de ; - jr nz,prd_divloop ; - -prd_filloop: ;h=filler, l=field width - ld a,e - cp l - jr nc,prd_out - push hl - inc sp - inc de - jr prd_filloop -prd_out: - ld hl,0 - add hl,sp ;ptr to beginning of number string (hl==0 here) - call ?pmsg - ex de,hl - add hl,sp - ld sp,hl - inc sp ;remove string terminator - pop de - pop hl - exx ;(main) - pop bc - ret - - -;------------------------------------------------------------------------------- -; -?pderr: - ld hl,drive$msg - call ?pmsg ; error header - ld a,(@adrv) - add a,'A' - ld c,a - call ?cono ; drive code - ld hl,track$msg - call ?pmsg ; track header - ld c,0 - ld hl,(@trk) - call pr.dec ; track number - ld hl,sector$msg - call ?pmsg ; sector header - ld hl,(@sect) - call pr.dec ; sector number - ret - ; BNKSEL ; Bank Select. Select CPU bank for further execution. @@ -686,12 +490,8 @@ xofflist: db -1,-1,-1,-1,-1,-1,-1,-1 ; ctl-s clears to zero db -1,-1,-1,-1,-1,-1,-1,-1 - - dseg ; following resides in banked memory - - ; Disk I/O interface routines @@ -842,13 +642,6 @@ flush: ret ; return with no error - - ; error message components -drive$msg: db cr,lf,bell,'BIOS Error on ',0 -track$msg: db ': T-',0 -sector$msg: db ', S-',0 - - ; disk communication data items ; do not change order. sd driver depends on this diff --git a/cbios/boot.180 b/cbios/boot.180 index 99a8733..5256539 100644 --- a/cbios/boot.180 +++ b/cbios/boot.180 @@ -49,7 +49,7 @@ hwini_skip: ret ?init: - ld hl,0100000000000000b ; assign console to ASCI1: + ld hl,1000000000000000b ; assign console to AVRCON: ld (@civec),hl ld (@covec),hl ld hl,0000000000000000b ; assign printer to nothing: @@ -59,11 +59,11 @@ hwini_skip: ld (@aovec),hl - ld c,2 - call gs_rtc ; get time and date call intinit ; setup interrupts and vectors call prt0ini ; init timer ei + ld c,2 + call gs_rtc ; get time and date xor a ld (@cbnk),a ; right now in bank 0 @@ -72,7 +72,7 @@ hwini_skip: db 13,10,13,10,'CP/M Version 3.0, Z180-Stamp BIOS',13,10,0 call pr.inln - db 'CPU clock [Hz]: ',0 + db 'Estimated CPU clock [Hz]: ',0 ld hl,(f_cpu) ld de,(f_cpu+2) @@ -142,17 +142,14 @@ no$ccp: ; here if we couldn't find the file rl$1: ld a,2 call ?bnksl ; select extra bank - ld a,(hl) - push af ; get a byte + ld a,(hl) ; get a byte + ex af,af' ld a,tpa$bank call ?bnksl ; select TPA - pop af + ex af,af' ld (hl),a ; save the byte - inc hl - dec bc ; bump pointer, drop count - ld a,b - or c ; test for done - jp nz,rl$1 + cpi ; bump pointer, drop count + jp pe,rl$1 ret diff --git a/cbios/chario.180 b/cbios/chario.180 index 766bf59..9a14305 100644 --- a/cbios/chario.180 +++ b/cbios/chario.180 @@ -11,7 +11,7 @@ extrn ff.init,ff.ist,ff.in,ff.ost,ff.out extrn as0init,as0ista,as0inp,as0osta,as0out extrn as1init,as1ista,as1inp,as1osta,as1out - + extrn _b0call include config.inc include z180reg.inc @@ -27,6 +27,11 @@ max$devices equ 3 ; c: device ?cinit: ; init devices + b0call _cinit + ret + + dseg +_cinit: ld b,c call vector$io dw ff.init @@ -34,6 +39,8 @@ max$devices equ 3 dw as1init dw rret + cseg + ;-------------------------------------------------------------- ; Character input ; b: device @@ -140,10 +147,5 @@ null$status: db 0 ; table terminator -;-------------------------------------------------------------- - - - - end diff --git a/cbios/conbuf.180 b/cbios/conbuf.180 index ef11813..7275643 100644 --- a/cbios/conbuf.180 +++ b/cbios/conbuf.180 @@ -14,8 +14,6 @@ endif - cseg - mkbuf ci.fifo_id, ci.fifo, ci.fifo_len mkbuf co.fifo_id, co.fifo, co.fifo_len @@ -27,21 +25,20 @@ ico equ co.fifo_id * 3 ; Init Serial I/O for console input and output ; - + dseg ff.init: ld a,(INIDONE) cp INIDONEVAL ret z ld ix,ci.fifo - ld a,ci.fifo.mask call bufinit ld ix,co.fifo - ld a,co.fifo.mask jp bufinit ;-------------------------------------------------------------- + cseg ff.ist: push ix ld ix,(fifolst+ici) ; diff --git a/cbios/misc.180 b/cbios/misc.180 index ae9190c..b3e486d 100644 --- a/cbios/misc.180 +++ b/cbios/misc.180 @@ -1,199 +1,17 @@ - global add_hla,div32_16,div32_r - global ioiniml,ioini1l global intinit global bufinit global cpu_frq global fifolst - extrn ?pmsg + extrn div32_r,?pmsg extrn msg.sm,msg.recv,hwl2phy include config.inc include z180reg.inc -;-------------------------------------------------------------------- -; add a to hl -; -; return: -; hl = hl + a -; Flags undefined - - cseg ; (common. TODO: check for banked) - -add_hla: - add a,l - ld l,a - ret nc - inc h - ret - -;-------------------------------------------------------------------- -; rounded div 32 by 16 bit -; -; HLDE: Dividend (x) -; BC: Divisor (y) -; return: -; HLDE: Rounded Quotient (q) -; BC: Remainder (r) - - dseg ;banked. - -div32_r: - push bc - srl b ;y/2 - rr c - add hl,bc ;low x + y/2 - pop bc - jr nc,div_r1 - inc hl -div_r1: - ;fall thru - -;-------------------------------------------------------------------- -; Divide 32 bit by 16 -; -; DEHL: Dividend (x) -; BC: Divisor (y) -; -; return: -; DEHL: Quotient -; BC: Reminder - - dseg ; same as above! -div32_16: - exx ;low - push de ;save alternate registers (de,bc) - push bc - exx ;high - push hl ;lx - push bc ;ly - ld bc,0 ;bc = hy = 0 - ld h,b ;hl = hr = 0 - ld l,c - ;de = x, hl = r - exx ;low - pop bc ;bc' = ly - ex (sp),hl ;hl' = lx, save alternate hl - ld de,0 ;de' = lr = 0 - ex de,hl ;de = x, hl = r - exx ;high - ld a,32 ;count -; -; start: -; de: x (de: hx, de': lx) -; bc: y (bc: hy, bc': ly) -; hl: 0 -; -div_lp: ;do - exx ; low - ex de,hl ; x - add hl,hl ; x <<= 1 - exx ; high - ex de,hl ; x - adc hl,hl ; x <<= 1 - exx ; low - ex de,hl ; r - adc hl,hl ; r <<= 1 - exx ; high - ex de,hl ; r - adc hl,hl ; r <<= 1 - exx ; low - inc de ; x/q += 1 - or a ; - sbc hl,bc ; - exx ; high - sbc hl,bc ; - jr nc,div_no_restore - exx ; low - dec de ; - add hl,bc ; r += y - exx ; high - adc hl,bc ; - -div_no_restore: ; - dec a ; - jr nz,div_lp ;while (--count) - -; result: -; de: q (de: hq, de': lq) -; hl: r (hl: hr, hl': lr) - - exx ;low - ex de,hl ;hl = lq, de = lr - - ex (sp),hl ;lq - push de ;lr - exx ;high - pop bc ;bc = lr - pop hl ;de = lq - - exx ;low - pop bc ;restore alternate registers - pop de - exx ;high - ret - -;---------------------------------------------------------------------- - - ; output bytes to consecutive portaddresses - ; - ; hl: table with following structure: - ; db n, port1, val1, val2,... valn - ; db m, port1, val1, val2,... valm - ; ... - ; db 0 ; Terminate table - - - cseg ; (common for now) - -ioiniml: - push bc - xor a -ioml_lp: - ld b,(hl) - inc hl - cp b - jr z,ioml_e - - ld c,(hl) - inc hl - otimr - jr ioml_lp -ioml_e: - pop bc - ret - -;---------------------------------------------------------------------- - - ; output bytes to ports - ; - ; hl: tables of port,value pairs: - ; db n, port1,val1, port2,val2,... portn,valn - ; ... - ; db 0 ; Terminate table - - cseg ; (common for now) - -ioini1l: - push bc - jr io1_nxt -io1_lp: - ld c,(hl) ;port address - inc hl - otim - jr nz,io1_lp -io1_nxt: - ld b,(hl) ;count - inc hl - inc b - djnz io1_lp - - pop bc - ret - ;---------------------------------------------------------------------- dseg @@ -285,23 +103,21 @@ cpu_frq: ; ; ld hl,8192 ; 147456/18 - ld hl,10240 ; 184320/18 + ld hl,(10240-100)*5 ; 184320/18 ld de,1 or a dly_lp: sbc hl,de ; 10 - jr nz,dly_lp ; 6/8 -> 18 + jr nz,dly_lp ; 6/8 -> 18 cycles pop hl pop de call get_timer - ld bc,10 - call div32_r ld b,h ld c,l - ld de,00119h ;18432000/(2**16) - ld hl,04000h ;18432000%(2**16) + ld de,036EEh ;18432000/(2**16) * 50 + ld hl,08000h ;18432000%(2**16) * 50 ld a,b or a @@ -353,7 +169,6 @@ fifolst: dseg bufinit: - ld c,a ld a,(ix+o.id) cp 4 jr nc,bfi_doit2 @@ -398,7 +213,6 @@ bfi_doit: bfi_doit2: ld (ix+o.in_idx),0 ;reset pointers ld (ix+o.out_idx),0 - ld (ix+o.mask),c ;reset "size" push ix ;get phys. address of fifo pop hl diff --git a/cbios/msgbuf.180 b/cbios/msgbuf.180 index 92544eb..a5dfa49 100644 --- a/cbios/msgbuf.180 +++ b/cbios/msgbuf.180 @@ -49,10 +49,8 @@ msginit: msgi_1: ld ix,mtx.fifo - ld a,mtx.fifo.mask call bufinit ld ix,mrx.fifo - ld a,mrx.fifo.mask jp bufinit diff --git a/cbios/sdio.180 b/cbios/sdio.180 index b229c8d..cf9310e 100644 --- a/cbios/sdio.180 +++ b/cbios/sdio.180 @@ -3,8 +3,6 @@ ; CP/M-80 Version 3 -- Modular BIOS - dseg - ; Disk drive dispatching tables for linked BIOS public sd0,sd1,sd2,sd3 @@ -54,6 +52,8 @@ lf equ 10 bell equ 7 + dseg + ; Extended Disk Parameter Headers (XPDHs) dw sd$write diff --git a/cbios/time.180 b/cbios/time.180 index 6569682..e2ffc6b 100644 --- a/cbios/time.180 +++ b/cbios/time.180 @@ -8,6 +8,7 @@ extrn f_cpu extrn ioiniml,div32_16 extrn msg.sm,msg.recv + extrn _b0call include config.inc include z180reg.inc @@ -24,31 +25,35 @@ ld c,3 - ; fall thru + b0call gs_rtc + ret ;---------------------------------------------------------------------- ; c = 2: get time ; c = 3: set time + dseg gs_rtc: push hl push de + di ld hl,(@date) - push hl ;2 ld a,(@hour) - ld h,a + ld d,a ld a,(@min) - ld l,a - push hl ;4 + ld e,a ld a,(@sec) + ei ld b,a ;b = sec, c = subcommand + push hl ;2 + push de ;4 push bc ;6 ld hl,3 * 256 + 0 ;h = command, l = 0 push hl ;8 - ld h,l + ld h,l ;hl = 0 add hl,sp push hl inc hl ;7 @@ -60,17 +65,19 @@ gs_rtc: ld b,8 ; max receive message len call msg.recv - pop hl ;len/command - pop hl ;subc/sec - ld a,h - ld (@sec),a + pop hl ;len/command (discard) + pop bc ;subc/sec + pop de pop hl - ld a,l + ld a,b + di + ld (@sec),a + ld a,e ld (@min),a - ld a,h + ld a,d ld (@hour),a - pop hl ld (@date),hl + ei pop de pop hl @@ -126,7 +133,7 @@ isvprt0: in0 a,(tmdr0l) in0 a,(tmdr0h) - ld a,(tim_ms) ; + ld a,(counter_10ms) ; inc a cp 100 ;100 * 10ms ? jr nz,iprt_1 @@ -166,12 +173,12 @@ iprt_2: ld (@sec),a xor a iprt_1: - ld (tim_ms),a + ld (counter_10ms),a pop af ei ret -tim_ms: +counter_10ms: db 0 end diff --git a/cbios/utils.180 b/cbios/utils.180 new file mode 100644 index 0000000..f682d44 --- /dev/null +++ b/cbios/utils.180 @@ -0,0 +1,388 @@ + title 'general utility routines' + + ; i/o port init routines + + public ioiniml,ioini1l ; + + ; math + + public add_hla ; add a to hl + public div32_16,div32_r ; divide 32 bit by 16 bit number (rounded) + + ; print utils + + public ?pmsg ; print message + public pr.inln,pr.crlf ; print message inline, print newline + public phex2,phex4 ; print 2 digit hex (A) or 4 digit hex (HL) + public pr.dec,pr.decl ; print 16 or 32 bit decimal number + public ?pderr ; print BIOS disk error message header + + + + extrn ?cono + extrn @adrv,@trk,@sect ; used by disk error message + +;------------------------------------------------------------------------------- + +cr equ 13 +lf equ 10 +bell equ 7 + + + dseg + +;---------------------------------------------------------------------- +; output bytes to consecutive portaddresses +; +; hl: table with following structure: +; db n, port1, val1, val2,... valn +; db m, port1, val1, val2,... valm +; ... +; db 0 ; Terminate table + +ioiniml: + push bc + xor a +ioml_lp: + ld b,(hl) + inc hl + cp b + jr z,ioml_e + + ld c,(hl) + inc hl + otimr + jr ioml_lp +ioml_e: + pop bc + ret + +;---------------------------------------------------------------------- +; output bytes to ports +; +; hl: tables of port,value pairs: +; db n, port1,val1, port2,val2,... portn,valn +; ... +; db 0 ; Terminate table + +ioini1l: + push bc + jr io1_nxt +io1_lp: + ld c,(hl) ;port address + inc hl + otim + jr nz,io1_lp +io1_nxt: + ld b,(hl) ;count + inc hl + inc b + djnz io1_lp + + pop bc + ret + +;-------------------------------------------------------------------- +; add a to hl +; +; return: +; hl = hl + a +; Flags undefined + +add_hla: + add a,l + ld l,a + ret nc + inc h + ret + +;-------------------------------------------------------------------- +; rounded div 32 by 16 bit +; +; HLDE: Dividend (x) +; BC: Divisor (y) +; return: +; HLDE: Rounded Quotient (q) +; BC: Remainder (r) + +div32_r: + push bc + srl b ;y/2 + rr c + add hl,bc ;low x + y/2 + pop bc + jr nc,div_r1 + inc hl +div_r1: + ;fall thru + +;-------------------------------------------------------------------- +; Divide 32 bit by 16 +; +; DEHL: Dividend (x) +; BC: Divisor (y) +; +; return: +; DEHL: Quotient +; BC: Reminder + +div32_16: + exx ;low + push de ;save alternate registers (de,bc) + push bc + exx ;high + push hl ;lx + push bc ;ly + ld bc,0 ;bc = hy = 0 + ld h,b ;hl = hr = 0 + ld l,c + ;de = x, hl = r + exx ;low + pop bc ;bc' = ly + ex (sp),hl ;hl' = lx, save alternate hl + ld de,0 ;de' = lr = 0 + ex de,hl ;de = x, hl = r + exx ;high + ld a,32 ;count +; +; start: +; de: x (de: hx, de': lx) +; bc: y (bc: hy, bc': ly) +; hl: 0 +; +div_lp: ;do + exx ; low + ex de,hl ; x + add hl,hl ; x <<= 1 + exx ; high + ex de,hl ; x + adc hl,hl ; x <<= 1 + exx ; low + ex de,hl ; r + adc hl,hl ; r <<= 1 + exx ; high + ex de,hl ; r + adc hl,hl ; r <<= 1 + exx ; low + inc de ; x/q += 1 + or a ; + sbc hl,bc ; + exx ; high + sbc hl,bc ; + jr nc,div_no_restore + exx ; low + dec de ; + add hl,bc ; r += y + exx ; high + adc hl,bc ; + +div_no_restore: ; + dec a ; + jr nz,div_lp ;while (--count) + +; result: +; de: q (de: hq, de': lq) +; hl: r (hl: hr, hl': lr) + + exx ;low + ex de,hl ;hl = lq, de = lr + + ex (sp),hl ;lq + push de ;lr + exx ;high + pop bc ;bc = lr + pop hl ;de = lq + + exx ;low + pop bc ;restore alternate registers + pop de + exx ;high + ret + +;------------------------------------------------------------------------------- +; print message @ up to a null +; saves & + +?pmsg: + push bc + push de +pmsg$loop: + ld a,(hl) + or a + jr z,pmsg$exit + ld c,a + push hl + call ?cono + pop hl + inc hl + jr pmsg$loop +pmsg$exit: + pop de + pop bc + ret + +;------------------------------------------------------------------------------- +; print message inline up to a null +; saves all registers + +pr.inln: + ex (sp),hl + push af + call ?pmsg + pop af + ex (sp),hl + ret + +;------------------------------------------------------------------------------- +; print +; saves all registers + +pr.crlf: + call pr.inln + db cr,lf,0 + ret + +;------------------------------------------------------------------------------- +; print hl as a 4 digit hexadecimal number +; saves all registers + +phex4: + ld a,h + call phex2 + ld a,l + ; fall thru + +;------------------------------------------------------------------------------- +; print a as a 2 digit hexadecimal number +; saves all registers + +phex2: + push af + rra + rra + rra + rra + call print.digit + pop af + +print.digit: + push hl + push de + push bc + push af + and 00fh + cp 10 + jr c,prd_1 + add a,007h +prd_1: + add a,'0' + + ld c,a + call ?cono + pop af + pop bc + pop de + pop hl + ret + + +;------------------------------------------------------------------------------- +; print decimal 16 bit number from HL +; +; HL: unsigned binary number to print +; C: minimum print field width +; number is prined right-aligned +; B: pad character, typically ' ' or '0' + +pr.dec: + push de + ld de,0 + call pr.decl + pop de + ret + +;------------------------------------------------------------------------------- +; print decimal 32 bit number from DEHL +; +; DEHL: unsigned binary number to print +; C: minimum print field width +; number is prined right-aligned +; B: pad character, typically ' ' or '0' + +pr.decl: + push bc ;save width and fillchar + push bc + exx ;(alt) + ex (sp),hl ;save hl', get width and fill + push de ;save de' + + xor a + ld d,a ;clear counter + ld e,a + push af ; string terminator + inc sp + +prd_divloop: ;do + exx ; (main) + ld bc,10 ; + call div32_16 ; get a digit + ld a,c ; + add a,'0' ; make it printable + push af ; + + ld a,h ; + or l ; + or d ; + or e ; + exx ; (alt) + inc sp ; + inc de ; + jr nz,prd_divloop ; + +prd_filloop: ;h=filler, l=field width + ld a,e + cp l + jr nc,prd_out + push hl + inc sp + inc de + jr prd_filloop +prd_out: + ld hl,0 + add hl,sp ;ptr to beginning of number string (hl==0 here) + call ?pmsg + ex de,hl + add hl,sp + ld sp,hl + inc sp ;remove string terminator + pop de + pop hl + exx ;(main) + pop bc + ret + + +;------------------------------------------------------------------------------- + +?pderr: + ld hl,drive$msg + call ?pmsg ; error header + ld a,(@adrv) + add a,'A' + ld c,a + call ?cono ; drive code + ld hl,track$msg + call ?pmsg ; track header + ld c,0 + ld hl,(@trk) + call pr.dec ; track number + ld hl,sector$msg + call ?pmsg ; sector header + ld hl,(@sect) + call pr.dec ; sector number + ret + + ; error message components +drive$msg: db cr,lf,bell,'BIOS Error on ',0 +track$msg: db ': T-',0 +sector$msg: db ', S-',0 -- 2.39.2