Implement correct drive stat for pidrive

This commit is contained in:
dschmenk 2015-02-05 15:19:46 -08:00
parent 0376c18141
commit 48b4df9e15
3 changed files with 37 additions and 21 deletions

View File

@ -259,6 +259,15 @@ IOERR: LDA #PDIOERR
CMDERR: PLP CMDERR: PLP
SEC SEC
DOCLK: RTS ; NO OP CLOCK ROUTINE DOCLK: RTS ; NO OP CLOCK ROUTINE
STATUS: JSR RECVACC
TAX
JSR RECVACC
TAY
CMDEX: JSR RECVACC
BNE CMDERR
PLP
CLC
RTS
RDBLK: JSR RECVACC RDBLK: JSR RECVACC
STA (PDBUFF),Y STA (PDBUFF),Y
INY INY
@ -266,13 +275,7 @@ RDBLK: JSR RECVACC
INC PDBUFH INC PDBUFH
DEX DEX
BNE RDBLK BNE RDBLK
STATUS: LDX #$FF BEQ CMDEX
DEY ; LDY #$FF
CMDEX: JSR RECVACC
BNE CMDERR
PLP
CLC
RTS
WRBLK: LDA (PDBUFF),Y WRBLK: LDA (PDBUFF),Y
JSR SENDACC JSR SENDACC
INY INY
@ -300,3 +303,5 @@ RECVWT: LDA ACIASR
BEQ RECVWT BEQ RECVWT
FIXUP4: LDA ACIADR FIXUP4: LDA ACIADR
RTS RTS
.ASSERT * - DOCMD <= DRVRLEN, error, "Driver too big"
.OUT .SPRINTF("Driver size %i", * - DOCMD)

View File

@ -249,18 +249,19 @@ STATUS:
LDA #'S'-$40 LDA #'S'-$40
STA INDCTR+3 STA INDCTR+3
.ENDIF .ENDIF
LDA IOSLOT
AND #$0F
TAY
JSR RECVACC JSR RECVACC
LDX #$FF STA SCRTCH6,Y
LDY #$FF JSR RECVACC
; PHA STA SCRTCH7,Y
; JSR RECVACC JSR RECVACC
; TAY PHA
; PLA LDX SCRTCH6,Y
; TAX LDA SCRTCH7,Y
; BNE :+ TAY
; CPY #$00 PLA
; BEQ NODEV
;: LDA #$00
RTS RTS
;* ;*
;* READ A BLOCK (512 BYTES) FROM SIDRIVE ;* READ A BLOCK (512 BYTES) FROM SIDRIVE
@ -406,7 +407,7 @@ ENDCMD:
.REPEAT $C700+250-* .REPEAT $C700+250-*
DB $00 DB $00
.ENDREP .ENDREP
DB "Si" ; SIGNATURE DB "SI" ; SIGNATURE
DW 0 ; USE STATUS TO GET SIZE DW 0 ; USE STATUS TO GET SIZE
DB $97 ; REMOVEABLE, 2 DEVICES, R/W DB $97 ; REMOVEABLE, 2 DEVICES, R/W
DB <CMDENTRY DB <CMDENTRY

View File

@ -140,8 +140,18 @@ int vdrvtime(int afd)
{ {
return write(afd, prodos_time(), 4); return write(afd, prodos_time(), 4);
} }
int vdrvstatus(int drive) int vdrvstat(int afd, int drive)
{ {
struct stat vstat;
unsigned char size_buff[2];
if (vdrvfd[drive])
fstat(vdrvfd[drive], &vstat);
else
vstat.st_size = 0;
size_buff[0] = vstat.st_size >> 9;
size_buff[1] = vstat.st_size >> 17;
write(afd, size_buff, 2);
return vdrvfd[drive] == 0 ? 0x28 : 0x00; return vdrvfd[drive] == 0 ? 0x28 : 0x00;
} }
int vdrvread(int afd, int drive, int block) int vdrvread(int afd, int drive, int block)
@ -833,7 +843,7 @@ reset:
//printf("vdrive: STATUS unit:%d\n", (iopkt[0] >> 1) & 0x01); //printf("vdrive: STATUS unit:%d\n", (iopkt[0] >> 1) & 0x01);
iopkt[3] = iopkt[0] + 1; /* ack */ iopkt[3] = iopkt[0] + 1; /* ack */
write(a2fd, &iopkt[3], 1); write(a2fd, &iopkt[3], 1);
iopkt[0] = vdrvstatus((iopkt[0] >> 1) & 0x01); iopkt[0] = vdrvstat(a2fd, (iopkt[0] >> 1) & 0x01);
write(a2fd, iopkt, 1); write(a2fd, iopkt, 1);
if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */ if (a2reqlist && !(a2reqlist->type & AWAIT_COMPLETE)) /* resend last request */
{ {