ATAPI media change ¢த¥ OK

This commit is contained in:
Tolik 2025-02-06 04:12:47 +10:00
parent 0749fd92b5
commit a2022a4c6f
5 changed files with 283 additions and 232 deletions

@ -1 +1 @@
Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a
Subproject commit 237dd36651b4af124f12d3f1eaee3688467f8fa3

View File

@ -524,15 +524,15 @@ TAB_5xFNS:
;-------------------------------------------------------------[ ATA #8 ]
;
DB low FN_RESERVED_5x
DB low HDD_5x_RESET
DB low HDD_5x_LONG_READ
DB low HDD_5x_LONG_WRITE
DB low HDD_5x_VERIFY
DB low HDD_5x_READ
DB low HDD_5x_WRITE
DB low HDD_5x_DETECT
DB low HDD_5x_GET_PAR
DB low HDD_5x_SET_PAR
DB low ATA_5x_RESET
DB low ATA_5x_LONG_READ
DB low ATA_5x_LONG_WRITE
DB low ATA_5x_VERIFY
DB low ATA_5x_READ
DB low ATA_5x_WRITE
DB low ATA_5x_DETECT
DB low ATA_5x_GET_PAR
DB low ATA_5x_SET_PAR
DB low DRV_VERSION
DB low FN_RESERVED_5x
@ -549,21 +549,21 @@ TAB_5xFNS:
;-----------------------------------------------------------[ ATAPI #C ]
;
DB low FN_RESERVED_5x
DB low CD_5x_RESET
DB low CD_5x_LONG_READ
DB low CD_5x_LONG_WRITE ; [ ] new
DB low ATAPI_5x_RESET
DB low ATAPI_5x_LONG_READ
DB low ATAPI_5x_LONG_WRITE ; [ ] new
DB low FN_ABSENT_5x ; VERIFY
DB low CD_5x_READ
DB low CD_5x_WRITE ; [ ] new
DB low CD_5x_DETECT
DB low CD_5x_GET_PAR ; [ ] new
DB low ATAPI_5x_READ
DB low ATAPI_5x_WRITE ; [ ] new
DB low ATAPI_5x_DETECT
DB low ATAPI_5x_GET_PAR ; [ ] new
DB low FN_ABSENT_5x ; SETMED
DB low DRV_VERSION
DB low FN_RESERVED_5x
DB low FN_RESERVED_5x
DB low FN_RESERVED_5x
DB low CD_5x_Extended ;[ ] media changed? ;!TODO
DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO
DB low DRV_LIST
;---------------------------------------------------------------------[]
@ -627,15 +627,15 @@ TAB_5xFNS:
;-------------------------------------------------------------[ ATA #8 ]
;
DB high FN_RESERVED_5x
DB high HDD_5x_RESET
DB high HDD_5x_LONG_READ
DB high HDD_5x_LONG_WRITE
DB high HDD_5x_VERIFY
DB high HDD_5x_READ
DB high HDD_5x_WRITE
DB high HDD_5x_DETECT
DB high HDD_5x_GET_PAR
DB high HDD_5x_SET_PAR
DB high ATA_5x_RESET
DB high ATA_5x_LONG_READ
DB high ATA_5x_LONG_WRITE
DB high ATA_5x_VERIFY
DB high ATA_5x_READ
DB high ATA_5x_WRITE
DB high ATA_5x_DETECT
DB high ATA_5x_GET_PAR
DB high ATA_5x_SET_PAR
DB high DRV_VERSION
DB high FN_RESERVED_5x
@ -652,21 +652,21 @@ TAB_5xFNS:
;-----------------------------------------------------------[ ATAPI #C ]
;
DB high FN_RESERVED_5x
DB high CD_5x_RESET
DB high CD_5x_LONG_READ
DB high CD_5x_LONG_WRITE ; LONG_WRITE ; [ ] new
DB high ATAPI_5x_RESET
DB high ATAPI_5x_LONG_READ
DB high ATAPI_5x_LONG_WRITE ; LONG_WRITE ; [ ] new
DB high FN_ABSENT_5x
DB high CD_5x_READ
DB high CD_5x_WRITE ; WRITE ; [ ] new
DB high CD_5x_DETECT
DB high CD_5x_GET_PAR
DB high ATAPI_5x_READ
DB high ATAPI_5x_WRITE ; WRITE ; [ ] new
DB high ATAPI_5x_DETECT
DB high ATAPI_5x_GET_PAR
DB high FN_ABSENT_5x ; SETMED
DB high DRV_VERSION
DB high FN_RESERVED_5x
DB high FN_RESERVED_5x
DB high FN_RESERVED_5x
DB high CD_5x_Extended
DB high ATAPI_5x_Extended
DB high DRV_LIST
;---------------------------------------------------------------------[]
@ -688,15 +688,15 @@ EXP_FNS_RST18:
EX (SP),HL
RET
; HDD_5x_RESET
; HDD_5x_LONG_READ
; HDD_5x_LONG_WRITE
; HDD_5x_VERIFY
; HDD_5x_READ
; HDD_5x_WRITE
; HDD_5x_DETECT
; HDD_5x_GET_PAR
; HDD_5x_SET_PAR
; ATA_5x_RESET
; ATA_5x_LONG_READ
; ATA_5x_LONG_WRITE
; ATA_5x_VERIFY
; ATA_5x_READ
; ATA_5x_WRITE
; ATA_5x_DETECT
; ATA_5x_GET_PAR
; ATA_5x_SET_PAR
; DRV_VERSION
; FN_RESERVED_5x
; FN_RESERVED_5x
@ -704,34 +704,34 @@ EXP_FNS_RST18:
; FN_RESERVED_5x
; DRV_LIST
FN_5x_Parser_1: ; HDD_5x_RESET
FN_5x_Parser_1: ; ATA_5x_RESET
LD C,#01
JP FN_5x_Parser
FN_5x_Parser_2: ; HDD_5x_LONG_READ
FN_5x_Parser_2: ; ATA_5x_LONG_READ
LD C,#02
JP FN_5x_Parser
FN_5x_Parser_3: ; HDD_5x_LONG_WRITE
FN_5x_Parser_3: ; ATA_5x_LONG_WRITE
LD C,#03
JP FN_5x_Parser
FN_5x_Parser_4: ; HDD_5x_VERIFY
FN_5x_Parser_4: ; ATA_5x_VERIFY
LD C,#04
JP FN_5x_Parser
FN_5x_Parser_6: ; HDD_5x_WRITE
FN_5x_Parser_6: ; ATA_5x_WRITE
LD C,#06
JP FN_5x_Parser
FN_5x_Parser_7: ; HDD_5x_DETECT
FN_5x_Parser_7: ; ATA_5x_DETECT
LD C,#07
JP FN_5x_Parser
FN_5x_Parser_8: ; HDD_5x_GET_PAR
FN_5x_Parser_8: ; ATA_5x_GET_PAR
LD C,#08
JP FN_5x_Parser
FN_5x_Parser_9: ; HDD_5x_SET_PAR
FN_5x_Parser_9: ; ATA_5x_SET_PAR
LD C,#09
JP FN_5x_Parser
FN_5x_Parser_E: ; DRV_EXTENDED
LD C,#0E
JP FN_5x_Parser
FN_5x_Parser_5: ; HDD_5x_READ
FN_5x_Parser_5: ; ATA_5x_READ
LD C,5
FN_5x_Parser:
PUSH HL

View File

@ -23,17 +23,17 @@ MAX_DATA_PACKET_FOR_REQUEST_SENSE EQU 254
;[]================================================================[#51]
;!FIXIT ᤥ« âì ­ áâ®ï騩 à¥á¥â
CD_5x_RESET: LD C,IDE.Device.ATAPI
ATAPI_5x_RESET: LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
LD B,50
.loop: PUSH BC
CALL EXEC_NOP_CMD
CALL EXEC_TEST_CMD
;!FIXIT ;[ ] sector size. ᤥ« âì २­¨â HDD_INIT_TABLE
POP BC
RET NC
;
CALL CD_CHECK_MEDIA_CHANGED.noWait
CALL ATAPI_CHECK_MEDIA_CHANGED.noWait
RET C
;
EI
@ -55,27 +55,31 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
; [ ] A - HDD_INIT_TABLE.MediaParameters
; IF media changed
; [ ] CF' = 1, A' = error number UnitAttention
CD_5x_GET_PAR: LD C,IDE.Device.ATAPI
ATAPI_5x_GET_PAR:
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
;
IN A,(SLOT3)
.DriveSelected: IN A,(SLOT3)
AND A
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
; [ ] sector size. media changed
CALL CD_CHECK_MEDIA_CHANGED
CALL ATAPI_CHECK_MEDIA_CHANGED
JR NC,.get_data
;
CP BIOS.Error.ATAPI.NotReady
;LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
SCF
JR NZ,.UnitAttention
CP BIOS.Error.ATAPI.UnitAttention
JR Z,.UnitAttention
;
;CP BIOS.Error.ATAPI.NotReady
;SCF
;RET NZ
LD HL,#FFFF
LD D,H
LD E,L
SCF
RET
;
.UnitAttention: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media
@ -115,7 +119,7 @@ CD_5x_GET_PAR: LD C,IDE.Device.ATAPI
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S)
CD_5x_READ: EX AF,AF'
ATAPI_5x_READ: EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;[]================================================================[#52]
@ -129,7 +133,7 @@ CD_5x_READ: EX AF,AF'
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;LONG READ SECTOR(S)
CD_5x_LONG_READ:
ATAPI_5x_LONG_READ:
AND A
;
PUSH IY
@ -143,10 +147,10 @@ CD_5x_LONG_READ:
EX AF,AF'
CALL RW_ATAPI_SECTORs
; [ ] sector size. media changed
JP HDD_5x_LONG_READ.shared
; JP NC,HDD_5x_LONG_READ.shared
JP ATA_5x_LONG_READ.shared
; JP NC,ATA_5x_LONG_READ.shared
; CP BIOS.Error.UnitAttention
; JR Z,CD_MEDIA_CHANGED_ERROR
; JR Z,ATAPI_MEDIA_ERROR
; SCF
;[]================================================================[#52]
; INPUT:
@ -226,10 +230,9 @@ RW_ATAPI_SECTORs:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
CD_5x_WRITE:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
ATAPI_5x_WRITE: EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
;[]================================================================[#53]
;Function: Long Write Sectors
; A - Disk
@ -241,7 +244,7 @@ CD_5x_WRITE:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
CD_5x_LONG_WRITE:
ATAPI_5x_LONG_WRITE:
AND A
;
PUSH IY
@ -255,7 +258,7 @@ CD_5x_LONG_WRITE:
EX AF,AF'
CALL RW_ATAPI_SECTORs
;
JP HDD_5x_LONG_READ.shared
JP ATA_5x_LONG_READ.shared
;[]================================================================[#57]
;Function: Detect Disk
@ -263,7 +266,7 @@ CD_5x_LONG_WRITE:
;Return: CF=0 - A=Drive type
; B=MediaParameters byte ; [ ] media change
; CF=1 - drive not present, A=#02
; CD_5x_DETECT: LD C,IDE.Device.ATAPI
; ATAPI_5x_DETECT: LD C,IDE.Device.ATAPI
; AND %1011'1111
; .shared: LD D,A
; LD E,C
@ -295,7 +298,7 @@ CD_5x_LONG_WRITE:
; LD A,D
; LD C,E
; CALL SELECT_DRIVE
; CALL CD_CHECK_MEDIA_CHANGED
; CALL ATAPI_CHECK_MEDIA_CHANGED
; JR NC,.exit
; POP BC
; RET
@ -311,8 +314,9 @@ CD_5x_LONG_WRITE:
;Return: CF=0 - A=Drive type
; B=MediaParameters byte ; [ ] media change
; CF=1 - drive not present, A=#02
CD_5x_DETECT: LD C,IDE.Device.ATAPI
JP HDD_5x_DETECT.shared
ATAPI_5x_DETECT:
LD C,IDE.Device.ATAPI
JP ATA_5x_DETECT.shared
;[]================================================================[#57]
;[]================================================================[#5E]
@ -322,7 +326,7 @@ CD_5x_DETECT: LD C,IDE.Device.ATAPI
; B - SubFunction
;Return:
;
CD_5x_Extended:
ATAPI_5x_Extended:
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
@ -331,7 +335,7 @@ CD_5x_Extended:
CP 2
JR C,TRAY_FN ; B = 0 ¨«¨ 1
;
JR Z,CD_REQUEST_SENSE ; B = 2
JR Z,ATAPI_REQUEST_SENSE ; B = 2
; ...
; ...
;LD A,#AA
@ -342,23 +346,24 @@ CD_5x_Extended:
;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE:
ATAPI_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JR EXEC_PACKET_COMMAND.start
;----------------------------------------------------------------------;
;[ ] media changed
;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED:
CALL EXEC_NOP_CMD ;!FIXIT   ¬®¦¥â ¨ ­¥ ­ ¤®
ATAPI_CHECK_MEDIA_CHANGED:
CALL EXEC_TEST_CMD ;!FIXIT   ¬®¦¥â ¨ ­¥ ­ ¤®
RET C
; .skip_nop: EXX
; CALL CD_WAITPRT
; CALL ATAPI_WAITPRT
; EXX
; LD A, high IDE.Read.Status
; IN A,(low IDE.Read.Status)
; RRA
; ;RET NC
JR C,.noWait
;JR C,.noWait
;
EXX
LD C,SLOT3
@ -375,12 +380,25 @@ CD_CHECK_MEDIA_CHANGED:
RET
;
.noWait: EXX
CALL CD_GET_ERROR
;CALL ATAPI_GET_ERROR
XOR A ;LD BC,IDE.Read.Error
IN A,(IDE.Read.Error) ;IN A,(C)
RRCA
RRCA
RRCA
RRCA
AND #0F
OR #70
EXX
CP BIOS.Error.ATAPI.NoSence
JP Z,CD_MEDIA_CHANGED_ERROR
;SCF
JP Z,ATAPI_MEDIA_ERROR
; !FIXIT ᪮॥ ¢á¥£® ¦¥«¥§® âã⠢뤠á⠢ᥣ¤  Error.ATAPI.NoSence
CP BIOS.Error.ATAPI.NotReady
JP Z,ATAPI_MEDIA_ERROR
CP BIOS.Error.ATAPI.UnitAttention
JP Z,ATAPI_MEDIA_ERROR
;
SCF
RET
;----------------------------------------------------------------------;
@ -420,10 +438,10 @@ EXEC_PACKET_COMMAND:
LD A,BIOS.Error.ATAPI.TimeOut
SCF
RET
; .CMD_ERROR: CALL CD_GET_ERROR
; .CMD_ERROR: CALL ATAPI_GET_ERROR
; OR #70
; CP BIOS.Error.UnitAttention
; CALL Z,CD_MEDIA_CHANGED_ERROR
; CALL Z,ATAPI_MEDIA_ERROR
; ;LD BC,IDE.Read.Error ;ERROR
; ;IN A,(C)
; ;RRCA
@ -435,7 +453,7 @@ EXEC_PACKET_COMMAND:
; RET
;
.start: EXX
CALL CD_WAITPRT
CALL ATAPI_WAITPRT
EXX
JR NC,.READY
;
@ -447,10 +465,9 @@ EXEC_PACKET_COMMAND:
.pause: DJNZ .pause
;
EXX
CALL CD_WAITPRT
CALL ATAPI_WAITPRT
EXX
JR C,.error
;JR C,CD_CHECK_MEDIA_CHANGED.noWait
;
.READY: LD C,SLOT3
IN B,(C)
@ -479,14 +496,13 @@ EXEC_PACKET_COMMAND:
LD BC,IDE.Write.Command
LD A,IDE.ATAPI.Packet
OUT (C),A
CALL CD_WAITPRT
CALL ATAPI_WAITPRT
EXX
JR C,.error
;JR C,CD_CHECK_MEDIA_CHANGED.noWait
;
EXX
LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
CALL CD_WAITPRT.Custom
CALL ATAPI_WAITPRT.Custom
EXX
JR C,.error_TimeOut
;
@ -523,24 +539,22 @@ EXEC_PACKET_COMMAND:
EX AF,AF' ;>-----------> \
;
EXX
CALL CD_WAITPRT
CALL ATAPI_WAITPRT
EXX
JP C,.error
;
; [ ] media change.   ­ ¤® «¨ âãâ? ;!FIXIT «ãçè¥ ¡«®ª¨à®¢ âì ­®á¨â¥«ì
LD A,high IDE.Read.Status
IN A,(low IDE.Read.Status)
;
BIT IDE.CtrlBit.Error,A
JP NZ,CD_CHECK_MEDIA_CHANGED.noWait
;
AND IDE.CtrlByte.DataRequest
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
;
LD A,XH
OUT (SLOT3),A
AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
RRA ; Checking IDE.CtrlByte.CheckCondition
JP C,ATAPI_CHECK_MEDIA_CHANGED.noWait
;
;====== IF DATA REQUEST =======================================;
;
LD A,XH
OUT (SLOT3),A
EX DE,HL
LD BC,IDE.Read.ByteCountLow
IN E,(C)
@ -626,21 +640,21 @@ EXEC_PACKET_COMMAND:
;----------------------------------------------------------------------;
CD_GET_ERROR: LD BC,IDE.Read.Error ;ERROR
IN A,(C)
RRCA
RRCA
RRCA
RRCA
AND #0F
RET
; ATAPI_GET_ERROR: XOR A ;LD BC,IDE.Read.Error
; IN A,(IDE.Read.Error) ;IN A,(C)
; RRCA
; RRCA
; RRCA
; RRCA
; AND #0F
; RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; D - MASK, E - PATTERN
CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
.Custom: LD B,100
LD HL,#0000
.LOOP: LD A,high IDE.Read.Status
@ -663,35 +677,35 @@ CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
;----------------------------------------------------------------------;
; CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP
; ATAPI_TEST: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
; LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
; JP EXEC_PACKET_COMMAND
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
CD_MEDIA_CHANGED_ERROR:
ATAPI_MEDIA_ERROR:
IN A,(SLOT3)
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD DE,SYS_PAGE.SHARED_BUFFER_256b
CALL CD_REQUEST_SENSE
CALL ATAPI_REQUEST_SENSE
;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION
CP 2 ; SenceKey. 02 - NOT READY
JR Z,.Not_Ready
CP 6
JR NZ,.exit
JR NZ,.unkn_error
;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey. #28
CP #28
JR NZ,.exit
JR NZ,.unkn_error
;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier. 0
AND A
JR NZ,.exit
JR NZ,.unkn_error
;
LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
OR %0000'0011
@ -701,6 +715,7 @@ CD_MEDIA_CHANGED_ERROR:
LD DE,SYS_PAGE.TMP_BUFFER
CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF
LD C,BIOS.Error.ATAPI.MediumError
JR C,.No_Media
;
LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high
@ -711,70 +726,73 @@ CD_MEDIA_CHANGED_ERROR:
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L
LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size
;
LD C,BIOS.Error.ATAPI.UnitAttention
.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ] sector size
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
;
POP AF
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
RET
;
.Not_Ready: POP AF
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.NotReady
SCF
RET
;
.exit: POP AF
OUT (SLOT3),A
; CF=0
;AND A
LD A,C
SCF
RET
;
.Not_Ready: LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey
LD C,BIOS.Error.ATAPI.MediumError ; ­¥â ­®á¨â¥«ï
CP 4
JR NZ,.exit
; [ ] !(test for ZIP)
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier
CP 1
JR NZ,.exit
;
; ¨¤ñâ ¨­¨æ¨ «¨§ æ¨ï
LD C,BIOS.Error.ATAPI.NotReady
JR .exit
;
.unkn_error: LD C,BIOS.Error.ATAPI.MediumError
JR .exit
;----------------------------------------------------------------------;
; SELECT_DRIVE ¤®«¦¥­ ®âà ¡®â âì § à ­¥¥
EXEC_NOP_CMD: LD HL,ATAPI_CMD_PACKET.NOP
; !!! SELECT_DRIVE ¤®«¦¥­ ®âà ¡®â âì § à ­¥¥
EXEC_TEST_CMD: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
JP EXEC_PACKET_COMMAND.start
////////////////////////////////////////////////////////////////////////
ATAPI_CMD_PACKET:
.NOP: DUP 12
DB #00
EDUP
.TEST_UNIT_READY: DUP 12
DB #00
EDUP
;
.OPEN: DB #1B
DB #00,#00,#00
DB #02
DB #00,#00,#00,#00,#00,#00,#00
.OPEN: DB #1B
DB #00,#00,#00
DB #02
DB #00,#00,#00,#00,#00,#00,#00
;
.CLOSE: DB #1B
DB #00,#00,#00
DB #03
DB #00,#00,#00,#00,#00,#00,#00
.CLOSE: DB #1B
DB #00,#00,#00
DB #03
DB #00,#00,#00,#00,#00,#00,#00
;
.READ: DB #28,#00
DB #00,#00,#00,#00 ; sector dword
DB #00
DB #00,#01,#00,#00 ; counter dword
DB #00
.READ: DB #28,#00
DB #00,#00,#00,#00 ; sector dword
DB #00
DB #00,#01,#00,#00 ; counter dword
DB #00
;
.WRITE: DB #2E,#00
DB #00,#00,#00,#00 ; sector dword
DB #00
DB #00,#01,#00,#00 ; counter dword
DB #00
.WRITE: DB #2E,#00
DB #00,#00,#00,#00 ; sector dword
DB #00
DB #00,#01,#00,#00 ; counter dword
DB #00
;
.READ_CAPACITY_DATA:
DB #25
BLOCK 11,0
.READ_CAPACITY_DATA: DB #25
BLOCK 11,0
;
.REQUEST_SENSE:
DB #03
DB #00,#00,#00
DB MAX_DATA_PACKET_FOR_REQUEST_SENSE
DB #00,#00,#00,#00,#00,#00,#00
.REQUEST_SENSE: DB #03
DB #00,#00,#00
DB MAX_DATA_PACKET_FOR_REQUEST_SENSE
DB #00,#00,#00,#00,#00,#00,#00
;
ATAPI_PACKET:

View File

@ -78,7 +78,7 @@ WRITE_OUTI_DUPs EQU 32 ; bytes
;[]================================================================[#51]
;Function: Reset drive
HDD_5x_RESET: ; !FIXIT ­¥ à¥á¥â¨âáï?
ATA_5x_RESET: ; !FIXIT ­¥ à¥á¥â¨âáï?
;For non-ATAPI drives, the only method a driver has of resetting a drive
; after a major error is to do a "software reset" on the bus.
; Set bit 2 (SRST, value = 4) in the proper Control Register for the
@ -99,7 +99,7 @@ HDD_5x_RESET: ; !FIXIT
; DE - Cylinders
; IX - Capacity sector in bytes
; B - Flags: MASTER/SLAVE, LBA/CHS
HDD_5x_GET_PAR:
ATA_5x_GET_PAR:
LD C,IDE.Device.HDD
CALL SELECT_DRIVE
RET C
@ -129,7 +129,7 @@ HDD_5x_GET_PAR:
; IX - Capacity sector in bytes
; B - Flags
;Return: None
HDD_5x_SET_PAR:
ATA_5x_SET_PAR:
LD C,IDE.Device.HDD
CALL SELECT_DRIVE
RET C
@ -161,7 +161,7 @@ HDD_5x_SET_PAR:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S)
HDD_5x_READ:
ATA_5x_READ:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
@ -177,7 +177,7 @@ HDD_5x_READ:
; DE - Address + (Sector counter * Size sector)
; A' - Last mem page in RAM Block used for readed data
;LONG READ SECTOR(S)
HDD_5x_LONG_READ:
ATA_5x_LONG_READ:
PUSH IY
SAFE_PORTY_2
PUSH BC
@ -245,7 +245,7 @@ HDD_5x_LONG_READ:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
HDD_5x_WRITE:
ATA_5x_WRITE:
EX AF,AF'
IN A,(SLOT3)
EX AF,AF'
@ -260,7 +260,7 @@ HDD_5x_WRITE:
; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S)
HDD_5x_LONG_WRITE:
ATA_5x_LONG_WRITE:
PUSH IY
SAFE_PORTY_2
PUSH BC
@ -272,7 +272,7 @@ HDD_5x_LONG_WRITE:
EX AF,AF'
CALL RW_ATA_SECTORs
;
JP HDD_5x_LONG_READ.shared
JP ATA_5x_LONG_READ.shared
/*
EX DE,HL
JP C,.error
@ -525,7 +525,7 @@ WRITE_ATA_SECTORs:
; B - Sector counter
;Return: None
;VERIFY SECTOR(S)
HDD_5x_VERIFY: PUSH IY
ATA_5x_VERIFY: PUSH IY
SAFE_PORTY_2
PUSH IX
PUSH HL
@ -671,11 +671,12 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE
;[]================================================================[#57]
;[x] 18/12/2023. ¤®¡ ¢«¥­¨¥/¤®¯¨«¨¢ ­¨¥ API CD-ROM (ATAPI)
; [ ] media change
;Function: Detect Disk
; A - Disk
;Return: CF=0 - A=Drive type
; CF=1 - drive not present, A=#02
HDD_5x_DETECT: LD C,IDE.Device.HDD
; CF=1 - error
ATA_5x_DETECT: LD C,IDE.Device.HDD
.shared: CALL SELECT_DRIVE
RET C
;
@ -691,13 +692,13 @@ HDD_5x_DETECT: LD C,IDE.Device.HDD
LD A,C
CP IDE.Device.ATAPI
JR Z,.AtapiCheckMedia
;!FIXIT AtaCheckMedia - ­¥ ᤥ« ­®
;!FIXIT AtaCheckMedia - ­¥ ᤥ« ­® ; [ ] media change
AND A
RET
;
.AtapiCheckMedia:
PUSH BC ; B - MediaParameters, C - DriveType
CALL CD_CHECK_MEDIA_CHANGED
CALL ATAPI_CHECK_MEDIA_CHANGED
POP BC ; B - MediaParameters, C - DriveType
RET C
LD A,C

View File

@ -103,29 +103,29 @@ WAIT:
.ERROR EQU #0400
ENDMODULE
WAIT_IDE EQU #0000
WAIT_SML EQU #1000
WAIT_ERROR EQU #0400
; WAIT_IDE EQU #0000
; WAIT_SML EQU #1000
; WAIT_ERROR EQU #0400
M_CYLL EQU #12
M_CYLH EQU #13
M_HEAD EQU #14
M_SECT EQU #15
; M_CYLL EQU #12
; M_CYLH EQU #13
; M_HEAD EQU #14
; M_SECT EQU #15
S_CYLL EQU #16
S_CYLH EQU #17
S_HEAD EQU #18
S_SECT EQU #19
; S_CYLL EQU #16
; S_CYLH EQU #17
; S_HEAD EQU #18
; S_SECT EQU #19
SM_CYLL EQU #37
SM_CYLH EQU #38
SM_HEAD EQU #39
SM_SECT EQU #3A
; SM_CYLL EQU #37
; SM_CYLH EQU #38
; SM_HEAD EQU #39
; SM_SECT EQU #3A
SS_CYLL EQU #3B
SS_CYLH EQU #3C
SS_HEAD EQU #3D
SS_SECT EQU #3E
; SS_CYLL EQU #3B
; SS_CYLH EQU #3C
; SS_HEAD EQU #3D
; SS_SECT EQU #3E
MACRO PAUSE_DJNZ num
IF num<255
@ -318,19 +318,19 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
/////////////////////////////////////////////////////////////////////[v]
SETUP_FROM_CMOS:
LD A,H
LD IX,PRIM_MASTER_CMOS_T
LD IX,PRIM_MASTER_CMOS_TABLE
OR A
JR Z,.step1
;
LD IX,PRIM_SLAVE_CMOS_T
LD IX,PRIM_SLAVE_CMOS_TABLE
CP 1
JR Z,.step1
;
LD IX,SEC_MASTER_CMOS_T
LD IX,SEC_MASTER_CMOS_TABLE
CP 2
JR Z,.step1
;
LD IX,SEC_SLAVE_CMOS_T
LD IX,SEC_SLAVE_CMOS_TABLE
.step1: LD HL,IDENTIFY_DEVICE_BUFFER
LD DE,IDENTIFY_DEVICE_BUFFER+1
LD BC,511
@ -344,21 +344,21 @@ SETUP_FROM_CMOS:
CALL BITS_WAITS.Clear_BUSY
JR C,AUTODETECTING.IDE_ABSENT
;
.step2: LD A,(IX+2) ;M_HEAD
.step2: LD A,(IX + IDE_CMOS_TABLE.Heads)
CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A
;
LD A,(IX+1) ;M_CYLH
LD A,(IX + IDE_CMOS_TABLE.CylindersHigh)
CALL READCMS
PUSH AF
;
LD A,(IX+0) ;M_CYLL
LD A,(IX + IDE_CMOS_TABLE.CylindersLow)
CALL READCMS
POP HL
LD L,A
LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL
;
LD A,(IX+3) ;M_SECT
LD A,(IX + IDE_CMOS_TABLE.Sectors)
CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A
;
@ -445,14 +445,30 @@ IDESPEC: IN A,(SLOT3)
OR (HL)
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
; ­  ¢á直© á«ãç ©
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001
;!FIXIT ᤥ« âì æ¨ª« á® áçñâ稪®¬
.get_error_loop: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
CALL EXEC_PACKET_COMMAND.start
JR NC,.s_size
;
CP BIOS.Error.ATAPI.NotReady
JR Z,.get_error_loop
;
RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media
CP BIOS.Error.ATAPI.UnitAttention
JR Z,IDESPEC.END
; «î¡ ï ­¥¯®­ïâ­ ï ®è¨¡ª  - ­¥â ­®á¨â¥«ï
SCF
JR .set_sector
;
; LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
; LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
; CALL EXEC_PACKET_COMMAND.start
; [ ] sector size ATAPI
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
.s_size: LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF
.set_sector: LD HL,#FFFF
JR C,.No_Media
;
LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224) ; media size high
@ -465,7 +481,7 @@ IDESPEC: IN A,(SLOT3)
;
.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable
;LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable
;
JR IDESPEC.END
/////////////////////////////////////////////////////////////////////[^]
@ -624,37 +640,37 @@ SaveToCMOS:
EX AF,AF'
;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
AND %0001'0001
LD IX,PRIM_MASTER_CMOS_T
LD IX,PRIM_MASTER_CMOS_TABLE
JR Z,.save_to_cmos
;
DEC A
LD IX,SEC_MASTER_CMOS_T
LD IX,SEC_MASTER_CMOS_TABLE
JR Z,.save_to_cmos
;
CP %0001'0000
LD IX,SEC_SLAVE_CMOS_T
LD IX,SEC_SLAVE_CMOS_TABLE
JR Z,.save_to_cmos
;
LD IX,PRIM_SLAVE_CMOS_T
LD IX,PRIM_SLAVE_CMOS_TABLE
.save_to_cmos:
LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders)
LD B,L
LD A,(IX+0)
CALL WRITCMS ; Cylinder low
LD A,(IX + IDE_CMOS_TABLE.CylindersLow)
CALL WRITCMS
LD B,H
LD A,(IX+1)
CALL WRITCMS ; Cylinder high
LD A,(IX + IDE_CMOS_TABLE.CylindersHigh)
CALL WRITCMS
LD A,(IDENTIFY_DEVICE_BUFFER.NumHeads)
LD B,A
LD A,(IX+2)
LD A,(IX + IDE_CMOS_TABLE.Heads)
CALL WRITCMS ; Heads
LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack)
LD B,A
LD A,(IX+3)
JP WRITCMS ; Heads
LD A,(IX + IDE_CMOS_TABLE.Sectors)
JP WRITCMS
/////////////////////////////////////////////////////////////////////[^]
@ -900,16 +916,32 @@ SetUP_CHANELS:
; JP IDE_CMD
/////////////////////////////////////////////////////////////////////[^]
;!FIXIT CMOS ¯¥à¥¤¥« âì ¯®¤ ­ §¢ ­¨ï ï祥ª ¨§ SP2000.inc
PRIM_MASTER_CMOS_T:
DB M_CYLL,M_CYLH,M_HEAD,M_SECT
PRIM_SLAVE_CMOS_T:
DB S_CYLL,S_CYLH,S_HEAD,S_SECT
SEC_MASTER_CMOS_T:
DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT
SEC_SLAVE_CMOS_T:
DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT
IDE_CMOS_TABLE:
.CylindersLow EQU 0
.CylindersHigh EQU 1
.Heads EQU 2
.Sectors EQU 3
;
PRIM_MASTER_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.PriMaster.CylindersLow
DB CMOS_CELL.IDE_Setup.PriMaster.CylindersHigh
DB CMOS_CELL.IDE_Setup.PriMaster.Heads
DB CMOS_CELL.IDE_Setup.PriMaster.Sectros
PRIM_SLAVE_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.PriSlave.CylindersLow
DB CMOS_CELL.IDE_Setup.PriSlave.CylindersHigh
DB CMOS_CELL.IDE_Setup.PriSlave.Heads
DB CMOS_CELL.IDE_Setup.PriSlave.Sectros
SEC_MASTER_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.SecMaster.CylindersLow
DB CMOS_CELL.IDE_Setup.SecMaster.CylindersHigh
DB CMOS_CELL.IDE_Setup.SecMaster.Heads
DB CMOS_CELL.IDE_Setup.SecMaster.Sectros
SEC_SLAVE_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.SecSlave.CylindersLow
DB CMOS_CELL.IDE_Setup.SecSlave.CylindersHigh
DB CMOS_CELL.IDE_Setup.SecSlave.Heads
DB CMOS_CELL.IDE_Setup.SecSlave.Sectros
SKIP: BYTE #FF