Browse Source

IDE & PPIDE Cleanup

pull/109/head
Wayne Warthen 6 years ago
parent
commit
1f6ef60599
  1. 140
      Source/HBIOS/ide.asm
  2. 146
      Source/HBIOS/ppide.asm

140
Source/HBIOS/ide.asm

@ -105,12 +105,6 @@
; SRST: SOFTWARE RESET
; ~IEN: INTERRUPT ENABLE
;
#IF (IDETRACE >= 3)
#DEFINE DCALL CALL
#ELSE
#DEFINE DCALL \;
#ENDIF
;
IDE_REG_DATA .EQU $00 ; DATA /OUTPUT (R/W)
IDE_REG_ERR .EQU $01 ; ERROR REGISTER (R)
IDE_REG_FEAT .EQU $01 ; FEATURES REGISTER (W)
@ -634,14 +628,18 @@ IDE_SETFEAT:
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
POP AF
;OUT (IDE_IO_FEAT),A ; SET THE FEATURE VALUE
CALL IDE_OUT
.DB IDE_REG_FEAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
LD A,IDE_CIDE_SETFEAT ; CMD = SETFEAT
LD (IDE_CMD),A ; SAVE IT
JP IDE_RUNCMD ; RUN COMMAND AND EXIT
@ -657,8 +655,10 @@ IDE_IDENTIFY:
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
LD A,IDE_CIDE_IDDEV
LD (IDE_CMD),A
CALL IDE_RUNCMD
@ -678,8 +678,10 @@ IDE_RDSEC:
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,IDE_CIDE_READ
LD (IDE_CMD),A
@ -700,8 +702,10 @@ IDE_WRSEC:
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL IDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,IDE_CIDE_WRITE
LD (IDE_CMD),A
@ -717,26 +721,34 @@ IDE_SETADDR:
; IDE_IO_LBA3 HAS ALREADY BEEN SET
; HSTLBA2-0 --> IDE_IO_LBA2-0
LD A,(IY+IDE_LBA+2)
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL IDE_OUT
.DB IDE_REG_LBA2
;
LD A,(IY+IDE_LBA+1)
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL IDE_OUT
.DB IDE_REG_LBA1
;
LD A,(IY+IDE_LBA+0)
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL IDE_OUT
.DB IDE_REG_LBA0
;
LD A,1
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL IDE_OUT
.DB IDE_REG_COUNT
;
@ -755,8 +767,10 @@ IDE_RUNCMD:
RET NZ ; BAIL OUT ON TIMEOUT
;
LD A,(IDE_CMD) ; GET THE COMMAND
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;OUT (IDE_IO_CMD),A ; SEND IT (STARTS EXECUTION)
CALL IDE_OUT
.DB IDE_REG_CMD
@ -879,16 +893,20 @@ IDE_GETRES:
;IN A,(IDE_IO_STAT) ; GET STATUS
CALL IDE_IN
.DB IDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
AND %00000001 ; ERROR BIT SET?
RET Z ; NOPE, RETURN WITH ZF
;
;IN A,(IDE_IO_ERR) ; READ ERROR REGISTER
CALL IDE_IN
.DB IDE_REG_ERR
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR $FF ; FORCE NZ TO SIGNAL ERROR
RET ; RETURN
;
@ -1076,8 +1094,10 @@ IDE_PROBE:
;OUT (IDE_IO_DRVHD),A
CALL IDE_OUT
.DB IDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL DELAY ; DELAY ~16US
;
@ -1085,14 +1105,18 @@ IDE_PROBE:
;IN A,(C)
CALL IDE_IN
.DB IDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CP $FF
JP Z,IDE_NOMEDIA
CP $78
JP Z,IDE_NOMEDIA
;
DCALL IDE_REGDUMP
#IF (IDETRACE >= 3)
CALL IDE_REGDUMP
#ENDIF
;
;JR IDE_PROBE1 ; *DEBUG*
;
@ -1100,44 +1124,64 @@ IDE_PROBE0:
CALL IDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
JP NZ,IDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN
;
DCALL IDE_REGDUMP
#IF (IDETRACE >= 3)
CALL IDE_REGDUMP
#ENDIF
;
; CHECK STATUS
;IN A,(IDE_IO_STAT) ; GET STATUS
CALL IDE_IN
.DB IDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
#IF (IDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
#ENDIF
OR A ; SET FLAGS TO TEST FOR ZERO
JP Z,IDE_NOMEDIA
;
; CHECK SIGNATURE
DCALL PC_SPACE
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_COUNT)
CALL IDE_IN
.DB IDE_REG_COUNT
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,IDE_NOMEDIA
DCALL PC_SPACE
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_SECT)
CALL IDE_IN
.DB IDE_REG_SECT
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,IDE_NOMEDIA
DCALL PC_SPACE
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_CYLLO)
CALL IDE_IN
.DB IDE_REG_CYLLO
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,IDE_NOMEDIA
DCALL PC_SPACE
#IF (IDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(IDE_IO_CYLHI)
CALL IDE_IN
.DB IDE_REG_CYLHI
DCALL PRTHEXBYTE
#IF (IDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,IDE_NOMEDIA
;
@ -1176,7 +1220,9 @@ IDE_INITDEV00:
RET NZ ; BAIL OUT ON ERROR
;
LD DE,HB_WRKBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#IF (IDETRACE >= 3)
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#ENDIF
;
XOR A
LD (IY+IDE_MED),0 ; CLEAR FLAGS

146
Source/HBIOS/ppide.asm

@ -122,12 +122,6 @@ PPIDE_CTL_RESET .EQU %10000000 ; DRIVE RESET (ACTIVE LOW, INVERTED)
; SRST: SOFTWARE RESET
; ~IEN: INTERRUPT ENABLE
;
#IF (PPIDETRACE >= 3)
#DEFINE DCALL CALL
#ELSE
#DEFINE DCALL \;
#ENDIF
;
; CONTROL VALUES TO USE WHEN ACCESSING THE VARIOUS IDE DEVICE REGISTERS
;
PPIDE_REG_DATA .EQU PPIDE_CTL_CS1 | $00 ; DATA INPUT/OUTPUT (R/W)
@ -445,8 +439,10 @@ PPIDE_DETECT:
XOR A ; VALUE ZERO
OUT (C),A ; PUSH VALUE TO PORT
IN A,(C) ; GET PORT VALUE
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR A ; SET FLAGS
RET ; AND RETURN
;
@ -643,14 +639,18 @@ PPIDE_SETFEAT:
;OUT (PPIDE_REG_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
POP AF
;OUT (PPIDE_REG_FEAT),A ; SET THE FEATURE VALUE
CALL PPIDE_OUT
.DB PPIDE_REG_FEAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
LD A,PPIDE_CMD_SETFEAT ; CMD = SETFEAT
LD (PPIDE_CMD),A ; SAVE IT
JP PPIDE_RUNCMD ; RUN COMMAND AND EXIT
@ -666,8 +666,10 @@ PPIDE_IDENTIFY:
;OUT (PPIDE_REG_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
LD A,PPIDE_CMD_IDDEV
LD (PPIDE_CMD),A
CALL PPIDE_RUNCMD
@ -687,8 +689,10 @@ PPIDE_RDSEC:
;OUT (PPIDE_REG_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,PPIDE_CMD_READ
LD (PPIDE_CMD),A
@ -709,8 +713,10 @@ PPIDE_WRSEC:
;OUT (PPIDE_REG_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL PPIDE_SETADDR ; SETUP CYL, TRK, HEAD
LD A,PPIDE_CMD_WRITE
LD (PPIDE_CMD),A
@ -726,26 +732,34 @@ PPIDE_SETADDR:
; IDE_IO_LBA3 HAS ALREADY BEEN SET
; HSTLBA2-0 --> IDE_IO_LBA2-0
LD A,(IY+PPIDE_LBA+2)
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL PPIDE_OUT
.DB PPIDE_REG_LBA2
;
LD A,(IY+PPIDE_LBA+1)
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL PPIDE_OUT
.DB PPIDE_REG_LBA1
;
LD A,(IY+PPIDE_LBA+0)
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL PPIDE_OUT
.DB PPIDE_REG_LBA0
;
LD A,1
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL PPIDE_OUT
.DB PPIDE_REG_COUNT
;
@ -764,8 +778,10 @@ PPIDE_RUNCMD:
RET NZ ; BAIL OUT ON TIMEOUT
;
LD A,(PPIDE_CMD) ; GET THE COMMAND
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
;OUT (PPIDE_REG_CMD),A ; SEND IT (STARTS EXECUTION)
CALL PPIDE_OUT
.DB PPIDE_REG_CMD
@ -930,16 +946,20 @@ PPIDE_GETRES:
;IN A,(PPIDE_REG_STAT) ; READ STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
AND %00000001 ; ERROR BIT SET?
RET Z ; NOPE, RETURN WITH ZF
;
;IN A,(PPIDE_REG_ERR) ; READ ERROR REGISTER
CALL PPIDE_IN
.DB PPIDE_REG_ERR
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR $FF ; FORCE NZ TO SIGNAL ERROR
RET ; RETURN
;
@ -1048,8 +1068,10 @@ PPIDE_PROBE:
;OUT (IDE_IO_DRVHD),A
CALL PPIDE_OUT
.DB PPIDE_REG_DRVHD
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
CALL DELAY ; DELAY ~16US
;
@ -1068,12 +1090,16 @@ PPIDE_PROBE:
; IN A,(PPIDE_REG_STAT) ; GET STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE
#ENDIF
OR A
JP Z,PPIDE_NOMEDIA
;
DCALL PPIDE_REGDUMP
#IF (PPIDETRACE >= 3)
CALL PPIDE_REGDUMP
#ENDIF
;
;JR PPIDE_PROBE1 ; *DEBUG*
;
@ -1081,44 +1107,64 @@ PPIDE_PROBE0:
CALL PPIDE_WAITBSY ; WAIT FOR BUSY TO CLEAR
JP NZ,PPIDE_NOMEDIA ; CONVERT TIMEOUT TO NO MEDIA AND RETURN
;
DCALL PPIDE_REGDUMP
#IF (PPIDETRACE >= 3)
CALL PPIDE_REGDUMP
#ENDIF
;
; CHECK STATUS
; IN A,(PPIDE_REG_STAT) ; GET STATUS
CALL PPIDE_IN
.DB PPIDE_REG_STAT
DCALL PC_SPACE
DCALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
CALL PRTHEXBYTE ; IF DEBUG, PRINT STATUS
#ENDIF
OR A ; SET FLAGS TO TEST FOR ZERO
JP Z,PPIDE_NOMEDIA ; CONTINUE IF NON-ZERO
;
; CHECK SIGNATURE
DCALL PC_SPACE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_COUNT)
CALL PPIDE_IN
.DB PPIDE_REG_COUNT
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,PPIDE_NOMEDIA
DCALL PC_SPACE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_SECT)
CALL PPIDE_IN
.DB PPIDE_REG_SECT
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $01
JP NZ,PPIDE_NOMEDIA
DCALL PC_SPACE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_CYLLO)
CALL PPIDE_IN
.DB PPIDE_REG_CYLLO
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,PPIDE_NOMEDIA
DCALL PC_SPACE
#IF (PPIDETRACE >= 3)
CALL PC_SPACE
#ENDIF
;IN A,(PPIDE_REG_CYLHI)
CALL PPIDE_IN
.DB PPIDE_REG_CYLHI
DCALL PRTHEXBYTE
#IF (PPIDETRACE >= 3)
CALL PRTHEXBYTE
#ENDIF
CP $00
JP NZ,PPIDE_NOMEDIA
;
@ -1157,7 +1203,9 @@ PPIDE_INITDEV00:
RET NZ ; BAIL OUT ON ERROR
;
LD DE,HB_WRKBUF ; POINT TO BUFFER
DCALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#IF (PPIDETRACE >= 3)
CALL DUMP_BUFFER ; DUMP IT IF DEBUGGING
#ENDIF
;
LD (IY+PPIDE_MED),0 ; CLEAR MEDIA FLAGS
;

Loading…
Cancel
Save