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