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

373 lines
5.3 KiB
NASM

MASTER EQU 0
SLAVE EQU 1
;========================================================
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
BSY EQU 7
DRQ EQU 3
ERR EQU 0
;-----------------------------------------------------------------------;
SIZESEC: DW #0800
PKTSIZE: DB 12
;-----------------------------------------------------------------------;
CDCMD BIT 7,C
JP NZ,EXTCD
INC C
DEC C
JP Z,RESETCD ; 0
DEC C
JP Z,RESETCD ; 1
DEC C
JP Z,NOPCDC ; 2
DEC C
JP Z,CHEK_C ; 3
DEC C
JP Z,GBPB_C ; 4 ; [ ] ¯¥à¥­¥á⨠¢ DSS
DEC C
JP Z,READC ; 5
DEC C
JP Z,NOPCDC ; 6
NOPCDC LD A,1
SCF
RET
EXTCD RES 7,C
INC C
DEC C
JP Z,NOPCDC
DEC C
JP Z,OPENC
DEC C
JP Z,CLOSC
JP NOPCDC
RESETCD LD B,50
RESECD PUSH BC
LD A,(CDDRIVE)
CALL CD_TEST
POP BC
RET NC
OR A
RET Z
EI
HALT
DJNZ RESECD
RET
CHEK_C LD A,(CDDRIVE)
CALL CD_TEST
LD A,#FF
AND A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; [ ] ¯¥à¥­¥á⨠¢ DSS
GBPB_C LD HL,CD_BPB
LD BC,#0200
LDIR
XOR A
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
READC LD A,(CDDRIVE)
JP CD_READ
OPENC LD A,(CDDRIVE)
JP CD_OPEN
CLOSC LD A,(CDDRIVE)
JP CD_CLOS
CD_TEST LD HL,CMDNOPP
LD DE,0
JP AP_COM
CD_OPEN LD HL,CMDOPEN
LD DE,0
JP AP_COM
CD_CLOS LD HL,CMDCLOS
LD DE,0
JP AP_COM
; HL:IX - SECTOR
; DE - ADDRESS
; B - SECTOR COUNT
; A - DRIVE
CD_READ:
LD C,A
LD A,H
LD (SECREAD+0),A
LD A,L
LD (SECREAD+1),A
LD A,XH
LD (SECREAD+2),A
LD A,XL
LD (SECREAD+3),A
LD A,B
LD (COUNT+1),A
LD HL,CMDREAD
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 ;0
;JR Z,APCOM1
;LD A,#B0
APCOM1 ;LD BC,W176
;OUT (C),A ;SELECT DRIVE
EXX
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
JR NC,CDREADY
LD BC,W177
LD A,#08
OUT (C),A
LD B,#80
DJNZ $
EXX
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
RET C
CDREADY XOR A
EXX
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 ;ATAPI.Packet
OUT (C),A
LD DE,#8000
LD BC,R177
CALL WAITPRT
EXX
RET C
EXX
LD DE,#0908
LD BC,R177
CALL WAITPRT
EXX
BIT ERR,A
JR NZ,CDERROR
JR NC,YEP_DRQ
LD A,#80
RET
YEP_DRQ LD BC,W170
LD A,(PKTSIZE)
SRL A
OUTPKT OUTI
OUTI
DEC A
JR NZ,OUTPKT
LD B,#80
DJNZ $
AP_LOOP EXX
LD DE,#8000
LD BC,R177
CALL WAITPRT
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 NZ,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
WAITPRT LD A,100
LD HL,#0000
WAITPX EX AF,AF'
WAITP0 IN A,(C)
CP #FF
JR Z,WAITP1
AND D
CP E
JR NZ,WAITP2
AND A
RET
WAITP2 DEC L
JR NZ,WAITP0
DEC H
JR NZ,WAITP0
EX AF,AF'
DEC A
JR NZ,WAITPX
EX AF,AF'
WAITP1 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
CMDREAD DEFB #28,#00
SECREAD DEFB #00,#00,#00,#00
DEFB #00
COUNT DEFB #00,#01
DEFB #00,#00,#00
; Area for boot sector [512Bytes]
CD_BPB DB #00,#00,#00 ; +00 JMP
DB " " ; +03 DOS NAME
; Block Parameters BIOS
DW #0200 ; +0B BYTE PER SECTOR
DB 4 ; +0D SECTORS PER CLUSTER
DW 1 ; +0E RESERVE SECTORS
DB 1 ; +10 AMOUNT FATS
DW 512 ; +11 FILES IN DIRECTORY
DW 0 ; +13 ALL SECTORS ON DISK
DB #F8 ; +15 ID FORMAT
DW 1 ; +16 SIZE FAT IN SECTORS
DW 63 ; +18 SECTOR PER TRACK
DW 255 ; +1A AMOUNT SIDES
DW #0010 ; +1C HIDDEN SECTORS
DS 24
DB "FAT16" ; +36 FAT ID
DS 453
; end boot sector
;========================================================