тестирование задержек для 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 ; 02-08-2001 DNS Initial this module
;--------------------------------------------------------------- ;---------------------------------------------------------------
;======================================================== ;========================================================
;!FIXIT SIZESEC EQU #0800
R170 EQU #0050 ;Data PKTSIZE EQU 12
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
RAM_ATAPI_PK EQU #FEE0 RAM_ATAPI_PK EQU #FEE0
RAM_ATAPI_READ EQU #FEF0 RAM_ATAPI_READ EQU #FEF0
;BSY EQU 7
;DRQ EQU 3
;ERR EQU 0
;[]===========================================================[] ;[]===========================================================[]
CD_5x.RESET: CD_5x.RESET:
LD B,50 LD B,50
@ -71,11 +49,6 @@ CD.CLOSE:
JP CD_CLOSE JP CD_CLOSE
;[]===========================================================[] ;[]===========================================================[]
SIZESEC EQU #0800
PKTSIZE EQU 12
CD_TEST LD HL,CMDNOPP CD_TEST LD HL,CMDNOPP
LD DE,0 LD DE,0
CALL AP_COM CALL AP_COM
@ -147,27 +120,28 @@ CD_READ:
; 07h - DATA PROTECT ; 07h - DATA PROTECT
; 0Bh - ABORTED COMMAND ; 0Bh - ABORTED COMMAND
; 80h - TIME OUT ; 80h - TIME OUT
AP_COM: AND #01
AP_COM AND #01
LD A,#A0 LD A,#A0
JR Z,.APCOM1 JR Z,.APCOM1
LD A,#B0 LD A,#B0
.APCOM1 LD BC,W176 .APCOM1 LD BC,IDE.Write.DriveCtrl
OUT (C),A ;SELECT DRIVE OUT (C),A ;SELECT DRIVE
EXX EXX
LD DE,#8000 LD DE,#8000
LD BC,R177 ;LD BC,IDE.Read.Status
CALL CWAITPRT CALL CWAITPRT
EXX EXX
JR NC,.CDREADY JR NC,.CDREADY
LD BC,W177 LD BC,IDE.Write.Command
LD A,#08 LD A,#08
OUT (C),A OUT (C),A
LD B,#00 LD B,#00
DJNZ $ .pause: DJNZ .pause
EXX EXX
LD DE,#8000 LD DE,#8000
LD BC,R177 ;LD BC,IDE.Read.Status
CALL CWAITPRT CALL CWAITPRT
EXX EXX
RET C RET C
@ -193,24 +167,24 @@ AP_COM AND #01
EXX EXX
OUT (C),A OUT (C),A
XOR A XOR A
LD BC,W171 LD BC,IDE.Write.Error
OUT (C),A OUT (C),A
LD DE,SIZESEC ;SIZE BLOCK LD DE,SIZESEC ;SIZE BLOCK
LD BC,W174 LD BC,IDE.Write.CylinderLow
OUT (C),E OUT (C),E
LD BC,W175 LD BC,IDE.Write.CylinderHigh
OUT (C),D OUT (C),D
LD BC,W177 LD BC,IDE.Write.Command
LD A,#A0 LD A,#A0
OUT (C),A OUT (C),A
LD DE,#8000 LD DE,#8000
LD BC,R177 ;LD BC,IDE.Read.Status
CALL CWAITPRT CALL CWAITPRT
EXX EXX
RET C RET C
EXX EXX
LD DE,#0908 LD DE,#0908
LD BC,R177 ;LD BC,IDE.Read.Status
CALL CWAITPRT CALL CWAITPRT
EXX EXX
BIT IDE.ControlBit.Error,A BIT IDE.ControlBit.Error,A
@ -225,7 +199,7 @@ AP_COM AND #01
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD HL,RAM_ATAPI_PK LD HL,RAM_ATAPI_PK
LD BC,W170 LD BC,IDE.Write.Data
LD A,PKTSIZE LD A,PKTSIZE
SRL A SRL A
.OUTPKT: .OUTPKT:
@ -240,16 +214,16 @@ AP_COM AND #01
.AP_LOOP: .AP_LOOP:
EXX EXX
LD DE,#8000 LD DE,#8000
LD BC,R177 ;LD BC,IDE.Read.Status
CALL CWAITPRT CALL CWAITPRT
EXX EXX
RET C RET C
LD BC,R177 LD BC,IDE.Read.Status
IN A,(C) IN A,(C)
BIT IDE.ControlBit.Error,A BIT IDE.ControlBit.Error,A
JR Z,.NO_ERR JR Z,.NO_ERR
.CDERROR: .CDERROR:
LD BC,R171 ;ERROR LD BC,IDE.Read.Error ;ERROR
IN A,(C) IN A,(C)
RRCA RRCA
RRCA RRCA
@ -263,20 +237,20 @@ AP_COM AND #01
LD A,0 LD A,0
RET Z ;NO DATA REQUEST RET Z ;NO DATA REQUEST
EX DE,HL EX DE,HL
LD BC,R174 LD BC,IDE.Read.CylinderLow
IN E,(C) IN E,(C)
LD BC,R175 LD BC,IDE.Read.CylinderHigh
IN D,(C) ;TRANSFER BLOCK SIZE IN D,(C) ;TRANSFER BLOCK SIZE
LD A,D LD A,D
OR E OR E
RET Z ;BLOCK = 0 RET Z ;BLOCK = 0
LD BC,R172 LD BC,IDE.Read.Counter
IN A,(C) IN A,(C)
AND #02 AND #02
CP #02 CP #02
JP Z,.FROM_CD JP Z,.FROM_CD
;.TO_CD: ;.TO_CD:
LD BC,R170 LD BC,IDE.Read.Data
.WR_T_CD: .WR_T_CD:
OUTI OUTI
OUTI OUTI
@ -291,7 +265,7 @@ AP_COM AND #01
LD A,H LD A,H
OR L OR L
JR Z,.NULL JR Z,.NULL
LD BC,R170 LD BC,IDE.Read.Data
.RD_F_CD: .RD_F_CD:
INI INI
INI INI
@ -302,7 +276,7 @@ AP_COM AND #01
JR NZ,.RD_F_CD JR NZ,.RD_F_CD
EX DE,HL EX DE,HL
JR .AP_LOOP JR .AP_LOOP
.NULL: LD BC,R170 .NULL: LD BC,IDE.Read.Data
.RD_N_CD: .RD_N_CD:
IN A,(C) IN A,(C)
DEC B DEC B
@ -331,8 +305,9 @@ AP_COM AND #01
; D - MASK ; D - MASK
; E - PATTERN ; E - PATTERN
; BC - PORT //; BC - PORT
CWAITPRT: CWAITPRT:
LD BC,IDE.Read.Status
LD A,100 LD A,100
LD HL,#0000 LD HL,#0000
.CWAITPX: .CWAITPX:

View File

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

View File

@ -85,13 +85,17 @@ IDE3 EQU #C1D8
; DB #FF ;SECTOR PER CYLINDER HIGH ;06 ; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;DEVICE TYPE ;07 ; DB #FF ;DEVICE TYPE ;07
WAIT_IDE EQU #0000
WAIT_SML EQU #1000
WAIT_ERROR EQU #0400
IDE__CD: IDE__CD:
CALL SELECT_IDE CALL SELECT_IDE
;MASTER ;MASTER
CDAUTO: CDAUTO:
LD A,IDE.Device.CDROM LD A,IDE.Device.CDROM
LD (IDEDEV),A LD (IDEDEV),A
LD A,#FF LD A,#FF ;!FIXIT ¬®¦­® ®¯â¨¬¨§¨à®¢ âì
JP CDMASTR JP CDMASTR
SELECT_IDE: SELECT_IDE:
@ -130,17 +134,13 @@ CDMASTR:
LD (SKIP),A LD (SKIP),A
LD BC,IDE.Write.DriveCtrl LD BC,IDE.Write.DriveCtrl
OUT (C),D OUT (C),D
IF IDE_Optimization
DEC B DEC B
INC C INC C ; LD BC,IDE.Read.Status
ELSE
LD BC,IDE.Read.Status
ENDIF
IN A,(C) IN A,(C)
AND #80 AND #80
LD HL,280 LD HL,280
JR Z,NO_BUSY JR Z,NO_BUSY
LD HL,1550 LD HL,1550 ; § ¤¥à¦ª  - 31 ᥪ㭤 
EI EI
CLRBUSY: CLRBUSY:
HALT HALT
@ -150,7 +150,7 @@ CLRBUSY:
JP Z,ABSENT JP Z,ABSENT
CALL SKIPKEY CALL SKIPKEY
JP C,ABSENT JP C,ABSENT
LD BC,IDE.Read.Status LD BC,IDE.Read.Status ;!FIXIT ¬®¦­® § ª®¬¬¥­â¨à®¢ âì?
IN A,(C) IN A,(C)
AND #80 AND #80
JR NZ,CLRBUSY JR NZ,CLRBUSY
@ -165,25 +165,31 @@ NO_BUSY:
DEC C DEC C
JR NZ,.pause JR NZ,.pause
IF IDE_Optimization LD C,IDE.Read.Counter ; LD BC,IDE.Read.Counter
LD C,IDE.Read.Counter
ELSE
LD BC,IDE.Read.Counter
ENDIF
IN A,(C) IN A,(C)
CP E CP E
JP NZ,ABSENT JP NZ,ABSENT
;!FIXIT CD-ROM Autodetect error!
LD A,(IDEDEV) LD A,(IDEDEV)
CP IDE.Device.CDROM ;!TODO
JP Z,NOHDD ; 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 E,ATA_NOP
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
OUT (C),E OUT (C),E
IF IDE_Optimization DEC B ; LD BC, IDE.Read.Status
DEC B
ENDIF
WXREADY: WXREADY:
HALT HALT
DEC HL DEC HL
@ -192,9 +198,7 @@ WXREADY:
JP Z,ABSENT JP Z,ABSENT
CALL SKIPKEY CALL SKIPKEY
JP C,ABSENT JP C,ABSENT
IFN IDE_Optimization ;LD BC,IDE.Read.Status
LD BC,IDE.Read.Status
ENDIF
IN A,(C) IN A,(C)
AND #C0 AND #C0
CP #40 CP #40
@ -212,20 +216,15 @@ WXREADY:
LD B,0 LD B,0
.pause: DJNZ .pause .pause: DJNZ .pause
LD HL,(WAITSML) LD HL,WAIT_SML
LD DE,#0101 LD DE,#0101
IF IDE_Optimization
LD B,high IDE.Read.Status
ELSE
LD BC,IDE.Read.Status
ENDIF
CALL WAIT_PRT CALL WAIT_PRT
JP NC,NOHDD JP NC,NOHDD
GETPARM: GETPARM:
LD HL,(WAITIDE) LD HL,WAIT_IDE
LD DE,#0808 LD DE,#0808
LD BC,IDE.Read.Status ;LD BC,IDE.Read.Status
CALL WAIT_PRT CALL WAIT_PRT
JP C,ABSENT JP C,ABSENT
LD BC,IDE.Read.Data LD BC,IDE.Read.Data
@ -245,13 +244,9 @@ NOHDD: LD A,IDE.Device.CDROM
LD B,0 LD B,0
.pause: DJNZ .pause .pause: DJNZ .pause
LD HL,(WAITSML) ;LD HL,WAIT_SML
LD HL,WAIT_ERROR
LD DE,#0101 LD DE,#0101
IF IDE_Optimization
LD B,high IDE.Read.Status
ELSE
LD BC,IDE.Read.Status
ENDIF
CALL WAIT_PRT CALL WAIT_PRT
JP C,GETPARM JP C,GETPARM
ABSENT: ABSENT:
@ -329,21 +324,17 @@ FOR_CDR:
IDE_CMD: IDE_CMD:
PUSH AF PUSH AF
LD HL,(WAITIDE) LD HL,WAIT_IDE
LD DE,#C040 LD DE,#C040
LD BC,IDE.Read.Status ;LD BC,IDE.Read.Status
CALL WAIT_PRT CALL WAIT_PRT
POP DE POP DE
RET C RET C
IF IDE_Optimization INC B ; LD BC,IDE.Write.Command
INC B
ELSE
LD BC,IDE.Write.Command
ENDIF
OUT (C),D OUT (C),D
LD HL,(WAITIDE) LD HL,WAIT_IDE
LD DE,#C040 LD DE,#C040
LD BC,IDE.Read.Status ;LD BC,IDE.Read.Status
JP WAIT_PRT JP WAIT_PRT
WAITHDD: WAITHDD:
@ -363,42 +354,24 @@ WTREADY:
SCF SCF
RET 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 ; D - MASK
; E - PATTERN ; E - PATTERN
; BC - PORT ; BC - PORT
WAIT_PRT: WAIT_PRT:
IN A,(C) LD BC,IDE.Read.Status
.loop: IN A,(C)
AND D AND D
CP E CP E
JR NZ,.P2 ;JR NZ,.P2
AND A ;AND A
RET ;RET
RET Z
.P2: DEC HL .P2: DEC HL
CALL SKIPKEY CALL SKIPKEY
RET C RET C
LD A,L LD A,L
OR H OR H
JP NZ,WAIT_PRT JP NZ,.loop
.error: SCF .error: SCF
RET RET
@ -421,12 +394,28 @@ SKIPKEY:
LD (SKIP),A LD (SKIP),A
SCF SCF
RET RET
WAITIDE: DW #0000 ;!FIXIT ­¥ ¬¥­ï¥âáï?
WAITSML: DW #0400 ;!FIXIT ­¥ ¬¥­ï¥âáï?
SKIP: DB #FF SKIP: DB #FF
IDEDEV: DB #FF IDEDEV: DB #FF
ICHANEL: DB #00 ICHANEL: DB #00
; ENDMODULE ; 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