промежуточные правки ATAPI media changed

This commit is contained in:
Tolik 2025-01-11 20:41:41 +10:00
parent 5c47eb30d6
commit d25dacb942
3 changed files with 132 additions and 88 deletions

@ -1 +1 @@
Subproject commit 7ef1dd98b491068d5a9ded34f5ff51430b7fa7e7 Subproject commit d21dd0c0291e48f53d40b7bd09fcb8e7756dda1e

View File

@ -17,6 +17,7 @@ MAX_ATAPI_SEC_SIZE EQU 4096/2
PACKET_SIZE EQU 12 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE PACKET_SIZE EQU 12 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16 RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16
MAX_DATA_PACKET_FOR_REQUEST_SENSE EQU 254
ASSERT ((PACKET_SIZE % 4) = 0), "PACKET_SIZE must be an even number" ASSERT ((PACKET_SIZE % 4) = 0), "PACKET_SIZE must be an even number"
@ -47,29 +48,56 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
; DE - Cylinders ; DE - Cylinders
; IX - Capacity sector in bytes ; IX - Capacity sector in bytes
; B - Flags: MASTER/SLAVE, LBA/CHS ; B - Flags: MASTER/SLAVE, LBA/CHS
CD_5x_GETMED: CD_5x_GETMED: LD C,IDE.Device.ATAPI
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
; [ ] sector size. media changed ; [ ] sector size. media changed
CALL CD_CHECK_MEDIA_CHANGED
JR NC,.get_data
;
CP BIOS.Error.ATAPI.UnitAttention
JR NZ,.get_data
;
; ;
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD HL,0 ;
LD D,H ; [ ] sector size. media changed
LD L,H CALL CD_CHECK_MEDIA_CHANGED
JR NC,.get_data
;
CP BIOS.Error.ATAPI.UnitAttention
JR NZ,.get_data
;
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,SYS_PAGE.TMP_BUFFER
CALL EXEC_PACKET_COMMAND
LD HL,#FFFF
JR C,.No_Media
;
LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size (high byte, low byte)
;
.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ]sector size
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L ;[ ]sector size
;
.get_data: ;
; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
; LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
; LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) ; LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow)
; LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh) ; LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh)
LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD A,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ]sector size LD L,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ]sector size
LD XL,A LD H,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ]sector size
LD A,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ]sector size EX DE,HL
LD XH,A LD XL,E
LD XH,D
;
LD HL,0
LD D,H
LD E,H
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
;AND A ;AND A
@ -115,9 +143,7 @@ CD_5x_LONG_READ:
EX AF,AF' EX AF,AF'
AND A ;read AND A ;read
EX AF,AF' EX AF,AF'
ld CALL RW_ATAPI_SECTORs
; ¯à®¢¥à¨âì .RemovableMedia bit, ¥á«¨ ãáâ ­®¢«¥­, â® ¯à®¯ã᪠RW_ATAPI_SECTORs
CALL NC,RW_ATAPI_SECTORs
; [ ] sector size. media changed ; [ ] sector size. media changed
JP HDD_5x_LONG_READ.shared JP HDD_5x_LONG_READ.shared
; JP NC,HDD_5x_LONG_READ.shared ; JP NC,HDD_5x_LONG_READ.shared
@ -146,6 +172,11 @@ RW_ATAPI_SECTORs:
PUSH BC PUSH BC
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (C),A OUT (C),A
; [ ] media change
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
AND %0000'0010
JR NZ,.error_media
;
LD HL,ATAPI_CMD_PACKET.READ LD HL,ATAPI_CMD_PACKET.READ
EX AF,AF' EX AF,AF'
JR NC,.read_cmd JR NC,.read_cmd
@ -175,10 +206,16 @@ RW_ATAPI_SECTORs:
LD HL,RAM_ATAPI_RW_CMD LD HL,RAM_ATAPI_RW_CMD
CALL EXEC_PACKET_COMMAND CALL EXEC_PACKET_COMMAND
; ;
POP BC .exit: POP BC
;LD C,SLOT3 ;LD C,SLOT3
OUT (C),B OUT (C),B
RET RET
;
.error_media: EXX
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
JR .exit
;[]===========================================================[#52, #55] ;[]===========================================================[#52, #55]
;[]================================================================[#56] ;[]================================================================[#56]
@ -218,10 +255,7 @@ CD_5x_LONG_WRITE:
EX AF,AF' EX AF,AF'
SCF ;write SCF ;write
EX AF,AF' EX AF,AF'
; CALL RW_ATAPI_SECTORs
ld
; ¯à®¢¥à¨âì .RemovableMedia bit, ¥á«¨ ãáâ ­®¢«¥­, â® ¯à®¯ã᪠RW_ATAPI_SECTORs
CALL NC,RW_ATAPI_SECTORs
; ;
JP HDD_5x_LONG_READ.shared JP HDD_5x_LONG_READ.shared
@ -238,6 +272,7 @@ CD_5x_DETECT:
;[]================================================================[#5E] ;[]================================================================[#5E]
; [ ]
;Function: Extended ;Function: Extended
; A - Disk ; A - Disk
; B - SubFunction ; B - SubFunction
@ -250,7 +285,9 @@ CD_5x_Extended:
; ;
LD A,B LD A,B
CP 2 CP 2
JR C,TRAY_FN JR C,TRAY_FN ; B = 0 ¨«¨ 1
;
JR Z,CD_REQUEST_SENSE ; B = 2
; ... ; ...
; ... ; ...
;LD A,#AA ;LD A,#AA
@ -259,6 +296,34 @@ CD_5x_Extended:
RET RET
;[]================================================================[#5E] ;[]================================================================[#5E]
;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JR EXEC_PACKET_COMMAND
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED:
EXX
LD DE,256*(IDE.CtrlByte.Error) + 0
CALL CD_WAITPRT.Custom
EXX
RET NC
;
.noWait: EXX
CALL CD_GET_ERROR
OR #70
EXX
CP BIOS.Error.ATAPI.NoSence
SCF
RET NZ
;
CALL CD_MEDIA_CHANGED_ERROR
; CF=1
LD A,BIOS.Error.ATAPI.UnitAttention
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
@ -266,9 +331,8 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
DEC A DEC A
JR Z,EXEC_PACKET_COMMAND JR Z,EXEC_PACKET_COMMAND
LD HL,ATAPI_CMD_PACKET.OPEN LD HL,ATAPI_CMD_PACKET.OPEN
JR EXEC_PACKET_COMMAND ;JR EXEC_PACKET_COMMAND
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; INPUT: HL - AP packet (12bytes) ; INPUT: HL - AP packet (12bytes)
; DE - address for/with data if needed ; DE - address for/with data if needed
@ -312,10 +376,7 @@ EXEC_PACKET_COMMAND:
;RET C ;RET C
JR C,CD_CHECK_MEDIA_CHANGED.noWait JR C,CD_CHECK_MEDIA_CHANGED.noWait
; ;
.READY: CALL CD_CHECK_MEDIA_CHANGED .READY: LD C,SLOT3
RET C
;
LD C,SLOT3
IN B,(C) IN B,(C)
PUSH DE PUSH DE
PUSH BC PUSH BC
@ -356,7 +417,7 @@ EXEC_PACKET_COMMAND:
BIT IDE.CtrlBit.Error,A BIT IDE.CtrlBit.Error,A
JR NZ,CD_CHECK_MEDIA_CHANGED.noWait JR NZ,CD_CHECK_MEDIA_CHANGED.noWait
JR NC,.YEP_DRQ JR NC,.YEP_DRQ
LD A,BIOS.Error.TimeOut ;!FIXIT media change test LD A,BIOS.Error.ATAPI.TimeOut ;!FIXIT media change test
RET RET
; ;
; .CMD_ERROR: CALL CD_GET_ERROR ; .CMD_ERROR: CALL CD_GET_ERROR
@ -412,7 +473,7 @@ EXEC_PACKET_COMMAND:
LD BC,IDE.Read.Status LD BC,IDE.Read.Status
IN A,(C) IN A,(C)
BIT IDE.CtrlBit.Error,A BIT IDE.CtrlBit.Error,A
JR NZ,CD_CHECK_MEDIA_CHANGED.noWait JP NZ,CD_CHECK_MEDIA_CHANGED.noWait
; ;
AND IDE.CtrlByte.DataRequest AND IDE.CtrlByte.DataRequest
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
@ -539,54 +600,41 @@ CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP
JP EXEC_PACKET_COMMAND JP EXEC_PACKET_COMMAND
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JP EXEC_PACKET_COMMAND
ld
;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_MEDIA_CHANGED_ERROR: CD_MEDIA_CHANGED_ERROR:
PUSH AF PUSH AF
;
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF PUSH AF
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
; ;
LD A,%0000'0011 LD DE,SYS_PAGE.SHARED_BUFFER_256b
LD (IY + HDD_INIT_TABLE.RemovableMedia),A CALL CD_REQUEST_SENSE
; ;
EX AF,AF LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06
CP 6
JR NZ,.exit
;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey. #28
CP #28
JR NZ,.exit
;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier. 0
AND A
JR NZ,.exit
;
LD A,%0000'0011
LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A
;
.exit: POP AF
OUT (SLOT3),A OUT (SLOT3),A
POP AF POP AF
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED:
EXX
LD DE,256*(IDE.CtrlByte.Error) + 0
CALL CD_WAITPRT.Custom
EXX
RET NC
;
.noWait: EXX
CALL CD_GET_ERROR
OR #70
EXX
CP BIOS.Error.UnitAttention
SCF
RET NZ
;
CALL CD_MEDIA_CHANGED_ERROR
; CF=1
LD A,BIOS.Error.UnitAttention
RET
;----------------------------------------------------------------------;
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
ATAPI_CMD_PACKET: ATAPI_CMD_PACKET:

View File

@ -440,7 +440,6 @@ IDESPEC: IN A,(SLOT3)
OR (HL) OR (HL)
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
; ;
ld
; [ ] sector size ATAPI ; [ ] sector size ATAPI
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à ­  8 ¡ ©â®¢ LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à ­  8 ¡ ©â®¢
@ -448,12 +447,9 @@ IDESPEC: IN A,(SLOT3)
LD HL,#FFFF LD HL,#FFFF
JR C,.No_Media JR C,.No_Media
; ;
LD A,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size high LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size high
LD H,A .No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H
LD A,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 7) ; sector size low LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
LD L,A
.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),L
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),H
LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable
; ;
JR IDESPEC.END JR IDESPEC.END