400 lines
7.0 KiB
NASM
400 lines
7.0 KiB
NASM
|
||
;
|
||
;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
|
||
; |