; Variables containing parameters passed by BDOS\r
\r
extrn @adrv,@rdrv\r
- extrn @dma,@trk,@sect\r
- extrn @dbnk\r
+ extrn @trk,@sect,@cnt\r
+ extrn @dma,@dbnk\r
\r
; System Control Block variables\r
\r
; parameter header pointed at by <DE>\r
\r
sd$login:\r
+ xor a\r
+ ld (residual),a\r
ld hl,send_msg+1\r
ld (hl),0 ;login function\r
inc hl\r
;\r
; absolute drive number in @adrv (8 bits) +0\r
; relative drive number in @rdrv (8 bits) +1\r
-; multi sector count in @cnt (8 bits) +2 (currently unused)\r
-; disk track address in @trk (16 bits) +3\r
-; disk sector address in @sect(16 bits) +5\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
; pointer to XDPH in <DE>\r
; if necessary, then return an error code in <A>\r
\r
sd$read:\r
- ld hl,read$msg ; point at " Read "\r
- ld a,1\r
+ ld de,read$msg ; point at " Read "\r
+ ld c,1\r
jr rw$common\r
-\r
sd$write:\r
- ld hl,write$msg ; point at " Write "\r
- ld a,2\r
- ;fall thru\r
+ ld de,write$msg ; point at " Write "\r
+ ld c,2\r
+rw$common:\r
+ ld hl,residual ; remainng sectors from last multi io?\r
+ ld a,(hl)\r
+ sub a,1\r
+ jr c,rwc_new_sectors\r
+\r
+ ld (hl),a\r
+ xor a\r
+ ret\r
+\r
+rwc_new_sectors:\r
+ ld b,1 ; assume 1 sector to transfer\r
+ ld a,(@cnt)\r
+ or a\r
+ jr z,rwc_doit\r
+\r
+ ld b,a ; number of sectors to transfer\r
+ dec a ; save remaining\r
+ ld (hl),a\r
+ xor a ; reset multi sector count\r
+ ld (@cnt),a\r
\r
; compute pysical transfer address\r
; prepare message\r
; and send it to AVR.\r
\r
-rw$common:\r
- ld (operation$name),HL ; save message for errors\r
- ld de,send_msg+1\r
- ld (de),a\r
- inc de\r
+rwc_doit:\r
+ ld hl,send_msg+1\r
+ ld (hl),c\r
+ inc hl\r
+ ld a,b\r
+ ex de,hl\r
+ ld (operation$name),hl ; save message for errors\r
ld hl,@adrv ;address of arguments\r
- ld bc,7\r
+ ld bc,6\r
ldir\r
+ ld (de),a\r
+ inc de\r
push de\r
ld e,(hl) ;dma address\r
inc hl\r
or a\r
ret z ; check status and return to BDOS if no error\r
\r
+ xor a\r
+ ld (residual),a\r
+\r
; suppress error message if BDOS is returning errors to application...\r
\r
ld a,(@ermde)\r
;TODO: rc errorcode\r
\r
ld a,(recv_msg_rc)\r
- tst 080h \r
+ tst 080h\r
jr z,fs_end\r
\r
fatfs_err:\r
ret\r
\r
\r
+residual:\r
+ db 0\r
\r
send_msg:\r
db 2 ; disk command\r
ds 1 ; subcommand (login/read/write)\r
ds 1 ; @adrv\r
ds 1 ; @rdrv\r
- ; -read/write- -login- \r
- ds 1 ; @cnt 3 byte\r
- ds 2 ; @trk xdph address\r
-send_msg_login_len equ $ - send_msg\r
- ds 2 ; @sect\r
+ ; -read/write- -login-\r
+ ds 2 ; @trk xdph address\r
+ ds 2 ; @sect (3 byte)\r
+ ds 1 ; @cnt\r
ds 3 ; transfer addr\r
send_msg_rw_len equ $ - send_msg\r
+send_msg_login_len equ 7\r
\r
\r
recv_msg:\r
FR_NOT_ENOUGH_CORE, /* (17) LFN working buffer could not be allocated */\r
FR_TOO_MANY_OPEN_FILES, /* (18) Number of open files > _FS_SHARE */\r
FR_INVALID_PARAMETER /* (19) Given parameter is invalid */\r
-\r