Определение смены диска в драйве ATAPI.
This commit is contained in:
		
							parent
							
								
									e5856eef12
								
							
						
					
					
						commit
						69670d7873
					
				
										
											Binary file not shown.
										
									
								
							| @ -56,7 +56,7 @@ FDD_5x_GETMED: | ||||
| 		LD	B,A | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		;EX	AF,AF' | ||||
| 		LD	A,%0000'0001	; removable media | ||||
| 		AND	A | ||||
| 		RET  | ||||
| 
 | ||||
| @ -130,6 +130,7 @@ FDD_5x_DETECT:	CALL	SAVE_INTERRUPTS.switch_off | ||||
| 		PUSH	AF | ||||
| 		CALL	SET_DOS_OFF | ||||
| 		POP	AF | ||||
| 		LD	B,%0000'0001		;bit0=1 removable, bit1=1 drive changed, bit7..2 reserved ; [ ] | ||||
| 		JP	SAVE_INTERRUPTS.restore | ||||
| 		;RET  | ||||
| 
 | ||||
|  | ||||
| @ -109,10 +109,9 @@ CD_5x_GETMED:	LD	C,IDE.Device.ATAPI | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;READ SECTOR(S) | ||||
| CD_5x_READ: | ||||
| 	EX	AF,AF' | ||||
| 	 IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| CD_5x_READ:	EX	AF,AF' | ||||
| 		 IN	A,(SLOT3) | ||||
| 		EX	AF,AF' | ||||
| ;[]================================================================[#52] | ||||
| ;Function: Long	Read Sectors | ||||
| ;	A - Disk | ||||
| @ -256,14 +255,15 @@ CD_5x_LONG_WRITE: | ||||
| ;Function: Detect Disk | ||||
| ;	   A - Disk | ||||
| ;Return:   CF=0 - A=Drive type  | ||||
| ;		  B=RemovableMedia byte ; [ ] | ||||
| ;	   CF=1 - drive not present, A=#02 | ||||
| CD_5x_DETECT:	LD	C,IDE.Device.ATAPI | ||||
| 		AND	%1011'1111 | ||||
| 		CALL	DRV_DETECT | ||||
| .shared:	CALL	DRV_DETECT | ||||
| 		RET	C | ||||
| 		; | ||||
| 		PUSH	AF | ||||
| 		LD	BC,SLOT3 | ||||
| 		LD	C,SLOT3 | ||||
| 		IN	B,(C) | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(C),A | ||||
| @ -272,6 +272,7 @@ CD_5x_DETECT:	LD	C,IDE.Device.ATAPI | ||||
| 		INC	HL | ||||
| 		LD	A,(HL) | ||||
| 		OUT	(C),B | ||||
| 		LD	B,A | ||||
| 		AND	%0000'0010 | ||||
| 		JR	Z,.exit | ||||
| 		; | ||||
| @ -329,7 +330,7 @@ CD_CHECK_MEDIA_CHANGED: | ||||
| 		JR	C,.noWait | ||||
| 		; | ||||
| 		EXX | ||||
| 		 LD	BC,SLOT3 | ||||
| 		 LD	C,SLOT3 | ||||
| 		 IN	B,(C) | ||||
| 		 LD	A,SYS_PAGE | ||||
| 		 OUT	(C),A | ||||
|  | ||||
| @ -107,6 +107,7 @@ HDD_5x_GETMED: | ||||
| 	EX	AF,AF' | ||||
| 	 LD	A,SYS_PAGE | ||||
| 	 OUT	(SLOT3),A | ||||
| 	 LD	A,(IY+IDE.HDD_INIT_TABLE.RemovableMedia) | ||||
| 	 LD	L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) | ||||
| 	 LD	H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) | ||||
| 	 LD	E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) | ||||
| @ -114,8 +115,8 @@ HDD_5x_GETMED: | ||||
| 	 LD	B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) | ||||
| 	 LD	IX,512				;!HARDCODE sector size | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	;AND	A | ||||
| 	 OUT	(SLOT3),A | ||||
| 	EX	AF,AF' | ||||
| 	RET  | ||||
| ;[]================================================================[#58] | ||||
| 
 | ||||
| @ -675,5 +676,5 @@ WAITPRT:	LD	DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE | ||||
| ;	   CF=1 - drive not present, A=#02 | ||||
| HDD_5x_DETECT: | ||||
| 	LD	C,IDE.Device.HDD | ||||
| 	JP	DRV_DETECT | ||||
| 	JP	CD_5x_DETECT.shared | ||||
| ;[]================================================================[#57] | ||||
| @ -67,32 +67,30 @@ SELECT_DRIVE: | ||||
| ;	   ‘ - Type | ||||
| ;Return:   CF=0 - A=Drive type  | ||||
| ;	   CF=1 - drive not present, A=#02 | ||||
| DRV_DETECT: | ||||
| 	CP	#84	;!HARDCODE max IDE drives (#80,#81,#82,#83) | ||||
| 	CCF | ||||
| 	JR	C,.error | ||||
| 
 | ||||
| 	LD	HL,IDE.INIT_TBL_IDE0.DriveType | ||||
| 	AND	3 | ||||
| 	JR	Z,.get_param | ||||
| 	LD	HL,IDE.INIT_TBL_IDE1.DriveType | ||||
| 	DEC	A | ||||
| 	JR	Z,.get_param | ||||
| 	LD	HL,IDE.INIT_TBL_IDE2.DriveType | ||||
| 	DEC	A | ||||
| 	JR	Z,.get_param | ||||
| 	LD	HL,IDE.INIT_TBL_IDE3.DriveType | ||||
| .get_param: | ||||
| 	IN	A,(SLOT3) | ||||
| 	LD	B,A | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	 | ||||
| 	LD	A,(HL) | ||||
| 	CP	C	; compare Type | ||||
| 	LD	C,SLOT3 | ||||
| 	OUT	(C),B | ||||
| 	RET	Z | ||||
| 	SCF | ||||
| .error:	LD	A,BIOS.Error.BadNumber | ||||
| 	RET | ||||
| DRV_DETECT:	CP	#84	;!HARDCODE max IDE drives (#80,#81,#82,#83) | ||||
| 		CCF | ||||
| 		JR	C,.error | ||||
| 		; | ||||
| 		LD	HL,IDE.INIT_TBL_IDE0.DriveType | ||||
| 		AND	3 | ||||
| 		JR	Z,.get_param | ||||
| 		LD	HL,IDE.INIT_TBL_IDE1.DriveType | ||||
| 		DEC	A | ||||
| 		JR	Z,.get_param | ||||
| 		LD	HL,IDE.INIT_TBL_IDE2.DriveType | ||||
| 		DEC	A | ||||
| 		JR	Z,.get_param | ||||
| 		LD	HL,IDE.INIT_TBL_IDE3.DriveType | ||||
| .get_param:	IN	A,(SLOT3) | ||||
| 		LD	B,A | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		LD	A,(HL) | ||||
| 		CP	C	; compare Type | ||||
| 		LD	C,SLOT3 | ||||
| 		OUT	(C),B | ||||
| 		RET	Z | ||||
| 		SCF | ||||
| .error:		LD	A,BIOS.Error.BadNumber | ||||
| 		RET | ||||
| @ -35,33 +35,34 @@ RMD_5x_SETMED: | ||||
| ;      IX - Capacity sector in bytes | ||||
| ;	B - Flags: ramblock ID | ||||
| ;[]===========================================================[] | ||||
| RMD_5x_GETMED: | ||||
| .SectorSize     EQU     512                                             ;!HARDCODE | ||||
|         AND     #0F | ||||
|         CALL    GET_RAMD_ST                                             ; ¯®«ã票¥ ¨¤¥â¨ä¨ª â®à  ¡«®ª  | ||||
|         RET     C | ||||
|         SCF | ||||
|         RET     Z | ||||
| 	; | ||||
| 	LD	C,A | ||||
| 	LD	B,#FF | ||||
| .loop:	INC	B | ||||
| 	PUSH	BC | ||||
| 	LD	A,C | ||||
|         CALL    EMM.GetMemPage                                          ; ¯®«ãç¨âì 䨧¨ç¥áª¨© ®¬¥à áâà ¨æë ¨§ ¡«®ª  | ||||
| 	POP	BC | ||||
| 	JR	NC,.loop | ||||
| 	; CF==1, A==0 - ®è¨¡ª , A==#FF - ok | ||||
| 	INC	A | ||||
| 	RET	NZ	; ¥á«¨ ¢ë室¨â, â® á ä« £ ¬¨ CF==1, ZF==1 | ||||
| 
 | ||||
|         LD      E,B | ||||
|         LD      B,C | ||||
| 	;  âãâ ¢ E ª®«¨ç¥á⢮ áâà ¨æ ¢ à ¬¤¨áª¥, B - ID à ¬¤¨áª  | ||||
|         LD      HL,1*256 + #4000/.SectorSize | ||||
|         LD      D,0 | ||||
|         LD      IX,.SectorSize | ||||
|         RET | ||||
| RMD_5x_GETMED:	AND     #0F | ||||
| 		CALL    GET_RAMD_ST                                             ; ¯®«ã票¥ ¨¤¥â¨ä¨ª â®à  ¡«®ª  | ||||
| 		RET     C | ||||
| 		SCF | ||||
| 		RET     Z | ||||
| 		; | ||||
| 		LD	C,A | ||||
| 		LD	B,#FF | ||||
| .loop:		INC	B | ||||
| 		PUSH	BC | ||||
| 		LD	A,C | ||||
| 		CALL    EMM.GetMemPage                                          ; ¯®«ãç¨âì 䨧¨ç¥áª¨© ®¬¥à áâà ¨æë ¨§ ¡«®ª  | ||||
| 		POP	BC | ||||
| 		JR	NC,.loop | ||||
| 		; CF==1, A==0 - ®è¨¡ª , A==#FF - ok | ||||
| 		INC	A | ||||
| 		RET	NZ	; ¥á«¨ ¢ë室¨â, â® á ä« £ ¬¨ CF==1, ZF==1 | ||||
| 		; | ||||
| 		LD      E,B | ||||
| 		LD      B,C | ||||
| 		;  âãâ ¢ E ª®«¨ç¥á⢮ áâà ¨æ ¢ à ¬¤¨áª¥, B - ID à ¬¤¨áª  | ||||
| 		LD      HL,1*256 + #4000/.SectorSize | ||||
| 		LD      D,0 | ||||
| 		LD      IX,.SectorSize | ||||
| 		LD	A,%0000'0001					; removable media | ||||
| 		RET | ||||
| 		; | ||||
| .SectorSize	EQU	512                                             ;!HARDCODE | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////////////////// | ||||
| RMD_5x_LONG_WRITE: | ||||
|  | ||||
| @ -388,7 +388,6 @@ IDESPEC:	IN	A,(SLOT3) | ||||
| 		OR	B | ||||
| 		LD	B,A | ||||
| 		LD	A,(IDENTIFY_DEVICE_BUFFER.Capabilities_high) | ||||
| 		;BIT	1,A | ||||
| 		AND	%0000'0010 | ||||
| 		JR	Z,.NONLBA | ||||
| 		; | ||||
| @ -403,6 +402,12 @@ IDESPEC:	IN	A,(SLOT3) | ||||
| 		LD	HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H | ||||
| 		; [ ] removable media | ||||
| 		LD	A,(IDENTIFY_DEVICE_BUFFER.GeneralConfiguration) | ||||
| 		RLCA | ||||
| 		AND	%0000'0001 | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.RemovableMedia),A | ||||
| 		;		 | ||||
| 		LD	A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A | ||||
| 		IF IDE_Optimization | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tolik
						Tolik