new ide detecting procedures

This commit is contained in:
Anatoliy Belyanskiy 2023-09-07 01:07:46 +10:00
parent 61457e702e
commit de46473cc8
3 changed files with 906 additions and 840 deletions

View File

@ -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
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
;
/*
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
CALL G_VALUE
OR A
JR Z,AUTODETECT ;AUTO DETECT
;
; 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
DEC A
JR Z,SETUP_FROM_CMOS ;Get from CMOS (SETUP)
;
; 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
;
; 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
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
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
*/
NO_BUSY.check_next:
CP IDE.Device.CDROM
JP Z,Non_ATA
;!TODO ¯à¨¡à âìáï âãâ. <20>®á«¥ R02 âãâ ¬®¦­® ã¡à âì ¬­®£® «¨è­¥£®
;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=;
LD E,IDE.ATA.Nop
.IDE_ABSENT: LD A,IDE.Device.NONE
LD (IDEDEV),A
LD A,IDE.ATA.Nop
LD BC,IDE.Write.Command
OUT (C),E
DEC B ; LD BC, IDE.Read.Status
WXREADY:
HALT
DEC HL
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
IN A,(C)
;!TEST detect drives
;AND #C0
;CP #40
AND #81
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 ᤥ« âì ç¥à¥§ áâàãªâãàã. 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 (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
@ -382,72 +425,78 @@ NONLBA: LD A,B
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
;

View File

@ -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

View File

@ -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