промежуточное
This commit is contained in:
		
							parent
							
								
									73f9070083
								
							
						
					
					
						commit
						2927028434
					
				| @ -1 +1 @@ | ||||
| Subproject commit 710aa4b5dd4b651bcb01ef5e86150b99dfe739ee | ||||
| Subproject commit ccb95c96a5684e4f99c19f96b8fcc72f7d0b8212 | ||||
| @ -18,7 +18,7 @@ | ||||
|         DB  high FN_RESERVED_5x				;#5B - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|         DB  high FN_RESERVED_5x				;#5C - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|         DB  high FN_RESERVED_5x				;#5D - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|         DB  high FN_RESERVED_5x				;#5E - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|         DB  high FN_ABSENT_5x				;#5E | ||||
|         DB  high DRV_LIST				;#5F - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|      EDUP | ||||
|   ELSE | ||||
| @ -487,7 +487,7 @@ TAB_5xFNS: | ||||
|  DB low			FN_RESERVED_5x					;#5B - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB low			FN_RESERVED_5x					;#5C - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB low			FN_RESERVED_5x					;#5D - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB low			FN_RESERVED_5x					;#5E - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB low			FN_ABSENT_5x					;#5E - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB low		DRV_LIST						;#5F - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
| ; | ||||
| ;---------------------------------------------------------------------[] | ||||
| @ -513,7 +513,7 @@ TAB_5xFNS: | ||||
|  DB low		    FN_RESERVED_5x  | ||||
|  DB low		    FN_RESERVED_5x  | ||||
|  DB low		    FN_RESERVED_5x  | ||||
|  DB low		    FN_RESERVED_5x  | ||||
|  DB low		    FN_ABSENT_5x  | ||||
|  DB low		DRV_LIST | ||||
| ;---------------------------------------------------------------------[] | ||||
| 
 | ||||
| @ -538,7 +538,7 @@ TAB_5xFNS: | ||||
|  DB low			FN_RESERVED_5x  | ||||
|  DB low			FN_RESERVED_5x  | ||||
|  DB low			FN_RESERVED_5x  | ||||
|  DB low			FN_RESERVED_5x  | ||||
|  DB low			FN_ABSENT_5x | ||||
|  DB low		DRV_LIST | ||||
| ;---------------------------------------------------------------------[] | ||||
| 
 | ||||
| @ -551,13 +551,13 @@ TAB_5xFNS: | ||||
|  DB low			FN_RESERVED_5x | ||||
|  DB low		CD_5x_RESET | ||||
|  DB low		CD_5x_LONG_READ | ||||
|  DB low			FN_ABSENT_5x | ||||
|  DB low			FN_ABSENT_5x | ||||
|  DB low			FN_ABSENT_5x	; LONG_WRITE | ||||
|  DB low			FN_ABSENT_5x	; VERIFY | ||||
|  DB low		CD_5x_READ | ||||
|  DB low			FN_ABSENT_5x | ||||
|  DB low			FN_ABSENT_5x	; WRITE | ||||
|  DB low		CD_5x_DETECT | ||||
|  DB low			FN_ABSENT_5x | ||||
|  DB low			FN_ABSENT_5x | ||||
|  DB low			FN_ABSENT_5x	; GETMED | ||||
|  DB low			FN_ABSENT_5x	; SETMED | ||||
| 
 | ||||
|  DB low		DRV_VERSION | ||||
|  DB low			FN_RESERVED_5x  | ||||
| @ -589,7 +589,7 @@ TAB_5xFNS: | ||||
|  DB high		FN_RESERVED_5x					;#5B - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB high		FN_RESERVED_5x					;#5C - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB high		FN_RESERVED_5x					;#5D - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
|  DB high		FN_RESERVED_5x					;#5E - Extended functions | ||||
|  DB high		FN_ABSENT_5x					;#5E - Extended functions | ||||
|  DB high	DRV_LIST						;#5F - „ã¡«ì. <20>  íâã äãªæ¨î ¯à룠¥â ¨§ ®á®¢®£® ®¡à ¡®â稪  | ||||
| ; | ||||
| ;---------------------------------------------------------------------[] | ||||
| @ -614,7 +614,7 @@ TAB_5xFNS: | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_ABSENT_5x  | ||||
|  DB high	DRV_LIST | ||||
| ;---------------------------------------------------------------------[] | ||||
| 
 | ||||
| @ -638,7 +638,7 @@ TAB_5xFNS: | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_RESERVED_5x  | ||||
|  DB high		FN_ABSENT_5x | ||||
|  DB high	DRV_LIST | ||||
| ;---------------------------------------------------------------------[] | ||||
| 
 | ||||
| @ -684,34 +684,50 @@ EXP_FNS_RST18: | ||||
| 	EX	(SP),HL | ||||
| 	RET | ||||
| 
 | ||||
| FN_5x_Parser_1: | ||||
| 	; HDD_5x_RESET | ||||
| 	; HDD_5x_LONG_READ | ||||
| 	; HDD_5x_LONG_WRITE | ||||
| 	; HDD_5x_VERIFY | ||||
| 	; HDD_5x_READ | ||||
| 	; HDD_5x_WRITE | ||||
| 	; HDD_5x_DETECT | ||||
| 	; HDD_5x_GETMED | ||||
| 	; HDD_5x_SETMED | ||||
| 	; DRV_VERSION | ||||
| 	; 	FN_RESERVED_5x  | ||||
| 	; 	FN_RESERVED_5x  | ||||
| 	; 	FN_RESERVED_5x  | ||||
| 	; 	FN_RESERVED_5x  | ||||
| 	; DRV_LIST | ||||
| 
 | ||||
| FN_5x_Parser_1:			 	; HDD_5x_RESET | ||||
| 	LD	C,#01 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_2: | ||||
| FN_5x_Parser_2:				; HDD_5x_LONG_READ | ||||
| 	LD	C,#02 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_3: | ||||
| FN_5x_Parser_3:				; HDD_5x_LONG_WRITE | ||||
| 	LD	C,#03 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_4: | ||||
| FN_5x_Parser_4:				; HDD_5x_VERIFY | ||||
| 	LD	C,#04 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_6: | ||||
| FN_5x_Parser_6:				; HDD_5x_WRITE | ||||
| 	LD	C,#06 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_7: | ||||
| FN_5x_Parser_7:				; HDD_5x_DETECT | ||||
| 	LD	C,#07 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_8: | ||||
| FN_5x_Parser_8:				; HDD_5x_GETMED | ||||
| 	LD	C,#08 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_9: | ||||
| FN_5x_Parser_9:				; HDD_5x_SETMED | ||||
| 	LD	C,#09 | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_E: | ||||
| FN_5x_Parser_E:				; DRV_EXTENDED | ||||
| 	LD	C,#0E | ||||
| 	JP	FN_5x_Parser  | ||||
| FN_5x_Parser_5: | ||||
| FN_5x_Parser_5:				; HDD_5x_READ | ||||
| 	LD	C,5 | ||||
| FN_5x_Parser: | ||||
|         PUSH    HL | ||||
|  | ||||
							
								
								
									
										425
									
								
								src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										425
									
								
								src/bios/exp/EXTENDED/IDE/ATAPI_DRV.ASM
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,425 @@ | ||||
| ;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI) | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ | ||||
| ;CD ROM DRIVE DRIVER | ||||
| ;--------------------------------------------------------------- | ||||
| ;Rev	Date	   Name	Description | ||||
| ;--------------------------------------------------------------- | ||||
| ;	02-08-2001 DNS	Initial this module | ||||
| ;--------------------------------------------------------------- | ||||
| ;======================================================== | ||||
| MAX_ATAPI_SEC_SIZE	EQU	4096 | ||||
| PKTSIZE			EQU	12 | ||||
| RAM_ATAPI_PK 		EQU	SYS_PAGE.SHARED_BUFFER_32b | ||||
| RAM_ATAPI_READ		EQU	SYS_PAGE.SHARED_BUFFER_32b+16 | ||||
| 
 | ||||
| 	ASSERT ((PKTSIZE % 4) = 0), "PKTSIZE must be an even number" | ||||
| 
 | ||||
| ;[]================================================================[#51] | ||||
| CD_5x_RESET:	LD	C,IDE.Device.ATAPI | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		LD	B,50 | ||||
| .loop:		PUSH	BC | ||||
| 		CALL	CD_TEST | ||||
| 		POP	BC | ||||
| 		RET	NC | ||||
| 		EI  | ||||
| 		HALT  | ||||
| 		DJNZ  .loop | ||||
| 		RET  | ||||
| ;[]================================================================[#51] | ||||
| 
 | ||||
| 
 | ||||
| ;!TODO | ||||
| ; atapi.pdf áâà. 24 § ¯¨áì/ç⥨¥ ¬®£ãâ ¡ëâì ¬ ªá¨¬ «ì묨 ¡«®ª ¬¨ ¢ ¥áª®«ìª® § å®¤®¢ | ||||
| ;[]================================================================[#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) | ||||
| CD_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 | ||||
| ;	A'- Memory Page Number | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;LONG READ SECTOR(S) | ||||
| CD_5x_LONG_READ: | ||||
| 		PUSH	IY | ||||
| 		SAFE_PORTY_2 | ||||
| 		PUSH	BC | ||||
| 		PUSH	IX | ||||
| 		PUSH	HL | ||||
| 		; | ||||
| 		CALL	RW_ATAPI_SECTORs | ||||
| 		; | ||||
| 
 | ||||
| 		; | ||||
| 		RET | ||||
| 
 | ||||
| RW_ATAPI_SECTORs: | ||||
| 		LD	C,IDE.Device.ATAPI | ||||
| 		CALL	SELECT_DRIVE | ||||
| 		RET	C | ||||
| 		; | ||||
| 		EXX | ||||
| 		 LD	C,SLOT3 | ||||
| 		 IN	A,(C) | ||||
| 		 PUSH	AF | ||||
| 		 LD	A,SYS_PAGE | ||||
| 		 OUT	(C),A | ||||
| 		 LD	HL,ATAPI_CMD_PACKET.READ | ||||
| 		 LD	DE,RAM_ATAPI_READ | ||||
| 		 LD	BC,PKTSIZE | ||||
| 		 LDIR | ||||
| 		EXX | ||||
| 		; | ||||
| 		LD	A,H | ||||
| 		LD	H,L | ||||
| 		LD	L,A | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL | ||||
| 		LD	A,XH | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A	;R01 | ||||
| 		LD	A,XL | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A	;R01 | ||||
| 		LD	A,B | ||||
| 		LD	(RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A	;R01 | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		; | ||||
| 		; POP	AF | ||||
| 		; OUT	(SLOT3),A | ||||
| 		LD	HL,RAM_ATAPI_READ | ||||
| 		CALL	EXEC_PACKET_COMMAND | ||||
| 		; | ||||
| 		POP	BC | ||||
| 		LD	C,SLOT3 | ||||
| 		OUT	(C),B | ||||
| ;[]===========================================================[#52, #55] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#57] | ||||
| ;Function: Detect Disk | ||||
| ;	   A - Disk | ||||
| ;Return:   CF=0 - A=Drive type  | ||||
| ;	   CF=1 - drive not present, A=#02 | ||||
| CD_5x_DETECT: | ||||
| 	LD	C,IDE.Device.ATAPI | ||||
| 	AND	%1011'1111 | ||||
| 	JP	DRV_DETECT | ||||
| ;[]================================================================[#57] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#5E] | ||||
| ;Function: Extended | ||||
| ;	   A - Disk | ||||
| ;	   B - SubFunction | ||||
| ;Return:    | ||||
| ;	    | ||||
| CD_5x_Extended: | ||||
| 	LD	C,IDE.Device.ATAPI | ||||
| 	CALL	SELECT_DRIVE | ||||
| 	RET	C | ||||
| 	; | ||||
| 	LD	A,B | ||||
| 	CP	2 | ||||
| 	JR	C,TRAY_FN | ||||
| 	; ... | ||||
| 	; ... | ||||
| 	;LD	A,#AA | ||||
| 	LD	A,BIOS.Error.InvalidSubFunction | ||||
| 	SCF | ||||
| 	RET | ||||
| ;[]================================================================[#5E] | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| TRAY_FN:	LD	HL,ATAPI_CMD_PACKET.CLOSE | ||||
| 		LD	DE,0	; ¬ àª¥à ⮣®, çâ® ¥ 㦮 ç¨â âì á ãáâனá⢠ ¢ އ“ | ||||
| 		DEC	A | ||||
| 		JR	Z,EXEC_PACKET_COMMAND | ||||
| 		LD	HL,ATAPI_CMD_PACKET.OPEN | ||||
| 		JR	EXEC_PACKET_COMMAND | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| ; INPUT:  HL - AP paket	(12bytes) | ||||
| ; RETURN: CF - ERROR | ||||
| ;	!TODO CD ERRORS to INCLUDES | ||||
| ;	 #01 - RECOVERED ERROR | ||||
| ;	 #02 - NOT READY | ||||
| ;	 #03 - MEDIUM ERROR | ||||
| ;	 #04 - HARDWARE	ERROR | ||||
| ;	 #05 - ILLEGAL REQUEST | ||||
| ;	 #06 - UNIT ATTETION | ||||
| ;	 #07 - DATA PROTECT | ||||
| ;	 #0B - ABORTED COMMAND | ||||
| ;	 #80 - TIME OUT | ||||
| EXEC_PACKET_COMMAND: | ||||
| 		EXX  | ||||
| 		 CALL	CD_WAITPRT | ||||
| 		EXX  | ||||
| 		JR	NC,.READY | ||||
| 		; | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		LD	A,IDE.ATAPI.Reset | ||||
| 		OUT	(C),A | ||||
| 		; | ||||
| 		LD	B,#80 | ||||
| .pause:		DJNZ	.pause | ||||
| 		; | ||||
| 		EXX  | ||||
| 		 CALL	CD_WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		; | ||||
| .READY:		LD	C,SLOT3 | ||||
| 		IN	B,(C) | ||||
| 		PUSH	DE | ||||
| 		PUSH	BC | ||||
| 		; | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(C),A | ||||
| 		LD	DE,RAM_ATAPI_PK	;!FIXIT ¬®¦¥â   á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®? | ||||
| 		LD	BC,PKTSIZE | ||||
| 		LDIR | ||||
| 		; | ||||
| 		POP	BC | ||||
| 		POP	DE | ||||
| 		OUT	(C),B | ||||
| 		; | ||||
| 		XOR	A | ||||
| 		EXX | ||||
| 		 ;OUT	(C),A | ||||
| 		 ;XOR	A | ||||
| 		 LD	BC,IDE.Write.Features | ||||
| 		 OUT	(C),A | ||||
| 		 LD	DE,MAX_ATAPI_SEC_SIZE	;SIZE BLOCK	;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì | ||||
| 		 LD	BC,IDE.Write.CylinderLow | ||||
| 		 OUT	(C),E | ||||
| 		 LD	BC,IDE.Write.CylinderHigh | ||||
| 		 OUT	(C),D | ||||
| 		 LD	BC,IDE.Write.Command | ||||
| 		 LD	A,IDE.ATAPI.Packet | ||||
| 		 OUT	(C),A | ||||
| 		 CALL	CD_WAITPRT | ||||
| 		EXX  | ||||
| 		RET	C | ||||
| 		EXX  | ||||
| 		 LD	DE,256*(IDE.CtrlByte.DataRequest+IDE.CtrlByte.Error)+IDE.CtrlByte.DataRequest | ||||
| 		 CALL	CD_WAITPRT.Custom | ||||
| 		EXX  | ||||
| 		BIT	IDE.CtrlBit.Error,A | ||||
| 		JR	NZ,.CDERROR | ||||
| 		JR	NC,.YEP_DRQ | ||||
| 		LD	A,#80			; ERROR TIME OUT ;!HARDCODE | ||||
| 		RET | ||||
| 		; | ||||
| .YEP_DRQ:	LD	C,SLOT3 | ||||
| 		IN	B,(C) | ||||
| 		PUSH	BC | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	HL,RAM_ATAPI_PK | ||||
| 		LD	BC,IDE.Write.Data | ||||
| 		LD	A,PKTSIZE/4 | ||||
| .OUTPKT:	OUTI  | ||||
| 		OUTI | ||||
| 		OUTI | ||||
| 		OUTI | ||||
| 		DEC	A | ||||
| 		JR	NZ,.OUTPKT | ||||
| 		; | ||||
| 		POP	BC | ||||
| 		 | ||||
| 		OUT	(C),B | ||||
| 		LD	B,#80 | ||||
| .pause2: 	DJNZ	.pause2 | ||||
| 		; | ||||
| .AP_LOOP:	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 | ||||
| 		; | ||||
| .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 | ||||
| 		EX	DE,HL | ||||
| 		LD	BC,IDE.Read.CylinderLow | ||||
| 		IN	E,(C) | ||||
| 		LD	BC,IDE.Read.CylinderHigh | ||||
| 		IN	D,(C)	;TRANSFER BLOCK	SIZE | ||||
| 		LD	A,D | ||||
| 		OR	E | ||||
| 		RET	Z	;BLOCK = 0 | ||||
| 		; | ||||
| 		LD	BC,IDE.Read.Counter | ||||
| 		IN	A,(C) | ||||
| 		AND	#02 | ||||
| 	;WRITE	;!FIXIT | ||||
| 		LD	BC,IDE.Read.Data | ||||
| 		JR	NZ,.FROM_CD | ||||
| 		; | ||||
| .WR_T_CD:	OUTI  | ||||
| 		OUTI  | ||||
| 		DEC	DE | ||||
| 		DEC	DE | ||||
| 		LD	A,D | ||||
| 		OR	E | ||||
| 		JR	NZ,.WR_T_CD | ||||
| 		EX	DE,HL | ||||
| 		JR	.AP_LOOP | ||||
| 		; | ||||
| 	;READ | ||||
| .FROM_CD:	;LD	BC,IDE.Read.Data | ||||
| 		; ¯à®¢¥àª    ¯¥à¥¯®«¥¨¥  ¤à¥á  ¡ãä¥à  | ||||
| 		LD	A,H | ||||
| 		OR	L | ||||
| 		JR	NZ,.read_loop | ||||
| 		; 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 | ||||
| 		; | ||||
| .read_loop:	INI  | ||||
| 		INI  | ||||
| 		DEC	DE | ||||
| 		DEC	DE | ||||
| 		LD	A,D | ||||
| 		OR	E | ||||
| 		JR	NZ,.read_loop | ||||
| 		; | ||||
| 		EX	DE,HL | ||||
| 		JR	.AP_LOOP | ||||
| 		; | ||||
| 
 | ||||
| ;.NULL:		LD	BC,IDE.Read.Data | ||||
| ;.RD_N_CD:	IN	A,(C) | ||||
| ; 		DEC	B | ||||
| ; 		IN	A,(C) | ||||
| ; 		DEC	B | ||||
| ; 		DEC	DE | ||||
| ; 		DEC	DE | ||||
| ; 		LD	A,D | ||||
| ; 		OR	E | ||||
| ; 		JR	NZ,.RD_N_CD | ||||
| ; 		; DE = 0 | ||||
| ; 		JR	.AP_LOOP | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| ; D - MASK, E - PATTERN | ||||
| CD_WAITPRT:	LD	DE,256*(IDE.CtrlByte.DataRequest) + 0 | ||||
| .Custom:	LD	B,100 | ||||
| 		LD	HL,#0000 | ||||
| .LOOP:		LD	A,high IDE.Read.Status | ||||
| 		IN	A,(low IDE.Read.Status) | ||||
| 		CP	#FF | ||||
| 		JR	Z,.error | ||||
| 		AND	D | ||||
| 		CP	E | ||||
| 		; | ||||
| 		RET	Z | ||||
| 		; | ||||
| .NEXT_TRY:	DEC	L | ||||
| 		JR	NZ,.LOOP | ||||
| 		DEC	H | ||||
| 		JR	NZ,.LOOP | ||||
| 		DJNZ	.LOOP | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| .error:		; !FIXIT error number | ||||
| 		SCF  | ||||
| 		RET  | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| CD_TEST:	LD	HL,ATAPI_CMD_PACKET.NOP | ||||
| 		LD	DE,0	; ¬ àª¥à ⮣®, çâ® ¥ 㦮 ç¨â âì á ãáâனá⢠ ¢ އ“ | ||||
| 		JP	EXEC_PACKET_COMMAND | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////// | ||||
| ATAPI_CMD_PACKET: | ||||
| .NOP:	DUP	12 | ||||
| 	 DB	#00 | ||||
| 	EDUP | ||||
| ; | ||||
| .OPEN:	DB	#1B | ||||
| 	DB	#00,#00,#00 | ||||
| 	DB	#02 | ||||
| 	DB	#00,#00,#00,#00,#00,#00,#00 | ||||
| ; | ||||
| .CLOSE:	DB	#1B | ||||
| 	DB	#00,#00,#00 | ||||
| 	DB	#03 | ||||
| 	DB	#00,#00,#00,#00,#00,#00,#00 | ||||
| ; | ||||
| .READ:	DB	#28,#00 | ||||
| 	DB	#00,#00,#00,#00	; sector dword | ||||
| 	DB	#00 | ||||
| 	DB	#00,#01,#00,#00	; counter dword | ||||
| 	DB	#00 | ||||
| ; | ||||
| .WRITE:	DB	#2E,#00 | ||||
| 	DB	#00,#00,#00,#00	; sector dword | ||||
| 	DB	#00 | ||||
| 	DB	#00,#01,#00,#00	; counter dword | ||||
| 	DB	#00 | ||||
| ; | ||||
| ATAPI_PACKET: | ||||
| .SECTOR		EQU	2 | ||||
| .COUNTER	EQU	7 | ||||
| //////////////////////////////////////////////////////////////////////// | ||||
| ; | ||||
| ; E - Second * 10 | ||||
| ; PAUSE	LD	HL,#0000 | ||||
| ; PAUSE1	DEC	L | ||||
| ; 	JR	NZ,PAUSE1 | ||||
| ; 	DEC	H | ||||
| ; 	JR	NZ,PAUSE1 | ||||
| ; 	DEC	E | ||||
| ; 	JR	NZ,PAUSE1 | ||||
| ; 	RET  | ||||
| ; | ||||
| @ -168,145 +168,157 @@ HDD_5x_READ: | ||||
| ;	A - Disk | ||||
| ;   HL:IX - Sector | ||||
| ;      DE - Address | ||||
| ;	B - Sector counter | ||||
| ;	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 | ||||
| 	CALL	RDS000 | ||||
| 	EX	DE,HL | ||||
| 	JR	C,HERRRD0 | ||||
| 	LD	A,XH | ||||
| 	EX	AF,AF' | ||||
| 	POP	HL | ||||
| 	POP	IX | ||||
| 	POP	BC | ||||
| 	XOR	A | ||||
| 	CP	B | ||||
| 	LD	C,B | ||||
| 	LD	B,A | ||||
| 	JR	NZ,RNOT256 | ||||
| 	INC	B | ||||
| 	ADD	IX,BC | ||||
| 	LD	B,C | ||||
| 	ADC	HL,BC | ||||
| 	;EX	AF,AF'	;!TEST 21/11/23 | ||||
| 	JR	RST8RDR | ||||
| 
 | ||||
| RNOT256	ADD	IX,BC | ||||
| 	LD	C,B | ||||
| 	ADC	HL,BC | ||||
| 	;EX	AF,AF'	;!TEST 21/11/23 | ||||
| 	JR	RST8RDR | ||||
| 
 | ||||
| HERRRD0	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 | ||||
| 	 ;EX	AF,AF'	;!TEST 21/11/23 | ||||
| 		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 | ||||
| 	; | ||||
| RST8RDR: RESTORE_PORTY | ||||
| 	POP	IY | ||||
| 	;EX	AF,AF'	;!TEST 21/11/23 | ||||
| 	RET  | ||||
| 
 | ||||
| 	;READ SECTOR(S) | ||||
| RDS000:	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.ReadSectorsWithRetry | ||||
| 	OUT	(C),A | ||||
| ;????? | ||||
| ;SAVE HL! | ||||
| RDS002:	EXX  | ||||
| 	 LD	DE,#8908   ;WAIT BUSY=0 & DRQ=1 & ERR=0 | ||||
| 	 CALL	WAITPRT | ||||
| 	EXX  | ||||
| 	RET	C | ||||
| 	;NOP		    ;R01 REMOVED "DI" | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,XH | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	BC,IDE.Read.Data | ||||
| 
 | ||||
| RDS003:	DUP 16 | ||||
| 	 INI  | ||||
| 	EDUP | ||||
| 	JP	NZ,RDS003 | ||||
| RDS004:	DUP 16 | ||||
| 	 INI  | ||||
| 	EDUP | ||||
| 	JP	NZ,RDS004 | ||||
| 
 | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| ; | ||||
| 	LD	A,H | ||||
| 	OR	L | ||||
| 	JR	NZ,.W44 | ||||
| 	LD	HL,#C000 | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	D,#C2 | ||||
| 	LD	E,XH | ||||
| 	LD	A,(DE) | ||||
| 	LD	XH,A | ||||
| 	EX	AF,AF' | ||||
| 	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 | ||||
| 	; ; ; ; ; | ||||
| 	; | ||||
| .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.ControlBit.DataRequest,A | ||||
| 	JP	NZ,RDS002 | ||||
| 	XOR	A | ||||
| 	RET  | ||||
| 		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] | ||||
| 
 | ||||
| 
 | ||||
| @ -343,7 +355,15 @@ HDD_5x_LONG_WRITE: | ||||
| 	PUSH	IX | ||||
| 	PUSH	HL | ||||
| 	PUSH	BC | ||||
| 	CALL	WRS000 | ||||
| 	;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 | ||||
| @ -395,97 +415,195 @@ RST8WRR: RESTORE_PORTY | ||||
| 	;EX	AF,AF' | ||||
| 	RET  | ||||
| 
 | ||||
| ;WRITE SECTOR(S) | ||||
| WRS000: | ||||
| 	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 | ||||
| 
 | ||||
| 	;[x] CMOS Write Protect Disabled | ||||
|         IF	HDDwriteProtect | ||||
| 	 PUSH	BC | ||||
| 	 LD	D,CMOS_CELL.Options | ||||
|          CALL    CMOS_RD | ||||
| 	 POP	BC | ||||
| 	 AND	1 | ||||
| 	 JR	Z,NO_WriteProtect | ||||
| 	 POP	HL | ||||
| 	 POP	AF | ||||
| 	 EX	AF,AF' | ||||
| 	 LD	XL,0 | ||||
| 	 LD	A,BIOS.Error.WriteProtect | ||||
| 	 SCF  | ||||
| 	 RET  | ||||
|         ENDIF | ||||
| NO_WriteProtect: | ||||
| 	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! | ||||
| WRS002:	EXX  | ||||
| 	 LD	DE,#8908   ;WAIT BUSY=0 & DRQ=1 & ERR=0 | ||||
| 	 CALL	WAITPRT | ||||
| 	EXX  | ||||
| 	RET	C | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; | ||||
| /* | ||||
| 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 | ||||
| 	; ; ; ; ; | ||||
| 
 | ||||
| 	;DI  | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,XH | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	BC,IDE.Write.Data | ||||
| 	;LD	D,#20 | ||||
| 	LD	D,512/WRITE_OUTI_DUPs | ||||
| WRS003: | ||||
|  DUP WRITE_OUTI_DUPs | ||||
| 	OUTI  | ||||
|  EDUP | ||||
| 	DEC	D | ||||
| 	JR	NZ,WRS003 | ||||
| 
 | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	//EI  | ||||
| ; | ||||
| 	LD	A,H | ||||
| 	OR	L | ||||
| 	JR	NZ,.W33 | ||||
| 	LD	HL,#C000 | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	D,#C2 | ||||
| 	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.ControlBit.DataRequest,A | ||||
| 	JP	NZ,WRS002 | ||||
| 	XOR	A | ||||
| 	RET  | ||||
| 	;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] | ||||
| 
 | ||||
| 
 | ||||
| @ -513,7 +631,6 @@ VRS000:		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 | ||||
| @ -525,16 +642,15 @@ VRS000:		LD	C,IDE.Device.HDD | ||||
| 		OUT	(C),A | ||||
| VRS002:		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		BIT	IDE.ControlBit.Error,A | ||||
| 		BIT	IDE.CtrlBit.Error,A | ||||
| 		JR	Z,VRS003 | ||||
| 		SCF  | ||||
| 		RET  | ||||
| VRS003:		LD	DE,#C140   ;WAIT BUSY=0 & ERR=0 & READY=1 | ||||
| 		CALL	WAITPRT | ||||
| VRS003:		CALL	WAITPRT | ||||
| 		RET	C | ||||
| 		XOR	A | ||||
| 		RET  | ||||
| 
 | ||||
| 		LD	BC,IDE.Read.Counter | ||||
| ; HL:IX	- LBA SECTOR | ||||
| ;     B	- SECTOR COUNTER | ||||
| PRESET:	LD	A,B | ||||
| @ -624,30 +740,30 @@ CHS005:	INC	A | ||||
| ;----------------------------------------------------------------------; | ||||
| ; D - MASK | ||||
| ; E - PATTERN | ||||
| WAITPRT: | ||||
| 	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 | ||||
| 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 | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| @ -1,403 +0,0 @@ | ||||
| ;[x] 18/12/2023. ¤®¡ ¢«¥¨¥/¤®¯¨«¨¢ ¨¥ API CD-ROM (ATAPI) | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ | ||||
| ;CD ROM DRIVE DRIVER | ||||
| ;--------------------------------------------------------------- | ||||
| ;Rev	Date	   Name	Description | ||||
| ;--------------------------------------------------------------- | ||||
| ;	02-08-2001 DNS	Initial this module | ||||
| ;--------------------------------------------------------------- | ||||
| ;======================================================== | ||||
| SIZESEC		EQU	#0800 | ||||
| PKTSIZE		EQU	12 | ||||
| RAM_ATAPI_PK 	EQU	SYS_PAGE.SHARED_BUFFER_32b | ||||
| RAM_ATAPI_READ	EQU	SYS_PAGE.SHARED_BUFFER_32b+16 | ||||
| 
 | ||||
| 	ASSERT ((PKTSIZE % 2) = 0), "PKTSIZE must be an even number" | ||||
| 
 | ||||
| ;[]================================================================[#51] | ||||
| CD_5x_RESET: | ||||
| 	LD	C,IDE.Device.CDROM | ||||
| 	CALL	SELECT_DRIVE | ||||
| 	RET	C | ||||
| 	LD	B,50 | ||||
| .loop: | ||||
| 	PUSH	BC | ||||
| 	CALL	CD_TEST | ||||
| 	POP	BC | ||||
| 	RET	NC | ||||
| 	EI  | ||||
| 	HALT  | ||||
| 	DJNZ  .loop | ||||
| 	RET  | ||||
| ;[]================================================================[#51] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#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) | ||||
| CD_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 | ||||
| ;	A'- Memory Page Number | ||||
| ;Return: | ||||
| ;   HL:IX - Sector + Sector counter | ||||
| ;      DE - Address + (Sector counter *	Size sector) | ||||
| ;LONG READ SECTOR(S) | ||||
| CD_5x_LONG_READ: | ||||
| 	LD	C,IDE.Device.CDROM | ||||
| 	CALL	SELECT_DRIVE | ||||
| 	RET	C | ||||
| 	; | ||||
| 	EXX | ||||
| 	LD	C,SLOT3 | ||||
| 	IN	A,(C) | ||||
| 	PUSH	AF | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(C),A | ||||
| 	LD	HL,ATAPI_CMD_PACKET.READ | ||||
| 	LD	DE,RAM_ATAPI_READ | ||||
| 	LD	BC,PKTSIZE | ||||
| 	LDIR | ||||
| 	EXX | ||||
| 
 | ||||
| 	LD	A,H | ||||
| 	LD	H,L | ||||
| 	LD	L,A | ||||
| 	LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+0),HL | ||||
| 	LD	A,XH | ||||
| 	LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+2),A	;R01 | ||||
| 	LD	A,XL | ||||
| 	LD	(RAM_ATAPI_READ + ATAPI_PACKET.SECTOR+3),A	;R01 | ||||
| 	LD	A,B | ||||
| 	LD	(RAM_ATAPI_READ + ATAPI_PACKET.COUNTER+1),A	;R01 | ||||
| 	; | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	; | ||||
| 	; POP	AF | ||||
| 	; OUT	(SLOT3),A | ||||
| 	LD	HL,RAM_ATAPI_READ | ||||
| 	CALL	AP_COM | ||||
| 	; | ||||
| 	POP	BC | ||||
| 	LD	C,SLOT3 | ||||
| 	OUT	(C),B | ||||
| 	; | ||||
| 	RET  | ||||
| ;[]===========================================================[#52, #55] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#57] | ||||
| ;Function: Detect Disk | ||||
| ;	   A - Disk | ||||
| ;Return:   CF=0 - A=Drive type  | ||||
| ;	   CF=1 - drive not present, A=#02 | ||||
| CD_5x_DETECT: | ||||
| 	LD	C,IDE.Device.CDROM | ||||
| 	AND	%1011'1111 | ||||
| 	JP	DRV_DETECT | ||||
| ;[]================================================================[#57] | ||||
| 
 | ||||
| 
 | ||||
| ;[]================================================================[#5E] | ||||
| ;Function: Extended | ||||
| ;	   A - Disk | ||||
| ;	   B - SubFunction | ||||
| ;Return:    | ||||
| ;	    | ||||
| CD_5x_Extended: | ||||
| 	LD	C,IDE.Device.CDROM | ||||
| 	CALL	SELECT_DRIVE | ||||
| 	RET	C | ||||
| 	; | ||||
| 	LD	A,B | ||||
| 	CP	2 | ||||
| 	JR	C,TRAY_FN | ||||
| 	; ... | ||||
| 	; ... | ||||
| 	;LD	A,#AA | ||||
| 	LD	A,BIOS.Error.InvalidSubFunction | ||||
| 	SCF | ||||
| 	RET | ||||
| ;[]================================================================[#5E] | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| TRAY_FN: | ||||
| 	LD	DE,0	;!FIXIT 㦮 «¨? | ||||
| 	LD	HL,ATAPI_CMD_PACKET.CLOSE | ||||
| 	DEC	A | ||||
| 	JR	Z,AP_COM | ||||
| 	LD	HL,ATAPI_CMD_PACKET.OPEN | ||||
| 	JR	AP_COM | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| ; INPUT:  HL - AP paket	(12bytes) | ||||
| ; RETURN: CF - ERROR | ||||
| ;	!TODO CD ERRORS to INCLUDES | ||||
| ;	 #01 - RECOVERED ERROR | ||||
| ;	 #02 - NOT READY | ||||
| ;	 #03 - MEDIUM ERROR | ||||
| ;	 #04 - HARDWARE	ERROR | ||||
| ;	 #05 - ILLEGAL REQUEST | ||||
| ;	 #06 - UNIT ATTETION | ||||
| ;	 #07 - DATA PROTECT | ||||
| ;	 #0B - ABORTED COMMAND | ||||
| ;	 #80 - TIME OUT | ||||
| AP_COM:	EXX  | ||||
| 	 ;LD	DE,#8000 | ||||
| 	 CALL	CD_WAITPRT | ||||
| 	EXX  | ||||
| 	JR	NC,.READY | ||||
| 	LD	BC,IDE.Write.Command | ||||
| 	LD	A,IDE.ATAPI.Reset | ||||
| 	OUT	(C),A | ||||
| 
 | ||||
| 	LD	B,#80 | ||||
| .pause:	DJNZ	.pause | ||||
| 
 | ||||
| 	EXX  | ||||
| 	 ;LD	DE,#8000 | ||||
| 	 CALL	CD_WAITPRT | ||||
| 	EXX  | ||||
| 	RET	C | ||||
| .READY: | ||||
| 	LD	C,SLOT3 | ||||
| 	IN	B,(C) | ||||
| 
 | ||||
| 	PUSH	DE | ||||
| 	PUSH	BC | ||||
| 
 | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(C),A | ||||
| 	LD	DE,RAM_ATAPI_PK	;!FIXIT ¬®¦¥â   á⥪¥ ¢ë¤¥«ïâì ¬¥áâ®? | ||||
| 	LD	BC,PKTSIZE | ||||
| 	LDIR | ||||
| 
 | ||||
| 	POP	BC | ||||
| 	POP	DE | ||||
| 	OUT	(C),B | ||||
| 
 | ||||
| 	XOR	A | ||||
| 	EXX | ||||
| 	 ;OUT	(C),A | ||||
| 	 ;XOR	A | ||||
| 	 LD	BC,IDE.Write.Features | ||||
| 	 OUT	(C),A | ||||
| 	 LD	DE,SIZESEC	;SIZE BLOCK	;!HARDCODE ¤®áâ ¢ âì ¨§ ¯¥à¥¬¥®© ª ª®©-¨¡ã¤ì | ||||
| 	 LD	BC,IDE.Write.CylinderLow | ||||
| 	 OUT	(C),E | ||||
| 	 LD	BC,IDE.Write.CylinderHigh | ||||
| 	 OUT	(C),D | ||||
| 	 LD	BC,IDE.Write.Command | ||||
| 	 LD	A,IDE.ATAPI.Packet | ||||
| 	 OUT	(C),A | ||||
| 	 ;LD	DE,#8000 | ||||
| 	 CALL	CD_WAITPRT | ||||
| 	EXX  | ||||
| 	RET	C | ||||
| 	EXX  | ||||
| 	 LD	DE,#0908 | ||||
| 	 CALL	CD_WAITPRT.Custom | ||||
| 	EXX  | ||||
| 	BIT	IDE.ControlBit.Error,A | ||||
| 	JR	NZ,.CDERROR | ||||
| 	JR	NC,.YEP_DRQ | ||||
| 	LD	A,#80			; ERROR TIME OUT ;!HARDCODE | ||||
| 	RET | ||||
| 	; | ||||
| .YEP_DRQ: | ||||
| 	LD	C,SLOT3 | ||||
| 	IN	B,(C) | ||||
| 	PUSH	BC | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	HL,RAM_ATAPI_PK | ||||
| 	LD	BC,IDE.Write.Data | ||||
| 	LD	A,PKTSIZE/2 | ||||
| .OUTPKT: | ||||
|         OUTI  | ||||
| 	OUTI  | ||||
| 	DEC	A | ||||
| 	JR	NZ,.OUTPKT | ||||
| 	; | ||||
| 	POP	BC | ||||
| 	OUT	(C),B | ||||
| 	; | ||||
| 	LD	B,#80 | ||||
| .pause2: DJNZ	.pause2 | ||||
| 	; | ||||
| .AP_LOOP: | ||||
| 	EXX  | ||||
| 	 ;LD	DE,#8000 | ||||
| 	 CALL	CD_WAITPRT | ||||
| 	EXX  | ||||
| 	RET	C | ||||
| 	LD	BC,IDE.Read.Status | ||||
| 	IN	A,(C) | ||||
| 	BIT	IDE.ControlBit.Error,A | ||||
| 	JR	Z,.NO_ERR | ||||
| .CDERROR: | ||||
| 	LD	BC,IDE.Read.Error	;ERROR | ||||
| 	IN	A,(C) | ||||
| 	RRCA  | ||||
| 	RRCA  | ||||
| 	RRCA  | ||||
| 	RRCA  | ||||
| 	AND	#0F | ||||
| 	SCF  | ||||
| 	RET  | ||||
| .NO_ERR: | ||||
| 	;BIT	IDE.ControlBit.DataRequest,A | ||||
| 	AND	IDE.ControlByte.DataRequest | ||||
| 	LD	A,BIOS.Error.NoErrors | ||||
| 	RET	Z	;NO DATA REQUEST	A = 0: BIOS.Error.NoErrors | ||||
| 	EX	DE,HL | ||||
| 	LD	BC,IDE.Read.CylinderLow | ||||
| 	IN	E,(C) | ||||
| 	LD	BC,IDE.Read.CylinderHigh | ||||
| 	IN	D,(C)	;TRANSFER BLOCK	SIZE | ||||
| 	LD	A,D | ||||
| 	OR	E | ||||
| 	RET	Z	;BLOCK = 0 | ||||
| 	LD	BC,IDE.Read.Counter | ||||
| 	IN	A,(C) | ||||
| 	AND	#02 | ||||
| 	JR	NZ,.FROM_CD | ||||
| ;.TO_CD: | ||||
| 	LD	BC,IDE.Read.Data | ||||
| .WR_T_CD: | ||||
| 	OUTI  | ||||
| 	OUTI  | ||||
| 	DEC	DE | ||||
| 	DEC	DE | ||||
| 	LD	A,D | ||||
| 	OR	E | ||||
| 	JR	NZ,.WR_T_CD | ||||
| 	EX	DE,HL | ||||
| 	JR	.AP_LOOP | ||||
| 	; | ||||
| .FROM_CD: | ||||
| 	; ¯à®¢¥àª    ¯¥à¥¯®«¥¨¥  ¤à¥á  ¡ãä¥à  | ||||
| 	LD	A,H | ||||
| 	OR	L | ||||
| 	JR	Z,.NULL | ||||
| 	LD	BC,IDE.Read.Data | ||||
| .RD_F_CD: | ||||
| 	INI  | ||||
| 	INI  | ||||
| 	DEC	DE | ||||
| 	DEC	DE | ||||
| 	LD	A,D | ||||
| 	OR	E | ||||
| 	JR	NZ,.RD_F_CD | ||||
| 	EX	DE,HL | ||||
| 	JR	.AP_LOOP | ||||
| 	; | ||||
| .NULL:	LD	BC,IDE.Read.Data | ||||
| .RD_N_CD: | ||||
| 	IN	A,(C) | ||||
| 	DEC	B | ||||
| 	IN	A,(C) | ||||
| 	DEC	B | ||||
| 	DEC	DE | ||||
| 	DEC	DE | ||||
| 	LD	A,D | ||||
| 	OR	E | ||||
| 	JR	NZ,.RD_N_CD | ||||
| 	; DE = 0 | ||||
| 	JR	.AP_LOOP | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| CD_WAITPRT:	LD	DE,#8000		; D - MASK, E - PATTERN | ||||
| .Custom:	LD	BC,IDE.Read.Status | ||||
| 		LD	A,100 | ||||
| 		LD	HL,#0000 | ||||
| .LOOP_A:	EX	AF,AF' | ||||
| .LOOP_HL:	IN	A,(C) | ||||
| 		CP	#FF | ||||
| 		JR	Z,.error | ||||
| 		AND	D | ||||
| 		CP	E | ||||
| 		; | ||||
| 		 ; JR	NZ,.NEXT_TRY | ||||
| 		 ; AND	A | ||||
| 		 ; RET | ||||
| 		 RET	Z | ||||
| 		; | ||||
| .NEXT_TRY:	DEC	L | ||||
| 		JR	NZ,.LOOP_HL | ||||
| 		DEC	H | ||||
| 		JR	NZ,.LOOP_HL | ||||
| 		EX	AF,AF' | ||||
| 		DEC	A | ||||
| 		JR	NZ,.LOOP_A | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| .error:		SCF  | ||||
| 		RET  | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| ;----------------------------------------------------------------------; | ||||
| CD_TEST	LD	HL,ATAPI_CMD_PACKET.NOP | ||||
| 	LD	DE,0	;!FIXIT 㦮 «¨? | ||||
| 	JP	AP_COM | ||||
| ;----------------------------------------------------------------------; | ||||
| 
 | ||||
| 
 | ||||
| //////////////////////////////////////////////////////////////////////// | ||||
| ATAPI_CMD_PACKET: | ||||
| .NOP:	DUP	12 | ||||
| 	 DB	#00 | ||||
| 	EDUP | ||||
| ; | ||||
| .OPEN:	DB	#1B | ||||
| 	DB	#00,#00,#00 | ||||
| 	DB	#02 | ||||
| 	DB	#00,#00,#00,#00,#00,#00,#00 | ||||
| ; | ||||
| .CLOSE:	DB	#1B | ||||
| 	DB	#00,#00,#00 | ||||
| 	DB	#03 | ||||
| 	DB	#00,#00,#00,#00,#00,#00,#00 | ||||
| ; | ||||
| .READ:	DB	#28,#00 | ||||
| 	DB	#00,#00,#00,#00	; sector dword | ||||
| 	DB	#00 | ||||
| 	DB	#00,#01,#00,#00	; counter dword | ||||
| 	DB	#00 | ||||
| ; | ||||
| ATAPI_PACKET: | ||||
| .SECTOR		EQU	2 | ||||
| .COUNTER	EQU	7 | ||||
| //////////////////////////////////////////////////////////////////////// | ||||
| ; | ||||
| ; E - Second * 10 | ||||
| ; PAUSE	LD	HL,#0000 | ||||
| ; PAUSE1	DEC	L | ||||
| ; 	JR	NZ,PAUSE1 | ||||
| ; 	DEC	H | ||||
| ; 	JR	NZ,PAUSE1 | ||||
| ; 	DEC	E | ||||
| ; 	JR	NZ,PAUSE1 | ||||
| ; 	RET  | ||||
| ; | ||||
| @ -2,7 +2,7 @@ | ||||
|  MACRO WAIT_HDD | ||||
| 	LD BC,IDE.Read.Status	 | ||||
| .loop:	IN A,(C) | ||||
| 	BIT IDE.ControlBit.Busy,A | ||||
| 	BIT IDE.CtrlBit.Busy,A | ||||
| 	JR NZ,.loop | ||||
|  ENDM | ||||
| ;______________________________________________________________________: | ||||
| @ -279,8 +279,8 @@ FN_HDD_READ: | ||||
| 	LD A,IDE.ATA.ReadSectorsWithRetry | ||||
| 	OUT (C),A | ||||
| .L2:	WAIT_HDD | ||||
| 	;BIT IDE.ControlBit.DataRequest,A | ||||
| 	AND IDE.ControlByte.DataRequest | ||||
| 	;BIT IDE.CtrlBit.DataRequest,A | ||||
| 	AND IDE.CtrlByte.DataRequest | ||||
| 	JR Z,.RET_PortY | ||||
| 	; | ||||
| 	;HD_READ_CONT | ||||
| @ -354,7 +354,7 @@ FN_HDD_WRITE: | ||||
| HD_WR_L2: | ||||
| 	WAIT_HDD | ||||
| 
 | ||||
| 	BIT IDE.ControlBit.DataRequest,A | ||||
| 	BIT IDE.CtrlBit.DataRequest,A | ||||
| 	JR Z,HD_RET | ||||
| 
 | ||||
|         LD	BC,IDE.Write.Data | ||||
| @ -390,7 +390,7 @@ FN_HDD_RECAL: | ||||
| 	LD	A,IDE.ATA.ExecuteDeviceDiagnostic | ||||
| 	CALL    HD_CMD_EXE | ||||
| 	;AND	A | ||||
| 	CP	IDE.ControlByte.Error | ||||
| 	CP	IDE.CtrlByte.Error | ||||
| 	RET	Z | ||||
| 	LD	BC,IDE.Read.Error | ||||
| 	IN	A,(C) | ||||
| @ -627,7 +627,7 @@ FN_HDD_INIT: | ||||
| 	LD	A,IDE.ATA.IdentifyDevice	;!FIXIT ¯¥à¥¤¥« âì | ||||
| 	OUT	(C),A | ||||
| 	WAIT_HDD | ||||
| 	AND	IDE.ControlByte.DataRequest | ||||
| 	AND	IDE.CtrlByte.DataRequest | ||||
| 	;JR	NZ,.L2 | ||||
| 	SCF  | ||||
| 	RET 	Z | ||||
| @ -705,7 +705,7 @@ HD_WAIT: | ||||
| 	LD	DE,0 | ||||
| .loop:	LD	BC,IDE.Read.Status | ||||
| 	IN	A,(C) | ||||
| 	AND	IDE.ControlByte.Busy | ||||
| 	AND	IDE.CtrlByte.Busy | ||||
| 	JR	Z,.EXIT | ||||
| 	DEC	DE | ||||
| 	LD	A,D | ||||
|  | ||||
| @ -33,94 +33,131 @@ DRV_LIST: | ||||
| 	LD	(IX+1),#00	; DB	0	;FDD COUNT | ||||
| 	LD	(IX+2),#00	; DB	0	;HDD COUNT | ||||
| 	LD	(IX+3),#00	; DB	0	;CDROM COUNT | ||||
| ;				; BLOCK	28,0	;RESERVED		;!TODO ᤥ« âì RAMDRIVE âãâ? | ||||
| 	;			; BLOCK	13,0	;RESERVED		;!TODO ᤥ« âì RAMDRIVE âãâ? | ||||
| 	LD	(IX+4),#00	; END FLAG | ||||
| 
 | ||||
| ;Calculating FDD devices | ||||
| 	LD	A,#FF | ||||
| 	LD	HL,FDD_INI_TABLE.FDD_0 | ||||
| 	INC	(IX+1) | ||||
| 	LD	B,8 | ||||
| 	LD	A,#FF | ||||
| .TFD0: | ||||
| 	CP	(HL) | ||||
| 	INC	HL | ||||
| 	JR	NZ,.YYYFD0 | ||||
| 	DJNZ	.TFD0 | ||||
| 	DEC	(IX+1) | ||||
| .YYYFD0: | ||||
| 	CALL	.CHECK_FDD | ||||
| 	LD	HL,FDD_INI_TABLE.FDD_1 | ||||
| 	INC	(IX+1) | ||||
| 	LD	B,8 | ||||
| 	LD	A,#FF | ||||
| .TFD1: | ||||
| 	CP	(HL) | ||||
| 	INC	HL | ||||
| 	JR	NZ,.YYYFD1 | ||||
| 	DJNZ	.TFD1 | ||||
| 	DEC	(IX+1) | ||||
| .YYYFD1: | ||||
| ;Calculating IDE devices | ||||
| 	CALL	.CHECK_FDD | ||||
| 
 | ||||
| ; 	INC	(IX+1) | ||||
| ; 	LD	B,8 | ||||
| ; 	LD	A,#FF | ||||
| ; .TFD0: | ||||
| ; 	CP	(HL) | ||||
| ; 	INC	HL | ||||
| ; 	JR	NZ,.YYYFD0 | ||||
| ; 	DJNZ	.TFD0 | ||||
| ; 	DEC	(IX+1) | ||||
| ; .YYYFD0: | ||||
| ; 	LD	HL,FDD_INI_TABLE.FDD_1 | ||||
| ; 	INC	(IX+1) | ||||
| ; 	LD	B,8 | ||||
| ; 	LD	A,#FF | ||||
| ; .TFD1: | ||||
| ; 	CP	(HL) | ||||
| ; 	INC	HL | ||||
| ; 	JR	NZ,.YYYFD1 | ||||
| ; 	DJNZ	.TFD1 | ||||
| ; 	DEC	(IX+1) | ||||
| ; .YYYFD1: | ||||
| 
 | ||||
| 	; A=#FF | ||||
| ;Calculating IDE devices	IDE TYPE 1-HDD, 2-CD-ROM | ||||
| 	LD	IY,IDE.INIT_TBL_IDE0 | ||||
| 	LD	DE,IDE.HDD_INIT_TABLE | ||||
| 	LD	B,4			; !HARDCODE ª®«-¢® IDE ãáâனá⢠| ||||
| .CHECK_IDE: | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| 	CP	#FF | ||||
| 	JR	Z,.ABSIDE0 | ||||
| 	JR	Z,.NEXT_IDE | ||||
| 	CP	IDE.Device.HDD | ||||
| 	JR	NZ,.NOT_HD0 | ||||
| 	JR	NZ,.NOT_HDD | ||||
| 	INC	(IX+2) | ||||
| .NOT_HD0: | ||||
| 	CP	IDE.Device.CDROM | ||||
| 	JR	NZ,.NOT_CD0 | ||||
| 	INC	(IX+3) | ||||
| .NOT_CD0: | ||||
| .ABSIDE0: | ||||
| 	LD	IY,IDE.INIT_TBL_IDE1 | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| 	CP	#FF | ||||
| 	JR	Z,.ABSIDE1 | ||||
| 	CP	IDE.Device.HDD | ||||
| 	JR	NZ,.NOT_HD1 | ||||
| 	INC	(IX+2) | ||||
| .NOT_HD1: | ||||
| 	CP	IDE.Device.CDROM | ||||
| 	JR	NZ,.NOT_CD1 | ||||
| 	INC	(IX+3) | ||||
| .NOT_CD1: | ||||
| .ABSIDE1: | ||||
| 	LD	IY,IDE.INIT_TBL_IDE2 | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| 	CP	#FF | ||||
| 	JR	Z,.ABSIDE2 | ||||
| 	CP	IDE.Device.HDD | ||||
| 	JR	NZ,.NOT_HD2 | ||||
| 	INC	(IX+2) | ||||
| .NOT_HD2: | ||||
| 	CP	IDE.Device.CDROM | ||||
| 	JR	NZ,.NOT_CD2 | ||||
| 	INC	(IX+3) | ||||
| .NOT_CD2: | ||||
| .ABSIDE2: | ||||
| 	LD	IY,IDE.INIT_TBL_IDE3 | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| 	CP	#FF | ||||
| 	JR	Z,.check_exit | ||||
| 	CP	IDE.Device.HDD | ||||
| 	JR	NZ,.NOT_HD3 | ||||
| 	INC	(IX+2) | ||||
| .NOT_HD3: | ||||
| 	CP	IDE.Device.CDROM | ||||
| 	JR	NZ,.check_exit | ||||
| .NOT_HDD: | ||||
| 	CP	IDE.Device.ATAPI | ||||
| 	JR	NZ,.NEXT_IDE | ||||
| 	INC	(IX+3) | ||||
| .NEXT_IDE: | ||||
| 	ADD	IY,DE | ||||
| 	DJNZ	.CHECK_IDE | ||||
| 
 | ||||
| ; 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| ; 	CP	#FF | ||||
| ; 	JR	Z,.ABSIDE0 | ||||
| ; 	CP	IDE.Device.HDD | ||||
| ; 	JR	NZ,.NOT_HD0 | ||||
| ; 	INC	(IX+2) | ||||
| ; .NOT_HD0: | ||||
| ; 	CP	IDE.Device.ATAPI | ||||
| ; 	JR	NZ,.NOT_CD0 | ||||
| ; 	INC	(IX+3) | ||||
| ; .NOT_CD0: | ||||
| ; .ABSIDE0: | ||||
| ; 	LD	IY,IDE.INIT_TBL_IDE1 | ||||
| ; 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| ; 	CP	#FF | ||||
| ; 	JR	Z,.ABSIDE1 | ||||
| ; 	CP	IDE.Device.HDD | ||||
| ; 	JR	NZ,.NOT_HD1 | ||||
| ; 	INC	(IX+2) | ||||
| ; .NOT_HD1: | ||||
| ; 	CP	IDE.Device.ATAPI | ||||
| ; 	JR	NZ,.NOT_CD1 | ||||
| ; 	INC	(IX+3) | ||||
| ; .NOT_CD1: | ||||
| ; .ABSIDE1: | ||||
| ; 	LD	IY,IDE.INIT_TBL_IDE2 | ||||
| ; 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| ; 	CP	#FF | ||||
| ; 	JR	Z,.ABSIDE2 | ||||
| ; 	CP	IDE.Device.HDD | ||||
| ; 	JR	NZ,.NOT_HD2 | ||||
| ; 	INC	(IX+2) | ||||
| ; .NOT_HD2: | ||||
| ; 	CP	IDE.Device.ATAPI | ||||
| ; 	JR	NZ,.NOT_CD2 | ||||
| ; 	INC	(IX+3) | ||||
| ; .NOT_CD2: | ||||
| ; .ABSIDE2: | ||||
| ; 	LD	IY,IDE.INIT_TBL_IDE3 | ||||
| ; 	LD	A,(IY+IDE.HDD_INIT_TABLE.DriveType)	;IDE TYPE 1-HDD, 2-CD-ROM | ||||
| ; 	CP	#FF | ||||
| ; 	JR	Z,.check_exit | ||||
| ; 	CP	IDE.Device.HDD | ||||
| ; 	JR	NZ,.NOT_HD3 | ||||
| ; 	INC	(IX+2) | ||||
| ; .NOT_HD3: | ||||
| ; 	CP	IDE.Device.ATAPI | ||||
| ; 	JR	NZ,.check_exit | ||||
| ; 	INC	(IX+3) | ||||
| 
 | ||||
| .check_exit: | ||||
| 	POP	IY | ||||
| 	POP	AF | ||||
| 	OUT	(SLOT3),A | ||||
| 	XOR	A | ||||
| 	RET  | ||||
| 	; | ||||
| ; A=#FF | ||||
| .CHECK_FDD: | ||||
| 	INC	(IX+1) | ||||
| 	LD	B,8 | ||||
| .TFD0:	CP	(HL) | ||||
| 	INC	HL | ||||
| 	RET	NZ | ||||
| 	DJNZ	.TFD0 | ||||
| 	DEC	(IX+1) | ||||
| 	RET | ||||
| 	; | ||||
| 
 | ||||
| 	INCLUDE	'EXTENDED/FDD_DRIVER_2.asm' | ||||
|         INCLUDE 'EXTENDED/RAM_DISK_DRIVER_1.asm' | ||||
| 	INCLUDE	'EXTENDED/IDE/HDD_DRV.asm' | ||||
| 	INCLUDE	'EXTENDED/IDE/CD_DRV.asm' | ||||
| 	INCLUDE	'EXTENDED/IDE/ATA_DRV.asm' | ||||
| 	INCLUDE	'EXTENDED/IDE/ATAPI_DRV.asm' | ||||
| 	INCLUDE	'EXTENDED/IDE/SHARED.asm' | ||||
| 
 | ||||
| 
 | ||||
|  | ||||
| @ -290,7 +290,7 @@ AUTODETECTING:	CALL	DETECTORS.CheckChanel | ||||
| 		; enter point for ATAPI in setup		 | ||||
| .Its_ATAPI:	CALL	DETECTORS.IdentPDevChk | ||||
| 		JR	C,.IDE_ABSENT | ||||
| 		LD	A,IDE.Device.CDROM | ||||
| 		LD	A,IDE.Device.ATAPI | ||||
| 		LD	(IDEDEV),A | ||||
| 		JR	.get | ||||
| 
 | ||||
| @ -331,8 +331,8 @@ SETUP_FROM_CMOS: | ||||
| 	JR	Z,.step1 | ||||
| 	; | ||||
| 	LD	IX,SEC_SLAVE_CMOS_T | ||||
| .step1:	LD	HL,TEMP | ||||
| 	LD	DE,TEMP+1 | ||||
| .step1:	LD	HL,IDENTIFY_DEVICE_BUFFER | ||||
| 	LD	DE,IDENTIFY_DEVICE_BUFFER+1 | ||||
| 	LD	BC,511 | ||||
| 	LD	(HL),0 | ||||
| 	LDIR  | ||||
| @ -346,7 +346,7 @@ SETUP_FROM_CMOS: | ||||
| 	; | ||||
| .step2:	LD	A,(IX+2)	;M_HEAD | ||||
| 	CALL	READCMS | ||||
| 	LD	(TEMP+3*2),A                            ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. HEADS PER TRACK | ||||
| 	LD	(IDENTIFY_DEVICE_BUFFER.NumHeads),A | ||||
| 	; | ||||
| 	LD	A,(IX+1)	;M_CYLH | ||||
| 	CALL	READCMS | ||||
| @ -356,92 +356,90 @@ SETUP_FROM_CMOS: | ||||
| 	CALL	READCMS | ||||
| 	POP	HL | ||||
| 	LD	L,A | ||||
| 	LD	(TEMP+1*2),HL                           ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS | ||||
| 	LD	(IDENTIFY_DEVICE_BUFFER.NumCylinders),HL | ||||
| 	; | ||||
| 	LD	A,(IX+3)	;M_SECT | ||||
| 	CALL	READCMS | ||||
| 	LD	(TEMP+6*2),A                            ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK | ||||
| 	LD	(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack),A | ||||
| 	; | ||||
| 	LD	A,IDE.Device.HDD | ||||
| 	LD	(IDEDEV),A | ||||
| 	CALL	IDESPEC | ||||
| 	RET | ||||
| 	; CALL	IDESPEC | ||||
| 	; RET | ||||
| /////////////////////////////////////////////////////////////////////[^] | ||||
| 
 | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////[v] | ||||
| IDESPEC: | ||||
| 	IN	A,(SLOT3) | ||||
| 	EX	AF,AF' | ||||
| 	LD	A,SYS_PAGE | ||||
| 	OUT	(SLOT3),A | ||||
| 	LD	A,(IDEDEV) | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.DriveType),A	 | ||||
| 	CP	IDE.Device.CDROM | ||||
| 	JP	Z,.FOR_CDR | ||||
| 	; | ||||
| 	LD	BC,IDE.Read.Control | ||||
| 	IN	A,(C) | ||||
| 	AND	#F0 | ||||
| 	LD	B,A | ||||
| 	LD	A,(TEMP+#06)                                            ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. HEADS PER TRACK	 | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.HeadsNumber),A | ||||
| 	DEC	A | ||||
| 	AND	#0F | ||||
| 	OR	B | ||||
| 	LD	B,A | ||||
| 	LD	A,(TEMP+#63)                                            ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. LBA/NON-LBA bit 1 (FROM ZERO!) | ||||
| 	BIT	1,A | ||||
| 	JR	Z,.NONLBA | ||||
| 	; | ||||
| 	SET	6,B | ||||
| .NONLBA: LD	A,B | ||||
| 	LD	BC,IDE.Write.DeviceHead | ||||
| 	OUT	(C),A | ||||
| 	AND	#F0		;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask | ||||
| 	LD	HL,ICHANEL | ||||
| 	OR	(HL) | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.DRV_Flags),A | ||||
| 	LD	HL,(TEMP+#02)                                           ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. CYLINDERS | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H | ||||
| 	LD	A,(TEMP+#0C)                                            ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã. SECTOR PER TRACK | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A | ||||
| 	IF IDE_Optimization | ||||
| 	 LD	B,high IDE.Write.Counter	 | ||||
| 	ELSE | ||||
|  	 LD	BC,IDE.Write.Counter | ||||
| 	ENDIF | ||||
| 	OUT	(C),A | ||||
| 	LD	A,IDE.ATA.InitializeDeviceParameters | ||||
| 	CALL	IDE_CMD | ||||
| 	LD	C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)               ; Sector per track | ||||
| 	LD	B,0 | ||||
| 	LD	H,B | ||||
| 	LD	L,B | ||||
| 	LD	A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)                   ; Head per HDD | ||||
| 
 | ||||
| .loop:	ADD	HL,BC | ||||
| 	DEC	A | ||||
| 	JR	NZ,.loop | ||||
| 
 | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H | ||||
| .END:	; [x] save hdd parameters to cmos for "setup" in settings | ||||
| 	 LD	A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)	; for save to cmos in GETPARM | ||||
| 	; | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	AND	A | ||||
| 	RET | ||||
| 	; | ||||
| .FOR_CDR: LD	BC,IDE.Read.Control | ||||
| 	IN	A,(C) | ||||
| 	AND	#F0 | ||||
| 	LD	HL,ICHANEL | ||||
| 	OR	(HL) | ||||
| 	LD	(IY+IDE.HDD_INIT_TABLE.DRV_Flags),A | ||||
| 	JR	IDESPEC.END | ||||
| IDESPEC:	IN	A,(SLOT3) | ||||
| 		EX	AF,AF' | ||||
| 		LD	A,SYS_PAGE | ||||
| 		OUT	(SLOT3),A | ||||
| 		LD	A,(IDEDEV) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.DriveType),A	 | ||||
| 		CP	IDE.Device.ATAPI | ||||
| 		JP	Z,.FOR_ATAPI | ||||
| 		; | ||||
| 		LD	BC,IDE.Read.Control | ||||
| 		IN	A,(C) | ||||
| 		AND	#F0 | ||||
| 		LD	B,A | ||||
| 		LD	A,(IDENTIFY_DEVICE_BUFFER.NumHeads) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.HeadsNumber),A | ||||
| 		DEC	A | ||||
| 		AND	#0F | ||||
| 		OR	B | ||||
| 		LD	B,A | ||||
| 		LD	A,(IDENTIFY_DEVICE_BUFFER.Capabilities_high) | ||||
| 		;BIT	1,A | ||||
| 		AND	%0000'0010 | ||||
| 		JR	Z,.NONLBA | ||||
| 		; | ||||
| 		SET	6,B | ||||
| .NONLBA:	LD	A,B | ||||
| 		LD	BC,IDE.Write.DeviceHead | ||||
| 		OUT	(C),A | ||||
| 		AND	#F0		;!HARDCODE DRIVE/HEAD REGISTER PHISICAL DISK bitmask | ||||
| 		LD	HL,ICHANEL | ||||
| 		OR	(HL) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.DRV_Flags),A | ||||
| 		LD	HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberLow),L | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.CylinderNumberHigh),H | ||||
| 		LD	A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack),A | ||||
| 		IF IDE_Optimization | ||||
| 		 LD	B,high IDE.Write.Counter	 | ||||
| 		ELSE | ||||
|  		 LD	BC,IDE.Write.Counter | ||||
| 		ENDIF | ||||
| 		OUT	(C),A | ||||
| 		LD	A,IDE.ATA.InitializeDeviceParameters | ||||
| 		CALL	IDE_CMD | ||||
| 		LD	C,(IY+IDE.HDD_INIT_TABLE.SectorsPerTrack)               ; Sector per track | ||||
| 		LD	B,0 | ||||
| 		LD	H,B | ||||
| 		LD	L,B | ||||
| 		LD	A,(IY+IDE.HDD_INIT_TABLE.HeadsNumber)                   ; Head per HDD | ||||
| 		; | ||||
| .loop:		ADD	HL,BC | ||||
| 		DEC	A | ||||
| 		JR	NZ,.loop | ||||
| 		; | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderLow),L | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.SectorsPerCylinderHigh),H | ||||
| .END:		; [x] save hdd parameters to cmos for "setup" in settings | ||||
| 		 LD	A,(IY+IDE.HDD_INIT_TABLE.DRV_Flags)	; for save to cmos in GETPARM | ||||
| 		; | ||||
| 		EX	AF,AF' | ||||
| 		OUT	(SLOT3),A | ||||
| 		AND	A | ||||
| 		RET | ||||
| 		; | ||||
| .FOR_ATAPI:	LD	BC,IDE.Read.Control | ||||
| 		IN	A,(C) | ||||
| 		AND	#F0 | ||||
| 		LD	HL,ICHANEL | ||||
| 		OR	(HL) | ||||
| 		LD	(IY+IDE.HDD_INIT_TABLE.DRV_Flags),A | ||||
| 		JR	IDESPEC.END | ||||
| /////////////////////////////////////////////////////////////////////[^] | ||||
| 
 | ||||
| 
 | ||||
| @ -449,20 +447,20 @@ IDESPEC: | ||||
| IDE_CMD: | ||||
| 	PUSH	AF | ||||
| 	LD	HL,PAUSES.WAIT.IDE | ||||
| 	LD	DE,256*IDE.ControlByte.Busy + 0 | ||||
| 	LD	DE,256*IDE.CtrlByte.Busy + 0 | ||||
| 	CALL	BITS_WAITS.WAIT_PRT | ||||
| 	POP	HL | ||||
| 	RET	C | ||||
| 	INC	B			; LD BC,IDE.Write.Command  | ||||
| 	OUT	(C),H | ||||
| 	LD	HL,PAUSES.WAIT.IDE | ||||
| 	;LD	DE,256*IDE.ControlByte.Busy + 0 | ||||
| 	;LD	DE,256*IDE.CtrlByte.Busy + 0 | ||||
| 	JR	BITS_WAITS.WAIT_PRT | ||||
| /////////////////////////////////////////////////////////////////////[^] | ||||
| 
 | ||||
| 
 | ||||
| /////////////////////////////////////////////////////////////////////[v] | ||||
| MODEL:	LD	HL,TEMP+27*2                                            ; !TODO ᤥ« âì ç¥à¥§ áâàãªâãàã.  | ||||
| MODEL:	LD	HL,IDENTIFY_DEVICE_BUFFER.ModelNumber | ||||
| 	LD	A,(HL) | ||||
| 	OR	A | ||||
| 	JR	Z,.unknown | ||||
| @ -512,7 +510,7 @@ BITS_WAITS: | ||||
| 		 ;SCF | ||||
| 		 ;RET	Z | ||||
| 		; | ||||
| 		AND	IDE.ControlByte.Busy; + IDE.ControlByte.DataRequest | ||||
| 		AND	IDE.CtrlByte.Busy; + IDE.CtrlByte.DataRequest | ||||
| 		RET	Z | ||||
| 		; | ||||
| 		HALT  | ||||
| @ -611,7 +609,7 @@ SaveToCMOS: | ||||
| 	; | ||||
| 	LD	IX,PRIM_SLAVE_CMOS_T | ||||
| .save_to_cmos: | ||||
| 	LD	HL,(TEMP+1*2) | ||||
| 	LD	HL,(IDENTIFY_DEVICE_BUFFER.NumCylinders) | ||||
| 	LD	B,L | ||||
| 	LD	A,(IX+0) | ||||
| 	CALL	WRITCMS			; Cylinder low | ||||
| @ -620,12 +618,12 @@ SaveToCMOS: | ||||
| 	LD	A,(IX+1) | ||||
| 	CALL	WRITCMS			; Cylinder high | ||||
| 
 | ||||
| 	LD	A,(TEMP+3*2) | ||||
| 	LD	A,(IDENTIFY_DEVICE_BUFFER.NumHeads) | ||||
| 	LD	B,A | ||||
| 	LD	A,(IX+2) | ||||
| 	CALL	WRITCMS			; Heads | ||||
| 
 | ||||
| 	LD	A,(TEMP+6*2) | ||||
| 	LD	A,(IDENTIFY_DEVICE_BUFFER.NumSectorsPerTrack) | ||||
| 	LD	B,A | ||||
| 	LD	A,(IX+3) | ||||
| 	JP	WRITCMS			; Heads	  | ||||
| @ -667,11 +665,11 @@ Bug31SecCheck:	LD	A,(MasterSlave) | ||||
| /////////////////////////////////////////////////////////////////////[v] | ||||
| GETPARAM: | ||||
| 	LD	HL,PAUSES.WAIT.IDE | ||||
| 	LD	DE,IDE.ControlByte.DataRequest * 256 + IDE.ControlByte.DataRequest | ||||
| 	LD	DE,IDE.CtrlByte.DataRequest * 256 + IDE.CtrlByte.DataRequest | ||||
| 	CALL	BITS_WAITS.WAIT_PRT | ||||
| 	RET	C | ||||
| 	LD	BC,IDE.Read.Data | ||||
| 	LD	HL,TEMP | ||||
| 	LD	HL,IDENTIFY_DEVICE_BUFFER | ||||
| 	INIR  | ||||
| 	INIR  | ||||
| 	CALL	IDESPEC | ||||
| @ -693,11 +691,11 @@ DETECTORS: | ||||
| 		LD	BC,IDE.Write.Counter | ||||
| 		OUT	(C),A | ||||
|  		LD	HL,PAUSES.WAIT.SMALL | ||||
| 		LD	DE,IDE.ControlByte.Busy*256 + 0 | ||||
| 		LD	DE,IDE.CtrlByte.Busy*256 + 0 | ||||
|  		CALL	BITS_WAITS.WAIT_PRT | ||||
| 		RET	C | ||||
| 		; | ||||
|  		LD	BC,IDE.Read.Counter	; LD BC,IDE.Read.Counter | ||||
|  		LD	BC,IDE.Read.Counter | ||||
|  		IN	A,(C) | ||||
|  		CP	.test_counter | ||||
|  		RET	Z | ||||
| @ -722,8 +720,8 @@ DETECTORS: | ||||
| 		SCF | ||||
| 		RET	Z | ||||
| 		; | ||||
| 		AND	IDE.ControlByte.Busy + IDE.ControlByte.DataRequest + IDE.ControlByte.Error | ||||
| 		CP	IDE.ControlByte.Error | ||||
| 		AND	IDE.CtrlByte.Busy + IDE.CtrlByte.DataRequest + IDE.CtrlByte.Error | ||||
| 		CP	IDE.CtrlByte.Error | ||||
| 		RET	Z | ||||
| 		; | ||||
| 		HALT  | ||||
| @ -748,7 +746,7 @@ DETECTORS: | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		OUT	(C),E | ||||
| 		; | ||||
| 		LD	DE,IDE.ControlByte.Busy * 256 + 0 | ||||
| 		LD	DE,IDE.CtrlByte.Busy * 256 + 0 | ||||
| 		LD	HL,PAUSES.WAIT.IDE | ||||
| 		CALL	BITS_WAITS.WAIT_PRT | ||||
| 		RET	C			; Absent | ||||
| @ -758,7 +756,7 @@ DETECTORS: | ||||
| 		RRCA | ||||
| 		JR	C,.non_ATA | ||||
| 		; | ||||
| 		AND	(IDE.ControlByte.DataRequest + IDE.ControlByte.Ready) / 2 | ||||
| 		AND	(IDE.CtrlByte.DataRequest + IDE.CtrlByte.Ready) / 2 | ||||
| 		SCF | ||||
| 		RET	Z | ||||
| 		; | ||||
| @ -778,19 +776,19 @@ DETECTORS: | ||||
| 	; ATAPI or Absent | ||||
| 	; Exit:	CF - No device | ||||
| 	;	NC - ATAPI | ||||
| .IdentPDevChk:	LD	E,IDE.ATAPI.IdentifyPackedDevice | ||||
| .IdentPDevChk:	LD	E,IDE.ATAPI.IdentifyPacketDevice | ||||
| 		LD	BC,IDE.Write.Command | ||||
| 		OUT	(C),E | ||||
| 		LD	HL,PAUSES.WAIT.IDE | ||||
| 		LD	DE,IDE.ControlByte.Busy*256 + 0 | ||||
| 		LD	DE,IDE.CtrlByte.Busy*256 + 0 | ||||
| 		CALL	BITS_WAITS.WAIT_PRT | ||||
| 		RET	C | ||||
| 		; | ||||
| 		LD	BC,IDE.Read.Status | ||||
| 		IN	A,(C) | ||||
| 		RRCA | ||||
| 		RET	C | ||||
| 		XOR	A | ||||
| 		; RET	C | ||||
| 		; XOR	A | ||||
| 		RET | ||||
| ;-------; | ||||
| 
 | ||||
|  | ||||
| @ -74,10 +74,11 @@ | ||||
| ;FDD	EQU	#03 | ||||
| 
 | ||||
| ;!FIXIT	®à¬ «ì® ¯à®¯¨á âì | ||||
| TEMP	EQU	#7E00   						; !HARDCODE  | ||||
| MEMMAP2	EQU	TEMP                                                    ; ¤®«¦® ¡ëâì ¢ë஢¥® ¯® ALIGN 256 | ||||
| TPOINTD	EQU	TEMP - SYS_PAGE.RAMD_KEYS.NUM; - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023 | ||||
| 	ASSERT	(low TEMP = 0) or (low MEMMAP2 = 0), "ERROR Align 256!!!" | ||||
| TEMP			EQU	#7E00   						; !HARDCODE | ||||
| IDENTIFY_DEVICE_BUFFER	_ATA_IDENTIFY_DEVICE_DATA = TEMP | ||||
| MEMMAP2			EQU	TEMP                                                    ; ¤®«¦® ¡ëâì ¢ë஢¥® ¯® ALIGN 256 | ||||
| TPOINTD			EQU	TEMP - SYS_PAGE.RAMD_KEYS.NUM; - SYS_PAGE.Sp_RAMD_KEYS.NUM ; [x] 4/11/2023 | ||||
|  ASSERT	(low TEMP = 0) or (low MEMMAP2 = 0), "ERROR Align 256!!!" | ||||
| 
 | ||||
| ;ÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛÛ; | ||||
| ;SETUP_MAIN: | ||||
| @ -1122,7 +1123,7 @@ HDSTART: | ||||
| 	EX	AF,AF' | ||||
| 	OUT	(SLOT3),A | ||||
| 	EX	AF,AF' | ||||
| 	CP	IDE.Device.CDROM | ||||
| 	CP	IDE.Device.ATAPI | ||||
| 	JP	Z,CDSTART | ||||
| 	PUSH	AF | ||||
| 	PUSH	BC | ||||
|  | ||||
| @ -58,7 +58,7 @@ | ||||
| 			"TrDosC",		-- 6 | ||||
| 			"TrDosD",		-- 7 | ||||
|                         "SetTime",		-- 8	DEFINES.INC --> NEW_FEATURE | ||||
| 			"HddWrPr",		-- 9	DEFINES.INC --> HDDwriteProtect | ||||
| 			--"HddWrPr",		-- 9	DEFINES.INC --> HDDwriteProtect | ||||
| 						-- 10 | ||||
| 						-- 11 | ||||
| 						-- 12 | ||||
| @ -70,7 +70,7 @@ | ||||
| 		} | ||||
| 	} | ||||
| 	DeleteValueByDEFINE(SettingsTabsOrder,"NEW_FEATURE","SetTime") | ||||
| 	DeleteValueByDEFINE(SettingsTabsOrder,"HDDwriteProtect","HddWrPr") | ||||
| 	--DeleteValueByDEFINE(SettingsTabsOrder,"HDDwriteProtect","HddWrPr") | ||||
| 	DeleteValueByDEFINE(SettingsTabsOrder,"UnusedSettingsFeatures","MemTest") | ||||
| 	DeleteValueByDEFINE(SettingsTabsOrder,"UnusedSettingsFeatures","UpdBios") | ||||
| 	DeleteValueByDEFINE(SettingsTabsOrder,"UnusedSettingsFeatures","TypRate") | ||||
| @ -340,16 +340,16 @@ SettingsItemsTabs: | ||||
| 	DB	msgStrings.valCdRom | ||||
| 	DB	msgStrings.valDash6 | ||||
| 
 | ||||
| 	IF	HDDwriteProtect | ||||
| 	 _mSETitemParams HddWrPr | ||||
| 	 DW	OnChangeAction.nothing | ||||
|          IF NEW_FEATURE :     DB paramLine : ENDIF | ||||
| 	 DB	columnNum,lineNum | ||||
| 	 DB	paramName | ||||
| 	 DW	CMOS_CELL.Options.Mask.HDDwriteProtect : DB %0000'0001 | ||||
| 	 DB	msgStrings.valDisabled | ||||
| 	 DB	msgStrings.valEnabled | ||||
| 	ENDIF | ||||
| 	; IF	HDDwriteProtect | ||||
| 	;  _mSETitemParams HddWrPr | ||||
| 	;  DW	OnChangeAction.nothing | ||||
| 	;  IF NEW_FEATURE :     DB paramLine : ENDIF | ||||
| 	;  DB	columnNum,lineNum | ||||
| 	;  DB	paramName | ||||
| 	;  DW	CMOS_CELL.Options.Mask.HDDwriteProtect : DB %0000'0001 | ||||
| 	;  DB	msgStrings.valDisabled | ||||
| 	;  DB	msgStrings.valEnabled | ||||
| 	; ENDIF | ||||
| 
 | ||||
| 	_mSETitemParams ScreenY | ||||
| 	DW	OnChangeAction.setXYpos | ||||
| @ -652,9 +652,9 @@ msgStrings: | ||||
|  _mSetStr parPriIdeSl, tmp_Counter		:	DZ	'Primary IDE Slave',#FF,'         : ' | ||||
|  _mSetStr parSecIdeMA, tmp_Counter		:	DZ	'Secondary IDE Master',#FF,'      : ' | ||||
|  _mSetStr parSecIdeSl, tmp_Counter		:	DZ	'Secondary IDE Slave',#FF,'       : ' | ||||
|  IF HDDwriteProtect | ||||
|   _mSetStr parHddWrPr, tmp_Counter		:	DZ	'HDD write protect          : ' | ||||
|  ENDIF | ||||
| ;  IF HDDwriteProtect | ||||
| ;   _mSetStr parHddWrPr, tmp_Counter		:	DZ	'HDD write protect          : ' | ||||
| ;  ENDIF | ||||
|  _mSetStr parScreenY, tmp_Counter		:	DZ	'Y-screen position          : ' | ||||
|  _mSetStr valMinus7, tmp_Counter		:	DZ	'-7' | ||||
|  _mSetStr valMinus6, tmp_Counter		:	DZ	'-6' | ||||
| @ -828,9 +828,9 @@ msgRusStrings: | ||||
|  _mSetStrRus parPriIdeSl, tmp_Counter		:	DZ	'Primary IDE Slave',#FF,'         : ' | ||||
|  _mSetStrRus parSecIdeMA, tmp_Counter		:	DZ	'Secondary IDE Master',#FF,'      : ' | ||||
|  _mSetStrRus parSecIdeSl, tmp_Counter		:	DZ	'Secondary IDE Slave',#FF,'       : ' | ||||
|  IF HDDwriteProtect | ||||
|   _mSetStrRus parHddWrPr, tmp_Counter		:	DZ	'‡ é¨â  § ¯¨á¨   HDD       : ' | ||||
|  ENDIF | ||||
| ;  IF HDDwriteProtect | ||||
| ;   _mSetStrRus parHddWrPr, tmp_Counter		:	DZ	'‡ é¨â  § ¯¨á¨   HDD       : ' | ||||
| ;  ENDIF | ||||
|  _mSetStrRus parScreenY, tmp_Counter		:	DZ	'‘¤¢¨£ íªà   ¯® Y          : ' | ||||
|  _mSetStrRus valMinus7, tmp_Counter		:	DZ	'-7' | ||||
|  _mSetStrRus valMinus6, tmp_Counter		:	DZ	'-6' | ||||
|  | ||||
| @ -19,7 +19,8 @@ BETA_RC		EQU			1			; | ||||
| ;----------------------------[ TEST ]---------------------------; | ||||
|  DEFINE		TEST_INT		1			; ’¥áâ®¢ë© ®¡à ¡®â稪 ¯®«ì§®¢ â¥«ì᪮£® INT | ||||
|  DEFINE		NEW_FEATURE		0			; !TODO ¯ãªâë ¢ á¥â ¯ | ||||
|  DEFINE		HDDwriteProtect		0			; áâ à ï ä¨èª  ¤«ï äãªæ¨© 5x | ||||
| ;DEFINE		HDDwriteProtect		0			; áâ à ï ä¨èª  ¤«ï äãªæ¨© 5x | ||||
|  DEFINE		FDD_NormalCount		0			; !TODO  | ||||
|  DEFINE		UnusedSettingsFeatures	0			; | ||||
| ;DEFINE		OPTIMIZE_RW_PROCEDURE	0			; | ||||
| ;===============================================================; | ||||
| @ -2,6 +2,7 @@ | ||||
| ;---------[All shared includes]--------- | ||||
| 	INCLUDE 'src/bios/shared/DEFINES.INC'                           ; Shared defines | ||||
| 	INCLUDE 'Shared_Includes/structures/FileSystem.inc' | ||||
| 	INCLUDE 'Shared_Includes/structures/ATA_ATAPI.inc' | ||||
| 	INCLUDE 'src/bios/Loader/Loader.asm'                            ; Bitstream loader as macros | ||||
| 	INCLUDE 'src/bios/shared/CompMacro.asm'                         ; ¬ ªà®áë | ||||
| 	INCLUDE 'Shared_Includes/constants/SP2000.inc'                  ; ª®áâ âë | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Tolik
						Tolik