X-Git-Url: http://cloudbase.mooo.com/gitweb/z180-stamp-cpm3.git/blobdiff_plain/3735c546703c5f57dadd74318bcf9e727388be5a..8d7aab73ae556c9ccdd34a56913d0f89f4dd1e78:/cbios/sdio.180 diff --git a/cbios/sdio.180 b/cbios/sdio.180 index 220a15f..28ed4dd 100644 --- a/cbios/sdio.180 +++ b/cbios/sdio.180 @@ -6,9 +6,11 @@ ; Disk drive dispatching tables for linked BIOS public sd0,sd1,sd2,sd3 + public sd4,sd5,sd6,sd7 ; Variables containing parameters passed by BDOS + extrn @xdph,@op extrn @adrv,@rdrv extrn @trk,@sect,@cnt extrn @dma,@dbnk @@ -17,19 +19,17 @@ extrn @ermde ; BDOS error mode - ; Utility routines in standard BIOS + ; Utility routines extrn ?wboot ; warm boot vector - extrn ?pmsg,pr.inln ; print message @, print inline message - extrn pr.crlf ; print - extrn ?pderr ; print BIOS disk error header - extrn ?conin,?cono ; con in and out - extrn ?const ; get console status - - extrn bnk2phy ; - extrn msg.sm ; - extrn msg.recv ; - extrn add_hla + extrn ?pmsg ; print message @ + extrn pr.idx ; print indexed message + extrn pr.inln,pr.crlf ; print inline message, print + extrn pr.errors ; print BIOS disk error header + extrn bnk2phy ; translate banked to physical linear address + extrn msg.sm ; send message to AVR + extrn msg.recv ; receive message from AVR + extrn add_hla ; add to ; Port Address Equates @@ -39,7 +39,7 @@ ; CP/M 3 Disk definition macros - include cpm3slr.lib + maclib cpm3slr.lib ; Z180 macro library instruction definitions (ignored by slr180) @@ -56,6 +56,11 @@ bell equ 7 ; Extended Disk Parameter Headers (XPDHs) + ; dph translate$table, - disk parameter header + ; disk$parameter$block, + ; checksum$size, (optional) + ; alloc$size (optional) + dw sd$write dw sd$read dw sd$login @@ -85,10 +90,47 @@ sd2: dph 0,dpbsimhd512 sd3: dph 0,dpbsimhd512 + dw sd$write + dw sd$read + dw sd$login + dw sd$init4 + db 4,0 ; relative drive zero +sd4: dph 0,dpbsimhd512 + + dw sd$write + dw sd$read + dw sd$login + dw sd$init5 + db 5,0 ; relative drive one +sd5: dph 0,dpbsimhd512 + + dw sd$write + dw sd$read + dw sd$login + dw sd$init6 + db 6,0 ; relative drive zero +sd6: dph 0,dpbsimhd512 + + dw sd$write + dw sd$read + dw sd$login + dw sd$init7 + db 7,0 ; relative drive one +sd7: dph 0,dpbsimhd512 + + cseg ; DPB must be resident + ; dpb physical$sector$size, - disk parameter block + ; physical$sectors$per$track, + ; number$tracks, + ; block$size, + ; number$dir$entries, + ; track$offset, + ; checksum$vec$size (optional) + dpbsimhd512: - dpb 512,8,2048,4096,1024,6 + dpb 512,8,2048,4096,1024,6,8100h dseg ; rest is banked @@ -99,20 +141,27 @@ dpbsimhd512: ; called for first time initialization. sd$init0: + call pr.inln ; + db 'sdio: SD Card driver'cr,lf,0 ret sd$init1: sd$init2: sd$init3: +sd$init4: +sd$init5: +sd$init6: +sd$init7: ret ; all initialization done by drive 0 - - ; This entry is called when a logical drive is about to ; be logged into for the purpose of density determination. ; It may adjust the parameters contained in the disk ; parameter header pointed at by +; +; absolute drive number in @adrv (8 bits) +0 +; relative drive number in @rdrv (8 bits) +1 sd$login: xor a @@ -144,8 +193,11 @@ sd$login: ld b,recv_msg_len ; max receive message len call msg.recv -; ld a,(recv_msg_rc) -; or a + ld a,(recv_msg_rc) + or a + ret z + ld hl,0 + ld (@xdph),hl ret ; @@ -153,27 +205,21 @@ sd$login: ; disk READ and WRITE entry points. ; these entries are called with the following arguments: ; -; absolute drive number in @adrv (8 bits) +0 -; relative drive number in @rdrv (8 bits) +1 -; disk track address in @trk (16 bits) +2 -; disk sector address in @sect(16 bits) +4 -; multi sector count in @cnt (8 bits) +6 -; disk transfer address in @dma (16 bits) +7 -; disk transfer bank in @dbnk (8 bits) +9 +; operation type (r/w) in @op (8 bits) +0 +; absolute drive number in @adrv (8 bits) +1 +; relative drive number in @rdrv (8 bits) +2 +; disk track address in @trk (16 bits) +3 +; disk sector address in @sect(16 bits) +5 +; multi sector count in @cnt (8 bits) +7 +; disk transfer address in @dma (16 bits) +8 +; disk transfer bank in @dbnk (8 bits) +10 ; pointer to XDPH in ; ; they transfer the appropriate data, perform retries ; if necessary, then return an error code in sd$read: - ld de,read$msg ; point at " Read " - ld c,1 - jr rw$common sd$write: - ld de,write$msg ; point at " Write " - ld c,2 -rw$common: - ld hl,residual ; remainng sectors from last multi io? ld a,(hl) sub a,1 @@ -200,14 +246,10 @@ rwc_new_sectors: ; and send it to AVR. rwc_doit: - ld hl,send_msg+1 - ld (hl),c - inc hl ld a,b - ex de,hl - ld (operation$name),hl ; save message for errors - ld hl,@adrv ;address of arguments - ld bc,6 + ld hl,@op ;address of arguments + ld de,send_msg+1 + ld bc,7 ldir ld (de),a ;number of sectors inc de @@ -240,114 +282,49 @@ retry: or a ret z ; check status and return to BDOS if no error -; suppress error message if BDOS is returning errors to application... - - ld a,(@ermde) - cp 0ffh - jr z,hard$error - - ; Had permanent error, print message like: - ; BIOS Err on d: T-nn, S-mm, , Retry ? - - call ?pderr ; print message header + ld hl,print_details + call pr.errors + jr z,retry ; Yes, then retry once more + ; otherwise, + xor a + ld (residual),a + ld a,(recv_msg_rc) ; return hard error to BDOS + ld c,0ffh + cp 6 ; media changed? + jr z,e_exit + ld c,2 + cp 5 ; disk read only? + jr z,e_exit + dec c +e_exit: + ld a,c + ret - ld hl,(operation$name) - call ?pmsg ; last function (read or write) +;------------------------------------------------------------------------------- +print_details: ld a,(recv_msg_rc) + push af and a,07fh jr z,fatfs_err ld hl,drvmsg0 ; point at first driver error message - ld c,drvmsg_count - call pdecoded + call pr.idx fatfs_err: - ld a,(recv_msg_rc) - tst 080h - jr z,prompt ; no fatfs error + pop af + and 080h + ret z ; no fatfs error call pr.inln db 'FatFs: ',0 ld hl,fr$msg0 ; point at first FatFs message - ld c,fr$msg$count ld a,(recv_msg_rc+1) - call pdecoded + jp pr.idx ; return via print routine -prompt: - call pr.inln - db ' Retry (Y/N) ? ',0 - - call u$conin$echo ; get operator response - cp 'Y' - jr z,retry ; Yes, then retry 10 more times - -hard$error: - ; otherwise, - xor a - ld (residual),a - - ld a,1 ; return hard error to BDOS - ret - -cancel: ; here to abort job - jp ?wboot ; leap directly to warmstart vector - - - -; Print message to error code in A -; - -pdecoded: - push bc - push de - push hl ; put pointer to first message on stack - cp c - jr c,pdc_1 - xor a -pdc_1: - ld bc,0 - ld e,a ; save message number - xor a - inc e -pdc_nxt_str: - dec e - ex (sp),hl - jr z,pdc_found - ex (sp),hl - cpir - jr z,pdc_nxt_str - ; not found (should not happen) -pdc_found: - pop hl - call ?pmsg - pop de - pop bc - ret - - -; get console input, echo it, and shift to upper case - -u$conin$echo: - - call ?const - or a - jr z,u$c1 ; see if any char already struck - call ?conin - jr u$conin$echo ; yes, eat it and try again -u$c1: - call ?conin - push af - ld c,a - cp ' '-1 - call nc,?cono - pop af - cp 'a' - ret c - sub 'a'-'A' ; make upper case - ret +;------------------------------------------------------------------------------- residual: db 0 @@ -376,24 +353,20 @@ recv_msg_rc: recv_msg_len equ $ - recv_msg - ; error message components - -operation$name: - dw read$msg -read$msg: - db ', Read, ',0 -write$msg: - db ', Write, ',0 +;------------------------------------------------------------------------------- +; error message components + ; general driver errors drvmsg0: db 'Unknown Error, ',0 drvmsg1: db 'Invalid Parameter(s), ',0 drvmsg2: db 'Invalid Drive, ',0 drvmsg3: db 'Bus Timeout, ',0 -drvmsg_size equ $ - drvmsg0 -drvmsg_count equ 3 - +drvmsg4: db 'Access beyond disk size, ',0 +drvmsg5: db 'Write protected, ',0 +drvmsg6: db 'No media, ',0 + db 0 -; table of pointers to error message strings + ; fat file system errors fr$msg0: db 'Unknown Error,',0 fr$msg1: db 'DISK_ERR,',0 @@ -416,7 +389,6 @@ fr$msg17: db 'NOT_ENOUGH_CORE,',0 fr$msg18: db 'TOO_MANY_OPEN_FILES,',0 fr$msg19: db 'FR_INVALID_PARAMETER,',0 fr$msg20: db 'short read/write,',0 -fr$msg$size equ $ - fr$msg0 -fr$msg$count equ 20 + db 0 end