промежуточное
This commit is contained in:
parent
73f9070083
commit
2927028434
@ -1 +1 @@
|
||||
Subproject commit 710aa4b5dd4b651bcb01ef5e86150b99dfe739ee
|
||||
Subproject commit ccb95c96a5684e4f99c19f96b8fcc72f7d0b8212
|
||||
@ -18,7 +18,7 @@
|
||||
DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_RESERVED_5x ;#5C - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_RESERVED_5x ;#5D - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_RESERVED_5x ;#5E - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_ABSENT_5x ;#5E
|
||||
DB high DRV_LIST ;#5F - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
EDUP
|
||||
ELSE
|
||||
@ -487,7 +487,7 @@ TAB_5xFNS:
|
||||
DB low FN_RESERVED_5x ;#5B - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB low FN_RESERVED_5x ;#5C - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB low FN_RESERVED_5x ;#5D - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB low FN_RESERVED_5x ;#5E - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB low FN_ABSENT_5x ;#5E - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB low DRV_LIST ;#5F - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
;
|
||||
;---------------------------------------------------------------------[]
|
||||
@ -513,7 +513,7 @@ TAB_5xFNS:
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_ABSENT_5x
|
||||
DB low DRV_LIST
|
||||
;---------------------------------------------------------------------[]
|
||||
|
||||
@ -538,7 +538,7 @@ TAB_5xFNS:
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_RESERVED_5x
|
||||
DB low FN_ABSENT_5x
|
||||
DB low DRV_LIST
|
||||
;---------------------------------------------------------------------[]
|
||||
|
||||
@ -551,13 +551,13 @@ TAB_5xFNS:
|
||||
DB low FN_RESERVED_5x
|
||||
DB low CD_5x_RESET
|
||||
DB low CD_5x_LONG_READ
|
||||
DB low FN_ABSENT_5x
|
||||
DB low FN_ABSENT_5x
|
||||
DB low FN_ABSENT_5x ; LONG_WRITE
|
||||
DB low FN_ABSENT_5x ; VERIFY
|
||||
DB low CD_5x_READ
|
||||
DB low FN_ABSENT_5x
|
||||
DB low FN_ABSENT_5x ; WRITE
|
||||
DB low CD_5x_DETECT
|
||||
DB low FN_ABSENT_5x
|
||||
DB low FN_ABSENT_5x
|
||||
DB low FN_ABSENT_5x ; GETMED
|
||||
DB low FN_ABSENT_5x ; SETMED
|
||||
|
||||
DB low DRV_VERSION
|
||||
DB low FN_RESERVED_5x
|
||||
@ -589,7 +589,7 @@ TAB_5xFNS:
|
||||
DB high FN_RESERVED_5x ;#5B - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_RESERVED_5x ;#5C - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_RESERVED_5x ;#5D - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
DB high FN_RESERVED_5x ;#5E - Extended functions
|
||||
DB high FN_ABSENT_5x ;#5E - Extended functions
|
||||
DB high DRV_LIST ;#5F - „ã¡«ì. <20> íâã äãªæ¨î ¯àë£ ¥â ¨§ ®á®¢®£® ®¡à ¡®â稪
|
||||
;
|
||||
;---------------------------------------------------------------------[]
|
||||
@ -614,7 +614,7 @@ TAB_5xFNS:
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_ABSENT_5x
|
||||
DB high DRV_LIST
|
||||
;---------------------------------------------------------------------[]
|
||||
|
||||
@ -638,7 +638,7 @@ TAB_5xFNS:
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_RESERVED_5x
|
||||
DB high FN_ABSENT_5x
|
||||
DB high DRV_LIST
|
||||
;---------------------------------------------------------------------[]
|
||||
|
||||
@ -684,34 +684,50 @@ EXP_FNS_RST18:
|
||||
EX (SP),HL
|
||||
RET
|
||||
|
||||
FN_5x_Parser_1:
|
||||
; HDD_5x_RESET
|
||||
; HDD_5x_LONG_READ
|
||||
; HDD_5x_LONG_WRITE
|
||||
; HDD_5x_VERIFY
|
||||
; HDD_5x_READ
|
||||
; HDD_5x_WRITE
|
||||
; HDD_5x_DETECT
|
||||
; HDD_5x_GETMED
|
||||
; HDD_5x_SETMED
|
||||
; DRV_VERSION
|
||||
; FN_RESERVED_5x
|
||||
; FN_RESERVED_5x
|
||||
; FN_RESERVED_5x
|
||||
; FN_RESERVED_5x
|
||||
; DRV_LIST
|
||||
|
||||
FN_5x_Parser_1: ; HDD_5x_RESET
|
||||
LD C,#01
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_2:
|
||||
FN_5x_Parser_2: ; HDD_5x_LONG_READ
|
||||
LD C,#02
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_3:
|
||||
FN_5x_Parser_3: ; HDD_5x_LONG_WRITE
|
||||
LD C,#03
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_4:
|
||||
FN_5x_Parser_4: ; HDD_5x_VERIFY
|
||||
LD C,#04
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_6:
|
||||
FN_5x_Parser_6: ; HDD_5x_WRITE
|
||||
LD C,#06
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_7:
|
||||
FN_5x_Parser_7: ; HDD_5x_DETECT
|
||||
LD C,#07
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_8:
|
||||
FN_5x_Parser_8: ; HDD_5x_GETMED
|
||||
LD C,#08
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_9:
|
||||
FN_5x_Parser_9: ; HDD_5x_SETMED
|
||||
LD C,#09
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_E:
|
||||
FN_5x_Parser_E: ; DRV_EXTENDED
|
||||
LD C,#0E
|
||||
JP FN_5x_Parser
|
||||
FN_5x_Parser_5:
|
||||
FN_5x_Parser_5: ; HDD_5x_READ
|
||||
LD C,5
|
||||
FN_5x_Parser:
|
||||
PUSH HL
|
||||
|
||||
425
src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM
Normal file
425
src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM
Normal file
@ -0,0 +1,425 @@
|
||||
;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI)
|
||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||
;CD ROM DRIVE DRIVER
|
||||
;---------------------------------------------------------------
|
||||
;Rev Date Name Description
|
||||
;---------------------------------------------------------------
|
||||
; 02-08-2001 DNS Initial this module
|
||||
;---------------------------------------------------------------
|
||||
;========================================================
|
||||
MAX_ATAPI_SEC_SIZE EQU 4096
|
||||
PKTSIZE EQU 12
|
||||
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
|
||||
RAM_ATAPI_READ EQU SYS_PAGE.SHARED_BUFFER_32b+16
|
||||
|
||||
ASSERT ((PKTSIZE % 4) = 0), "PKTSIZE must be an even number"
|
||||
|
||||
;[]================================================================[#51]
|
||||
CD_5x_RESET: LD C,IDE.Device.ATAPI
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
LD B,50
|
||||
.loop: PUSH BC
|
||||
CALL CD_TEST
|
||||
POP BC
|
||||
RET NC
|
||||
EI
|
||||
HALT
|
||||
DJNZ .loop
|
||||
RET
|
||||
;[]================================================================[#51]
|
||||
|
||||
|
||||
;!TODO
|
||||
; atapi.pdf áâà. 24 § ¯¨áì/ç⥨¥ ¬®£ãâ ¡ëâì ¬ ªá¨¬ «ì묨 ¡«®ª ¬¨ ¢ ¥áª®«ìª® § 室®¢
|
||||
;[]================================================================[#55]
|
||||
;Function: Read Sectors
|
||||
; A - Disk
|
||||
; HL:IX - Sector
|
||||
; DE - Address
|
||||
; B - Sector counter
|
||||
;Return:
|
||||
; HL:IX - Sector + Sector counter
|
||||
; DE - Address + (Sector counter * Size sector)
|
||||
;READ SECTOR(S)
|
||||
CD_5x_READ:
|
||||
EX AF,AF'
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
;[]================================================================[#52]
|
||||
;Function: Long Read Sectors
|
||||
; A - Disk
|
||||
; HL:IX - Sector
|
||||
; DE - Address
|
||||
; B - Sector counter
|
||||
; A'- Memory Page Number
|
||||
;Return:
|
||||
; HL:IX - Sector + Sector counter
|
||||
; DE - Address + (Sector counter * Size sector)
|
||||
;LONG READ SECTOR(S)
|
||||
CD_5x_LONG_READ:
|
||||
PUSH IY
|
||||
SAFE_PORTY_2
|
||||
PUSH BC
|
||||
PUSH IX
|
||||
PUSH HL
|
||||
;
|
||||
CALL RW_ATAPI_SECTORs
|
||||
;
|
||||
|
||||
;
|
||||
RET
|
||||
|
||||
RW_ATAPI_SECTORs:
|
||||
LD C,IDE.Device.ATAPI
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
;
|
||||
EXX
|
||||
LD C,SLOT3
|
||||
IN A,(C)
|
||||
PUSH AF
|
||||
LD A,SYS_PAGE
|
||||
OUT (C),A
|
||||
LD HL,ATAPI_CMD_PACKET.READ
|
||||
LD DE,RAM_ATAPI_READ
|
||||
LD BC,PKTSIZE
|
||||
LDIR
|
||||
EXX
|
||||
;
|
||||
LD A,H
|
||||
LD H,L
|
||||
LD L,A
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL
|
||||
LD A,XH
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A ;R01
|
||||
LD A,XL
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A ;R01
|
||||
LD A,B
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A ;R01
|
||||
;
|
||||
EX AF,AF'
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
; POP AF
|
||||
; OUT (SLOT3),A
|
||||
LD HL,RAM_ATAPI_READ
|
||||
CALL EXEC_PACKET_COMMAND
|
||||
;
|
||||
POP BC
|
||||
LD C,SLOT3
|
||||
OUT (C),B
|
||||
;[]===========================================================[#52, #55]
|
||||
|
||||
|
||||
;[]================================================================[#57]
|
||||
;Function: Detect Disk
|
||||
; A - Disk
|
||||
;Return: CF=0 - A=Drive type
|
||||
; CF=1 - drive not present, A=#02
|
||||
CD_5x_DETECT:
|
||||
LD C,IDE.Device.ATAPI
|
||||
AND %1011'1111
|
||||
JP DRV_DETECT
|
||||
;[]================================================================[#57]
|
||||
|
||||
|
||||
;[]================================================================[#5E]
|
||||
;Function: Extended
|
||||
; A - Disk
|
||||
; B - SubFunction
|
||||
;Return:
|
||||
;
|
||||
CD_5x_Extended:
|
||||
LD C,IDE.Device.ATAPI
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
;
|
||||
LD A,B
|
||||
CP 2
|
||||
JR C,TRAY_FN
|
||||
; ...
|
||||
; ...
|
||||
;LD A,#AA
|
||||
LD A,BIOS.Error.InvalidSubFunction
|
||||
SCF
|
||||
RET
|
||||
;[]================================================================[#5E]
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
TRAY_FN: LD HL,ATAPI_CMD_PACKET.CLOSE
|
||||
LD DE,0 ; ¬ થà ⮣®, çâ® ¥ 㦮 ç¨â âì á ãáâனá⢠¢ އ“
|
||||
DEC A
|
||||
JR Z,EXEC_PACKET_COMMAND
|
||||
LD HL,ATAPI_CMD_PACKET.OPEN
|
||||
JR EXEC_PACKET_COMMAND
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
; INPUT: HL - AP paket (12bytes)
|
||||
; RETURN: CF - ERROR
|
||||
; !TODO CD ERRORS to INCLUDES
|
||||
; #01 - RECOVERED ERROR
|
||||
; #02 - NOT READY
|
||||
; #03 - MEDIUM ERROR
|
||||
; #04 - HARDWARE ERROR
|
||||
; #05 - ILLEGAL REQUEST
|
||||
; #06 - UNIT ATTETION
|
||||
; #07 - DATA PROTECT
|
||||
; #0B - ABORTED COMMAND
|
||||
; #80 - TIME OUT
|
||||
EXEC_PACKET_COMMAND:
|
||||
EXX
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
JR NC,.READY
|
||||
;
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATAPI.Reset
|
||||
OUT (C),A
|
||||
;
|
||||
LD B,#80
|
||||
.pause: DJNZ .pause
|
||||
;
|
||||
EXX
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
;
|
||||
.READY: LD C,SLOT3
|
||||
IN B,(C)
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
;
|
||||
LD A,SYS_PAGE
|
||||
OUT (C),A
|
||||
LD DE,RAM_ATAPI_PK ;!FIXIT ¬®¦¥â á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®?
|
||||
LD BC,PKTSIZE
|
||||
LDIR
|
||||
;
|
||||
POP BC
|
||||
POP DE
|
||||
OUT (C),B
|
||||
;
|
||||
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 ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì
|
||||
LD BC,IDE.Write.CylinderLow
|
||||
OUT (C),E
|
||||
LD BC,IDE.Write.CylinderHigh
|
||||
OUT (C),D
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATAPI.Packet
|
||||
OUT (C),A
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
EXX
|
||||
LD DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
||||
CALL CD_WAITPRT.Custom
|
||||
EXX
|
||||
BIT IDE.CtrlBit.Error,A
|
||||
JR NZ,.CDERROR
|
||||
JR NC,.YEP_DRQ
|
||||
LD A,#80 ; ERROR TIME OUT ;!HARDCODE
|
||||
RET
|
||||
;
|
||||
.YEP_DRQ: LD C,SLOT3
|
||||
IN B,(C)
|
||||
PUSH BC
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD HL,RAM_ATAPI_PK
|
||||
LD BC,IDE.Write.Data
|
||||
LD A,PKTSIZE/4
|
||||
.OUTPKT: OUTI
|
||||
OUTI
|
||||
OUTI
|
||||
OUTI
|
||||
DEC A
|
||||
JR NZ,.OUTPKT
|
||||
;
|
||||
POP BC
|
||||
|
||||
OUT (C),B
|
||||
LD B,#80
|
||||
.pause2: DJNZ .pause2
|
||||
;
|
||||
.AP_LOOP: EXX
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
BIT IDE.CtrlBit.Error,A
|
||||
;JR NZ,.CDERROR
|
||||
RET Z
|
||||
;
|
||||
.CDERROR: LD BC,IDE.Read.Error ;ERROR
|
||||
IN A,(C)
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
AND #0F
|
||||
SCF
|
||||
RET
|
||||
;
|
||||
;!FIXIT
|
||||
AND IDE.CtrlByte.DataRequest
|
||||
RET Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors
|
||||
EX DE,HL
|
||||
LD BC,IDE.Read.CylinderLow
|
||||
IN E,(C)
|
||||
LD BC,IDE.Read.CylinderHigh
|
||||
IN D,(C) ;TRANSFER BLOCK SIZE
|
||||
LD A,D
|
||||
OR E
|
||||
RET Z ;BLOCK = 0
|
||||
;
|
||||
LD BC,IDE.Read.Counter
|
||||
IN A,(C)
|
||||
AND #02
|
||||
;WRITE ;!FIXIT
|
||||
LD BC,IDE.Read.Data
|
||||
JR NZ,.FROM_CD
|
||||
;
|
||||
.WR_T_CD: OUTI
|
||||
OUTI
|
||||
DEC DE
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JR NZ,.WR_T_CD
|
||||
EX DE,HL
|
||||
JR .AP_LOOP
|
||||
;
|
||||
;READ
|
||||
.FROM_CD: ;LD BC,IDE.Read.Data
|
||||
; ¯à®¢¥àª ¯¥à¥¯®«¥¨¥ ¤à¥á ¡ãä¥à
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,.read_loop
|
||||
; next page in mem block
|
||||
LD HL,#C000
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF' ;>-----------> \
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD D,high SYS_PAGE.RAM_TABLE
|
||||
LD E,XH
|
||||
LD A,(DE)
|
||||
LD XH,A
|
||||
EX AF,AF' ;<-----------< /
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
.read_loop: INI
|
||||
INI
|
||||
DEC DE
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JR NZ,.read_loop
|
||||
;
|
||||
EX DE,HL
|
||||
JR .AP_LOOP
|
||||
;
|
||||
|
||||
;.NULL: LD BC,IDE.Read.Data
|
||||
;.RD_N_CD: IN A,(C)
|
||||
; DEC B
|
||||
; IN A,(C)
|
||||
; DEC B
|
||||
; DEC DE
|
||||
; DEC DE
|
||||
; LD A,D
|
||||
; OR E
|
||||
; JR NZ,.RD_N_CD
|
||||
; ; DE = 0
|
||||
; JR .AP_LOOP
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
; D - MASK, E - PATTERN
|
||||
CD_WAITPRT: LD DE,256*(IDE.CtrlByte.DataRequest) + 0
|
||||
.Custom: LD B,100
|
||||
LD HL,#0000
|
||||
.LOOP: LD A,high IDE.Read.Status
|
||||
IN A,(low IDE.Read.Status)
|
||||
CP #FF
|
||||
JR Z,.error
|
||||
AND D
|
||||
CP E
|
||||
;
|
||||
RET Z
|
||||
;
|
||||
.NEXT_TRY: DEC L
|
||||
JR NZ,.LOOP
|
||||
DEC H
|
||||
JR NZ,.LOOP
|
||||
DJNZ .LOOP
|
||||
;
|
||||
EX AF,AF'
|
||||
.error: ; !FIXIT error number
|
||||
SCF
|
||||
RET
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
CD_TEST: LD HL,ATAPI_CMD_PACKET.NOP
|
||||
LD DE,0 ; ¬ થà ⮣®, çâ® ¥ 㦮 ç¨â âì á ãáâனá⢠¢ އ“
|
||||
JP EXEC_PACKET_COMMAND
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
ATAPI_CMD_PACKET:
|
||||
.NOP: DUP 12
|
||||
DB #00
|
||||
EDUP
|
||||
;
|
||||
.OPEN: DB #1B
|
||||
DB #00,#00,#00
|
||||
DB #02
|
||||
DB #00,#00,#00,#00,#00,#00,#00
|
||||
;
|
||||
.CLOSE: DB #1B
|
||||
DB #00,#00,#00
|
||||
DB #03
|
||||
DB #00,#00,#00,#00,#00,#00,#00
|
||||
;
|
||||
.READ: DB #28,#00
|
||||
DB #00,#00,#00,#00 ; sector dword
|
||||
DB #00
|
||||
DB #00,#01,#00,#00 ; counter dword
|
||||
DB #00
|
||||
;
|
||||
.WRITE: DB #2E,#00
|
||||
DB #00,#00,#00,#00 ; sector dword
|
||||
DB #00
|
||||
DB #00,#01,#00,#00 ; counter dword
|
||||
DB #00
|
||||
;
|
||||
ATAPI_PACKET:
|
||||
.SECTOR EQU 2
|
||||
.COUNTER EQU 7
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
;
|
||||
; E - Second * 10
|
||||
; PAUSE LD HL,#0000
|
||||
; PAUSE1 DEC L
|
||||
; JR NZ,PAUSE1
|
||||
; DEC H
|
||||
; JR NZ,PAUSE1
|
||||
; DEC E
|
||||
; JR NZ,PAUSE1
|
||||
; RET
|
||||
;
|
||||
@ -168,25 +168,33 @@ HDD_5x_READ:
|
||||
; A - Disk
|
||||
; HL:IX - Sector
|
||||
; DE - Address
|
||||
; B - Sector counter
|
||||
; B - Sector counter, 0 = 256
|
||||
; A'- Memory Page Number
|
||||
;Return:
|
||||
; HL:IX - Sector + Sector counter
|
||||
; DE - Address + (Sector counter * Size sector)
|
||||
; A' - Last mem page in RAM Block used for readed data
|
||||
;LONG READ SECTOR(S)
|
||||
HDD_5x_LONG_READ:
|
||||
PUSH IY
|
||||
|
||||
SAFE_PORTY_2
|
||||
|
||||
PUSH BC
|
||||
PUSH IX
|
||||
PUSH HL
|
||||
CALL RDS000
|
||||
EX DE,HL
|
||||
JR C,HERRRD0
|
||||
LD A,XH
|
||||
;IF OPTIMIZE_RW_PROCEDURE
|
||||
EX AF,AF'
|
||||
AND A ;read
|
||||
EX AF,AF'
|
||||
CALL RW_ATA_SECTORs
|
||||
;ELSE
|
||||
;CALL READ_ATA_SECTORs
|
||||
;ENDIF
|
||||
;
|
||||
EX DE,HL
|
||||
JR C,.error
|
||||
LD A,XH ; current page in mem block for SLOT3
|
||||
EX AF,AF'
|
||||
;
|
||||
POP HL
|
||||
POP IX
|
||||
POP BC
|
||||
@ -194,23 +202,23 @@ HDD_5x_LONG_READ:
|
||||
CP B
|
||||
LD C,B
|
||||
LD B,A
|
||||
JR NZ,RNOT256
|
||||
INC B
|
||||
JR Z,.B_256_sectors
|
||||
;
|
||||
ADD IX,BC
|
||||
LD C,B
|
||||
.pre_exit: ADC HL,BC
|
||||
.exit: RESTORE_PORTY
|
||||
POP IY
|
||||
RET
|
||||
;
|
||||
.B_256_sectors: INC B
|
||||
ADD IX,BC
|
||||
LD B,C
|
||||
ADC HL,BC
|
||||
;EX AF,AF' ;!TEST 21/11/23
|
||||
JR RST8RDR
|
||||
|
||||
RNOT256 ADD IX,BC
|
||||
LD C,B
|
||||
ADC HL,BC
|
||||
;EX AF,AF' ;!TEST 21/11/23
|
||||
JR RST8RDR
|
||||
|
||||
HERRRD0 LD B,A
|
||||
JR .pre_exit
|
||||
;
|
||||
.error: LD B,A ; A - ®¬¥à ®è¨¡ª¨
|
||||
LD C,XL
|
||||
LD A,XH
|
||||
LD A,XH ; current page in mem block for SLOT3
|
||||
EX AF,AF'
|
||||
POP HL
|
||||
POP IX
|
||||
@ -225,88 +233,92 @@ HERRRD0 LD B,A
|
||||
LD C,A
|
||||
LD A,B
|
||||
LD B,C
|
||||
;R03
|
||||
SCF
|
||||
;EX AF,AF' ;!TEST 21/11/23
|
||||
SCF ;R03
|
||||
JR .exit
|
||||
;
|
||||
RST8RDR: RESTORE_PORTY
|
||||
POP IY
|
||||
;EX AF,AF' ;!TEST 21/11/23
|
||||
RET
|
||||
|
||||
;READ SECTOR(S)
|
||||
RDS000: LD C,IDE.Device.HDD
|
||||
/*
|
||||
IFN OPTIMIZE_RW_PROCEDURE
|
||||
READ_ATA_SECTORs:
|
||||
LD C,IDE.Device.HDD
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
EXX
|
||||
LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
EX AF,AF'
|
||||
PUSH AF
|
||||
PUSH AF ; memory page number
|
||||
PUSH DE
|
||||
CALL PRESET
|
||||
POP HL
|
||||
POP AF
|
||||
POP AF ; memory page number
|
||||
LD XL,0
|
||||
LD XH,A
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
||||
OUT (C),A
|
||||
;?????
|
||||
;SAVE HL!
|
||||
RDS002: EXX
|
||||
EXX
|
||||
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
|
||||
CALL WAITPRT
|
||||
CALL WAITPRT.custom
|
||||
EXX
|
||||
RET C
|
||||
;NOP ;R01 REMOVED "DI"
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
;DI ;R01 REMOVED "DI"
|
||||
.big_loop: IN A,(SLOT3)
|
||||
EX AF,AF' ;>-----------> \
|
||||
LD A,XH
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
; READ SECTOR 512 bytes ;!HARDCODE sector size
|
||||
LD BC,IDE.Read.Data
|
||||
|
||||
RDS003: DUP 16
|
||||
.loop_256_1: DUP 16
|
||||
INI
|
||||
EDUP
|
||||
JP NZ,RDS003
|
||||
RDS004: DUP 16
|
||||
JP NZ,.loop_256_1
|
||||
.loop_256_2: DUP 16
|
||||
INI
|
||||
EDUP
|
||||
JP NZ,RDS004
|
||||
|
||||
EX AF,AF'
|
||||
JP NZ,.loop_256_2
|
||||
; ; ; ; ;
|
||||
;
|
||||
EX AF,AF' ;<-----------< /
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,.W44
|
||||
; next page in mem block
|
||||
LD HL,#C000
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
EX AF,AF' ;>-----------> \
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD D,#C2
|
||||
LD D,high SYS_PAGE.RAM_TABLE
|
||||
LD E,XH
|
||||
LD A,(DE)
|
||||
LD XH,A
|
||||
EX AF,AF'
|
||||
EX AF,AF' ;<-----------< /
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
.W44: INC XL ;INC LOADED SECTORS
|
||||
EXX
|
||||
LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
||||
;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
BIT IDE.ControlBit.DataRequest,A
|
||||
JP NZ,RDS002
|
||||
XOR A
|
||||
RET
|
||||
BIT IDE.CtrlBit.DataRequest,A
|
||||
;
|
||||
RET Z
|
||||
JP .big_loop
|
||||
;JP NZ,.big_loop
|
||||
;XOR A
|
||||
;RET
|
||||
;
|
||||
ENDIF
|
||||
*/
|
||||
;[]===========================================================[#52, #55]
|
||||
|
||||
|
||||
@ -343,7 +355,15 @@ HDD_5x_LONG_WRITE:
|
||||
PUSH IX
|
||||
PUSH HL
|
||||
PUSH BC
|
||||
CALL WRS000
|
||||
;IF OPTIMIZE_RW_PROCEDURE
|
||||
EX AF,AF'
|
||||
SCF ;write
|
||||
EX AF,AF'
|
||||
CALL RW_ATA_SECTORs
|
||||
;ELSE
|
||||
;CALL WRITE_ATA_SECTORs
|
||||
;ENDIF
|
||||
;
|
||||
EX DE,HL
|
||||
JP C,HERRWR0
|
||||
LD A,XH
|
||||
@ -395,37 +415,129 @@ RST8WRR: RESTORE_PORTY
|
||||
;EX AF,AF'
|
||||
RET
|
||||
|
||||
;WRITE SECTOR(S)
|
||||
WRS000:
|
||||
|
||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
||||
/*
|
||||
temp1=0;
|
||||
bp 20e3,{b@20e3==cd},{temp1=1; g};
|
||||
bp 213b,{b@213b==cd},{temp1=2; g};
|
||||
bp 21B1,{b@21b1==01 and temp1==2};
|
||||
bp 2229,{b@2229==01 and temp1==1};
|
||||
*/
|
||||
; IF OPTIMIZE_RW_PROCEDURE
|
||||
; CF=1 - write, CF=0 - read
|
||||
RW_ATA_SECTORs: LD C,IDE.Device.HDD
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
EXX
|
||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
EX AF,AF'
|
||||
PUSH AF ; memory page number
|
||||
PUSH DE
|
||||
CALL PRESET
|
||||
POP HL
|
||||
POP AF ; memory page number
|
||||
LD XL,0
|
||||
LD XH,A
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATA.WriteSectorsWithRetry
|
||||
JR C,.set_command
|
||||
;
|
||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
||||
.set_command: OUT (C),A
|
||||
;SAVE HL!
|
||||
EX AF,AF'
|
||||
EXX
|
||||
LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest
|
||||
CALL WAITPRT.custom
|
||||
EXX
|
||||
RET C
|
||||
;DI ;R01 REMOVED "DI"
|
||||
.big_loop: IN A,(SLOT3)
|
||||
EX AF,AF' ;>-----------> \
|
||||
LD A,XH
|
||||
OUT (SLOT3),A
|
||||
JR C,.write_sector
|
||||
;
|
||||
; READ SECTOR 512 bytes ;!HARDCODE sector size
|
||||
LD BC,IDE.Read.Data
|
||||
.loop_256_1: DUP 16
|
||||
INI
|
||||
EDUP
|
||||
JP NZ,.loop_256_1
|
||||
.loop_256_2: DUP 16
|
||||
INI
|
||||
EDUP
|
||||
JP NZ,.loop_256_2
|
||||
EX AF,AF'
|
||||
; ; ; ; ;
|
||||
; CF=0
|
||||
.return_rw: EX AF,AF' ;<-----------< /
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,.W44
|
||||
; next page in mem block
|
||||
LD HL,#C000
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF' ;>-----------> \
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD D,high SYS_PAGE.RAM_TABLE
|
||||
LD E,XH
|
||||
LD A,(DE)
|
||||
LD XH,A
|
||||
EX AF,AF' ;<-----------< /
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
.W44: INC XL ;INC LOADED SECTORS
|
||||
EXX
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
BIT IDE.CtrlBit.DataRequest,A
|
||||
;
|
||||
RET Z
|
||||
JP .big_loop
|
||||
;JP NZ,.big_loop
|
||||
;XOR A
|
||||
;RET
|
||||
;
|
||||
;
|
||||
.write_sector: ; WRITE SECTOR 512 bytes ;!HARDCODE sector size
|
||||
LD BC,IDE.Write.Data
|
||||
LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size
|
||||
.loop: DUP WRITE_OUTI_DUPs
|
||||
OUTI
|
||||
EDUP
|
||||
DEC D
|
||||
JR NZ,.loop
|
||||
SCF
|
||||
JP .return_rw
|
||||
; ; ; ; ;
|
||||
|
||||
;ENDIF
|
||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ;
|
||||
/*
|
||||
IFN OPTIMIZE_RW_PROCEDURE
|
||||
WRITE_ATA_SECTORs:
|
||||
LD C,IDE.Device.HDD
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
EXX
|
||||
LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
||||
;LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
EX AF,AF'
|
||||
PUSH AF
|
||||
PUSH DE
|
||||
|
||||
;[x] CMOS Write Protect Disabled
|
||||
IF HDDwriteProtect
|
||||
PUSH BC
|
||||
LD D,CMOS_CELL.Options
|
||||
CALL CMOS_RD
|
||||
POP BC
|
||||
AND 1
|
||||
JR Z,NO_WriteProtect
|
||||
POP HL
|
||||
POP AF
|
||||
EX AF,AF'
|
||||
LD XL,0
|
||||
LD A,BIOS.Error.WriteProtect
|
||||
SCF
|
||||
RET
|
||||
ENDIF
|
||||
NO_WriteProtect:
|
||||
CALL PRESET
|
||||
POP HL
|
||||
POP AF
|
||||
@ -434,58 +546,64 @@ NO_WriteProtect:
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATA.WriteSectorsWithRetry
|
||||
OUT (C),A
|
||||
;SAVE HL!
|
||||
WRS002: EXX
|
||||
; SAVE HL?!
|
||||
EXX
|
||||
LD DE,#8908 ;WAIT BUSY=0 & DRQ=1 & ERR=0
|
||||
CALL WAITPRT
|
||||
CALL WAITPRT.custom
|
||||
EXX
|
||||
RET C
|
||||
|
||||
;DI
|
||||
IN A,(SLOT3)
|
||||
;
|
||||
.big_loop: IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
LD A,XH
|
||||
OUT (SLOT3),A
|
||||
; WRITE SECTOR 512 bytes ;!HARDCODE sector size
|
||||
LD BC,IDE.Write.Data
|
||||
;LD D,#20
|
||||
LD D,512/WRITE_OUTI_DUPs
|
||||
WRS003:
|
||||
DUP WRITE_OUTI_DUPs
|
||||
LD D,512/WRITE_OUTI_DUPs ;!HARDCODE sector size
|
||||
.loop: DUP WRITE_OUTI_DUPs
|
||||
OUTI
|
||||
EDUP
|
||||
DEC D
|
||||
JR NZ,WRS003
|
||||
|
||||
JR NZ,.loop
|
||||
; ; ; ; ;
|
||||
EX AF,AF'
|
||||
OUT (SLOT3),A
|
||||
//EI
|
||||
;EI
|
||||
;
|
||||
LD A,H
|
||||
OR L
|
||||
JR NZ,.W33
|
||||
; next page in mem block
|
||||
LD HL,#C000
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD D,#C2
|
||||
LD D,high SYS_PAGE.RAM_TABLE
|
||||
LD E,XH
|
||||
LD A,(DE)
|
||||
LD XH,A
|
||||
EX AF,AF'
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
.W33: INC XL ;INC SAVED SECTORS
|
||||
EXX
|
||||
LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
||||
;LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
BIT IDE.ControlBit.DataRequest,A
|
||||
JP NZ,WRS002
|
||||
XOR A
|
||||
RET
|
||||
BIT IDE.CtrlBit.DataRequest,A
|
||||
;
|
||||
RET Z
|
||||
JP .big_loop
|
||||
;JP NZ,.big_loop
|
||||
;XOR A
|
||||
;RET
|
||||
;
|
||||
ENDIF
|
||||
*/
|
||||
;[]===========================================================[#53, #56]
|
||||
|
||||
|
||||
@ -513,7 +631,6 @@ VRS000: LD C,IDE.Device.HDD
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
EXX
|
||||
LD DE,#C140 ;WAIT BUSY=0 & READY=1 & ERR=0
|
||||
CALL WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
@ -525,16 +642,15 @@ VRS000: LD C,IDE.Device.HDD
|
||||
OUT (C),A
|
||||
VRS002: LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
BIT IDE.ControlBit.Error,A
|
||||
BIT IDE.CtrlBit.Error,A
|
||||
JR Z,VRS003
|
||||
SCF
|
||||
RET
|
||||
VRS003: LD DE,#C140 ;WAIT BUSY=0 & ERR=0 & READY=1
|
||||
CALL WAITPRT
|
||||
VRS003: CALL WAITPRT
|
||||
RET C
|
||||
XOR A
|
||||
RET
|
||||
|
||||
LD BC,IDE.Read.Counter
|
||||
; HL:IX - LBA SECTOR
|
||||
; B - SECTOR COUNTER
|
||||
PRESET: LD A,B
|
||||
@ -624,8 +740,8 @@ CHS005: INC A
|
||||
;----------------------------------------------------------------------;
|
||||
; D - MASK
|
||||
; E - PATTERN
|
||||
WAITPRT:
|
||||
LD BC,IDE.Read.Status
|
||||
WAITPRT: LD DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready
|
||||
.custom: LD BC,IDE.Read.Status
|
||||
LD HL,#0000 ; § ¤¥à¦ª ;!HARDCODE
|
||||
;
|
||||
.loop: PUSH HL
|
||||
@ -1,403 +0,0 @@
|
||||
;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI)
|
||||
;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ
|
||||
;CD ROM DRIVE DRIVER
|
||||
;---------------------------------------------------------------
|
||||
;Rev Date Name Description
|
||||
;---------------------------------------------------------------
|
||||
; 02-08-2001 DNS Initial this module
|
||||
;---------------------------------------------------------------
|
||||
;========================================================
|
||||
SIZESEC EQU #0800
|
||||
PKTSIZE EQU 12
|
||||
RAM_ATAPI_PK EQU SYS_PAGE.SHARED_BUFFER_32b
|
||||
RAM_ATAPI_READ EQU SYS_PAGE.SHARED_BUFFER_32b+16
|
||||
|
||||
ASSERT ((PKTSIZE % 2) = 0), "PKTSIZE must be an even number"
|
||||
|
||||
;[]================================================================[#51]
|
||||
CD_5x_RESET:
|
||||
LD C,IDE.Device.CDROM
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
LD B,50
|
||||
.loop:
|
||||
PUSH BC
|
||||
CALL CD_TEST
|
||||
POP BC
|
||||
RET NC
|
||||
EI
|
||||
HALT
|
||||
DJNZ .loop
|
||||
RET
|
||||
;[]================================================================[#51]
|
||||
|
||||
|
||||
;[]================================================================[#55]
|
||||
;Function: Read Sectors
|
||||
; A - Disk
|
||||
; HL:IX - Sector
|
||||
; DE - Address
|
||||
; B - Sector counter
|
||||
;Return:
|
||||
; HL:IX - Sector + Sector counter
|
||||
; DE - Address + (Sector counter * Size sector)
|
||||
;READ SECTOR(S)
|
||||
CD_5x_READ:
|
||||
EX AF,AF'
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
;[]================================================================[#52]
|
||||
;Function: Long Read Sectors
|
||||
; A - Disk
|
||||
; HL:IX - Sector
|
||||
; DE - Address
|
||||
; B - Sector counter
|
||||
; A'- Memory Page Number
|
||||
;Return:
|
||||
; HL:IX - Sector + Sector counter
|
||||
; DE - Address + (Sector counter * Size sector)
|
||||
;LONG READ SECTOR(S)
|
||||
CD_5x_LONG_READ:
|
||||
LD C,IDE.Device.CDROM
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
;
|
||||
EXX
|
||||
LD C,SLOT3
|
||||
IN A,(C)
|
||||
PUSH AF
|
||||
LD A,SYS_PAGE
|
||||
OUT (C),A
|
||||
LD HL,ATAPI_CMD_PACKET.READ
|
||||
LD DE,RAM_ATAPI_READ
|
||||
LD BC,PKTSIZE
|
||||
LDIR
|
||||
EXX
|
||||
|
||||
LD A,H
|
||||
LD H,L
|
||||
LD L,A
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL
|
||||
LD A,XH
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A ;R01
|
||||
LD A,XL
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A ;R01
|
||||
LD A,B
|
||||
LD (RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A ;R01
|
||||
;
|
||||
EX AF,AF'
|
||||
OUT (SLOT3),A
|
||||
;
|
||||
; POP AF
|
||||
; OUT (SLOT3),A
|
||||
LD HL,RAM_ATAPI_READ
|
||||
CALL AP_COM
|
||||
;
|
||||
POP BC
|
||||
LD C,SLOT3
|
||||
OUT (C),B
|
||||
;
|
||||
RET
|
||||
;[]===========================================================[#52, #55]
|
||||
|
||||
|
||||
;[]================================================================[#57]
|
||||
;Function: Detect Disk
|
||||
; A - Disk
|
||||
;Return: CF=0 - A=Drive type
|
||||
; CF=1 - drive not present, A=#02
|
||||
CD_5x_DETECT:
|
||||
LD C,IDE.Device.CDROM
|
||||
AND %1011'1111
|
||||
JP DRV_DETECT
|
||||
;[]================================================================[#57]
|
||||
|
||||
|
||||
;[]================================================================[#5E]
|
||||
;Function: Extended
|
||||
; A - Disk
|
||||
; B - SubFunction
|
||||
;Return:
|
||||
;
|
||||
CD_5x_Extended:
|
||||
LD C,IDE.Device.CDROM
|
||||
CALL SELECT_DRIVE
|
||||
RET C
|
||||
;
|
||||
LD A,B
|
||||
CP 2
|
||||
JR C,TRAY_FN
|
||||
; ...
|
||||
; ...
|
||||
;LD A,#AA
|
||||
LD A,BIOS.Error.InvalidSubFunction
|
||||
SCF
|
||||
RET
|
||||
;[]================================================================[#5E]
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
TRAY_FN:
|
||||
LD DE,0 ;!FIXIT 㦮 «¨?
|
||||
LD HL,ATAPI_CMD_PACKET.CLOSE
|
||||
DEC A
|
||||
JR Z,AP_COM
|
||||
LD HL,ATAPI_CMD_PACKET.OPEN
|
||||
JR AP_COM
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
; INPUT: HL - AP paket (12bytes)
|
||||
; RETURN: CF - ERROR
|
||||
; !TODO CD ERRORS to INCLUDES
|
||||
; #01 - RECOVERED ERROR
|
||||
; #02 - NOT READY
|
||||
; #03 - MEDIUM ERROR
|
||||
; #04 - HARDWARE ERROR
|
||||
; #05 - ILLEGAL REQUEST
|
||||
; #06 - UNIT ATTETION
|
||||
; #07 - DATA PROTECT
|
||||
; #0B - ABORTED COMMAND
|
||||
; #80 - TIME OUT
|
||||
AP_COM: EXX
|
||||
;LD DE,#8000
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
JR NC,.READY
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATAPI.Reset
|
||||
OUT (C),A
|
||||
|
||||
LD B,#80
|
||||
.pause: DJNZ .pause
|
||||
|
||||
EXX
|
||||
;LD DE,#8000
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
.READY:
|
||||
LD C,SLOT3
|
||||
IN B,(C)
|
||||
|
||||
PUSH DE
|
||||
PUSH BC
|
||||
|
||||
LD A,SYS_PAGE
|
||||
OUT (C),A
|
||||
LD DE,RAM_ATAPI_PK ;!FIXIT ¬®¦¥â á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®?
|
||||
LD BC,PKTSIZE
|
||||
LDIR
|
||||
|
||||
POP BC
|
||||
POP DE
|
||||
OUT (C),B
|
||||
|
||||
XOR A
|
||||
EXX
|
||||
;OUT (C),A
|
||||
;XOR A
|
||||
LD BC,IDE.Write.Features
|
||||
OUT (C),A
|
||||
LD DE,SIZESEC ;SIZE BLOCK ;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì
|
||||
LD BC,IDE.Write.CylinderLow
|
||||
OUT (C),E
|
||||
LD BC,IDE.Write.CylinderHigh
|
||||
OUT (C),D
|
||||
LD BC,IDE.Write.Command
|
||||
LD A,IDE.ATAPI.Packet
|
||||
OUT (C),A
|
||||
;LD DE,#8000
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
EXX
|
||||
LD DE,#0908
|
||||
CALL CD_WAITPRT.Custom
|
||||
EXX
|
||||
BIT IDE.ControlBit.Error,A
|
||||
JR NZ,.CDERROR
|
||||
JR NC,.YEP_DRQ
|
||||
LD A,#80 ; ERROR TIME OUT ;!HARDCODE
|
||||
RET
|
||||
;
|
||||
.YEP_DRQ:
|
||||
LD C,SLOT3
|
||||
IN B,(C)
|
||||
PUSH BC
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD HL,RAM_ATAPI_PK
|
||||
LD BC,IDE.Write.Data
|
||||
LD A,PKTSIZE/2
|
||||
.OUTPKT:
|
||||
OUTI
|
||||
OUTI
|
||||
DEC A
|
||||
JR NZ,.OUTPKT
|
||||
;
|
||||
POP BC
|
||||
OUT (C),B
|
||||
;
|
||||
LD B,#80
|
||||
.pause2: DJNZ .pause2
|
||||
;
|
||||
.AP_LOOP:
|
||||
EXX
|
||||
;LD DE,#8000
|
||||
CALL CD_WAITPRT
|
||||
EXX
|
||||
RET C
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
BIT IDE.ControlBit.Error,A
|
||||
JR Z,.NO_ERR
|
||||
.CDERROR:
|
||||
LD BC,IDE.Read.Error ;ERROR
|
||||
IN A,(C)
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
RRCA
|
||||
AND #0F
|
||||
SCF
|
||||
RET
|
||||
.NO_ERR:
|
||||
;BIT IDE.ControlBit.DataRequest,A
|
||||
AND IDE.ControlByte.DataRequest
|
||||
LD A,BIOS.Error.NoErrors
|
||||
RET Z ;NO DATA REQUEST A = 0: BIOS.Error.NoErrors
|
||||
EX DE,HL
|
||||
LD BC,IDE.Read.CylinderLow
|
||||
IN E,(C)
|
||||
LD BC,IDE.Read.CylinderHigh
|
||||
IN D,(C) ;TRANSFER BLOCK SIZE
|
||||
LD A,D
|
||||
OR E
|
||||
RET Z ;BLOCK = 0
|
||||
LD BC,IDE.Read.Counter
|
||||
IN A,(C)
|
||||
AND #02
|
||||
JR NZ,.FROM_CD
|
||||
;.TO_CD:
|
||||
LD BC,IDE.Read.Data
|
||||
.WR_T_CD:
|
||||
OUTI
|
||||
OUTI
|
||||
DEC DE
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JR NZ,.WR_T_CD
|
||||
EX DE,HL
|
||||
JR .AP_LOOP
|
||||
;
|
||||
.FROM_CD:
|
||||
; ¯à®¢¥àª ¯¥à¥¯®«¥¨¥ ¤à¥á ¡ãä¥à
|
||||
LD A,H
|
||||
OR L
|
||||
JR Z,.NULL
|
||||
LD BC,IDE.Read.Data
|
||||
.RD_F_CD:
|
||||
INI
|
||||
INI
|
||||
DEC DE
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JR NZ,.RD_F_CD
|
||||
EX DE,HL
|
||||
JR .AP_LOOP
|
||||
;
|
||||
.NULL: LD BC,IDE.Read.Data
|
||||
.RD_N_CD:
|
||||
IN A,(C)
|
||||
DEC B
|
||||
IN A,(C)
|
||||
DEC B
|
||||
DEC DE
|
||||
DEC DE
|
||||
LD A,D
|
||||
OR E
|
||||
JR NZ,.RD_N_CD
|
||||
; DE = 0
|
||||
JR .AP_LOOP
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
CD_WAITPRT: LD DE,#8000 ; D - MASK, E - PATTERN
|
||||
.Custom: LD BC,IDE.Read.Status
|
||||
LD A,100
|
||||
LD HL,#0000
|
||||
.LOOP_A: EX AF,AF'
|
||||
.LOOP_HL: IN A,(C)
|
||||
CP #FF
|
||||
JR Z,.error
|
||||
AND D
|
||||
CP E
|
||||
;
|
||||
; JR NZ,.NEXT_TRY
|
||||
; AND A
|
||||
; RET
|
||||
RET Z
|
||||
;
|
||||
.NEXT_TRY: DEC L
|
||||
JR NZ,.LOOP_HL
|
||||
DEC H
|
||||
JR NZ,.LOOP_HL
|
||||
EX AF,AF'
|
||||
DEC A
|
||||
JR NZ,.LOOP_A
|
||||
;
|
||||
EX AF,AF'
|
||||
.error: SCF
|
||||
RET
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
;----------------------------------------------------------------------;
|
||||
CD_TEST LD HL,ATAPI_CMD_PACKET.NOP
|
||||
LD DE,0 ;!FIXIT 㦮 «¨?
|
||||
JP AP_COM
|
||||
;----------------------------------------------------------------------;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
ATAPI_CMD_PACKET:
|
||||
.NOP: DUP 12
|
||||
DB #00
|
||||
EDUP
|
||||
;
|
||||
.OPEN: DB #1B
|
||||
DB #00,#00,#00
|
||||
DB #02
|
||||
DB #00,#00,#00,#00,#00,#00,#00
|
||||
;
|
||||
.CLOSE: DB #1B
|
||||
DB #00,#00,#00
|
||||
DB #03
|
||||
DB #00,#00,#00,#00,#00,#00,#00
|
||||
;
|
||||
.READ: DB #28,#00
|
||||
DB #00,#00,#00,#00 ; sector dword
|
||||
DB #00
|
||||
DB #00,#01,#00,#00 ; counter dword
|
||||
DB #00
|
||||
;
|
||||
ATAPI_PACKET:
|
||||
.SECTOR EQU 2
|
||||
.COUNTER EQU 7
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
;
|
||||
; E - Second * 10
|
||||
; PAUSE LD HL,#0000
|
||||
; PAUSE1 DEC L
|
||||
; JR NZ,PAUSE1
|
||||
; DEC H
|
||||
; JR NZ,PAUSE1
|
||||
; DEC E
|
||||
; JR NZ,PAUSE1
|
||||
; RET
|
||||
;
|
||||
@ -2,7 +2,7 @@
|
||||
MACRO WAIT_HDD
|
||||
LD BC,IDE.Read.Status
|
||||
.loop: IN A,(C)
|
||||
BIT IDE.ControlBit.Busy,A
|
||||
BIT IDE.CtrlBit.Busy,A
|
||||
JR NZ,.loop
|
||||
ENDM
|
||||
;______________________________________________________________________:
|
||||
@ -279,8 +279,8 @@ FN_HDD_READ:
|
||||
LD A,IDE.ATA.ReadSectorsWithRetry
|
||||
OUT (C),A
|
||||
.L2: WAIT_HDD
|
||||
;BIT IDE.ControlBit.DataRequest,A
|
||||
AND IDE.ControlByte.DataRequest
|
||||
;BIT IDE.CtrlBit.DataRequest,A
|
||||
AND IDE.CtrlByte.DataRequest
|
||||
JR Z,.RET_PortY
|
||||
;
|
||||
;HD_READ_CONT
|
||||
@ -354,7 +354,7 @@ FN_HDD_WRITE:
|
||||
HD_WR_L2:
|
||||
WAIT_HDD
|
||||
|
||||
BIT IDE.ControlBit.DataRequest,A
|
||||
BIT IDE.CtrlBit.DataRequest,A
|
||||
JR Z,HD_RET
|
||||
|
||||
LD BC,IDE.Write.Data
|
||||
@ -390,7 +390,7 @@ FN_HDD_RECAL:
|
||||
LD A,IDE.ATA.ExecuteDeviceDiagnostic
|
||||
CALL HD_CMD_EXE
|
||||
;AND A
|
||||
CP IDE.ControlByte.Error
|
||||
CP IDE.CtrlByte.Error
|
||||
RET Z
|
||||
LD BC,IDE.Read.Error
|
||||
IN A,(C)
|
||||
@ -627,7 +627,7 @@ FN_HDD_INIT:
|
||||
LD A,IDE.ATA.IdentifyDevice ;!FIXIT ¯¥à¥¤¥« âì
|
||||
OUT (C),A
|
||||
WAIT_HDD
|
||||
AND IDE.ControlByte.DataRequest
|
||||
AND IDE.CtrlByte.DataRequest
|
||||
;JR NZ,.L2
|
||||
SCF
|
||||
RET Z
|
||||
@ -705,7 +705,7 @@ HD_WAIT:
|
||||
LD DE,0
|
||||
.loop: LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
AND IDE.ControlByte.Busy
|
||||
AND IDE.CtrlByte.Busy
|
||||
JR Z,.EXIT
|
||||
DEC DE
|
||||
LD A,D
|
||||
|
||||
@ -33,94 +33,131 @@ DRV_LIST:
|
||||
LD (IX+1),#00 ; DB 0 ;FDD COUNT
|
||||
LD (IX+2),#00 ; DB 0 ;HDD COUNT
|
||||
LD (IX+3),#00 ; DB 0 ;CDROM COUNT
|
||||
; ; BLOCK 28,0 ;RESERVED ;!TODO ᤥ« âì RAMDRIVE âãâ?
|
||||
; ; BLOCK 13,0 ;RESERVED ;!TODO ᤥ« âì RAMDRIVE âãâ?
|
||||
LD (IX+4),#00 ; END FLAG
|
||||
|
||||
;Calculating FDD devices
|
||||
LD A,#FF
|
||||
LD HL,FDD_INI_TABLE.FDD_0
|
||||
INC (IX+1)
|
||||
LD B,8
|
||||
LD A,#FF
|
||||
.TFD0:
|
||||
CP (HL)
|
||||
INC HL
|
||||
JR NZ,.YYYFD0
|
||||
DJNZ .TFD0
|
||||
DEC (IX+1)
|
||||
.YYYFD0:
|
||||
CALL .CHECK_FDD
|
||||
LD HL,FDD_INI_TABLE.FDD_1
|
||||
INC (IX+1)
|
||||
LD B,8
|
||||
LD A,#FF
|
||||
.TFD1:
|
||||
CP (HL)
|
||||
INC HL
|
||||
JR NZ,.YYYFD1
|
||||
DJNZ .TFD1
|
||||
DEC (IX+1)
|
||||
.YYYFD1:
|
||||
;Calculating IDE devices
|
||||
CALL .CHECK_FDD
|
||||
|
||||
; INC (IX+1)
|
||||
; LD B,8
|
||||
; LD A,#FF
|
||||
; .TFD0:
|
||||
; CP (HL)
|
||||
; INC HL
|
||||
; JR NZ,.YYYFD0
|
||||
; DJNZ .TFD0
|
||||
; DEC (IX+1)
|
||||
; .YYYFD0:
|
||||
; LD HL,FDD_INI_TABLE.FDD_1
|
||||
; INC (IX+1)
|
||||
; LD B,8
|
||||
; LD A,#FF
|
||||
; .TFD1:
|
||||
; CP (HL)
|
||||
; INC HL
|
||||
; JR NZ,.YYYFD1
|
||||
; DJNZ .TFD1
|
||||
; DEC (IX+1)
|
||||
; .YYYFD1:
|
||||
|
||||
; A=#FF
|
||||
;Calculating IDE devices IDE TYPE 1-HDD, 2-CD-ROM
|
||||
LD IY,IDE.INIT_TBL_IDE0
|
||||
LD DE,IDE.HDD_INIT_TABLE
|
||||
LD B,4 ; !HARDCODE ª®«-¢® IDE ãáâனáâ¢
|
||||
.CHECK_IDE:
|
||||
LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
CP #FF
|
||||
JR Z,.ABSIDE0
|
||||
JR Z,.NEXT_IDE
|
||||
CP IDE.Device.HDD
|
||||
JR NZ,.NOT_HD0
|
||||
JR NZ,.NOT_HDD
|
||||
INC (IX+2)
|
||||
.NOT_HD0:
|
||||
CP IDE.Device.CDROM
|
||||
JR NZ,.NOT_CD0
|
||||
INC (IX+3)
|
||||
.NOT_CD0:
|
||||
.ABSIDE0:
|
||||
LD IY,IDE.INIT_TBL_IDE1
|
||||
LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
CP #FF
|
||||
JR Z,.ABSIDE1
|
||||
CP IDE.Device.HDD
|
||||
JR NZ,.NOT_HD1
|
||||
INC (IX+2)
|
||||
.NOT_HD1:
|
||||
CP IDE.Device.CDROM
|
||||
JR NZ,.NOT_CD1
|
||||
INC (IX+3)
|
||||
.NOT_CD1:
|
||||
.ABSIDE1:
|
||||
LD IY,IDE.INIT_TBL_IDE2
|
||||
LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
CP #FF
|
||||
JR Z,.ABSIDE2
|
||||
CP IDE.Device.HDD
|
||||
JR NZ,.NOT_HD2
|
||||
INC (IX+2)
|
||||
.NOT_HD2:
|
||||
CP IDE.Device.CDROM
|
||||
JR NZ,.NOT_CD2
|
||||
INC (IX+3)
|
||||
.NOT_CD2:
|
||||
.ABSIDE2:
|
||||
LD IY,IDE.INIT_TBL_IDE3
|
||||
LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
CP #FF
|
||||
JR Z,.check_exit
|
||||
CP IDE.Device.HDD
|
||||
JR NZ,.NOT_HD3
|
||||
INC (IX+2)
|
||||
.NOT_HD3:
|
||||
CP IDE.Device.CDROM
|
||||
JR NZ,.check_exit
|
||||
.NOT_HDD:
|
||||
CP IDE.Device.ATAPI
|
||||
JR NZ,.NEXT_IDE
|
||||
INC (IX+3)
|
||||
.NEXT_IDE:
|
||||
ADD IY,DE
|
||||
DJNZ .CHECK_IDE
|
||||
|
||||
; LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
; CP #FF
|
||||
; JR Z,.ABSIDE0
|
||||
; CP IDE.Device.HDD
|
||||
; JR NZ,.NOT_HD0
|
||||
; INC (IX+2)
|
||||
; .NOT_HD0:
|
||||
; CP IDE.Device.ATAPI
|
||||
; JR NZ,.NOT_CD0
|
||||
; INC (IX+3)
|
||||
; .NOT_CD0:
|
||||
; .ABSIDE0:
|
||||
; LD IY,IDE.INIT_TBL_IDE1
|
||||
; LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
; CP #FF
|
||||
; JR Z,.ABSIDE1
|
||||
; CP IDE.Device.HDD
|
||||
; JR NZ,.NOT_HD1
|
||||
; INC (IX+2)
|
||||
; .NOT_HD1:
|
||||
; CP IDE.Device.ATAPI
|
||||
; JR NZ,.NOT_CD1
|
||||
; INC (IX+3)
|
||||
; .NOT_CD1:
|
||||
; .ABSIDE1:
|
||||
; LD IY,IDE.INIT_TBL_IDE2
|
||||
; LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
; CP #FF
|
||||
; JR Z,.ABSIDE2
|
||||
; CP IDE.Device.HDD
|
||||
; JR NZ,.NOT_HD2
|
||||
; INC (IX+2)
|
||||
; .NOT_HD2:
|
||||
; CP IDE.Device.ATAPI
|
||||
; JR NZ,.NOT_CD2
|
||||
; INC (IX+3)
|
||||
; .NOT_CD2:
|
||||
; .ABSIDE2:
|
||||
; LD IY,IDE.INIT_TBL_IDE3
|
||||
; LD A,(IY+IDE.HDD_INIT_TABLE.DriveType) ;IDE TYPE 1-HDD, 2-CD-ROM
|
||||
; CP #FF
|
||||
; JR Z,.check_exit
|
||||
; CP IDE.Device.HDD
|
||||
; JR NZ,.NOT_HD3
|
||||
; INC (IX+2)
|
||||
; .NOT_HD3:
|
||||
; CP IDE.Device.ATAPI
|
||||
; JR NZ,.check_exit
|
||||
; INC (IX+3)
|
||||
|
||||
.check_exit:
|
||||
POP IY
|
||||
POP AF
|
||||
OUT (SLOT3),A
|
||||
XOR A
|
||||
RET
|
||||
;
|
||||
; A=#FF
|
||||
.CHECK_FDD:
|
||||
INC (IX+1)
|
||||
LD B,8
|
||||
.TFD0: CP (HL)
|
||||
INC HL
|
||||
RET NZ
|
||||
DJNZ .TFD0
|
||||
DEC (IX+1)
|
||||
RET
|
||||
;
|
||||
|
||||
INCLUDE 'EXTENDED/FDD_DRIVER_2.asm'
|
||||
INCLUDE 'EXTENDED/RAM_DISK_DRIVER_1.asm'
|
||||
INCLUDE 'EXTENDED/IDE/HDD_DRV.asm'
|
||||
INCLUDE 'EXTENDED/IDE/CD_DRV.asm'
|
||||
INCLUDE 'EXTENDED/IDE/ATA_DRV.asm'
|
||||
INCLUDE 'EXTENDED/IDE/ATAPI_DRV.asm'
|
||||
INCLUDE 'EXTENDED/IDE/SHARED.asm'
|
||||
|
||||
|
||||
|
||||
@ -290,7 +290,7 @@ AUTODETECTING: CALL DETECTORS.CheckChanel
|
||||
; enter point for ATAPI in setup
|
||||
.Its_ATAPI: CALL DETECTORS.IdentPDevChk
|
||||
JR C,.IDE_ABSENT
|
||||
LD A,IDE.Device.CDROM
|
||||
LD A,IDE.Device.ATAPI
|
||||
LD (IDEDEV),A
|
||||
JR .get
|
||||
|
||||
@ -331,8 +331,8 @@ SETUP_FROM_CMOS:
|
||||
JR Z,.step1
|
||||
;
|
||||
LD IX,SEC_SLAVE_CMOS_T
|
||||
.step1: LD HL,TEMP
|
||||
LD DE,TEMP+1
|
||||
.step1: LD HL,IDENTIFY_DEVICE_BUFFER
|
||||
LD DE,IDENTIFY_DEVICE_BUFFER+1
|
||||
LD BC,511
|
||||
LD (HL),0
|
||||
LDIR
|
||||
@ -346,7 +346,7 @@ SETUP_FROM_CMOS:
|
||||
;
|
||||
.step2: LD A,(IX+2) ;M_HEAD
|
||||
CALL READCMS
|
||||
LD (TEMP+3*2),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. HEADS PER TRACK
|
||||
LD (IDENTIFY_DEVICE_BUFFER.NumHeads),A
|
||||
;
|
||||
LD A,(IX+1) ;M_CYLH
|
||||
CALL READCMS
|
||||
@ -356,42 +356,40 @@ SETUP_FROM_CMOS:
|
||||
CALL READCMS
|
||||
POP HL
|
||||
LD L,A
|
||||
LD (TEMP+1*2),HL ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS
|
||||
LD (IDENTIFY_DEVICE_BUFFER.NumCylinders),HL
|
||||
;
|
||||
LD A,(IX+3) ;M_SECT
|
||||
CALL READCMS
|
||||
LD (TEMP+6*2),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
|
||||
LD (IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A
|
||||
;
|
||||
LD A,IDE.Device.HDD
|
||||
LD (IDEDEV),A
|
||||
CALL IDESPEC
|
||||
RET
|
||||
; CALL IDESPEC
|
||||
; RET
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
IDESPEC:
|
||||
IN A,(SLOT3)
|
||||
IDESPEC: IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
LD A,SYS_PAGE
|
||||
OUT (SLOT3),A
|
||||
LD A,(IDEDEV)
|
||||
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
|
||||
CP IDE.Device.CDROM
|
||||
JP Z,.FOR_CDR
|
||||
CP IDE.Device.ATAPI
|
||||
JP Z,.FOR_ATAPI
|
||||
;
|
||||
LD BC,IDE.Read.Control
|
||||
IN A,(C)
|
||||
AND #F0
|
||||
LD B,A
|
||||
LD A,(TEMP+#06) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. HEADS PER TRACK
|
||||
LD A,(IDENTIFY_DEVICE_BUFFER.NumHeads)
|
||||
LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),A
|
||||
DEC A
|
||||
AND #0F
|
||||
OR B
|
||||
LD B,A
|
||||
LD A,(TEMP+#63) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. LBA/NON-LBA bit 1 (FROM ZERO!)
|
||||
BIT 1,A
|
||||
LD A,(IDENTIFY_DEVICE_BUFFER.Capabilities_high)
|
||||
;BIT 1,A
|
||||
AND %0000'0010
|
||||
JR Z,.NONLBA
|
||||
;
|
||||
SET 6,B
|
||||
@ -402,10 +400,10 @@ IDESPEC:
|
||||
LD HL,ICHANEL
|
||||
OR (HL)
|
||||
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
|
||||
LD HL,(TEMP+#02) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS
|
||||
LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders)
|
||||
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L
|
||||
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H
|
||||
LD A,(TEMP+#0C) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
|
||||
LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack)
|
||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
|
||||
IF IDE_Optimization
|
||||
LD B,high IDE.Write.Counter
|
||||
@ -420,11 +418,11 @@ IDESPEC:
|
||||
LD H,B
|
||||
LD L,B
|
||||
LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD
|
||||
|
||||
;
|
||||
.loop: ADD HL,BC
|
||||
DEC A
|
||||
JR NZ,.loop
|
||||
|
||||
;
|
||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L
|
||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H
|
||||
.END: ; [x] save hdd parameters to cmos for "setup" in settings
|
||||
@ -435,7 +433,7 @@ IDESPEC:
|
||||
AND A
|
||||
RET
|
||||
;
|
||||
.FOR_CDR: LD BC,IDE.Read.Control
|
||||
.FOR_ATAPI: LD BC,IDE.Read.Control
|
||||
IN A,(C)
|
||||
AND #F0
|
||||
LD HL,ICHANEL
|
||||
@ -449,20 +447,20 @@ IDESPEC:
|
||||
IDE_CMD:
|
||||
PUSH AF
|
||||
LD HL,PAUSES.WAIT.IDE
|
||||
LD DE,256*IDE.ControlByte.Busy + 0
|
||||
LD DE,256*IDE.CtrlByte.Busy + 0
|
||||
CALL BITS_WAITS.WAIT_PRT
|
||||
POP HL
|
||||
RET C
|
||||
INC B ; LD BC,IDE.Write.Command
|
||||
OUT (C),H
|
||||
LD HL,PAUSES.WAIT.IDE
|
||||
;LD DE,256*IDE.ControlByte.Busy + 0
|
||||
;LD DE,256*IDE.CtrlByte.Busy + 0
|
||||
JR BITS_WAITS.WAIT_PRT
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
MODEL: LD HL,TEMP+27*2 ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã.
|
||||
MODEL: LD HL,IDENTIFY_DEVICE_BUFFER.ModelNumber
|
||||
LD A,(HL)
|
||||
OR A
|
||||
JR Z,.unknown
|
||||
@ -512,7 +510,7 @@ BITS_WAITS:
|
||||
;SCF
|
||||
;RET Z
|
||||
;
|
||||
AND IDE.ControlByte.Busy; + IDE.ControlByte.DataRequest
|
||||
AND IDE.CtrlByte.Busy; + IDE.CtrlByte.DataRequest
|
||||
RET Z
|
||||
;
|
||||
HALT
|
||||
@ -611,7 +609,7 @@ SaveToCMOS:
|
||||
;
|
||||
LD IX,PRIM_SLAVE_CMOS_T
|
||||
.save_to_cmos:
|
||||
LD HL,(TEMP+1*2)
|
||||
LD HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders)
|
||||
LD B,L
|
||||
LD A,(IX+0)
|
||||
CALL WRITCMS ; Cylinder low
|
||||
@ -620,12 +618,12 @@ SaveToCMOS:
|
||||
LD A,(IX+1)
|
||||
CALL WRITCMS ; Cylinder high
|
||||
|
||||
LD A,(TEMP+3*2)
|
||||
LD A,(IDENTIFY_DEVICE_BUFFER.NumHeads)
|
||||
LD B,A
|
||||
LD A,(IX+2)
|
||||
CALL WRITCMS ; Heads
|
||||
|
||||
LD A,(TEMP+6*2)
|
||||
LD A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack)
|
||||
LD B,A
|
||||
LD A,(IX+3)
|
||||
JP WRITCMS ; Heads
|
||||
@ -667,11 +665,11 @@ Bug31SecCheck: LD A,(MasterSlave)
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
GETPARAM:
|
||||
LD HL,PAUSES.WAIT.IDE
|
||||
LD DE,IDE.ControlByte.DataRequest * 256 + IDE.ControlByte.DataRequest
|
||||
LD DE,IDE.CtrlByte.DataRequest * 256 + IDE.CtrlByte.DataRequest
|
||||
CALL BITS_WAITS.WAIT_PRT
|
||||
RET C
|
||||
LD BC,IDE.Read.Data
|
||||
LD HL,TEMP
|
||||
LD HL,IDENTIFY_DEVICE_BUFFER
|
||||
INIR
|
||||
INIR
|
||||
CALL IDESPEC
|
||||
@ -693,11 +691,11 @@ DETECTORS:
|
||||
LD BC,IDE.Write.Counter
|
||||
OUT (C),A
|
||||
LD HL,PAUSES.WAIT.SMALL
|
||||
LD DE,IDE.ControlByte.Busy*256 + 0
|
||||
LD DE,IDE.CtrlByte.Busy*256 + 0
|
||||
CALL BITS_WAITS.WAIT_PRT
|
||||
RET C
|
||||
;
|
||||
LD BC,IDE.Read.Counter ; LD BC,IDE.Read.Counter
|
||||
LD BC,IDE.Read.Counter
|
||||
IN A,(C)
|
||||
CP .test_counter
|
||||
RET Z
|
||||
@ -722,8 +720,8 @@ DETECTORS:
|
||||
SCF
|
||||
RET Z
|
||||
;
|
||||
AND IDE.ControlByte.Busy + IDE.ControlByte.DataRequest + IDE.ControlByte.Error
|
||||
CP IDE.ControlByte.Error
|
||||
AND IDE.CtrlByte.Busy + IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error
|
||||
CP IDE.CtrlByte.Error
|
||||
RET Z
|
||||
;
|
||||
HALT
|
||||
@ -748,7 +746,7 @@ DETECTORS:
|
||||
LD BC,IDE.Write.Command
|
||||
OUT (C),E
|
||||
;
|
||||
LD DE,IDE.ControlByte.Busy * 256 + 0
|
||||
LD DE,IDE.CtrlByte.Busy * 256 + 0
|
||||
LD HL,PAUSES.WAIT.IDE
|
||||
CALL BITS_WAITS.WAIT_PRT
|
||||
RET C ; Absent
|
||||
@ -758,7 +756,7 @@ DETECTORS:
|
||||
RRCA
|
||||
JR C,.non_ATA
|
||||
;
|
||||
AND (IDE.ControlByte.DataRequest + IDE.ControlByte.Ready) / 2
|
||||
AND (IDE.CtrlByte.DataRequest + IDE.CtrlByte.Ready) / 2
|
||||
SCF
|
||||
RET Z
|
||||
;
|
||||
@ -778,19 +776,19 @@ DETECTORS:
|
||||
; ATAPI or Absent
|
||||
; Exit: CF - No device
|
||||
; NC - ATAPI
|
||||
.IdentPDevChk: LD E,IDE.ATAPI.IdentifyPackedDevice
|
||||
.IdentPDevChk: LD E,IDE.ATAPI.IdentifyPacketDevice
|
||||
LD BC,IDE.Write.Command
|
||||
OUT (C),E
|
||||
LD HL,PAUSES.WAIT.IDE
|
||||
LD DE,IDE.ControlByte.Busy*256 + 0
|
||||
LD DE,IDE.CtrlByte.Busy*256 + 0
|
||||
CALL BITS_WAITS.WAIT_PRT
|
||||
RET C
|
||||
;
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
RRCA
|
||||
RET C
|
||||
XOR A
|
||||
; RET C
|
||||
; XOR A
|
||||
RET
|
||||
;-------;
|
||||
|
||||
|
||||
@ -75,6 +75,7 @@
|
||||
|
||||
;!FIXIT ®à¬ «ì® ¯à®¯¨á âì
|
||||
TEMP EQU #7E00 ; !HARDCODE
|
||||
IDENTIFY_DEVICE_BUFFER _ATA_IDENTIFY_DEVICE_DATA = TEMP
|
||||
MEMMAP2 EQU TEMP ; ¤®«¦® ¡ëâì ¢ë஢¥® ¯® ALIGN 256
|
||||
TPOINTD EQU TEMP - SYS_PAGE.RAMD_KEYS.NUM; - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023
|
||||
ASSERT (low TEMP = 0) or (low MEMMAP2 = 0), "ERROR Align 256!!!"
|
||||
@ -1122,7 +1123,7 @@ HDSTART:
|
||||
EX AF,AF'
|
||||
OUT (SLOT3),A
|
||||
EX AF,AF'
|
||||
CP IDE.Device.CDROM
|
||||
CP IDE.Device.ATAPI
|
||||
JP Z,CDSTART
|
||||
PUSH AF
|
||||
PUSH BC
|
||||
|
||||
@ -58,7 +58,7 @@
|
||||
"TrDosC", -- 6
|
||||
"TrDosD", -- 7
|
||||
"SetTime", -- 8 DEFINES.INC --> NEW_FEATURE
|
||||
"HddWrPr", -- 9 DEFINES.INC --> HDDwriteProtect
|
||||
--"HddWrPr", -- 9 DEFINES.INC --> HDDwriteProtect
|
||||
-- 10
|
||||
-- 11
|
||||
-- 12
|
||||
@ -70,7 +70,7 @@
|
||||
}
|
||||
}
|
||||
DeleteValueByDEFINE(SettingsTabsOrder,"NEW_FEATURE","SetTime")
|
||||
DeleteValueByDEFINE(SettingsTabsOrder,"HDDwriteProtect","HddWrPr")
|
||||
--DeleteValueByDEFINE(SettingsTabsOrder,"HDDwriteProtect","HddWrPr")
|
||||
DeleteValueByDEFINE(SettingsTabsOrder,"UnusedSettingsFeatures","MemTest")
|
||||
DeleteValueByDEFINE(SettingsTabsOrder,"UnusedSettingsFeatures","UpdBios")
|
||||
DeleteValueByDEFINE(SettingsTabsOrder,"UnusedSettingsFeatures","TypRate")
|
||||
@ -340,16 +340,16 @@ SettingsItemsTabs:
|
||||
DB msgStrings.valCdRom
|
||||
DB msgStrings.valDash6
|
||||
|
||||
IF HDDwriteProtect
|
||||
_mSETitemParams HddWrPr
|
||||
DW OnChangeAction.nothing
|
||||
IF NEW_FEATURE : DB paramLine : ENDIF
|
||||
DB columnNum,lineNum
|
||||
DB paramName
|
||||
DW CMOS_CELL.Options.Mask.HDDwriteProtect : DB %0000'0001
|
||||
DB msgStrings.valDisabled
|
||||
DB msgStrings.valEnabled
|
||||
ENDIF
|
||||
; IF HDDwriteProtect
|
||||
; _mSETitemParams HddWrPr
|
||||
; DW OnChangeAction.nothing
|
||||
; IF NEW_FEATURE : DB paramLine : ENDIF
|
||||
; DB columnNum,lineNum
|
||||
; DB paramName
|
||||
; DW CMOS_CELL.Options.Mask.HDDwriteProtect : DB %0000'0001
|
||||
; DB msgStrings.valDisabled
|
||||
; DB msgStrings.valEnabled
|
||||
; ENDIF
|
||||
|
||||
_mSETitemParams ScreenY
|
||||
DW OnChangeAction.setXYpos
|
||||
@ -652,9 +652,9 @@ msgStrings:
|
||||
_mSetStr parPriIdeSl, tmp_Counter : DZ 'Primary IDE Slave',#FF,' : '
|
||||
_mSetStr parSecIdeMA, tmp_Counter : DZ 'Secondary IDE Master',#FF,' : '
|
||||
_mSetStr parSecIdeSl, tmp_Counter : DZ 'Secondary IDE Slave',#FF,' : '
|
||||
IF HDDwriteProtect
|
||||
_mSetStr parHddWrPr, tmp_Counter : DZ 'HDD write protect : '
|
||||
ENDIF
|
||||
; IF HDDwriteProtect
|
||||
; _mSetStr parHddWrPr, tmp_Counter : DZ 'HDD write protect : '
|
||||
; ENDIF
|
||||
_mSetStr parScreenY, tmp_Counter : DZ 'Y-screen position : '
|
||||
_mSetStr valMinus7, tmp_Counter : DZ '-7'
|
||||
_mSetStr valMinus6, tmp_Counter : DZ '-6'
|
||||
@ -828,9 +828,9 @@ msgRusStrings:
|
||||
_mSetStrRus parPriIdeSl, tmp_Counter : DZ 'Primary IDE Slave',#FF,' : '
|
||||
_mSetStrRus parSecIdeMA, tmp_Counter : DZ 'Secondary IDE Master',#FF,' : '
|
||||
_mSetStrRus parSecIdeSl, tmp_Counter : DZ 'Secondary IDE Slave',#FF,' : '
|
||||
IF HDDwriteProtect
|
||||
_mSetStrRus parHddWrPr, tmp_Counter : DZ '‡ é¨â § ¯¨á¨ HDD : '
|
||||
ENDIF
|
||||
; IF HDDwriteProtect
|
||||
; _mSetStrRus parHddWrPr, tmp_Counter : DZ '‡ é¨â § ¯¨á¨ HDD : '
|
||||
; ENDIF
|
||||
_mSetStrRus parScreenY, tmp_Counter : DZ '‘¤¢¨£ íªà ¯® Y : '
|
||||
_mSetStrRus valMinus7, tmp_Counter : DZ '-7'
|
||||
_mSetStrRus valMinus6, tmp_Counter : DZ '-6'
|
||||
|
||||
@ -19,7 +19,8 @@ BETA_RC EQU 1 ;
|
||||
;----------------------------[ TEST ]---------------------------;
|
||||
DEFINE TEST_INT 1 ; ’¥áâ®¢ë© ®¡à ¡®â稪 ¯®«ì§®¢ ⥫ì᪮£® INT
|
||||
DEFINE NEW_FEATURE 0 ; !TODO ¯ãªâë ¢ á¥â ¯
|
||||
DEFINE HDDwriteProtect 0 ; áâ à ï ä¨èª ¤«ï äãªæ¨© 5x
|
||||
;DEFINE HDDwriteProtect 0 ; áâ à ï ä¨èª ¤«ï äãªæ¨© 5x
|
||||
DEFINE FDD_NormalCount 0 ; !TODO
|
||||
DEFINE UnusedSettingsFeatures 0 ;
|
||||
;DEFINE OPTIMIZE_RW_PROCEDURE 0 ;
|
||||
;===============================================================;
|
||||
@ -2,6 +2,7 @@
|
||||
;---------[All shared includes]---------
|
||||
INCLUDE 'src/bios/shared/DEFINES.INC' ; Shared defines
|
||||
INCLUDE 'Shared_Includes/structures/FileSystem.inc'
|
||||
INCLUDE 'Shared_Includes/structures/ATA_ATAPI.inc'
|
||||
INCLUDE 'src/bios/Loader/Loader.asm' ; Bitstream loader as macros
|
||||
INCLUDE 'src/bios/shared/CompMacro.asm' ; ¬ ªà®áë
|
||||
INCLUDE 'Shared_Includes/constants/SP2000.inc' ; ª®áâ âë
|
||||
|
||||
Loading…
Reference in New Issue
Block a user