diff --git a/src/bios/rom/SETUP/AUTOIDE.asm b/src/bios/rom/SETUP/AUTOIDE.asm index badb19e..17c7603 100644 --- a/src/bios/rom/SETUP/AUTOIDE.asm +++ b/src/bios/rom/SETUP/AUTOIDE.asm @@ -1,9 +1,14 @@ - -; -;R01 01.08.2001 FIX BUG INT "SELECT_IDE" -;R00 24.07.2001 ADD SECONDARY IDE -;INITIAL NEW VERSION (2.48) 24.07.2001 -;======================================================== +;[BEGIN] +;//MODULE: AUTOIDE +;//CREATE: 27-07-2001 AUTHOR: Denis Parinov +;----------------------------------------------------------------------- +;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 /* @@ -100,35 +105,37 @@ CDAUTO: SELECT_IDE: AND A ;%0000'0011 - LD D,#A0 - JR Z,IAUTO0 + LD D,IDE.ATA.Master + JR Z,.AUTO_0 DEC A LD D,#B0 - JR Z,IAUTO0 + JR Z,.AUTO_0 DEC A - LD D,#A0 ;R00 - JR Z,IAUTO1 ;R00 - DEC A ;R00 - LD D,#B0 ;R00 -IAUTO1: LD A,IDE.Chanel.Secondary ;R00 ;SELECT SECONDARY - OUT (IDE.Chanel.Set),A ;R00 - ;LD A,1 - JP IAUTO ;R00 - -IAUTO0: - LD A,IDE.Chanel.Primary ;R00 ;SELECT PRIMARY - OUT (IDE.Chanel.Set),A ;R00 - ;LD A,0 + ;R00 + LD D,IDE.ATA.Master + JR Z,.AUTO_1 + DEC A + LD D,IDE.ATA.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 XOR A -IAUTO: LD (ICHANEL),A - LD BC,IDE.Write.DriveCtrl ;R01 - OUT (C),D ;R01 +.AUTO: LD (ICHANEL),A + ;R01 + LD BC,IDE.Write.DriveCtrl + OUT (C),D + ; RET IDEAUTO: CALL SELECT_IDE ;MASTER - LD A,#FF + LD A,IDE.Device.NONE LD (IDEDEV),A CDMASTR: LD (SKIP),A @@ -177,15 +184,72 @@ NO_BUSY: ; 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 0ec0h if error then send packet device id command -; 0a1h if error 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. - ;CP IDE.Device.NONE - ;JR NZ,1F + ;R02 + CP IDE.Device.NONE + JR NZ,.check_next + ;JP NZ,DETECT_ATA_ATAPI + ; -1: CP IDE.Device.CDROM - JP Z,NOHDD ;при автодетекте, если тут CD, то никогда не будет перехода на NOHDD +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 + ; +; 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 прибраться тут. После R02 тут можно убрать много лишнего +;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=; LD E,ATA_NOP LD BC,IDE.Write.Command OUT (C),E @@ -220,7 +284,7 @@ WXREADY: LD DE,#0101 CALL WAIT_PRT JP NC,NOHDD - +;-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=-=-=-=-=-==-=-=; GETPARM: LD HL,WAIT_IDE LD DE,#0808 @@ -394,6 +458,7 @@ SKIPKEY: LD (SKIP),A SCF RET + SKIP: DB #FF IDEDEV: DB #FF ICHANEL: DB #00