not working
This commit is contained in:
		
							parent
							
								
									2927028434
								
							
						
					
					
						commit
						394025462d
					
				| @ -7,10 +7,16 @@ | ||||
| ;	02-08-2001 DNS	Initial this module | ||||
| ;--------------------------------------------------------------- | ||||
| ;======================================================== | ||||
| MAX_ATAPI_SEC_SIZE	EQU	4096 | ||||
| 
 | ||||
| ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO ;!TODO  | ||||
| ; | ||||
| ;	[ ] ãáâ ®¢ª  ¯ à ¬¥âà  ¬ ªá¨¬ «ì®£® à §¬¥à  ¤«ï ç⥨ï ç¥à¥§ DRV_SET_PAR | ||||
| ; | ||||
| ;---------------------------------------------------------------------------------- | ||||
| MAX_ATAPI_SEC_SIZE	EQU	4096/2 | ||||
| PKTSIZE			EQU	12 | ||||
| RAM_ATAPI_PK 		EQU	SYS_PAGE.SHARED_BUFFER_32b | ||||
| RAM_ATAPI_READ		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" | ||||
| 
 | ||||
| @ -44,7 +50,7 @@ CD_5x_RESET:	LD	C,IDE.Device.ATAPI | ||||
| ;READ SECTOR(S) | ||||
| CD_5x_READ: | ||||
| 	EX	AF,AF' | ||||
| 	IN	A,(SLOT3) | ||||
| 	 IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#52] | ||||
| ;Function: Long	Read Sectors | ||||
| @ -64,11 +70,11 @@ CD_5x_LONG_READ: | ||||
| 		PUSH	IX | ||||
| 		PUSH	HL | ||||
| 		; | ||||
| 		 EX	AF,AF' | ||||
| 		  AND	A	;read | ||||
| 		 EX	AF,AF' | ||||
| 		CALL	RW_ATAPI_SECTORs | ||||
| 		; | ||||
| 
 | ||||
| 		; | ||||
| 		RET | ||||
| 		JP	HDD_5x_LONG_READ.shared | ||||
| 
 | ||||
| RW_ATAPI_SECTORs: | ||||
| 		LD	C,IDE.Device.ATAPI | ||||
| @ -82,7 +88,11 @@ RW_ATAPI_SECTORs: | ||||
| 		 LD	A,SYS_PAGE | ||||
| 		 OUT	(C),A | ||||
| 		 LD	HL,ATAPI_CMD_PACKET.READ | ||||
| 		 LD	DE,RAM_ATAPI_READ | ||||
| 		 EX	AF,AF' | ||||
| 		  JR	NC,.read_cmd | ||||
| 		  LD	HL,ATAPI_CMD_PACKET.WRITE | ||||
| .read_cmd:	 EX	AF,AF'	  | ||||
| 		 LD	DE,RAM_ATAPI_RW_CMD | ||||
| 		 LD	BC,PKTSIZE | ||||
| 		 LDIR | ||||
| 		EXX | ||||
| @ -90,25 +100,26 @@ RW_ATAPI_SECTORs: | ||||
| 		LD	A,H | ||||
| 		LD	H,L | ||||
| 		LD	L,A | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL | ||||
| 		LD	(RAM_ATAPI_RW_CMD + ATAPI_PACKET.SECTOR+0),HL | ||||
| 		LD	A,XH | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A	;R01 | ||||
| 		LD	(RAM_ATAPI_RW_CMD + ATAPI_PACKET.SECTOR+2),A	;R01 | ||||
| 		LD	A,XL | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A	;R01 | ||||
| 		LD	(RAM_ATAPI_RW_CMD + ATAPI_PACKET.SECTOR+3),A	;R01 | ||||
| 		LD	A,B | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A	;R01 | ||||
| 		LD	(RAM_ATAPI_RW_CMD + ATAPI_PACKET.COUNTER+1),A	;R01 | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		; POP	AF | ||||
| 		; OUT	(SLOT3),A | ||||
| 		LD	HL,RAM_ATAPI_READ | ||||
| 		LD	HL,RAM_ATAPI_RW_CMD | ||||
| 		CALL	EXEC_PACKET_COMMAND | ||||
| 		; | ||||
| 		POP	BC | ||||
| 		LD	C,SLOT3 | ||||
| 		OUT	(C),B | ||||
| 		RET | ||||
| ;[]===========================================================[#52, #55] | ||||
| 
 | ||||
| 
 | ||||
| @ -157,7 +168,9 @@ TRAY_FN:	LD	HL,ATAPI_CMD_PACKET.CLOSE | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| ; INPUT:  HL - AP paket	(12bytes) | ||||
| ; INPUT:  HL - AP packet (12bytes) | ||||
| ;	  DE - address for/with data if needed | ||||
| ; | ||||
| ; RETURN: CF - ERROR | ||||
| ;	!TODO CD ERRORS to INCLUDES | ||||
| ;	 #01 - RECOVERED ERROR | ||||
| @ -216,10 +229,10 @@ EXEC_PACKET_COMMAND: | ||||
| 		 LD	BC,IDE.Write.Command | ||||
| 		 LD	A,IDE.ATAPI.Packet | ||||
| 		 OUT	(C),A | ||||
| 		 CALL	CD_WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 ;CALL	CD_WAITPRT | ||||
| 		;EXX  | ||||
| 		;RET	C | ||||
| 		;EXX  | ||||
| 		 LD	DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest | ||||
| 		 CALL	CD_WAITPRT.Custom | ||||
| 		EXX  | ||||
| @ -229,6 +242,16 @@ EXEC_PACKET_COMMAND: | ||||
| 		LD	A,#80			; ERROR TIME OUT ;!HARDCODE | ||||
| 		RET | ||||
| 		; | ||||
| .CDERROR:	LD	BC,IDE.Read.Error	;ERROR | ||||
| 		IN	A,(C) | ||||
| 		RRCA  | ||||
| 		RRCA  | ||||
| 		RRCA  | ||||
| 		RRCA  | ||||
| 		AND	#0F | ||||
| 		SCF  | ||||
| 		RET	 | ||||
| 		; | ||||
| .YEP_DRQ:	LD	C,SLOT3 | ||||
| 		IN	B,(C) | ||||
| 		PUSH	BC | ||||
| @ -250,29 +273,33 @@ EXEC_PACKET_COMMAND: | ||||
| 		LD	B,#80 | ||||
| .pause2: 	DJNZ	.pause2 | ||||
| 		; | ||||
| .AP_LOOP:	EXX  | ||||
| 		EX	AF,AF' | ||||
| 		 LD	XH,A	; áâà ¨æ  ¤«ï R/W_LONG | ||||
| 		 LD	XL,0 | ||||
| 		EX	AF,AF' | ||||
| 		; | ||||
| 		EX	DE,HL | ||||
| .AP_LOOP:	EX	DE,HL | ||||
| 		IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		; | ||||
| 		EXX  | ||||
| 		 CALL	CD_WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.CtrlBit.Error,A | ||||
| 		;JR	NZ,.CDERROR | ||||
| 		RET	Z | ||||
| 		JR	NZ,.CDERROR | ||||
| 		; | ||||
| .CDERROR:	LD	BC,IDE.Read.Error	;ERROR | ||||
| 		IN	A,(C) | ||||
| 		RRCA  | ||||
| 		RRCA  | ||||
| 		RRCA  | ||||
| 		RRCA  | ||||
| 		AND	#0F | ||||
| 		SCF  | ||||
| 		RET | ||||
| 		; | ||||
| 	;!FIXIT | ||||
| 		AND	IDE.CtrlByte.DataRequest | ||||
| 		RET	Z	;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors | ||||
| 		RET	Z ;NO DATA REQUEST. A = 0: BIOS.Error.NoErrors | ||||
| 		; | ||||
| 		LD	A,XH | ||||
| 		OUT	(SLOT3),A | ||||
| 	; | ||||
| 	;====== IF DATA REQUEST =======================================; | ||||
| 	; | ||||
| 		EX	DE,HL | ||||
| 		LD	BC,IDE.Read.CylinderLow | ||||
| 		IN	E,(C) | ||||
| @ -284,27 +311,23 @@ EXEC_PACKET_COMMAND: | ||||
| 		; | ||||
| 		LD	BC,IDE.Read.Counter | ||||
| 		IN	A,(C) | ||||
| 		AND	#02 | ||||
| 	;WRITE	;!FIXIT | ||||
| 		AND	%0000'0010	;SENSE DATA AVAILABLE bit | ||||
| 		LD	BC,IDE.Read.Data | ||||
| 		JR	NZ,.FROM_CD | ||||
| 		JR	Z,.WRITE_DATA | ||||
| 		; | ||||
| .WR_T_CD:	OUTI  | ||||
| 		OUTI  | ||||
| 	;READ | ||||
| .read_loop:	INI  | ||||
| 		INI  | ||||
| 		DEC	DE | ||||
| 		DEC	DE | ||||
| 		LD	A,D | ||||
| 		OR	E | ||||
| 		JR	NZ,.WR_T_CD | ||||
| 		EX	DE,HL | ||||
| 		JR	.AP_LOOP | ||||
| 		JR	NZ,.read_loop | ||||
| 		; | ||||
| 	;READ | ||||
| .FROM_CD:	;LD	BC,IDE.Read.Data | ||||
| 		; 能恥丞<E681A5> <20> 砲鄍祚垠平言 𨸹鄍<F0A8B8B9> ~銗<EFBD9E> | ||||
| .return_rw:	INC	XL		;INC LOADED SECTORS | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.read_loop | ||||
| 		JR	NZ,.AP_LOOP | ||||
| 		; next page in mem block | ||||
| 		LD	HL,#C000 | ||||
| 		IN	A,(SLOT3) | ||||
| @ -317,18 +340,18 @@ EXEC_PACKET_COMMAND: | ||||
| 		 LD	XH,A | ||||
| 		EX	AF,AF'		;<-----------< / | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| .read_loop:	INI  | ||||
| 		INI  | ||||
| 		JR	.AP_LOOP | ||||
| 	;	; | ||||
| 	;WRITE | ||||
| .WRITE_DATA:	INC	B ; LD	BC,IDE.Write.Data | ||||
| .write_loop:	OUTI  | ||||
| 		OUTI  | ||||
| 		DEC	DE | ||||
| 		DEC	DE | ||||
| 		LD	A,D | ||||
| 		OR	E | ||||
| 		JR	NZ,.read_loop | ||||
| 		; | ||||
| 		EX	DE,HL | ||||
| 		JR	.AP_LOOP | ||||
| 		; | ||||
| 		JR	NZ,.write_loop | ||||
| 		JR	.return_rw | ||||
| 
 | ||||
| ;.NULL:		LD	BC,IDE.Read.Data | ||||
| ;.RD_N_CD:	IN	A,(C) | ||||
| @ -366,7 +389,7 @@ CD_WAITPRT:	LD	DE,256*(IDE.CtrlByte.DataRequest) + 0 | ||||
| 		JR	NZ,.LOOP | ||||
| 		DJNZ	.LOOP | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| 		;EX	AF,AF' | ||||
| .error:		; !FIXIT error number | ||||
| 		SCF  | ||||
| 		RET  | ||||
|  | ||||
							
								
								
									
										779
									
								
								src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										779
									
								
								src/bios/exp/EXTENDED/IDE/ATA_DRV 2.ASM
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,779 @@ | ||||
| 
 | ||||
| ;======================================================== | ||||
| ;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] | ||||
| @ -161,7 +161,7 @@ HDD_5x_SETMED: | ||||
| ;READ SECTOR(S) | ||||
| HDD_5x_READ: | ||||
| 	EX	AF,AF' | ||||
| 	IN	A,(SLOT3) | ||||
| 	 IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| ;[]================================================================[#52] | ||||
| ;Function: Long	Read Sectors | ||||
| @ -181,16 +181,13 @@ HDD_5x_LONG_READ: | ||||
| 		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 | ||||
| .shared:	EX	DE,HL | ||||
| 		JR	C,.error | ||||
| 		LD	A,XH	; current page in mem block for SLOT3 | ||||
| 		EX	AF,AF' | ||||
| @ -417,15 +414,12 @@ RST8WRR: RESTORE_PORTY | ||||
| 
 | ||||
| 
 | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; | ||||
| /* | ||||
| 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 | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;	A'- Memory Page Number | ||||
| ;	CF'=1 - write, CF'=0 - read | ||||
| RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| @ -460,10 +454,10 @@ RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| 		LD	A,XH | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	BC,IDE.Read.Data | ||||
| 		JR	C,.write_sector | ||||
| 		; | ||||
| 	; READ SECTOR 512 bytes	;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Read.Data | ||||
| .loop_256_1:	DUP 16 | ||||
| 		 INI  | ||||
| 		EDUP | ||||
| @ -482,6 +476,7 @@ RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		OR	L | ||||
| 		JR	NZ,.W44 | ||||
| 		; next page in mem block | ||||
| 		; ᤥ« âì ¥á«¨ ¥ RW_LONG, ⮠宫®áâë¥ ç⥨¥/§ ¯¨áì ¨ ¢ë室 á ®è¨¡ª®© | ||||
| 		LD	HL,#C000 | ||||
| 		IN	A,(SLOT3) | ||||
| 		EX	AF,AF'		;>-----------> \ | ||||
| @ -511,7 +506,7 @@ RW_ATA_SECTORs:	LD	C,IDE.Device.HDD | ||||
| 		; | ||||
| 	; | ||||
| .write_sector:	; WRITE SECTOR 512 bytes		;!HARDCODE sector size | ||||
| 		LD	BC,IDE.Write.Data | ||||
| 		INC	B ; LD	BC,IDE.Write.Data | ||||
| 		LD	D,512/WRITE_OUTI_DUPs	;!HARDCODE sector size | ||||
| .loop:		DUP WRITE_OUTI_DUPs | ||||
| 		 OUTI  | ||||
| @ -649,8 +644,9 @@ VRS002:		LD	BC,IDE.Read.Status | ||||
| VRS003:		CALL	WAITPRT | ||||
| 		RET	C | ||||
| 		XOR	A | ||||
| 		RET  | ||||
| 		LD	BC,IDE.Read.Counter | ||||
| 		RET | ||||
| 
 | ||||
| 
 | ||||
| ; HL:IX	- LBA SECTOR | ||||
| ;     B	- SECTOR COUNTER | ||||
| PRESET:	LD	A,B | ||||
| @ -670,7 +666,7 @@ PRESET:	LD	A,B | ||||
| 	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 | ||||
| @ -680,17 +676,7 @@ PRESET:	LD	A,B | ||||
| 	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 | ||||
|  | ||||
| @ -2,7 +2,6 @@ | ||||
| 
 | ||||
| ;======================================================================= | ||||
| ; ‚室: A - ®¬¥à ãáâனá⢠ | ||||
| ;	C - 暢ッ | ||||
| SELECT_DRIVE: | ||||
| 	AND	#0F | ||||
| 	LD	IY,IDE.INIT_TBL_IDE0 | ||||
|  | ||||
							
								
								
									
										1144
									
								
								src/bios/exp/FUNC_SCREEN 2.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1144
									
								
								src/bios/exp/FUNC_SCREEN 2.ASM
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										13
									
								
								src/bios/exp/ZX_MEM 2.TXT
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/bios/exp/ZX_MEM 2.TXT
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| Žâ¤¥«ìë¥ à ¬¡«®ª¨ ¤«ï: | ||||
| 	vROM | ||||
| 	vRAM | ||||
| Žâ¤¥«ìë¥ ¯à®æ¥¤ãàë ¢ë¤¥«¥¨ï áâà ¨æ ¤«ï: | ||||
| 	#1FFD - ®¡à ¡ â뢠âì ¯¥à¢ë¬ ¥á«¨ 㦥. <20>¥ ¯®¤å®¤ïâ #A0, #D0..#DF | ||||
| 	#7FFD - 128/512, ¥ ¢ë¤¥«ïâì ¯ ¬ïâì ¤«ï #1FFD ¢ ०¨¬¥ pent 512 | ||||
| 	vROM | ||||
| ‘âà ¨æã 0 ¨á¯®«ì§®¢ âì ª ª à ìè¥ ¤«ï ¬ ¯¯  ¢ #7FFD ¨ ¤«ï #1FFD=1 | ||||
| <EFBFBD>®¤ªàãâ¨âì ¢ ¬¥î ᯥªâà㬠 ¯¥à¥ª«îç «ªã ०¨¬®¢ ¨ ®á¢®¡®¦¤¥¨¥ ¯ ¬ï⨠¯®¤ ®¢ãî ¬®¤¥«ì ¯ ¬ï⨠| ||||
| <EFBFBD>ਠ®á¢®¡®¦¤¥¨¨ ¯ ¬ï⨠vROM ¬ ¯¨âì   í⨠¯®àâë ®¡à â® Spec_Page | ||||
| <EFBFBD>஢¥à¨âì   å à¤ª®¤ ¡¨®á ¨ zxroms, ç⮡ ¥ ¢â몠«¨áì áâ ¤ àâë¥ (§ à¥§¥à¢¨à®¢ ë¥) áâà ¨æë | ||||
| ; | ||||
| ‘¤¥« âì ¯¥à¥ª«îç «ªã ¢ ¡¨®á¥ áâ àë©/®¢ë© ०¨¬ à ¡®âë ¯ ¬ïâ¨? | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tolik
						Tolik