Sprinter-Core/src/bios/rom/SETUP/AUTOIDE.asm
Anatoliy Belyanskiy dc8f5f37ac some tests with 5x
2023-06-25 04:55:29 +10:00

400 lines
7.0 KiB
NASM
Raw Blame History

;
;R01 01.08.2001 FIX BUG INT "SELECT_IDE"
;R00 24.07.2001 ADD SECONDARY IDE
;INITIAL NEW VERSION (2.48) 24.07.2001
;========================================================
; MODULE AUTOIDE
/*
;Write
HDW_3F7 EQU #4155 ;3F7H Command
HDW_3F6 EQU #4154 ;3F6H Device Control
;Read
HDR_3F7 EQU #4055 ;3F7H Drive Address
HDR_3F6 EQU #4054 ;3F6H Alt. Status
;Write
IDE.Write.Command EQU #4153 ; #1F7 Command
HDW_DRV EQU #4152 ; #1F6 Drive Control
HDW_CLH EQU #0155 ; #1F5 Cylinder High
HDW_CLL EQU #0154 ; #1F4 Cylinder Low
HDW_SEC EQU #0153 ; #1F3 Sector
HDW_CNT EQU #0152 ; #1F2 Counter
HDW_ERR EQU #0151 ; #1F1 Error
HDW_DAT EQU #0150 ; #1F0 Data
;Read
HDR_CTL EQU #4053 ; #1F7 Status (Control)
HDR_DRV EQU #4052 ; #1F6 Drive Control
HDR_CLH EQU #0055 ; #1F5 Cylinder High
HDR_CLL EQU #0054 ; #1F4 Cylinder Low
HDR_SEC EQU #0053 ; #1F3 Sector
HDR_CNT EQU #0052 ; #1F2 Counter
HDR_ERR EQU #0051 ; #1F1 Error
HDR_DAT EQU #0050 ; #1F0 Data
;Bits for HDR_CTL
;---[]
BSY EQU 7
RDY EQU 6
DRQ EQU 3
ERR EQU 0
;---[]
HDD EQU 1
CDROM EQU 2
;EQU FOR IY+
;---[]
DRVHD_H EQU 0
SC_PT_H EQU 1
IDE.HDD_INIT_TABLE.HeadsNumber EQU 2
CYL_L_H EQU 3
CYL_H_H EQU 4
SPCLL_H EQU 5
SPCLH_H EQU 6
DTYPE_H EQU 7
;---[]
;-------[ ;!!!!! hardcoded table]-------
IDE0 EQU #C1C0
IDE1 EQU #C1C8
IDE2 EQU #C1D0
IDE3 EQU #C1D8
;---------------------------------------
*/
;IDE0 DB #FF ;DRIVE/HEAD REGISTER ;00
; DB #FF ;SECTORS PER TRACK ;01
; DB #FF ;HEADS ;02
; DB #FF ;CYLINDERS LOW ;03
; DB #FF ;CYLINDERS HIGH ;04
; DB #FF ;SECTOR PER CYLINDER LOW ;05
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;DEVICE TYPE ;07
;IDE1 DB #FF ;DRIVE/HEAD REGISTER ;00
; DB #FF ;SECTORS PER TRACK ;01
; DB #FF ;HEADS ;02
; DB #FF ;CYLINDERS LOW ;03
; DB #FF ;CYLINDERS HIGH ;04
; DB #FF ;SECTOR PER CYLINDER LOW ;05
; DB #FF ;SECTOR PER CYLINDER HIGH ;06
; DB #FF ;DEVICE TYPE ;07
IDE__CD:
CALL SELECT_IDE
;MASTER
CDAUTO:
LD A,IDE.Device.CDROM
LD (IDEDEV),A
LD A,#FF
JP CDMASTR
SELECT_IDE:
AND A ;%0000'0011
LD D,#A0
JR Z,IAUTO0
DEC A
LD D,#B0
JR Z,IAUTO0
DEC A
LD D,#A0 ;R00
JR Z,IAUTO1 ;R00
DEC A ;R00
LD D,#B0 ;R00
IAUTO1:
LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY
OUT (IDE.Chanel.Set),A ;R00
LD A,1
JR IAUTO ;R00
IAUTO0:
LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY
OUT (IDE.Chanel.Set),A ;R00
LD A,0
IAUTO:
LD (ICHANEL),A
LD BC,IDE.Write.DriveCtrl ;R01
OUT (C),D ;R01
RET
IDEAUTO:
CALL SELECT_IDE
;MASTER
LD A,#FF
LD (IDEDEV),A
CDMASTR:
LD (SKIP),A
LD BC,IDE.Write.DriveCtrl
OUT (C),D
LD BC,IDE.Read.Status
IN A,(C)
AND #80
LD HL,280
JR Z,NO_BUSY
LD HL,1550
EI
CLRBUSY:
HALT
DEC HL
LD A,H
OR L
JP Z,ABSENT
CALL SKIPKEY
JP C,ABSENT
LD BC,IDE.Read.Status
IN A,(C)
AND #80
JR NZ,CLRBUSY
NO_BUSY:
LD E,#05
LD BC,IDE.Write.Counter
OUT (C),E
LD BC,#0010
DJNZ $ ;!HARDCODE
DEC C
JR NZ,$-3 ;!HARDCODE
LD BC,IDE.Read.Counter
IN A,(C)
CP E
JP NZ,ABSENT
LD A,(IDEDEV)
CP IDE.Device.CDROM
JP Z,NOHDD
LD E,#00 ;NOP
LD BC,IDE.Write.Command
OUT (C),E
WXREADY:
HALT
DEC HL
LD A,H
OR L
JP Z,ABSENT
CALL SKIPKEY
JP C,ABSENT
LD BC,IDE.Read.Status
IN A,(C)
AND #C0
CP #40
JR NZ,WXREADY
; LD A,#90 ;
; CALL IDE_CMD
LD A,IDE.Device.HDD
LD (IDEDEV),A
LD E,#EC ;IDENTIFY ATA
LD BC,IDE.Write.Command
OUT (C),E
LD B,#00
DJNZ $ ;!HARDCODE
LD HL,(WAITSML)
LD DE,#0101
LD BC,IDE.Read.Status
CALL WAIT_PRT
JP NC,NOHDD
GETPARM:
LD HL,(WAITIDE)
LD DE,#0808
LD BC,IDE.Read.Status
CALL WAIT_PRT
JP C,ABSENT
LD BC,IDE.Read.Data
LD HL,TEMP
INIR
INIR
CALL IDESPEC
AND A
RET
NOHDD: LD A,IDE.Device.CDROM
LD (IDEDEV),A
LD E,#A1 ;IDENTIFY ATAPI
LD BC,IDE.Write.Command
OUT (C),E
LD B,#00
DJNZ $
LD HL,(WAITSML)
LD DE,#0101
LD BC,IDE.Read.Status
CALL WAIT_PRT
JP C,GETPARM
ABSENT:
SCF
RET
IDESPEC:
IN A,(SLOT3)
EX AF,AF'
LD A,SYS_PAGE
OUT (SLOT3),A
LD A,(IDEDEV)
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
CP IDE.Device.CDROM
JP Z,FOR_CDR
LD BC,IDE.Read.Control
IN A,(C)
AND #F0
LD B,A
LD A,(TEMP+#06) ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. HEADS PER TRACK
LD (IY+IDE.HDD_INIT_TABLE.HeadsNumber),A
DEC A
AND #0F
OR B
LD B,A
LD A,(TEMP+#63) ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. LBA/NON-LBA bit 1 (FROM ZERO!)
BIT 1,A
JR Z,NONLBA
SET 6,B
NONLBA:
LD A,B
LD BC,IDE.Write.DriveCtrl
OUT (C),A
AND #F0
LD HL,ICHANEL
OR (HL)
LD (IY+IDE.HDD_INIT_TABLE.Chanel),A
LD HL,(TEMP+#02) ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. CYLINDERS
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H
LD A,(TEMP+#0C) ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><><20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. SECTOR PER TRACK
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
LD BC,IDE.Write.Counter
OUT (C),A
LD A,#91 ;
CALL IDE_CMD
; RET C
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track
LD B,0
LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD
LD HL,0
HDDINI3:
ADD HL,BC
DEC A
JR NZ,HDDINI3
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H
NOSPEC:
EX AF,AF'
OUT (SLOT3),A
AND A
RET
FOR_CDR:
LD BC,IDE.Read.Control
IN A,(C)
AND #F0
LD HL,ICHANEL
OR (HL)
LD (IY+IDE.HDD_INIT_TABLE.Chanel),A
JR NOSPEC
IDE_CMD:
PUSH AF
LD HL,(WAITIDE)
LD DE,#C040
LD BC,IDE.Read.Status
CALL WAIT_PRT
POP DE
RET C
LD BC,IDE.Write.Command
OUT (C),D
LD HL,(WAITIDE)
LD DE,#C040
LD BC,IDE.Read.Status
JP WAIT_PRT
WAITHDD:
EI
LD HL,1533
WTREADY:
HALT
LD BC,IDE.Read.Status
IN A,(C)
AND #C0
CP #40
RET Z
DEC HL
LD A,H
OR L
JR NZ,WTREADY
SCF
RET
;WAITHDD DEC L
; RET NZ
; DEC H
; RET NZ
; DEC E
; RET NZ
; SCF
; RET
; 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
WAIT_PRT:
IN A,(C)
AND D
CP E
JR NZ,.P2
AND A
RET
.P2: DEC HL
CALL SKIPKEY
RET C
LD A,L
OR H
JP NZ,WAIT_PRT
.error: SCF
RET
SKIPKEY:
EXX
CALL SCANKEY
EXX
SCF
CCF
RET Z
EXX
LD HL,#3E00 ;!HARDCODE
AND A
SBC HL,DE
EXX
SCF
CCF
RET NZ
LD A,0
LD (SKIP),A
SCF
RET
WAITIDE: DW #0000
WAITSML: DW #0400
SKIP: DB #FF
IDEDEV: DB #FF
ICHANEL: DB #00
; ENDMODULE
;