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 ;SECTOR PER CYLINDER HIGH ;06
|
||||||
; DB #FF ;DEVICE TYPE ;07
|
; 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_IDE EQU #0000
|
||||||
WAIT_SML EQU #1000
|
WAIT_SML EQU #1000
|
||||||
WAIT_ERROR EQU #0400
|
WAIT_ERROR EQU #0400
|
||||||
|
|
||||||
SELECT_IDE:
|
M_CYLL EQU #12
|
||||||
AND A ;%0000'0011
|
M_CYLH EQU #13
|
||||||
LD D,IDE.Drive.Master
|
M_HEAD EQU #14
|
||||||
JR Z,.AUTO_0
|
M_SECT EQU #15
|
||||||
DEC A
|
|
||||||
LD D,IDE.Drive.Slave
|
S_CYLL EQU #16
|
||||||
JR Z,.AUTO_0
|
S_CYLH EQU #17
|
||||||
DEC A
|
S_HEAD EQU #18
|
||||||
;R00
|
S_SECT EQU #19
|
||||||
LD D,IDE.Drive.Master
|
|
||||||
JR Z,.AUTO_1
|
SM_CYLL EQU #37
|
||||||
DEC A
|
SM_CYLH EQU #38
|
||||||
LD D,IDE.Drive.Slave
|
SM_HEAD EQU #39
|
||||||
.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
|
SM_SECT EQU #3A
|
||||||
OUT (IDE.Chanel.Set),A
|
|
||||||
;LD A,1
|
SS_CYLL EQU #3B
|
||||||
JP .AUTO
|
SS_CYLH EQU #3C
|
||||||
.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY
|
SS_HEAD EQU #3D
|
||||||
OUT (IDE.Chanel.Set),A
|
SS_SECT EQU #3E
|
||||||
;
|
|
||||||
;LD A,0
|
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
|
XOR A
|
||||||
.AUTO: LD (ICHANEL),A
|
CALL STEP1_GETCMOS
|
||||||
;R01
|
|
||||||
LD BC,IDE.Write.DeviceHead
|
LD IY,IDE.INIT_TBL_IDE1
|
||||||
OUT (C),D
|
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
|
RET
|
||||||
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
IDE__CD:
|
AUTODETECT:
|
||||||
CALL SELECT_IDE
|
LD A,L ;DETECT MESSAGE
|
||||||
;MASTER
|
CALL POSTMSG
|
||||||
CDAUTO:
|
CALL ScreenPOS.SUBNAME
|
||||||
LD A,IDE.Device.CDROM
|
LD A,(MasterSlave)
|
||||||
LD (IDEDEV),A
|
|
||||||
LD A,#FF ;!FIXIT ¬®¦® ®¯â¨¬¨§¨à®¢ âì
|
|
||||||
JP CDMASTR
|
|
||||||
|
|
||||||
IDEAUTO:
|
|
||||||
;Disable 8-bit data transfer
|
|
||||||
;!TODO
|
|
||||||
;
|
;
|
||||||
|
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
|
CALL SELECT_IDE
|
||||||
LD A,IDE.Device.NONE
|
LD A,IDE.Device.NONE
|
||||||
LD (IDEDEV),A
|
LD (IDEDEV),A
|
||||||
CDMASTR:
|
|
||||||
LD (SKIP),A
|
LD (SKIP),A
|
||||||
LD BC,IDE.Write.DeviceHead
|
LD A,H
|
||||||
OUT (C),D
|
;
|
||||||
DEC B
|
AND A
|
||||||
INC C ; LD BC,IDE.Read.Status
|
LD BC,#3011 ;CMOS VALUE
|
||||||
IN A,(C)
|
LD L,msgStrings.detectIdePrMA
|
||||||
AND #80
|
JR Z,.choose
|
||||||
LD HL,280
|
;
|
||||||
JR Z,NO_BUSY
|
DEC A
|
||||||
LD HL,1550 ; § ¤¥à¦ª - 31 ᥪã¤
|
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
|
EI
|
||||||
CLRBUSY:
|
|
||||||
HALT
|
|
||||||
DEC HL
|
|
||||||
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
|
|
||||||
;
|
;
|
||||||
/*
|
CALL G_VALUE
|
||||||
DETECT_ATA_ATAPI: ;R02
|
OR A
|
||||||
; 1. Set the Sectorcount, LBAlo, LBAmid, and LBAhi IO ports to 0 (port 0x1F2 to 0x1F5).
|
JR Z,AUTODETECT ;AUTO DETECT
|
||||||
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
|
|
||||||
;
|
;
|
||||||
; 2. Send the IDENTIFY command (0xEC) to the Command IO port (0x1F7).
|
DEC A
|
||||||
LD BC,IDE.Write.Command
|
JR Z,SETUP_FROM_CMOS ;Get from CMOS (SETUP)
|
||||||
LD E,IDE.ATA.IdentifyDevice
|
|
||||||
OUT (C),E
|
|
||||||
;
|
;
|
||||||
; 3. Read the Status port (0x1F7) again.
|
DEC A
|
||||||
; 3.1 If the value read is 0, the drive does not exist.
|
JR Z,IT_IS_ATAPI ;CD-ROM
|
||||||
LD B,0
|
RET ;DON'T CHECK THIS DEVICE
|
||||||
.pause: DJNZ .pause
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
LD BC,IDE.Read.Status
|
|
||||||
IN A,(C)
|
|
||||||
JP Z,ABSENT
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
; 3.2 For any other value: poll the Status port (0x1F7) until bit 7 (BSY, value = 0x80) clears.
|
IT_IS_ATAPI:
|
||||||
LD HL,WAIT_SML
|
LD A,L ;DETECT MESSAGE
|
||||||
LD DE,#8000
|
CALL POSTMSG
|
||||||
CALL WAIT_PRT
|
CALL ScreenPOS.SUBNAME
|
||||||
JP C,ABSENT
|
|
||||||
; 3.3 At this point you need to check the LBAmid and LBAhi ports (0x1F4 and 0x1F5) to see
|
LD HL,PAUSES.HALT.BIG
|
||||||
; if they are non-zero. If so, the drive is not ATA, and you should stop polling.
|
CALL BITS_WAITS.Clear_BUSY
|
||||||
LD BC,IDE.Read.CylinderLow
|
JR C,AUTODETECTING.IDE_ABSENT
|
||||||
IN A,(C)
|
|
||||||
INC C ;IDE.Read.CylinderHigh
|
CALL AUTODETECTING.Its_ATAPI
|
||||||
IN B,(C)
|
JP AUTODETECT.IDEJUMPBACK
|
||||||
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
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
LD DE,#0908
|
AUTODETECTING: CALL DETECTORS.CheckChanel
|
||||||
CALL WAIT_PRT
|
JR C,.IDE_ABSENT
|
||||||
JP C,ABSENT
|
|
||||||
;
|
CALL Bug31SecCheck
|
||||||
; 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.
|
JR C,.next
|
||||||
LD A,IDE.Device.HDD
|
|
||||||
|
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
|
LD (IDEDEV),A
|
||||||
JP GETPARM
|
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
|
||||||
;
|
;
|
||||||
;;;;;;;;;;;;;;;;;;;;;;; R02
|
.IDE_ABSENT: LD A,IDE.Device.NONE
|
||||||
*/
|
LD (IDEDEV),A
|
||||||
|
LD A,IDE.ATA.Nop
|
||||||
|
|
||||||
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
|
LD BC,IDE.Write.Command
|
||||||
OUT (C),E
|
OUT (C),A
|
||||||
DEC B ; LD BC, IDE.Read.Status
|
DEC B
|
||||||
WXREADY:
|
IN A,(C) ; IDE.Read.Status
|
||||||
HALT
|
SCF
|
||||||
DEC HL
|
RET
|
||||||
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
|
SETUP_FROM_CMOS:
|
||||||
LD A,H
|
LD A,H
|
||||||
OR L
|
LD IX,PRIM_MASTER_CMOS_T
|
||||||
JP Z,ABSENT
|
OR A
|
||||||
CALL SKIPKEY
|
JR Z,.step1
|
||||||
JP C,ABSENT
|
;
|
||||||
LD BC,IDE.Read.Status
|
LD IX,PRIM_SLAVE_CMOS_T
|
||||||
IN A,(C)
|
|
||||||
;!TEST detect drives
|
|
||||||
;AND #C0
|
|
||||||
;CP #40
|
|
||||||
AND #81
|
|
||||||
CP 1
|
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 ᤥ« âì ç¥à¥§ áâàãªâãàã. 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
|
||||||
;
|
;
|
||||||
JR NZ,WXREADY
|
|
||||||
|
|
||||||
; LD A,#90 ;?????
|
|
||||||
; CALL IDE_CMD
|
|
||||||
|
|
||||||
LD A,IDE.Device.HDD
|
LD A,IDE.Device.HDD
|
||||||
LD (IDEDEV),A
|
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
|
CALL IDESPEC
|
||||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
|
||||||
CALL SaveToCMOS
|
|
||||||
;
|
|
||||||
.exit: AND A
|
|
||||||
RET
|
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:
|
IDESPEC:
|
||||||
IN A,(SLOT3)
|
IN A,(SLOT3)
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
@ -336,18 +378,18 @@ IDESPEC:
|
|||||||
LD A,(IDEDEV)
|
LD A,(IDEDEV)
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
|
LD (IY+IDE.HDD_INIT_TABLE.DriveType),A
|
||||||
CP IDE.Device.CDROM
|
CP IDE.Device.CDROM
|
||||||
JP Z,FOR_CDR
|
JP Z,.FOR_CDR
|
||||||
;Check write caching
|
; ;Check write caching
|
||||||
LD A,(TEMP+85*2) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. ‚ª«îç¥ «¨ ªíè § ¯¨á¨?
|
; LD A,(TEMP+85*2) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. ‚ª«îç¥ «¨ ªíè § ¯¨á¨?
|
||||||
AND %0010'0000
|
; AND %0010'0000
|
||||||
JR Z,.NoWriteCache
|
; JR Z,.NoWriteCache
|
||||||
;Disable write caching
|
; ;Disable write caching
|
||||||
LD BC,IDE.Write.Features
|
; LD BC,IDE.Write.Features
|
||||||
LD A,IDE.ATA.SetFeatures.DisableWriteCache
|
; LD A,IDE.ATA.SetFeatures.DisableWriteCache
|
||||||
OUT (C),A
|
; OUT (C),A
|
||||||
LD A,IDE.ATA.SetFeatures
|
; LD A,IDE.ATA.SetFeatures
|
||||||
CALL IDE_CMD
|
; CALL IDE_CMD
|
||||||
.NoWriteCache:
|
; .NoWriteCache:
|
||||||
LD BC,IDE.Read.Control
|
LD BC,IDE.Read.Control
|
||||||
IN A,(C)
|
IN A,(C)
|
||||||
AND #F0
|
AND #F0
|
||||||
@ -360,9 +402,10 @@ IDESPEC:
|
|||||||
LD B,A
|
LD B,A
|
||||||
LD A,(TEMP+#63) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. LBA/NON-LBA bit 1 (FROM ZERO!)
|
LD A,(TEMP+#63) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. LBA/NON-LBA bit 1 (FROM ZERO!)
|
||||||
BIT 1,A
|
BIT 1,A
|
||||||
JR Z,NONLBA
|
JR Z,.NONLBA
|
||||||
|
;
|
||||||
SET 6,B
|
SET 6,B
|
||||||
NONLBA: LD A,B
|
.NONLBA: LD A,B
|
||||||
LD BC,IDE.Write.DeviceHead
|
LD BC,IDE.Write.DeviceHead
|
||||||
OUT (C),A
|
OUT (C),A
|
||||||
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
AND #F0 ;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask
|
||||||
@ -382,72 +425,78 @@ NONLBA: LD A,B
|
|||||||
OUT (C),A
|
OUT (C),A
|
||||||
LD A,IDE.ATA.InitializeDeviceParameters
|
LD A,IDE.ATA.InitializeDeviceParameters
|
||||||
CALL IDE_CMD
|
CALL IDE_CMD
|
||||||
; RET C
|
|
||||||
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track
|
LD C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) ; Sector per track
|
||||||
LD B,0
|
LD B,0
|
||||||
LD H,B
|
LD H,B
|
||||||
LD L,B
|
LD L,B
|
||||||
LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD
|
LD A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) ; Head per HDD
|
||||||
HDDINI3:
|
|
||||||
ADD HL,BC
|
.loop: ADD HL,BC
|
||||||
DEC A
|
DEC A
|
||||||
JR NZ,HDDINI3
|
JR NZ,.loop
|
||||||
|
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L
|
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H
|
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H
|
||||||
NOSPEC:
|
.END: ;!TEST save hdd parameters to cmos for "setup" in settings
|
||||||
;!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
|
LD A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) ; for save to cmos in GETPARM
|
||||||
;
|
;
|
||||||
EX AF,AF'
|
EX AF,AF'
|
||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
AND A
|
AND A
|
||||||
RET
|
RET
|
||||||
|
;
|
||||||
FOR_CDR:
|
.FOR_CDR: LD BC,IDE.Read.Control
|
||||||
LD BC,IDE.Read.Control
|
|
||||||
IN A,(C)
|
IN A,(C)
|
||||||
AND #F0
|
AND #F0
|
||||||
LD HL,ICHANEL
|
LD HL,ICHANEL
|
||||||
OR (HL)
|
OR (HL)
|
||||||
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
|
LD (IY+IDE.HDD_INIT_TABLE.DRV_Flags),A
|
||||||
JR NOSPEC
|
JR IDESPEC.END
|
||||||
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
IDE_CMD:
|
IDE_CMD:
|
||||||
PUSH AF
|
PUSH AF
|
||||||
LD HL,WAIT_IDE
|
LD HL,PAUSES.WAIT.IDE
|
||||||
LD DE,#C040
|
LD DE,256*IDE.ControlByte.Busy + 0
|
||||||
CALL WAIT_PRT
|
CALL BITS_WAITS.WAIT_PRT
|
||||||
POP DE
|
POP HL
|
||||||
RET C
|
RET C
|
||||||
INC B ; LD BC,IDE.Write.Command
|
INC B ; LD BC,IDE.Write.Command
|
||||||
OUT (C),D
|
OUT (C),H
|
||||||
LD HL,WAIT_IDE
|
LD HL,PAUSES.WAIT.IDE
|
||||||
LD DE,#C040
|
;LD DE,256*IDE.ControlByte.Busy + 0
|
||||||
JP WAIT_PRT
|
JR BITS_WAITS.WAIT_PRT
|
||||||
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
WAITHDD:
|
|
||||||
EI
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
LD HL,1533 ;!HARDCODE HDD
|
MODEL: LD HL,TEMP+27*2 ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã.
|
||||||
WTREADY:
|
LD A,(HL)
|
||||||
HALT
|
OR A
|
||||||
LD BC,IDE.Read.Status
|
JR Z,.unknown
|
||||||
IN A,(C)
|
LD B,20 ;!HARDCODE
|
||||||
AND #C0
|
CALL DWPRINT
|
||||||
CP #40
|
AND A
|
||||||
RET Z
|
|
||||||
DEC HL
|
|
||||||
LD A,H
|
|
||||||
OR L
|
|
||||||
JR NZ,WTREADY
|
|
||||||
SCF
|
|
||||||
RET
|
RET
|
||||||
|
.unknown:
|
||||||
|
LD A,msgStrings.ideUnknown
|
||||||
|
CALL POSTMSG
|
||||||
|
AND A
|
||||||
|
RET
|
||||||
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
|
BITS_WAITS:
|
||||||
; IN:
|
; IN:
|
||||||
; HL - Waiting delay
|
; HL - Waiting delay
|
||||||
; DE - MASK : PATTERN
|
; DE - MASK : PATTERN
|
||||||
; OUT:
|
; OUT:
|
||||||
; NC: (PORT & D)-E = 0
|
; NC: (PORT & D)-E = 0
|
||||||
; CF: waiting delay exceeded
|
; CF: waiting delay exceeded
|
||||||
WAIT_PRT:
|
.WAIT_PRT:
|
||||||
LD BC,IDE.Read.Status
|
LD BC,IDE.Read.Status
|
||||||
;
|
;
|
||||||
.loop: IN A,(C)
|
.loop: IN A,(C)
|
||||||
@ -463,7 +512,69 @@ WAIT_PRT:
|
|||||||
;
|
;
|
||||||
SCF
|
SCF
|
||||||
RET
|
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:
|
SKIPKEY:
|
||||||
EXX
|
EXX
|
||||||
CALL SCANKEY
|
CALL SCANKEY
|
||||||
@ -483,7 +594,10 @@ SKIPKEY:
|
|||||||
LD (SKIP),A
|
LD (SKIP),A
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
;!TEST save hdd parameters to cmos for "setup" in settings
|
;!TEST save hdd parameters to cmos for "setup" in settings
|
||||||
; IN: A' = DRV_Flags
|
; IN: A' = DRV_Flags
|
||||||
SaveToCMOS:
|
SaveToCMOS:
|
||||||
@ -525,14 +639,241 @@ SaveToCMOS:
|
|||||||
LD B,A
|
LD B,A
|
||||||
LD A,(IX+3)
|
LD A,(IX+3)
|
||||||
JP WRITCMS ; Heads
|
JP WRITCMS ; Heads
|
||||||
;;;;;;;;;;
|
/////////////////////////////////////////////////////////////////////[^]
|
||||||
|
|
||||||
|
|
||||||
SKIP: DB #FF
|
/////////////////////////////////////////////////////////////////////[v]
|
||||||
IDEDEV: DB #FF
|
RESET_Slave_ATAPI:
|
||||||
ICHANEL: DB #00
|
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
|
;WAITHDD DEC L
|
||||||
; RET NZ
|
; RET NZ
|
||||||
@ -553,3 +894,6 @@ ICHANEL: DB #00
|
|||||||
; DEC E
|
; DEC E
|
||||||
; JR NZ,PAUSE1
|
; JR NZ,PAUSE1
|
||||||
; RET
|
; RET
|
||||||
|
|
||||||
|
ENDMODULE
|
||||||
|
;
|
||||||
@ -72,51 +72,6 @@
|
|||||||
;FDD EQU #03
|
;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
|
TEMP EQU #7E00 ; !HARDCODE
|
||||||
MEMMAP2 EQU TEMP ; ¤®«¦® ¡ëâì ¢ë஢¥® ¯® ALIGN 256
|
MEMMAP2 EQU TEMP ; ¤®«¦® ¡ëâì ¢ë஢¥® ¯® ALIGN 256
|
||||||
TPOINTD EQU TEMP-32
|
TPOINTD EQU TEMP-32
|
||||||
@ -681,13 +636,14 @@ INFO_MESSAGE: ;!FIXIT
|
|||||||
;CALL ScreenPOS.LOCAT
|
;CALL ScreenPOS.LOCAT
|
||||||
CALL LP_SET_PLACE
|
CALL LP_SET_PLACE
|
||||||
|
|
||||||
CALL TSETUP
|
CALL TSETUP ;!TODO ¬®¦¥â ¯¨åãâì ¥ñ ¯à¥àë¢ ¨ï?
|
||||||
|
|
||||||
CALL AUTODET
|
CALL CONFIGURE_IDE_DRIVES.START
|
||||||
CALL CTRLKEY
|
CALL CTRLKEY
|
||||||
LD A,B
|
LD A,B
|
||||||
AND #10
|
AND #10
|
||||||
JR NZ,ABOOT
|
JR NZ,ABOOT
|
||||||
|
|
||||||
CALL TSETUP
|
CALL TSETUP
|
||||||
|
|
||||||
|
|
||||||
@ -742,7 +698,7 @@ TSETUP:
|
|||||||
AND A
|
AND A
|
||||||
SBC HL,DE
|
SBC HL,DE
|
||||||
JR NZ,TSETUP
|
JR NZ,TSETUP
|
||||||
POP HL
|
POP HL ; ã¡¨à ¥¬ «¨è¥¥
|
||||||
JP EXIT_SETUP
|
JP EXIT_SETUP
|
||||||
CSETUP: XOR A
|
CSETUP: XOR A
|
||||||
LD (ITEM_Restore),A
|
LD (ITEM_Restore),A
|
||||||
@ -1115,226 +1071,6 @@ NOFDD1:
|
|||||||
RET
|
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
|
PIDNUM: LD HL,memBUFFER.ID
|
||||||
LD BC,#00FF
|
LD BC,#00FF
|
||||||
XOR A
|
XOR A
|
||||||
@ -1454,20 +1190,6 @@ PRNTIME:
|
|||||||
OUT (SLOT3),A
|
OUT (SLOT3),A
|
||||||
RET
|
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:
|
PMEMORY:
|
||||||
ADD HL,HL
|
ADD HL,HL
|
||||||
ADD HL,HL
|
ADD HL,HL
|
||||||
|
|||||||
@ -603,16 +603,16 @@ PITEM: LD E,(HL) ; x-coordinate
|
|||||||
ENDIF
|
ENDIF
|
||||||
;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-[^]
|
;/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\-[^]
|
||||||
|
|
||||||
|
; <20>¥ ¯®àâ¨â HL
|
||||||
G_VALUE:
|
G_VALUE:
|
||||||
PUSH BC
|
PUSH BC
|
||||||
LD A,C
|
LD A,C
|
||||||
CALL READCMS
|
CALL READCMS
|
||||||
POP BC
|
POP BC
|
||||||
AND B
|
AND B
|
||||||
RRLPX:
|
.loop: RRCA
|
||||||
RRCA
|
|
||||||
RRC B
|
RRC B
|
||||||
JR NC,RRLPX
|
JR NC,.loop
|
||||||
RLCA
|
RLCA
|
||||||
RET
|
RET
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user