916 lines
18 KiB
NASM
916 lines
18 KiB
NASM
;[BEGIN]
|
||
;//MODULE: AUTOIDE
|
||
;//CREATE: 27-07-2001 AUTHOR: Denis Parinov
|
||
;-----------------------------------------------------------------------
|
||
;Rev Date Name Description
|
||
;-----------------------------------------------------------------------
|
||
;R02 17.08.2023 BAO New AUTODETECT ATA/ATAPI procedure
|
||
;R01 01.08.2001 DNS FIX BUG INT "SELECT_IDE"
|
||
;R00 24.07.2001 DNS ADD SECONDARY IDE
|
||
; 24.07.2001 DNS INITIAL NEW VERSION 2.48
|
||
;=======================================================================
|
||
|
||
; 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
|
||
|
||
MODULE CONFIGURE_IDE_DRIVES
|
||
|
||
MODULE PAUSES
|
||
HALT:
|
||
.Time_2s EQU 100
|
||
.SMALL EQU 200 ; 04 ᥪ
|
||
.BIG EQU 1550 ; 31 ᥪ
|
||
WAIT:
|
||
.IDE EQU #0000
|
||
.SMALL EQU #0200
|
||
.ERROR EQU #0400
|
||
ENDMODULE
|
||
|
||
WAIT_IDE EQU #0000
|
||
WAIT_SML EQU #1000
|
||
WAIT_ERROR EQU #0400
|
||
|
||
M_CYLL EQU #12
|
||
M_CYLH EQU #13
|
||
M_HEAD EQU #14
|
||
M_SECT EQU #15
|
||
|
||
S_CYLL EQU #16
|
||
S_CYLH EQU #17
|
||
S_HEAD EQU #18
|
||
S_SECT EQU #19
|
||
|
||
SM_CYLL EQU #37
|
||
SM_CYLH EQU #38
|
||
SM_HEAD EQU #39
|
||
SM_SECT EQU #3A
|
||
|
||
SS_CYLL EQU #3B
|
||
SS_CYLH EQU #3C
|
||
SS_HEAD EQU #3D
|
||
SS_SECT EQU #3E
|
||
|
||
MACRO PAUSE_DJNZ num
|
||
IF num<255
|
||
LD B,num
|
||
.loop: DJNZ .loop
|
||
ELSE
|
||
ASSERT 0, "WRONG PAUSE NUMBER!!!"
|
||
ENDIF
|
||
ENDM
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
START: CALL SetUP_CHANELS
|
||
;
|
||
IN A,(SLOT3)
|
||
EX AF,AF'
|
||
LD A,SYS_PAGE
|
||
OUT (SLOT3),A
|
||
LD HL,IDE.INIT_TBL_IDE0
|
||
LD BC,256*(IDE.HDD_INIT_TABLE * 4) + #FF ;R02
|
||
;CLEAR HDD VARIABLE
|
||
.FILLIDE:
|
||
LD (HL),C
|
||
INC HL
|
||
DJNZ .FILLIDE
|
||
EX AF,AF'
|
||
OUT (SLOT3),A
|
||
|
||
LD IY,IDE.INIT_TBL_IDE0
|
||
XOR A
|
||
CALL STEP1_GETCMOS
|
||
|
||
LD IY,IDE.INIT_TBL_IDE1
|
||
LD A,#01
|
||
CALL STEP1_GETCMOS
|
||
|
||
LD IY,IDE.INIT_TBL_IDE2
|
||
LD A,#02
|
||
CALL STEP1_GETCMOS
|
||
|
||
LD IY,IDE.INIT_TBL_IDE3
|
||
LD A,#03
|
||
CALL STEP1_GETCMOS
|
||
|
||
;[x] save hdd parameters to cmos for "setup" in settings
|
||
CALL WRITING
|
||
;
|
||
CALL ScreenPOS.CRLF
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
AUTODETECT:
|
||
LD A,L ;DETECT MESSAGE
|
||
CALL POSTMSG
|
||
CALL ScreenPOS.SUBNAME
|
||
LD A,(MasterSlave)
|
||
;
|
||
CALL AUTODETECTING
|
||
.IDEJUMPBACK:
|
||
CALL NC,MODEL
|
||
LD A,(SKIP)
|
||
INC A
|
||
LD A,msgStrings.ideNone
|
||
JR Z,.NOSKIPKEY
|
||
LD A,msgStrings.ideSkiped
|
||
.NOSKIPKEY:
|
||
CALL C,POSTMSG
|
||
CALL ScreenPOS.CRLF
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
; !HARDCODE <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><> <20><>⪨ <20> <20>⮩ <20><><EFBFBD>楤<EFBFBD><E6A5A4><EFBFBD>
|
||
STEP1_GETCMOS:
|
||
LD (MasterSlave),A
|
||
LD H,A ;SAVE DRIVE NUMBER
|
||
CALL SELECT_IDE
|
||
LD A,IDE.Device.NONE
|
||
LD (IDEDEV),A
|
||
LD (SKIP),A
|
||
LD A,H
|
||
;
|
||
AND A
|
||
LD BC,CMOS_CELL.DrivesSetup_1.Mask.PriIDEmaster ;#3011
|
||
LD L,msgStrings.detectIdePrMA
|
||
JR Z,.choose
|
||
;
|
||
DEC A
|
||
LD BC,CMOS_CELL.DrivesSetup_1.Mask.PriIDEslave ;#C011
|
||
LD L,msgStrings.detectIdePrSL
|
||
JR Z,.choose
|
||
;
|
||
DEC A
|
||
LD BC,CMOS_CELL.DrivesSetup_2.Mask.SecIDEmaster
|
||
LD L,msgStrings.detectIdeSecMA
|
||
JR Z,.choose
|
||
;
|
||
DEC A
|
||
LD BC,CMOS_CELL.DrivesSetup_2.Mask.SecIDEslave
|
||
LD L,msgStrings.detectIdeSecSL
|
||
JR Z,.choose
|
||
SCF
|
||
RET
|
||
;0 - AUTODETECT
|
||
;1 - GETTING FROM SETUP
|
||
;2 - CD-ROM (ATAPI device)
|
||
;3 - DISABLED
|
||
.choose:
|
||
EI
|
||
;
|
||
CALL G_VALUE
|
||
OR A
|
||
JR Z,AUTODETECT ;AUTO DETECT
|
||
;
|
||
DEC A
|
||
JR Z,SETUP_FROM_CMOS ;Get from CMOS (SETUP)
|
||
;
|
||
DEC A
|
||
RET NZ ;DON'T CHECK THIS DEVICE
|
||
;JR Z,IT_IS_ATAPI ;CD-ROM
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
IT_IS_ATAPI:
|
||
LD A,L ;DETECT MESSAGE
|
||
CALL POSTMSG
|
||
CALL ScreenPOS.SUBNAME
|
||
|
||
LD HL,PAUSES.HALT.BIG
|
||
CALL BITS_WAITS.Clear_BUSY
|
||
JR C,AUTODETECTING.IDE_ABSENT
|
||
|
||
CALL AUTODETECTING.Its_ATAPI
|
||
JP AUTODETECT.IDEJUMPBACK
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
AUTODETECTING: CALL DETECTORS.CheckChanel
|
||
JR C,.IDE_ABSENT
|
||
|
||
CALL Bug31SecCheck
|
||
JR C,.next
|
||
|
||
LD HL,PAUSES.HALT.BIG
|
||
CALL BITS_WAITS.Clear_BUSY
|
||
JR C,.IDE_ABSENT
|
||
|
||
.next: CALL DETECTORS.Counter
|
||
JR C,.IDE_ABSENT
|
||
|
||
CALL DETECTORS.NOP_Check
|
||
JR C,.IDE_ABSENT
|
||
|
||
; CALL DISABLE_8bit ; DISABLE 8 bit data transfer
|
||
|
||
CALL DETECTORS.IdentDevCheck
|
||
JR C,.IDE_ABSENT
|
||
JR Z,.Its_ATA
|
||
|
||
; enter point for ATAPI in setup
|
||
.Its_ATAPI: CALL DETECTORS.IdentPDevChk
|
||
JR C,.IDE_ABSENT
|
||
LD A,IDE.Device.CDROM
|
||
LD (IDEDEV),A
|
||
JR .get
|
||
|
||
.Its_ATA: LD A,IDE.Device.HDD
|
||
LD (IDEDEV),A
|
||
.get: CALL GETPARAM
|
||
JR C,.IDE_ABSENT
|
||
;CALL DisableWriteCache
|
||
;CALL DisableStandBy
|
||
AND A
|
||
RET
|
||
;
|
||
.IDE_ABSENT: LD A,IDE.Device.NONE
|
||
LD (IDEDEV),A
|
||
LD A,IDE.ATA.Nop
|
||
LD BC,IDE.Write.Command
|
||
OUT (C),A
|
||
DEC B
|
||
IN A,(C) ; IDE.Read.Status
|
||
SCF
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
SETUP_FROM_CMOS:
|
||
LD A,H
|
||
LD IX,PRIM_MASTER_CMOS_T
|
||
OR A
|
||
JR Z,.step1
|
||
;
|
||
LD IX,PRIM_SLAVE_CMOS_T
|
||
CP 1
|
||
JR Z,.step1
|
||
;
|
||
LD IX,SEC_MASTER_CMOS_T
|
||
CP 2
|
||
JR Z,.step1
|
||
;
|
||
LD IX,SEC_SLAVE_CMOS_T
|
||
.step1: LD HL,TEMP
|
||
LD DE,TEMP+1
|
||
LD BC,511
|
||
LD (HL),0
|
||
LDIR
|
||
;
|
||
CALL Bug31SecCheck
|
||
JR C,.step2
|
||
;
|
||
LD HL,PAUSES.HALT.BIG
|
||
CALL BITS_WAITS.Clear_BUSY
|
||
JR C,AUTODETECTING.IDE_ABSENT
|
||
;
|
||
.step2: LD A,(IX+2) ;M_HEAD
|
||
CALL READCMS
|
||
LD (TEMP+3*2),A ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><>१ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. HEADS PER TRACK
|
||
;
|
||
LD A,(IX+1) ;M_CYLH
|
||
CALL READCMS
|
||
PUSH AF
|
||
;
|
||
LD A,(IX+0) ;M_CYLL
|
||
CALL READCMS
|
||
POP HL
|
||
LD L,A
|
||
LD (TEMP+1*2),HL ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><>१ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. CYLINDERS
|
||
;
|
||
LD A,(IX+3) ;M_SECT
|
||
CALL READCMS
|
||
LD (TEMP+6*2),A ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><>१ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>. SECTOR PER TRACK
|
||
;
|
||
LD A,IDE.Device.HDD
|
||
LD (IDEDEV),A
|
||
CALL IDESPEC
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
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.DeviceHead
|
||
OUT (C),A
|
||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
||
LD HL,ICHANEL
|
||
OR (HL)
|
||
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),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
|
||
IF IDE_Optimization
|
||
LD B,high IDE.Write.Counter
|
||
ELSE
|
||
LD BC,IDE.Write.Counter
|
||
ENDIF
|
||
OUT (C),A
|
||
LD A,IDE.ATA.InitializeDeviceParameters
|
||
CALL IDE_CMD
|
||
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track
|
||
LD B,0
|
||
LD H,B
|
||
LD L,B
|
||
LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD
|
||
|
||
.loop: ADD HL,BC
|
||
DEC A
|
||
JR NZ,.loop
|
||
|
||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L
|
||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H
|
||
.END: ; [x] save hdd parameters to cmos for "setup" in settings
|
||
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) ; for save to cmos in GETPARM
|
||
;
|
||
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.DRV_Flags),A
|
||
JR IDESPEC.END
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
IDE_CMD:
|
||
PUSH AF
|
||
LD HL,PAUSES.WAIT.IDE
|
||
LD DE,256*IDE.ControlByte.Busy + 0
|
||
CALL BITS_WAITS.WAIT_PRT
|
||
POP HL
|
||
RET C
|
||
INC B ; LD BC,IDE.Write.Command
|
||
OUT (C),H
|
||
LD HL,PAUSES.WAIT.IDE
|
||
;LD DE,256*IDE.ControlByte.Busy + 0
|
||
JR BITS_WAITS.WAIT_PRT
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
MODEL: LD HL,TEMP+27*2 ; !TODO ᤥ<><E1A4A5><EFBFBD><EFBFBD> <20><>१ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
||
LD A,(HL)
|
||
OR A
|
||
JR Z,.unknown
|
||
LD B,20 ;!HARDCODE
|
||
CALL DWPRINT
|
||
AND A
|
||
RET
|
||
.unknown:
|
||
LD A,msgStrings.ideUnknown
|
||
CALL POSTMSG
|
||
AND A
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
BITS_WAITS:
|
||
; IN:
|
||
; HL - Waiting delay
|
||
; DE - MASK : PATTERN
|
||
; OUT:
|
||
; NC: (PORT & D)-E = 0
|
||
; CF: waiting delay exceeded
|
||
.WAIT_PRT:
|
||
LD BC,IDE.Read.Status
|
||
;
|
||
.loop: IN A,(C)
|
||
AND D
|
||
CP E
|
||
RET Z
|
||
DEC HL
|
||
CALL SKIPKEY
|
||
RET C
|
||
LD A,L
|
||
OR H
|
||
JP NZ,.loop
|
||
;
|
||
SCF
|
||
RET
|
||
;
|
||
|
||
; Pause for clear BUSY and DATA REQUEST
|
||
.Clear_BUSY: LD BC,IDE.Read.Status
|
||
IN A,(C)
|
||
;!TEST for normal bus with pull-ups
|
||
;CP #FF
|
||
;SCF
|
||
;RET Z
|
||
;
|
||
AND IDE.ControlByte.Busy; + IDE.ControlByte.DataRequest
|
||
RET Z
|
||
;
|
||
HALT
|
||
DEC HL
|
||
LD A,H
|
||
OR L
|
||
SCF
|
||
RET Z
|
||
;
|
||
CALL SKIPKEY
|
||
RET C
|
||
;
|
||
JR .Clear_BUSY
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
SELECT_IDE:
|
||
AND A ;%0000'0011
|
||
LD B,IDE.Drive.Master
|
||
JR Z,.AUTO_0
|
||
;
|
||
DEC A
|
||
LD B,IDE.Drive.Slave
|
||
JR Z,.AUTO_0
|
||
;
|
||
DEC A
|
||
;R00
|
||
LD B,IDE.Drive.Master
|
||
JR Z,.AUTO_1
|
||
;
|
||
DEC A
|
||
LD B,IDE.Drive.Slave
|
||
.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
|
||
OUT (IDE.Chanel.Set),A
|
||
JP .AUTO
|
||
;
|
||
.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY
|
||
OUT (IDE.Chanel.Set),A
|
||
;
|
||
XOR A
|
||
.AUTO: LD (ICHANEL),A
|
||
;R01
|
||
LD A,B
|
||
LD BC,IDE.Write.DeviceHead
|
||
OUT (C),A
|
||
;
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
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
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
; [x] save hdd parameters to cmos for "setup" in settings
|
||
; IN: A' = DRV_Flags
|
||
SaveToCMOS:
|
||
LD A,(IDEDEV)
|
||
CP IDE.Device.HDD
|
||
RET NZ
|
||
|
||
EX AF,AF'
|
||
;LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)
|
||
AND %0001'0001
|
||
LD IX,PRIM_MASTER_CMOS_T
|
||
JR Z,.save_to_cmos
|
||
;
|
||
DEC A
|
||
LD IX,SEC_MASTER_CMOS_T
|
||
JR Z,.save_to_cmos
|
||
;
|
||
CP %0001'0000
|
||
LD IX,SEC_SLAVE_CMOS_T
|
||
JR Z,.save_to_cmos
|
||
;
|
||
LD IX,PRIM_SLAVE_CMOS_T
|
||
.save_to_cmos:
|
||
LD HL,(TEMP+1*2)
|
||
LD B,L
|
||
LD A,(IX+0)
|
||
CALL WRITCMS ; Cylinder low
|
||
|
||
LD B,H
|
||
LD A,(IX+1)
|
||
CALL WRITCMS ; Cylinder high
|
||
|
||
LD A,(TEMP+3*2)
|
||
LD B,A
|
||
LD A,(IX+2)
|
||
CALL WRITCMS ; Heads
|
||
|
||
LD A,(TEMP+6*2)
|
||
LD B,A
|
||
LD A,(IX+3)
|
||
JP WRITCMS ; Heads
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
RESET_Slave_ATAPI:
|
||
LD A,IDE.Drive.Slave
|
||
LD BC,IDE.Write.DeviceHead
|
||
OUT (C),A
|
||
PAUSE_DJNZ 16
|
||
LD BC,IDE.Write.Command
|
||
LD A,IDE.ATAPI.Reset
|
||
OUT (C),A
|
||
PAUSE_DJNZ 16
|
||
LD A,IDE.Drive.Master
|
||
LD BC,IDE.Write.DeviceHead
|
||
OUT (C),A
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
; Check bug with 31 sec freeze
|
||
Bug31SecCheck: LD A,(MasterSlave)
|
||
AND 1
|
||
RET NZ
|
||
;
|
||
LD HL,PAUSES.HALT.Time_2s
|
||
CALL BITS_WAITS.Clear_BUSY
|
||
CCF
|
||
RET C
|
||
;
|
||
JP RESET_Slave_ATAPI
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
GETPARAM:
|
||
LD HL,PAUSES.WAIT.IDE
|
||
LD DE,IDE.ControlByte.DataRequest * 256 + IDE.ControlByte.DataRequest
|
||
CALL BITS_WAITS.WAIT_PRT
|
||
RET C
|
||
LD BC,IDE.Read.Data
|
||
LD HL,TEMP
|
||
INIR
|
||
INIR
|
||
CALL IDESPEC
|
||
; [x] save hdd parameters to cmos for "setup" in settings
|
||
CALL SaveToCMOS
|
||
;
|
||
AND A
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
DETECTORS:
|
||
;-------;
|
||
; CHECK BY COUNTER PORT.
|
||
; Exit: CF - No device
|
||
.test_counter EQU 5
|
||
.Counter: LD A,.test_counter
|
||
LD BC,IDE.Write.Counter
|
||
OUT (C),A
|
||
LD HL,PAUSES.WAIT.SMALL
|
||
LD DE,IDE.ControlByte.Busy*256 + 0
|
||
CALL BITS_WAITS.WAIT_PRT
|
||
RET C
|
||
;
|
||
LD BC,IDE.Read.Counter ; LD BC,IDE.Read.Counter
|
||
IN A,(C)
|
||
CP .test_counter
|
||
RET Z
|
||
SCF
|
||
RET
|
||
;-------;
|
||
|
||
;-------;
|
||
; CHECK BY EXECUTING NOP COMMAND AND WAIT.
|
||
; Exit: CF - No device
|
||
.NOP_Check: LD E,IDE.ATA.Nop
|
||
LD BC,IDE.Write.Command
|
||
OUT (C),E
|
||
|
||
PAUSE_DJNZ 0
|
||
|
||
LD HL,PAUSES.HALT.SMALL
|
||
LD BC,IDE.Read.Status
|
||
;DEC B
|
||
;
|
||
.loop: IN A,(C)
|
||
SCF
|
||
RET Z
|
||
;
|
||
AND IDE.ControlByte.Busy + IDE.ControlByte.DataRequest + IDE.ControlByte.Error
|
||
CP IDE.ControlByte.Error
|
||
RET Z
|
||
;
|
||
HALT
|
||
DEC HL
|
||
LD A,H
|
||
OR L
|
||
SCF
|
||
RET Z ; Absent
|
||
;
|
||
CALL SKIPKEY
|
||
RET C ; Skipped = Absent
|
||
;
|
||
JR .loop
|
||
;-------;
|
||
|
||
;-------;
|
||
; CHECK WITH Identify Device.
|
||
; Exit: CF - No device
|
||
; NC and ZF - ATA
|
||
; NC and NZ - ATAPI
|
||
.IdentDevCheck: LD E,IDE.ATA.IdentifyDevice
|
||
LD BC,IDE.Write.Command
|
||
OUT (C),E
|
||
;
|
||
LD DE,IDE.ControlByte.Busy * 256 + 0
|
||
LD HL,PAUSES.WAIT.IDE
|
||
CALL BITS_WAITS.WAIT_PRT
|
||
RET C ; Absent
|
||
;
|
||
LD BC,IDE.Read.Status
|
||
IN A,(C)
|
||
RRCA
|
||
JR C,.non_ATA
|
||
;
|
||
AND (IDE.ControlByte.DataRequest + IDE.ControlByte.Ready) / 2
|
||
SCF
|
||
RET Z
|
||
;
|
||
XOR A
|
||
RET ; ATA
|
||
;
|
||
.non_ATA: LD BC,IDE.Read.Error
|
||
IN A,(C)
|
||
AND IDE.ErrorByte.Abort
|
||
RET NZ ; ATAPI
|
||
;
|
||
SCF ; Absent
|
||
RET
|
||
;-------;
|
||
|
||
;-------;
|
||
; ATAPI or Absent
|
||
; Exit: CF - No device
|
||
; NC - ATAPI
|
||
.IdentPDevChk: LD E,IDE.ATAPI.IdentifyPackedDevice
|
||
LD BC,IDE.Write.Command
|
||
OUT (C),E
|
||
LD HL,PAUSES.WAIT.IDE
|
||
LD DE,IDE.ControlByte.Busy*256 + 0
|
||
CALL BITS_WAITS.WAIT_PRT
|
||
RET C
|
||
;
|
||
LD BC,IDE.Read.Status
|
||
IN A,(C)
|
||
RRCA
|
||
RET C
|
||
XOR A
|
||
RET
|
||
;-------;
|
||
|
||
;-------;
|
||
; <20> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>⮩, <20><> <20><>⠥<EFBFBD><E2A0A5><EFBFBD> <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><>, <20><><EFBFBD> <20>뫮 <20><><EFBFBD>⠢<EFBFBD><E2A0A2><EFBFBD><EFBFBD>
|
||
; <20><><EFBFBD><E1ABA5><EFBFBD><EFBFBD> <20><> 設<> c <20><>⭮<EFBFBD><E2ADAE> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD>ன
|
||
; <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
ALIGN 2 ; <20><><EFBFBD> <20>㦭<EFBFBD> <20><>ࠢ<EFBFBD><E0A0A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><> <20><><EFBFBD>㬠<EFBFBD><E3ACA0><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ᠬ <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>⥭<EFBFBD><E2A5AD> <20><> <20><><EFBFBD>⮢
|
||
.CheckChanel: LD BC,IDE.Read.Status
|
||
IN A,(C) ;#ED78 A=#78
|
||
IN L,(C) ;#ED68 L=#68
|
||
LD D,A
|
||
IN A,(C) ;#ED60 A=#ED
|
||
LD E,L
|
||
; <20> <20><><EFBFBD>⮩: DE=#7868, A=#ED
|
||
;
|
||
LD HL,#7868 + #ED
|
||
AND A
|
||
SBC HL,DE
|
||
XOR L
|
||
RET NZ ; not absent
|
||
SCF
|
||
RET ; absent
|
||
;-------;
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
SetUP_CHANELS:
|
||
LD A,1
|
||
CALL .CMD
|
||
LD A,3
|
||
CALL .CMD
|
||
LD A,0
|
||
CALL .CMD
|
||
LD A,2
|
||
.CMD: CALL SELECT_IDE
|
||
LD BC,IDE.Write.Command
|
||
LD H,IDE.ATA.Nop
|
||
OUT (C),H
|
||
PAUSE_DJNZ 32
|
||
; Disable INTRQ
|
||
; LD BC,IDE.Write.DeviceControl
|
||
; LD A,%0000'0010
|
||
; OUT (C),A
|
||
; PAUSE_DJNZ 32
|
||
; ;
|
||
; CALL DisableStandBy
|
||
; PAUSE_DJNZ 32
|
||
RET
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
; DisableWriteCache:
|
||
; LD BC,IDE.Write.Features
|
||
; LD A,IDE.ATA.SetFeatures.DisableWriteCache
|
||
; OUT (C),A
|
||
; LD A,IDE.ATA.SetFeatures
|
||
; JP IDE_CMD
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
;Disable StandBy timer
|
||
; DisableStandBy:
|
||
; LD BC,IDE.Write.Counter
|
||
; XOR A
|
||
; OUT (C),A
|
||
; LD A,IDE.ATA.Idle
|
||
; JP IDE_CMD
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
/////////////////////////////////////////////////////////////////////[v]
|
||
; DISABLE_8bit:
|
||
; LD BC,IDE.Write.Features
|
||
; LD A,IDE.ATA.SetFeatures.Disable8bit
|
||
; OUT (C),A
|
||
; LD A,IDE.ATA.SetFeatures
|
||
; JP IDE_CMD
|
||
/////////////////////////////////////////////////////////////////////[^]
|
||
|
||
|
||
;!FIXIT CMOS <20><>।<EFBFBD><E0A5A4><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20>祥<EFBFBD> <20><> SP2000.inc
|
||
PRIM_MASTER_CMOS_T:
|
||
DB M_CYLL,M_CYLH,M_HEAD,M_SECT
|
||
PRIM_SLAVE_CMOS_T:
|
||
DB S_CYLL,S_CYLH,S_HEAD,S_SECT
|
||
SEC_MASTER_CMOS_T:
|
||
DB SM_CYLL,SM_CYLH,SM_HEAD,SM_SECT
|
||
SEC_SLAVE_CMOS_T:
|
||
DB SS_CYLL,SS_CYLH,SS_HEAD,SS_SECT
|
||
|
||
|
||
SKIP: BYTE #FF
|
||
IDEDEV: BYTE #FF
|
||
ICHANEL: BYTE #00
|
||
MasterSlave BYTE #00
|
||
|
||
|
||
;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
|
||
|
||
ENDMODULE
|
||
; |