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 @@ | ||||
| 
 | ||||
| ; | ||||
| ;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 ¯à¨¡à âìáï âãâ. <20>®á«¥ 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 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Anatoliy Belyanskiy
						Anatoliy Belyanskiy