⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 offickbd.asm

📁 以台湾CHESEN公司的CSC0108实现多媒体USB键盘的功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	STA	KSC_P3OUT
	PLA
	RTS
	
;============================================================
;write the columns with the next pattern in the keyboard scan
;
;============================================================
KSC_NEXTPATTERN:
	PHA
	SEC
	LDA	KSC_P0OUT
	ROLA
	STA	KSC_P0OUT
	STA	PORT0
	
	LDA	KSC_P1OUT
	ROLA
	STA	KSC_P1OUT
	STA	PORT1
	
	LDA	KSC_P3OUT
	ROLA
	STA	KSC_P3OUT
	STA	PORT3
	PLA
	RTS

;============================================================
;A column had one or more button that changed state (up to 
;down or down to up),scan the rows to find out which one(S) 
;changed.
;============================================================
;*******************KSC_KEYCHANGED(X)////X-->Column number*******************
;****************************************************************************
KSC_KEYCHANGED:
	PHA
	STZ	KSC_Y_INDEX
	LDA	KSC_CHANGES
	JSR	REPEAT_KEY_CHECK
ONLY_ONE_KEY:
	LDA	#1H
	CLC
ROW_LOOP:
	PHA
	AND	KSC_CHANGES
	BEQ	NEXT_ROW
	JSR	KSC_FOUNDKEY
NEXT_ROW:
	INC	KSC_Y_INDEX
	PLA
	CLC
	ROLA
	BCC	ROW_LOOP
DONE_KEYCHANGED:
	PLA
	RTS

POSITION_1_TABLE:
	DB	1,2,4,8,10H,20H,40H,80H
;=============================================================
REPEAT_KEY_CHECK:
	PHA
	PHX
	LDX	#00H
ROW_LOOP_REPEAT:
	LDA	POSITION_1_TABLE,X
	INX
	AND	KSC_CHANGES
	BEQ	ROW_LOOP_REPEAT
	STA	KSC_CHANGES
	PLX
	PLA
	RTS
;=============================================================
;We have a key identified by an ksc_x_index and a ksc_y_index
;combine the two into a single index and lookup the keycode,
;check if up or down change.
;=============================================================
;*****KSC_FOUNDKEY(A,X,KSC_Y_INDEX)/A-->SCANCODEposition,||X-->COLUMN NUMBER
;*************KSC_Y_INDEX--->ROW NUMBER*****************************
;*************KSC_X_INDEX--->COLUMN COUNTE**************************
;*******************************************************************
KSC_FOUNDKEY:
	STX	KSC_MATRIX_ADDR
	PHA
	AND	KSC_IMAGE,X			;see whether up or down change
						;key up
	BNE	CALC_MATRIX
	LDA	#0FFH
	JMP	KEYDOWNHAPPEN				;key down
CALC_MATRIX:
	LDA	#00H					;;==0 key up
KEYDOWNHAPPEN:
	STA	KSC_DOWN_UP
	LDX	KSC_MATRIX_ADDR
	LDA	KSC_X_INDEX			;COLUMN*8
	ASLA				
	ASLA
	ASLA
	CLC
	ADC	KSC_Y_INDEX			;Sure key position
	STA	KSC_MATRIX_ADDR			;Store key position
	CMP	#00H
	BNE	NON0ADDR
	LDA	#FEH
NON0ADDR:
	JSR	KSC_DEBOUNCE_TEST		;Check if debounce in progress on this key
	BNE	UPDATE_IMAGE
	JMP	DONE_FOUNDKEY
UPDATE_IMAGE:
	PLA
	PHA
	EOR	KSC_IMAGE,X
	STA	KSC_IMAGE,X			;Update key switch ksc_image		
	JSR	KSC_DEBOUNCE_KEYS		;push matrix address on debounce array
	LDA	KSC_MATRIX_ADDR
	TAX
	LDA	AT101_TBL,X
	
;;#######################################################
;;CHECK KEYVALUE'S FUNCTION PROCESS KEY FUNCTION	
	
	STA	TEMP_R	
	LDA	MARK_FLAGS
	CMP	#FFH
	BNE	NON_MARK_KEY
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BEQ	KEY_DOWN_NON_UP
	STZ	MARK_FLAGS
	JMP	EXIT_SEND_0
KEY_DOWN_NON_UP:	
	JMP	EXIT_SEND_01

NON_MARK_KEY:	
	LDA	TEMP_R	
	CMP	#ATOFFICEKBD_FN
	BNE	NON_FN_KEY_CHANGE		;IF KEY IS FN DOWN,SET FN_KEY_FLAGS=#FFH
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BNE	FN_KEY_UP
	LDA	#FFH
	STA	FN_KEY_FLAGS
	JMP	FN_KEY_FLAG_SET_OVER
FN_KEY_UP:
	STZ	FN_KEY_FLAGS			;IF FN UP,CLEAR FN_KEY_FLAGS=0
FN_KEY_FLAG_SET_OVER:
	JMP	DONE_FOUNDKEY
		
NON_FN_KEY_CHANGE:
	LDA	FN_KEY_FLAGS
	CMP	#FFH
	BNE	FN_KEY_NOT_PRESS
	LDA	TEMP_R
	CMP	#AT101KB_ESCAPE
	BNE	NOT_FN_ESC_KEY
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BNE	NOT_FN_ESC_KEY
	LDA	MM_LED_FLAGS		;;PROCESS FN+ESC KEY PRESSED: NO SEND CODE MEDIU LED LAMP
	EOR	#FFH
	STA	MM_LED_FLAGS
	CMP	#FFH
	BNE	MMLED_OVER
	RMB3	LED
	JMP	DONE_FOUNDKEY
MMLED_OVER:
	SMB3	LED						;MM_LED
	JMP	DONE_FOUNDKEY
NOT_FN_ESC_KEY:

	CMP	#ATOFFICEKBD_FN_SLEEP				;;FN+SLEEP
	BNE	FN_WAKE_KEY
	LDA	#AT101KB_SLEEP
	STA	TEMP_R
	JMP	FN_KEY_NOT_PRESS
FN_WAKE_KEY:
	CMP	#ATOFFICEKBD_FN_WAKE				;;FN+WAKE
	BNE	FN_PORWER_KEY
	LDA	#AT101KB_WAKE
	STA	TEMP_R
	JMP	FN_KEY_NOT_PRESS
FN_PORWER_KEY:
	CMP	#ATOFFICEKBD_FN_POWER				;;FN+POWER
	BNE	FN_KEY_NOT_PRESS
	LDA	#AT101KB_POWER
	STA	TEMP_R	
FN_KEY_NOT_PRESS:
	LDA	TEMP_R
	CMP	#ATOFFICEKBD_FN_SLEEP
	BEQ	NOT_PROCESS_POWER
	CMP	#ATOFFICEKBD_FN_WAKE
	BEQ	NOT_PROCESS_POWER
	CMP	#ATOFFICEKBD_FN_POWER
	BEQ	NOT_PROCESS_POWER
	JMP	OTHERKEY_PROCESS
NOT_PROCESS_POWER:
	JMP	DONE_FOUNDKEY
OTHERKEY_PROCESS:	

	LDA	TEMP_R						;;APP +  ESC KEY CHECK
	CMP	#AT101KB_APPLICATION
	BNE	NOT_APP_KEY
	LDA	APP_PRESS_FLAGS	
	EOR	#FFH
	STA	APP_PRESS_FLAGS
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BNE	APP_UP_STATE
	;SMB0	APP_ESC_STATE
	;RMB1	APP_ESC_STATE
	JMP	NOT_APP_KEY
APP_UP_STATE:
	BBR4	APP_ESC_STATE,NOT_APP_KEY
	SMB1	APP_ESC_STATE
	RMB0	APP_ESC_STATE
NOT_APP_KEY:
	LDA	APP_PRESS_FLAGS
	CMP	#FFH
	BNE	APP_KEY_NOT_PRESS
	LDA	TEMP_R						;;AFTER APP KEY PRESS PROCESS
	CMP	#AT101KB_ESCAPE
	BNE	APP_KEY_NOT_PRESS
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BNE	ESC_KEY_UP
	
	LDA	MM_LED_FLAGS		;PROCESS APP+ESC KEY PRESSED: 
					;NO SEND CODE MEDIU LED LAMP
	EOR	#FFH
	STA	MM_LED_FLAGS					;;MM_LED
	CMP	#FFH
	BNE	MMLED_APP_OVER
	RMB3	LED
	JMP	OK_MMLED_LAMP
MMLED_APP_OVER:
	SMB3	LED
OK_MMLED_LAMP:		

	SMB4	APP_ESC_STATE
	JMP	DONE_FOUNDKEY
ESC_KEY_UP:
	SMB3	APP_ESC_STATE
	RMB2	APP_ESC_STATE
	JMP	DONE_FOUNDKEY
APP_KEY_NOT_PRESS:
	LDA	TEMP_R
	CMP	#AT101KB_ESCAPE
	BNE	NON_ESC_KEY
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BEQ	NON_ESC_KEY
	BBR4	APP_ESC_STATE,NON_ESC_KEY
	SMB3	APP_ESC_STATE
	RMB2	APP_ESC_STATE
NON_ESC_KEY:	
	LDA	MM_LED_FLAGS
	CMP	#FFH
	BNE	NON_MMKEY
	LDA	TEMP_R
	JSR	FN_KEY_PROCESS
NON_MMKEY:
;;\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
	
	
	LDA	TEMP_R
	LDX	#0
COMBIN_KEY:						;;find combination key
	CMP	COMBINATION_KEY,X
	BEQ	FIND_COMBIN_KEY
	INX
	CPX	#END_COMBINATION_KEY-COMBINATION_KEY
	BNE	COMBIN_KEY
	JMP	NON_COMBIN_KEY
FIND_COMBIN_KEY:	
	CMP	#AT101KB_ESCAPE
	BEQ	NON_COMBIN_KEY
	PHA
	CMP	#ATOFFICEKBD_K3
	BNE	SET_TIMER_CONST_16MS
	LDA	#25
	STA	TIMER_CONST
	JMP	TIMER_CONST_100MS_OVER
SET_TIMER_CONST_16MS:
	LDA	#4
	STA	TIMER_CONST
TIMER_CONST_100MS_OVER:	
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BNE	SEND_0_COMBBUFFER
	LDA	COMBINATION_PARAM,X
	STA	COMB_PARAM
	LDA	COMBINATION_SPACE,X
	STA	COMB_POINT
						;PROCESS COMBINATION KEY
	PLA
	CMP	#ATOFFICEKBD_K8
	BNE	NON_K8_KEY
	BBR1	LED_REG,NON_K8_KEY
	CLC
	LDA	COMB_PARAM
	ADC	#3
	STA	COMB_PARAM
	LDA	COMB_POINT
	CLC
	SBC	#16
	LDA	#168
	STA	COMB_POINT
	;LDA	#20
	;STA	TIMER_CONST
NON_K8_KEY:
	
	JMP	DONE_FOUNDKEY
SEND_0_COMBBUFFER:	
	PLA
	LDA	TEMP_R
	CMP	#ATOFFICEKBD_K7
	BNE	EXIT_SEND_0
	LDA	KSC_DOWN_UP
	CMP	#FFH
	BNE	EXIT_SEND_01
	LDA	#FFH
	STA	MARK_FLAGS
	JMP	EXIT_SEND_01
EXIT_SEND_0:
	LDA	#4
	STA	TIMER_CONST
	LDA	#K00-COMBINATION_INDEX
	STA	COMB_POINT
	LDA	#1
	STA	COMB_PARAM
EXIT_SEND_01:
	JMP	DONE_FOUNDKEY
NON_COMBIN_KEY:
	BBR4	APP_ESC_STATE,NON_APP_ESC_DOWN
	BBR3	APP_ESC_STATE,NON_APP_ESC_DOWN
	BBR1	APP_ESC_STATE,NON_APP_ESC_DOWN
	LDA	#4
	STA	TIMER_CONST
	LDA	#2
	STA	COMB_PARAM
	STZ	COMB_POINT
	STZ	APP_ESC_STATE
	LDA	#4
	STA	TIMER_COUNT
	;JMP	DONE_FOUNDKEY
NON_APP_ESC_DOWN:

	LDA	TEMP_R					;;PROCESS STANDARD KEY
	JSR	USBKEY_PUTKEY
DONE_FOUNDKEY:
	PLA
	RTS

COMBINATION_KEY:
	DB	AT101KB_ESCAPE
	DB	ATOFFICEKBD_K1,ATOFFICEKBD_K2,ATOFFICEKBD_K3,ATOFFICEKBD_K4
	DB	ATOFFICEKBD_K5,ATOFFICEKBD_K6,ATOFFICEKBD_K33,ATOFFICEKBD_K34
	DB	ATOFFICEKBD_K7,ATOFFICEKBD_K8
END_COMBINATION_KEY:

COMBINATION_INDEX:
	DB	00,00,29H,00,00,00,00,00		;;ESCAPE
	DB	00,00,00,00,00,00,00,00
		
	DB	04,00,00,00,00,00,00,00			;K1
	DB	04,00,2BH,00,00,00,00,00
	
	DB	04,00,00,00,00,00,00,00			;K2
	DB	04,00,3DH,00,00,00,00,00
	
	DB	08,00,00,00,00,00,00,00			;K3
	DB	00,00,00,00,00,00,00,00
	DB	00,00,0FH,00,00,00,00,00
	DB	00,00,00,00,00,00,00,00
	
	DB	02,00,00,00,00,00,00,00			;K4
	DB	02,00,4CH,00,00,00,00,00
	
	DB	02,00,00,00,00,00,00,00			;K5
	DB	02,00,49H,00,00,00,00,00
	
	DB	01,00,00,00,00,00,00,00			;K6
	DB	01,00,49H,00,00,00,00,00
	
	DB	00,00,28H,00,00,00,00,00		;K33
	DB	04,00,28H,00,00,00,00,00
	
	DB	04,00,00,00,00,00,00,00			;K34
	DB	04,00,2AH,00,00,00,00,00
	
	
	DB	02,00,00,00,00,00,00,00			;K7
	
	DB	00,00,53H,00,00,00,00,00
	DB	00,00,00,00,00,00,00,00
	DB	04,00,00,00,00,00,00,00			;EUROPE
	DB	04,00,59H,00,00,00,00,00
	DB	04,00,00,00,00,00,00,00
	DB	04,00,5AH,00,00,00,00,00
	DB	04,00,00,00,00,00,00,00
	DB	04,00,60H,00,00,00,00,00	
	DB	00,00,53H,00,00,00,00,00

K00:	
	DB	00,00,00,00,00,00,00,00			;K0
	DB	00,00,00,00,00,00,00,00
	DB	00,00,00,00,00,00,00,00
	
COMBINATION_PARAM:
	DB	2
	db	2,2,4,2
	db	2,2,2,2
	db	1,6
COMBINATION_SPACE:
	DB	0
	DB	16,32,48,80
	DB	96,112,128,144
	DB	160,184

;;===========================================================================
COMBINPROCESS:
	PHA
	PHX
	LDA	TIMER_COUNT
	CMP	#00
	BNE	NO_DATA_TRANS
	LDA	COMB_PARAM
	CMP	#00H
	BEQ	NO_DATA_TRANS
	LDA	COMB_POINT
	TAX
	LDY	#00H
	STZ	TXCNT1
COPY_DATA_TO_USBBUFFER:
	LDA	COMBINATION_INDEX,X
	STA	TXDAT1
	INX
	INY
	CPY	#8
	BNE	COPY_DATA_TO_USBBUFFER
	JSR	OUT_EP1_DATA
	STX	COMB_POINT
	DEC	COMB_PARAM
	LDA	TIMER_CONST
	STA	TIMER_COUNT	

NO_DATA_TRANS:
	PLX
	PLA
	RTS
;;==============================

;=============================================================
;quick and dirty routine to count the number of 1's in a byte
;the table below gives the number of 1's in the nibble from 
;0--15
;=============================================================

ONES_TABLE:
	DB	0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4
	

COUNT_ONES:
	PHX
	PHA
	AND	#0FH
	TAX
	LDA	ONES_TABLE,X
	STA	KSC_WORK
	PLA
	LSRA
	LSRA
	LSRA
	LSRA
	AND	#0FH
	TAX

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -