]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/utils.180
refactor print utils
[z180-stamp-cpm3.git] / cbios / utils.180
index 4a91641e110348751f86427639b76d58d0b4a4a5..4b74750f631d7db8ff5eaffd3b14e5bf302b7c25 100644 (file)
@@ -6,18 +6,21 @@
 \r
        ; math\r
 \r
+       public ijphl                    ; vectored CALL point\r
        public add_hla                  ; add a to hl\r
        public div32_16,div32_r         ; divide 32 bit by 16 bit number (rounded)\r
 \r
        ; print utils\r
 \r
-       public ?pmsg                    ; print message\r
+       public ?pchar,?pmsg             ; print char <A>, print message (<HL>)\r
        public pr.idx                   ; print message from table indexed by <A>\r
        public pr.inln,pr.crlf          ; print message inline, print newline\r
        public phex2,phex4              ; print 2 digit hex <A> or 4 digit hex <HL>\r
        public pr.dec,pr.decl           ; print 16 or 32 bit decimal number\r
        public pr.errors                ; print BIOS disk error message header\r
 \r
+\r
+\r
        extrn ?const,?conin,?cono\r
        extrn @adrv,@trk,@sect          ; used by disk error message\r
        extrn @op,@ermde\r
@@ -82,6 +85,16 @@ io1_nxt:
        pop     bc\r
        ret\r
 \r
+       cseg\r
+\r
+;--------------------------------------------------------------------\r
+; vectored CALL point\r
+\r
+ijphl:\r
+       jp      (hl)\r
+\r
+       dseg\r
+\r
 ;--------------------------------------------------------------------\r
 ; add a to hl\r
 ;\r
@@ -199,77 +212,63 @@ div_no_restore:                   ;
        exx                     ;high\r
        ret\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
-       inc     hl\r
-       or      a\r
-       jr      z,pmsg$exit\r
-       ld      c,a\r
-       push    hl\r
-       call    ?cono\r
-       pop     hl\r
-       jr      pmsg$loop\r
-pmsg$exit:\r
-       pop     de\r
-       pop     bc\r
-       ret\r
-\r
 ;-------------------------------------------------------------------------------\r
 ; print message from table @<HL>, indexed by <A>\r
 ; saves <BC> & <DE>\r
 \r
 pr.idx:\r
        push    bc\r
-       push    de\r
        push    hl              ; put pointer to first message on stack\r
-       ld      e,a             ; save message number\r
+       ld      b,a             ; save message number\r
+       or      a\r
+       jr      z,pdc_done\r
        xor     a\r
-       ld      b,a\r
-       ld      c,a\r
-       inc     e\r
-pdc_nxt_str:\r
-       dec     e\r
-       ex      (sp),hl\r
-       jr      z,pdc_found\r
-       ex      (sp),hl\r
-       cpir\r
+pdc_skip:\r
+       bit     7,(hl)\r
+       inc     hl\r
+       jr      z,pdc_skip\r
        cp      (hl)\r
-       jr      nz,pdc_nxt_str\r
-                               ; End of List, msg not found.\r
-                               ; Print first msg.\r
-pdc_found:\r
-       pop     hl\r
-       call    ?pmsg\r
-       pop     de\r
+       jr      z,pdc_done      ; End of List, msg not found. Print first msg.\r
+       djnz    pdc_skip\r
+       ex      (sp),hl         ; Remove first msg from stack\r
+pdc_done:\r
+       pop     hl              ; Get msg. to print\r
        pop     bc\r
+       ;fall thru\r
+\r
+;-------------------------------------------------------------------------------\r
+; print message @<HL> up to a null\r
+; saves <BC> & <DE>\r
+\r
+?pmsg:\r
+       ld      a,(hl)\r
+       inc     hl\r
+       and     07fh\r
+       ret     z\r
+       call    ?pchar\r
+       dec     hl\r
+       bit     7,(hl)\r
+       inc     hl\r
+       jr      z,?pmsg\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
 ; print message inline up to a null\r
-; saves all registers\r
+; saves <BC>, <DE>, <HL>\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
+; saves <BC>, <DE>, <HL>\r
 \r
 pr.crlf:\r
        call    pr.inln\r
-       db      cr,lf,0\r
+       dc      cr,lf\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
@@ -296,32 +295,32 @@ phex2:
        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
+       daa\r
+       add     a,0a0h\r
+       adc     a,040h\r
+       ;fall thru\r
+\r
+;-------------------------------------------------------------------------------\r
+; print character in a\r
+; saves <BC>, <DE>, <HL>\r
 \r
+?pchar:\r
+       push    bc\r
+       push    de\r
+       push    hl\r
        ld      c,a\r
        call    ?cono\r
-       pop     af\r
-       pop     bc\r
-       pop     de\r
        pop     hl\r
+       pop     de\r
+       pop     bc\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
+;          number is printed right-aligned\r
 ;       B: pad character, typically ' ' or '0'\r
 \r
 pr.dec:\r
@@ -336,7 +335,7 @@ pr.dec:
 ;\r
 ;      DEHL: unsigned binary number to print\r
 ;         C: minimum print field width\r
-;            number is prined right-aligned\r
+;            number is printed right-aligned\r
 ;         B: pad character, typically ' ' or '0'\r
 \r
 pr.decl:\r
@@ -395,28 +394,22 @@ prd_out:
 ;-------------------------------------------------------------------------------\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      (msg_drv),a\r
+       call    pr.inln                 ; error header\r
+       db      cr,lf,bell,'BIOS Error on '\r
+msg_drv:\r
+       db      'A'\r
+       dc      ': T-'\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
+       call    pr.inln         ; sector header\r
+       dc      ', S-'\r
        ld      hl,(@sect)\r
        jp      pr.dec          ; sector number\r
 \r
-       ; error message components\r
-drive$msg:     db      cr,lf,bell,'BIOS Error on ',0\r
-track$msg:     db      ': T-',0\r
-sector$msg:    db      ', S-',0\r
-\r
-\r
 ;-------------------------------------------------------------------------------\r
 ; get console input, echo it, and shift to upper case\r
 ; save hl,de,bc\r
@@ -477,7 +470,7 @@ pre1:
 pre2:\r
                                ; prompt for retry\r
        call    pr.inln\r
-       db      ' Retry (Y/N) ? ',0\r
+       dc      ' Retry (Y/N) ? '\r
 \r
        call    uciecho         ; get operator response\r
        cp      'Y'\r
@@ -485,9 +478,9 @@ pre2:
 \r
 \r
 op$msg:\r
-       db      ', Unknown op, ',0\r
-       db      ', Read, ',0\r
-       db      ', Write, ',0\r
+       dc      ', Unknown op, '\r
+       dc      ', Read, '\r
+       dc      ', Write, '\r
        db      0\r
 \r
        end\r