new ide detecting procedures
This commit is contained in:
parent
61457e702e
commit
de46473cc8
@ -90,244 +90,286 @@ IDE3 EQU #C1D8
|
||||
; 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
|
||||
|
||||
SELECT_IDE:
|
||||
AND A ;%0000'0011
|
||||
LD D,IDE.Drive.Master
|
||||
JR Z,.AUTO_0
|
||||
DEC A
|
||||
LD D,IDE.Drive.Slave
|
||||
JR Z,.AUTO_0
|
||||
DEC A
|
||||
;R00
|
||||
LD D,IDE.Drive.Master
|
||||
JR Z,.AUTO_1
|
||||
DEC A
|
||||
LD D,IDE.Drive.Slave
|
||||
.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
|
||||
OUT (IDE.Chanel.Set),A
|
||||
;LD A,1
|
||||
JP .AUTO
|
||||
.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY
|
||||
OUT (IDE.Chanel.Set),A
|
||||
;
|
||||
;LD A,0
|
||||
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: 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
|
||||
.AUTO: LD (ICHANEL),A
|
||||
;R01
|
||||
LD BC,IDE.Write.DeviceHead
|
||||
OUT (C),D
|
||||
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
|
||||
|
||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
||||
CALL WRITING
|
||||
;
|
||||
CALL ScreenPOS.CRLF
|
||||
RET
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
|
||||
IDE__CD:
|
||||
CALL SELECT_IDE
|
||||
;MASTER
|
||||
CDAUTO:
|
||||
LD A,IDE.Device.CDROM
|
||||
LD (IDEDEV),A
|
||||
LD A,#FF ;!FIXIT ¬®¦® ®¯â¨¬¨§¨à®¢ âì
|
||||
JP CDMASTR
|
||||
|
||||
IDEAUTO:
|
||||
;Disable 8-bit data transfer
|
||||
;!TODO
|
||||
/////////////////////////////////////////////////////////////////////[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 § ¬¥¨âì ç¨á« ¬¥âª¨ ¢ í⮩ ¯à®æ¥¤ãà¥
|
||||
STEP1_GETCMOS:
|
||||
LD (MasterSlave),A
|
||||
LD H,A ;SAVE DRIVE NUMBER
|
||||
CALL SELECT_IDE
|
||||
LD A,IDE.Device.NONE
|
||||
LD (IDEDEV),A
|
||||
CDMASTR:
|
||||
LD (SKIP),A
|
||||
LD BC,IDE.Write.DeviceHead
|
||||
OUT (C),D
|
||||
DEC B
|
||||
INC C ; LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
AND #80
|
||||
LD HL,280
|
||||
JR Z,NO_BUSY
|
||||
LD HL,1550 ; § ¤¥à¦ª - 31 ᥪã¤
|
||||
LD A,H
|
||||
;
|
||||
AND A
|
||||
LD BC,#3011 ;CMOS VALUE
|
||||
LD L,msgStrings.detectIdePrMA
|
||||
JR Z,.choose
|
||||
;
|
||||
DEC A
|
||||
LD BC,#C011 ;CMOS VALUE
|
||||
LD L,msgStrings.detectIdePrSL
|
||||
JR Z,.choose
|
||||
;
|
||||
DEC A
|
||||
LD BC,#3020
|
||||
LD L,msgStrings.detectIdeSecMA
|
||||
JR Z,.choose
|
||||
;
|
||||
DEC A
|
||||
LD BC,#C020
|
||||
LD L,msgStrings.detectIdeSecSL
|
||||
JR Z,.choose
|
||||
SCF
|
||||
RET
|
||||
;0 - AUTODETECT
|
||||
;1 - GETTING FROM SETUP
|
||||
;2 - CD-ROM (ATAPI device)
|
||||
;3 - DISABLED
|
||||
.choose:
|
||||
EI
|
||||
CLRBUSY:
|
||||
HALT
|
||||
DEC HL
|
||||
;
|
||||
CALL G_VALUE
|
||||
OR A
|
||||
JR Z,AUTODETECT ;AUTO DETECT
|
||||
;
|
||||
DEC A
|
||||
JR Z,SETUP_FROM_CMOS ;Get from CMOS (SETUP)
|
||||
;
|
||||
DEC A
|
||||
JR Z,IT_IS_ATAPI ;CD-ROM
|
||||
RET ;DON'T CHECK THIS DEVICE
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[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
|
||||
OR L
|
||||
JP Z,ABSENT
|
||||
CALL SKIPKEY
|
||||
JP C,ABSENT
|
||||
LD BC,IDE.Read.Status ;!FIXIT ¬®¦® § ª®¬¬¥â¨à®¢ âì?
|
||||
IN A,(C)
|
||||
AND #80
|
||||
JR NZ,CLRBUSY
|
||||
|
||||
NO_BUSY:
|
||||
LD E,#05
|
||||
LD BC,IDE.Write.Counter
|
||||
OUT (C),E
|
||||
|
||||
LD BC,#0010 ;§ ¤¥à¦ª 50092 â ªâ + int
|
||||
.pause: DJNZ .pause
|
||||
DEC C
|
||||
JR NZ,.pause
|
||||
|
||||
LD C,IDE.Read.Counter ; LD BC,IDE.Read.Counter
|
||||
IN A,(C)
|
||||
CP E
|
||||
JP NZ,ABSENT
|
||||
|
||||
;!FIXIT CD-ROM Autodetect error!
|
||||
LD A,(IDEDEV)
|
||||
;!TODO
|
||||
; I haven,t done too many tests but this works on all the hardware i have.
|
||||
; 1 select device (port+6)
|
||||
; 2 read status byte(port+7) if =-1 then there is no disk
|
||||
; if busy to many time then no disk
|
||||
; 3 send id command #ec if error then send packet device id command
|
||||
; #a1 if error then no disk.
|
||||
; commands must be send byte by byte dword operations are used only for data transfers.
|
||||
;R02
|
||||
CP IDE.Device.NONE
|
||||
JR NZ,.check_next
|
||||
;JP NZ,DETECT_ATA_ATAPI
|
||||
LD IX,PRIM_MASTER_CMOS_T
|
||||
OR A
|
||||
JR Z,.step1
|
||||
;
|
||||
/*
|
||||
DETECT_ATA_ATAPI: ;R02
|
||||
; 1. Set the Sectorcount, LBAlo, LBAmid, and LBAhi IO ports to 0 (port 0x1F2 to 0x1F5).
|
||||
LD BC,IDE.Write.Counter
|
||||
OUT (C),0 ;out0-ok
|
||||
INC C ;IDE.Write.Sector
|
||||
OUT (C),0 ;out0-ok
|
||||
INC C ;IDE.Write.CylinderLow
|
||||
OUT (C),0 ;out0-ok
|
||||
INC C ;IDE.Write.CylinderHigh
|
||||
OUT (C),0 ;out0-ok
|
||||
LD IX,PRIM_SLAVE_CMOS_T
|
||||
CP 1
|
||||
JR Z,.step1
|
||||
;
|
||||
; 2. Send the IDENTIFY command (0xEC) to the Command IO port (0x1F7).
|
||||
LD BC,IDE.Write.Command
|
||||
LD E,IDE.ATA.IdentifyDevice
|
||||
OUT (C),E
|
||||
LD IX,SEC_MASTER_CMOS_T
|
||||
CP 2
|
||||
JR Z,.step1
|
||||
;
|
||||
; 3. Read the Status port (0x1F7) again.
|
||||
; 3.1 If the value read is 0, the drive does not exist.
|
||||
LD B,0
|
||||
.pause: DJNZ .pause
|
||||
LD BC,IDE.Read.Status
|
||||
IN A,(C)
|
||||
JP Z,ABSENT
|
||||
; 3.2 For any other value: poll the Status port (0x1F7) until bit 7 (BSY, value = 0x80) clears.
|
||||
LD HL,WAIT_SML
|
||||
LD DE,#8000
|
||||
CALL WAIT_PRT
|
||||
JP C,ABSENT
|
||||
; 3.3 At this point you need to check the LBAmid and LBAhi ports (0x1F4 and 0x1F5) to see
|
||||
; if they are non-zero. If so, the drive is not ATA, and you should stop polling.
|
||||
LD BC,IDE.Read.CylinderLow
|
||||
IN A,(C)
|
||||
INC C ;IDE.Read.CylinderHigh
|
||||
IN B,(C)
|
||||
OR B
|
||||
JP NZ,Non_ATA ; IT IS ATAPI
|
||||
; 3.5 Otherwise, continue polling one of the Status ports until bit 3 (DRQ, value = 8) sets, or until bit 0 (ERR, value = 1) sets.
|
||||
LD HL,WAIT_SML
|
||||
LD DE,#0908
|
||||
CALL WAIT_PRT
|
||||
JP C,ABSENT
|
||||
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 ᤥ« âì ç¥à¥§ áâàãªâãàã. 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 ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS
|
||||
;
|
||||
LD A,(IX+3) ;M_SECT
|
||||
CALL READCMS
|
||||
LD (TEMP+6*2),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
|
||||
;
|
||||
; 4. At that point, if ERR is clear, the data is ready to read from the Data port (0x1F0). Read 256 16-bit values, and store them.
|
||||
LD A,IDE.Device.HDD
|
||||
LD (IDEDEV),A
|
||||
JP GETPARM
|
||||
;
|
||||
;;;;;;;;;;;;;;;;;;;;;;; R02
|
||||
*/
|
||||
|
||||
|
||||
NO_BUSY.check_next:
|
||||
CP IDE.Device.CDROM
|
||||
JP Z,Non_ATA
|
||||
|
||||
;!TODO ¯à¨¡à âìáï âãâ. <20>®á«¥ R02 âãâ ¬®¦® ã¡à âì ¬®£® «¨è¥£®
|
||||
;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=;
|
||||
LD E,IDE.ATA.Nop
|
||||
LD BC,IDE.Write.Command
|
||||
OUT (C),E
|
||||
DEC B ; LD BC, IDE.Read.Status
|
||||
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)
|
||||
;!TEST detect drives
|
||||
;AND #C0
|
||||
;CP #40
|
||||
AND #81
|
||||
CP 1
|
||||
;
|
||||
JR NZ,WXREADY
|
||||
|
||||
; LD A,#90 ;?????
|
||||
; CALL IDE_CMD
|
||||
|
||||
LD A,IDE.Device.HDD
|
||||
LD (IDEDEV),A
|
||||
LD E,IDE.ATA.IdentifyDevice
|
||||
LD BC,IDE.Write.Command
|
||||
OUT (C),E
|
||||
|
||||
LD B,0
|
||||
.pause: DJNZ .pause
|
||||
|
||||
LD HL,WAIT_SML
|
||||
LD DE,#0101
|
||||
CALL WAIT_PRT
|
||||
JP NC,Non_ATA
|
||||
;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=;
|
||||
GETPARM:
|
||||
LD HL,WAIT_IDE
|
||||
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
|
||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
||||
CALL SaveToCMOS
|
||||
;
|
||||
.exit: AND A
|
||||
RET
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
Non_ATA: LD A,IDE.Device.CDROM
|
||||
LD (IDEDEV),A
|
||||
LD E,#A1 ;!HARDCODE IDENTIFY ATAPI
|
||||
LD BC,IDE.Write.Command
|
||||
OUT (C),E
|
||||
|
||||
LD B,0
|
||||
.pause: DJNZ .pause
|
||||
|
||||
;LD HL,WAIT_SML
|
||||
LD HL,WAIT_ERROR
|
||||
LD DE,#0101
|
||||
CALL WAIT_PRT
|
||||
JP C,GETPARM
|
||||
ABSENT: SCF
|
||||
RET
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
IDESPEC:
|
||||
IN A,(SLOT3)
|
||||
EX AF,AF'
|
||||
@ -336,18 +378,18 @@ IDESPEC:
|
||||
LD A,(IDEDEV)
|
||||
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
|
||||
CP IDE.Device.CDROM
|
||||
JP Z,FOR_CDR
|
||||
;Check write caching
|
||||
LD A,(TEMP+85*2) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. ‚ª«îç¥ «¨ ªíè § ¯¨á¨?
|
||||
AND %0010'0000
|
||||
JR Z,.NoWriteCache
|
||||
;Disable write caching
|
||||
LD BC,IDE.Write.Features
|
||||
LD A,IDE.ATA.SetFeatures.DisableWriteCache
|
||||
OUT (C),A
|
||||
LD A,IDE.ATA.SetFeatures
|
||||
CALL IDE_CMD
|
||||
.NoWriteCache:
|
||||
JP Z,.FOR_CDR
|
||||
; ;Check write caching
|
||||
; LD A,(TEMP+85*2) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. ‚ª«îç¥ «¨ ªíè § ¯¨á¨?
|
||||
; AND %0010'0000
|
||||
; JR Z,.NoWriteCache
|
||||
; ;Disable write caching
|
||||
; LD BC,IDE.Write.Features
|
||||
; LD A,IDE.ATA.SetFeatures.DisableWriteCache
|
||||
; OUT (C),A
|
||||
; LD A,IDE.ATA.SetFeatures
|
||||
; CALL IDE_CMD
|
||||
; .NoWriteCache:
|
||||
LD BC,IDE.Read.Control
|
||||
IN A,(C)
|
||||
AND #F0
|
||||
@ -360,9 +402,10 @@ IDESPEC:
|
||||
LD B,A
|
||||
LD A,(TEMP+#63) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. LBA/NON-LBA bit 1 (FROM ZERO!)
|
||||
BIT 1,A
|
||||
JR Z,NONLBA
|
||||
JR Z,.NONLBA
|
||||
;
|
||||
SET 6,B
|
||||
NONLBA: LD A,B
|
||||
.NONLBA: LD A,B
|
||||
LD BC,IDE.Write.DeviceHead
|
||||
OUT (C),A
|
||||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
||||
@ -374,80 +417,86 @@ NONLBA: LD A,B
|
||||
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H
|
||||
LD A,(TEMP+#0C) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. 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
|
||||
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
|
||||
; RET C
|
||||
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
|
||||
HDDINI3:
|
||||
ADD HL,BC
|
||||
|
||||
.loop: ADD HL,BC
|
||||
DEC A
|
||||
JR NZ,HDDINI3
|
||||
JR NZ,.loop
|
||||
|
||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L
|
||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H
|
||||
NOSPEC:
|
||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
||||
.END: ;!TEST 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
|
||||
;
|
||||
.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 NOSPEC
|
||||
JR IDESPEC.END
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
IDE_CMD:
|
||||
PUSH AF
|
||||
LD HL,WAIT_IDE
|
||||
LD DE,#C040
|
||||
CALL WAIT_PRT
|
||||
POP DE
|
||||
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),D
|
||||
LD HL,WAIT_IDE
|
||||
LD DE,#C040
|
||||
JP WAIT_PRT
|
||||
OUT (C),H
|
||||
LD HL,PAUSES.WAIT.IDE
|
||||
;LD DE,256*IDE.ControlByte.Busy + 0
|
||||
JR BITS_WAITS.WAIT_PRT
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
WAITHDD:
|
||||
EI
|
||||
LD HL,1533 ;!HARDCODE HDD
|
||||
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
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
MODEL: LD HL,TEMP+27*2 ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã.
|
||||
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:
|
||||
.WAIT_PRT:
|
||||
LD BC,IDE.Read.Status
|
||||
;
|
||||
.loop: IN A,(C)
|
||||
@ -463,7 +512,69 @@ WAIT_PRT:
|
||||
;
|
||||
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
|
||||
@ -483,7 +594,10 @@ SKIPKEY:
|
||||
LD (SKIP),A
|
||||
SCF
|
||||
RET
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[v]
|
||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
||||
; IN: A' = DRV_Flags
|
||||
SaveToCMOS:
|
||||
@ -525,14 +639,241 @@ SaveToCMOS:
|
||||
LD B,A
|
||||
LD A,(IX+3)
|
||||
JP WRITCMS ; Heads
|
||||
;;;;;;;;;;
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
SKIP: DB #FF
|
||||
IDEDEV: DB #FF
|
||||
ICHANEL: DB #00
|
||||
/////////////////////////////////////////////////////////////////////[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
|
||||
;!TEST 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
|
||||
SCF
|
||||
RET NZ
|
||||
AND A
|
||||
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
|
||||
DEC B ; LD BC, IDE.Read.Status
|
||||
LD HL,PAUSES.HALT.SMALL
|
||||
;
|
||||
|
||||
;!TEST DVD detect bug check
|
||||
PAUSE_DJNZ 0
|
||||
;
|
||||
|
||||
.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
|
||||
;-------;
|
||||
|
||||
;-------;
|
||||
; ¥á«¨ ª « ¯ãá⮩, â® ç¨â ¥âáï ¨§ ¯®àâ â®, çâ® ¡ë«® ¢ëáâ ¢«¥®
|
||||
; ¯®á«¥¤¨¬ è¨ã c çñ⮣® ¤à¥á ¢ ¯ ¬ï⨠íâ® ¯¥à¢ë© ¨«¨ ¢â®à®©
|
||||
; ¡ ©â ª®¤ ª®¬ ¤ë
|
||||
ALIGN 2 ; âãâ 㦮 ¢ëà ¢¨¢ ¨¥ ¯® § ¤ã¬ ë¬ ¤à¥á ¬ ¤«ï ª®¬ ¤ çâ¥¨ï ¨§ ¯®à⮢
|
||||
.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
|
||||
LD HL,#7868 + #ED
|
||||
SBC HL,DE
|
||||
XOR L
|
||||
RET NZ ; not absent
|
||||
SCF
|
||||
RET ; absent
|
||||
;-------;
|
||||
/////////////////////////////////////////////////////////////////////[^]
|
||||
|
||||
|
||||
/////////////////////////////////////////////////////////////////////[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 ¯¥à¥¤¥« âì ¯®¤ §¢ ¨ï ï祥ª ¨§ 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
|
||||
|
||||
; ENDMODULE
|
||||
|
||||
;WAITHDD DEC L
|
||||
; RET NZ
|
||||
@ -553,3 +894,6 @@ ICHANEL: DB #00
|
||||
; DEC E
|
||||
; JR NZ,PAUSE1
|
||||
; RET
|
||||
|
||||
ENDMODULE
|
||||
;
|
||||
@ -72,51 +72,6 @@
|
||||
;FDD EQU #03
|
||||
|
||||
|
||||
;!!!!!!!!!!!!!!!!!!!!!!
|
||||
; !FIXIT ¯à®¢¥à¨âì â ª¨¥ ¦¥ «¨ ¤à¥á CMOS ¢ Settings ¨á¯®«ì§ãîâáï
|
||||
; SM_CYLL EQU #2F
|
||||
; SM_CYLH EQU #30
|
||||
; SM_HEAD EQU #31
|
||||
; SM_SECT EQU #32
|
||||
|
||||
; SS_CYLL EQU #33
|
||||
; SS_CYLH EQU #34
|
||||
; SS_HEAD EQU #35
|
||||
; SS_SECT EQU #36
|
||||
|
||||
; M_CYLL EQU #37
|
||||
; M_CYLH EQU #38
|
||||
; M_HEAD EQU #39
|
||||
; M_SECT EQU #3A
|
||||
|
||||
; S_CYLL EQU #3B
|
||||
; S_CYLH EQU #3C
|
||||
; S_HEAD EQU #3D
|
||||
; S_SECT EQU #3E
|
||||
|
||||
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
|
||||
|
||||
;!!!!!!!!!!!!!!!!!!!!!!
|
||||
|
||||
|
||||
TEMP EQU #7E00 ; !HARDCODE
|
||||
MEMMAP2 EQU TEMP ; ¤®«¦® ¡ëâì ¢ë஢¥® ¯® ALIGN 256
|
||||
TPOINTD EQU TEMP-32
|
||||
@ -681,13 +636,14 @@ INFO_MESSAGE: ;!FIXIT
|
||||
;CALL ScreenPOS.LOCAT
|
||||
CALL LP_SET_PLACE
|
||||
|
||||
CALL TSETUP
|
||||
CALL TSETUP ;!TODO ¬®¦¥â ¯¨åãâì ¥ñ ¯à¥àë¢ ¨ï?
|
||||
|
||||
CALL AUTODET
|
||||
CALL CONFIGURE_IDE_DRIVES.START
|
||||
CALL CTRLKEY
|
||||
LD A,B
|
||||
AND #10
|
||||
JR NZ,ABOOT
|
||||
|
||||
CALL TSETUP
|
||||
|
||||
|
||||
@ -742,7 +698,7 @@ TSETUP:
|
||||
AND A
|
||||
SBC HL,DE
|
||||
JR NZ,TSETUP
|
||||
POP HL
|
||||
POP HL ; ã¡¨à ¥¬ «¨è¥¥
|
||||
JP EXIT_SETUP
|
||||
CSETUP: XOR A
|
||||
LD (ITEM_Restore),A
|
||||
@ -1115,226 +1071,6 @@ NOFDD1:
|
||||
RET
|
||||
|
||||
|
||||
AUTODET:
|
||||
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
|
||||
|
||||
;======== áâ à ï ã¬¥à æ¨ï ¤¨áª®¢! ========
|
||||
; CALL GET_AVAILABLE_STRUCT
|
||||
; LD A,#00
|
||||
; CALL COMMONIDE
|
||||
|
||||
; CALL GET_AVAILABLE_STRUCT
|
||||
; LD A,#01
|
||||
; CALL COMMONIDE
|
||||
|
||||
; CALL GET_AVAILABLE_STRUCT
|
||||
; LD A,#02
|
||||
; CALL COMMONIDE
|
||||
|
||||
; CALL GET_AVAILABLE_STRUCT
|
||||
; LD A,#03
|
||||
; CALL COMMONIDE
|
||||
;==========================================
|
||||
|
||||
LD IY,IDE.INIT_TBL_IDE0
|
||||
XOR A
|
||||
CALL COMMONIDE
|
||||
|
||||
LD IY,IDE.INIT_TBL_IDE1
|
||||
LD A,#01
|
||||
CALL COMMONIDE
|
||||
|
||||
LD IY,IDE.INIT_TBL_IDE2
|
||||
LD A,#02
|
||||
CALL COMMONIDE
|
||||
|
||||
LD IY,IDE.INIT_TBL_IDE3
|
||||
LD A,#03
|
||||
CALL COMMONIDE
|
||||
|
||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
||||
CALL WRITING
|
||||
;
|
||||
CALL ScreenPOS.CRLF
|
||||
RET
|
||||
;
|
||||
;======== áâ à ï ã¬¥à æ¨ï ¤¨áª®¢! ========
|
||||
;GET_AVAILABLE_STRUCT
|
||||
;LD C,SLOT3
|
||||
;IN B,(C)
|
||||
;LD A,SYS_PAGE
|
||||
;OUT (C),A
|
||||
;CALL FIND_AVAILABLE_STRUCT
|
||||
;OUT (C),B
|
||||
;RET
|
||||
;FIND_AVAILABLE_STRUCT
|
||||
;LD IY,IDE0
|
||||
;LD A,(IY+DTYPE_H)
|
||||
;INC A
|
||||
;RET Z
|
||||
;LD IY,IDE1
|
||||
;LD A,(IY+DTYPE_H)
|
||||
;INC A
|
||||
;RET Z
|
||||
;LD IY,IDE2
|
||||
;LD A,(IY+DTYPE_H)
|
||||
;INC A
|
||||
;RET Z
|
||||
;LD IY,IDE3
|
||||
;LD A,(IY+DTYPE_H)
|
||||
;INC A
|
||||
;RET
|
||||
;==========================================
|
||||
|
||||
|
||||
; !HARDCODE § ¬¥¨âì ç¨á« ¬¥âª¨ ¢ í⮩ ¯à®æ¥¤ãà¥
|
||||
COMMONIDE:
|
||||
AND A
|
||||
LD H,A ;SAVE DRIVE NUMBER
|
||||
LD BC,#3011 ;CMOS VALUE
|
||||
LD L,msgStrings.detectIdePrMA
|
||||
JR Z,COMMON2
|
||||
DEC A
|
||||
LD BC,#C011 ;CMOS VALUE
|
||||
LD L,msgStrings.detectIdePrSL
|
||||
JR Z,COMMON2
|
||||
DEC A
|
||||
|
||||
; !HARDCODE § ¬¥¨âì ç¨á« ¬¥âª¨ ¢ í⮩ ¯à®æ¥¤ãà¥
|
||||
LD BC,#3020
|
||||
LD L,msgStrings.detectIdeSecMA
|
||||
JR Z,COMMON2
|
||||
DEC A
|
||||
LD BC,#C020
|
||||
LD L,msgStrings.detectIdeSecSL
|
||||
JR Z,COMMON2
|
||||
SCF
|
||||
RET
|
||||
|
||||
;0 - AUTODETECT
|
||||
;1 - GETTING FROM SETUP
|
||||
;2 - CD-ROM (ATAPI device)
|
||||
;3 - DISABLED
|
||||
COMMON2:
|
||||
CALL G_VALUE
|
||||
OR A
|
||||
JP Z,AUTODETECT ;AUTODECECT
|
||||
DEC A
|
||||
JP Z,SETUPDETECT ;SETUP
|
||||
DEC A
|
||||
JP Z,IT_IS_CDROM ;CDROM
|
||||
RET ;DON'T CHECK THIS DEVICE
|
||||
|
||||
AUTODETECT:
|
||||
PUSH HL
|
||||
LD A,L ;DETECT MESSAGE
|
||||
CALL POSTMSG
|
||||
CALL ScreenPOS.SUBNAME
|
||||
;
|
||||
EI
|
||||
;
|
||||
POP HL
|
||||
LD A,H ;RESTORE DRIVE NUMBER
|
||||
CALL IDEAUTO
|
||||
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
|
||||
|
||||
IT_IS_CDROM:
|
||||
PUSH HL
|
||||
LD A,L ;DETECT MESSAGE
|
||||
CALL POSTMSG
|
||||
CALL ScreenPOS.SUBNAME
|
||||
;
|
||||
EI
|
||||
;
|
||||
POP HL
|
||||
LD A,H ;RESTORE DRIVE NUMBER
|
||||
CALL IDE__CD
|
||||
JP IDEJUMPBACK
|
||||
; ????? ¯®á¬®âà¥âì
|
||||
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
|
||||
|
||||
SETUPDETECT:
|
||||
LD A,H
|
||||
LD IX,PRIM_MASTER_CMOS_T
|
||||
OR A
|
||||
JR Z,SETUPD2
|
||||
;
|
||||
LD IX,PRIM_SLAVE_CMOS_T
|
||||
CP 1
|
||||
JR Z,SETUPD2
|
||||
;
|
||||
LD IX,SEC_MASTER_CMOS_T
|
||||
CP 2
|
||||
JR Z,SETUPD2
|
||||
;
|
||||
LD IX,SEC_SLAVE_CMOS_T
|
||||
SETUPD2:
|
||||
CALL SELECT_IDE
|
||||
LD HL,TEMP
|
||||
LD DE,TEMP+1
|
||||
LD BC,511
|
||||
LD (HL),0
|
||||
LDIR
|
||||
CALL WAITHDD
|
||||
RET C
|
||||
;;
|
||||
LD A,(IX+2) ;M_HEAD
|
||||
CALL READCMS
|
||||
LD (TEMP+3*2),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. 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 ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS
|
||||
;
|
||||
LD A,(IX+3) ;M_SECT
|
||||
CALL READCMS
|
||||
LD (TEMP+6*2),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
|
||||
;
|
||||
;LD A,IDE.Drive.Master
|
||||
;LD BC,IDE.Write.DeviceHead
|
||||
;OUT (C),A
|
||||
LD A,IDE.Device.HDD
|
||||
LD (IDEDEV),A
|
||||
CALL IDESPEC
|
||||
RET
|
||||
|
||||
;ID_BUFFER: BLOCK #100,0 ;!HARDCODE ; !FIXIT 㬥ìè¨âì ¡ãä¥à ¨«¨ ¯¥à¥¥áâ¨?
|
||||
|
||||
PIDNUM: LD HL,memBUFFER.ID
|
||||
LD BC,#00FF
|
||||
XOR A
|
||||
@ -1454,20 +1190,6 @@ PRNTIME:
|
||||
OUT (SLOT3),A
|
||||
RET
|
||||
|
||||
MODEL: LD HL,TEMP+27*2 ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã.
|
||||
LD A,(HL)
|
||||
OR A
|
||||
JR Z,.unknown
|
||||
LD B,20
|
||||
CALL DWPRINT
|
||||
AND A
|
||||
RET
|
||||
.unknown:
|
||||
LD A,msgStrings.ideUnknown
|
||||
CALL POSTMSG
|
||||
AND A
|
||||
RET
|
||||
|
||||
PMEMORY:
|
||||
ADD HL,HL
|
||||
ADD HL,HL
|
||||
|
||||
@ -603,16 +603,16 @@ PITEM: LD E,(HL) ; x-coordinate
|
||||
ENDIF
|
||||
;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-[^]
|
||||
|
||||
; <20>¥ ¯®àâ¨â HL
|
||||
G_VALUE:
|
||||
PUSH BC
|
||||
LD A,C
|
||||
CALL READCMS
|
||||
POP BC
|
||||
AND B
|
||||
RRLPX:
|
||||
RRCA
|
||||
.loop: RRCA
|
||||
RRC B
|
||||
JR NC,RRLPX
|
||||
JR NC,.loop
|
||||
RLCA
|
||||
RET
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user