тестирование задержек для IDE

This commit is contained in:
Anatoliy Belyanskiy 2023-08-01 02:57:04 +10:00
parent 4880d5dfbd
commit 13e72e8300
4 changed files with 121 additions and 151 deletions

@ -1 +1 @@
Subproject commit 785b2adeb82bc426c6a7cc5da0d2c041d414ebc3
Subproject commit 53e49fa3cc457e2d7a8977d6166246b8457cb5ce

View File

@ -5,33 +5,11 @@
; 02-08-2001 DNS Initial this module
;---------------------------------------------------------------
;========================================================
;!FIXIT
R170 EQU #0050 ;Data
R171 EQU #0051 ;Error
R172 EQU #0052 ;Direct
R173 EQU #0053 ;Reserve
R174 EQU #0054 ;Lenght block low
R175 EQU #0055 ;Lenght block high
R176 EQU #4052 ;Drive device
R177 EQU #4053 ;Status
W170 EQU #0150 ;Data
W171 EQU #0151 ;????
W172 EQU #0152 ;????
W173 EQU #0153 ;Reserve
W174 EQU #0154 ;Lenght block low
W175 EQU #0155 ;Lenght block high
W176 EQU #4152 ;Drive device
W177 EQU #4153 ;Command
SIZESEC EQU #0800
PKTSIZE EQU 12
RAM_ATAPI_PK EQU #FEE0
RAM_ATAPI_READ EQU #FEF0
;BSY EQU 7
;DRQ EQU 3
;ERR EQU 0
;[]===========================================================[]
CD_5x.RESET:
LD B,50
@ -71,11 +49,6 @@ CD.CLOSE:
JP CD_CLOSE
;[]===========================================================[]
SIZESEC EQU #0800
PKTSIZE EQU 12
CD_TEST LD HL,CMDNOPP
LD DE,0
CALL AP_COM
@ -147,27 +120,28 @@ CD_READ:
; 07h - DATA PROTECT
; 0Bh - ABORTED COMMAND
; 80h - TIME OUT
AP_COM AND #01
AP_COM: AND #01
LD A,#A0
JR Z,.APCOM1
LD A,#B0
.APCOM1 LD BC,W176
.APCOM1 LD BC,IDE.Write.DriveCtrl
OUT (C),A ;SELECT DRIVE
EXX
LD DE,#8000
LD BC,R177
;LD BC,IDE.Read.Status
CALL CWAITPRT
EXX
JR NC,.CDREADY
LD BC,W177
LD BC,IDE.Write.Command
LD A,#08
OUT (C),A
LD B,#00
DJNZ $
.pause: DJNZ .pause
EXX
LD DE,#8000
LD BC,R177
;LD BC,IDE.Read.Status
CALL CWAITPRT
EXX
RET C
@ -193,24 +167,24 @@ AP_COM AND #01
EXX
OUT (C),A
XOR A
LD BC,W171
LD BC,IDE.Write.Error
OUT (C),A
LD DE,SIZESEC ;SIZE BLOCK
LD BC,W174
LD BC,IDE.Write.CylinderLow
OUT (C),E
LD BC,W175
LD BC,IDE.Write.CylinderHigh
OUT (C),D
LD BC,W177
LD BC,IDE.Write.Command
LD A,#A0
OUT (C),A
LD DE,#8000
LD BC,R177
;LD BC,IDE.Read.Status
CALL CWAITPRT
EXX
RET C
EXX
LD DE,#0908
LD BC,R177
;LD BC,IDE.Read.Status
CALL CWAITPRT
EXX
BIT IDE.ControlBit.Error,A
@ -225,7 +199,7 @@ AP_COM AND #01
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,RAM_ATAPI_PK
LD BC,W170
LD BC,IDE.Write.Data
LD A,PKTSIZE
SRL A
.OUTPKT:
@ -240,16 +214,16 @@ AP_COM AND #01
.AP_LOOP:
EXX
LD DE,#8000
LD BC,R177
;LD BC,IDE.Read.Status
CALL CWAITPRT
EXX
RET C
LD BC,R177
LD BC,IDE.Read.Status
IN A,(C)
BIT IDE.ControlBit.Error,A
JR Z,.NO_ERR
.CDERROR:
LD BC,R171 ;ERROR
LD BC,IDE.Read.Error ;ERROR
IN A,(C)
RRCA
RRCA
@ -263,20 +237,20 @@ AP_COM AND #01
LD A,0
RET Z ;NO DATA REQUEST
EX DE,HL
LD BC,R174
LD BC,IDE.Read.CylinderLow
IN E,(C)
LD BC,R175
LD BC,IDE.Read.CylinderHigh
IN D,(C) ;TRANSFER BLOCK SIZE
LD A,D
OR E
RET Z ;BLOCK = 0
LD BC,R172
LD BC,IDE.Read.Counter
IN A,(C)
AND #02
CP #02
JP Z,.FROM_CD
;.TO_CD:
LD BC,R170
LD BC,IDE.Read.Data
.WR_T_CD:
OUTI
OUTI
@ -291,7 +265,7 @@ AP_COM AND #01
LD A,H
OR L
JR Z,.NULL
LD BC,R170
LD BC,IDE.Read.Data
.RD_F_CD:
INI
INI
@ -302,7 +276,7 @@ AP_COM AND #01
JR NZ,.RD_F_CD
EX DE,HL
JR .AP_LOOP
.NULL: LD BC,R170
.NULL: LD BC,IDE.Read.Data
.RD_N_CD:
IN A,(C)
DEC B
@ -331,8 +305,9 @@ AP_COM AND #01
; D - MASK
; E - PATTERN
; BC - PORT
//; BC - PORT
CWAITPRT:
LD BC,IDE.Read.Status
LD A,100
LD HL,#0000
.CWAITPX:

View File

@ -279,7 +279,7 @@ RDS000: CALL SELECTH
RET C
EXX
LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -298,7 +298,7 @@ RDS000: CALL SELECTH
;SAVE HL!
RDS002: EXX
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -338,7 +338,7 @@ RDS004: DUP 16
.W44: INC XL ;INC LOADED SECTORS
EXX
LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -443,7 +443,7 @@ WRS000:
RET C
EXX
LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -478,7 +478,7 @@ NO_WriteProtect:
;SAVE HL!
WRS002: EXX
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -520,7 +520,7 @@ WRS003:
.W33: INC XL ;INC SAVED SECTORS
EXX
LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -562,7 +562,7 @@ VRS000: CALL SELECTH
RET C
EXX
LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
EXX
RET C
@ -579,7 +579,7 @@ VRS002: LD BC,IDE.Read.Status
SCF
RET
VRS003: LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAITPRT
RET C
XOR A
@ -675,27 +675,32 @@ CHS005: INC A
; D - MASK
; E - PATTERN
; BC - PORT
//; BC - PORT
WAITPRT:
LD HL,#0000
.P0: IN A,(C)
LD BC,IDE.Read.Status
LD HL,#0000 ; § ¤¥à¦ª 
.loop: PUSH HL
.loop2: IN A,(C)
AND D
CP E
;!TEST
RET Z
;JR NZ,.P2
;AND A
;RET
;
.P2: DEC HL
JR Z,.ok
DEC HL
LD A,L
OR H
JP NZ,.P0
.error: LD A,4 ;!HARDCODE error number
JP NZ,.loop2
POP HL
DEC L
JR NZ,.loop
.error: LD A,4 ;!HARDCODE error number
SCF
RET
.ok: POP HL
RET
;=======================================================================
;[]================================================================[#57]
@ -728,7 +733,8 @@ HDD_5x.DETECT:
LD C,SLOT3
OUT (C),B
CP IDE.Device.NONE
CCF
CP IDE.Device.HDD
RET Z
SCF
RET
;[]================================================================[#57]

View File

@ -85,13 +85,17 @@ IDE3 EQU #C1D8
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;DEVICE TYPE ;07
WAIT_IDE EQU #0000
WAIT_SML EQU #1000
WAIT_ERROR EQU #0400
IDE__CD:
CALL SELECT_IDE
;MASTER
CDAUTO:
LD A,IDE.Device.CDROM
LD (IDEDEV),A
LD A,#FF
LD A,#FF ;!FIXIT ¬®¦­® ®¯â¨¬¨§¨à®¢ âì
JP CDMASTR
SELECT_IDE:
@ -130,17 +134,13 @@ CDMASTR:
LD (SKIP),A
LD BC,IDE.Write.DriveCtrl
OUT (C),D
IF IDE_Optimization
DEC B
INC C
ELSE
LD BC,IDE.Read.Status
ENDIF
INC C ; LD BC,IDE.Read.Status
IN A,(C)
AND #80
LD HL,280
JR Z,NO_BUSY
LD HL,1550
LD HL,1550 ; § ¤¥à¦ª  - 31 ᥪ㭤 
EI
CLRBUSY:
HALT
@ -150,7 +150,7 @@ CLRBUSY:
JP Z,ABSENT
CALL SKIPKEY
JP C,ABSENT
LD BC,IDE.Read.Status
LD BC,IDE.Read.Status ;!FIXIT ¬®¦­® § ª®¬¬¥­â¨à®¢ âì?
IN A,(C)
AND #80
JR NZ,CLRBUSY
@ -165,25 +165,31 @@ NO_BUSY:
DEC C
JR NZ,.pause
IF IDE_Optimization
LD C,IDE.Read.Counter
ELSE
LD BC,IDE.Read.Counter
ENDIF
LD C,IDE.Read.Counter ; LD BC,IDE.Read.Counter
IN A,(C)
CP E
JP NZ,ABSENT
;!FIXIT CD-ROM Autodetect error!
LD A,(IDEDEV)
CP IDE.Device.CDROM
JP Z,NOHDD
;!TODO
; I haven,t done too many tests but this works on all the hardware i have.
; 1 select device (port+6)
; 2 read status byte(port+7) if =-1 then there is no disk
; if busy to many time then no disk
; 3 send id command 0ec0h if error then send packet device id command
; 0a1h if error then no disk.
; commands must be send byte by byte dword operations are used only for data transfers.
;CP IDE.Device.NONE
;JR NZ,1F
1: CP IDE.Device.CDROM
JP Z,NOHDD ;¯à¨  ¢â®¤¥â¥ªâ¥, ¥á«¨ âãâ CD, â® ­¨ª®£¤  ­¥ ¡ã¤¥â ¯¥à¥å®¤  ­  NOHDD
LD E,ATA_NOP
LD BC,IDE.Write.Command
OUT (C),E
IF IDE_Optimization
DEC B
ENDIF
DEC B ; LD BC, IDE.Read.Status
WXREADY:
HALT
DEC HL
@ -192,9 +198,7 @@ WXREADY:
JP Z,ABSENT
CALL SKIPKEY
JP C,ABSENT
IFN IDE_Optimization
LD BC,IDE.Read.Status
ENDIF
;LD BC,IDE.Read.Status
IN A,(C)
AND #C0
CP #40
@ -212,20 +216,15 @@ WXREADY:
LD B,0
.pause: DJNZ .pause
LD HL,(WAITSML)
LD HL,WAIT_SML
LD DE,#0101
IF IDE_Optimization
LD B,high IDE.Read.Status
ELSE
LD BC,IDE.Read.Status
ENDIF
CALL WAIT_PRT
JP NC,NOHDD
GETPARM:
LD HL,(WAITIDE)
LD HL,WAIT_IDE
LD DE,#0808
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAIT_PRT
JP C,ABSENT
LD BC,IDE.Read.Data
@ -245,13 +244,9 @@ NOHDD: LD A,IDE.Device.CDROM
LD B,0
.pause: DJNZ .pause
LD HL,(WAITSML)
;LD HL,WAIT_SML
LD HL,WAIT_ERROR
LD DE,#0101
IF IDE_Optimization
LD B,high IDE.Read.Status
ELSE
LD BC,IDE.Read.Status
ENDIF
CALL WAIT_PRT
JP C,GETPARM
ABSENT:
@ -329,21 +324,17 @@ FOR_CDR:
IDE_CMD:
PUSH AF
LD HL,(WAITIDE)
LD HL,WAIT_IDE
LD DE,#C040
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
CALL WAIT_PRT
POP DE
RET C
IF IDE_Optimization
INC B
ELSE
LD BC,IDE.Write.Command
ENDIF
INC B ; LD BC,IDE.Write.Command
OUT (C),D
LD HL,(WAITIDE)
LD HL,WAIT_IDE
LD DE,#C040
LD BC,IDE.Read.Status
;LD BC,IDE.Read.Status
JP WAIT_PRT
WAITHDD:
@ -363,42 +354,24 @@ WTREADY:
SCF
RET
;WAITHDD DEC L
; RET NZ
; DEC H
; RET NZ
; DEC E
; RET NZ
; SCF
; RET
; E - Second * 10
;PAUSE LD HL,#0000
;PAUSE1 DEC L
; JR NZ,PAUSE1
; DEC H
; JR NZ,PAUSE1
; DEC E
; JR NZ,PAUSE1
; RET
; D - MASK
; E - PATTERN
; BC - PORT
WAIT_PRT:
IN A,(C)
LD BC,IDE.Read.Status
.loop: IN A,(C)
AND D
CP E
JR NZ,.P2
AND A
RET
;JR NZ,.P2
;AND A
;RET
RET Z
.P2: DEC HL
CALL SKIPKEY
RET C
LD A,L
OR H
JP NZ,WAIT_PRT
JP NZ,.loop
.error: SCF
RET
@ -421,12 +394,28 @@ SKIPKEY:
LD (SKIP),A
SCF
RET
WAITIDE: DW #0000 ;!FIXIT ­¥ ¬¥­ï¥âáï?
WAITSML: DW #0400 ;!FIXIT ­¥ ¬¥­ï¥âáï?
SKIP: DB #FF
IDEDEV: DB #FF
ICHANEL: DB #00
; ENDMODULE
;
;WAITHDD DEC L
; RET NZ
; DEC H
; RET NZ
; DEC E
; RET NZ
; SCF
; RET
; E - Second * 10
;PAUSE LD HL,#0000
;PAUSE1 DEC L
; JR NZ,PAUSE1
; DEC H
; JR NZ,PAUSE1
; DEC E
; JR NZ,PAUSE1
; RET