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

📄 offickbd.asm

📁 以台湾CHESEN公司的CSC0108实现多媒体USB键盘的功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
	LDA	ONES_TABLE,X
	CLC
	ADC	KSC_WORK
	PLX
	RTS

;=============================================================
;phantom key detection routin
;=============================================================

CHECK_PHANTOM:
	LDA	KSC_ROW_HITS
	JSR	COUNT_ONES
	CMP	KSC_COL_HITS
	BCS	SKIP
	LDA	KSC_COL_HITS
SKIP:
	CMP	KSC_KEY_COUNT
	BCS	EXITCHECK1
	CLC
	JMP	EXITCHECK
EXITCHECK1:
	SEC
EXITCHECK:	
	RTS

;============================================================
;Test debounce fifo to see if matrix address is still in it
;if not, exit with zero flag set
;============================================================
KSC_DEBOUNCE_TEST:
	PHA
	PHX
	LDX	#00H		;#DEBOUNCE_ARRAY_SIZE
DB_LOOP:
	CMP	KSC_DB_KEYS,X
	BEQ	DB_EXIT
	INX
	CPX	#DEBOUNCE_ARRAY_SIZE
	BNE	DB_LOOP
	CPX	#0FFH
DB_EXIT:
	PLX
	PLA
	RTS

;============================================================
;Put matrix address in A onto debounce array
;============================================================
;********KSC_DEBOUNCE_KEYS(MATRIX_ADDRESS,KSC_DOWN_UP)******
KSC_DEBOUNCE_KEYS:
	PHX
	PHA
	LDX	#00H			;#DEBOUNCE_ARRAY_SIZE
FIND_FREE_DEBOUNCE_LOCATION:
	LDA	KSC_DB_KEYS,X
	CMP	#0FFH
	BEQ	START_KEY_DEBOUNCE
	INX
	CPX	#DEBOUNCE_ARRAY_SIZE
	BNE	FIND_FREE_DEBOUNCE_LOCATION
	JMP	DB_KEYS_END
START_KEY_DEBOUNCE:
	LDA	KSC_MATRIX_ADDR
	STA	KSC_DB_KEYS,X
	LDA	KSC_DOWN_UP
	CMP	#00H
	BEQ	DEBOUNCE_KEY_RELEASE
	LDA	#DEBOUNCE_PRESS_TIME
	STA	KSC_DB_COUNTS,X
	JMP	DB_KEYS_END
DEBOUNCE_KEY_RELEASE:
	LDA	#DEBOUNCE_RELEASE_TIME
	STA	KSC_DB_COUNTS,X
DB_KEYS_END:
	PLA
	PLX
	RTS

;======================================================
;Decrement the time constant in the counter array
;======================================================
KSC_DEBOUNCE_TASK:
	PHX
	PHA
	LDX	#00H			;#DEBOUNCE_ARRAY_SIZE	
DEBOUNCE_CHECK:
	LDA	KSC_DB_KEYS,X
	CMP	#0FFH
	BEQ	NEXT_VALUE_PROCESS
	LDA	KSC_DB_COUNTS,X
	DEC	A
	STA	KSC_DB_COUNTS,X
	BNE	NEXT_VALUE_PROCESS
	LDA	#0FFH
	STA	KSC_DB_KEYS,X
NEXT_VALUE_PROCESS:
	INX
	CPX	#DEBOUNCE_ARRAY_SIZE
	BNE	DEBOUNCE_CHECK
	PLA
	PLX
	RTS

;==================================================================================
;FUNCTION:	USBKEYPUTKEY
;Handles key presses in usb environment.
;this function is called form within the key scanning loop,each time a valid key 
;event has been recognized .a key event is defined as whenever
;==================================================================================
;///////////////////////////USBKEY_PUTKEY(A)//A-->KEY POSITION AT AT-TABLE
USBKEY_PUTKEY:
	JSR	USB_ALTERNATE_KEY
	BCS	DONE_PUTKEY
	JSR	KSC_MODIFIER
	BCC	NON_MODIFIERS
	LDA	#1H
	STA	USB_TX_FLAGS
	JMP	DONE_PUTKEY
NON_MODIFIERS:
	PHX
	TAX
	LDA	USB_USAGE_TABLE,X
		
	PHA
	LDA	#1H
	STA	USB_TX_FLAGS
	LDA	KSC_DOWN_UP
	CMP	#00H			;;=0 is key release
	BNE	ADD_KEY_TO_BUFFER	;;=FFH is key down

REMOVE_KEY_FROM_BUFFER:
	LDA	USB_KEY_COUNT
	CMP	#00H
	BEQ	SKIP_DECREMENT_KEY_COUNT
	DEC	USB_KEY_COUNT
SKIP_DECREMENT_KEY_COUNT:
	LDX	#2
FIND_KEY_IN_BUFFER:
	PLA
	PHA
	CMP	USB_REPORT_BUFFER,X
	BEQ	CLEAR_BUFFER_POSITION
	INX
	TXA
	CMP	#8H
	BNE	FIND_KEY_IN_BUFFER
	PLA
	JMP	NON_MODIFIERS_DONE
CLEAR_BUFFER_POSITION:
	PLA
	LDA	#00H
	STA	USB_REPORT_BUFFER,X	
	JMP	NON_MODIFIERS_DONE
ADD_KEY_TO_BUFFER:
	LDA	USB_KEY_COUNT
	CMP	#FFH
	BEQ	SKIP_INCREMENT_KEY_COUNT
	INC	USB_KEY_COUNT
SKIP_INCREMENT_KEY_COUNT:
	LDX	#2

FIND_FREE_BUFFER_POSITION:
	LDA	#00H
	CMP	USB_REPORT_BUFFER,X
	BEQ	PUT_KEY_IN_BUFFER_POSITION
	INX
	TXA
	CMP	#8H
	BNE	FIND_FREE_BUFFER_POSITION

BUFFER_FULL_ERR:
	PLA
	JMP	NON_MODIFIERS_DONE
PUT_KEY_IN_BUFFER_POSITION:
	PLA
	STA	USB_REPORT_BUFFER,X
NON_MODIFIERS_DONE:
	PLX
DONE_PUTKEY:
	RTS

;=====================================================================
FN_NOT_PRESS_TABLE:
	DB	AT101KB_F2,AT101KB_F3,AT101KB_F4,AT101KB_F5
	DB	AT101KB_F6,AT101KB_F8,AT101KB_F9,AT101KB_F10
	DB	AT101KB_F11,AT101KB_F12,AT101KB_PRINTSCREEN,AT101KB_SCROLL_LOCK,AT101KB_PAUSE

FN_PRESSED_TABLE:
	DB	ATOFFICEKBD_K21,ATOFFICEKBD_K22,ATOFFICEKBD_K23,ATOFFICEKBD_K24
	DB	ATOFFICEKBD_K25,ATOFFICEKBD_K27,ATOFFICEKBD_K28,ATOFFICEKBD_K29
	DB	ATOFFICEKBD_K30,ATOFFICEKBD_K31,ATOFFICEKBD_K32,ATOFFICEKBD_K33,ATOFFICEKBD_K34

FN_KEY_PROCESS:
	PHA
	PHX
	LDX	#00H
FIND_FN_PROCESS_KEY:
	LDA	FN_NOT_PRESS_TABLE,X
	CMP	TEMP_R
	BEQ	IS_FN_KEY_TABLE
	INX
	CPX	#FN_PRESSED_TABLE-FN_NOT_PRESS_TABLE
	BNE	FIND_FN_PROCESS_KEY
	JMP	EXIT_FN_KEY
IS_FN_KEY_TABLE:
	LDA	FN_PRESSED_TABLE,X
	STA	TEMP_R
EXIT_FN_KEY:
	PLX
	PLA
	LDA	TEMP_R
	RTS

;======================================================================
MOD_KEY_TABLE:
	DB	AT101KB_LEFTCTRL,	AT101KB_LEFTSHIFT
	DB	AT101KB_LEFTALT,	AT101KB_LEFTGUI
	DB	AT101KB_RIGHTCTRL,	AT101KB_RIGHTSHIFT
	DB	AT101KB_RIGHTALT,	AT101KB_RIGHTGUI
;	DB	AT101KB_APPLICATION

MOD_BIT_TABLE:
	DB	LEFT_CTRL_BIT,	LEFT_SHIFT_BIT
	DB	LEFT_ALT_BIT,	LEFT_GUI_BIT
	DB	RIGHT_CTRL_BIT,	RIGHT_SHIFT_BIT
	DB	RIGHT_ALT_BIT,	RIGHT_GUI_BIT
;	DB	APP_BIT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;currently we are not counting the application key as a modifer key.
;so there are only 8 modifiers.
NUM_MODIFIERS	EQU	8

KSC_MODIFIER:
	PHX
	PHA
MOD_LP0:
	STA	KSC_WORK
	LDX	#0
MOD_LP1:	
	LDA	MOD_KEY_TABLE,X
	CMP	KSC_WORK
	BEQ	MOD_LP2
	INX
	CPX	#NUM_MODIFIERS
	BEQ	NON_MODIFIER
	JMP	MOD_LP1
MOD_LP2:
	LDA	MOD_BIT_TABLE,X
	LDX	KSC_DOWN_UP
	CPX	#00H
	BEQ	MOD0_UP
	ORA	USB_REPORT_BUFFER
	STA	USB_REPORT_BUFFER	
	JMP	MOD_DONE_PUTKEY
MOD0_UP:
	EOR	#FFH
	AND	USB_REPORT_BUFFER
	STA	USB_REPORT_BUFFER	
MOD_DONE_PUTKEY:
	SEC
EXITMODIFIER:
	PLA
	PLX
	RTS
NON_MODIFIER:
	CLC
	JMP	EXITMODIFIER	


;================================================================================
;========================================================================
;tables for alternate keys

;lookup table for special keys.  The keys in this table
;are treated differently.
ALT_KEY_TABLE:
;1
    	db      AT101KB_SLEEP,	AT101KB_POWER,	AT101KB_WAKE
;2  	
	db	AT101KB_MUTE,	AT101KB_VOL_INC,AT101KB_VOL_DEC,AT101KB_PLAY_PAUSE
	db	AT101KB_STOP,	AT101KB_SCAN_PREV,AT101KB_SCAN_NEXT,AT101KB_EMAIL
;3	
	db	AT101KB_CALCULATOR,AT101KB_WWW_SEARCH,AT101KB_WWW_HOME,AT101KB_WWW_FAVORITES
	db	AT101KB_MYCOMPUTER,AT101KB_WWW_BACK,AT101KB_WWW_FORWARD,AT101KB_WWW_STOP
;4	
	db	AT101KB_WWW_REFRESH,AT101KB_MEDIA_SELECT,ATOFFICEKBD_K9,ATOFFICEKBD_K10
	DB	ATOFFICEKBD_K11,ATOFFICEKBD_K12,ATOFFICEKBD_K13,ATOFFICEKBD_K14
;5	
	DB	ATOFFICEKBD_K15,ATOFFICEKBD_K16,ATOFFICEKBD_K17,ATOFFICEKBD_K18
	DB	ATOFFICEKBD_K19,ATOFFICEKBD_K21,ATOFFICEKBD_K22,ATOFFICEKBD_K23
;6	
	DB	ATOFFICEKBD_K24,ATOFFICEKBD_K25,ATOFFICEKBD_K27,ATOFFICEKBD_K28
	DB	ATOFFICEKBD_K29,ATOFFICEKBD_K30,ATOFFICEKBD_K31,ATOFFICEKBD_K32
	
;each key above is represented in a report as a single bit -- 1 == pressed.
;this table contains the masks for the bits representing each key

BIT_MASK_TABLE:
   	db  1,2,4,
   	
    	db  1,2,4,8
	db  10h,20h,40h,80h
	
	db  1,2,4,8
	db  10h,20h,40h,80h
	
	db  1,2,4,8
	db  10h,20h,40h,80h
	
	db  1,2,4,8
	db  10h,20h,40h,80h

	db  1,2,4,8
	db  10h,20h,40h,80h
;each key's bit mask must be applied to the data byte corresponding to it.
;this table points to the data byte's position in RAM.

POINT_TABLE:
	DB	0,0,0
	
	
	DB	1,1,1,1
	DB	1,1,1,1
	
	DB	2,2,2,2
	DB	2,2,2,2
	
	DB	3,3,3,3
	DB	3,3,3,3
	
	DB	4,4,4,4
	DB	4,4,4,4
	
	DB	5,5,5,5
	DB	5,5,5,5
	
	
	
REPORT_ID_TABLE:
	DB	2,2,2
	
	DB	3,3,3,3
	DB	3,3,3,3
			
	DB	4,4,4,4
	DB	4,4,4,4
	
	DB	5,5,5,5
	DB	5,5,5,5
	
	DB	6,6,6,6
	DB	6,6,6,6
	
	DB	7,7,7,7
	DB	7,7,7,7
	

NUM_POWER_KEYS:		equ 3
NUM_CONSUMER_KEYS:	equ 12
NUM_ALT_KEYS:    	equ 	43
;============================================================================
USB_ALTERNATE_KEY:
	PHX
	STA	KSC_WORK
	LDX	#00H
ALT_LP1:
	LDA	ALT_KEY_TABLE,X
	CMP	KSC_WORK
	BEQ	ALT_LP2
	INX	
	CPX	#NUM_ALT_KEYS
	BNE	ALT_LP1
	CLC
	JMP	ALT_EXIT
ALT_LP2:
	LDA	REPORT_ID_TABLE,X
	STA	USB_REPORT_ID
	LDA	#FFH
	STA	USB_TX_FLAGS
	LDA	POINT_TABLE,X
	TAY
	LDA	BIT_MASK_TABLE,X
	PHA
	LDA	KSC_DOWN_UP
	CMP	#00H
	BEQ	ALT_MOD0_UP
	TYA
	TAX
	PLA
	STA	usb_mm_keys
	JMP	ALT_DONE_PUTKEY
ALT_MOD0_UP:
	TYA
	TAX
	PLA
	EOR	#FFH
	AND	usb_mm_keys
	STA	usb_mm_keys
ALT_DONE_PUTKEY:
	SEC

ALT_EXIT:
	PLX
	LDA	KSC_WORK
	RTS



;
;========================================================================
;   FILE: matrix.asm
;
;   This file contains the lookup to convert the codes generated
;   by scanning the key-matrix, into at101/102 key keyboard values.
;   this file needs to change if the key matrix changes or if keys
;   are added to the current matrix.
;
;
;========================================================================
		;========================================================================
;   FILE: KEYBOARDINC.inc 
;
;   contains the defines for the keys on a 101/102 key keyboard.
;
;   The definitions are standard with the addition of the following
;   codes:
;
;   AT101KB_POWER:            EQU         130
;   AT101KB_SLEEP:            EQU         131
;   AT101KB_WAKE:             EQU         132
;   
;   in addition, code  135 is currently used to represent
;   the CTRL-ALT scan code in scan sets 1 and 2. This can be moved
;   to another location (above 135) if new keys are added that need
;   the 135 placement.
;
;
;========================================================================


AT101_TBL:

;1
    db          AT101KB_PAUSE,AT101KB_RESERVED,AT101KB_RESERVED,AT101KB_RESERVED				
    db          AT101KB_RIGHTCTRL,AT101KB_RESERVED,AT101KB_LEFTCTRL,AT101KB_F5
;2
    db          AT101KB_Q,AT101KB_TAB,AT101KB_A,AT101KB_ESCAPE			
    db          AT101KB_Z,AT101KB_JPN_131,AT101KB_TILDE,AT101KB_01
;3
    db          AT101KB_W,AT101KB_CAPSLOCK,AT101KB_S,AT101KB_EUROPE2_K45		
    db          AT101KB_X,AT101KB_JPN_132,AT101KB_F1,AT101KB_02
;4
    db          AT101KB_E,AT101KB_F3,AT101KB_D,AT101KB_F4						
    db          AT101KB_C,AT101KB_JPN_133,AT101KB_F2,AT101KB_03
;5
    db          AT101KB_R,AT101KB_T,AT101KB_F,AT101KB_G						
    db          AT101KB_V,AT101KB_B,AT101KB_05,AT101KB_04
;6
    db          AT101KB_U,AT101KB_Y,AT101KB_J,AT101KB_H
    db          AT101KB_M,AT101KB_N,AT101KB_06,AT101KB_07
;7
    db          AT101KB_I,AT101KB_RIGHTBRACKET,AT101KB_K,AT101KB_F6
    db          AT101KB_LEFTANGLE,AT101KB_BRAZILIAN,AT101KB_EQUAL,AT101KB_08
;8
    db          AT101KB_O,AT101KB_F7,AT101KB_L,AT101KB_RESERVED
    db          AT101KB_RIGHTANGLE,AT101KB_APPLICATION,AT101KB_F8,AT101KB_09
;9
    db          AT101KB_P,AT101KB_LEFTBRACKET,AT101KB_SEMICOLON,AT101KB_DOUBLEQUOTE
    db          AT101KB_EUROPE1_K42,AT101KB_QUESTION,AT101KB_UNDERSCORE,AT101KB_00
;10
    db          AT101KB_SCROLL_LOCK,ATOFFICEKBD_K6,AT101KB_SCAN_NEXT,AT101KB_LEFTALT
    db          AT101KB_WWW_SEARCH,AT101KB_RIGHTALT,AT101KB_SCAN_PREV,AT101KB_PRINTSCREEN

;;11
    db          AT101KB_K14,AT101KB_

⌨️ 快捷键说明

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