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

View File

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

View File

@ -28,14 +28,12 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
RET C
LD B,50
.loop: PUSH BC
LD HL,ATAPI_CMD_PACKET.NOP
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
CALL EXEC_PACKET_COMMAND
CALL EXEC_NOP_CMD
;!FIXIT ;[ ] sector size. ᤥ« âì २­¨â HDD_INIT_TABLE
POP BC
RET NC
;
CALL CD_CHECK_MEDIA_CHANGED
CALL CD_CHECK_MEDIA_CHANGED.noWait
RET C
;
EI
@ -49,17 +47,20 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
;Function: Get Current Media Parameters
; A - Disk
;Return:
; H - Heads
; L - Sectors per cylinder
; DE - Cylinders
; H - Heads ; [ ] For ATAPI HL:DE - media size in sectors
; L - Sectors per cylinder ;
; DE - Cylinders ;
; IX - Capacity sector in bytes
; B - Flags: MASTER/SLAVE, LBA/CHS
; [ ] A - HDD_INIT_TABLE.RemovableMedia
CD_5x_GETMED: LD C,IDE.Device.ATAPI
; [ ] A - HDD_INIT_TABLE.MediaParameters
; IF media changed
; [ ] CF' = 1, A' = error number UnitAttention
CD_5x_GET_PAR: LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE
RET C
;
IN A,(SLOT3)
AND A
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
@ -68,31 +69,36 @@ CD_5x_GETMED: LD C,IDE.Device.ATAPI
CALL CD_CHECK_MEDIA_CHANGED
JR NC,.get_data
;
; CP BIOS.Error.ATAPI.UnitAttention
; JR NZ,.get_data
;
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
AND %1111'1101
LD (IY + IDE.HDD_INIT_TABLE.RemovableMedia),A
CP BIOS.Error.ATAPI.NotReady
;LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
SCF
JR NZ,.UnitAttention
LD HL,#FFFF
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: ;
; 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 A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia)
LD A,(IY+IDE.HDD_INIT_TABLE.MediaParameters)
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
; [ ] sector size
LD E,(IY+IDE.HDD_INIT_TABLE.SectorSize)
LD D,(IY+IDE.HDD_INIT_TABLE.SectorSize + 1)
LD XL,E
LD XH,D
;
LD HL,0
LD D,H
LD E,H
; [ ] 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)
;
EX AF,AF'
OUT (SLOT3),A
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.UnitAttention ; ¥á«¨ CF, â® ­®¬¥à ®è¨¡ª¨
EX AF,AF
RET
;[]================================================================[#58]
@ -165,7 +171,7 @@ RW_ATAPI_SECTORs:
LD A,SYS_PAGE
OUT (C),A
; [ ] media change
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
AND %0000'0010
JR NZ,.error_media
;
@ -196,7 +202,7 @@ RW_ATAPI_SECTORs:
; POP AF
; OUT (SLOT3),A
LD HL,RAM_ATAPI_RW_CMD
CALL EXEC_PACKET_COMMAND
CALL EXEC_PACKET_COMMAND.start
;
.exit: POP BC
;LD C,SLOT3
@ -255,38 +261,60 @@ CD_5x_LONG_WRITE:
;Function: Detect Disk
; A - Disk
;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
CD_5x_DETECT: LD C,IDE.Device.ATAPI
AND %1011'1111
.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
JP HDD_5x_DETECT.shared
;[]================================================================[#57]
;[]================================================================[#5E]
; [ ]
;Function: Extended
@ -316,17 +344,20 @@ CD_5x_Extended:
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JR EXEC_PACKET_COMMAND
JR EXEC_PACKET_COMMAND.start
;----------------------------------------------------------------------;
;[ ] media changed
;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED:
EXX
LD DE,256*(IDE.CtrlByte.Error) + 0
CALL CD_WAITPRT.Custom
EXX
;RET NC
CALL EXEC_NOP_CMD ;!FIXIT   ¬®¦¥â ¨ ­¥ ­ ¤®
; .skip_nop: EXX
; CALL CD_WAITPRT
; EXX
; LD A, high IDE.Read.Status
; IN A,(low IDE.Read.Status)
; RRA
; ;RET NC
JR C,.noWait
;
EXX
@ -335,7 +366,7 @@ CD_CHECK_MEDIA_CHANGED:
LD A,SYS_PAGE
OUT (C),A
;
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
OUT (C),B
EXX
RRA
@ -357,7 +388,7 @@ CD_CHECK_MEDIA_CHANGED:
TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
DEC A
JR Z,EXEC_PACKET_COMMAND
JR Z,EXEC_PACKET_COMMAND.start
LD HL,ATAPI_CMD_PACKET.OPEN
;JR EXEC_PACKET_COMMAND
@ -376,20 +407,38 @@ TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
; #0B - ABORTED COMMAND
; #80 - TIME OUT
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
EXX
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
LD A,IDE.ATAPI.Reset
OUT (C),A
@ -420,8 +469,6 @@ EXEC_PACKET_COMMAND:
;
XOR A
EXX
;OUT (C),A
;XOR A
LD BC,IDE.Write.Features
OUT (C),A
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
CALL CD_WAITPRT.Custom
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
.YEP_DRQ: LD C,SLOT3
IN B,(C)
@ -507,10 +525,11 @@ EXEC_PACKET_COMMAND:
EXX
CALL CD_WAITPRT
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
JP NZ,CD_CHECK_MEDIA_CHANGED.noWait
;
@ -525,23 +544,35 @@ EXEC_PACKET_COMMAND:
EX DE,HL
LD BC,IDE.Read.ByteCountLow
IN E,(C)
LD BC,IDE.Read.ByteCountHigh
INC C ;LD BC,IDE.Read.ByteCountHigh
IN D,(C) ;TRANSFER BLOCK SIZE
;
LD A,D
OR E
RET Z ;BLOCK = 0
;
; 㬥­ìè ¥¬ áçñâ稪 § £à㦠¥¬ëå ¡ ©â®¢ ¢ 2 à § . —¨â ¥¬ ¯® 2 ¡ ©â 
SRL D
RR E
;
LD BC,IDE.Read.InterruptReason
IN A,(C)
AND IDE.InterruptReasonByte.IO
LD BC,IDE.Read.Data
JR Z,.WRITE_DATA
;
;READ
; ¯à®¢¥àª  ­  â㯮áâì ª®¤¥à 
; CF=0
; ADC HL,DE
; JR Z,.good_buffer
; JR C,.error_buffer
;
; .good_buffer: AND A
; SBC HL,DE
.read_loop: INI
INI
DEC DE
DEC DE
LD A,D
OR E
JR NZ,.read_loop
@ -566,19 +597,20 @@ EXEC_PACKET_COMMAND:
EX AF,AF' ;<-----------< /
OUT (SLOT3),A
JR .AP_LOOP
; ;
;WRITE
.WRITE_DATA: INC B ; LD BC,IDE.Write.Data
.write_loop: OUTI
OUTI
DEC DE
DEC DE
LD A,D
OR E
JR NZ,.write_loop
JR .return_rw
;.NULL: LD BC,IDE.Read.Data
;
; !TODO 宫®á⮥ ç⥭¨¥
; .error_buffer: AND A
; SBC HL,DE
;.NULL:
;.RD_N_CD: IN A,(C)
; DEC B
; IN A,(C)
@ -647,7 +679,9 @@ CD_MEDIA_CHANGED_ERROR:
LD DE,SYS_PAGE.SHARED_BUFFER_256b
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
JR NZ,.exit
;
@ -659,17 +693,23 @@ CD_MEDIA_CHANGED_ERROR:
AND A
JR NZ,.exit
;
LD A,(IY + IDE.HDD_INIT_TABLE.RemovableMedia)
LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
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 DE,SYS_PAGE.TMP_BUFFER
CALL EXEC_PACKET_COMMAND
CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF
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
LD (IY+IDE.HDD_INIT_TABLE.SectorSize + 1),L
@ -680,6 +720,12 @@ CD_MEDIA_CHANGED_ERROR:
SCF
RET
;
.Not_Ready: POP AF
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.NotReady
SCF
RET
;
.exit: POP AF
OUT (SLOT3),A
; CF=0
@ -687,7 +733,10 @@ CD_MEDIA_CHANGED_ERROR:
RET
;----------------------------------------------------------------------;
; SELECT_DRIVE ¤®«¦¥­ ®âà ¡®â âì § à ­¥¥
EXEC_NOP_CMD: LD HL,ATAPI_CMD_PACKET.NOP
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
JP EXEC_PACKET_COMMAND.start
////////////////////////////////////////////////////////////////////////
ATAPI_CMD_PACKET:
@ -734,17 +783,17 @@ ATAPI_PACKET:
////////////////////////////////////////////////////////////////////////
;
; E - Second * 10
; PAUSE LD HL,#0000
; PAUSE LD HL,#0000
; PAUSE1 DEC L
; JR NZ,PAUSE1
; DEC H
; JR NZ,PAUSE1
; DEC E
; JR NZ,PAUSE1
; RET
; JR NZ,PAUSE1
; DEC H
; JR NZ,PAUSE1
; DEC E
; JR NZ,PAUSE1
; RET
;
/*
᫨ «®¢¨âáï ®è¨¡ª  media changed, â® ¡¨®á ¤®«¦¥­ ¢ëáâ ¢«ïâì ¢ HDD_INIT_TABLE.RemovableMedia = 3
᫨ «®¢¨âáï ®è¨¡ª  media changed, â® ¡¨®á ¤®«¦¥­ ¢ëáâ ¢«ïâì ¢ HDD_INIT_TABLE.MediaParameters = 3
¨ § â¨à âì FF SectorSize.
®á ¯®á«¥ ¯®«ã祭¨ï â ª®© ®è¨¡ª¨ ¤®«¦¥­ ¢ë§ë¢ âì BIOS.DRV_DETECT ¨ ¥á«¨ ¢áñ ŽŠ, â® ReScanDRV
*/

View File

@ -99,7 +99,7 @@ HDD_5x_RESET: ; !FIXIT
; DE - Cylinders
; IX - Capacity sector in bytes
; B - Flags: MASTER/SLAVE, LBA/CHS
HDD_5x_GETMED:
HDD_5x_GET_PAR:
LD C,IDE.Device.HDD
CALL SELECT_DRIVE
RET C
@ -107,13 +107,13 @@ HDD_5x_GETMED:
EX AF,AF'
LD A,SYS_PAGE
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 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 IX,512 ;!HARDCODE sector size
LD IX,512 ;!HARDCODE ; [ ] sector size
EX AF,AF'
OUT (SLOT3),A
EX AF,AF'
@ -129,7 +129,7 @@ HDD_5x_GETMED:
; IX - Capacity sector in bytes
; B - Flags
;Return: None
HDD_5x_SETMED:
HDD_5x_SET_PAR:
LD C,IDE.Device.HDD
CALL SELECT_DRIVE
RET C
@ -143,6 +143,7 @@ HDD_5x_SETMED:
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),B
;!TODO ; [ ] sector size
;!TODO ; [ ] UnitAttention
EX AF,AF'
OUT (SLOT3),A
;EX AF,AF'
@ -674,7 +675,35 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE
; A - Disk
;Return: CF=0 - A=Drive type
; CF=1 - drive not present, A=#02
HDD_5x_DETECT:
LD C,IDE.Device.HDD
JP CD_5x_DETECT.shared
HDD_5x_DETECT: LD C,IDE.Device.HDD
.shared: CALL SELECT_DRIVE
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]

View File

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

View File

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

View File

@ -406,7 +406,7 @@ IDESPEC: IN A,(SLOT3)
LD A,(IDENTIFY_DEVICE_BUFFER.GeneralConfiguration)
RLCA
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 (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
@ -444,18 +444,28 @@ IDESPEC: IN A,(SLOT3)
LD HL,ICHANEL
OR (HL)
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
LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à ­  8 ¡ ©â®¢
CALL EXEC_PACKET_COMMAND
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF
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
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
/////////////////////////////////////////////////////////////////////[^]