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 ;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 CALL G_VALUE
DEC HL 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 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 ;!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_SLAVE_CMOS_T
DETECT_ATA_ATAPI: ;R02 CP 1
; 1. Set the Sectorcount, LBAlo, LBAmid, and LBAhi IO ports to 0 (port 0x1F2 to 0x1F5). JR Z,.step1
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). LD IX,SEC_MASTER_CMOS_T
LD BC,IDE.Write.Command CP 2
LD E,IDE.ATA.IdentifyDevice JR Z,.step1
OUT (C),E
; ;
; 3. Read the Status port (0x1F7) again. LD IX,SEC_SLAVE_CMOS_T
; 3.1 If the value read is 0, the drive does not exist. .step1: LD HL,TEMP
LD B,0 LD DE,TEMP+1
.pause: DJNZ .pause LD BC,511
LD BC,IDE.Read.Status LD (HL),0
IN A,(C) LDIR
JP Z,ABSENT ;
; 3.2 For any other value: poll the Status port (0x1F7) until bit 7 (BSY, value = 0x80) clears. CALL Bug31SecCheck
LD HL,WAIT_SML JR C,.step2
LD DE,#8000 ;
CALL WAIT_PRT LD HL,PAUSES.HALT.BIG
JP C,ABSENT CALL BITS_WAITS.Clear_BUSY
; 3.3 At this point you need to check the LBAmid and LBAhi ports (0x1F4 and 0x1F5) to see JR C,AUTODETECTING.IDE_ABSENT
; if they are non-zero. If so, the drive is not ATA, and you should stop polling. ;
LD BC,IDE.Read.CylinderLow .step2: LD A,(IX+2) ;M_HEAD
IN A,(C) CALL READCMS
INC C ;IDE.Read.CylinderHigh LD (TEMP+3*2),A ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. HEADS PER TRACK
IN B,(C) ;
OR B LD A,(IX+1) ;M_CYLH
JP NZ,Non_ATA ; IT IS ATAPI CALL READCMS
; 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. PUSH AF
LD HL,WAIT_SML ;
LD DE,#0908 LD A,(IX+0) ;M_CYLL
CALL WAIT_PRT CALL READCMS
JP C,ABSENT 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 A,IDE.Device.HDD
LD (IDEDEV),A 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 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
@ -374,80 +417,86 @@ NONLBA: LD A,B
LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H LD (IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H
LD A,(TEMP+#0C) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK LD A,(TEMP+#0C) ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK
LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A LD (IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A
IF IDE_Optimization IF IDE_Optimization
LD B,high IDE.Write.Counter LD B,high IDE.Write.Counter
ELSE ELSE
LD BC,IDE.Write.Counter LD BC,IDE.Write.Counter
ENDIF ENDIF
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
;

View File

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

View File

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