flex_nav/plugins/cdplayer/cdrom.a80

254 lines
3.3 KiB
Plaintext

; LAST UPDATE: 11.03.2025 savelij
; CDROM.A - Alexander Shabarshin 13.10.2002
IDE_DAW equ 0x0150
IDE_DAR equ 0x0050
IDE_HDW equ 0x4152
IDE_HDR equ 0x4052
IDE_COM equ 0x4153
IDE_STA equ 0x4053
IDE_CIL equ 0x0154
IDE_CIH equ 0x0155
; Based on Vlad Sotnikov source files
; Wait when device will free
NO_BSY: ld bc,IDE_STA
in a,(c)
rlca
ret nc
jr NO_BSY
; Wait ready data transfer
WAIT_DRQ: ld bc,IDE_STA
in a,(c)
bit 3,a
ret nz
jr WAIT_DRQ
; Error test
; ---
; fc - error
IS_ERROR: ld bc,IDE_STA
in a,(c)
rrca
ret
; Set Slave device
SEL_SLAVE: ld a,0xB0
jr SEL_DEV
; Set Master device
SEL_MASTER: ld a,0xA0
jr SEL_DEV
; Set device (Slave or Master)
; A - 0xA0 or 0xB0
; ---
; fc - 1 ???
SEL_DEV: ld bc,IDE_HDW
out (c),a
ld bc,IDE_HDR
in a,(c)
rlca
ret
; Save HL to cilinder register
HL_TO_LEN: ld bc,IDE_CIL
out (c),l
ld bc,IDE_CIH
out (c),h
ret
; Load HL from cilinder register
LEN_TO_HL: ld bc,IDE_CIL
in l,(c)
ld bc,IDE_CIH
in h,(c)
ret
; Read from CD-ROM sector 2048 bytes
CD_READ: call NO_BSY
call WAIT_DRQ
ld hl,CD_BUF
ld bc,IDE_DAR
ld d,0
CD_LOOP: ini
ini
ini
ini
ini
ini
ini
ini
dec d
jr nz,CD_LOOP
ld hl,CD_BUF
ld bc,1024
CD_TRANS: ld d,(hl)
inc hl
ld e,(hl)
dec hl
ld (hl),e
inc hl
ld (hl),d
inc hl
dec bc
ld a,b
or c
jr nz,CD_TRANS
ret
; Send ATAPI command
; HL - address of 12-bytes command
SEND_ATAPI: ld de,CD_BUF
di
; ACC_SetBlockSize
ACCEL ACCELCMD.SET_BUFFER
ld a,12
; ACC_CopyBlock
ACCEL ACCELCMD.COPY
ld a,(hl)
ld (de),a
; ACC_Off
ACCEL ACCELCMD.OFF
ei
SA0: call NO_BSY
; call IS_ERROR
; jr c,SA0
SA1: call SEL_SLAVE
call NO_BSY
SA2: ld bc,IDE_STA
in a,(c)
and 0x40
jr z,SA2
ld a,0xA0
ld bc,IDE_COM
out (c),a
SA3: call NO_BSY
call IS_ERROR
jp c,SA0
call WAIT_DRQ
ld hl,CD_BUF
ld bc,IDE_DAW
outi
outi
outi
outi
outi
outi
outi
outi
outi
outi
outi
outi
ret
; Initialisation slave CD-ROM
; ---
; fc - CD-ROM exists
CD_INI: ld de,0xFFFF
call SEL_SLAVE
ld bc,IDE_STA
in a,(c)
rlca
call c,NO_CDROM
ld hl,0
call HL_TO_LEN
ld a,0xEC
ld bc,IDE_COM
out (c),a
call NO_BSY
call LEN_TO_HL
; call whl
; call nln
push hl
pop de
ld bc,0xEB14
or a
sbc hl,bc
; call nz,NO_CDROM
ld a,0xA1
ld bc,IDE_COM
out (c),a
call CD_READ
ld hl,CD_BUF
; inc hl
ld a,(hl)
and 0x1F
cp 5
jr nz,NO_CDROM
scf
ret
NO_CDROM: pop hl
xor a
ret
SAVE_BUF: push hl
ld hl,FNAME
; ld c,Dss.Create
; ld a,0
; rst ToDSS
SPDSS DSSF.CREATE,,0
ld (FHAND),a
; ld c,Dss.Write
ld a,(FHAND)
ld de,2048
ld hl,CD_BUF
; rst ToDSS
SPDSS DSSF.WRITE
; !FIXIT WRITE ERROR
; ld c,0x12
ld a,(FHAND)
; rst ToDSS
SPDSS DSSF.CLOSE
pop hl
ret
FNAME db "cd_buf.dat",0
FHAND db 0
AP_NOP: ld hl,AP_00
call SEND_ATAPI
ret
; ATAPI command
; HL - address of ATAPI command (AP_*)
ATAPI:
AP_COM: call SEND_ATAPI
ret
AP_00 db 0x00
DB 11 DUP 0
AP_TR0 db 0x01
DB 11 DUP 0
AP_CD1 db 0x1B
DB 3 DUP 0
db 1
DB 7 DUP 0
AP_CD2 db 0x1B
DB 3 DUP 0
db 2
DB 7 DUP 0
AP_CD3 db 0x1B
DB 3 DUP 0
db 3
DB 7 DUP 0
AP_PL0 db 0x4B
DB 11 DUP 0
AP_PL1 db 0x4B
DB 7 DUP 0
db 1
DB 3 DUP 0
AP_PLA db 0x47
DB 2 DUP 0
db 0,2,0
db 80,0,74
DB 3 DUP 0
CD_BUF DB 2048 DUP 0