📄 offickbd.asm
字号:
;;****************************************************************************
.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 + -