; 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