AUTOIDE.ASM - R02. It is possible that ATAPI auto-detection began to work correctly.
This commit is contained in:
parent
07a21f3978
commit
dec9cb50d1
@ -1,9 +1,14 @@
|
|||||||
|
;[BEGIN]
|
||||||
;
|
;//MODULE: AUTOIDE
|
||||||
;R01 01.08.2001 FIX BUG INT "SELECT_IDE"
|
;//CREATE: 27-07-2001 AUTHOR: Denis Parinov
|
||||||
;R00 24.07.2001 ADD SECONDARY IDE
|
;-----------------------------------------------------------------------
|
||||||
;INITIAL NEW VERSION (2.48) 24.07.2001
|
;Rev Date Name Description
|
||||||
;========================================================
|
;-----------------------------------------------------------------------
|
||||||
|
;R02 17.08.2023 BAO Fixed bug with AUTODETECT ATAPI Drives
|
||||||
|
;R01 01.08.2001 DNS FIX BUG INT "SELECT_IDE"
|
||||||
|
;R00 24.07.2001 DNS ADD SECONDARY IDE
|
||||||
|
; 24.07.2001 DNS INITIAL NEW VERSION 2.48
|
||||||
|
;=======================================================================
|
||||||
|
|
||||||
; MODULE AUTOIDE
|
; MODULE AUTOIDE
|
||||||
/*
|
/*
|
||||||
@ -100,35 +105,37 @@ CDAUTO:
|
|||||||
|
|
||||||
SELECT_IDE:
|
SELECT_IDE:
|
||||||
AND A ;%0000'0011
|
AND A ;%0000'0011
|
||||||
LD D,#A0
|
LD D,IDE.ATA.Master
|
||||||
JR Z,IAUTO0
|
JR Z,.AUTO_0
|
||||||
DEC A
|
DEC A
|
||||||
LD D,#B0
|
LD D,#B0
|
||||||
JR Z,IAUTO0
|
JR Z,.AUTO_0
|
||||||
DEC A
|
DEC A
|
||||||
LD D,#A0 ;R00
|
;R00
|
||||||
JR Z,IAUTO1 ;R00
|
LD D,IDE.ATA.Master
|
||||||
DEC A ;R00
|
JR Z,.AUTO_1
|
||||||
LD D,#B0 ;R00
|
DEC A
|
||||||
IAUTO1: LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY
|
LD D,IDE.ATA.Slave
|
||||||
OUT (IDE.Chanel.Set),A ;R00
|
.AUTO_1: LD A,IDE.Chanel.Secondary ;SELECT SECONDARY
|
||||||
;LD A,1
|
OUT (IDE.Chanel.Set),A
|
||||||
JP IAUTO ;R00
|
;LD A,1
|
||||||
|
JP .AUTO
|
||||||
IAUTO0:
|
.AUTO_0: LD A,IDE.Chanel.Primary ;SELECT PRIMARY
|
||||||
LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY
|
OUT (IDE.Chanel.Set),A
|
||||||
OUT (IDE.Chanel.Set),A ;R00
|
;
|
||||||
;LD A,0
|
;LD A,0
|
||||||
XOR A
|
XOR A
|
||||||
IAUTO: LD (ICHANEL),A
|
.AUTO: LD (ICHANEL),A
|
||||||
LD BC,IDE.Write.DriveCtrl ;R01
|
;R01
|
||||||
OUT (C),D ;R01
|
LD BC,IDE.Write.DriveCtrl
|
||||||
|
OUT (C),D
|
||||||
|
;
|
||||||
RET
|
RET
|
||||||
|
|
||||||
IDEAUTO:
|
IDEAUTO:
|
||||||
CALL SELECT_IDE
|
CALL SELECT_IDE
|
||||||
;MASTER
|
;MASTER
|
||||||
LD A,#FF
|
LD A,IDE.Device.NONE
|
||||||
LD (IDEDEV),A
|
LD (IDEDEV),A
|
||||||
CDMASTR:
|
CDMASTR:
|
||||||
LD (SKIP),A
|
LD (SKIP),A
|
||||||
@ -177,15 +184,72 @@ NO_BUSY:
|
|||||||
; 1 select device (port+6)
|
; 1 select device (port+6)
|
||||||
; 2 read status byte(port+7) if =-1 then there is no disk
|
; 2 read status byte(port+7) if =-1 then there is no disk
|
||||||
; if busy to many time then no disk
|
; if busy to many time then no disk
|
||||||
; 3 send id command 0ec0h if error then send packet device id command
|
; 3 send id command #ec if error then send packet device id command
|
||||||
; 0a1h if error then no disk.
|
; #a1 if error then no disk.
|
||||||
; commands must be send byte by byte dword operations are used only for data transfers.
|
; commands must be send byte by byte dword operations are used only for data transfers.
|
||||||
;CP IDE.Device.NONE
|
;R02
|
||||||
;JR NZ,1F
|
CP IDE.Device.NONE
|
||||||
|
JR NZ,.check_next
|
||||||
|
;JP NZ,DETECT_ATA_ATAPI
|
||||||
|
;
|
||||||
|
|
||||||
1: CP IDE.Device.CDROM
|
DETECT_ATA_ATAPI: ;R02
|
||||||
JP Z,NOHDD ;¯à¨ ¢â®¤¥â¥ªâ¥, ¥á«¨ âãâ CD, â® ¨ª®£¤ ¥ ¡ã¤¥â ¯¥à¥å®¤ NOHDD
|
; 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
|
||||||
|
;
|
||||||
|
; 2. Send the IDENTIFY command (0xEC) to the Command IO port (0x1F7).
|
||||||
|
LD BC,IDE.Write.Command
|
||||||
|
LD E,ATA_IDENTIFY_DEVICE
|
||||||
|
OUT (C),E
|
||||||
|
;
|
||||||
|
; 3. Read the Status port (0x1F7) again.
|
||||||
|
LD B,0
|
||||||
|
.pause: DJNZ .pause
|
||||||
|
; 3.1 If the value read is 0, the drive does not exist.
|
||||||
|
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,NOHDD ; 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,#0101 ;!FIXIT
|
||||||
|
CALL WAIT_PRT
|
||||||
|
JP NC,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
|
||||||
|
LD (IDEDEV),A
|
||||||
|
JP GETPARM
|
||||||
|
;
|
||||||
|
;;;;;;;;;;;;;;;;;;;;;;; R02
|
||||||
|
|
||||||
|
|
||||||
|
NO_BUSY.check_next:
|
||||||
|
CP IDE.Device.CDROM
|
||||||
|
JP Z,NOHDD
|
||||||
|
|
||||||
|
;!TODO ¯à¨¡à âìáï âãâ. <20>®á«¥ R02 âãâ ¬®¦® ã¡à âì ¬®£® «¨è¥£®
|
||||||
|
;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=;
|
||||||
LD E,ATA_NOP
|
LD E,ATA_NOP
|
||||||
LD BC,IDE.Write.Command
|
LD BC,IDE.Write.Command
|
||||||
OUT (C),E
|
OUT (C),E
|
||||||
@ -220,7 +284,7 @@ WXREADY:
|
|||||||
LD DE,#0101
|
LD DE,#0101
|
||||||
CALL WAIT_PRT
|
CALL WAIT_PRT
|
||||||
JP NC,NOHDD
|
JP NC,NOHDD
|
||||||
|
;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=;
|
||||||
GETPARM:
|
GETPARM:
|
||||||
LD HL,WAIT_IDE
|
LD HL,WAIT_IDE
|
||||||
LD DE,#0808
|
LD DE,#0808
|
||||||
@ -394,6 +458,7 @@ SKIPKEY:
|
|||||||
LD (SKIP),A
|
LD (SKIP),A
|
||||||
SCF
|
SCF
|
||||||
RET
|
RET
|
||||||
|
|
||||||
SKIP: DB #FF
|
SKIP: DB #FF
|
||||||
IDEDEV: DB #FF
|
IDEDEV: DB #FF
|
||||||
ICHANEL: DB #00
|
ICHANEL: DB #00
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user