промежуточные правки 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

@ -13,10 +13,11 @@
; [ ] ãáâ ­®¢ª  ¯ à ¬¥âà  ¬ ªá¨¬ «ì­®£® à §¬¥à  ¤«ï ç⥭¨ï ç¥à¥§ DRV_SET_PAR
;
;----------------------------------------------------------------------------------
MAX_ATAPI_SEC_SIZE EQU 4096/2
PACKET_SIZE EQU 12 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
RAM_ATAPI_RW_CMD EQU SYS_PAGE.SHARED_BUFFER_32b+16
MAX_ATAPI_SEC_SIZE EQU 4096/2
PACKET_SIZE EQU 12 ; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
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"
@ -47,33 +48,60 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
; DE - Cylinders
; IX - Capacity sector in bytes
; B - Flags: MASTER/SLAVE, LBA/CHS
CD_5x_GETMED:
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
; [ ] sector size. media changed
CD_5x_GETMED: LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
; [ ] 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)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD HL,0
LD D,H
LD L,H
; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
; LD H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
; LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow)
; LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh)
LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD A,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ]sector size
LD XL,A
LD A,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ]sector size
LD XH,A
EX AF,AF'
OUT (SLOT3),A
;AND A
RET
;
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
;
; [ ] sector size. media changed
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 H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)
; LD E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow)
; LD D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh)
LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
LD L,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ]sector size
LD H,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ]sector size
EX DE,HL
LD XL,E
LD XH,D
;
LD HL,0
LD D,H
LD E,H
EX AF,AF'
OUT (SLOT3),A
;AND A
RET
;[]================================================================[#58]
;!TODO
@ -115,9 +143,7 @@ CD_5x_LONG_READ:
EX AF,AF'
AND A ;read
EX AF,AF'
ld
; ¯à®¢¥à¨âì .RemovableMedia bit, ¥á«¨ ãáâ ­®¢«¥­, â® ¯à®¯ã᪠RW_ATAPI_SECTORs
CALL NC,RW_ATAPI_SECTORs
CALL RW_ATAPI_SECTORs
; [ ] sector size. media changed
JP HDD_5x_LONG_READ.shared
; JP NC,HDD_5x_LONG_READ.shared
@ -146,6 +172,11 @@ RW_ATAPI_SECTORs:
PUSH BC
LD A,SYS_PAGE
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
EX AF,AF'
JR NC,.read_cmd
@ -175,10 +206,16 @@ RW_ATAPI_SECTORs:
LD HL,RAM_ATAPI_RW_CMD
CALL EXEC_PACKET_COMMAND
;
POP BC
.exit: POP BC
;LD C,SLOT3
OUT (C),B
RET
;
.error_media: EXX
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
JR .exit
;[]===========================================================[#52, #55]
;[]================================================================[#56]
@ -218,10 +255,7 @@ CD_5x_LONG_WRITE:
EX AF,AF'
SCF ;write
EX AF,AF'
;
ld
; ¯à®¢¥à¨âì .RemovableMedia bit, ¥á«¨ ãáâ ­®¢«¥­, â® ¯à®¯ã᪠RW_ATAPI_SECTORs
CALL NC,RW_ATAPI_SECTORs
CALL RW_ATAPI_SECTORs
;
JP HDD_5x_LONG_READ.shared
@ -238,6 +272,7 @@ CD_5x_DETECT:
;[]================================================================[#5E]
; [ ]
;Function: Extended
; A - Disk
; B - SubFunction
@ -250,7 +285,9 @@ CD_5x_Extended:
;
LD A,B
CP 2
JR C,TRAY_FN
JR C,TRAY_FN ; B = 0 ¨«¨ 1
;
JR Z,CD_REQUEST_SENSE ; B = 2
; ...
; ...
;LD A,#AA
@ -259,6 +296,34 @@ CD_5x_Extended:
RET
;[]================================================================[#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
@ -266,9 +331,8 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
DEC A
JR Z,EXEC_PACKET_COMMAND
LD HL,ATAPI_CMD_PACKET.OPEN
JR EXEC_PACKET_COMMAND
;JR EXEC_PACKET_COMMAND
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; INPUT: HL - AP packet (12bytes)
; DE - address for/with data if needed
@ -312,10 +376,7 @@ EXEC_PACKET_COMMAND:
;RET C
JR C,CD_CHECK_MEDIA_CHANGED.noWait
;
.READY: CALL CD_CHECK_MEDIA_CHANGED
RET C
;
LD C,SLOT3
.READY: LD C,SLOT3
IN B,(C)
PUSH DE
PUSH BC
@ -356,7 +417,7 @@ EXEC_PACKET_COMMAND:
BIT IDE.CtrlBit.Error,A
JR NZ,CD_CHECK_MEDIA_CHANGED.noWait
JR NC,.YEP_DRQ
LD A,BIOS.Error.TimeOut ;!FIXIT media change test
LD A,BIOS.Error.ATAPI.TimeOut ;!FIXIT media change test
RET
;
; .CMD_ERROR: CALL CD_GET_ERROR
@ -412,7 +473,7 @@ EXEC_PACKET_COMMAND:
LD BC,IDE.Read.Status
IN A,(C)
BIT IDE.CtrlBit.Error,A
JR NZ,CD_CHECK_MEDIA_CHANGED.noWait
JP NZ,CD_CHECK_MEDIA_CHANGED.noWait
;
AND IDE.CtrlByte.DataRequest
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
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JP EXEC_PACKET_COMMAND
ld
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
CD_MEDIA_CHANGED_ERROR:
PUSH AF
;
IN A,(SLOT3)
EX AF,AF
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
;
LD A,%0000'0011
LD (IY + HDD_INIT_TABLE.RemovableMedia),A
LD DE,SYS_PAGE.SHARED_BUFFER_256b
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
POP AF
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:

View File

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