ATAPI media change ¢த¥ OK

This commit is contained in:
Tolik 2025-02-06 04:12:47 +10:00
parent 0749fd92b5
commit a2022a4c6f
5 changed files with 283 additions and 232 deletions

@ -1 +1 @@
Subproject commit b3224fc3afac71c6b1d461ff54049e58657bbe5a Subproject commit 237dd36651b4af124f12d3f1eaee3688467f8fa3

View File

@ -524,15 +524,15 @@ TAB_5xFNS:
;-------------------------------------------------------------[ ATA #8 ] ;-------------------------------------------------------------[ ATA #8 ]
; ;
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
DB low HDD_5x_RESET DB low ATA_5x_RESET
DB low HDD_5x_LONG_READ DB low ATA_5x_LONG_READ
DB low HDD_5x_LONG_WRITE DB low ATA_5x_LONG_WRITE
DB low HDD_5x_VERIFY DB low ATA_5x_VERIFY
DB low HDD_5x_READ DB low ATA_5x_READ
DB low HDD_5x_WRITE DB low ATA_5x_WRITE
DB low HDD_5x_DETECT DB low ATA_5x_DETECT
DB low HDD_5x_GET_PAR DB low ATA_5x_GET_PAR
DB low HDD_5x_SET_PAR DB low ATA_5x_SET_PAR
DB low DRV_VERSION DB low DRV_VERSION
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
@ -549,21 +549,21 @@ TAB_5xFNS:
;-----------------------------------------------------------[ ATAPI #C ] ;-----------------------------------------------------------[ ATAPI #C ]
; ;
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
DB low CD_5x_RESET DB low ATAPI_5x_RESET
DB low CD_5x_LONG_READ DB low ATAPI_5x_LONG_READ
DB low CD_5x_LONG_WRITE ; [ ] new DB low ATAPI_5x_LONG_WRITE ; [ ] new
DB low FN_ABSENT_5x ; VERIFY DB low FN_ABSENT_5x ; VERIFY
DB low CD_5x_READ DB low ATAPI_5x_READ
DB low CD_5x_WRITE ; [ ] new DB low ATAPI_5x_WRITE ; [ ] new
DB low CD_5x_DETECT DB low ATAPI_5x_DETECT
DB low CD_5x_GET_PAR ; [ ] new DB low ATAPI_5x_GET_PAR ; [ ] new
DB low FN_ABSENT_5x ; SETMED DB low FN_ABSENT_5x ; SETMED
DB low DRV_VERSION DB low DRV_VERSION
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
DB low FN_RESERVED_5x DB low FN_RESERVED_5x
DB low CD_5x_Extended ;[ ] media changed? ;!TODO DB low ATAPI_5x_Extended ;[ ] media changed? ;!TODO
DB low DRV_LIST DB low DRV_LIST
;---------------------------------------------------------------------[] ;---------------------------------------------------------------------[]
@ -627,15 +627,15 @@ TAB_5xFNS:
;-------------------------------------------------------------[ ATA #8 ] ;-------------------------------------------------------------[ ATA #8 ]
; ;
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
DB high HDD_5x_RESET DB high ATA_5x_RESET
DB high HDD_5x_LONG_READ DB high ATA_5x_LONG_READ
DB high HDD_5x_LONG_WRITE DB high ATA_5x_LONG_WRITE
DB high HDD_5x_VERIFY DB high ATA_5x_VERIFY
DB high HDD_5x_READ DB high ATA_5x_READ
DB high HDD_5x_WRITE DB high ATA_5x_WRITE
DB high HDD_5x_DETECT DB high ATA_5x_DETECT
DB high HDD_5x_GET_PAR DB high ATA_5x_GET_PAR
DB high HDD_5x_SET_PAR DB high ATA_5x_SET_PAR
DB high DRV_VERSION DB high DRV_VERSION
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
@ -652,21 +652,21 @@ TAB_5xFNS:
;-----------------------------------------------------------[ ATAPI #C ] ;-----------------------------------------------------------[ ATAPI #C ]
; ;
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
DB high CD_5x_RESET DB high ATAPI_5x_RESET
DB high CD_5x_LONG_READ DB high ATAPI_5x_LONG_READ
DB high CD_5x_LONG_WRITE ; LONG_WRITE ; [ ] new DB high ATAPI_5x_LONG_WRITE ; LONG_WRITE ; [ ] new
DB high FN_ABSENT_5x DB high FN_ABSENT_5x
DB high CD_5x_READ DB high ATAPI_5x_READ
DB high CD_5x_WRITE ; WRITE ; [ ] new DB high ATAPI_5x_WRITE ; WRITE ; [ ] new
DB high CD_5x_DETECT DB high ATAPI_5x_DETECT
DB high CD_5x_GET_PAR DB high ATAPI_5x_GET_PAR
DB high FN_ABSENT_5x ; SETMED DB high FN_ABSENT_5x ; SETMED
DB high DRV_VERSION DB high DRV_VERSION
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
DB high FN_RESERVED_5x DB high FN_RESERVED_5x
DB high CD_5x_Extended DB high ATAPI_5x_Extended
DB high DRV_LIST DB high DRV_LIST
;---------------------------------------------------------------------[] ;---------------------------------------------------------------------[]
@ -688,15 +688,15 @@ EXP_FNS_RST18:
EX (SP),HL EX (SP),HL
RET RET
; HDD_5x_RESET ; ATA_5x_RESET
; HDD_5x_LONG_READ ; ATA_5x_LONG_READ
; HDD_5x_LONG_WRITE ; ATA_5x_LONG_WRITE
; HDD_5x_VERIFY ; ATA_5x_VERIFY
; HDD_5x_READ ; ATA_5x_READ
; HDD_5x_WRITE ; ATA_5x_WRITE
; HDD_5x_DETECT ; ATA_5x_DETECT
; HDD_5x_GET_PAR ; ATA_5x_GET_PAR
; HDD_5x_SET_PAR ; ATA_5x_SET_PAR
; DRV_VERSION ; DRV_VERSION
; FN_RESERVED_5x ; FN_RESERVED_5x
; FN_RESERVED_5x ; FN_RESERVED_5x
@ -704,34 +704,34 @@ EXP_FNS_RST18:
; FN_RESERVED_5x ; FN_RESERVED_5x
; DRV_LIST ; DRV_LIST
FN_5x_Parser_1: ; HDD_5x_RESET FN_5x_Parser_1: ; ATA_5x_RESET
LD C,#01 LD C,#01
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_2: ; HDD_5x_LONG_READ FN_5x_Parser_2: ; ATA_5x_LONG_READ
LD C,#02 LD C,#02
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_3: ; HDD_5x_LONG_WRITE FN_5x_Parser_3: ; ATA_5x_LONG_WRITE
LD C,#03 LD C,#03
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_4: ; HDD_5x_VERIFY FN_5x_Parser_4: ; ATA_5x_VERIFY
LD C,#04 LD C,#04
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_6: ; HDD_5x_WRITE FN_5x_Parser_6: ; ATA_5x_WRITE
LD C,#06 LD C,#06
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_7: ; HDD_5x_DETECT FN_5x_Parser_7: ; ATA_5x_DETECT
LD C,#07 LD C,#07
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_8: ; HDD_5x_GET_PAR FN_5x_Parser_8: ; ATA_5x_GET_PAR
LD C,#08 LD C,#08
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_9: ; HDD_5x_SET_PAR FN_5x_Parser_9: ; ATA_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
LD C,#0E LD C,#0E
JP FN_5x_Parser JP FN_5x_Parser
FN_5x_Parser_5: ; HDD_5x_READ FN_5x_Parser_5: ; ATA_5x_READ
LD C,5 LD C,5
FN_5x_Parser: FN_5x_Parser:
PUSH HL PUSH HL

View File

@ -23,17 +23,17 @@ MAX_DATA_PACKET_FOR_REQUEST_SENSE EQU 254
;[]================================================================[#51] ;[]================================================================[#51]
;!FIXIT ᤥ« âì ­ áâ®ï騩 à¥á¥â ;!FIXIT ᤥ« âì ­ áâ®ï騩 à¥á¥â
CD_5x_RESET: LD C,IDE.Device.ATAPI ATAPI_5x_RESET: LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
LD B,50 LD B,50
.loop: PUSH BC .loop: PUSH BC
CALL EXEC_NOP_CMD CALL EXEC_TEST_CMD
;!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.noWait CALL ATAPI_CHECK_MEDIA_CHANGED.noWait
RET C RET C
; ;
EI EI
@ -55,27 +55,31 @@ CD_5x_RESET: LD C,IDE.Device.ATAPI
; [ ] A - HDD_INIT_TABLE.MediaParameters ; [ ] A - HDD_INIT_TABLE.MediaParameters
; IF media changed ; IF media changed
; [ ] CF' = 1, A' = error number UnitAttention ; [ ] CF' = 1, A' = error number UnitAttention
CD_5x_GET_PAR: LD C,IDE.Device.ATAPI ATAPI_5x_GET_PAR:
LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
; ;
IN A,(SLOT3) .DriveSelected: IN A,(SLOT3)
AND A AND A
EX AF,AF' EX AF,AF'
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
; ;
; [ ] sector size. media changed ; [ ] sector size. media changed
CALL CD_CHECK_MEDIA_CHANGED CALL ATAPI_CHECK_MEDIA_CHANGED
JR NC,.get_data JR NC,.get_data
; ;
CP BIOS.Error.ATAPI.NotReady CP BIOS.Error.ATAPI.UnitAttention
;LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) JR Z,.UnitAttention
SCF ;
JR NZ,.UnitAttention ;CP BIOS.Error.ATAPI.NotReady
;SCF
;RET NZ
LD HL,#FFFF LD HL,#FFFF
LD D,H LD D,H
LD E,L LD E,L
SCF
RET RET
; ;
.UnitAttention: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media .UnitAttention: RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media
@ -115,7 +119,7 @@ CD_5x_GET_PAR: LD C,IDE.Device.ATAPI
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S) ;READ SECTOR(S)
CD_5x_READ: EX AF,AF' ATAPI_5x_READ: EX AF,AF'
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
;[]================================================================[#52] ;[]================================================================[#52]
@ -129,7 +133,7 @@ CD_5x_READ: EX AF,AF'
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;LONG READ SECTOR(S) ;LONG READ SECTOR(S)
CD_5x_LONG_READ: ATAPI_5x_LONG_READ:
AND A AND A
; ;
PUSH IY PUSH IY
@ -143,10 +147,10 @@ CD_5x_LONG_READ:
EX AF,AF' EX AF,AF'
CALL RW_ATAPI_SECTORs CALL RW_ATAPI_SECTORs
; [ ] sector size. media changed ; [ ] sector size. media changed
JP HDD_5x_LONG_READ.shared JP ATA_5x_LONG_READ.shared
; JP NC,HDD_5x_LONG_READ.shared ; JP NC,ATA_5x_LONG_READ.shared
; CP BIOS.Error.UnitAttention ; CP BIOS.Error.UnitAttention
; JR Z,CD_MEDIA_CHANGED_ERROR ; JR Z,ATAPI_MEDIA_ERROR
; SCF ; SCF
;[]================================================================[#52] ;[]================================================================[#52]
; INPUT: ; INPUT:
@ -226,10 +230,9 @@ RW_ATAPI_SECTORs:
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S) ;WRITE SECTOR(S)
CD_5x_WRITE: ATAPI_5x_WRITE: EX AF,AF'
EX AF,AF' IN A,(SLOT3)
IN A,(SLOT3) EX AF,AF'
EX AF,AF'
;[]================================================================[#53] ;[]================================================================[#53]
;Function: Long Write Sectors ;Function: Long Write Sectors
; A - Disk ; A - Disk
@ -241,7 +244,7 @@ CD_5x_WRITE:
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S) ;WRITE SECTOR(S)
CD_5x_LONG_WRITE: ATAPI_5x_LONG_WRITE:
AND A AND A
; ;
PUSH IY PUSH IY
@ -255,7 +258,7 @@ CD_5x_LONG_WRITE:
EX AF,AF' EX AF,AF'
CALL RW_ATAPI_SECTORs CALL RW_ATAPI_SECTORs
; ;
JP HDD_5x_LONG_READ.shared JP ATA_5x_LONG_READ.shared
;[]================================================================[#57] ;[]================================================================[#57]
;Function: Detect Disk ;Function: Detect Disk
@ -263,7 +266,7 @@ CD_5x_LONG_WRITE:
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type
; B=MediaParameters byte ; [ ] media change ; 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 ; ATAPI_5x_DETECT: LD C,IDE.Device.ATAPI
; AND %1011'1111 ; AND %1011'1111
; .shared: LD D,A ; .shared: LD D,A
; LD E,C ; LD E,C
@ -295,7 +298,7 @@ CD_5x_LONG_WRITE:
; LD A,D ; LD A,D
; LD C,E ; LD C,E
; CALL SELECT_DRIVE ; CALL SELECT_DRIVE
; CALL CD_CHECK_MEDIA_CHANGED ; CALL ATAPI_CHECK_MEDIA_CHANGED
; JR NC,.exit ; JR NC,.exit
; POP BC ; POP BC
; RET ; RET
@ -311,8 +314,9 @@ CD_5x_LONG_WRITE:
;Return: CF=0 - A=Drive type ;Return: CF=0 - A=Drive type
; B=MediaParameters byte ; [ ] media change ; 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 ATAPI_5x_DETECT:
JP HDD_5x_DETECT.shared LD C,IDE.Device.ATAPI
JP ATA_5x_DETECT.shared
;[]================================================================[#57] ;[]================================================================[#57]
;[]================================================================[#5E] ;[]================================================================[#5E]
@ -322,7 +326,7 @@ CD_5x_DETECT: LD C,IDE.Device.ATAPI
; B - SubFunction ; B - SubFunction
;Return: ;Return:
; ;
CD_5x_Extended: ATAPI_5x_Extended:
LD C,IDE.Device.ATAPI LD C,IDE.Device.ATAPI
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
@ -331,7 +335,7 @@ CD_5x_Extended:
CP 2 CP 2
JR C,TRAY_FN ; B = 0 ¨«¨ 1 JR C,TRAY_FN ; B = 0 ¨«¨ 1
; ;
JR Z,CD_REQUEST_SENSE ; B = 2 JR Z,ATAPI_REQUEST_SENSE ; B = 2
; ... ; ...
; ... ; ...
;LD A,#AA ;LD A,#AA
@ -342,23 +346,24 @@ CD_5x_Extended:
;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API ;----------------------------------------------------------------------;!TODO ᤥ« âì ¤®áâ㯭®© ç¥à¥§ à áè¨à¥­­ãî äã­ªæ¨î API
; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå ; ¢å®¤: DE -  ¤à¥á ¤«ï ¤ ­­ëå
CD_REQUEST_SENSE: ATAPI_REQUEST_SENSE:
LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE LD HL,ATAPI_CMD_PACKET.REQUEST_SENSE
JR EXEC_PACKET_COMMAND.start JR EXEC_PACKET_COMMAND.start
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;[ ] media changed ;[ ] media changed
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_CHECK_MEDIA_CHANGED: ATAPI_CHECK_MEDIA_CHANGED:
CALL EXEC_NOP_CMD ;!FIXIT   ¬®¦¥â ¨ ­¥ ­ ¤® CALL EXEC_TEST_CMD ;!FIXIT   ¬®¦¥â ¨ ­¥ ­ ¤®
RET C
; .skip_nop: EXX ; .skip_nop: EXX
; CALL CD_WAITPRT ; CALL ATAPI_WAITPRT
; EXX ; EXX
; LD A, high IDE.Read.Status ; LD A, high IDE.Read.Status
; IN A,(low IDE.Read.Status) ; IN A,(low IDE.Read.Status)
; RRA ; RRA
; ;RET NC ; ;RET NC
JR C,.noWait ;JR C,.noWait
; ;
EXX EXX
LD C,SLOT3 LD C,SLOT3
@ -375,12 +380,25 @@ CD_CHECK_MEDIA_CHANGED:
RET RET
; ;
.noWait: EXX .noWait: EXX
CALL CD_GET_ERROR ;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 OR #70
EXX EXX
CP BIOS.Error.ATAPI.NoSence CP BIOS.Error.ATAPI.NoSence
JP Z,CD_MEDIA_CHANGED_ERROR JP Z,ATAPI_MEDIA_ERROR
;SCF ; !FIXIT ᪮॥ ¢á¥£® ¦¥«¥§® âã⠢뤠á⠢ᥣ¤  Error.ATAPI.NoSence
CP BIOS.Error.ATAPI.NotReady
JP Z,ATAPI_MEDIA_ERROR
CP BIOS.Error.ATAPI.UnitAttention
JP Z,ATAPI_MEDIA_ERROR
;
SCF
RET RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
@ -420,10 +438,10 @@ EXEC_PACKET_COMMAND:
LD A,BIOS.Error.ATAPI.TimeOut LD A,BIOS.Error.ATAPI.TimeOut
SCF SCF
RET RET
; .CMD_ERROR: CALL CD_GET_ERROR ; .CMD_ERROR: CALL ATAPI_GET_ERROR
; OR #70 ; OR #70
; CP BIOS.Error.UnitAttention ; CP BIOS.Error.UnitAttention
; CALL Z,CD_MEDIA_CHANGED_ERROR ; CALL Z,ATAPI_MEDIA_ERROR
; ;LD BC,IDE.Read.Error ;ERROR ; ;LD BC,IDE.Read.Error ;ERROR
; ;IN A,(C) ; ;IN A,(C)
; ;RRCA ; ;RRCA
@ -435,7 +453,7 @@ EXEC_PACKET_COMMAND:
; RET ; RET
; ;
.start: EXX .start: EXX
CALL CD_WAITPRT CALL ATAPI_WAITPRT
EXX EXX
JR NC,.READY JR NC,.READY
; ;
@ -447,10 +465,9 @@ EXEC_PACKET_COMMAND:
.pause: DJNZ .pause .pause: DJNZ .pause
; ;
EXX EXX
CALL CD_WAITPRT CALL ATAPI_WAITPRT
EXX EXX
JR C,.error JR C,.error
;JR C,CD_CHECK_MEDIA_CHANGED.noWait
; ;
.READY: LD C,SLOT3 .READY: LD C,SLOT3
IN B,(C) IN B,(C)
@ -479,14 +496,13 @@ EXEC_PACKET_COMMAND:
LD BC,IDE.Write.Command LD BC,IDE.Write.Command
LD A,IDE.ATAPI.Packet LD A,IDE.ATAPI.Packet
OUT (C),A OUT (C),A
CALL CD_WAITPRT CALL ATAPI_WAITPRT
EXX EXX
JR C,.error JR C,.error
;JR C,CD_CHECK_MEDIA_CHANGED.noWait
; ;
EXX EXX
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 ATAPI_WAITPRT.Custom
EXX EXX
JR C,.error_TimeOut JR C,.error_TimeOut
; ;
@ -523,24 +539,22 @@ EXEC_PACKET_COMMAND:
EX AF,AF' ;>-----------> \ EX AF,AF' ;>-----------> \
; ;
EXX EXX
CALL CD_WAITPRT CALL ATAPI_WAITPRT
EXX EXX
JP C,.error JP C,.error
; ; [ ] media change.   ­ ¤® «¨ âãâ? ;!FIXIT «ãçè¥ ¡«®ª¨à®¢ âì ­®á¨â¥«ì
LD A,high IDE.Read.Status LD A,high IDE.Read.Status
IN A,(low IDE.Read.Status) IN A,(low IDE.Read.Status)
; ;
BIT IDE.CtrlBit.Error,A AND IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error
JP NZ,CD_CHECK_MEDIA_CHANGED.noWait RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
; RRA ; Checking IDE.CtrlByte.CheckCondition
AND IDE.CtrlByte.DataRequest JP C,ATAPI_CHECK_MEDIA_CHANGED.noWait
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
;
LD A,XH
OUT (SLOT3),A
; ;
;====== IF DATA REQUEST =======================================; ;====== IF DATA REQUEST =======================================;
; ;
LD A,XH
OUT (SLOT3),A
EX DE,HL EX DE,HL
LD BC,IDE.Read.ByteCountLow LD BC,IDE.Read.ByteCountLow
IN E,(C) IN E,(C)
@ -626,21 +640,21 @@ EXEC_PACKET_COMMAND:
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_GET_ERROR: LD BC,IDE.Read.Error ;ERROR ; ATAPI_GET_ERROR: XOR A ;LD BC,IDE.Read.Error
IN A,(C) ; IN A,(IDE.Read.Error) ;IN A,(C)
RRCA ; RRCA
RRCA ; RRCA
RRCA ; RRCA
RRCA ; RRCA
AND #0F ; AND #0F
RET ; RET
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; D - MASK, E - PATTERN ; D - MASK, E - PATTERN
CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0 ATAPI_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
.Custom: LD B,100 .Custom: LD B,100
LD HL,#0000 LD HL,#0000
.LOOP: LD A,high IDE.Read.Status .LOOP: LD A,high IDE.Read.Status
@ -663,35 +677,35 @@ CD_WAITPRT: LD DE,256*IDE.CtrlByte.Busy + 0
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP ; ATAPI_TEST: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
; LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“ ; LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
; JP EXEC_PACKET_COMMAND ; JP EXEC_PACKET_COMMAND
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
CD_MEDIA_CHANGED_ERROR: ATAPI_MEDIA_ERROR:
IN A,(SLOT3) IN A,(SLOT3)
PUSH AF PUSH AF
LD A,SYS_PAGE LD A,SYS_PAGE
OUT (SLOT3),A OUT (SLOT3),A
; ;
LD DE,SYS_PAGE.SHARED_BUFFER_256b LD DE,SYS_PAGE.SHARED_BUFFER_256b
CALL CD_REQUEST_SENSE CALL ATAPI_REQUEST_SENSE
; ;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION LD A,(SYS_PAGE.SHARED_BUFFER_256b + 2) ; SenceKey. 06 - UNIT ATTENTION
CP 2 ; SenceKey. 02 - NOT READY CP 2 ; SenceKey. 02 - NOT READY
JR Z,.Not_Ready JR Z,.Not_Ready
CP 6 CP 6
JR NZ,.exit JR NZ,.unkn_error
; ;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey. #28 LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey. #28
CP #28 CP #28
JR NZ,.exit JR NZ,.unkn_error
; ;
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier. 0 LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier. 0
AND A AND A
JR NZ,.exit JR NZ,.unkn_error
; ;
LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters) LD A,(IY + IDE.HDD_INIT_TABLE.MediaParameters)
OR %0000'0011 OR %0000'0011
@ -701,6 +715,7 @@ CD_MEDIA_CHANGED_ERROR:
LD DE,SYS_PAGE.TMP_BUFFER LD DE,SYS_PAGE.TMP_BUFFER
CALL EXEC_PACKET_COMMAND.start CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF LD HL,#FFFF
LD C,BIOS.Error.ATAPI.MediumError
JR C,.No_Media JR C,.No_Media
; ;
LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high LD HL,(SYS_PAGE.TMP_BUFFER) ; media size high
@ -711,70 +726,73 @@ CD_MEDIA_CHANGED_ERROR:
LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L LD (IY+IDE.HDD_INIT_TABLE.MediaSizeLow+1),L
LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size LD HL,(SYS_PAGE.TMP_BUFFER + 6) ; sector size
; ;
LD C,BIOS.Error.ATAPI.UnitAttention
.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
; ;
POP AF
OUT (SLOT3),A
LD A,BIOS.Error.ATAPI.UnitAttention
SCF
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 LD A,C
;AND A SCF
RET RET
;
.Not_Ready: LD A,(SYS_PAGE.SHARED_BUFFER_256b + 12) ; AdditionalSenceKey
LD C,BIOS.Error.ATAPI.MediumError ; ­¥â ­®á¨â¥«ï
CP 4
JR NZ,.exit
; [ ] !(test for ZIP)
LD A,(SYS_PAGE.SHARED_BUFFER_256b + 13) ; AdditionalSenseCodeQualifier
CP 1
JR NZ,.exit
;
; ¨¤ñâ ¨­¨æ¨ «¨§ æ¨ï
LD C,BIOS.Error.ATAPI.NotReady
JR .exit
;
.unkn_error: LD C,BIOS.Error.ATAPI.MediumError
JR .exit
;----------------------------------------------------------------------; ;----------------------------------------------------------------------;
; SELECT_DRIVE ¤®«¦¥­ ®âà ¡®â âì § à ­¥¥ ; !!! SELECT_DRIVE ¤®«¦¥­ ®âà ¡®â âì § à ­¥¥
EXEC_NOP_CMD: LD HL,ATAPI_CMD_PACKET.NOP EXEC_TEST_CMD: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“ LD DE,0 ; ¬ àª¥à ⮣®, çâ® ­¥ ­ã¦­® ç¨â âì á ãáâனá⢠ ¢ އ“
JP EXEC_PACKET_COMMAND.start JP EXEC_PACKET_COMMAND.start
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
ATAPI_CMD_PACKET: ATAPI_CMD_PACKET:
.NOP: DUP 12 .TEST_UNIT_READY: DUP 12
DB #00 DB #00
EDUP EDUP
; ;
.OPEN: DB #1B .OPEN: DB #1B
DB #00,#00,#00 DB #00,#00,#00
DB #02 DB #02
DB #00,#00,#00,#00,#00,#00,#00 DB #00,#00,#00,#00,#00,#00,#00
; ;
.CLOSE: DB #1B .CLOSE: DB #1B
DB #00,#00,#00 DB #00,#00,#00
DB #03 DB #03
DB #00,#00,#00,#00,#00,#00,#00 DB #00,#00,#00,#00,#00,#00,#00
; ;
.READ: DB #28,#00 .READ: DB #28,#00
DB #00,#00,#00,#00 ; sector dword DB #00,#00,#00,#00 ; sector dword
DB #00 DB #00
DB #00,#01,#00,#00 ; counter dword DB #00,#01,#00,#00 ; counter dword
DB #00 DB #00
; ;
.WRITE: DB #2E,#00 .WRITE: DB #2E,#00
DB #00,#00,#00,#00 ; sector dword DB #00,#00,#00,#00 ; sector dword
DB #00 DB #00
DB #00,#01,#00,#00 ; counter dword DB #00,#01,#00,#00 ; counter dword
DB #00 DB #00
; ;
.READ_CAPACITY_DATA: .READ_CAPACITY_DATA: DB #25
DB #25 BLOCK 11,0
BLOCK 11,0
; ;
.REQUEST_SENSE: .REQUEST_SENSE: DB #03
DB #03 DB #00,#00,#00
DB #00,#00,#00 DB MAX_DATA_PACKET_FOR_REQUEST_SENSE
DB MAX_DATA_PACKET_FOR_REQUEST_SENSE DB #00,#00,#00,#00,#00,#00,#00
DB #00,#00,#00,#00,#00,#00,#00
; ;
ATAPI_PACKET: ATAPI_PACKET:

View File

@ -78,7 +78,7 @@ WRITE_OUTI_DUPs EQU 32 ; bytes
;[]================================================================[#51] ;[]================================================================[#51]
;Function: Reset drive ;Function: Reset drive
HDD_5x_RESET: ; !FIXIT ­¥ à¥á¥â¨âáï? ATA_5x_RESET: ; !FIXIT ­¥ à¥á¥â¨âáï?
;For non-ATAPI drives, the only method a driver has of resetting a drive ;For non-ATAPI drives, the only method a driver has of resetting a drive
; after a major error is to do a "software reset" on the bus. ; after a major error is to do a "software reset" on the bus.
; Set bit 2 (SRST, value = 4) in the proper Control Register for the ; Set bit 2 (SRST, value = 4) in the proper Control Register for the
@ -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_GET_PAR: ATA_5x_GET_PAR:
LD C,IDE.Device.HDD LD C,IDE.Device.HDD
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
@ -129,7 +129,7 @@ HDD_5x_GET_PAR:
; IX - Capacity sector in bytes ; IX - Capacity sector in bytes
; B - Flags ; B - Flags
;Return: None ;Return: None
HDD_5x_SET_PAR: ATA_5x_SET_PAR:
LD C,IDE.Device.HDD LD C,IDE.Device.HDD
CALL SELECT_DRIVE CALL SELECT_DRIVE
RET C RET C
@ -161,7 +161,7 @@ HDD_5x_SET_PAR:
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;READ SECTOR(S) ;READ SECTOR(S)
HDD_5x_READ: ATA_5x_READ:
EX AF,AF' EX AF,AF'
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
@ -177,7 +177,7 @@ HDD_5x_READ:
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
; A' - Last mem page in RAM Block used for readed data ; A' - Last mem page in RAM Block used for readed data
;LONG READ SECTOR(S) ;LONG READ SECTOR(S)
HDD_5x_LONG_READ: ATA_5x_LONG_READ:
PUSH IY PUSH IY
SAFE_PORTY_2 SAFE_PORTY_2
PUSH BC PUSH BC
@ -245,7 +245,7 @@ HDD_5x_LONG_READ:
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S) ;WRITE SECTOR(S)
HDD_5x_WRITE: ATA_5x_WRITE:
EX AF,AF' EX AF,AF'
IN A,(SLOT3) IN A,(SLOT3)
EX AF,AF' EX AF,AF'
@ -260,7 +260,7 @@ HDD_5x_WRITE:
; HL:IX - Sector + Sector counter ; HL:IX - Sector + Sector counter
; DE - Address + (Sector counter * Size sector) ; DE - Address + (Sector counter * Size sector)
;WRITE SECTOR(S) ;WRITE SECTOR(S)
HDD_5x_LONG_WRITE: ATA_5x_LONG_WRITE:
PUSH IY PUSH IY
SAFE_PORTY_2 SAFE_PORTY_2
PUSH BC PUSH BC
@ -272,7 +272,7 @@ HDD_5x_LONG_WRITE:
EX AF,AF' EX AF,AF'
CALL RW_ATA_SECTORs CALL RW_ATA_SECTORs
; ;
JP HDD_5x_LONG_READ.shared JP ATA_5x_LONG_READ.shared
/* /*
EX DE,HL EX DE,HL
JP C,.error JP C,.error
@ -525,7 +525,7 @@ WRITE_ATA_SECTORs:
; B - Sector counter ; B - Sector counter
;Return: None ;Return: None
;VERIFY SECTOR(S) ;VERIFY SECTOR(S)
HDD_5x_VERIFY: PUSH IY ATA_5x_VERIFY: PUSH IY
SAFE_PORTY_2 SAFE_PORTY_2
PUSH IX PUSH IX
PUSH HL PUSH HL
@ -671,11 +671,12 @@ WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE
;[]================================================================[#57] ;[]================================================================[#57]
;[x] 18/12/2023. ¤®¡ ¢«¥­¨¥/¤®¯¨«¨¢ ­¨¥ API CD-ROM (ATAPI) ;[x] 18/12/2023. ¤®¡ ¢«¥­¨¥/¤®¯¨«¨¢ ­¨¥ API CD-ROM (ATAPI)
; [ ] media change
;Function: Detect Disk ;Function: Detect Disk
; 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 - error
HDD_5x_DETECT: LD C,IDE.Device.HDD ATA_5x_DETECT: LD C,IDE.Device.HDD
.shared: CALL SELECT_DRIVE .shared: CALL SELECT_DRIVE
RET C RET C
; ;
@ -691,13 +692,13 @@ HDD_5x_DETECT: LD C,IDE.Device.HDD
LD A,C LD A,C
CP IDE.Device.ATAPI CP IDE.Device.ATAPI
JR Z,.AtapiCheckMedia JR Z,.AtapiCheckMedia
;!FIXIT AtaCheckMedia - ­¥ ᤥ« ­® ;!FIXIT AtaCheckMedia - ­¥ ᤥ« ­® ; [ ] media change
AND A AND A
RET RET
; ;
.AtapiCheckMedia: .AtapiCheckMedia:
PUSH BC ; B - MediaParameters, C - DriveType PUSH BC ; B - MediaParameters, C - DriveType
CALL CD_CHECK_MEDIA_CHANGED CALL ATAPI_CHECK_MEDIA_CHANGED
POP BC ; B - MediaParameters, C - DriveType POP BC ; B - MediaParameters, C - DriveType
RET C RET C
LD A,C LD A,C

View File

@ -103,29 +103,29 @@ WAIT:
.ERROR EQU #0400 .ERROR EQU #0400
ENDMODULE ENDMODULE
WAIT_IDE EQU #0000 ; WAIT_IDE EQU #0000
WAIT_SML EQU #1000 ; WAIT_SML EQU #1000
WAIT_ERROR EQU #0400 ; WAIT_ERROR EQU #0400
M_CYLL EQU #12 ; M_CYLL EQU #12
M_CYLH EQU #13 ; M_CYLH EQU #13
M_HEAD EQU #14 ; M_HEAD EQU #14
M_SECT EQU #15 ; M_SECT EQU #15
S_CYLL EQU #16 ; S_CYLL EQU #16
S_CYLH EQU #17 ; S_CYLH EQU #17
S_HEAD EQU #18 ; S_HEAD EQU #18
S_SECT EQU #19 ; S_SECT EQU #19
SM_CYLL EQU #37 ; SM_CYLL EQU #37
SM_CYLH EQU #38 ; SM_CYLH EQU #38
SM_HEAD EQU #39 ; SM_HEAD EQU #39
SM_SECT EQU #3A ; SM_SECT EQU #3A
SS_CYLL EQU #3B ; SS_CYLL EQU #3B
SS_CYLH EQU #3C ; SS_CYLH EQU #3C
SS_HEAD EQU #3D ; SS_HEAD EQU #3D
SS_SECT EQU #3E ; SS_SECT EQU #3E
MACRO PAUSE_DJNZ num MACRO PAUSE_DJNZ num
IF num<255 IF num<255
@ -318,19 +318,19 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
/////////////////////////////////////////////////////////////////////[v] /////////////////////////////////////////////////////////////////////[v]
SETUP_FROM_CMOS: SETUP_FROM_CMOS:
LD A,H LD A,H
LD IX,PRIM_MASTER_CMOS_T LD IX,PRIM_MASTER_CMOS_TABLE
OR A OR A
JR Z,.step1 JR Z,.step1
; ;
LD IX,PRIM_SLAVE_CMOS_T LD IX,PRIM_SLAVE_CMOS_TABLE
CP 1 CP 1
JR Z,.step1 JR Z,.step1
; ;
LD IX,SEC_MASTER_CMOS_T LD IX,SEC_MASTER_CMOS_TABLE
CP 2 CP 2
JR Z,.step1 JR Z,.step1
; ;
LD IX,SEC_SLAVE_CMOS_T LD IX,SEC_SLAVE_CMOS_TABLE
.step1: LD HL,IDENTIFY_DEVICE_BUFFER .step1: LD HL,IDENTIFY_DEVICE_BUFFER
LD DE,IDENTIFY_DEVICE_BUFFER+1 LD DE,IDENTIFY_DEVICE_BUFFER+1
LD BC,511 LD BC,511
@ -344,21 +344,21 @@ SETUP_FROM_CMOS:
CALL BITS_WAITS.Clear_BUSY CALL BITS_WAITS.Clear_BUSY
JR C,AUTODETECTING.IDE_ABSENT JR C,AUTODETECTING.IDE_ABSENT
; ;
.step2: LD A,(IX+2) ;M_HEAD .step2: LD A,(IX + IDE_CMOS_TABLE.Heads)
CALL READCMS CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A
; ;
LD A,(IX+1) ;M_CYLH LD A,(IX + IDE_CMOS_TABLE.CylindersHigh)
CALL READCMS CALL READCMS
PUSH AF PUSH AF
; ;
LD A,(IX+0) ;M_CYLL LD A,(IX + IDE_CMOS_TABLE.CylindersLow)
CALL READCMS CALL READCMS
POP HL POP HL
LD L,A LD L,A
LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL
; ;
LD A,(IX+3) ;M_SECT LD A,(IX + IDE_CMOS_TABLE.Sectors)
CALL READCMS CALL READCMS
LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A
; ;
@ -445,14 +445,30 @@ IDESPEC: IN A,(SLOT3)
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 (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à ;!FIXIT ᤥ« âì æ¨ª« á® áçñâ稪®¬
.get_error_loop: LD HL,ATAPI_CMD_PACKET.TEST_UNIT_READY
CALL EXEC_PACKET_COMMAND.start CALL EXEC_PACKET_COMMAND.start
JR NC,.s_size
;
CP BIOS.Error.ATAPI.NotReady
JR Z,.get_error_loop
;
RES 1,(IY + IDE.HDD_INIT_TABLE.MediaParameters) ; [ ] removable media
CP BIOS.Error.ATAPI.UnitAttention
JR Z,IDESPEC.END
; «î¡ ï ­¥¯®­ïâ­ ï ®è¨¡ª  - ­¥â ­®á¨â¥«ï
SCF
JR .set_sector
;
; 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 .s_size: LD HL,ATAPI_CMD_PACKET.READ_CAPACITY_DATA
LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à LD DE,IDENTIFY_DEVICE_BUFFER.ReservedWord224 ; ¯à®áâ® ­ã¦¥­ ¡ë« ¡ãä¥à
CALL EXEC_PACKET_COMMAND.start CALL EXEC_PACKET_COMMAND.start
LD HL,#FFFF .set_sector: LD HL,#FFFF
JR C,.No_Media JR C,.No_Media
; ;
LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224) ; media size high LD HL,(IDENTIFY_DEVICE_BUFFER.ReservedWord224) ; media size high
@ -465,7 +481,7 @@ IDESPEC: IN A,(SLOT3)
; ;
.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.MediaParameters),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable ;LD (IY+IDE.HDD_INIT_TABLE.MediaParameters),%0000'0001 ; !HARDCODE ATAPI ¯®ª  ¢á¥£¤  removable
; ;
JR IDESPEC.END JR IDESPEC.END
/////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[^]
@ -624,37 +640,37 @@ SaveToCMOS:
EX AF,AF' EX AF,AF'
;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) ;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
AND %0001'0001 AND %0001'0001
LD IX,PRIM_MASTER_CMOS_T LD IX,PRIM_MASTER_CMOS_TABLE
JR Z,.save_to_cmos JR Z,.save_to_cmos
; ;
DEC A DEC A
LD IX,SEC_MASTER_CMOS_T LD IX,SEC_MASTER_CMOS_TABLE
JR Z,.save_to_cmos JR Z,.save_to_cmos
; ;
CP %0001'0000 CP %0001'0000
LD IX,SEC_SLAVE_CMOS_T LD IX,SEC_SLAVE_CMOS_TABLE
JR Z,.save_to_cmos JR Z,.save_to_cmos
; ;
LD IX,PRIM_SLAVE_CMOS_T LD IX,PRIM_SLAVE_CMOS_TABLE
.save_to_cmos: .save_to_cmos:
LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders) LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders)
LD B,L LD B,L
LD A,(IX+0) LD A,(IX + IDE_CMOS_TABLE.CylindersLow)
CALL WRITCMS ; Cylinder low CALL WRITCMS
LD B,H LD B,H
LD A,(IX+1) LD A,(IX + IDE_CMOS_TABLE.CylindersHigh)
CALL WRITCMS ; Cylinder high CALL WRITCMS
LD A,(IDENTIFY_DEVICE_BUFFER.NumHeads) LD A,(IDENTIFY_DEVICE_BUFFER.NumHeads)
LD B,A LD B,A
LD A,(IX+2) LD A,(IX + IDE_CMOS_TABLE.Heads)
CALL WRITCMS ; Heads CALL WRITCMS ; Heads
LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack)
LD B,A LD B,A
LD A,(IX+3) LD A,(IX + IDE_CMOS_TABLE.Sectors)
JP WRITCMS ; Heads JP WRITCMS
/////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[^]
@ -900,16 +916,32 @@ SetUP_CHANELS:
; JP IDE_CMD ; JP IDE_CMD
/////////////////////////////////////////////////////////////////////[^] /////////////////////////////////////////////////////////////////////[^]
IDE_CMOS_TABLE:
;!FIXIT CMOS ¯¥à¥¤¥« âì ¯®¤ ­ §¢ ­¨ï ï祥ª ¨§ SP2000.inc .CylindersLow EQU 0
PRIM_MASTER_CMOS_T: .CylindersHigh EQU 1
DB M_CYLL,M_CYLH,M_HEAD,M_SECT .Heads EQU 2
PRIM_SLAVE_CMOS_T: .Sectors EQU 3
DB S_CYLL,S_CYLH,S_HEAD,S_SECT ;
SEC_MASTER_CMOS_T: PRIM_MASTER_CMOS_TABLE:
DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT DB CMOS_CELL.IDE_Setup.PriMaster.CylindersLow
SEC_SLAVE_CMOS_T: DB CMOS_CELL.IDE_Setup.PriMaster.CylindersHigh
DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT DB CMOS_CELL.IDE_Setup.PriMaster.Heads
DB CMOS_CELL.IDE_Setup.PriMaster.Sectros
PRIM_SLAVE_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.PriSlave.CylindersLow
DB CMOS_CELL.IDE_Setup.PriSlave.CylindersHigh
DB CMOS_CELL.IDE_Setup.PriSlave.Heads
DB CMOS_CELL.IDE_Setup.PriSlave.Sectros
SEC_MASTER_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.SecMaster.CylindersLow
DB CMOS_CELL.IDE_Setup.SecMaster.CylindersHigh
DB CMOS_CELL.IDE_Setup.SecMaster.Heads
DB CMOS_CELL.IDE_Setup.SecMaster.Sectros
SEC_SLAVE_CMOS_TABLE:
DB CMOS_CELL.IDE_Setup.SecSlave.CylindersLow
DB CMOS_CELL.IDE_Setup.SecSlave.CylindersHigh
DB CMOS_CELL.IDE_Setup.SecSlave.Heads
DB CMOS_CELL.IDE_Setup.SecSlave.Sectros
SKIP: BYTE #FF SKIP: BYTE #FF