\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
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
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
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