extrn @xdph\r
extrn @adrv,@rdrv\r
extrn @trk,@sect,@cnt\r
- extrn @dma,@dbnk,@cbnk\r
+ extrn @dma,@dbnk\r
\r
; System Control Block variables\r
\r
extrn @ermde ; BDOS error mode\r
\r
- ; Utility routines in standard BIOS\r
+ ; Utility routines\r
\r
extrn ?wboot ; warm boot vector\r
- extrn ?pmsg,pr.inln ; print message @<HL>, print inline message\r
- extrn pr.crlf ; print <cr><lf>\r
- extrn phex2\r
- extrn pr.decl\r
- extrn ?pderr ; print BIOS disk error header\r
- extrn ?conin,?cono ; con in and out\r
- extrn ?const ; get console status\r
- extrn ?bnksl\r
-\r
- extrn bnk2phy ;\r
- extrn add_hla\r
+ extrn ?pmsg ; print message @<HL>\r
+ extrn pr.idx ; print indexed message\r
+ extrn pr.inln ; print inline message\r
+ extrn pr.decl ; print 32 bit decimal number\r
+ extrn pr.errors ; print BIOS disk error header\r
+ extrn ?cono ; console out\r
+ extrn bnk2phy ; translate banked to physical linear address\r
+ extrn add_hla ; add <A> to <HL>\r
extrn gstimer ; get timer short (16 bit)\r
\r
; Port Address Equates\r
ld a,1 ; return with A=1 on error\r
ret\r
\r
+;-------------------------------------------------------------------------------\r
+; print char, skipping leading blanks\r
\r
pr_char_nlbl:\r
bit 0,b\r
ret z\r
res 0,b\r
; fall thru\r
+\r
+; print character, saving hl, de, bc\r
+\r
pr_char:\r
push hl\r
push de\r
; disk READ and WRITE entry points.\r
; these entries are called with the following arguments:\r
;\r
-; absolute drive number in @adrv (8 bits) +0\r
-; relative drive number in @rdrv (8 bits) +1\r
-; disk track address in @trk (16 bits) +2\r
-; disk sector address in @sect(16 bits) +4\r
-; multi sector count in @cnt (8 bits) +6\r
-; disk transfer address in @dma (16 bits) +7\r
-; disk transfer bank in @dbnk (8 bits) +9\r
+; operation type (r/w) in @op (8 bits) +0\r
+; absolute drive number in @adrv (8 bits) +1\r
+; relative drive number in @rdrv (8 bits) +2\r
+; disk track address in @trk (16 bits) +3\r
+; disk sector address in @sect(16 bits) +5\r
+; multi sector count in @cnt (8 bits) +7\r
+; disk transfer address in @dma (16 bits) +8\r
+; disk transfer bank in @dbnk (8 bits) +10\r
; pointer to XDPH in <DE>\r
;\r
; they transfer the appropriate data, perform retries\r
; if necessary, then return an error code in <A>\r
\r
cf$read:\r
- ld de,read$msg ; point at " Read "\r
ld bc,M_DIM1*256 + CmdRd ; Transfermode: i/o to memory++\r
jr rw$common\r
cf$write:\r
- ld de,write$msg ; point at " Write "\r
ld bc,0*256 + CmdWr ; Transfermode: memory++ to i/o\r
rw$common:\r
\r
endif\r
\r
rwc_new_sectors:\r
- ld (operation$name),de ; save message for errors\r
+ ld (cfstack),sp\r
+ ld sp,cfstack\r
+\r
in0 a,(dcntl)\r
and a,~(M_DMS1+M_DIM1+M_DIM0)\r
or b\r
pop hl\r
jr c,lba_ok\r
ld a,1 ; block# >= partition size, return error\r
- ret\r
+ jp exit\r
+; ret\r
\r
lba_ok:\r
WAITREADY\r
pop bc\r
ld e,a\r
and 10001001b ; Busy, DRQ, or Error?\r
- ret z ; Return to BDOS if no error\r
-\r
-; suppress error message if BDOS is returning errors to application...\r
-\r
- ld a,(@ermde)\r
- cp 0ffh\r
- jr z,hard$error\r
+ jr z,exit\r
+; ret z ; Return to BDOS if no error\r
\r
- ; Had permanent error, print message like:\r
- ; BIOS Err on d: T-nn, S-mm, <operation> <type>, Retry ?\r
+ ld hl,print_details\r
+ call pr.errors\r
+ jp z,retry ; Yes, then retry once more\r
+ ; otherwise,\r
+ xor a\r
+ ld (residual),a\r
\r
- call ?pderr ; print message header\r
+ ld a,1 ; return hard error to BDOS\r
+exit:\r
+ ld sp,(cfstack)\r
+ ret\r
\r
- ld hl,(operation$name)\r
- call ?pmsg ; last function (read or write)\r
+;-------------------------------------------------------------------------------\r
\r
+print_details:\r
ld hl,msg$drq\r
bit 3,e\r
call nz,?pmsg\r
\r
bit 0,e\r
- jr z,prompt\r
+ ret z\r
\r
in a,(IDEErr)\r
- ld hl,error$table ; point at table of message addresses\r
+ ld e,8\r
errm1:\r
- ld e,(hl)\r
- inc hl\r
- ld d,(hl)\r
- inc hl ; get next message address\r
- add a,a\r
- push af ; shift left and push residual bits with status\r
- ex de,hl\r
- call c,?pmsg\r
- ex de,hl ; print message, saving table pointer\r
- pop af\r
- jr nz,errm1 ; if any more bits left, continue\r
-\r
-prompt:\r
- call pr.inln\r
- db ' Retry (Y/N) ? ',0\r
-\r
- call u$conin$echo ; get operator response\r
- cp 'Y'\r
- jp z,retry ; Yes, then retry\r
-\r
-hard$error:\r
- ; otherwise,\r
- xor a\r
- ld (residual),a\r
-\r
- ld a,1 ; return hard error to BDOS\r
- ret\r
-\r
-cancel: ; here to abort job\r
- jp ?wboot ; leap directly to warmstart vector\r
-\r
-\r
-; get console input, echo it, and shift to upper case\r
-\r
-u$conin$echo:\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
+ ld hl,b0$msg ; point at message[0]\r
+ dec e ; index of next message\r
+ add a,a ; shift left and push residual bits with status\r
push af\r
- ld c,a\r
- cp ' '-1\r
- call nc,?cono\r
+ ld a,e\r
+ call c,pr.idx ; print it, if bit is set.\r
pop af\r
- pop bc\r
- cp 'a'\r
- ret c\r
- sub 'a'-'A' ; make upper case\r
+ jr nz,errm1 ; if any more bits left, continue\r
ret\r
\r
- ; error message components\r
+;-------------------------------------------------------------------------------\r
+; error message components\r
\r
-operation$name:\r
- dw read$msg\r
-read$msg:\r
- db ', Read, ',0\r
-write$msg:\r
- db ', Write, ',0\r
msg$drq:\r
db 'DRQ, ',0\r
-error$table:\r
- dw b7$msg\r
- dw b6$msg\r
- dw b5$msg\r
- dw b4$msg\r
- dw b3$msg\r
- dw b2$msg\r
- dw b1$msg\r
- dw b0$msg\r
-\r
-b7$msg: db ' Bad Block detected,',0\r
-b6$msg: db ' Uncorrectable Data Error,',0\r
-b5$msg: db ' Media Changed,',0\r
-b4$msg: db ' Sector ID Not Found,',0\r
-b3$msg: db ' Media Change Requst,',0\r
-b2$msg: db ' Aborted Command,',0\r
-b1$msg: db ' Track 0 Not Found,',0\r
-b0$msg: db ' AM Not Found (or general error),',0\r
\r
+b7$msg: db ' Bad Block detected,',0\r
+b6$msg: db ' Uncorrectable Data Error,',0\r
+b5$msg: db ' Media Changed,',0\r
+b4$msg: db ' Sector ID Not Found,',0\r
+b3$msg: db ' Media Change Requst,',0\r
+b2$msg: db ' Aborted Command,',0\r
+b1$msg: db ' Track 0 Not Found,',0\r
+b0$msg: db ' AM Not Found (or general error),',0\r
+ db 0\r
+\r
+;-------------------------------------------------------------------------------\r
\r
residual:\r
db 0\r
tmpsecbuf: ;temporary sector buffer\r
ds 512\r
\r
+ rept 80\r
+ db 07CH\r
+ endm\r
+cfstack::\r
+ dw 0\r
+\r
end\r