ATAPI media changed flag

This commit is contained in:
Tolik 2025-01-13 23:12:44 +10:00
parent d25dacb942
commit 82c590c8a4
3 changed files with 76 additions and 54 deletions

@ -1 +1 @@
Subproject commit d21dd0c0291e48f53d40b7bd09fcb8e7756dda1e Subproject commit 857938d1dbf3b332a5e9e8ccabfee531eb3848fa

View File

@ -28,10 +28,16 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
RET C RET C
LD B,50 LD B,50
.loop: PUSH BC .loop: PUSH BC
CALL CD_TEST LD HL,ATAPI_CMD_PACKET.NOP
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
CALL EXEC_PACKET_COMMAND
;!FIXIT ;[ ] sector size. ᤥ« âì २­¨â HDD_INIT_TABLE ;!FIXIT ;[ ] sector size. ᤥ« âì २­¨â HDD_INIT_TABLE
POP BC POP BC
RET NC RET NC
;
CALL CD_CHECK_MEDIA_CHANGED
RET C
;
EI EI
HALT HALT
DJNZ .loop DJNZ .loop
@ -51,14 +57,6 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
CD_5x_GETMED: LD C,IDE.Device.ATAPI CD_5x_GETMED: LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C 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) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
@ -69,19 +67,12 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI
CALL CD_CHECK_MEDIA_CHANGED CALL CD_CHECK_MEDIA_CHANGED
JR NC,.get_data JR NC,.get_data
; ;
CP BIOS.Error.ATAPI.UnitAttention ; CP BIOS.Error.ATAPI.UnitAttention
JR NZ,.get_data ; JR NZ,.get_data
; ;
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
LD DE,SYS_PAGE.TMP_BUFFER AND %1111'1101
CALL EXEC_PACKET_COMMAND LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A
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: ; .get_data: ;
; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)
@ -89,8 +80,8 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI
; 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 L,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ]sector size LD L,(IY+IDE.HDD_INIT_TABLE.SectorSize) ;[ ] sector size
LD H,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ]sector size LD H,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ] sector size
EX DE,HL EX DE,HL
LD XL,E LD XL,E
LD XH,D LD XH,D
@ -303,25 +294,40 @@ CD_REQUEST_SENSE:
JR EXEC_PACKET_COMMAND JR EXEC_PACKET_COMMAND
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;[ ] media changed
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED: CD_CHECK_MEDIA_CHANGED:
EXX EXX
LD DE,256*(IDE.CtrlByte.Error) + 0 LD DE,256*(IDE.CtrlByte.Error) + 0
CALL CD_WAITPRT.Custom CALL CD_WAITPRT.Custom
EXX EXX
RET NC ;RET NC
JR C,.noWait
;
EXX
LD BC,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
;
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
OUT (C),B
EXX
RRA
RRA
LD A,BIOS.Error.ATAPI.UnitAttention
RET
; ;
.noWait: EXX .noWait: EXX
CALL CD_GET_ERROR CALL CD_GET_ERROR
OR #70 OR #70
EXX EXX
CP BIOS.Error.ATAPI.NoSence CP BIOS.Error.ATAPI.NoSence
SCF ;SCF
RET NZ RET NZ
; ;
CALL CD_MEDIA_CHANGED_ERROR CALL CD_MEDIA_CHANGED_ERROR
; CF=1 ; LD A,BIOS.Error.ATAPI.UnitAttention
LD A,BIOS.Error.ATAPI.UnitAttention
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
@ -595,16 +601,14 @@ CD_WAITPRT: LD DE,256*(IDE.CtrlByte.Busy) + 0
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP ; CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“ ; LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
JP EXEC_PACKET_COMMAND ; JP EXEC_PACKET_COMMAND
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_MEDIA_CHANGED_ERROR: CD_MEDIA_CHANGED_ERROR:
PUSH AF
;
IN A,(SLOT3) IN A,(SLOT3)
PUSH AF PUSH AF
LD A,SYS_PAGE LD A,SYS_PAGE
@ -625,12 +629,31 @@ CD_MEDIA_CHANGED_ERROR:
AND A AND A
JR NZ,.exit JR NZ,.exit
; ;
LD A,%0000'0011 LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
OR %0000'0011
LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A
; ;
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
;
POP AF
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
RET
;
.exit: POP AF .exit: POP AF
OUT (SLOT3),A OUT (SLOT3),A
POP AF ; CF=0
;AND A
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;

View File

@ -523,20 +523,18 @@ WRITE_ATA_SECTORs:
; B - Sector counter ; B - Sector counter
;Return: None ;Return: None
;VERIFY SECTOR(S) ;VERIFY SECTOR(S)
HDD_5x_VERIFY: HDD_5x_VERIFY: PUSH IY
PUSH IY
SAFE_PORTY_2 SAFE_PORTY_2
PUSH IX PUSH IX
PUSH HL PUSH HL
CALL VRS000 CALL .VERIFY
POP HL POP HL
POP IX POP IX
RESTORE_PORTY RESTORE_PORTY
POP IY POP IY
RET RET
;[]================================================================[#54]
;VERIFY SECTOR(S) ;VERIFY SECTOR(S)
VRS000: LD C,IDE.Device.HDD .VERIFY: LD C,IDE.Device.HDD
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
EXX EXX
@ -549,16 +547,17 @@ VRS000: LD C,IDE.Device.HDD
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
LD A,IDE.ATA.ReadVerifySectorsWithRetry LD A,IDE.ATA.ReadVerifySectorsWithRetry
OUT (C),A OUT (C),A
VRS002: 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 Z,VRS003 RRA ;BIT IDE.CtrlBit.Error,A : SCF : RET NZ
SCF RET C
RET ;
VRS003: CALL WAITPRT CALL WAITPRT
RET C RET C
XOR A XOR A
RET RET
;[]================================================================[#54]
; HL:IX - LBA SECTOR ; HL:IX - LBA SECTOR