This commit is contained in:
Tolik 2025-01-26 22:53:18 +10:00
parent 69670d7873
commit 0749fd92b5
8 changed files with 299 additions and 206 deletions

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

View File

@ -480,8 +480,8 @@ TAB_5xFNS:
DB low FDD_5x_READ ;#55 DB low FDD_5x_READ ;#55
DB low FDD_5x_WRITE ;#56 DB low FDD_5x_WRITE ;#56
DB low FDD_5x_DETECT ;#57 DB low FDD_5x_DETECT ;#57
DB low FDD_5x_GETMED ;#58 DB low FDD_5x_GET_PAR ;#58
DB low FDD_5x_SETMED ;#59 DB low FDD_5x_SET_PAR ;#59
DB low DRV_VERSION ;#5A - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪  DB low DRV_VERSION ;#5A - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
DB low FN_RESERVED_5x ;#5B - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪  DB low FN_RESERVED_5x ;#5B - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
@ -506,8 +506,8 @@ TAB_5xFNS:
DB low RMD_5x_READ DB low RMD_5x_READ
DB low RMD_5x_WRITE DB low RMD_5x_WRITE
DB low FN_ABSENT_5x DB low FN_ABSENT_5x
DB low RMD_5x_GETMED DB low RMD_5x_GET_PAR
DB low RMD_5x_SETMED DB low RMD_5x_SET_PAR
DB low DRV_VERSION DB low DRV_VERSION
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
@ -531,8 +531,8 @@ TAB_5xFNS:
DB low HDD_5x_READ DB low HDD_5x_READ
DB low HDD_5x_WRITE DB low HDD_5x_WRITE
DB low HDD_5x_DETECT DB low HDD_5x_DETECT
DB low HDD_5x_GETMED DB low HDD_5x_GET_PAR
DB low HDD_5x_SETMED DB low HDD_5x_SET_PAR
DB low DRV_VERSION DB low DRV_VERSION
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
@ -556,7 +556,7 @@ TAB_5xFNS:
DB low CD_5x_READ DB low CD_5x_READ
DB low CD_5x_WRITE ; [ ] new DB low CD_5x_WRITE ; [ ] new
DB low CD_5x_DETECT DB low CD_5x_DETECT
DB low CD_5x_GETMED ; [ ] new DB low CD_5x_GET_PAR ; [ ] new
DB low FN_ABSENT_5x ; SETMED DB low FN_ABSENT_5x ; SETMED
DB low DRV_VERSION DB low DRV_VERSION
@ -583,8 +583,8 @@ TAB_5xFNS:
DB high FDD_5x_READ ;#55 DB high FDD_5x_READ ;#55
DB high FDD_5x_WRITE ;#56 DB high FDD_5x_WRITE ;#56
DB high FDD_5x_DETECT ;#57 DB high FDD_5x_DETECT ;#57
DB high FDD_5x_GETMED ;#58 DB high FDD_5x_GET_PAR ;#58
DB high FDD_5x_SETMED ;#59 DB high FDD_5x_SET_PAR ;#59
DB high DRV_VERSION ;#5A - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪  DB high DRV_VERSION ;#5A - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪  DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20>  íâã äã­ªæ¨î ¯à룠¥â ¨§ ®á­®¢­®£® ®¡à ¡®â稪 
@ -609,8 +609,8 @@ TAB_5xFNS:
DB high RMD_5x_READ DB high RMD_5x_READ
DB high RMD_5x_WRITE DB high RMD_5x_WRITE
DB high FN_ABSENT_5x DB high FN_ABSENT_5x
DB high RMD_5x_GETMED DB high RMD_5x_GET_PAR
DB high RMD_5x_SETMED DB high RMD_5x_SET_PAR
DB high DRV_VERSION DB high DRV_VERSION
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
@ -634,8 +634,8 @@ TAB_5xFNS:
DB high HDD_5x_READ DB high HDD_5x_READ
DB high HDD_5x_WRITE DB high HDD_5x_WRITE
DB high HDD_5x_DETECT DB high HDD_5x_DETECT
DB high HDD_5x_GETMED DB high HDD_5x_GET_PAR
DB high HDD_5x_SETMED DB high HDD_5x_SET_PAR
DB high DRV_VERSION DB high DRV_VERSION
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
@ -659,7 +659,7 @@ TAB_5xFNS:
DB high CD_5x_READ DB high CD_5x_READ
DB high CD_5x_WRITE ; WRITE ; [ ] new DB high CD_5x_WRITE ; WRITE ; [ ] new
DB high CD_5x_DETECT DB high CD_5x_DETECT
DB high CD_5x_GETMED DB high CD_5x_GET_PAR
DB high FN_ABSENT_5x ; SETMED DB high FN_ABSENT_5x ; SETMED
DB high DRV_VERSION DB high DRV_VERSION
@ -695,8 +695,8 @@ EXP_FNS_RST18:
; HDD_5x_READ ; HDD_5x_READ
; HDD_5x_WRITE ; HDD_5x_WRITE
; HDD_5x_DETECT ; HDD_5x_DETECT
; HDD_5x_GETMED ; HDD_5x_GET_PAR
; HDD_5x_SETMED ; HDD_5x_SET_PAR
; DRV_VERSION ; DRV_VERSION
; FN_RESERVED_5x ; FN_RESERVED_5x
; FN_RESERVED_5x ; FN_RESERVED_5x
@ -722,10 +722,10 @@ FN_5x_Parser_6: ; HDD_5x_WRITE
FN_5x_Parser_7: ; HDD_5x_DETECT FN_5x_Parser_7: ; HDD_5x_DETECT
LD C,#07 LD C,#07
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_8: ; HDD_5x_GETMED FN_5x_Parser_8: ; HDD_5x_GET_PAR
LD C,#08 LD C,#08
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_9: ; HDD_5x_SETMED FN_5x_Parser_9: ; HDD_5x_SET_PAR
LD C,#09 LD C,#09
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_E: ; DRV_EXTENDED FN_5x_Parser_E: ; DRV_EXTENDED

View File

@ -23,7 +23,7 @@
; D7 - "1" - High Density, "0" - Double Density ; D7 - "1" - High Density, "0" - Double Density
;[]===========================================================[] ;[]===========================================================[]
;!FIXIT ¢á¥£¤  ¨¤¥â à ¡®â  á ¤ ­­ë¬¨ ¤«ï ¤¨áª  € ;!FIXIT ¢á¥£¤  ¨¤¥â à ¡®â  á ¤ ­­ë¬¨ ¤«ï ¤¨áª  €
FDD_5x_GETMED: FDD_5x_GET_PAR:
;!TEST FDD 720/1440 ;!TEST FDD 720/1440
IF FDD_NormalCount IF FDD_NormalCount
LD IY,FDD_INIT_TABLE.FDD_0 LD IY,FDD_INIT_TABLE.FDD_0
@ -71,7 +71,7 @@ FDD_5x_GETMED:
; D7 - "1" - High Density, "0" - Double Density ; D7 - "1" - High Density, "0" - Double Density
;Return: None ;Return: None
;[]===========================================================[] ;[]===========================================================[]
FDD_5x_SETMED: ;!TEST FDD 720/1440 FDD_5x_SET_PAR: ;!TEST FDD 720/1440
IF FDD_NormalCount IF FDD_NormalCount
LD IY,FDD_INIT_TABLE.FDD_0 LD IY,FDD_INIT_TABLE.FDD_0
DEC A DEC A

View File

@ -28,14 +28,12 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
RET C RET C
LD B,50 LD B,50
.loop: PUSH BC .loop: PUSH BC
LD HL,ATAPI_CMD_PACKET.NOP CALL EXEC_NOP_CMD
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 CALL CD_CHECK_MEDIA_CHANGED.noWait
RET C RET C
; ;
EI EI
@ -49,17 +47,20 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
;Function: Get Current Media Parameters ;Function: Get Current Media Parameters
; A - Disk ; A - Disk
;Return: ;Return:
; H - Heads ; H - Heads ; [ ] For ATAPI HL:DE - media size in sectors
; L - Sectors per cylinder ; L - Sectors per cylinder ;
; 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
; [ ] A - HDD_INIT_TABLE.RemovableMedia ; [ ] A - HDD_INIT_TABLE.MediaParameters
CD_5x_GETMED: LD C,IDE.Device.ATAPI ; IF media changed
; [ ] CF' = 1, A' = error number UnitAttention
CD_5x_GET_PAR: LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
; ;
IN A,(SLOT3) IN A,(SLOT3)
AND A
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
@ -68,31 +69,36 @@ 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.NotReady
; JR NZ,.get_data ;LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
; SCF
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) JR NZ,.UnitAttention
AND %1111'1101 LD HL,#FFFF
LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A LD D,H
LD E,L
RET
; ;
.UnitAttention: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media
EX AF,AF'
SCF
EX AF,AF'
.get_data: ; .get_data: ;
; LD L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) LD A,(IY+IDE.HDD_INIT_TABLE.MediaParameters)
; 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 A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia)
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 ; [ ] sector size
LD H,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1) ;[ ] sector size LD E,(IY+IDE.HDD_INIT_TABLE.SectorSize)
EX DE,HL LD D,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1)
LD XL,E LD XL,E
LD XH,D LD XH,D
; [ ] media size
LD L,(IY+IDE.HDD_INIT_TABLE.MediaSizeHigh)
LD H,(IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1)
LD E,(IY+IDE.HDD_INIT_TABLE.MediaSizeLow)
LD D,(IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1)
; ;
LD HL,0
LD D,H
LD E,H
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.UnitAttention ; ¥á«¨ CF, â® ­®¬¥à ®è¨¡ª¨
EX AF,AF EX AF,AF
RET RET
;[]================================================================[#58] ;[]================================================================[#58]
@ -165,7 +171,7 @@ RW_ATAPI_SECTORs:
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (C),A OUT (C),A
; [ ] media change ; [ ] media change
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
AND %0000'0010 AND %0000'0010
JR NZ,.error_media JR NZ,.error_media
; ;
@ -196,7 +202,7 @@ RW_ATAPI_SECTORs:
; POP AF ; POP AF
; OUT (SLOT3),A ; OUT (SLOT3),A
LD HL,RAM_ATAPI_RW_CMD LD HL,RAM_ATAPI_RW_CMD
CALL EXEC_PACKET_COMMAND CALL EXEC_PACKET_COMMAND.start
; ;
.exit: POP BC .exit: POP BC
;LD C,SLOT3 ;LD C,SLOT3
@ -255,38 +261,60 @@ CD_5x_LONG_WRITE:
;Function: Detect Disk ;Function: Detect Disk
; A - Disk ; A - Disk
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type
; B=RemovableMedia byte ; [ ] ; B=MediaParameters byte ; [ ] media change
; CF=1 - drive not present, A=#02
; CD_5x_DETECT: LD C,IDE.Device.ATAPI
; AND %1011'1111
; .shared: LD D,A
; LD E,C
; PUSH DE
; CALL DRV_DETECT
; POP DE
; RET C
; ;
; PUSH AF
; LD C,SLOT3
; IN B,(C)
; LD A,SYS_PAGE
; OUT (C),A
; INC HL ;!HARDCODE HDD_INIT_TABLE
; INC HL
; INC HL
; LD A,(HL)
; OUT (C),B
; LD B,A
; AND %0000'0011 ;[ ] media change ¯¥à¥¤¥« âì «®£¨ªã âãâ ¨ ¢ „‘‘? ; !FIXIT
; JR NZ,.error
; ;
; .exit: POP AF
; RET
; ;
; .error: AND %0000'0010
; JR NZ,.UnitAttention
; ;
; LD A,D
; LD C,E
; CALL SELECT_DRIVE
; CALL CD_CHECK_MEDIA_CHANGED
; JR NC,.exit
; POP BC
; RET
; ;
; .UnitAttention: POP AF
; LD A,BIOS.Error.ATAPI.UnitAttention
; SCF
; RET
;[]================================================================[#57]
;[]================================================================[#57]
;Function: Detect Disk
; A - Disk
;Return: CF=0 - A=Drive type
; B=MediaParameters byte ; [ ] media change
; CF=1 - drive not present, A=#02 ; CF=1 - drive not present, A=#02
CD_5x_DETECT: LD C,IDE.Device.ATAPI CD_5x_DETECT: LD C,IDE.Device.ATAPI
AND %1011'1111 JP HDD_5x_DETECT.shared
.shared: CALL DRV_DETECT
RET C
;
PUSH AF
LD C,SLOT3
IN B,(C)
LD A,SYS_PAGE
OUT (C),A
INC HL ;!HARDCODE HDD_INIT_TABLE
INC HL
INC HL
LD A,(HL)
OUT (C),B
LD B,A
AND %0000'0010
JR Z,.exit
;
POP AF
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
RET
;
.exit: POP AF
RET
;[]================================================================[#57] ;[]================================================================[#57]
;[]================================================================[#5E] ;[]================================================================[#5E]
; [ ] ; [ ]
;Function: Extended ;Function: Extended
@ -316,17 +344,20 @@ CD_5x_Extended:
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå ; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE: CD_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JR EXEC_PACKET_COMMAND JR EXEC_PACKET_COMMAND.start
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;[ ] media changed ;[ ] media changed
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED: CD_CHECK_MEDIA_CHANGED:
EXX CALL EXEC_NOP_CMD ;!FIXIT   ¬®¦¥â ¨ ­¥ ­ ¤®
LD DE,256*(IDE.CtrlByte.Error) + 0 ; .skip_nop: EXX
CALL CD_WAITPRT.Custom ; CALL CD_WAITPRT
EXX ; EXX
;RET NC ; LD A, high IDE.Read.Status
; IN A,(low IDE.Read.Status)
; RRA
; ;RET NC
JR C,.noWait JR C,.noWait
; ;
EXX EXX
@ -335,7 +366,7 @@ CD_CHECK_MEDIA_CHANGED:
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (C),A OUT (C),A
; ;
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
OUT (C),B OUT (C),B
EXX EXX
RRA RRA
@ -357,7 +388,7 @@ CD_CHECK_MEDIA_CHANGED:
TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“ LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
DEC A DEC A
JR Z,EXEC_PACKET_COMMAND JR Z,EXEC_PACKET_COMMAND.start
LD HL,ATAPI_CMD_PACKET.OPEN LD HL,ATAPI_CMD_PACKET.OPEN
;JR EXEC_PACKET_COMMAND ;JR EXEC_PACKET_COMMAND
@ -376,20 +407,38 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
; #0B - ABORTED COMMAND ; #0B - ABORTED COMMAND
; #80 - TIME OUT ; #80 - TIME OUT
EXEC_PACKET_COMMAND: EXEC_PACKET_COMMAND:
EXX .error: CP #FF
.error_fail: SCF
LD A,BIOS.Error.Failure
RET Z
;
LD A,BIOS.Error.Busy
RET
;
.error_TimeOut: CP #FF
JR Z,.error_fail
LD A,BIOS.Error.ATAPI.TimeOut
SCF
RET
; .CMD_ERROR: CALL CD_GET_ERROR
; OR #70
; CP BIOS.Error.UnitAttention
; CALL Z,CD_MEDIA_CHANGED_ERROR
; ;LD BC,IDE.Read.Error ;ERROR
; ;IN A,(C)
; ;RRCA
; ;RRCA
; ;RRCA
; ;RRCA
; ;AND #0F
; SCF
; RET
;
.start: EXX
CALL CD_WAITPRT CALL CD_WAITPRT
EXX EXX
JR NC,.READY JR NC,.READY
; ;
; [ ] media changed
; CP +(BIOS.Error.UnitAttention & #0F)
; JR NZ,.reset
; ;
; CALL CD_MEDIA_CHANGED_ERROR
; OR #70 ; error prefix for ATAPI in BIOS
; SCF
; RET
;
.reset: LD BC,IDE.Write.Command .reset: LD BC,IDE.Write.Command
LD A,IDE.ATAPI.Reset LD A,IDE.ATAPI.Reset
OUT (C),A OUT (C),A
@ -420,8 +469,6 @@ EXEC_PACKET_COMMAND:
; ;
XOR A XOR A
EXX EXX
;OUT (C),A
;XOR A
LD BC,IDE.Write.Features LD BC,IDE.Write.Features
OUT (C),A OUT (C),A
LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥­­®© ª ª®©-­¨¡ã¤ì LD DE,MAX_ATAPI_SEC_SIZE ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥­­®© ª ª®©-­¨¡ã¤ì
@ -441,37 +488,8 @@ EXEC_PACKET_COMMAND:
LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
CALL CD_WAITPRT.Custom CALL CD_WAITPRT.Custom
EXX EXX
JR NC,.YEP_DRQ JR C,.error_TimeOut
; ;
CP #FF
JR Z,.error_fail
;
RRA ;AND IDE.CtrlByte.Error
JR C,CD_CHECK_MEDIA_CHANGED.noWait
;
LD A,BIOS.Error.ATAPI.TimeOut
RET
;
.error: CP #FF
SCF
.error_fail: LD A,BIOS.Error.Failure
RET Z
LD A,BIOS.Error.Busy
RET
; .CMD_ERROR: CALL CD_GET_ERROR
; OR #70
; CP BIOS.Error.UnitAttention
; CALL Z,CD_MEDIA_CHANGED_ERROR
; ;LD BC,IDE.Read.Error ;ERROR
; ;IN A,(C)
; ;RRCA
; ;RRCA
; ;RRCA
; ;RRCA
; ;AND #0F
; ;!FIXIT ; [ ] sector size. make REQUEST SENSE if A=6
; SCF
; RET
; EXEC ATAPI PACKET COMMAND ; EXEC ATAPI PACKET COMMAND
.YEP_DRQ: LD C,SLOT3 .YEP_DRQ: LD C,SLOT3
IN B,(C) IN B,(C)
@ -507,10 +525,11 @@ EXEC_PACKET_COMMAND:
EXX EXX
CALL CD_WAITPRT CALL CD_WAITPRT
EXX EXX
JR C,.error JP C,.error
;
LD A,high IDE.Read.Status
IN A,(low IDE.Read.Status)
; ;
LD BC,IDE.Read.Status
IN A,(C)
BIT IDE.CtrlBit.Error,A BIT IDE.CtrlBit.Error,A
JP NZ,CD_CHECK_MEDIA_CHANGED.noWait JP NZ,CD_CHECK_MEDIA_CHANGED.noWait
; ;
@ -525,23 +544,35 @@ EXEC_PACKET_COMMAND:
EX DE,HL EX DE,HL
LD BC,IDE.Read.ByteCountLow LD BC,IDE.Read.ByteCountLow
IN E,(C) IN E,(C)
LD BC,IDE.Read.ByteCountHigh INC C ;LD BC,IDE.Read.ByteCountHigh
IN D,(C) ;TRANSFER BLOCK SIZE IN D,(C) ;TRANSFER BLOCK SIZE
;
LD A,D LD A,D
OR E OR E
RET Z ;BLOCK = 0 RET Z ;BLOCK = 0
; ;
; 㬥­ìè ¥¬ áçñâ稪 § £à㦠¥¬ëå ¡ ©â®¢ ¢ 2 à § . —¨â ¥¬ ¯® 2 ¡ ©â 
SRL D
RR E
;
LD BC,IDE.Read.InterruptReason LD BC,IDE.Read.InterruptReason
IN A,(C) IN A,(C)
AND IDE.InterruptReasonByte.IO AND IDE.InterruptReasonByte.IO
LD BC,IDE.Read.Data LD BC,IDE.Read.Data
JR Z,.WRITE_DATA JR Z,.WRITE_DATA
;
;READ ;READ
; ¯à®¢¥àª  ­  â㯮áâì ª®¤¥à 
; CF=0
; ADC HL,DE
; JR Z,.good_buffer
; JR C,.error_buffer
;
; .good_buffer: AND A
; SBC HL,DE
.read_loop: INI .read_loop: INI
INI INI
DEC DE DEC DE
DEC DE
LD A,D LD A,D
OR E OR E
JR NZ,.read_loop JR NZ,.read_loop
@ -566,19 +597,20 @@ EXEC_PACKET_COMMAND:
EX AF,AF' ;<-----------< / EX AF,AF' ;<-----------< /
OUT (SLOT3),A OUT (SLOT3),A
JR .AP_LOOP JR .AP_LOOP
; ;
;WRITE ;WRITE
.WRITE_DATA: INC B ; LD BC,IDE.Write.Data .WRITE_DATA: INC B ; LD BC,IDE.Write.Data
.write_loop: OUTI .write_loop: OUTI
OUTI OUTI
DEC DE DEC DE
DEC DE
LD A,D LD A,D
OR E OR E
JR NZ,.write_loop JR NZ,.write_loop
JR .return_rw JR .return_rw
;
;.NULL: LD BC,IDE.Read.Data ; !TODO 宫®á⮥ ç⥭¨¥
; .error_buffer: AND A
; SBC HL,DE
;.NULL:
;.RD_N_CD: IN A,(C) ;.RD_N_CD: IN A,(C)
; DEC B ; DEC B
; IN A,(C) ; IN A,(C)
@ -647,7 +679,9 @@ CD_MEDIA_CHANGED_ERROR:
LD DE,SYS_PAGE.SHARED_BUFFER_256b LD DE,SYS_PAGE.SHARED_BUFFER_256b
CALL CD_REQUEST_SENSE CALL CD_REQUEST_SENSE
; ;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION
CP 2 ; SenceKey. 02 - NOT READY
JR Z,.Not_Ready
CP 6 CP 6
JR NZ,.exit JR NZ,.exit
; ;
@ -659,17 +693,23 @@ CD_MEDIA_CHANGED_ERROR:
AND A AND A
JR NZ,.exit JR NZ,.exit
; ;
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia) LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
OR %0000'0011 OR %0000'0011
LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A LD (IY + IDE.HDD_INIT_TABLE.MediaParameters),A
; ;
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,SYS_PAGE.TMP_BUFFER LD DE,SYS_PAGE.TMP_BUFFER
CALL EXEC_PACKET_COMMAND CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF LD HL,#FFFF
JR C,.No_Media JR C,.No_Media
; ;
LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size (high byte, low byte) LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh),H
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1),L
LD HL,(SYS_PAGE.TMP_BUFFER + 2) ; media size low
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow),H
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L
LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size
; ;
.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ] sector size .No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H ;[ ] sector size
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
@ -680,6 +720,12 @@ CD_MEDIA_CHANGED_ERROR:
SCF SCF
RET RET
; ;
.Not_Ready: POP AF
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.NotReady
SCF
RET
;
.exit: POP AF .exit: POP AF
OUT (SLOT3),A OUT (SLOT3),A
; CF=0 ; CF=0
@ -687,7 +733,10 @@ CD_MEDIA_CHANGED_ERROR:
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; SELECT_DRIVE ¤®«¦¥­ ®âà ¡®â âì § à ­¥¥
EXEC_NOP_CMD: LD HL,ATAPI_CMD_PACKET.NOP
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
JP EXEC_PACKET_COMMAND.start
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
ATAPI_CMD_PACKET: ATAPI_CMD_PACKET:
@ -744,7 +793,7 @@ ATAPI_PACKET:
; RET ; RET
; ;
/* /*
᫨ «®¢¨âáï ®è¨¡ª  media changed, â® ¡¨®á ¤®«¦¥­ ¢ëáâ ¢«ïâì ¢ HDD_INIT_TABLE.RemovableMedia = 3 ᫨ «®¢¨âáï ®è¨¡ª  media changed, â® ¡¨®á ¤®«¦¥­ ¢ëáâ ¢«ïâì ¢ HDD_INIT_TABLE.MediaParameters = 3
¨ § â¨à âì FF SectorSize. ¨ § â¨à âì FF SectorSize.
®á ¯®á«¥ ¯®«ã祭¨ï â ª®© ®è¨¡ª¨ ¤®«¦¥­ ¢ë§ë¢ âì BIOS.DRV_DETECT ¨ ¥á«¨ ¢áñ ŽŠ, â® ReScanDRV ®á ¯®á«¥ ¯®«ã祭¨ï â ª®© ®è¨¡ª¨ ¤®«¦¥­ ¢ë§ë¢ âì BIOS.DRV_DETECT ¨ ¥á«¨ ¢áñ ŽŠ, â® ReScanDRV
*/ */

View File

@ -99,7 +99,7 @@ HDD_5x_RESET: ; !FIXIT
; 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
HDD_5x_GETMED: HDD_5x_GET_PAR:
LD C,IDE.Device.HDD LD C,IDE.Device.HDD
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
@ -107,13 +107,13 @@ HDD_5x_GETMED:
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
LD A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia) LD A,(IY+IDE.HDD_INIT_TABLE.MediaParameters)
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 IX,512 ;!HARDCODE sector size LD IX,512 ;!HARDCODE ; [ ] sector size
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
EX AF,AF' EX AF,AF'
@ -129,7 +129,7 @@ HDD_5x_GETMED:
; IX - Capacity sector in bytes ; IX - Capacity sector in bytes
; B - Flags ; B - Flags
;Return: None ;Return: None
HDD_5x_SETMED: HDD_5x_SET_PAR:
LD C,IDE.Device.HDD LD C,IDE.Device.HDD
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
@ -143,6 +143,7 @@ HDD_5x_SETMED:
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B
;!TODO ; [ ] sector size ;!TODO ; [ ] sector size
;!TODO ; [ ] UnitAttention
EX AF,AF' EX AF,AF'
OUT (SLOT3),A OUT (SLOT3),A
;EX AF,AF' ;EX AF,AF'
@ -674,7 +675,35 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE
; A - Disk ; A - Disk
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type
; CF=1 - drive not present, A=#02 ; CF=1 - drive not present, A=#02
HDD_5x_DETECT: HDD_5x_DETECT: LD C,IDE.Device.HDD
LD C,IDE.Device.HDD .shared: CALL SELECT_DRIVE
JP CD_5x_DETECT.shared RET C
;
LD B,A
AND %0000'0011 ;[ ] media change ¯¥à¥¤¥« âì «®£¨ªã âãâ ¨ ¢ „‘‘? ; !FIXIT
JR NZ,.notZero
LD A,C
RET
;
.notZero: AND %0000'0010
JR NZ,.UnitAttention
; C = DriveType
LD A,C
CP IDE.Device.ATAPI
JR Z,.AtapiCheckMedia
;!FIXIT AtaCheckMedia - ­¥ ᤥ« ­®
AND A
RET
;
.AtapiCheckMedia:
PUSH BC ; B - MediaParameters, C - DriveType
CALL CD_CHECK_MEDIA_CHANGED
POP BC ; B - MediaParameters, C - DriveType
RET C
LD A,C
RET
;
.UnitAttention: LD A,BIOS.Error.ATAPI.UnitAttention
SCF
RET
;[]================================================================[#57] ;[]================================================================[#57]

View File

@ -1,6 +1,7 @@
;[x] 18/12/2023. ¤®¡ ¢«¥­¨¥/¤®¯¨«¨¢ ­¨¥ API CD-ROM (ATAPI) ;[x] 18/12/2023. ¤®¡ ¢«¥­¨¥/¤®¯¨«¨¢ ­¨¥ API CD-ROM (ATAPI)
;======================================================================= ;=======================================================================
; ‚室: A - ­®¬¥à ãáâனá⢠ ; ‚室: A - ­®¬¥à ãáâனá⢠, C - DriveType
; ‚ë室: A - MediaParameters, C - DriveType
SELECT_DRIVE: SELECT_DRIVE:
AND #0F AND #0F
LD IY,IDE.INIT_TBL_IDE0 LD IY,IDE.INIT_TBL_IDE0
@ -27,30 +28,33 @@ SELECT_DRIVE:
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
; ;
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) LD H,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
AND 1 LD C,(IY + IDE.HDD_INIT_TABLE.DriveType)
LD A,IDE.Chanel.Secondary LD B,(IY + IDE.HDD_INIT_TABLE.DRV_Flags)
JR NZ,.device
LD A,IDE.Chanel.Primary
.device:
OUT (IDE.Chanel.Set),A ;R02
LD C,(IY+IDE.HDD_INIT_TABLE.DriveType)
LD B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
POP AF POP AF
OUT (SLOT3),A ;¢®§¢à â áâà ­¨æë OUT (SLOT3),A ;¢®§¢à â áâà ­¨æë
; ;
LD A,C LD A,C
EXX EXX
;
CP C CP C
;
EXX EXX
SCF SCF
LD A,BIOS.Error.BadNumber LD A,BIOS.Error.BadNumber
RET NZ RET NZ
; ;
LD A,B
RRA
LD A,IDE.Chanel.Secondary
JR C,.device
LD A,IDE.Chanel.Primary
.device: OUT (IDE.Chanel.Set),A ;R02
LD A,B LD A,B
AND #F0 AND #F0
LD BC,IDE.Write.DeviceHead LD BC,IDE.Write.DeviceHead
OUT (C),A OUT (C),A
LD A,H
EXX EXX
RET RET
; ;
@ -65,32 +69,33 @@ SELECT_DRIVE:
;Function: Detect Disk ;Function: Detect Disk
; A - Disk ; A - Disk
; - Type ; - Type
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type, H=MediaParameters
; CF=1 - drive not present, A=#02 ; CF=1 - drive not present, A=#02
DRV_DETECT: CP #84 ;!HARDCODE max IDE drives (#80,#81,#82,#83) ;DRV_DETECT: CP #84 ;!HARDCODE max IDE drives (#80,#81,#82,#83)
CCF ; CCF
JR C,.error ; JR C,.error
; ; ;
LD HL,IDE.INIT_TBL_IDE0.DriveType ; LD IX,IDE.INIT_TBL_IDE0
AND 3 ; AND 3
JR Z,.get_param ; JR Z,.get_param
LD HL,IDE.INIT_TBL_IDE1.DriveType ; LD IX,IDE.INIT_TBL_IDE1
DEC A ; DEC A
JR Z,.get_param ; JR Z,.get_param
LD HL,IDE.INIT_TBL_IDE2.DriveType ; LD IX,IDE.INIT_TBL_IDE2
DEC A ; DEC A
JR Z,.get_param ; JR Z,.get_param
LD HL,IDE.INIT_TBL_IDE3.DriveType ; LD IX,IDE.INIT_TBL_IDE3
.get_param: IN A,(SLOT3) ; .get_param: IN A,(SLOT3)
LD B,A ; LD B,A
LD A,SYS_PAGE ; LD A,SYS_PAGE
OUT (SLOT3),A ; OUT (SLOT3),A
; ; ;
LD A,(HL) ; LD H,(IX + IDE.HDD_INIT_TABLE.MediaParameters)
CP C ; compare Type ; LD A,(IX + IDE.HDD_INIT_TABLE.DriveType)
LD C,SLOT3 ; CP C ; compare Type
OUT (C),B ; LD C,SLOT3
RET Z ; OUT (C),B
SCF ; RET Z
.error: LD A,BIOS.Error.BadNumber ; SCF
RET ; .error: LD A,BIOS.Error.BadNumber
; RET

View File

@ -12,7 +12,7 @@
;Return: None ;Return: None
;[]===========================================================[] ;[]===========================================================[]
;!FIXIT ;!FIXIT
RMD_5x_SETMED: RMD_5x_SET_PAR:
and a and a
ret ret
; A - Disk ; A - Disk
@ -35,7 +35,7 @@ RMD_5x_SETMED:
; IX - Capacity sector in bytes ; IX - Capacity sector in bytes
; B - Flags: ramblock ID ; B - Flags: ramblock ID
;[]===========================================================[] ;[]===========================================================[]
RMD_5x_GETMED: AND #0F RMD_5x_GET_PAR: AND #0F
CALL GET_RAMD_ST ; ¯®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª  CALL GET_RAMD_ST ; ¯®«ã祭¨¥ ¨¤¥­â¨ä¨ª â®à  ¡«®ª 
RET C RET C
SCF SCF

View File

@ -406,7 +406,7 @@ IDESPEC: IN A,(SLOT3)
LD A,(IDENTIFY_DEVICE_BUFFER.GeneralConfiguration) LD A,(IDENTIFY_DEVICE_BUFFER.GeneralConfiguration)
RLCA RLCA
AND %0000'0001 AND %0000'0001
LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),A LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),A
; ;
LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack)
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
@ -444,18 +444,28 @@ IDESPEC: IN A,(SLOT3)
LD HL,ICHANEL LD HL,ICHANEL
OR (HL) OR (HL)
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
; ; ­  ¢á直© á«ãç ©
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
CALL EXEC_PACKET_COMMAND.start
; [ ] 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 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
CALL EXEC_PACKET_COMMAND CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF LD HL,#FFFF
JR C,.No_Media JR C,.No_Media
; ;
LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size high LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224) ; media size high
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh),H
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeHigh+1),L
LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 2) ; media size low
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow),H
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L
LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224 + 6) ; sector size
;
.No_Media: LD (IY+IDE.HDD_INIT_TABLE.SectorSize),H .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.SectorSize + 1),L
LD (IY+IDE.HDD_INIT_TABLE.RemovableMedia),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable
; ;
JR IDESPEC.END JR IDESPEC.END
/////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[^]