www.pudn.com > GAMEPAD_V0.89.rar > GAMEPAD_V0.89.dt


;========================================= 
;	USB 8 KEY GAMEPAD 
;	MODIFY BY HOWARD 08/08/2002 
;	MODIFY BY NEKO	06/05/2003 
;========================================= 
 
 
 
 
 
;=============================================================================== 
;	PROGRAM  REGISTERS 
;=============================================================================== 
 
 
	R0			== 0X00 
	TCC		   	== 0X01 
	PC			== 0X02 
	STATUS			== 0X03 
	RSR		   	== 0X04 
	PORT5		 	== 0X05 
	PORT6		 	== 0X06 
	PORT7		 	== 0X07 
	R8			== 0X08 
	R9			== 0X09 
	RA			== 0X0A 
	RB			== 0X0B 
	RC			== 0X0C 
	RD			== 0X0D 
	RE			== 0X0E 
	RF			== 0X0F 
 
 
;================================================================================= 
;	USB REGISTERS ASSIGN 
;================================================================================= 
 
	TRANSFER		== 0X10;	[0]CMD REPORT DATA FINISH(0) OR NOT(1) [1]DEVICE CONFIG REPORT OK(1) OR NOT(0) 
	A_TEMP		   	== 0X11 
	STATUS_TEMP	  	== 0X12 
	RSR_TEMP		== 0X13 
	PACK_MAX		== 0X14 
	INCRE			== 0X15 
	DATA_MAX		== 0X16 
	PC_WANT		  	== 0X17 
	PORT6_STATE 	 	== 0X18 
	PORT6_TEMP	   	== 0X19 
	PORT7_STATE	  	== 0X1A 
	PORT7_TEMP	   	== 0X1B 
	X_DATA   		== 0X1C 
	Y_DATA   		== 0X1D 
	BTM_DATA 		== 0X1E 
	CMD_SELECT		== 0X1F;	EP0 CMD SELECTOR 
	BTM_DATA2		== 0X20 
	REP_DATA		== 0X21;	TURBO SET REGISTER 
	REP_DATA2		== 0X22;	TURBO SET REGISTER2 
	CHECKPOINT		== 0X23;	[0]TURBO SET [1]TURBO CLR 
	TMP_DATA		== 0X24;	LAST KEY STATUS 
	TMP_DATA2  	  	== 0X25;	LAST KEY STATUS2 
	TEMP			== 0X26 
	TEMP1			== 0X27 
	TCTEMP			== 0X28;	TURBO REPORT CHECK TEMP 
 
	BYTE0				== 0X38 
	BYTE1				== 0X39 
	BYTE2				== 0X3A 
	BYTE3				== 0X3B 
	BYTE4				== 0X3C 
	BYTE5				== 0X3D 
	BYTE6				== 0X3E 
	BYTE7				== 0X3F 
 
 
               
		 
;======================================================================== 
;	PROGRAM   START 
;======================================================================== 
	ORG		0X00 
	JMP		INITIAL 
	ORG		0X0A 
	 
	DISI 
	MOV	A_TEMP,A	;SAVE A 
	SWAP	A_TEMP 
	SWAPA	RSR		;SAVE RSR(R4) 
	MOV	RSR_TEMP,A 
	SWAPA	STATUS		;SAVE STATUS(R3) 
	MOV	STATUS_TEMP,A 
	CLR	RSR 
	JMP	INT_STATE 
	 
 
		 
 
;============================================================ 
;	DESCRIPTORS 
;============================================================ 
 
DEVICE_TABLE:  
;LIST: 
		ADD	PC,A 
		RETL	@0X12;0	START OF DEVICE DESCRIPTOR 
		RETL	@0X01;1 
		RETL	@0X00;2 
		RETL	@0X01;3 
		RETL	@0X00;4 
		RETL	@0X00;5 
		RETL	@0X00;6 
		RETL	@0X08;7 
		;TRANS == 1 
		RETL	@0X03;8  Vendor ID(assigned by USB) 
		RETL	@0X06;9 
		RETL	@0X75;A  Product ID 0x0001 (assigned by manufacturer)  
		RETL	@0X68;B   
		RETL	@0X00;C  Device release number (assigned by manufacturer) 
		RETL	@0X01;D 
		RETL	@0X00;E  Index of String descriptor describing manufacturer 
		RETL	@0X22;F  Index of string descriptor describing product 
		;TRANS == 2 
		RETL	@0X00;10  Index of String descriptor desribing the device's serial number 
		RETL	@0X01;11	END OF DEVICE DESCRIPTOR 
		;TRANS == 3   
CONFIG_TABLE: 
		TBL 
		;CONFIGURATION DESCRIPTOR	 
		RETL	@0X09;12	START OF CONFIG 
		RETL	@0X02;13 
		RETL	@0X22;14 
		RETL	@0X00;15 
		RETL	@0X01;16 
		RETL	@0X01;17 
		RETL	@0X00;18 
		RETL	@0X80;19 
		;TRANS ==1 
		RETL	@0X32;1A 
		RETL	@0X09;1B	START OF INTERFACE 
		RETL	@0X04;1C 
		RETL	@0X00;1D 
		RETL	@0X00;1E 
		RETL	@0X01;1F 
		RETL	@0X03;20 
		RETL	@0X00;21 
		;TRANS ==2 
		RETL	@0X00;22 
		RETL	@0X00;23 
		RETL	@0X09;24	START OF HID  
		RETL	@0X21;25 
		RETL	@0X00;26 
		RETL	@0X01;27 
		RETL	@0X00;28 
		RETL	@0X01;29 
		;TRANS ==3 
		RETL	@0X22;2A 
		RETL	@0X39;2B 
		RETL	@0X00;2C 
		RETL	@0X07;2D	START OF ENDPOINT 
		RETL	@0X05;2E 
		RETL	@0X81;2F 
		RETL	@0X03;30 
		RETL	@0X08;31 
		;TRANS ==4 
		RETL	@0X00;32 
		RETL	@0X0A;33 
		;TRANS ==5         INCRE == 12     
		 
HID_TABLE: 
		TBL 
		;REPORT DESCRIPT 
		RETL	@0X05;34	INCRE == 34  DATA_MAX == 39 
		RETL	@0X01;35 
		RETL	@0X09;36 
		RETL	@0X05;37 
		RETL	@0XA1;38 
		RETL	@0X01;39 
		RETL	@0X09;3A 
		RETL	@0X01;3B 
		;8BYTES--TRANS==1 
		RETL	@0XA1;3C 
		RETL	@0X00;3D 
		RETL	@0X09;3E 
		RETL	@0X30;3F 
		RETL	@0X09;40 
		RETL	@0X31;41 
		RETL	@0X15;42 
		RETL	@0X00;43 
		;16BYTES--TRANS==2 
		RETL	@0X26;44 
		RETL	@0XFF;45 
		RETL	@0X00;46 
		RETL	@0X35;47 
		RETL	@0X00;48 
		RETL	@0X46;49 
		RETL	@0XFF;4A 
		RETL	@0X00;4B 
		;24BYTES--TRANS==3 
		RETL	@0X66;4C 
		RETL	@0X00;4D 
		RETL	@0X00;4E 
		RETL	@0X95;4F 
		RETL	@0X02;50 
		RETL	@0X75;51 
		RETL	@0X08;52 
		RETL	@0X81;53 
		;32BYTES--4 
		RETL	@0X02;54 
		RETL	@0XC0;55 
		RETL	@0X05;56 
		RETL	@0X09;57 
		RETL	@0X19;58 
		RETL	@0X01;59 
		RETL	@0X29;5A 
		RETL	@0X0A;5B	10KEY 
		;40BYTES--5 
		RETL	@0X15;5C 
		RETL	@0X00;5D 
		RETL	@0X25;5E 
		RETL	@0X01;5F 
		RETL	@0X95;60 
		RETL	@0X0A;61	10KEY	 
		RETL	@0X75;62 
		RETL	@0X01;63 
		;48BYTES--6 
		RETL	@0X81;64  
		RETL	@0X02;65 
		RETL	@0X95; 
		RETL	@0X01; 
		RETL	@0X75; 
		RETL	@0X06; 
		RETL	@0X81; 
		RETL	@0X01; 
		;56bytes--7 
		RETL	@0XC0;66	End of Report Descriptor 
/*		 
		 
		RETL	@0X95;67 
		RETL	@0X01;68 
		RETL	@0X81;69 
		RETL	@0X06;6A 
		RETL	@0X09;6B 
		;56BYTES--7 
		RETL	@0X3C;6C 
		RETL	@0X15;6D 
		RETL	@0X00;6E 
		RETL	@0X25;6F 
		RETL	@0X01;70 
		RETL	@0X75;71 
		RETL	@0X01;72 
		RETL	@0X95;73 
		;64BYTES--8 
		RETL	@0X01;74 
		RETL	@0XB1;75 
		RETL	@0X22;76 
		RETL	@0X95;77 
		RETL	@0X07;78 
		RETL	@0XB1;79	 
		RETL	@0X01;7A 
		RETL	@0XC0;7B	END OF REPORT DESCRIPTOR 
		;72BYTES--9   
*/	 
	 
STRING0T: 
		TBL 
		RETL	@0X04;7C	STRING DESCRIPTOR OF LANGUAGES 
		RETL	@0X03;7D 
		RETL	@0X09;7E 
		RETL	@0X04;7F	END OF LANGUAGES		 
		;TRANS == 1		 INCRE == 7C  DATA_MAX == 4					 
STRING1T:		 
		TBL 
		RETL	@0X4E;80	STRING DESCRIPTOR OF MANUFACTURE 
		RETL	@0X03;81	NEKO Microelectronics Corporation 
		RETL	@0X4E;82	N 
		RETL	@0X00;83 
		RETL	@0X45;84	E 
		RETL	@0X00;85 
		RETL	@0X4B;86	K 
		RETL	@0X00;87 
		;TRANS == 1 
		RETL	@0X4F;88	O 
		RETL	@0X00;89 
		RETL	@0X20;8A	SPACE 
		RETL	@0X00;8B 
		RETL	@0X4D;8C	M 
		RETL	@0X00;8D 
		RETL	@0X69;8E	i 
		RETL	@0X00;8F 
		;TRANS == 2 
		RETL	@0X63;90	c 
		RETL	@0X00;91	 
		RETL	@0X72;92	r 
		RETL	@0X00;93 
		RETL	@0X6F;94	o 
		RETL	@0X00;95 
		RETL	@0X65;96	e 
		RETL	@0X00;97 
		;TRANS == 3		  
		RETL	@0X6C;98	l 
		RETL	@0X00;99 
		RETL	@0X65;9A	e 
		RETL	@0X00;9B 
		RETL	@0X63;9C	c 
		RETL	@0X00;9D 
		RETL	@0X74;9E	t 
		RETL	@0X00;9F 
		 
		RETL	@0X72;A0	r 
		RETL	@0X00;A1 
		RETL	@0X6F;A2	o 
		RETL	@0X00;A3 
		RETL	@0X6E;A4	n 
		RETL	@0X00;A5 
		RETL	@0X69;A6	i 
		RETL	@0X00;A7 
		 
		RETL	@0X63;A8	c 
		RETL	@0X00;A9 
		RETL	@0X73;AA	s 
		RETL	@0X00;AB 
		RETL	@0X20;AC	SPACE 
		RETL	@0X00;AD 
		RETL	@0X43;AE	C 
		RETL	@0X00;AF 
		 
		RETL	@0X6F;B0	o 
		RETL	@0X00;B1 
		RETL	@0X72;B2	r 
		RETL	@0X00;B3 
		RETL	@0X70;B4	p 
		RETL	@0X00;B5 
		RETL	@0X6F;B6	o 
		RETL	@0X00;B7 
		 
		RETL	@0X72;B8	r 
		RETL	@0X00;B9 
		RETL	@0X61;BA	a 
		RETL	@0X00;BB 
		RETL	@0X74;BC	t 
		RETL	@0X00;BD 
		RETL	@0X69;BE	i 
		RETL	@0X00;BF 
		 
		RETL	@0X6F;C0	o 
		RETL	@0X00;C1 
		RETL	@0X6E;C2	n 
		RETL	@0X00; 
		RETL	@0X20;		SPACE 
		RETL	@0X00; 
		RETL	@0X46;		F 
		RETL	@0X00; 
		 
		RETL	@0X55;		U 
		RETL	@0X00; 
		RETL	@0X43;		C 
		RETL	@0X00; 
		RETL	@0X4B;		K 
		RETL	@0X00;C3		End of Manufacture String Descriptor 
		 
STRING2T: 
		TBL					 
		RETL	@0X22;C4		Strat of Product String Descriptor 
		RETL	@0X03;C5		INCRE == C4  DATA_MAX == 22 
		RETL	@0X55;C6	 
		RETL	@0X00;C7 
		RETL	@0X53;C8	 
		RETL	@0X00;C9 
		RETL	@0X42;CA	 
		RETL	@0X00;CB 
		 
		RETL	@0X20;CC	 
		RETL	@0X00;CD 
		RETL	@0X47;CE	 
		RETL	@0X00;CF 
		RETL	@0X61;D0	 
		RETL	@0X00;D1 
		RETL	@0X6D;D2	 
		RETL	@0X00;D3 
		 
		RETL	@0X65;D4	 
		RETL	@0X00;D5 
		RETL	@0X50;D6	 
		RETL	@0X00;D7 
		RETL	@0X61;D8	 
		RETL	@0X00;D9 
		RETL	@0X64;DA	 
		RETL	@0X00;DB 
		 
		RETL	@0X20;DC	 
		RETL	@0X00;DD 
		RETL	@0X53;DE	 
		RETL	@0X00;DF 
		RETL	@0X54;E0	 
		RETL	@0X00;E1 
		RETL	@0X44;E2 
		RETL	@0X00;E3 
		 
		RETL	@0X2E;E4 
		RETL	@0X00;E5	End of Product String Descriptor		 
	 
	 
 
;========================================================================== 
;	END OF DESCRIPTOR 
;========================================================================== 
 
 
INITIAL: 
		DISI 
		MOV	A,@0B11010000	;DUALCLOCK DIS, WUE DIS, RUN BIT SET 
		IOW	0X0E 
			 
		MOV	A,@0B00000011 
		IOW	0X05	;SET BIT0 D+/DATA, BIT 1 D-/CLK PINS INPUT 
		 
		MOV	A,@0XFF 
		MOV	R8,A	;DISABLE PORT6 CHANGE WAKEUP 
		MOV	R9,A	;DISABLE PORT7 CHANGE WAKEUP 
		 
		CLR	RF 
	 
		CLR	0X3E	;CLR RAM 
		CLR	0X3F 
						 
USB_MODE: 
		MOV	A,@0B11000001 
		IOW	0X0A		;SET TO USB MODE 
			 
		CALL	CLRRAMU 
		CLR	RC 
		CLR	RD 
		CLR	RF 
		CLR	TRANSFER 
		CLRA	 
		CONTW 
	 
		MOV	A,@0B00000110 
		IOW	0X0F	;ENABLE EP0 INTERRUPT”BUSB SUSPEND INTERRUPT 
		MOV	A,@0XFF 
		IOW	0X06	;SET PORT6 INPUT 
		IOW	0X07	;SET PORT7 INPUT 
		 
		IOW	0X0C	;PULL HIGH PORT6 
		IOW	0X0D	;PULL HIGH PORT7 
		MOV	A,@0XFF 
		MOV	R8,A	;PORT6 WAKEUP  DISABLE 
		MOV	R9,A	;PORT7 WAKEUP  DISABLE 
		MOV	PORT6_TEMP,A 
		MOV	A,@0X0F 
		MOV	PORT7_TEMP,A 
		JMP	START 
		 
INT_STATE: 
	 
		BC	STATUS,5	;SET PAGE0  
		;JBC	RF,0 
		;JMP	TCC_INT 
		JBC	RF,1 
		JMP	EP0_INT 
		JBC	RF,2 
		JMP	SUSPEND_INT 
		JBC	RF,3 
		JMP	RESET_INT 
        JMP	INT_RET 
              
TCC_INT: 
		JMP	INT_RET 
EP0_INT: 
		JMP	READ_COMMAND				 
SUSPEND_INT: 
		JBS	TRANSFER,1 
		JMP	INT_RET 
		JMP	SUSPEND_READY 
RESET_INT: 
 
 
SUSPEND_READY: 
		MOV	A,@0B00000000 
		MOV	R8,A	;ENABLE PORT6 WAKEUP 
		MOV	A,@0B00000000 
		MOV	R9,A	;ENABLE PORT7 WAKEUP 
		MOV	PORT6,PORT6	;SAVE PORT6 STATE 
		MOV	PORT7,PORT7	;SAVE PORT7 STATE 
		IOR	0X0E 
		AND	A,@0B10101111	;ENABLE WAKEUP FUNCTION & GO TO SLEP MODE 
		IOW	0X0E 
		NOP 
		NOP 
		;MOV	A,@0B01010000	;go to dual mode 
		;IOW	0X0E 
		 
		JBC	RC,2	;check host_suspend bit 
		BS	 RC,3	;host_suspend = 1   set dev_resume bit 
		 
		CALL	DELAY_22 
		CALL	DELAY_22 
		;CALL	DELAY_22 
		 
		 
		 
		MOV	A,@0B11010000	;DISABLE WAKEUP FUNCTION & GO TO NORMAL MODE 
		IOW	0X0E 
		 
	 
		;JBC	RC,2	;SUSPEND SIGNAL 
		;BS	 RC,3 
		 
		;JMP	PORT_CHANGE 
	 
PR:		 
		MOV	A,@0XFF 
		MOV	R8,A 
		MOV	R9,A 
		 
		BC	RF,2 
	 
		JMP	INT_RET	 
PORT_CHANGE: 
		BS	 RC,3 
		JBC	RC,2 
		JMP	PORT_CHANGE 
		JMP	PR 
		 
		 
/*	MOV	A,@0B11000001 
		IOW	0X0A		;SET TO 256K Hz 
		 
		MOV	A,PORT6 
		MOV	XY_STATE_REG,A 
		MOV	A,PORT7 
		MOV	WHL_STATE_REG,A 
		 
		IOR	0X0E 
		AND	A,@0B01111111 
		IOW	0X0E	;SET TO DUAL MODE 
		 
		CLR	RF 
		 
WAIT_WAKE_LOOP: 
		MOV	A,PORT6 
		XOR	A,XY_STATE_REG 
		JBC	STATUS,2 
		JMP	WAKEUP 
		 
		MOV	A,PORT7 
		XOR	A,WHL_STATE_REG 
		JBC	STATUS,2 
		JMP	WAKEUP 
		 
		JBC	RF,4 
		JMP	WAKEUP2 
		 
		JMP	WAIT_WAKE_LOOP 
		 
		 
WAKEUP:	;DEVICE REMOTE WAKEUP PC 
		IOR	0X0E 
		OR	A,@0B10000000	;SET TO XTAL MODE 
		IOW	0X0E 
		BS	RC,3		;REMOTE WAKEUP PC 
		JMP	INT_RET		 
		 
WAKEUP2:	;PC WAKEUP DEVICE 
	 
		IOR	0X0E 
		OR	A,@0B10000000	;SET TO XTAL MODE 
		IOW	0X0E 
	 
		JMP	INT_RET		 
	*/	 
              
INT_RET:   
		CLR	RF 
		SWAPA	STATUS_TEMP 
		MOV	STATUS,A 
		SWAPA	RSR_TEMP 
		MOV	RSR,A 
		SWAPA	A_TEMP 
 
		RETI	 
		 
START: 
		ENI 
 
MAIN: 
		JBC	RC,6 
		JMP	MAIN2	 
		JBC	TRANSFER,0 
		JMP	REPORT	;go to reload USB command data 
MAIN2: 
		JBS	TRANSFER,1	;IF CONFIG IS NOT OK WILL NOT SCAN 
		JMP	MAIN 
		JBS	RC,5 
		 
		CALL	SCAN 
	 
		JMP	MAIN 
 
		 
READ_COMMAND: 
		 
		CLR	RD 
		MOV	A,RE 
		MOV	BYTE0,A 
		MOV	A,RE 
		MOV	BYTE1,A 
		MOV	A,RE 
		MOV	BYTE2,A 
		MOV	A,RE 
		MOV	BYTE3,A 
		MOV	A,RE 
		MOV	BYTE4,A 
		MOV	A,RE 
		MOV	BYTE5,A 
		MOV	A,RE 
		MOV	BYTE6,A 
		MOV	A,RE 
		MOV	BYTE7,A 
		MOV	A,@0X10 
		MOV	RD,A 
		CLR	RE 
		BC	RC,7 
		BC	TRANSFER,0 
		 
DECODE: 
		MOV	A,@0X21 
		XOR	A,BYTE0 
		JBC	STATUS,2 
		JMP	SET_IDLE 
		MOV	A,@0X01 
		XOR	A,BYTE3 
		JBC	STATUS,2 
		JMP	DEVICE_SET 
		MOV	A,@0X02 
		XOR	A,BYTE3 
		JBC	STATUS,2 
		JMP	CONFIG_SET 
		MOV	A,@0X22 
		XOR	A,BYTE3 
		JBC	STATUS,2 
		JMP	HID_REPORT_SET 
		MOV	A,@0X0A 
		XOR	A,BYTE1 
		JBC	STATUS,2 
		JMP	SET_IDLE 
		MOV	A,@0X03 
		XOR	A,BYTE3 
		JBC	STATUS,2 
		JMP	STRING_SET 
		JMP	STALL 
STALL: 
		BS	RC,0 
		BC	RC,7 
		BC	RF,1 
		JMP	INT_RET 
SET_IDLE: 
		CLR	INCRE 
		CLR	CMD_SELECT 
		CLRA 
		MOV	DATA_MAX,A 
		MOV	PC_WANT,A 
		BS	TRANSFER,0 
		JMP	INT_RET 
DEVICE_SET: 
		CLR	INCRE 
		MOV	A,@0X01 
		MOV	CMD_SELECT,A 
		MOV	A,@0X12 
		MOV	DATA_MAX,A 
		MOV	A,BYTE6 
		MOV	PC_WANT,A 
		BS	TRANSFER,0 
		JMP	INT_RET 
CONFIG_SET: 
	    	;MOV	A,@0X12 
	    	;MOV	INCRE,A 
	    	CLR	INCRE 
	    	MOV	A,@0X02 
	    	MOV	CMD_SELECT,A 
	    	MOV	A,@0X22 
	    	MOV	DATA_MAX,A 
	    	MOV	A,BYTE6 
	    	MOV	PC_WANT,A 
			BS	TRANSFER,0 
	    	JMP	INT_RET 
HID_REPORT_SET: 
		;MOV	A,@0X34 
		;MOV	INCRE,A 
		CLR	INCRE 
		MOV	A,@0X03 
		MOV	CMD_SELECT,A 
		MOV	A,@0X39 
		MOV	DATA_MAX,A 
		MOV	A,BYTE6 
		MOV	PC_WANT,A 
		BS	TRANSFER,0 
		BS	TRANSFER,1 
		JMP	INT_RET 
STRING_SET: 
		MOV	A,@0X00 
		XOR	A,BYTE2 
		JBC	STATUS,2 
		JMP	STRING0 
		MOV	A,BYTE2 
		XOR	A,@0X01 
		JBC	STATUS,2 
		JMP	STRING1 
		MOV	A,BYTE2 
		XOR	A,@0X22 
		JBC	STATUS,2 
		JMP	STRING2 
STRING0: 
		;MOV	A,@0X82 
		;MOV	INCRE,A 
		CLR	INCRE 
		MOV	A,@0X04 
		MOV	CMD_SELECT,A 
		MOV	A,@0X04 
		MOV	DATA_MAX,A 
		MOV	A,BYTE6 
		MOV	PC_WANT,A 
		BS	 TRANSFER,0 
		JMP	INT_RET 
STRING1: 
		;MOV	A,@0X86 
		;MOV	INCRE,A 
		CLR	INCRE 
		MOV	A,@0X05 
		MOV	CMD_SELECT,A 
		MOV	A,@0X4E 
		MOV	DATA_MAX,A 
		MOV	A,BYTE6 
		MOV	PC_WANT,A 
		BS	 TRANSFER,0 
		JMP	INT_RET 
STRING2: 
		;MOV	A,@0XCA 
		;MOV	INCRE,A 
		CLR	INCRE 
		MOV	A,@0X06 
		MOV	CMD_SELECT,A 
		MOV	A,@0X22 
		MOV	DATA_MAX,A 
		MOV	A,BYTE6 
		MOV	PC_WANT,A 
		BS	 TRANSFER,0 
		JMP	INT_RET 
END1: 
		BC	RC,7 
		BS	RC,6 
		BC	RF,1 
		JMP	MAIN 
FINISH: 
		BC	RC,7 
		BS	RC,6 
		BC	RF,1 
		BC	TRANSFER,0 
		JMP	MAIN 
		 
REPORT: 
		BS	 RC,7 
		JBS	RC,1 
		JMP	REPORT_INITIAL	     
		BC	 RC,7 
		JMP	MAIN 
REPORT_INITIAL:	;CLEAR POINTER AND COUNTER 
		MOV	A,@0X10 
		MOV	RD,A 
		CLR	RE 
		CLR	RD 
REPORT_START: 
		CLRA 
		XOR	A,DATA_MAX 
		JBC	STATUS,2 
		JMP	FINISH 
		MOV	A,@0X08 
		MOV	PACK_MAX,A 
		CLR	RD 
REPORT_LOOP: 
		;MOV	A,INCRE 
		;CALL	LIST 
		MOV	A,CMD_SELECT 
		TBL 
		NOP 
		JMP	DEVICEL 
		JMP	CONFIGL 
		JMP	HIDL 
		JMP	STRING0L 
		JMP	STRING1L 
		JMP	STRING2L 
DEVICEL: 
		MOV	A,INCRE 
		CALL	DEVICE_TABLE 
		JMP	LOOP 
CONFIGL: 
		MOV	A,INCRE 
		CALL	CONFIG_TABLE 
		JMP	LOOP 
HIDL: 
		MOV	A,INCRE 
		CALL	HID_TABLE 
		JMP	LOOP 
STRING0L: 
		MOV	A,INCRE 
		CALL	STRING0T 
		JMP	LOOP 
STRING1L: 
		MOV	A,INCRE 
		CALL	STRING1T 
		JMP	LOOP 
STRING2L: 
		MOV	A,INCRE 
		CALL	STRING2T 
		JMP	LOOP 
 
LOOP: 
		MOV	RE,A 
		INC	INCRE 
		DEC	PC_WANT 
		CLRA 
		XOR	A,PC_WANT 
		JBC	STATUS,2 
		JMP	FINISH 
		DJZ	PACK_MAX 
		JMP	P1 
		DEC	DATA_MAX 
		JMP	END1 
P1:	 
		DEC	DATA_MAX 
		CLRA	 
		XOR	A,DATA_MAX 
		JBC	STATUS,2 
		JMP	FINISH 
		JMP	REPORT_LOOP 
 
 
 
;----------------------------------------------------------- 
;	START OF SCAN BTM 
;-----------------------------------------------------------		 
SCAN: 
			MOV	A,PORT6 
			OR	A,@0X01 
			MOV	PORT6_STATE,A 
			MOV	A,PORT7 
			;AND	A,@0X0F 
			MOV	PORT7_STATE,A 
			MOV	A,PORT6_STATE 
			XOR	A,PORT6_TEMP 
			JBS	STATUS,2 
			JMP	DATA_CHANGE 
			MOV	A,PORT7_STATE 
			XOR	A,PORT7_TEMP 
			JBS	STATUS,2 
			JMP	DATA_CHANGE 
NON_CHANGE: 
			CALL	TURBO 
			RET 
DATA_CHANGE: 
			CLR	BTM_DATA 
			CLR	BTM_DATA2 
			CLR	CHECKPOINT 
			MOV	A,@0X80 
			MOV	X_DATA,A 
			MOV	Y_DATA,A 
			JBS	PORT7_STATE,4	;BTM 9 
			BS	BTM_DATA2,0	 
			JBS	PORT7_STATE,6	;BTM 10 
			BS	BTM_DATA2,1	 
			JBS	PORT6_STATE,0	;BTM 8 
			BS	 BTM_DATA,7 
			JBS	PORT6_STATE,5	;BTM 4 
			BS	 BTM_DATA,3 
			JBS	PORT6_STATE,2	;BTM 7 
			BS	 BTM_DATA,6 
			JBS	PORT6_STATE,4	;BTM 6 
			BS	 BTM_DATA,5 
			JBS	PORT6_STATE,1	;BTM 3 
			BS	 BTM_DATA,2 
			JBS	PORT6_STATE,6	;BTM 1 
			BS	 BTM_DATA,0 
			JBS	PORT6_STATE,7	;BTM 2 
			BS	 BTM_DATA,1 
			JBS	PORT7_STATE,1	;BTM 5 
			BS	 BTM_DATA,4 
			;test TURBO 
			JBS	PORT7_STATE,5	;TURBO SET 
			BS	CHECKPOINT,0 
			JBS	PORT7_STATE,7	;TURBO	CLR 
			BS	CHECKPOINT,1 
			 
			MOV	A,BTM_DATA 
			MOV	TMP_DATA,A 
			MOV	A,BTM_DATA2 
			MOV	TMP_DATA2,A			 
 
TURBO_SET_CHECK: 
			JBS	CHECKPOINT,0 
			JMP	CLR_CHECK 
			MOV	A,BTM_DATA 
			OR	REP_DATA,A 
			MOV	A,BTM_DATA2 
			OR	REP_DATA2,A 
			 
CLR_CHECK: 
			JBS	CHECKPOINT,1 
			JMP	GOTURBO 
			MOV	A,BTM_DATA 
			XOR	A,REP_DATA 
			AND	REP_DATA,A 
			MOV	A,BTM_DATA2 
			XOR	A,REP_DATA2 
			AND	REP_DATA2,A 
GOTURBO: 
			BS	TRANSFER,3 
			CALL	TURBO 
			BC	TRANSFER,3 
						 
U_D_SCAN:			 
			;UP DOWN SCAN 
			JBS	PORT6_STATE,3 
			JMP	UP 
			JBS	PORT7_STATE,2 
			JMP	DOWN 
			MOV	A,@0X80 
			MOV	Y_DATA,A 
			;LEFT RIGHT SCAN 
R_L_SCAN: 
			JBS	PORT7_STATE,0 
			JMP	RIGHT 
			JBS	PORT7_STATE,3 
			JMP	LEFT 
			MOV	A,@0X80 
			MOV	X_DATA,A 
			JMP	RELOAD 
UP: 
			CLR	Y_DATA 
			JMP	R_L_SCAN 
DOWN: 
			MOV	A,@0XFF 
			MOV	Y_DATA,A 
			JMP	R_L_SCAN 
RIGHT: 
			MOV	A,@0XFF 
			MOV	X_DATA,A 
			JMP	RELOAD 
LEFT: 
			CLR	X_DATA 
			JMP	RELOAD 
						 
TURBO: 
			MOV	A,0X03 
			AND	REP_DATA2,A 
			CLRA 
			XOR	A,REP_DATA2 
			JBS	STATUS,2 
			JMP	REPEAT 
			CLRA 
			XOR	A,REP_DATA 
			JBC	STATUS,2 
			RET	 
REPEAT: 
/* 
			INC	TMP_DATA			                                           					 
REPEAT_8: 
			JBC	PORT6_STATE,0 
			JMP	REPEAT_4 
			JBS	REP_DATA,7 
			JMP	REPEAT_4 
			BS	BTM_DATA,7 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,7 
REPEAT_4: 
			JBC	PORT6_STATE,5 
			JMP	REPEAT_7 
			JBS	REP_DATA,3 
			JMP	REPEAT_7 
			BS	BTM_DATA,3 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,3 
REPEAT_7: 
			JBC	PORT6_STATE,2 
			JMP	REPEAT_6 
			JBS	REP_DATA,6 
			JMP	REPEAT_6 
			BS	BTM_DATA,6 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,6 
REPEAT_6: 
			JBC	PORT6_STATE,4 
			JMP	REPEAT_3 
			JBS	REP_DATA,5 
			JMP	REPEAT_3 
			BS	BTM_DATA,5 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,5 
REPEAT_3: 
			JBC	PORT6_STATE,1 
			JMP	REPEAT_1 
			JBS	REP_DATA,2 
			JMP	REPEAT_1 
			BS	BTM_DATA,2 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,2 
REPEAT_1: 
			JBC	PORT6_STATE,6 
			JMP	REPEAT_2 
			JBS	REP_DATA,0 
			JMP	REPEAT_2 
			BS	BTM_DATA,0 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,0 
REPEAT_2: 
			JBC	PORT6_STATE,7 
			JMP	REPEAT_5 
			JBS	REP_DATA,1 
			JMP	REPEAT_5 
			BS	BTM_DATA,1 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,1 
REPEAT_5: 
			JBC	PORT7_STATE,1 
			JMP	REPEAT_9 
			JBS	REP_DATA,4 
			JMP	REPEAT_9 
			BS	BTM_DATA,4 
			JBS	TMP_DATA,0 
			BC	BTM_DATA,4 
 
REPEAT_9: 
			JBC	PORT7_STATE,4 
			JMP	REPEAT_10 
			JBS	REP_DATA2,0 
			JMP	REPEAT_10 
			BS	BTM_DATA2,0 
			JBS	TMP_DATA,0 
			BC	BTM_DATA2,0 
REPEAT_10: 
			JBC	PORT7_STATE,6 
			JMP	RELOAD 
			JBS	REP_DATA2,1 
			JMP	RELOAD 
			BS	BTM_DATA2,1 
			JBS	TMP_DATA,0 
			BC	BTM_DATA2,1	 
*/ 
			MOV	A,BTM_DATA	 
			MOV	TCTEMP,A 
			MOV	A,TMP_DATA	;CHECK BITS WHICH R PRESSED AND WANNA REPEATED 
			AND	A,REP_DATA	 
			XOR	BTM_DATA,A;	;LET TURBO KEY 0->1, 1->0 
			MOV	A,BTM_DATA 
			XOR	A,TCTEMP	;IF NOW BTM_STATUS IS THE SAME AS LAST BTM_STATUS ,IT WILL NOT SEND DATA 
			JBC	STATUS,2 
			RET 
			MOV	A,TMP_DATA2 
			AND	A,REP_DATA2 
			XOR	BTM_DATA2,A 
			 
						 
			JBC	TRANSFER,3	;NONCHANGE STATUS GO TO RELOAD 
			RET			;RETURN KEY-CHANGED LOOP, CHECK UP DOWN RRIGHT LEFT      
;----------------------------------------------------------- 
;	END OF SCAN BTM 
;----------------------------------------------------------- 
 
;====================================================================== 
;	END OF SCAN 
;====================================================================== 
 
;==================================================== 
;	START OF RELOAD 
;==================================================== 
 
RELOAD: 
		MOV	A,PORT6_STATE 
		MOV	PORT6_TEMP,A 
		MOV	A,PORT7_STATE 
		MOV	PORT7_TEMP,A 
		 
		MOV	A,@0X01 
		MOV	RD,A 
		MOV	A,X_DATA 
		MOV	RE,A 
		MOV	A,Y_DATA 
		MOV	RE,A 
	    	MOV	A,BTM_DATA 
	    	MOV	RE,A 
	    	MOV	A,BTM_DATA2 
		MOV	RE,A 
		BS	 RC,5 
		 
RETURN: 
		RET 
         
;===================================================================== 
;	END OF RELOAD 
;===================================================================== 
 
		 
DELAY_22: 
        JMP     DELAY_20 
DELAY_20: 
        JMP     DELAY_18 
DELAY_18: 
        JMP     DELAY_16 
DELAY_16: 
        JMP     DELAY_14 
DELAY_14: 
        JMP     DELAY_12 
DELAY_12: 
        JMP     DELAY_10 
DELAY_10: 
        JMP     DELAY_08 
DELAY_08: 
        JMP     DELAY_06 
DELAY_06: 
        JMP     DELAY_04 
DELAY_04: 
        JMP     DELAY_02 
DELAY_02: 
        RET 
         
DELAY: 
        MOV     TEMP,A 
DELY: 
		DJZ     TEMP 
        JMP     DELY 
        RET 
 
DMS: 
        MOV     TEMP1,A 
        CLR     TEMP 
         
M647: 
        JMP     M648 
M648: 
        JMP     M649 
M649: 
        DJZ     TEMP 
        JMP     M647 
        DJZ     TEMP1 
        JMP     M647 
        RETL    @0X00 
         
CLRRAMU: 
		CLR	0X10 
		MOV	A,@0X2F 
		MOV	0X10,A 
		MOV	A,@0X11 
		MOV	RSR,A 
CLRLOOPU: 
		CLR	R0 
		INC	RSR 
		DJZ	0X10 
		JMP	CLRLOOPU 
		CLR	RSR 
		RET 
 
		EOP