CF bug fixed in ATA/ATAPI R/W procedure
This commit is contained in:
		
							parent
							
								
									ed03bf0ee1
								
							
						
					
					
						commit
						e90f1cafbf
					
				| @ -1 +1 @@ | ||||
| Subproject commit ccb95c96a5684e4f99c19f96b8fcc72f7d0b8212 | ||||
| Subproject commit d38cd7dd53426ef452cd4afd2a76f6a1e5a84848 | ||||
| @ -546,15 +546,15 @@ TAB_5xFNS: | ||||
| 	_mNoDrive_5xTable 3, 0 | ||||
| ;-------------------------------------[] | ||||
| 
 | ||||
| ;-----------------------------------------------------------[ CDROM #C ] | ||||
| ;----------------------------------------------------------[ CDROM #C0 ] | ||||
| ; | ||||
|  DB low			FN_RESERVED_5x | ||||
|  DB low		CD_5x_RESET | ||||
|  DB low		CD_5x_LONG_READ | ||||
|  DB low			FN_ABSENT_5x	; LONG_WRITE | ||||
|  DB low		CD_5x_LONG_WRITE	; LONG_WRITE			; [ ] new  | ||||
|  DB low			FN_ABSENT_5x	; VERIFY | ||||
|  DB low		CD_5x_READ | ||||
|  DB low			FN_ABSENT_5x	; WRITE | ||||
|  DB low		CD_5x_WRITE		; WRITE				; [ ] new  | ||||
|  DB low		CD_5x_DETECT | ||||
|  DB low			FN_ABSENT_5x	; GETMED | ||||
|  DB low			FN_ABSENT_5x	; SETMED | ||||
| @ -585,6 +585,7 @@ TAB_5xFNS: | ||||
|  DB high	FDD_5x_DETECT						;#57 | ||||
|  DB high	FDD_5x_GETMED						;#58 | ||||
|  DB high	FDD_5x_SETMED						;#59 | ||||
|   | ||||
|  DB high	DRV_VERSION						;#5A - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB high		FN_RESERVED_5x					;#5B - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB high		FN_RESERVED_5x					;#5C - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
| @ -610,6 +611,7 @@ TAB_5xFNS: | ||||
|  DB high		FN_ABSENT_5x | ||||
|  DB high	RMD_5x_GETMED | ||||
|  DB high	RMD_5x_SETMED | ||||
| 
 | ||||
|  DB high	DRV_VERSION | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
| @ -634,6 +636,7 @@ TAB_5xFNS: | ||||
|  DB high	HDD_5x_DETECT | ||||
|  DB high	HDD_5x_GETMED | ||||
|  DB high	HDD_5x_SETMED | ||||
| 
 | ||||
|  DB high	DRV_VERSION | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
| @ -651,13 +654,14 @@ TAB_5xFNS: | ||||
|  DB high		FN_RESERVED_5x | ||||
|  DB high	CD_5x_RESET | ||||
|  DB high	CD_5x_LONG_READ | ||||
|  DB high		FN_ABSENT_5x | ||||
|  DB high	CD_5x_LONG_WRITE	; LONG_WRITE			; [ ] new | ||||
|  DB high		FN_ABSENT_5x | ||||
|  DB high	CD_5x_READ | ||||
|  DB high		FN_ABSENT_5x | ||||
|  DB high	CD_5x_WRITE		; WRITE				; [ ] new | ||||
|  DB high	CD_5x_DETECT | ||||
|  DB high		FN_ABSENT_5x | ||||
|  DB high		FN_ABSENT_5x | ||||
| 
 | ||||
|  DB high	DRV_VERSION | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  | ||||
| @ -14,11 +14,11 @@ | ||||
| ; | ||||
| ;---------------------------------------------------------------------------------- | ||||
| MAX_ATAPI_SEC_SIZE	EQU	4096/2 | ||||
| PKTSIZE			EQU	12 | ||||
| PACKET_SIZE		EQU	12					; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE | ||||
| RAM_ATAPI_PK 		EQU	SYS_PAGE.SHARED_BUFFER_32b | ||||
| RAM_ATAPI_RW_CMD		EQU	SYS_PAGE.SHARED_BUFFER_32b+16 | ||||
| RAM_ATAPI_RW_CMD	EQU	SYS_PAGE.SHARED_BUFFER_32b+16 | ||||
| 
 | ||||
| 	ASSERT ((PKTSIZE % 4) = 0), "PKTSIZE must be an even number" | ||||
| 	ASSERT ((PACKET_SIZE % 4) = 0), "PACKET_SIZE must be an even number" | ||||
| 
 | ||||
| ;[]================================================================[#51] | ||||
| CD_5x_RESET:	LD	C,IDE.Device.ATAPI | ||||
| @ -54,7 +54,7 @@ CD_5x_READ: | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#52] | ||||
| ;Function: Long	Read Sectors | ||||
| ;	A - Disk | ||||
| ;	A -os | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| @ -75,7 +75,18 @@ CD_5x_LONG_READ: | ||||
| 		 EX	AF,AF' | ||||
| 		CALL	RW_ATAPI_SECTORs | ||||
| 		JP	HDD_5x_LONG_READ.shared | ||||
| 
 | ||||
| 		; | ||||
| ;[]================================================================[#52] | ||||
| ; INPUT: | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;	A'- Memory Page Number | ||||
| ;	CF'=1 - write, CF'=0 - read | ||||
| ; | ||||
| ; OUTPUT: | ||||
| ;	 | ||||
| RW_ATAPI_SECTORs: | ||||
| 		LD	C,IDE.Device.ATAPI | ||||
| 		CALL	SELECT_DRIVE | ||||
| @ -83,8 +94,8 @@ RW_ATAPI_SECTORs: | ||||
| 		; | ||||
| 		EXX | ||||
| 		 LD	C,SLOT3 | ||||
| 		 IN	A,(C) | ||||
| 		 PUSH	AF | ||||
| 		 IN	B,(C) | ||||
| 		 PUSH	BC | ||||
| 		 LD	A,SYS_PAGE | ||||
| 		 OUT	(C),A | ||||
| 		 LD	HL,ATAPI_CMD_PACKET.READ | ||||
| @ -93,7 +104,7 @@ RW_ATAPI_SECTORs: | ||||
| 		  LD	HL,ATAPI_CMD_PACKET.WRITE | ||||
| .read_cmd:	 EX	AF,AF'	  | ||||
| 		 LD	DE,RAM_ATAPI_RW_CMD | ||||
| 		 LD	BC,PKTSIZE | ||||
| 		 LD	BC,PACKET_SIZE | ||||
| 		 LDIR | ||||
| 		EXX | ||||
| 		; | ||||
| @ -108,8 +119,8 @@ RW_ATAPI_SECTORs: | ||||
| 		LD	A,B | ||||
| 		LD	(RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A	;R01 | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		; EX	AF,AF' | ||||
| 		; OUT	(SLOT3),A | ||||
| 		; | ||||
| 		; POP	AF | ||||
| 		; OUT	(SLOT3),A | ||||
| @ -117,11 +128,50 @@ RW_ATAPI_SECTORs: | ||||
| 		CALL	EXEC_PACKET_COMMAND | ||||
| 		; | ||||
| 		POP	BC | ||||
| 		LD	C,SLOT3 | ||||
| 		;LD	C,SLOT3 | ||||
| 		OUT	(C),B | ||||
| 		RET | ||||
| ;[]===========================================================[#52, #55] | ||||
| 
 | ||||
| ;[]================================================================[#56] | ||||
| ;Function: Write Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;WRITE SECTOR(S) | ||||
| CD_5x_WRITE: | ||||
| 	EX	AF,AF' | ||||
| 	 IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#53] | ||||
| ;Function: Long	Write Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;	A'- Memory Page Number | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;WRITE SECTOR(S) | ||||
| CD_5x_LONG_WRITE: | ||||
| 		PUSH	IY | ||||
| 		SAFE_PORTY_2 | ||||
| 		PUSH	BC | ||||
| 		PUSH	IX | ||||
| 		PUSH	HL | ||||
| 		; | ||||
| 		 EX	AF,AF' | ||||
| 		  SCF		;write | ||||
| 		 EX	AF,AF' | ||||
| 		 CALL	RW_ATAPI_SECTORs | ||||
| 		; | ||||
| 		JP	HDD_5x_LONG_READ.shared | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#57] | ||||
| ;Function: Detect Disk | ||||
| @ -208,7 +258,7 @@ EXEC_PACKET_COMMAND: | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(C),A | ||||
| 		LD	DE,RAM_ATAPI_PK	;!FIXIT ¬®¦¥â   á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®? | ||||
| 		LD	BC,PKTSIZE | ||||
| 		LD	BC,PACKET_SIZE | ||||
| 		LDIR | ||||
| 		; | ||||
| 		POP	BC | ||||
| @ -222,9 +272,9 @@ EXEC_PACKET_COMMAND: | ||||
| 		 LD	BC,IDE.Write.Features | ||||
| 		 OUT	(C),A | ||||
| 		 LD	DE,MAX_ATAPI_SEC_SIZE	;SIZE BLOCK	;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì | ||||
| 		 LD	BC,IDE.Write.CylinderLow | ||||
| 		 LD	BC,IDE.Write.ByteCountLow | ||||
| 		 OUT	(C),E | ||||
| 		 LD	BC,IDE.Write.CylinderHigh | ||||
| 		 LD	BC,IDE.Write.ByteCountHigh | ||||
| 		 OUT	(C),D | ||||
| 		 LD	BC,IDE.Write.Command | ||||
| 		 LD	A,IDE.ATAPI.Packet | ||||
| @ -250,7 +300,7 @@ EXEC_PACKET_COMMAND: | ||||
| 		RRCA  | ||||
| 		AND	#0F | ||||
| 		SCF  | ||||
| 		RET	 | ||||
| 		RET | ||||
| 		; | ||||
| .YEP_DRQ:	LD	C,SLOT3 | ||||
| 		IN	B,(C) | ||||
| @ -259,7 +309,7 @@ EXEC_PACKET_COMMAND: | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	HL,RAM_ATAPI_PK | ||||
| 		LD	BC,IDE.Write.Data | ||||
| 		LD	A,PKTSIZE/4 | ||||
| 		LD	A,PACKET_SIZE/4	; !FIXIT ¡à âì ¨§ IDENTIFY PACKET DEVICE | ||||
| .OUTPKT:	OUTI  | ||||
| 		OUTI | ||||
| 		OUTI | ||||
| @ -268,8 +318,8 @@ EXEC_PACKET_COMMAND: | ||||
| 		JR	NZ,.OUTPKT | ||||
| 		; | ||||
| 		POP	BC | ||||
| 		 | ||||
| 		OUT	(C),B | ||||
| 		; | ||||
| 		LD	B,#80 | ||||
| .pause2: 	DJNZ	.pause2 | ||||
| 		; | ||||
| @ -301,17 +351,17 @@ EXEC_PACKET_COMMAND: | ||||
| 	;====== IF DATA REQUEST =======================================; | ||||
| 	; | ||||
| 		EX	DE,HL | ||||
| 		LD	BC,IDE.Read.CylinderLow | ||||
| 		LD	BC,IDE.Read.ByteCountLow | ||||
| 		IN	E,(C) | ||||
| 		LD	BC,IDE.Read.CylinderHigh | ||||
| 		LD	BC,IDE.Read.ByteCountHigh | ||||
| 		IN	D,(C)	;TRANSFER BLOCK	SIZE | ||||
| 		LD	A,D | ||||
| 		OR	E | ||||
| 		RET	Z	;BLOCK = 0 | ||||
| 		; | ||||
| 		LD	BC,IDE.Read.Counter | ||||
| 		LD	BC,IDE.Read.InterruptReason | ||||
| 		IN	A,(C) | ||||
| 		AND	%0000'0010	;SENSE DATA AVAILABLE bit | ||||
| 		AND	IDE.InterruptReasonByte.IO | ||||
| 		LD	BC,IDE.Read.Data | ||||
| 		JR	Z,.WRITE_DATA | ||||
| 		; | ||||
| @ -325,6 +375,9 @@ EXEC_PACKET_COMMAND: | ||||
| 		JR	NZ,.read_loop | ||||
| 		; | ||||
| .return_rw:	INC	XL		;INC LOADED SECTORS | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.AP_LOOP | ||||
|  | ||||
| @ -1,779 +0,0 @@ | ||||
| 
 | ||||
| ;======================================================== | ||||
| ;R03  !25.07.2001! BUG FIX WITH RETURN ERROR CODE | ||||
| ;R02  !24.07.2001! ADD SECONDARY CHANEL | ||||
| ;R01  !16.08.2000! REMOVED "DI" | ||||
| 
 | ||||
| /* | ||||
| ;Write | ||||
| IDE.Write.Command		EQU	#4153					; #1F7 Command | ||||
| IDE.Write.DeviceHead		EQU	#4152					; #1F6 Drive Control | ||||
| 
 | ||||
| HDW_CLH		EQU	#0155					; #1F5 Cylinder High | ||||
| HDW_CLL		EQU	#0154					; #1F4 Cylinder Low | ||||
| HDW_SEC		EQU	#0153					; #1F3 Sector | ||||
| HDW_CNT		EQU	#0152					; #1F2 Counter | ||||
| HDW_ERR		EQU	#0151					; #1F1 Error | ||||
| HDW_DAT		EQU	#0150					; #1F0 Data | ||||
| 
 | ||||
| ;Read | ||||
| IDE.Read.Status		EQU	#4053					; #1F7 Status (Control) | ||||
| HDR_DRV		EQU	#4052					; #1F6 Drive Control | ||||
| 
 | ||||
| HDR_CLH		EQU	#0055					; #1F5 Cylinder High | ||||
| HDR_CLL		EQU	#0054					; #1F4 Cylinder Low | ||||
| HDR_SEC		EQU	#0053					; #1F3 Sector | ||||
| HDR_CNT		EQU	#0052					; #1F2 Counter | ||||
| HDR_ERR		EQU	#0051					; #1F1 Error | ||||
| HDR_DAT		EQU	#0050					; #1F0 Data | ||||
| 
 | ||||
| ;Bits for IDE.Read.Status | ||||
| ;---[] | ||||
| BSY			EQU	7 | ||||
| RDY			EQU	6 | ||||
| DRQ			EQU	3 | ||||
| ERR			EQU	0 | ||||
| ;---[] | ||||
| 
 | ||||
| HDD			EQU	1 | ||||
| CDROM		EQU	2 | ||||
| 
 | ||||
| 
 | ||||
| ;EQU FOR IY+ | ||||
| IDE.HDD_INIT_TABLE.DRV_Flags		EQU	0 | ||||
| IDE.HDD_INIT_TABLE.SectorsPerTrack		EQU	1 | ||||
| IDE.HDD_INIT_TABLE.HeadsNumber		EQU	2 | ||||
| IDE.HDD_INIT_TABLE.CylinderNumberLow		EQU	3 | ||||
| IDE.HDD_INIT_TABLE.CylinderNumberHigh		EQU	4 | ||||
| IDE.HDD_INIT_TABLE.SectorsPerCylinderLow		EQU	5 | ||||
| IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh		EQU	6 | ||||
| DTYPE_H		EQU	7 | ||||
| 
 | ||||
| IDE0		EQU	#C1C0 | ||||
| IDE1		EQU	#C1C8 | ||||
| IDE2		EQU	#C1D0 | ||||
| IDE3		EQU	#C1D8 | ||||
| */ | ||||
| 
 | ||||
| ;IDE0	 DB	 #FF	 ;DRIVE/HEAD REGISTER	      ;00 | ||||
| ;	 DB	 #FF	 ;SECTORS PER TRACK	      ;01 | ||||
| ;	 DB	 #FF	 ;HEADS			      ;02 | ||||
| ;	 DB	 #FF	 ;CYLINDERS LOW		      ;03 | ||||
| ;	 DB	 #FF	 ;CYLINDERS HIGH	      ;04 | ||||
| ;	 DB	 #FF	 ;SECTOR PER CYLINDER LOW     ;05 | ||||
| ;	 DB	 #FF	 ;SECTOR PER CYLINDER HIGH    ;06 | ||||
| ;	 DB	 #FF	 ;RESERVED		      ;07 | ||||
| 
 | ||||
| ;IDE1	 DB	 #FF	 ;DRIVE/HEAD REGISTER	      ;00 | ||||
| ;	 DB	 #FF	 ;SECTORS PER TRACK	      ;01 | ||||
| ;	 DB	 #FF	 ;HEADS			      ;02 | ||||
| ;	 DB	 #FF	 ;CYLINDERS LOW		      ;03 | ||||
| ;	 DB	 #FF	 ;CYLINDERS HIGH	      ;04 | ||||
| ;	 DB	 #FF	 ;SECTOR PER CYLINDER LOW     ;05 | ||||
| ;	 DB	 #FF	 ;SECTOR PER CYLINDER HIGH    ;06 | ||||
| ;	 DB	 #FF	 ;RESERVED		      ;07 | ||||
| 
 | ||||
| 
 | ||||
| WRITE_OUTI_DUPs	EQU	32 ; bytes | ||||
| 
 | ||||
| ;[]================================================================[#51] | ||||
| ;Function: Reset drive | ||||
| HDD_5x_RESET:                      ; !FIXIT ¥ à¥á¥â¨âáï? | ||||
| ;For non-ATAPI drives, the only method a driver has of resetting a drive | ||||
| ; after a major error is to do a "software reset" on the bus. | ||||
| ; Set bit 2 (SRST, value = 4) in the proper Control Register for the | ||||
| ; bus. This will reset both ATA devices on the bus. Then, you have to | ||||
| ; clear that bit again, yourself. The master drive on the bus is | ||||
| ; automatically selected. | ||||
| 	XOR	A | ||||
| 	RET  | ||||
| ;[]================================================================[#51] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#58] | ||||
| ;Function: Get Current Media Parameters | ||||
| ;	A - Disk | ||||
| ;Return: | ||||
| ;	H - Heads | ||||
| ;	L - Sectors per cylinder | ||||
| ;      DE - Cylinders | ||||
| ;      IX - Capacity sector in bytes | ||||
| ;	B - Flags: MASTER/SLAVE, LBA/CHS | ||||
| HDD_5x_GETMED: | ||||
| 	LD	C,IDE.Device.HDD | ||||
| 	CALL	SELECT_DRIVE | ||||
| 	RET	C | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	L,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) | ||||
| 	LD	H,(IY+IDE.HDD_INIT_TABLE.HeadsNumber) | ||||
| 	LD	E,(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow) | ||||
| 	LD	D,(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh) | ||||
| 	LD	B,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) | ||||
| 	LD	IX,512				;!HARDCODE sector size | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	;EX	AF,AF' | ||||
| 	AND	A | ||||
| 	RET  | ||||
| ;[]================================================================[#58] | ||||
| 
 | ||||
| ;[]================================================================[#59] | ||||
| ;Function: Set Current Media Parameters | ||||
| ;	A - Disk | ||||
| ;	H - Heads | ||||
| ;	L - Sectors | ||||
| ;      DE - Cylinders | ||||
| ;      IX - Capacity sector in bytes | ||||
| ;	B - Flags | ||||
| ;Return: None | ||||
| HDD_5x_SETMED: | ||||
| 	LD	C,IDE.Device.HDD | ||||
| 	CALL	SELECT_DRIVE | ||||
| 	RET	C | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),L | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.HeadsNumber),H | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),E | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),D | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.DRV_Flags),B | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	;EX	AF,AF' | ||||
| 	AND	A | ||||
| 	RET  | ||||
| ;[]================================================================[#59] | ||||
| 
 | ||||
| ;[]================================================================[#55] | ||||
| ;Function: Read	Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;READ SECTOR(S) | ||||
| HDD_5x_READ: | ||||
| 	EX	AF,AF' | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#52] | ||||
| ;Function: Long	Read Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter, 0 = 256 | ||||
| ;	A'- Memory Page Number | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;      A' - Last mem page in RAM Block used for readed data  | ||||
| ;LONG READ SECTOR(S) | ||||
| HDD_5x_LONG_READ: | ||||
| 		PUSH	IY | ||||
| 		SAFE_PORTY_2 | ||||
| 		PUSH	BC | ||||
| 		PUSH	IX | ||||
| 		PUSH	HL | ||||
| 		;IF	OPTIMIZE_RW_PROCEDURE | ||||
| 		 EX	AF,AF' | ||||
| 		  AND	A	;read | ||||
| 		 EX	AF,AF' | ||||
| 		 CALL	RW_ATA_SECTORs | ||||
| 		;ELSE | ||||
| 		 ;CALL	READ_ATA_SECTORs | ||||
| 		;ENDIF | ||||
| 		; | ||||
| 		EX	DE,HL | ||||
| 		JR	C,.error | ||||
| 		LD	A,XH	; current page in mem block for SLOT3 | ||||
| 		EX	AF,AF' | ||||
| 		; | ||||
| 		POP	HL | ||||
| 		POP	IX | ||||
| 		POP	BC | ||||
| 		XOR	A | ||||
| 		CP	B | ||||
| 		LD	C,B | ||||
| 		LD	B,A | ||||
| 		JR	Z,.B_256_sectors | ||||
| 		; | ||||
| 		ADD	IX,BC | ||||
| 		LD	C,B | ||||
| .pre_exit:	ADC	HL,BC | ||||
| .exit: 		RESTORE_PORTY | ||||
| 		POP	IY | ||||
| 		RET  | ||||
| 		; | ||||
| .B_256_sectors:	INC	B | ||||
| 		ADD	IX,BC | ||||
| 		LD	B,C | ||||
| 		JR	.pre_exit | ||||
| 		; | ||||
| .error:		LD	B,A	; A - ®¬¥à ®è¨¡ª¨ | ||||
| 		LD	C,XL | ||||
| 		LD	A,XH	; current page in mem block for SLOT3 | ||||
| 		EX	AF,AF' | ||||
| 		POP	HL | ||||
| 		POP	IX | ||||
| 		PUSH	BC | ||||
| 		LD	B,0 | ||||
| 		ADD	IX,BC | ||||
| 		LD	C,B | ||||
| 		ADC	HL,BC | ||||
| 		POP	BC | ||||
| 		POP	AF | ||||
| 		SUB	C | ||||
| 		LD	C,A | ||||
| 		LD	A,B | ||||
| 		LD	B,C | ||||
| 		SCF		;R03 | ||||
| 		JR	.exit | ||||
| ;	 | ||||
| /* | ||||
| 	IFN OPTIMIZE_RW_PROCEDURE | ||||
| READ_ATA_SECTORs:	 | ||||
| 		LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & READY=1 & ERR=0 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		EX	AF,AF' | ||||
| 		PUSH	AF		; memory page number | ||||
| 		PUSH	DE | ||||
| 		CALL	PRESET | ||||
| 		POP	HL | ||||
| 		POP	AF		; memory page number | ||||
| 		LD	XL,0 | ||||
| 		LD	XH,A | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATA.ReadSectorsWithRetry | ||||
| 		OUT	(C),A | ||||
| 		;SAVE HL! | ||||
| 		EXX  | ||||
| 		 LD	DE,#8908	;WAIT BUSY=0 & DRQ=1 & ERR=0 | ||||
| 		 CALL	WAITPRT.custom | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		;DI			;R01 REMOVED "DI" | ||||
| .big_loop:	IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		LD	A,XH | ||||
| 		OUT	(SLOT3),A | ||||
| 	; | ||||
| 	; READ SECTOR 512 bytes	;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Read.Data | ||||
| .loop_256_1:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_1 | ||||
| .loop_256_2:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_2 | ||||
| 	; ; ; ; ; | ||||
| 	; | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.W44 | ||||
| 		; next page in mem block | ||||
| 		LD	HL,#C000 | ||||
| 		IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	D,high SYS_PAGE.RAM_TABLE | ||||
| 		LD	E,XH | ||||
| 		LD	A,(DE) | ||||
| 		LD	XH,A | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| .W44:		INC	XL		;INC LOADED SECTORS | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & ERR=0 & READY=1 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.CtrlBit.DataRequest,A | ||||
| 		; | ||||
| 		 RET	Z | ||||
| 		 JP	.big_loop | ||||
| 		 ;JP	NZ,.big_loop | ||||
| 		 ;XOR	A | ||||
| 		 ;RET  | ||||
| 		; | ||||
| 	ENDIF | ||||
| */ | ||||
| ;[]===========================================================[#52, #55] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#56] | ||||
| ;Function: Write Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;WRITE SECTOR(S) | ||||
| HDD_5x_WRITE: | ||||
| 	EX	AF,AF' | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#53] | ||||
| ;Function: Long	Write Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;	A'- Memory Page Number | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;WRITE SECTOR(S) | ||||
| HDD_5x_LONG_WRITE: | ||||
| 	PUSH	IY | ||||
| 
 | ||||
| 	SAFE_PORTY_2 | ||||
| 
 | ||||
| 	PUSH	IX | ||||
| 	PUSH	HL | ||||
| 	PUSH	BC | ||||
| 	;IF	OPTIMIZE_RW_PROCEDURE | ||||
| 	 EX	AF,AF' | ||||
| 	  SCF		;write | ||||
| 	 EX	AF,AF' | ||||
| 	 CALL	RW_ATA_SECTORs | ||||
| 	;ELSE | ||||
| 	 ;CALL	WRITE_ATA_SECTORs | ||||
| 	;ENDIF | ||||
| 	; | ||||
| 	EX	DE,HL | ||||
| 	JP	C,HERRWR0 | ||||
| 	LD	A,XH | ||||
| 	EX	AF,AF' | ||||
| 	POP	BC | ||||
| 	POP	HL | ||||
| 	POP	IX | ||||
| 	XOR	A | ||||
| 	CP	B | ||||
| 	LD	C,B | ||||
| 	LD	B,A | ||||
| 	JR	NZ,WNOT256 | ||||
| 	INC	B | ||||
| 	ADD	IX,BC | ||||
| 	LD	B,C | ||||
| 	ADC	HL,BC | ||||
| 	;EX	AF,AF' | ||||
| 	JR	RST8WRR | ||||
| 
 | ||||
| WNOT256	ADD	IX,BC | ||||
| 	LD	C,B | ||||
| 	ADC	HL,BC | ||||
| 	;EX	AF,AF' | ||||
| 	JR	RST8WRR | ||||
| 
 | ||||
| HERRWR0	LD	B,A | ||||
| 	LD	C,XL | ||||
| 	LD	A,XH | ||||
| 	EX	AF,AF' | ||||
| 	POP	HL | ||||
| 	POP	IX | ||||
| 	PUSH	BC | ||||
| 	LD	B,0 | ||||
| 	ADD	IX,BC | ||||
| 	LD	C,B | ||||
| 	ADC	HL,BC | ||||
| 	POP	BC | ||||
| 	POP	AF | ||||
| 	SUB	C | ||||
| 	LD	C,A | ||||
| 	LD	A,B | ||||
| 	LD	B,C | ||||
| 	;R03 | ||||
| 	 SCF		;R03 | ||||
| 	 ;EX	AF,AF'	;R03	;!FIXIT  ¬ã¤à¨« ® çñâ ¢ í⮬ R03 | ||||
| 	; | ||||
| RST8WRR: RESTORE_PORTY | ||||
| 	POP	IY | ||||
| 	;EX	AF,AF' | ||||
| 	RET  | ||||
| 
 | ||||
| 
 | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; | ||||
| /* | ||||
| temp1=0; | ||||
| bp 20e3,{b@20e3==cd},{temp1=1; g}; | ||||
| bp 213b,{b@213b==cd},{temp1=2; g}; | ||||
| bp 21B1,{b@21b1==01 and temp1==2}; | ||||
| bp 2229,{b@2229==01 and temp1==1}; | ||||
| */ | ||||
| ;	IF	OPTIMIZE_RW_PROCEDURE | ||||
| ; CF=1 - write, CF=0 - read | ||||
| RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & READY=1 & ERR=0 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		EX	AF,AF' | ||||
| 		PUSH	AF		; memory page number | ||||
| 		PUSH	DE | ||||
| 		CALL	PRESET | ||||
| 		POP	HL | ||||
| 		POP	AF		; memory page number | ||||
| 		LD	XL,0 | ||||
| 		LD	XH,A | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATA.WriteSectorsWithRetry | ||||
| 		JR	C,.set_command | ||||
| 		; | ||||
| 		LD	A,IDE.ATA.ReadSectorsWithRetry | ||||
| .set_command:	OUT	(C),A | ||||
| 		;SAVE HL! | ||||
| 		EX	AF,AF' | ||||
| 		EXX  | ||||
| 		 LD	DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest | ||||
| 		 CALL	WAITPRT.custom | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		;DI			;R01 REMOVED "DI" | ||||
| .big_loop:	IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		LD	A,XH | ||||
| 		OUT	(SLOT3),A | ||||
| 		JR	C,.write_sector | ||||
| 		; | ||||
| 	; READ SECTOR 512 bytes	;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Read.Data | ||||
| .loop_256_1:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_1 | ||||
| .loop_256_2:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_2 | ||||
| 		EX	AF,AF' | ||||
| 	; ; ; ; ; | ||||
| 		; CF=0 | ||||
| .return_rw:	EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.W44 | ||||
| 		; next page in mem block | ||||
| 		LD	HL,#C000 | ||||
| 		IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		 LD	A,SYS_PAGE | ||||
| 		 OUT	(SLOT3),A | ||||
| 		 LD	D,high SYS_PAGE.RAM_TABLE | ||||
| 		 LD	E,XH | ||||
| 		 LD	A,(DE) | ||||
| 		 LD	XH,A | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| .W44:		INC	XL		;INC LOADED SECTORS | ||||
| 		EXX  | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.CtrlBit.DataRequest,A | ||||
| 		; | ||||
| 		 RET	Z | ||||
| 		 JP	.big_loop | ||||
| 		 ;JP	NZ,.big_loop | ||||
| 		 ;XOR	A | ||||
| 		 ;RET  | ||||
| 		; | ||||
| 	; | ||||
| .write_sector:	; WRITE SECTOR 512 bytes		;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Write.Data | ||||
| 		LD	D,512/WRITE_OUTI_DUPs	;!HARDCODE sector size | ||||
| .loop:		DUP WRITE_OUTI_DUPs | ||||
| 		 OUTI  | ||||
| 		EDUP | ||||
| 		DEC	D | ||||
| 		JR	NZ,.loop | ||||
| 		SCF | ||||
| 		JP	.return_rw | ||||
| 	; ; ; ; ; | ||||
| 
 | ||||
| 	;ENDIF | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; | ||||
| /* | ||||
| 	IFN OPTIMIZE_RW_PROCEDURE | ||||
| WRITE_ATA_SECTORs: | ||||
| 		LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & READY=1 & ERR=0 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		EX	AF,AF' | ||||
| 		PUSH	AF | ||||
| 		PUSH	DE | ||||
| 		CALL	PRESET | ||||
| 		POP	HL | ||||
| 		POP	AF | ||||
| 		LD	XL,0 | ||||
| 		LD	XH,A | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATA.WriteSectorsWithRetry | ||||
| 		OUT	(C),A | ||||
| 		; SAVE HL?! | ||||
| 		EXX  | ||||
| 		 LD	DE,#8908   ;WAIT BUSY=0 & DRQ=1 & ERR=0 | ||||
| 		 CALL	WAITPRT.custom | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		; | ||||
| .big_loop:	IN	A,(SLOT3) | ||||
| 		EX	AF,AF' | ||||
| 		LD	A,XH | ||||
| 		OUT	(SLOT3),A | ||||
| 	; WRITE SECTOR 512 bytes		;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Write.Data | ||||
| 		LD	D,512/WRITE_OUTI_DUPs	;!HARDCODE sector size | ||||
| .loop:		DUP WRITE_OUTI_DUPs | ||||
| 		 OUTI  | ||||
| 		EDUP | ||||
| 		DEC	D | ||||
| 		JR	NZ,.loop | ||||
| 	; ; ; ; ; | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		;EI  | ||||
| 		; | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.W33 | ||||
| 		; next page in mem block | ||||
| 		LD	HL,#C000 | ||||
| 		IN	A,(SLOT3) | ||||
| 		EX	AF,AF' | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	D,high SYS_PAGE.RAM_TABLE | ||||
| 		LD	E,XH | ||||
| 		LD	A,(DE) | ||||
| 		LD	XH,A | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| .W33:		INC	XL	    ;INC SAVED SECTORS | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140   ;WAIT BUSY=0 & ERR=0 & READY=1 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.CtrlBit.DataRequest,A | ||||
| 		; | ||||
| 		 RET	Z | ||||
| 		 JP	.big_loop | ||||
| 		 ;JP	NZ,.big_loop | ||||
| 		 ;XOR	A | ||||
| 		 ;RET  | ||||
| 		; | ||||
| 	ENDIF | ||||
| */ | ||||
| ;[]===========================================================[#53, #56] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#54] | ||||
| ;Function: Verify Sectors | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;	B - Sector counter | ||||
| ;Return: None | ||||
| ;VERIFY	SECTOR(S) | ||||
| HDD_5x_VERIFY: | ||||
| 	PUSH	IY | ||||
| 	 SAFE_PORTY_2 | ||||
| 	PUSH	IX | ||||
| 	PUSH	HL | ||||
| 	CALL	VRS000 | ||||
| 	POP	HL | ||||
| 	POP	IX | ||||
| 	 RESTORE_PORTY | ||||
| 	POP	IY | ||||
| 	RET  | ||||
| ;[]================================================================[#54] | ||||
| ;VERIFY	SECTOR(S) | ||||
| VRS000:		LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		PUSH	DE | ||||
| 		CALL	PRESET | ||||
| 		POP	HL | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATA.ReadVerifySectorsWithRetry | ||||
| 		OUT	(C),A | ||||
| VRS002:		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.CtrlBit.Error,A | ||||
| 		JR	Z,VRS003 | ||||
| 		SCF  | ||||
| 		RET  | ||||
| VRS003:		CALL	WAITPRT | ||||
| 		RET	C | ||||
| 		XOR	A | ||||
| 		RET  | ||||
| 		LD	BC,IDE.Read.Counter | ||||
| ; HL:IX	- LBA SECTOR | ||||
| ;     B	- SECTOR COUNTER | ||||
| PRESET:	LD	A,B | ||||
| 	LD	BC,IDE.Write.Counter | ||||
| 	OUT	(C),A | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) | ||||
| 	LD	BC,IDE.Write.DeviceHead | ||||
| 	OUT	(C),A | ||||
| 	;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à  ¡¨â | ||||
| 	AND	%0100'0000 | ||||
| 	LD	E,XL | ||||
| 	LD	D,XH | ||||
| 	CALL	Z,LBA_CHS | ||||
| 	LD	BC,IDE.Write.Sector | ||||
| 	OUT	(C),E		;LBA 0..7 | ||||
|  IF IDE_Optimization | ||||
| 	INC	C		;	LD BC,IDE.Write.CylinderLow | ||||
| 	OUT	(C),D		;LBA 8..15 | ||||
| 	INC	C		;	LD BC,IDE.Write.CylinderHigh | ||||
| 	OUT	(C),L		;LBA 16..23 | ||||
| 	LD	BC,IDE.Read.Control | ||||
| 	IN	A,(C) | ||||
| 	AND	#F0		;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask | ||||
| 	OR	H		;LBA 24..27 | ||||
| 	INC	B		;	LD BC,IDE.Write.DeviceHead | ||||
|  ELSE | ||||
|  	LD	BC,IDE.Write.CylinderLow | ||||
| 	OUT	(C),D		;LBA 8..15 | ||||
| 	LD	BC,IDE.Write.CylinderHigh | ||||
| 	OUT	(C),L		;LBA 16..23 | ||||
| 	LD	BC,IDE.Read.Control | ||||
| 	IN	A,(C) | ||||
| 	AND	#F0		;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask | ||||
| 	OR	H		;LBA 24..27 | ||||
| 	LD	BC,IDE.Write.DeviceHead | ||||
|  ENDIF | ||||
| 	OUT	(C),A | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	AND	A | ||||
| 	RET  | ||||
| 
 | ||||
| ; HL:DE	- SECTOR OFFSET | ||||
| LBA_CHS: | ||||
| 	LD	C,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow) | ||||
| 	LD	B,(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh) | ||||
| ;	HL:DE /	BC => DE:IX HL-OSTATOK | ||||
| DIV32X:	LD	XH,D | ||||
| 	LD	XL,E | ||||
| 	EX	DE,HL | ||||
| 	LD	HL,0 | ||||
| 	LD	A,#20 | ||||
| DIV011:	ADD	IX,IX | ||||
| 	EX	DE,HL | ||||
| 	ADC	HL,HL | ||||
| 	EX	DE,HL | ||||
| 	ADC	HL,HL | ||||
| 	SBC	HL,BC | ||||
| 	JR	NC,DIV012 | ||||
| 	ADD	HL,BC | ||||
| 	DEC	A | ||||
| 	JR	NZ,DIV011 | ||||
| 	JR	DIV014 | ||||
| DIV012:	INC	IX | ||||
| 	DEC	A | ||||
| 	JR	NZ,DIV011 | ||||
| DIV014:	LD	E,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack) | ||||
| 	LD	D,0 | ||||
| 	XOR	A | ||||
| CHS005:	INC	A | ||||
| 	SBC	HL,DE | ||||
| 	JR	NC,CHS005 | ||||
| 	ADD	HL,DE | ||||
| 	DEC	A | ||||
| 	LD	H,A | ||||
| 	LD	E,L | ||||
| 	INC	E | ||||
| 	LD	D,XL | ||||
| 	LD	A,XH | ||||
| 	LD	L,A | ||||
| 	RET  | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| ; D - MASK | ||||
| ; E - PATTERN | ||||
| WAITPRT:	LD	DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.Ready+IDE.CtrlByte.Error)+IDE.CtrlByte.Ready | ||||
| .custom:	LD	BC,IDE.Read.Status | ||||
| 		LD	HL,#0000		; § ¤¥à¦ª  ;!HARDCODE | ||||
| 		; | ||||
| .loop:		PUSH	HL | ||||
| ;	 | ||||
| .loop2:		IN	A,(C) | ||||
| 		AND	D | ||||
| 		CP	E | ||||
| 		JR	Z,.ok | ||||
| 		DEC	HL | ||||
| 		LD	A,L | ||||
| 		OR	H | ||||
| 		JP	NZ,.loop2 | ||||
| 		; | ||||
| 		POP	HL | ||||
| 		DEC	L | ||||
| 		JR	NZ,.loop | ||||
| 		; | ||||
| .error:		LD	A,BIOS.Error.NotReady | ||||
| 		SCF | ||||
| 		RET  | ||||
| .ok:		POP	HL | ||||
| 		RET | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#57] | ||||
| ;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI) | ||||
| ;Function: Detect Disk | ||||
| ;	   A - Disk | ||||
| ;Return:   CF=0 - A=Drive type  | ||||
| ;	   CF=1 - drive not present, A=#02 | ||||
| HDD_5x_DETECT: | ||||
| 	LD	C,IDE.Device.HDD | ||||
| 	JP	DRV_DETECT | ||||
| ;[]================================================================[#57] | ||||
| @ -195,23 +195,49 @@ HDD_5x_LONG_READ: | ||||
| 		POP	HL | ||||
| 		POP	IX | ||||
| 		POP	BC | ||||
| 		XOR	A | ||||
| 		CP	B | ||||
| 		LD	C,B | ||||
| 		LD	B,A | ||||
| 		JR	Z,.B_256_sectors | ||||
| 	IF 1 | ||||
| ;======================================================================= | ||||
| 		; HL:IX + B. ¥á«¨ B=0, â® B=256 | ||||
| 		 XOR	A | ||||
| 		 CP	B | ||||
| 		 LD	C,B | ||||
| 		 CCF | ||||
| 		 RLA | ||||
| 		 LD	B,A | ||||
| 		 ADD	IX,BC | ||||
| 		 JR	NC,.exit | ||||
| 		 INC	HL | ||||
| 		 CCF | ||||
| 		; | ||||
| 		ADD	IX,BC | ||||
| 		LD	C,B | ||||
| .pre_exit:	ADC	HL,BC | ||||
| .exit: 		RESTORE_PORTY | ||||
| 		POP	IY | ||||
| 		RET  | ||||
| ;======================================================================= | ||||
| 	ENDIF | ||||
| 
 | ||||
| 
 | ||||
| 	IF 0 | ||||
| ;=======================================================================		 | ||||
| 		XOR	A			; 4	 1 | ||||
| 		CP	B			; 4	 1 | ||||
| 		LD	C,B			; 4	 1 | ||||
| 		JR	Z,.B_256_sectors	; 12/7	 2 | ||||
| 		; | ||||
| 		LD	B,A			; 4	 1 | ||||
| 		ADD	IX,BC			; 15	 2 | ||||
| 		LD	C,A			; 4	 1 | ||||
| .pre_exit:	ADC	HL,BC			; 15	 2 | ||||
| .exit: 		RESTORE_PORTY	;45/62 | ||||
| 		POP	IY | ||||
| 		RET  | ||||
| 		; | ||||
| .B_256_sectors:	INC	B			; 4	 1 | ||||
| 		ADD	IX,BC			; 15	 2 | ||||
| 		LD	B,A			; 4	 1 | ||||
| 		JR	.pre_exit		; 12	 2 | ||||
| ;======================================================================= | ||||
| 	ENDIF | ||||
| 		; | ||||
| .B_256_sectors:	INC	B | ||||
| 		ADD	IX,BC | ||||
| 		LD	B,C | ||||
| 		JR	.pre_exit | ||||
| 		; | ||||
| .error:		LD	B,A	; A - ®¬¥à ®è¨¡ª¨ | ||||
| 		LD	C,XL | ||||
| @ -232,90 +258,6 @@ HDD_5x_LONG_READ: | ||||
| 		LD	B,C | ||||
| 		SCF		;R03 | ||||
| 		JR	.exit | ||||
| ;	 | ||||
| /* | ||||
| 	IFN OPTIMIZE_RW_PROCEDURE | ||||
| READ_ATA_SECTORs:	 | ||||
| 		LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & READY=1 & ERR=0 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		EX	AF,AF' | ||||
| 		PUSH	AF		; memory page number | ||||
| 		PUSH	DE | ||||
| 		CALL	PRESET | ||||
| 		POP	HL | ||||
| 		POP	AF		; memory page number | ||||
| 		LD	XL,0 | ||||
| 		LD	XH,A | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATA.ReadSectorsWithRetry | ||||
| 		OUT	(C),A | ||||
| 		;SAVE HL! | ||||
| 		EXX  | ||||
| 		 LD	DE,#8908	;WAIT BUSY=0 & DRQ=1 & ERR=0 | ||||
| 		 CALL	WAITPRT.custom | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		;DI			;R01 REMOVED "DI" | ||||
| .big_loop:	IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		LD	A,XH | ||||
| 		OUT	(SLOT3),A | ||||
| 	; | ||||
| 	; READ SECTOR 512 bytes	;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Read.Data | ||||
| .loop_256_1:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_1 | ||||
| .loop_256_2:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_2 | ||||
| 	; ; ; ; ; | ||||
| 	; | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.W44 | ||||
| 		; next page in mem block | ||||
| 		LD	HL,#C000 | ||||
| 		IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	D,high SYS_PAGE.RAM_TABLE | ||||
| 		LD	E,XH | ||||
| 		LD	A,(DE) | ||||
| 		LD	XH,A | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| .W44:		INC	XL		;INC LOADED SECTORS | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & ERR=0 & READY=1 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.CtrlBit.DataRequest,A | ||||
| 		; | ||||
| 		 RET	Z | ||||
| 		 JP	.big_loop | ||||
| 		 ;JP	NZ,.big_loop | ||||
| 		 ;XOR	A | ||||
| 		 ;RET  | ||||
| 		; | ||||
| 	ENDIF | ||||
| */ | ||||
| ;[]===========================================================[#52, #55] | ||||
| 
 | ||||
| 
 | ||||
| @ -331,7 +273,7 @@ READ_ATA_SECTORs: | ||||
| ;WRITE SECTOR(S) | ||||
| HDD_5x_WRITE: | ||||
| 	EX	AF,AF' | ||||
| 	IN	A,(SLOT3) | ||||
| 	 IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#53] | ||||
| ;Function: Long	Write Sectors | ||||
| @ -345,48 +287,46 @@ HDD_5x_WRITE: | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;WRITE SECTOR(S) | ||||
| HDD_5x_LONG_WRITE: | ||||
| 	PUSH	IY | ||||
| 
 | ||||
| 	SAFE_PORTY_2 | ||||
| 
 | ||||
| 	PUSH	IX | ||||
| 	PUSH	HL | ||||
| 	PUSH	BC | ||||
| 	;IF	OPTIMIZE_RW_PROCEDURE | ||||
| 	 EX	AF,AF' | ||||
| 	  SCF		;write | ||||
| 	 EX	AF,AF' | ||||
| 	 CALL	RW_ATA_SECTORs | ||||
| 	;ELSE | ||||
| 	 ;CALL	WRITE_ATA_SECTORs | ||||
| 	;ENDIF | ||||
| 	; | ||||
| 	EX	DE,HL | ||||
| 	JP	C,HERRWR0 | ||||
| 	LD	A,XH | ||||
| 	EX	AF,AF' | ||||
| 	POP	BC | ||||
| 	POP	HL | ||||
| 	POP	IX | ||||
| 	XOR	A | ||||
| 	CP	B | ||||
| 	LD	C,B | ||||
| 	LD	B,A | ||||
| 	JR	NZ,WNOT256 | ||||
| 	INC	B | ||||
| 	ADD	IX,BC | ||||
| 	LD	B,C | ||||
| 	ADC	HL,BC | ||||
| 	;EX	AF,AF' | ||||
| 	JR	RST8WRR | ||||
| 
 | ||||
| 		PUSH	IY | ||||
| 		SAFE_PORTY_2 | ||||
| 		PUSH	BC | ||||
| 		PUSH	IX | ||||
| 		PUSH	HL | ||||
| 		; | ||||
| 		 EX	AF,AF' | ||||
| 		  SCF		;write | ||||
| 		 EX	AF,AF' | ||||
| 		 CALL	RW_ATA_SECTORs | ||||
| 		; | ||||
| 		JP	HDD_5x_LONG_READ.shared | ||||
| /* | ||||
| 		EX	DE,HL | ||||
| 		JP	C,.error | ||||
| 		LD	A,XH | ||||
| 		EX	AF,AF' | ||||
| 		; | ||||
| 		POP	HL | ||||
| 		POP	IX | ||||
| 		POP	BC | ||||
| 		XOR	A | ||||
| 		CP	B | ||||
| 		LD	C,B | ||||
| 		LD	B,A | ||||
| 		JR	NZ,WNOT256 | ||||
| 		; | ||||
| 		INC	B | ||||
| 		ADD	IX,BC | ||||
| 		LD	B,C | ||||
| 		ADC	HL,BC | ||||
| 		;EX	AF,AF' | ||||
| 		JR	RST8WRR | ||||
| 		; | ||||
| WNOT256	ADD	IX,BC | ||||
| 	LD	C,B | ||||
| 	ADC	HL,BC | ||||
| 	;EX	AF,AF' | ||||
| 	JR	RST8WRR | ||||
| 
 | ||||
| HERRWR0	LD	B,A | ||||
| .error:	LD	B,A | ||||
| 	LD	C,XL | ||||
| 	LD	A,XH | ||||
| 	EX	AF,AF' | ||||
| @ -411,6 +351,7 @@ RST8WRR: RESTORE_PORTY | ||||
| 	POP	IY | ||||
| 	;EX	AF,AF' | ||||
| 	RET  | ||||
| */ | ||||
| 
 | ||||
| 
 | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; | ||||
| @ -423,26 +364,26 @@ RST8WRR: RESTORE_PORTY | ||||
| RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		; | ||||
| 		EXX  | ||||
| 		 ;LD	DE,#C140	;WAIT BUSY=0 & READY=1 & ERR=0 | ||||
| 		 CALL	WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| 		PUSH	AF		; memory page number | ||||
| 		PUSH	DE | ||||
| 		PUSH	DE		; Address | ||||
| 		CALL	PRESET | ||||
| 		POP	HL | ||||
| 		POP	HL		; Address | ||||
| 		POP	AF		; memory page number | ||||
| 		LD	XL,0 | ||||
| 		LD	XH,A | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATA.WriteSectorsWithRetry | ||||
| 		JR	C,.set_command | ||||
| 		JR	C,.set_command			; CF = r/w | ||||
| 		; | ||||
| 		LD	A,IDE.ATA.ReadSectorsWithRetry | ||||
| .set_command:	OUT	(C),A | ||||
| 		;SAVE HL! | ||||
| 		EX	AF,AF' | ||||
| 		EXX  | ||||
| 		 LD	DE,256*(IDE.CtrlByte.Busy+IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest | ||||
| @ -466,7 +407,8 @@ RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| 		JP	NZ,.loop_256_2 | ||||
| 		EX	AF,AF' | ||||
| 		AND	A | ||||
| 		;EX	AF,AF' | ||||
| 	; ; ; ; ; | ||||
| 		; CF=0 | ||||
| .return_rw:	EX	AF,AF'		;<-----------< / | ||||
| @ -652,32 +594,33 @@ VRS003:		CALL	WAITPRT | ||||
| PRESET:	LD	A,B | ||||
| 	LD	BC,IDE.Write.Counter | ||||
| 	OUT	(C),A | ||||
| 	; | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) | ||||
| 	LD	BC,IDE.Write.DeviceHead | ||||
| 	OUT	(C),A | ||||
| 	;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à  ¡¨â | ||||
| 	AND	%0100'0000 | ||||
| 	LD	E,XL | ||||
| 	LD	D,XH | ||||
| 	CALL	Z,LBA_CHS | ||||
| 	LD	BC,IDE.Write.Sector | ||||
| 	OUT	(C),E		;LBA 0..7 | ||||
| 	; | ||||
| 	INC	C		;	LD BC,IDE.Write.CylinderLow | ||||
| 	OUT	(C),D		;LBA 8..15 | ||||
| 	INC	C		;	LD BC,IDE.Write.CylinderHigh | ||||
| 	OUT	(C),L		;LBA 16..23 | ||||
| 	LD	BC,IDE.Read.Control | ||||
| 	IN	A,(C) | ||||
| 	AND	#F0		;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask | ||||
| 	OR	H		;LBA 24..27 | ||||
| 	INC	B		;	LD BC,IDE.Write.DeviceHead | ||||
| 	; | ||||
| 	OUT	(C),A | ||||
| 	 LD	A,SYS_PAGE | ||||
| 	 OUT	(SLOT3),A | ||||
| 	 LD	A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags) | ||||
| 	 LD	BC,IDE.Write.DeviceHead | ||||
| 	 OUT	(C),A | ||||
| 	 ;¡¨â CHS/LBA ;!FIXIT ᤥ« âì ¬¥âª ¬¨ ®¬¥à  ¡¨â | ||||
| 	 AND	%0100'0000 | ||||
| 	 LD	E,XL | ||||
| 	 LD	D,XH | ||||
| 	 CALL	Z,LBA_CHS | ||||
| 	 LD	BC,IDE.Write.Sector | ||||
| 	 OUT	(C),E		;LBA 0..7 | ||||
| 	 ; | ||||
| 	 INC	C		;	LD BC,IDE.Write.CylinderLow | ||||
| 	 OUT	(C),D		;LBA 8..15 | ||||
| 	 INC	C		;	LD BC,IDE.Write.CylinderHigh | ||||
| 	 OUT	(C),L		;LBA 16..23 | ||||
| 	 LD	BC,IDE.Read.Control | ||||
| 	 IN	A,(C) | ||||
| 	 AND	#F0		;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask | ||||
| 	 OR	H		;LBA 24..27 | ||||
| 	 INC	B		;	LD BC,IDE.Write.DeviceHead | ||||
| 	 ; | ||||
| 	 OUT	(C),A | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	AND	A | ||||
|  | ||||
| @ -1,5 +1,4 @@ | ||||
| ;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI) | ||||
| 
 | ||||
| ;======================================================================= | ||||
| ; ‚室: A - ®¬¥à ãáâனá⢠ | ||||
| SELECT_DRIVE: | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tolik
						Tolik