Browse Source

Overhaul PPIDE driver and sync with IDE driver

pull/3/head
Wayne Warthen 10 years ago
parent
commit
4626695b52
  1. 22
      Source/HBIOS/Config/mk4_diskio3.asm
  2. 22
      Source/HBIOS/Config/mk4_std.asm
  3. 321
      Source/HBIOS/ide.asm
  4. 1670
      Source/HBIOS/ppide.asm
  5. 90
      Source/HBIOS/sd.asm

22
Source/HBIOS/Config/mk4_diskio3.asm

@ -54,7 +54,7 @@ IDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB)
; ;
PPIDEENABLE .EQU TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE) PPIDEENABLE .EQU TRUE ; TRUE FOR PPIDE SUPPORT (DO NOT COMBINE WITH DSKYENABLE)
PPIDEIOB .EQU $20 ; PPIDE IOBASE 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) 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!) PPIDE8BIT .EQU FALSE ; USE IDE 8BIT TRANSFERS (PROBABLY ONLY WORKS FOR CF CARDS!)
PPIDECAPACITY .EQU 64 ; CAPACITY OF DEVICE (IN MB) 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 ; 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 ; 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

22
Source/HBIOS/Config/mk4_std.asm

@ -48,7 +48,7 @@ RFCNT .EQU 1 ; NUMBER OF RAM FLOPPY UNITS
IDEENABLE .EQU TRUE ; TRUE FOR IDE SUPPORT IDEENABLE .EQU TRUE ; TRUE FOR IDE SUPPORT
IDEMODE .EQU IDEMODE_MK4 ; IDEMODE_DIO, IDEMODE_DIDE, IDEMODE_MK4 IDEMODE .EQU IDEMODE_MK4 ; IDEMODE_DIO, IDEMODE_DIDE, IDEMODE_MK4
IDECNT .EQU 2 ; NUMBER OF IDE UNITS 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!) 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) 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 ; 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 ; 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

321
Source/HBIOS/ide.asm

@ -5,6 +5,8 @@
; ;
; TODO: ; TODO:
; - IMPLEMENT IDE_INITDEVICE ; - IMPLEMENT IDE_INITDEVICE
; - HANDLE SECONDARY INTERFACE ON DIDE
; - BREAK OUT IDE_SELECT FROM UNITSEL
; ;
; +-----------------------------------------------------------------------+ ; +-----------------------------------------------------------------------+
; | CONTROL BLOCK REGISTERS | ; | CONTROL BLOCK REGISTERS |
@ -353,19 +355,13 @@ IDE_STATUS:
; IDE_MEDIA ; IDE_MEDIA
; ;
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 LD A,MID_HD ; ASSUME WE ARE OK
RET Z ; RETURN IF GOOD INIT RET Z ; RETURN IF GOOD INIT
LD A,MID_NONE ; SIGNAL NO MEDA LD A,MID_NONE ; SIGNAL NO MEDA
OR A ; SET FLAGS OR A ; SET FLAGS
RET ; AND RETURN RET ; AND RETURN
; ;
; NEED TO IMPLEMENT BELOW!!!!
;
IDE_INITDEVICE:
XOR A
RET
;
; ;
; ;
IDE_CAP: IDE_CAP:
@ -392,50 +388,6 @@ IDE_GEOM:
; FUNCTION SUPPORT ROUTINES ; 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 ; (RE)INITIALIZE DEVICE
; ;
IDE_INITDEV: IDE_INITDEV:
@ -468,7 +420,7 @@ IDE_INITDEV:
RET NZ ; BAIL OUT ON ERROR RET NZ ; BAIL OUT ON ERROR
; ;
LD DE,(DIOBUF) ; POINT TO BUFFER 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 ; GET DEVICE CAPACITY AND SAVE IT
IDE_DPTR(IDE_CAPACITY) ; POINT HL TO UNIT CAPACITY FIELD 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: IDE_SETFEAT:
PUSH AF PUSH AF
#IF (IDETRACE >= 3) #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: IDE_SETADDR:
; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER ; SEND 3 LOWEST BYTES OF LBA IN REVERSE ORDER
; IDE_IO_LBA3 HAS ALREADY BEEN SET BY IDE_SELECT ; IDE_IO_LBA3 HAS ALREADY BEEN SET BY IDE_SELECT
@ -673,7 +557,9 @@ IDE_SETADDR1:
; ;
RET RET
; ;
;
;=============================================================================
; COMMAND PROCESSING
;=============================================================================
; ;
IDE_RUNCMD: IDE_RUNCMD:
CALL IDE_WAITRDY ; WAIT FOR DRIVE READY CALL IDE_WAITRDY ; WAIT FOR DRIVE READY
@ -709,8 +595,20 @@ IDE_GETBUF:
#IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE)) #IF (IDE8BIT | (IDEMODE == IDEMODE_DIDE))
LD C,IDE_IO_DATA 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 #ELSE
LD C,IDE_IO_DATAHI LD C,IDE_IO_DATAHI
IDE_GETBUF1: 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: IDE_WAITRDY:
LD B,15 ; ~15 SECOND TIMEOUT? LD B,15 ; ~15 SECOND TIMEOUT?
IDE_WAITRDY1: IDE_WAITRDY1:
@ -813,26 +861,6 @@ IDE_WAITBSY2:
DJNZ IDE_WAITBSY1 DJNZ IDE_WAITBSY1
JP IDE_BSYTO ; EXIT WITH BSYTO ERR 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 ; ERROR HANDLING AND DIAGNOSTICS
;============================================================================= ;=============================================================================
@ -940,7 +968,9 @@ IDE_REGDUMP1:
IN A,(C) IN A,(C)
CALL PRTHEXBYTE CALL PRTHEXBYTE
DEC C DEC C
DJNZ IDE_REGDUMP1
DEC B
CALL NZ,PC_SPACE
JR NZ,IDE_REGDUMP1
CALL PC_RBKT CALL PC_RBKT
POP BC POP BC
POP AF POP AF
@ -1002,9 +1032,10 @@ IDE_STR_NO .TEXT "NO$"
IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS IDE_CMD .DB 0 ; PENDING COMMAND TO PROCESS
IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK IDE_DRVHD .DB 0 ; CURRENT DRIVE/HEAD MASK
; ;
IDE_UNIT .DB 0 ; ACTIVE UNIT, DEFAULT TO ZERO
;
; UNIT SPECIFIC DATA STORAGE ; 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_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_DLEN .EQU $ - IDE_UDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS
IDE_UDLEN .EQU IDE_DLEN / IDE_UNITCNT ; LENGTH OF PER UNIT DATA IDE_UDLEN .EQU IDE_DLEN / IDE_UNITCNT ; LENGTH OF PER UNIT DATA

1670
Source/HBIOS/ppide.asm

File diff suppressed because it is too large

90
Source/HBIOS/sd.asm

@ -1224,29 +1224,6 @@ SD_WAITRX:
JR NZ,SD_WAITRX JR NZ,SD_WAITRX
RET 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 ; SEND ONE BYTE
; ;
SD_PUT: 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_DATALEN .EQU $ - SD_UNITDATA ; LENGTH OF ENTIRE DATA STORAGE FOR ALL UNITS
SD_UNITDATALEN .EQU SD_DATALEN / SD_UNITCNT ; LENGTH OF PER UNIT DATA 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 ; LOOKUP TABLE TO MIRROR BITS IN A BYTE
; ;
#IF (((SDMODE == SDMODE_CSIO) | (SDMODE == SDMODE_MK4)) & SDCSIOFAST) #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 .DB 0FH, 8FH, 4FH, 0CFH, 2FH, 0AFH, 6FH, 0EFH, 1FH, 9FH, 5FH, 0DFH, 3FH, 0BFH, 7FH, 0FFH
; ;
#ENDIF #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

Loading…
Cancel
Save