]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/utils.180
refactor print utils
[z180-stamp-cpm3.git] / cbios / utils.180
index bbe5ac3a12b6831bb7b67220d353c579ab07a99b..4b74750f631d7db8ff5eaffd3b14e5bf302b7c25 100644 (file)
@@ -6,21 +6,24 @@
 \r
        ; math\r
 \r
 \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 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 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 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.dec,pr.decl           ; print 16 or 32 bit decimal number\r
-       public ?pderr                   ; print BIOS disk error message header\r
+       public pr.errors                ; print BIOS disk error message header\r
 \r
 \r
 \r
 \r
 \r
 \r
-       extrn ?cono\r
+       extrn ?const,?conin,?cono\r
        extrn @adrv,@trk,@sect          ; used by disk error message\r
        extrn @adrv,@trk,@sect          ; used by disk error message\r
+       extrn @op,@ermde\r
 \r
 ;-------------------------------------------------------------------------------\r
 \r
 \r
 ;-------------------------------------------------------------------------------\r
 \r
@@ -82,6 +85,16 @@ io1_nxt:
        pop     bc\r
        ret\r
 \r
        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
 ;--------------------------------------------------------------------\r
 ; add a to hl\r
 ;\r
@@ -199,47 +212,63 @@ div_no_restore:                   ;
        exx                     ;high\r
        ret\r
 \r
        exx                     ;high\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    hl              ; put pointer to first message on stack\r
+       ld      b,a             ; save message number\r
+       or      a\r
+       jr      z,pdc_done\r
+       xor     a\r
+pdc_skip:\r
+       bit     7,(hl)\r
+       inc     hl\r
+       jr      z,pdc_skip\r
+       cp      (hl)\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
 ;-------------------------------------------------------------------------------\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
        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
+       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
        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
 \r
 pr.inln:\r
        ex      (sp),hl\r
-       push    af\r
        call    ?pmsg\r
        call    ?pmsg\r
-       pop     af\r
        ex      (sp),hl\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
 ; print <CR><LF>\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
 \r
 pr.crlf:\r
        call    pr.inln\r
-       db      cr,lf,0\r
+       dc      cr,lf\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
        ret\r
 \r
 ;-------------------------------------------------------------------------------\r
@@ -266,32 +295,32 @@ phex2:
        pop     af\r
 \r
 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
+       daa\r
+       add     a,0a0h\r
+       adc     a,040h\r
+       ;fall thru\r
 \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
        ld      c,a\r
        call    ?cono\r
-       pop     af\r
-       pop     bc\r
-       pop     de\r
        pop     hl\r
        pop     hl\r
+       pop     de\r
+       pop     bc\r
        ret\r
 \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
 ;-------------------------------------------------------------------------------\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
 ;       B: pad character, typically ' ' or '0'\r
 \r
 pr.dec:\r
@@ -306,7 +335,7 @@ pr.dec:
 ;\r
 ;      DEHL: unsigned binary number to print\r
 ;         C: minimum print field width\r
 ;\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
 ;         B: pad character, typically ' ' or '0'\r
 \r
 pr.decl:\r
@@ -365,24 +394,93 @@ prd_out:
 ;-------------------------------------------------------------------------------\r
 \r
 ?pderr:\r
 ;-------------------------------------------------------------------------------\r
 \r
 ?pderr:\r
-       ld      hl,drive$msg\r
-       call    ?pmsg           ; error header\r
        ld      a,(@adrv)\r
        add     a,'A'\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      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
        ld      hl,(@sect)\r
-       call    pr.dec          ; sector number\r
+       jp      pr.dec          ; sector number\r
+\r
+;-------------------------------------------------------------------------------\r
+; get console input, echo it, and shift to upper case\r
+; save hl,de,bc\r
+\r
+uciecho:\r
+       push    hl\r
+       push    de\r
+       push    bc\r
+u$c0:\r
+       call    ?const\r
+       or      a\r
+       jr      z,u$c1          ; see if any char already struck\r
+       call    ?conin\r
+       jr      u$c0            ; yes, eat it and try again\r
+u$c1:\r
+       call    ?conin\r
+       push    af\r
+       ld      c,a\r
+       cp      ' '-1\r
+       call    nc,?cono\r
+       pop     af\r
+       pop     bc\r
+       pop     de\r
+       pop     hl\r
+       cp      'a'\r
+       ret     c\r
+       sub     'a'-'A'         ; make upper case\r
+       ret\r
+\r
+;-------------------------------------------------------------------------------\r
+;\r
+\r
+pr.errors:\r
+\r
+       ; suppress error message if BDOS\r
+       ; is returning errors to application...\r
+\r
+       ld      a,(@ermde)\r
+       inc     a\r
+       jr      nz,pre1\r
+       dec     a               ;return NZ, if @ermde == 0FFH\r
        ret\r
        ret\r
+pre1:\r
+       push    hl\r
+       ld      hl,pre2\r
+       ex      (sp),hl\r
+       push    hl\r
+\r
+       ; Had permanent error, print message like:\r
+       ; BIOS Err on d: T-nn, S-mm, <operation> <type>, Retry ?\r
+\r
+       call    ?pderr          ; print message header\r
+\r
+       ld      hl,op$msg\r
+       ld      a,(@op)\r
+       jp      pr.idx          ; last function (read or write)\r
+\r
+pre2:\r
+                               ; prompt for retry\r
+       call    pr.inln\r
+       dc      ' Retry (Y/N) ? '\r
+\r
+       call    uciecho         ; get operator response\r
+       cp      'Y'\r
+       ret                     ; return Z-flag for yes\r
+\r
+\r
+op$msg:\r
+       dc      ', Unknown op, '\r
+       dc      ', Read, '\r
+       dc      ', Write, '\r
+       db      0\r
 \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
+       end\r