X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/b27f7b99726643dca7d91847d45c692e26f5287d..f4471ef90f63448efdf36c4e3a5406641e2353bd:/cbios/bioskrnl.180 diff --git a/cbios/bioskrnl.180 b/cbios/bioskrnl.180 index 6ac3726..993e60e 100644 --- a/cbios/bioskrnl.180 +++ b/cbios/bioskrnl.180 @@ -57,22 +57,25 @@ ccp equ 0100h ; Console Command Processor gets loaded ; memory control - public @cbnk ; current bank - extrn ?xmove,?move ; select move bank, and block move - extrn ?bank ; select CPU bank + public @cbnk ; current bank + extrn ?xmove,?move ; select move bank, and block move + extrn ?bank ; select CPU bank ; clock support - extrn ?time ; signal time operation + extrn ?time ; signal time operation ; general utility routines - public ?pmsg,?pdec ; print message, print number from 0 to 65535 - public ?pderr ; print BIOS disk error message header - public pmsg.in ; print message inline - public phex4,phex2 ; print 4 digit hex (HL), or 2 digit hex (A) + 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) - include modebaud.inc ; define mode bits + extrn div32_16 ; divide 32 bit by 16 bit number + + include modebaud.inc ; define mode bits ; External names for BIOS entry points @@ -143,13 +146,13 @@ boot: call hwinit ; first time hardware initialisation - ld c,15 ; initialize all 16 character devices + ld bc,16*256 + 0 ; initialize all 16 character devices c$init$loop: push bc call ?cinit pop bc - dec c - jp p,c$init$loop + inc c + djnz c$init$loop call ?init ; perform any additional system initialization ; and print signon message @@ -229,7 +232,7 @@ set$jumps: ret - ds 64 + ds bs$stack$size bs$stack equ $ @@ -512,7 +515,7 @@ pmsg$exit: ; print message inline up to a null ; saves all registers -pmsg.in: +pr.inln: ex (sp),hl push af call ?pmsg @@ -520,6 +523,15 @@ pmsg.in: 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 @@ -563,44 +575,85 @@ prd_1: 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' -?pdec: ; print binary number 0-65535 from - ld bc,table10 - ld de,-10000 -next: - ld a,'0'-1 -pdecl: - push hl - inc a - add hl,de - jp nc,stoploop + 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 - jp pdecl -stoploop: - push de - push bc - ld c,a - call ?cono - pop bc + 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 -nextdigit: pop hl - ld a,(bc) - ld e,a - inc bc - ld a,(bc) - ld d,a - inc bc - ld a,e - or d - jp nz,next + exx ;(main) + pop bc ret -table10: - dw -1000,-100,-10,-1,0 +;------------------------------------------------------------------------------- +; ?pderr: ld hl,drive$msg call ?pmsg ; error header @@ -610,12 +663,13 @@ table10: call ?cono ; drive code ld hl,track$msg call ?pmsg ; track header + ld c,0 ld hl,(@trk) - call ?pdec ; track number + call pr.dec ; track number ld hl,sector$msg call ?pmsg ; sector header ld hl,(@sect) - call ?pdec ; sector number + call pr.dec ; sector number ret