Estex-DSS/DSS/drivers/media/ATAPI/Hidden/Cdriver.asm
2024-12-04 22:39:16 +10:00

357 lines
4.9 KiB
NASM

;CD ROM DRIVE DRIVER
;---------------------------------------------------------------
;Rev Date Name Description
;---------------------------------------------------------------
; 02-08-2001 DNS Initial this module
;---------------------------------------------------------------
;========================================================
R170 EQU #0050 ;Data
R171 EQU #0051 ;Error
R172 EQU #0052 ;Direct
R173 EQU #0053 ;Reserve
R174 EQU #0054 ;Lenght block low
R175 EQU #0055 ;Lenght block high
R176 EQU #4052 ;Drive device
R177 EQU #4053 ;Status
W170 EQU #0150 ;Data
W171 EQU #0151 ;????
W172 EQU #0152 ;????
W173 EQU #0153 ;Reserve
W174 EQU #0154 ;Lenght block low
W175 EQU #0155 ;Lenght block high
W176 EQU #4152 ;Drive device
W177 EQU #4153 ;Command
RAM_ATAPI_PK EQU #FEE0
RAM_ATAPI_READ EQU #FEF0
; BSY EQU 7
; DRQ EQU 3
; ERR EQU 0
RESETC
RESETCD LD B,50
RESECD PUSH BC
LD A,1
CALL CD_TEST
POP BC
RET NC
EI
HALT
DJNZ RESECD
RET
LREADC
READC LD A,1
JP CD_READ
OPENC LD A,1
JP CD_OPEN
CLOSC LD A,1
JP CD_CLOS
SIZESEC EQU #0800
PKTSIZE EQU 12
CD_TEST LD HL,CMDNOPP
LD DE,0
CALL AP_COM
RET
DETECTC
CD_OPEN LD HL,CMDOPEN
LD DE,0
CALL AP_COM
RET
CD_CLOS LD HL,CMDCLOS
LD DE,0
CALL AP_COM
RET
; HL:IX - SECTOR
; DE - ADDRESS
; B - SECTOR COUNT
; A - DRIVE
CD_READ LD C,A
EXX
LD C,PAGE3
IN A,(C)
PUSH AF
LD A,SYSPAGE
OUT (C),A
LD HL,CMDREAD
LD DE,RAM_ATAPI_READ
LD BC,PKTSIZE
LDIR
EXX
LD A,H
LD (RAM_ATAPI_READ+SECREAD+0),A ;R01
LD A,L
LD (RAM_ATAPI_READ+SECREAD+1),A ;R01
LD A,XH
LD (RAM_ATAPI_READ+SECREAD+2),A ;R01
LD A,XL
LD (RAM_ATAPI_READ+SECREAD+3),A ;R01
LD A,B
LD (RAM_ATAPI_READ+COUNT+1),A ;R01
POP AF
OUT (PAGE3),A
;R01 LD HL,CMDREAD
LD HL,RAM_ATAPI_READ
LD A,C
CALL AP_COM
RET
; INPUT: HL - AP paket (12bytes)
; RETURN: CF - ERROR
; 01h - RECOVERED ERROR
; 02h - NOT READY
; 03h - MEDIUM ERROR
; 04h - HARDWARE ERROR
; 05h - ILLEGAL REQUEST
; 06h - UNIT ATTETION
; 07h - DATA PROTECT
; 0Bh - ABORTED COMMAND
; 80h - TIME OUT
AP_COM AND #01
LD A,#A0
JR Z,APCOM1
LD A,#B0
APCOM1 LD BC,W176
OUT (C),A ;SELECT DRIVE
EXX
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
JR NC,CDREADY
LD BC,W177
LD A,#08
OUT (C),A
LD B,#00
DJNZ $
EXX
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
RET C
CDREADY
LD C,PAGE3
IN B,(C)
PUSH DE
PUSH BC
LD A,SYSPAGE
OUT (C),A
LD A,B
LD DE,RAM_ATAPI_PK
LD BC,PKTSIZE
LDIR
POP BC
POP DE
OUT (C),B
XOR A
EXX
OUT (C),A
XOR A
LD BC,W171
OUT (C),A
LD DE,SIZESEC ;SIZE BLOCK
LD BC,W174
OUT (C),E
LD BC,W175
OUT (C),D
LD BC,W177
LD A,#A0
OUT (C),A
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
RET C
EXX
IF _MAME
LD DE,#0808
ELSE
LD DE,#0908
ENDIF
LD BC,R177
CALL CWAITPRT
EXX
BIT ERR,A
JR NZ,CDERROR
JR NC,YEP_DRQ
LD A,#80
RET
YEP_DRQ LD C,PAGE3
IN B,(C)
PUSH BC
LD A,SYSPAGE
OUT (PAGE3),A
LD HL,RAM_ATAPI_PK
LD BC,W170
LD A,PKTSIZE
SRL A
OUTPKT OUTI
OUTI
DEC A
JR NZ,OUTPKT
POP BC
OUT (C),B
LD B,#80
DJNZ $
AP_LOOP EXX
LD DE,#8000
LD BC,R177
CALL CWAITPRT
EXX
RET C
LD BC,R177
IN A,(C)
BIT ERR,A
JR Z,NO_ERR
CDERROR LD BC,R171 ;ERROR
IN A,(C)
RRCA
RRCA
RRCA
RRCA
AND #0F
SCF
RET
NO_ERR BIT DRQ,A
LD A,0
RET Z ;NO DATA REQUEST
EX DE,HL
LD BC,R174
IN E,(C)
LD BC,R175
IN D,(C) ;TRANSFER BLOCK SIZE
LD A,D
OR E
RET Z ;BLOCK = 0
LD BC,R172
IN A,(C)
AND #02
CP #02
JP Z,FROM_CD
TO_CD LD BC,R170
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,R170
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,R170
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
; E - Second * 10
PAUSE LD HL,#0000
PAUSE1 DEC L
JR NZ,PAUSE1
DEC H
JR NZ,PAUSE1
DEC E
JR NZ,PAUSE1
RET
; D - MASK
; E - PATTERN
; BC - PORT
CWAITPRT
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
CMDNOPP DEFB #00
DEFB 00,00,00
DEFB #00
DEFB 00,00,00
DEFB 00,00,00
DEFB #00
CMDOPEN DEFB #1B
DEFB #00,#00,#00
DEFB #02
DEFB #00,#00,#00,#00,#00,#00,#00
CMDCLOS DEFB #1B
DEFB #00,#00,#00
DEFB #03
DEFB #00,#00,#00,#00,#00,#00,#00
CMDREAD DEFB #28,#00
SECREAD EQU $-CMDREAD
DEFB #00,#00,#00,#00
DEFB #00
COUNT EQU $-CMDREAD
DEFB #00,#01
DEFB #00,#00,#00
;========================================================