mirror of
https://github.com/wwarthen/RomWBW.git
synced 2026-02-06 14:11:48 -06:00
Overhaul PPIDE driver and sync with IDE driver
This commit is contained in:
@@ -54,7 +54,7 @@ IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
;
|
||||
PPIDEENABLE .EQU TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
PPIDEIOB .EQU $20 ; PPIDE IOBASE
|
||||
PPIDECNT .EQU 1 ; NUMBER OF PPIDE UNITS
|
||||
PPIDECNT .EQU 2 ; NUMBER OF PPIDE UNITS
|
||||
PPIDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF PPIDEENABLE = TRUE)
|
||||
PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
|
||||
@@ -98,16 +98,16 @@ BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
; 18.432MHz OSC @ FULL SPEED, 38.4Kbps
|
||||
;
|
||||
;Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; 18.432MHz OSC @ DOUBLE SPEED, 38.4Kbps
|
||||
;
|
||||
Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 3 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 2 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
|
||||
@@ -48,7 +48,7 @@ RFCNT .EQU 1 ; NUMBER OF RAM FLOPPY UNITS
|
||||
IDEENABLE .EQU TRUE ; TRUE FOR IDE SUPPORT
|
||||
IDEMODE .EQU IDEMODE_MK4 ; IDEMODE_DIO, IDEMODE_DIDE, IDEMODE_MK4
|
||||
IDECNT .EQU 2 ; NUMBER OF IDE UNITS
|
||||
IDETRACE .EQU 2 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
IDETRACE .EQU 1 ; 0=SILENT, 1=ERRORS, 2=EVERYTHING (ONLY RELEVANT IF IDEENABLE = TRUE)
|
||||
IDE8BIT .EQU TRUE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
|
||||
;
|
||||
PPIDEENABLE .EQU FALSE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
|
||||
@@ -92,16 +92,16 @@ BOOT_DEFAULT .EQU 'Z' ; SELECTION TO INVOKE AT TIMEOUT
|
||||
;
|
||||
; 18.432MHz OSC @ FULL SPEED, 38.4Kbps
|
||||
;
|
||||
;Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_CLKDIV .EQU 1 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 0 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 0 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 20H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 20H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;
|
||||
; 18.432MHz OSC @ DOUBLE SPEED, 38.4Kbps
|
||||
;
|
||||
Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_CLKDIV .EQU 2 ; 0=OSC/2, 1=OSC, 2=OSC*2
|
||||
;Z180_MEMWAIT .EQU 1 ; MEMORY WAIT STATES TO INSERT (0-3)
|
||||
;Z180_IOWAIT .EQU 1 ; IO WAIT STATES TO INSERT (0-3)
|
||||
;Z180_ASCIB0 .EQU 21H ; SERIAL PORT 0 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
;Z180_ASCIB1 .EQU 21H ; SERIAL PORT 1 DIV, SEE Z180 CLOCKING DOCUMENT
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
;
|
||||
; TODO:
|
||||
; - IMPLEMENT IDE_INITDEVICE
|
||||
; - HANDLE SECONDARY INTERFACE ON DIDE
|
||||
; - BREAK OUT IDE_SELECT FROM UNITSEL
|
||||
;
|
||||
; +-----------------------------------------------------------------------+
|
||||
; | CONTROL BLOCK REGISTERS |
|
||||
@@ -353,19 +355,13 @@ IDE_STATUS:
|
||||
; IDE_MEDIA
|
||||
;
|
||||
IDE_MEDIA:
|
||||
CALL IDE_INITDEVICE ; RE-INIT SELECTED UNIT
|
||||
CALL IDE_INITDEV ; RE-INIT SELECTED UNIT
|
||||
LD A,MID_HD ; ASSUME WE ARE OK
|
||||
RET Z ; RETURN IF GOOD INIT
|
||||
LD A,MID_NONE ; SIGNAL NO MEDA
|
||||
OR A ; SET FLAGS
|
||||
RET ; AND RETURN
|
||||
;
|
||||
; NEED TO IMPLEMENT BELOW!!!!
|
||||
;
|
||||
IDE_INITDEVICE:
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_CAP:
|
||||
@@ -392,50 +388,6 @@ IDE_GEOM:
|
||||
; FUNCTION SUPPORT ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
; SOFT RESET OF ALL DEVICES ON BUS
|
||||
;
|
||||
IDE_RESET:
|
||||
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
|
||||
OUT (IDE_IO_CTRL),A
|
||||
LD DE,16 ; DELAY ~250US
|
||||
CALL VDELAY
|
||||
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
|
||||
OUT (IDE_IO_CTRL),A
|
||||
CALL DELAY ; SMALL DELAY
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; RETURN
|
||||
;
|
||||
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
||||
; UNIT IS SPECIFIED IN A
|
||||
;
|
||||
IDE_SELUNIT:
|
||||
LD HL,IDE_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT
|
||||
CP (HL) ; SAME?
|
||||
RET Z ; IF SO, NOTHING MORE TO DO
|
||||
|
||||
CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
|
||||
JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT
|
||||
;
|
||||
; NEW UNIT SELECTED, IMPLEMENT IT
|
||||
LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_DIDE)
|
||||
; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE
|
||||
#ENDIF
|
||||
;
|
||||
AND $01 ; LS BIT DETERMINES MASTER/SLAVE
|
||||
LD HL,IDE_DRVSEL
|
||||
CALL ADDHLA
|
||||
LD A,(HL) ; LOAD DRIVE/HEAD VALUE
|
||||
;
|
||||
OUT (IDE_IO_DRVHD),A ; SELECT DRIVE
|
||||
LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER
|
||||
;
|
||||
; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; (RE)INITIALIZE DEVICE
|
||||
;
|
||||
IDE_INITDEV:
|
||||
@@ -468,7 +420,7 @@ IDE_INITDEV:
|
||||
RET NZ ; BAIL OUT ON ERROR
|
||||
;
|
||||
LD DE,(DIOBUF) ; POINT TO BUFFER
|
||||
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
|
||||
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
|
||||
;
|
||||
; GET DEVICE CAPACITY AND SAVE IT
|
||||
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD
|
||||
@@ -489,62 +441,6 @@ IDE_INITDEV:
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_PROBE:
|
||||
CALL IDE_SELUNIT ; SELECT UNIT
|
||||
RET NZ ; ABORT ON ERROR
|
||||
CALL DELAY
|
||||
;
|
||||
; CHECK STATUS
|
||||
IN A,(IDE_IO_STAT) ; GET STATUS
|
||||
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
|
||||
OR A ; SET FLAGS TO TEST FOR ZERO
|
||||
JR NZ,IDE_PROBE0 ; CONTINUE IF NON-ZERO
|
||||
DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR
|
||||
RET ; AND DONE
|
||||
;
|
||||
IDE_PROBE0:
|
||||
;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
|
||||
;RET NZ ; ABORT ON TIMEOUT
|
||||
;
|
||||
;; CHECK STATUS
|
||||
;IN A,(IDE_IO_STAT) ; GET STATUS
|
||||
;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
|
||||
;OR A ; SET FLAGS TO TEST FOR ZERO
|
||||
;JR NZ,IDE_PROBE1 ; CONTINUE IF NON-ZERO
|
||||
;DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR
|
||||
;RET ; AND DONE
|
||||
;
|
||||
IDE_PROBE1:
|
||||
; CHECK SIGNATURE
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_COUNT)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $01
|
||||
RET NZ
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_SECT)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $01
|
||||
RET NZ
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_CYLLO)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $00
|
||||
RET NZ
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_CYLHI)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $00
|
||||
RET NZ
|
||||
;
|
||||
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS
|
||||
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
|
||||
LD (HL),IDE_TYPEATA ; SET THE DEVICE TYPE
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE, NOTE THAT A=0 AND Z IS SET
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_SETFEAT:
|
||||
PUSH AF
|
||||
#IF (IDETRACE >= 3)
|
||||
@@ -624,18 +520,6 @@ IDE_WRSEC:
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_CHKDEVICE:
|
||||
IDE_DPTR(IDE_STAT)
|
||||
LD A,(HL)
|
||||
OR A
|
||||
RET Z ; RETURN IF ALL IS WELL
|
||||
;
|
||||
; ATTEMPT TO REINITIALIZE HERE???
|
||||
JP IDE_ERR
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_SETADDR:
|
||||
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER
|
||||
; IDE_IO_LBA3 HAS ALREADY BEEN SET BY IDE_SELECT
|
||||
@@ -673,7 +557,9 @@ IDE_SETADDR1:
|
||||
;
|
||||
RET
|
||||
;
|
||||
;
|
||||
;=============================================================================
|
||||
; COMMAND PROCESSING
|
||||
;=============================================================================
|
||||
;
|
||||
IDE_RUNCMD:
|
||||
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
|
||||
@@ -709,8 +595,20 @@ IDE_GETBUF:
|
||||
|
||||
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
|
||||
LD C,IDE_IO_DATA
|
||||
INIR
|
||||
INIR
|
||||
; INIR
|
||||
; INIR
|
||||
IDE_GETBUF1:
|
||||
;IN A,(IDE_IO_DATA)
|
||||
;CALL PRTHEXBYTE
|
||||
CALL DELAY
|
||||
INI
|
||||
JR NZ,IDE_GETBUF1
|
||||
IDE_GETBUF2:
|
||||
;IN A,(IDE_IO_DATA)
|
||||
;CALL PRTHEXBYTE
|
||||
CALL DELAY
|
||||
INI
|
||||
JR NZ,IDE_GETBUF2
|
||||
#ELSE
|
||||
LD C,IDE_IO_DATAHI
|
||||
IDE_GETBUF1:
|
||||
@@ -756,6 +654,156 @@ IDE_PUTBUF1:
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_GETRES:
|
||||
IN A,(IDE_IO_STAT) ; GET STATUS
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
AND %00000001 ; ERROR BIT SET?
|
||||
RET Z ; NOPE, RETURN WITH ZF
|
||||
;
|
||||
IN A,(IDE_IO_ERR) ; READ ERROR REGISTER
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
OR $FF ; FORCE NZ TO SIGNAL ERROR
|
||||
RET ; RETURN
|
||||
;
|
||||
;=============================================================================
|
||||
; HARDWARE INTERFACE ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
; SOFT RESET OF ALL DEVICES ON BUS
|
||||
;
|
||||
IDE_RESET:
|
||||
;
|
||||
#IF (PLATFORM == PLT_MK4)
|
||||
LD A,$80 ; HIGH BIT OF XAR IS IDE RESET
|
||||
OUT (MK4_XAR),A
|
||||
LD DE,16 ; DELAY ~250US
|
||||
CALL VDELAY
|
||||
XOR A ; CLEAR RESET BIT
|
||||
OUT (MK4_XAR),A
|
||||
#ELSE
|
||||
LD A,%00001110 ; NO INTERRUPTS, ASSERT RESET BOTH DRIVES
|
||||
OUT (IDE_IO_CTRL),A
|
||||
#ENDIF
|
||||
;
|
||||
LD DE,16 ; DELAY ~250US
|
||||
CALL VDELAY
|
||||
LD A,%00001010 ; NO INTERRUPTS, DEASSERT RESET
|
||||
OUT (IDE_IO_CTRL),A
|
||||
LD DE,16 ; DELAY ~250US
|
||||
CALL VDELAY
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; RETURN
|
||||
;
|
||||
; TAKE ANY ACTIONS REQUIRED TO SELECT DESIRED PHYSICAL UNIT
|
||||
; UNIT IS SPECIFIED IN A
|
||||
;
|
||||
IDE_SELUNIT:
|
||||
; LD HL,IDE_UNIT ; POINT TO PREVIOUSLY SELECTED UNIT
|
||||
; CP (HL) ; SAME?
|
||||
; RET Z ; IF SO, NOTHING MORE TO DO
|
||||
|
||||
CP IDE_UNITCNT ; CHECK VALIDITY (EXCEED UNIT COUNT?)
|
||||
JP NC,IDE_INVUNIT ; HANDLE INVALID UNIT
|
||||
;
|
||||
; NEW UNIT SELECTED, IMPLEMENT IT
|
||||
LD (IDE_UNIT),A ; RECORD NEW UNIT NUMBER
|
||||
;
|
||||
#IF (IDEMODE == IDEMODE_DIDE)
|
||||
; SELECT PRIMARY/SECONDARY INTERFACE FOR DIDE HARDWARE
|
||||
#ENDIF
|
||||
;
|
||||
AND $01 ; LS BIT DETERMINES MASTER/SLAVE
|
||||
LD HL,IDE_DRVSEL
|
||||
CALL ADDHLA
|
||||
LD A,(HL) ; LOAD DRIVE/HEAD VALUE
|
||||
;
|
||||
OUT (IDE_IO_DRVHD),A ; SELECT DRIVE
|
||||
LD (IDE_DRVHD),A ; UPDATE SHADOW REGISTER
|
||||
;
|
||||
; SPEC REQUIRES 400NS DELAY BEFORE CHECKING STATUS REGISTER
|
||||
;
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_PROBE:
|
||||
CALL IDE_SELUNIT ; SELECT UNIT
|
||||
RET NZ ; ABORT ON ERROR
|
||||
;
|
||||
;CALL LDELAY
|
||||
LD DE,$2000 ; DELAY N * 16US (~128MS)
|
||||
CALL VDELAY
|
||||
;
|
||||
;; WAIT FOR READY...
|
||||
;CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
|
||||
;RET NZ ; ABORT ON TIMEOUT
|
||||
;
|
||||
; CHECK STATUS
|
||||
IN A,(IDE_IO_STAT) ; GET STATUS
|
||||
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
|
||||
OR A ; SET FLAGS TO TEST FOR ZERO
|
||||
JR NZ,IDE_PROBE0 ; CONTINUE IF NON-ZERO
|
||||
DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR
|
||||
RET ; AND DONE
|
||||
;
|
||||
IDE_PROBE0:
|
||||
;CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
|
||||
;RET NZ ; ABORT ON TIMEOUT
|
||||
;
|
||||
;; CHECK STATUS
|
||||
;IN A,(IDE_IO_STAT) ; GET STATUS
|
||||
;DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
|
||||
;OR A ; SET FLAGS TO TEST FOR ZERO
|
||||
;JR NZ,IDE_PROBE1 ; CONTINUE IF NON-ZERO
|
||||
;DEC A ; ZERO MEANS NO MEDIA, SIGNAL ERROR
|
||||
;RET ; AND DONE
|
||||
;
|
||||
IDE_PROBE1:
|
||||
; CHECK SIGNATURE
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_COUNT)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $01
|
||||
RET NZ
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_SECT)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $01
|
||||
RET NZ
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_CYLLO)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $00
|
||||
RET NZ
|
||||
DCALL PC_SPACE
|
||||
IN A,(IDE_IO_CYLHI)
|
||||
DCALL PRTHEXBYTE
|
||||
CP $00
|
||||
RET NZ
|
||||
;
|
||||
; SIGNATURE MATCHES ATA DEVICE, RECORD TYPE AND RETURN SUCCESS
|
||||
IDE_DPTR(IDE_TYPE) ; POINT HL TO UNIT TYPE FIELD, A IS TRASHED
|
||||
LD (HL),IDE_TYPEATA ; SET THE DEVICE TYPE
|
||||
XOR A ; SIGNAL SUCCESS
|
||||
RET ; DONE, NOTE THAT A=0 AND Z IS SET
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_CHKDEVICE:
|
||||
IDE_DPTR(IDE_STAT)
|
||||
LD A,(HL)
|
||||
OR A
|
||||
RET Z ; RETURN IF ALL IS WELL
|
||||
;
|
||||
; ATTEMPT TO REINITIALIZE HERE???
|
||||
JP IDE_ERR
|
||||
RET
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_WAITRDY:
|
||||
LD B,15 ; ~15 SECOND TIMEOUT?
|
||||
IDE_WAITRDY1:
|
||||
@@ -813,26 +861,6 @@ IDE_WAITBSY2:
|
||||
DJNZ IDE_WAITBSY1
|
||||
JP IDE_BSYTO ; EXIT WITH BSYTO ERR
|
||||
;
|
||||
;
|
||||
;
|
||||
IDE_GETRES:
|
||||
IN A,(IDE_IO_STAT) ; GET STATUS
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
AND %00000001 ; ERROR BIT SET?
|
||||
RET Z ; NOPE, RETURN WITH ZF
|
||||
;
|
||||
IN A,(IDE_IO_ERR) ; READ ERROR REGISTER
|
||||
DCALL PC_SPACE
|
||||
DCALL PRTHEXBYTE
|
||||
OR $FF ; FORCE NZ TO SIGNAL ERROR
|
||||
RET ; RETURN
|
||||
;
|
||||
;=============================================================================
|
||||
; HARDWARE INTERFACE ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
;
|
||||
;=============================================================================
|
||||
; ERROR HANDLING AND DIAGNOSTICS
|
||||
;=============================================================================
|
||||
@@ -940,7 +968,9 @@ IDE_REGDUMP1:
|
||||
IN A,(C)
|
||||
CALL PRTHEXBYTE
|
||||
DEC C
|
||||
DJNZ IDE_REGDUMP1
|
||||
DEC B
|
||||
CALL NZ,PC_SPACE
|
||||
JR NZ,IDE_REGDUMP1
|
||||
CALL PC_RBKT
|
||||
POP BC
|
||||
POP AF
|
||||
@@ -1002,9 +1032,10 @@ IDE_STR_NO .TEXT "NO$"
|
||||
IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
|
||||
IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
|
||||
;
|
||||
IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
|
||||
;
|
||||
; UNIT SPECIFIC DATA STORAGE
|
||||
;
|
||||
IDE_UNIT .DB -1 ; ACTIVE UNIT, INIT TO -1 TO INDICATE NOTHING SELECTED
|
||||
IDE_UDATA .FILL IDE_UNITCNT*8,0 ; PER UNIT DATA, 8 BYTES
|
||||
IDE_DLEN .EQU $ - IDE_UDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS
|
||||
IDE_UDLEN .EQU IDE_DLEN / IDE_UNITCNT ; LENGTH OF PER UNIT DATA
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1224,29 +1224,6 @@ SD_WAITRX:
|
||||
JR NZ,SD_WAITRX
|
||||
RET
|
||||
;
|
||||
; MSB<-->LSB MIRROR BITS IN A, RESULT IN C
|
||||
;
|
||||
MIRROR:
|
||||
#IF (SDCSIOFAST) ; SLOW SPEED, LEAST CODE SPACE
|
||||
LD BC,MIRTAB ; 256 BYTE MIRROR TABLE
|
||||
ADD A,C ; ADD OFFSET
|
||||
LD C,A
|
||||
JR NC,MIRROR2
|
||||
INC B
|
||||
MIRROR2:
|
||||
LD A,(BC) ; GET RESULT
|
||||
LD C,A ; RETURN RESULT IN C
|
||||
RET
|
||||
#ELSE ; FASTEST BUT USES MOST CODE SPACE
|
||||
LD B,8 ; BIT COUNTER
|
||||
MIRROR1:
|
||||
RLA ; ROTATE BIT 7 INTO CARRY
|
||||
RR C ; ROTATE CARRY INTO RESULT
|
||||
DJNZ MIRROR1 ; DO ALL 8 BITS
|
||||
RET
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
; SEND ONE BYTE
|
||||
;
|
||||
SD_PUT:
|
||||
@@ -1583,6 +1560,51 @@ SD_UNITDATA .FILL SD_UNITCNT * 8, 0 ; PER UNIT DATA, 8 BYTES
|
||||
SD_DATALEN .EQU $ - SD_UNITDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS
|
||||
SD_UNITDATALEN .EQU SD_DATALEN / SD_UNITCNT ; LENGTH OF PER UNIT DATA
|
||||
;
|
||||
;=============================================================================
|
||||
; HELPER ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
; IMPLEMENTATION FOR MACRO SD_DPTR
|
||||
; SET HL TO ADDRESS OF FIELD WITHIN PER UNIT DATA
|
||||
; HL := ADR OF SD_UNITDATA[(SD_UNIT)][(SP)]
|
||||
; ENTER WITH TOP-OF-STACK = ADDRESS OF FIELD OFFSET
|
||||
; AF IS TRASHED
|
||||
;
|
||||
SD_DPTRIMP:
|
||||
LD HL,SD_UNITDATA ; POINT TO START OF UNIT DATA ARRAY
|
||||
LD A,(SD_UNIT) ; GET CURRENT UNIT NUM
|
||||
RLCA ; MULTIPLY BY
|
||||
RLCA ; ... SIZE OF PER UNIT DATA
|
||||
RLCA ; ... (8 BYTES)
|
||||
EX (SP),HL ; GET PTR TO FIELD OFFSET VALUE FROM TOS
|
||||
ADD A,(HL) ; ADD IT TO START OF UNIT DATA IN ACCUM
|
||||
INC HL ; BUMP HL TO NEXT REAL INSTRUCTION
|
||||
EX (SP),HL ; AND PUT IT BACK ON STACK, HL GETS ADR OF START OF DATA
|
||||
JP ADDHLA ; CALC FINAL ADR IN HL AND RETURN
|
||||
;
|
||||
; MSB<-->LSB MIRROR BITS IN A, RESULT IN C
|
||||
;
|
||||
MIRROR:
|
||||
#IF (SDCSIOFAST) ; SLOW SPEED, LEAST CODE SPACE
|
||||
LD BC,MIRTAB ; 256 BYTE MIRROR TABLE
|
||||
ADD A,C ; ADD OFFSET
|
||||
LD C,A
|
||||
JR NC,MIRROR2
|
||||
INC B
|
||||
MIRROR2:
|
||||
LD A,(BC) ; GET RESULT
|
||||
LD C,A ; RETURN RESULT IN C
|
||||
RET
|
||||
#ELSE ; FASTEST BUT USES MOST CODE SPACE
|
||||
LD B,8 ; BIT COUNTER
|
||||
MIRROR1:
|
||||
RLA ; ROTATE BIT 7 INTO CARRY
|
||||
RR C ; ROTATE CARRY INTO RESULT
|
||||
DJNZ MIRROR1 ; DO ALL 8 BITS
|
||||
RET
|
||||
#ENDIF
|
||||
#ENDIF
|
||||
;
|
||||
; LOOKUP TABLE TO MIRROR BITS IN A BYTE
|
||||
;
|
||||
#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4)) & SDCSIOFAST)
|
||||
@@ -1605,25 +1627,3 @@ MIRTAB .DB 00H, 80H, 40H, 0C0H, 20H, 0A0H, 60H, 0E0H, 10H, 90H, 50H, 0D0H, 30H,
|
||||
.DB 0FH, 8FH, 4FH, 0CFH, 2FH, 0AFH, 6FH, 0EFH, 1FH, 9FH, 5FH, 0DFH, 3FH, 0BFH, 7FH, 0FFH
|
||||
;
|
||||
#ENDIF
|
||||
;
|
||||
;=============================================================================
|
||||
; HELPER ROUTINES
|
||||
;=============================================================================
|
||||
;
|
||||
; IMPLEMENTATION FOR MACRO SD_DPTR
|
||||
; SET HL TO ADDRESS OF FIELD WITHIN PER UNIT DATA
|
||||
; HL := ADR OF SD_UNITDATA[(SD_UNIT)][(SP)]
|
||||
; ENTER WITH TOP-OF-STACK = ADDRESS OF FIELD OFFSET
|
||||
; AF IS TRASHED
|
||||
;
|
||||
SD_DPTRIMP:
|
||||
LD HL,SD_UNITDATA ; POINT TO START OF UNIT DATA ARRAY
|
||||
LD A,(SD_UNIT) ; GET CURRENT UNIT NUM
|
||||
RLCA ; MULTIPLY BY
|
||||
RLCA ; ... SIZE OF PER UNIT DATA
|
||||
RLCA ; ... (8 BYTES)
|
||||
EX (SP),HL ; GET PTR TO FIELD OFFSET VALUE FROM TOS
|
||||
ADD A,(HL) ; ADD IT TO START OF UNIT DATA IN ACCUM
|
||||
INC HL ; BUMP HL TO NEXT REAL INSTRUCTION
|
||||
EX (SP),HL ; AND PUT IT BACK ON STACK, HL GETS ADR OF START OF DATA
|
||||
JP ADDHLA ; CALC FINAL ADR IN HL AND RETURN
|
||||
|
||||
Reference in New Issue
Block a user