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

📄 offickbd.asm

📁 以台湾CHESEN公司的CSC0108实现多媒体USB键盘的功能
💻 ASM
📖 第 1 页 / 共 5 页
字号:
;;****************************************************************************
.SYMBOLS
.CHIP   R65c02
;;.PAGE0
.INCLUDE  KEYINC.INC
;;****************************************************************************
IRQFUNC         EQU     00H
IRQCLRF         EQU     01H
IE_FUNC         EQU     02H
IRQUSB          EQU     03H
IRQCLRU         EQU     04H
IE_USB          EQU     05H
BT              EQU     06H
TCON            EQU     07H
TMOD            EQU     08H
PORT0           EQU     09H
PORT1           EQU     0AH
PORT2           EQU     0BH
PORT3           EQU     0CH
LED             EQU     0DH
CLRWDT          EQU     0EH
MODE_FG         EQU     0FH
;---------------------------------------
DA              EQU     10H
DFC             EQU     11H
TXDAT0          EQU     12H
TXCNT0          EQU     13H
TXFLG0          EQU     14H
RXDAT0          EQU     15H
RXCNT0          EQU     16H
RXFLG0          EQU     17H
TXDAT1          EQU     18H
TXCNT1          EQU     19H
TXFLG1          EQU     1AH
TXDAT2          EQU     1BH
TXCNT2          EQU     1CH
TXFLG2          EQU     1DH
SUSLO           EQU     1EH
SUSHI           EQU     1FH
;---------------------------------------
ADSCR           EQU     20H
ADDR            EQU     21H
ADCRES          EQU     22H
P1CON           EQU     23H
;;----------------------------------------------------------------------------
BUFFER          EQU     80H             ;;?BUFFER 8 bytes
bmReq           EQU     80H             ;;?

bReq            EQU     81H
wValue          EQU     82H             ;;2 byte
wIndex          EQU     84H             ;;2 byte
wLength         EQU     86H             ;;2 byte
;---------------------------------------
LED_REG         EQU     88H
DEV_STATUS      EQU     89H             ;;?bit0: device self powered
                                        ;;?bit1: device remote wakeup
                                        ;;?bit2: device EP0 OUT stall
                                        ;;?bit3: device EP0 IN  stall
                                        ;;?bit4: device EP1 IN  stall
                                        ;;?bit5: device EP2 IN  stall
                                        ;;?bit6: device configured
DESC_REG        EQU     8AH
DESC_REG1       EQU     8BH
DEV_ADR         EQU     8CH
;---------------------------------------
EP1_IDLE_RATE   EQU     8DH
EP1_IDLE_TIME   EQU     8EH
EP2_IDLE_RATE   EQU     8FH
EP2_IDLE_TIME   EQU     90H
;---------------------------------------
PROTOCOL0       EQU     91H
PROTOCOL1       EQU     92H
Alternate0      EQU     93H
Alternate1      EQU     94H
Config_Value    EQU     95H
REQUEST_BUF     EQU     96H
TABLE_ADDR      EQU     97H
TABLE_ADDR0     EQU     TABLE_ADDR
TABLE_ADDR1     EQU     98H
DESC_BYTE       EQU     99H
DESC_BYTE1      EQU     9AH
DESC_BYTE_INDEX EQU     9BH
DESC_BYTE_INDEX1 EQU    9CH
;; suspend
TXFLG1_REG      EQU     9DH
TXFLG2_REG      EQU     9EH
IE_FUNC_REG     EQU     9FH
;;----------------------------------------------------------------------------
REQ_SET_ADDRESS EQU     05H
REQ_GET_DESCRIP EQU     06H
REQ_SET_REPORT  EQU     19H


;;---------------------------------------------------------------------------------------------------------------------------------------

;;****************************************************************************

;;TEST SCAN TASK

;=======================================================================
;			Keyboard Scan Task
;the keyboard is organized as 8 rows by 18 columns. the I/O ports are 
;assigned as:	18*8
;P2
;bit7				  bit0
;r7   r6   r5   r4   r3   r2   r1   r0
;
;P3	   P1      			P0				
;bit1      bit7                         bit7                    bit0
;c17  c16  c15  c14  c13 c12 c11 c10 c9 c8 c7 c6 c5 c4 c3 c2 c1 c0
;=======================================================================

DEBOUNCE_ARRAY_SIZE	EQU	06H
DEBOUNCE_PRESS_TIME	EQU	12			;05H
DEBOUNCE_RELEASE_TIME	EQU	9

;ram variables to support the scan matrix

KSC_RAM_BASE	EQU	A0H
KSC_X_INDEX	EQU	KSC_RAM_BASE+0
KSC_Y_INDEX	EQU	KSC_RAM_BASE+1
KSC_CHANGES	EQU	KSC_RAM_BASE+2
KSC_MATRIX_ADDR	EQU	KSC_RAM_BASE+3
KSC_DOWN_UP	EQU	KSC_RAM_BASE+4
KSC_PHANTOM	EQU	KSC_RAM_BASE+5
KSC_P0OUT	EQU	KSC_RAM_BASE+6
KSC_P1OUT	EQU	KSC_RAM_BASE+7
KSC_P3OUT	EQU	KSC_RAM_BASE+8
KSC_DB_KEYS	EQU	KSC_RAM_BASE+9		;define debounce keys is 6 bytes

KSC_DB_COUNTS	EQU	KSC_RAM_BASE+15		;define debounce buffer 6 bytes

KSC_IMAGE	EQU	KSC_RAM_BASE+21		;define SCAN MATRIX IMAGE DEFINE 21 BYTE

FN_KEY_FLAGS	EQU	KSC_RAM_BASE+42
KSC_MOD1	EQU	KSC_RAM_BASE+43
KSC_WORK	EQU	KSC_RAM_BASE+44
KSC_ROW_HITS	EQU	KSC_RAM_BASE+45
KSC_COL_HITS	EQU	KSC_RAM_BASE+46
KSC_KEY_COUNT	EQU	KSC_RAM_BASE+47



USB_KEY_COUNT		EQU	KSC_RAM_BASE+51
USB_REPORT_BUFFER	EQU	KSC_RAM_BASE+52		;Define 8 bytes for sending buffer
USB_TX_FLAGS		EQU	KSC_RAM_BASE+60
USB_REPORT_ID		EQU	KSC_RAM_BASE+61
usb_mm_keys		EQU	KSC_RAM_BASE+62		;Define 6 bytes 

			;equ	KSC_RAM_BASE+67
APP_ESC_STATE		EQU	KSC_RAM_BASE+68		;;Define 0 bytes
MM_LED_FLAGS		EQU	KSC_RAM_BASE+69
MM_LED			EQU	KSC_RAM_BASE+70
APP_PRESS_FLAGS		EQU	KSC_RAM_BASE+71
TEMP_R			EQU	KSC_RAM_BASE+72
TEMP_R2			EQU	KSC_RAM_BASE+73
COMB_POINT		EQU	KSC_RAM_BASE+74
COMB_PARAM		EQU	KSC_RAM_BASE+75
COMB_FLAGS		EQU	KSC_RAM_BASE+76
TIMER_COUNT		EQU	KSC_RAM_BASE+77
MARK_FLAGS		EQU	KSC_RAM_BASE+78
TIMER_CONST		EQU	KSC_RAM_BASE+78
IO_BUFFER		EQU	KSC_RAM_BASE+76		;;Define 7 bytes as startio buffer
		       ;EQU	KSC_RAM_BASE+83


;;----------------------------------------------------------------------------------------------------------------------------------------------------


        ORG     $E800
RESET_vector:
        ;.include        HE0009.ASM      ;;HE0009 body test porgram
User_Program:
        CLI                             ;;clr interrupt mask
        LDA	#20H
        STA	DFC
        SMB3	LED
        LDA     #01010101B              ;;?clear watch dog
        STA     CLRWDT                  ;;?
        LDX     #7FH                    ;;?stack point
        TXS                             ;;?
        RMB1	DFC
        RMB3	DFC
        RMB0    DFC                     ;;clear VCPI bit

        BBS1    MODE_FG,Cold_Reset      ;;warm start reset or cold start reset
Warm_Reset:
        BBS0    MODE_FG,Resume_Reset    ;;watch dog or resume reset
W_Dog_Reset:
        SMB0    DFC                     ;;?delay 500ms
        SMB1    DFC                     ;;?
        JSR     Delay_5ms               ;;?
        RMB1    DFC                     ;;?
        JSR     Delay_500ms             ;;?
        RMB0    DFC                     ;;?
        BRA     Cold_Reset
Resume_Reset:
	SMB3    DFC                     ;;?hold the resume signaling for at
        JSR     Delay                   ;;?least 10ms and no more than 15ms
        RMB3    DFC                     ;;?
        
        STZ     IE_USB                  ;;*****
        JSR     Restore_Variable
        BRA     Main

Cold_Reset:
        STZ     MODE_FG
        JSR     Initial_Register

Main:
        JSR     SUSPEND                 ;;suspend mode
        JSR     USB_EVENT               ;;checking USB activities
        JSR     Given_Time
		
	JSR	COMBINPROCESS
		
   	LDA	USB_TX_FLAGS
	CMP	#1H
	BNE	USB_MM_SEND
	STZ     TXCNT1                  ;;clear count register
	STZ	USB_TX_FLAGS  
	LDX	#0H
WRITE_USB_BUFFER:
	LDA	USB_REPORT_BUFFER,X
	STA	TXDAT1
	INX
	CPX	#8	
	BNE	WRITE_USB_BUFFER
        JSR     OUT_EP1_DATA
WAIT_USB_SEND:        
        BBS0	TXFLG1,WAIT_USB_SEND
        BRA	Main
        
        
USB_MM_SEND:					;;SEND MM KEY TO HOST
	CMP	#FFH
	BNE	USB_ERROR_SEND
	STZ     TXCNT2                  	;;clear count register
	LDX	#00H
;READ_MM_BUFFER:
	LDA	USB_REPORT_ID,X
	STA	TXDAT2
	INX
	;CPX	#7
	;BNE	READ_MM_BUFFER
	
	LDA	USB_REPORT_ID,X
	STA	TXDAT2
	STZ	USB_TX_FLAGS	
	JSR	OUT_EP2_DATA
;WAIT_MM_SEND:
	;BBS0	TXFLG2,WAIT_MM_SEND
        BRA	Main
	JMP	Main


USB_ERROR_SEND:					;;SEND ERROR CODE TO HOST
	CMP	#AAH
	BNE	EXIT_MAIN
	STZ	TXCNT2
	LDX	#0
	STZ	TXCNT1
	STZ	TXDAT1
	STZ	TXDAT1
	LDA	#1H
SEND_USB_ERR:
	STA	TXDAT1
	INX
	CPX	#6
	BNE	SEND_USB_ERR
	JSR	OUT_EP1_DATA
WAIT_USB_SEND2:        
        BBS0	TXFLG1,WAIT_USB_SEND2
	JMP	Main
EXIT_MAIN:
        JMP     Main
;;----------------------------------------------------------------------------
Initial_Register:
        LDX     #80H                    ;;?clear internal RAM $80 - $17F
Clr_SRAM1:                              ;;?
	STZ     $00,X                   ;;?
	INX                             ;;?
	BNE     Clr_SRAM1               ;;?
Clr_SRAM2:                              ;;?
	STZ     $100,X                  ;;?
	INX                             ;;?
	CPX     #7EH                    ;;?
	BCC     Clr_SRAM2               ;;?

	STA	PORT2
	LDA	#0FFH
	STA	KSC_P0OUT
	STA	PORT0
	
	STA	KSC_P1OUT
	STA	PORT1
	STA	KSC_P3OUT
	STA	PORT3
	LDX	#DEBOUNCE_ARRAY_SIZE
	LDA	#0FFH
	
CLEAR_DEBOUNCE_ARRAY:
	STA	KSC_DB_KEYS-1,X
	DEX
	BNE	CLEAR_DEBOUNCE_ARRAY


        STZ     IE_FUNC                 ;;?disable all interrupt
        STZ     IE_FUNC_REG             ;;?
        STZ     IE_USB                  ;;?
        LDA     #0FFH                    ;;?LED reset value
        STA     LED                     ;;?
        STA     LED_REG                 ;;?
        LDA     #FFH
        STA     PORT0
       
        STA     PORT1
        STA     PORT2
        STA     PORT3
        JSR     INIT_USB                ;;USB setting

Initial_Timer:
        LDA     #00000011B              ;;?21.6us
        STA     TMOD                    ;;?
        
        LDA     #256-47                 ;;?21.6us x 47 = 1ms
        STA     BT                      ;;?
        
        RMB0    TCON                    ;;enable timer
        SMB0    IE_FUNC                 ;;enable timer interrupt
        SMB0    IE_FUNC_REG
        RTS
;;----------------------------------------------------------------------------
SUSPEND:
        BBR7    IRQUSB,NO_SUSPEND
        SMB7    IRQCLRU                 ;;clear SUSP IRQ flag
        LDA     #00001111B              ;;?turn off all LED
        STA     LED                     ;;?
        
        LDA     #01010101B              ;;?clear watch dog
        STA     CLRWDT                  ;;?
        
        LDA     #00011111B              ;;?clear all interrupt flag
        STA     IRQCLRF                 ;;?
        
        LDA     #11001111B              ;;?
        
        STA     IRQCLRU                 ;;?
        
        LDA     #FFH                    ;;?force PORT2 pull high
        STA     PORT2                   ;;?
        
        LDA     PORT2                   ;;?
        
        STZ     PORT0                   ;;?force PORT0 pull low
        STZ     PORT1                   ;;?force PORT1 pull low
        STZ     PORT3                   ;;?force PORT3 pull low
        LDA     TXFLG1                  ;;?store variable
        STA     TXFLG1_REG              ;;?
        
        LDA     TXFLG2                  ;;?
        
        STA     TXFLG2_REG              ;;?

        LDA     DEV_STATUS              ;;?enable or disable remote wake up
        AND     #00000010B              ;;?
        
        BEQ     $+4                     ;;?
        
        LDA     #00010110B              ;;?P3.2, P3.3 and Port2 wake up
;$+4:                                   ;;
        STA     IE_FUNC                 ;;?into suspend mode
        LDA     #55H                    ;;?
        
        STA     SUSLO                   ;;?
        
        LDA     #AAH                    ;;?
        
        STA     SUSHI                   ;;?
        
        NOP                             ;;?
        
        NOP                             ;;?

        STZ     IE_FUNC                 ;;disable all interrupt
USB_Remote_Wakeup:                      ;;resume signaling 10ms - 15ms
        SMB3    DFC                     ;;?hold the resume signaling for at
        JSR     Delay                   ;;?least 10ms and no more than 15ms
        RMB3    DFC                     ;;?

Restore_Variable:
        LDA     DEV_ADR                 ;;?restore variable
        STA     DA                      ;;?
        
        LDA     TXFLG1_REG              ;;?
        
        STA     TXFLG1                  ;;?
        
        LDA     TXFLG2_REG              ;;?
        
        STA     TXFLG2                  ;;?
        
        LDA     IE_FUNC_REG             ;;?restore IE_FUNC
        STA     IE_FUNC                 ;;?
        
        STZ     MODE_FG                 ;;clear suspend flag
        STZ     EP1_IDLE_TIME
        STZ     EP2_IDLE_TIME
        JSR     Initial_Timer
        LDA     LED_REG                 ;;?turn on LED
        STA     LED                     ;;?
	
	LDA	MM_LED_FLAGS		;;MM_LED
	CMP	#FFH
	BNE	MMLED_APP_OVER12
	RMB3	LED
	JMP	OK_MMLED_LAMP12
MMLED_APP_OVER12:
	SMB3	LED
OK_MMLED_LAMP12:
NO_SUSPEND:
        RTS
;;----------------------------------------------------------------------------
USB_EVENT:
        LDA     IRQUSB                  ;;?read USB interrupt source
        AND     #01001111B              ;;?
        
        BNE     HAS_USB_EVENT           ;;have USB event
        RTS                             ;;no USB event

HAS_USB_EVENT:
CHECK_SETUP_TOKEN:
        BBR6    IRQUSB,CHECK_EP0_OUT
        SMB6    IRQCLRU
        JSR     SETUP_TOKEN             ;;setup token coming

CHECK_EP0_OUT:
        BBR1    IRQUSB,CHECK_EP0_IN
        SMB1    IRQCLRU
        JSR     ENDPOINT0_OUT           ;;ENDPOINT0 out

CHECK_EP0_IN:
        BBR0    IRQUSB,CHECK_EP1_IN
        JSR     ENDPOINT0_IN            ;;ENDPOINT0 in

CHECK_EP1_IN:
        BBR2    IRQUSB,CHECK_EP2_IN
        JSR     ENDPOINT1_IN            ;;ENDPOINT1 in

CHECK_EP2_IN:
        BBR3    IRQUSB,END_USB_EVENT
        JSR     ENDPOINT2_IN            ;;ENDPOINT2 in

END_USB_EVENT:
        RTS
;;----------------------------------------------------------------------------
INIT_USB:                               ;;bus reset
        STZ     IE_USB                  ;;disabled all USB interrupt
        STZ     TXFLG0
        STZ     TXFLG1
        STZ     TXFLG2
        STZ     TXCNT0                  ;;?clear count register
        STZ     TXCNT1                  ;;?
        
        STZ     TXCNT2                  ;;?
        
        STZ     DA                      ;;?device address is 0
        STZ     DEV_ADR                 ;;?
        
        STZ     DEV_STATUS              ;;clear device status
        LDA     #1                      ;;?report protocol
        STA     PROTOCOL0               ;;?
        
        STA     PROTOCOL1               ;;?
        
        RTS
;;----------------------------------------------------------------------------
SETUP_TOKEN:                            ;;setup token coming

⌨️ 快捷键说明

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