ATAPI media changed - 99%

This commit is contained in:
Tolik 2025-02-19 02:16:58 +10:00
parent 65a2957424
commit e7cb4c354f
4 changed files with 151 additions and 99 deletions

@ -1 +1 @@
Subproject commit 831b2da8a66ee3bd78a7c73ef3592609e5f02902
Subproject commit 2b1e30c6108f0a5c271f84558e1e5f804a6d623a

View File

@ -556,14 +556,14 @@ TAB_5xFNS:
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 ATAPI_5x_GET_PAR ; [ ] new
DB low ATAPI_5x_SET_PAR ; SETMED
DB low DRV_VERSION
DB low FN_RESERVED_5x
DB low FN_RESERVED_5x
DB low FN_RESERVED_5x
DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO
DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO
DB low DRV_LIST
;---------------------------------------------------------------------[]

View File

@ -33,8 +33,11 @@ ATAPI_5x_RESET: LD C,IDE.Device.ATAPI
POP BC
RET NC
;
CALL ATAPI_CHECK_MEDIA_CHANGED.noWait
RET C
;CALL ATAPI_CHECK_MEDIA_CHANGED.noWait
;RET C
CP BIOS.Error.ATAPI.UnitAttention
SCF
RET Z
;
EI
HALT
@ -354,29 +357,32 @@ ATAPI_5x_DETECT:
; A - Disk
; B - SubFunction
;Return:
;
; [ ] à á¯¨á âì ¢ ¤®ª¥
ATAPI_5x_Extended:
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
;
LD A,B
CP 2
JR C,TRAY_FN ; B = 0 ¨«¨ 1
;
JR Z,ATAPI_REQUEST_SENSE ; B = 2
; ...
; ...
;LD A,#AA
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
;
LD A,B
CP 2
JR C,TRAY_FN ; B = 0 ¨«¨ 1
;
JR Z,ATAPI_REQUEST_SENSE ; B = 2
;
CP 3
JR Z,ATAPI_CUSTOM_CMD
; ...
LD A,BIOS.Error.InvalidSubFunction
SCF
RET
;[]================================================================[#5E]
;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
ATAPI_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
IN A,(SLOT3)
EX AF,AF'
.FN: LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JR EXEC_PACKET_COMMAND.start
;----------------------------------------------------------------------;
@ -409,15 +415,7 @@ ATAPI_CHECK_MEDIA_CHANGED:
RET
;
.noWait: EXX
;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
CALL ATAPI_GET_ERROR_REG
EXX
CP BIOS.Error.ATAPI.NoSence
JP Z,ATAPI_MEDIA_ERROR
@ -431,6 +429,18 @@ ATAPI_CHECK_MEDIA_CHANGED:
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; HL - 㪠§ â¥«ì ­  ¯ ª¥â­ãî ª®¬ ­¤ã (¯¥à¢ë© ¨«¨ ¢â®à®© á«®â)
; DE - 㪠§ â¥«ì ­  ¡ãää¥à ¤«ï ª®¬ ­¤ë
ATAPI_CUSTOM_CMD:
IN A,(SLOT3)
EX AF,AF'
LD A,1 ; ¯à¨§­ ª, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï <20>… ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
JP EXEC_PACKET_COMMAND.start_custom
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
@ -441,6 +451,7 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
; INPUT: HL - AP packet (12bytes)
; DE - address for/with data if needed
; A' - ­ ç «ì­ ï áâà ­¨æ  ¤«ï R/W Long
;
; RETURN: CF - ERROR
; !TODO CD ERRORS to INCLUDES
@ -467,21 +478,14 @@ EXEC_PACKET_COMMAND:
LD A,BIOS.Error.ATAPI.TimeOut
SCF
RET
; .CMD_ERROR: CALL ATAPI_GET_ERROR
; OR #70
; CP BIOS.Error.UnitAttention
; CALL Z,ATAPI_MEDIA_ERROR
; ;LD BC,IDE.Read.Error ;ERROR
; ;IN A,(C)
; ;RRCA
; ;RRCA
; ;RRCA
; ;RRCA
; ;AND #0F
; SCF
; RET
;
.start: EXX
.start_sys_page:
LD A,SYS_PAGE
EX AF,AF'
;
.start: XOR A ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
.start_custom: EXX
LD C,A ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
CALL ATAPI_WAITPRT
EXX
JR NC,.READY
@ -515,6 +519,7 @@ EXEC_PACKET_COMMAND:
;
XOR A
EXX
LD H,C ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
LD BC,IDE.Write.Features
OUT (C),A
LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥­­®© ª ª®©-­¨¡ã¤ì
@ -525,6 +530,7 @@ EXEC_PACKET_COMMAND:
LD BC,IDE.Write.Command
LD A,IDE.ATAPI.Packet
OUT (C),A
LD C,H ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
CALL ATAPI_WAITPRT
EXX
JR C,.error
@ -564,13 +570,14 @@ EXEC_PACKET_COMMAND:
;
EX DE,HL
.AP_LOOP: EX DE,HL
IN A,(SLOT3)
EX AF,AF' ;>-----------> \
; IN A,(SLOT3)
; EX AF,AF' ;>-----------> \
;
EXX
EXX
CALL ATAPI_WAITPRT
EXX
EXX
JP C,.error
;
; [ ] media change.   ­ ¤® «¨ âãâ? ;!FIXIT «ãçè¥ ¡«®ª¨à®¢ âì ­®á¨â¥«ì
LD A,high IDE.Read.Status
IN A,(low IDE.Read.Status)
@ -578,10 +585,18 @@ EXEC_PACKET_COMMAND:
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 =======================================;
;
JR NC,.data_request
; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
EXX
DEC C ; ¯à¨§­ ª ⮣®, çâ® ®è¨¡ª  ᬥ­ë ­®á¨â¥«ï ¤®«¦­  ®¡à ¡ â뢠âìáï ¢ EXEC_PACKET_COMMAND
EXX
RET Z ; ¢ë室, ¥á«¨ ®è¨¡ª  ®¡à ¡ â뢠¥âáï ­¥ ¢ EXEC_PACKET_COMMAND
;
JP ATAPI_CHECK_MEDIA_CHANGED.noWait
;====== IF DATA REQUEST ===============================================;
.data_request: IN A,(SLOT3)
EX AF,AF' ;>-----------> \
;
LD A,XH
OUT (SLOT3),A
EX DE,HL
@ -669,14 +684,17 @@ EXEC_PACKET_COMMAND:
;----------------------------------------------------------------------;
; 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
; ¯®à⨬ ⮫쪮 ॣ¨áâà AF
ATAPI_GET_ERROR_REG:
XOR A ;LD BC,IDE.Read.Error
IN A,(IDE.Read.Error) ;IN A,(C)
RRCA
RRCA
RRCA
RRCA
AND #0F
OR BIOS.Error.ATAPI
RET
;----------------------------------------------------------------------;
@ -705,6 +723,45 @@ ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; DE - buffer
ATAPI_READ_CAPACITY_DATA:
LD BC,28 ;áçñâ稪
;
.loop: PUSH BC
PUSH DE
LD A,SYS_PAGE
EX AF,AF'
LD A,1
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
CALL EXEC_PACKET_COMMAND.start_custom
POP DE
POP BC
RET NC
;
CALL ATAPI_GET_ERROR_REG
CP BIOS.Error.ATAPI.NotReady
SCF
RET NZ
CALL ATAPI_MEDIA_ERROR
CP BIOS.Error.ATAPI.NotReady
SCF
RET NZ
;
CPI
RET PO
;
LD HL,0
.pause: DEC HL
LD A,H
OR L
JR NZ,.pause
;
JP .loop
RET
;----------------------------------------------------------------------;
;----------------------------------------------------------------------;
; ATAPI_TEST: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
; LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
@ -718,9 +775,9 @@ ATAPI_MEDIA_ERROR:
PUSH AF
LD A,SYS_PAGE
OUT (SLOT3),A
;
EX AF,AF' ; set page with buffer to SYS_PAGE
LD DE,SYS_PAGE.SHARED_BUFFER_256b
CALL ATAPI_REQUEST_SENSE
CALL ATAPI_REQUEST_SENSE.FN
;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION
CP 2 ; SenceKey. 02 - NOT READY
@ -740,9 +797,11 @@ ATAPI_MEDIA_ERROR:
OR %0000'0011
LD (IY + IDE.HDD_INIT_TABLE.MediaParameters),A
;
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,SYS_PAGE.TMP_BUFFER
CALL EXEC_PACKET_COMMAND.start
;LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,SYS_PAGE.TMP_BUFFER
;CALL EXEC_PACKET_COMMAND.start_sys_page
CALL ATAPI_READ_CAPACITY_DATA
;
LD HL,#FFFF
LD C,BIOS.Error.ATAPI.MediumError
JR C,.No_Media

View File

@ -291,12 +291,11 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
.Its_ATAPI: CALL DETECTORS.IdentPDevChk
JR C,.IDE_ABSENT
LD A,IDE.Device.ATAPI
LD (IDEDEV),A
JR .get
.Its_ATA: LD A,IDE.Device.HDD
LD (IDEDEV),A
.get: CALL GETPARAM
.get: LD (IDEDEV),A
CALL GETPARAM
JR C,.IDE_ABSENT
;CALL DisableWriteCache
;CALL DisableStandBy
@ -467,9 +466,10 @@ IDESPEC: IN A,(SLOT3)
; LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
; CALL EXEC_PACKET_COMMAND.start
; [ ] sector size ATAPI
.s_size: 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
;CALL EXEC_PACKET_COMMAND.start_sys_page
CALL ATAPI_READ_CAPACITY_DATA
;
.set_sector: LD HL,#FFFF
JR C,.No_Media
@ -526,31 +526,27 @@ MODEL: LD HL,IDENTIFY_DEVICE_BUFFER.ModelNumber
/////////////////////////////////////////////////////////////////////[v]
BITS_WAITS:
; IN:
; HL - Waiting delay
; DE - MASK : PATTERN
; OUT:
; NC: (PORT & D)-E = 0
; CF: waiting delay exceeded
.WAIT_PRT:
LD BC,IDE.Read.Status
;
.loop: IN A,(C)
AND D
CP E
RET Z
DEC HL
CALL SKIPKEY
RET C
LD A,L
OR H
JP NZ,.loop
;
SCF
RET
;
; Pause for clear BUSY and DATA REQUEST
; IN:
; HL - Waiting delay
; DE - MASK : PATTERN
; OUT:
; NC: (PORT & D)-E = 0
; CF: waiting delay exceeded
.WAIT_PRT: LD BC,IDE.Read.Status
.loop: IN A,(C)
AND D
CP E
RET Z
DEC HL
CALL SKIPKEY
RET C
LD A,L
OR H
JP NZ,.loop
SCF
RET
;
; Pause for clear BUSY and DATA REQUEST
.Clear_BUSY: LD BC,IDE.Read.Status
IN A,(C)
;!TEST for normal bus with pull-ups
@ -570,7 +566,6 @@ BITS_WAITS:
;
CALL SKIPKEY
RET C
;
JR .Clear_BUSY
/////////////////////////////////////////////////////////////////////[^]
@ -835,8 +830,6 @@ DETECTORS:
LD BC,IDE.Read.Status
IN A,(C)
RRCA
; RET C
; XOR A
RET
;-------;