mirror of
https://github.com/Tolik-Trek/Sprinter-BIOS.git
synced 2026-06-15 09:21:46 +03:00
407 lines
7.3 KiB
NASM
407 lines
7.3 KiB
NASM
;[ ] 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
|
||
|
||
;!TEST
|
||
;LD A,H
|
||
;LD (RAM_ATAPI_READ+SECREAD+0),A ;R01
|
||
;LD A,L
|
||
;LD (RAM_ATAPI_READ+SECREAD+1),A ;R01
|
||
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
|
||
;R01 LD HL,CMDREAD
|
||
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 ;!HARDCODE error code
|
||
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
|
||
; #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 A,B
|
||
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
|
||
EXX
|
||
BIT IDE.ControlBit.Error,A
|
||
JR NZ,.CDERROR
|
||
JR NC,.YEP_DRQ
|
||
LD A,#80 ; 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
|
||
LD A,BIOS.Error.NoErrors
|
||
RET Z ;NO DATA REQUEST
|
||
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
|
||
;CP #02
|
||
JP 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
|
||
;----------------------------------------------------------------------;
|
||
|
||
|
||
;----------------------------------------------------------------------;
|
||
; D - MASK
|
||
; E - PATTERN
|
||
CD_WAITPRT:
|
||
LD BC,IDE.Read.Status
|
||
LD A,100
|
||
LD HL,#0000
|
||
.CWAITPX:
|
||
EX AF,AF'
|
||
.CWAITP0:
|
||
IN A,(C)
|
||
CP #FF
|
||
JR Z,.CWAITP1
|
||
AND D
|
||
CP E
|
||
JR NZ,.CWAITP2
|
||
AND A
|
||
RET
|
||
.CWAITP2:
|
||
DEC L
|
||
JR NZ,.CWAITP0
|
||
DEC H
|
||
JR NZ,.CWAITP0
|
||
EX AF,AF'
|
||
DEC A
|
||
JR NZ,.CWAITPX
|
||
EX AF,AF'
|
||
.CWAITP1:
|
||
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
|
||
; |