]> cloudbase.mooo.com Git - z180-stamp-cpm3.git/blobdiff - cbios/utils.180
reduce stack usage
[z180-stamp-cpm3.git] / cbios / utils.180
index bbe5ac3a12b6831bb7b67220d353c579ab07a99b..08c5fd092c339780a47ffb5a6c2eec86989c947f 100644 (file)
@@ -6,21 +6,24 @@
 \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 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 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 ?pderr                   ; print BIOS disk error message header\r
+       public pr.errors                ; print BIOS disk error message header\r
 \r
 \r
 \r
-       extrn ?cono\r
+       extrn ?const,?conin,?cono\r
        extrn @adrv,@trk,@sect          ; used by disk error message\r
+       extrn @op,@ermde\r
 \r
 ;-------------------------------------------------------------------------------\r
 \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
@@ -221,6 +234,36 @@ pmsg$exit:
        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
+       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
+       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
+       pop     bc\r
+       ret\r
+\r
 ;-------------------------------------------------------------------------------\r
 ; print message inline up to a null\r
 ; saves all registers\r
@@ -379,10 +422,85 @@ prd_out:
        ld      hl,sector$msg\r
        call    ?pmsg           ; sector header\r
        ld      hl,(@sect)\r
-       call    pr.dec          ; sector number\r
-       ret\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
+\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
+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
+       db      ' Retry (Y/N) ? ',0\r
+\r
+       call    uciecho         ; get operator response\r
+       cp      'Y'\r
+       ret                     ; return Z-flag for yes\r
+\r
+\r
+op$msg:\r
+       db      ', Unknown op, ',0\r
+       db      ', Read, ',0\r
+       db      ', Write, ',0\r
+       db      0\r
+\r
+       end\r