-\r
-ipchl: ; vectored CALL point\r
- jp (hl)\r
-\r
-\r
-;-------------------------------------------------------------------------------\r
-; print message @<HL> up to a null\r
-; saves <BC> & <DE>\r
-\r
-?pmsg:\r
- push bc\r
- push de\r
-pmsg$loop:\r
- ld a,(hl)\r
- or a\r
- jr z,pmsg$exit\r
- ld c,a\r
- push hl\r
- call ?cono\r
- pop hl\r
- inc hl\r
- jr pmsg$loop\r
-pmsg$exit:\r
- pop de\r
- pop bc\r
- ret\r
-\r
-;-------------------------------------------------------------------------------\r
-; print message inline up to a null\r
-; saves all registers\r
-\r
-pr.inln:\r
- ex (sp),hl\r
- push af\r
- call ?pmsg\r
- pop af\r
- ex (sp),hl\r
- ret\r
-\r
-;-------------------------------------------------------------------------------\r
-; print <CR><LF>\r
-; saves all registers\r
-\r
-pr.crlf:\r
- call pr.inln\r
- db 13,10,0\r
- ret\r
-\r
-;-------------------------------------------------------------------------------\r
-; print hl as a 4 digit hexadecimal number\r
-; saves all registers\r
-\r
-phex4:\r
- ld a,h\r
- call phex2\r
- ld a,l\r
- ; fall thru\r
-\r
-;-------------------------------------------------------------------------------\r
-; print a as a 2 digit hexadecimal number\r
-; saves all registers\r
-\r
-phex2:\r
- push af\r
- rra\r
- rra\r
- rra\r
- rra\r
- call print.digit\r
- pop af\r
-\r
-print.digit:\r
- push hl\r
- push de\r
- push bc\r
- push af\r
- and 00fh\r
- cp 10\r
- jr c,prd_1\r
- add a,007h\r
-prd_1:\r
- add a,'0'\r
-\r
- ld c,a\r
- call ?cono\r
- pop af\r
- pop bc\r
- pop de\r
- pop hl\r
- ret\r
-\r
-\r
-;-------------------------------------------------------------------------------\r
-; print decimal 16 bit number from HL\r
-;\r
-; HL: unsigned binary number to print\r
-; C: minimum print field width\r
-; number is prined right-aligned\r
-; B: pad character, typically ' ' or '0'\r
-\r
-pr.dec:\r
- push de\r
- ld de,0\r
- call pr.decl\r
- pop de\r
- ret\r
-\r
-;-------------------------------------------------------------------------------\r
-; print decimal 32 bit number from DEHL\r
-;\r
-; DEHL: unsigned binary number to print\r
-; C: minimum print field width\r
-; number is prined right-aligned\r
-; B: pad character, typically ' ' or '0'\r
-\r
-pr.decl:\r
- push bc ;save width and fillchar\r
- push bc\r
- exx ;(alt)\r
- ex (sp),hl ;save hl', get width and fill\r
- push de ;save de'\r
-\r
- xor a\r
- ld d,a ;clear counter\r
- ld e,a\r
- push af ; string terminator\r
- inc sp\r
-\r
-prd_divloop: ;do\r
- exx ; (main)\r
- ld bc,10 ;\r
- call div32_16 ; get a digit\r
- ld a,c ;\r
- add a,'0' ; make it printable\r
- push af ;\r
-\r
- ld a,h ;\r
- or l ;\r
- or d ;\r
- or e ;\r
- exx ; (alt)\r
- inc sp ;\r
- inc de ;\r
- jr nz,prd_divloop ;\r
-\r
-prd_filloop: ;h=filler, l=field width\r
- ld a,e\r
- cp l\r
- jr nc,prd_out\r
- push hl\r
- inc sp\r
- inc de\r
- jr prd_filloop\r
-prd_out:\r
- ld hl,0\r
- add hl,sp ;ptr to beginning of number string (hl==0 here)\r
- call ?pmsg\r
- ex de,hl\r
- add hl,sp\r
- ld sp,hl\r
- inc sp ;remove string terminator\r
- pop de\r
- pop hl\r
- exx ;(main)\r
- pop bc\r
- ret\r
-\r
-\r
-;-------------------------------------------------------------------------------\r
-;\r
-?pderr:\r
- ld hl,drive$msg\r
- call ?pmsg ; error header\r
- ld a,(@adrv)\r
- add a,'A'\r
- ld c,a\r
- call ?cono ; drive code\r
- ld hl,track$msg\r
- call ?pmsg ; track header\r
- ld c,0\r
- ld hl,(@trk)\r
- call pr.dec ; track number\r
- ld hl,sector$msg\r
- call ?pmsg ; sector header\r
- ld hl,(@sect)\r
- call pr.dec ; sector number\r
- ret\r
-\r
-\r