📄 int2_rx.asm
字号:
;****************************************************************;
;INT2_isr Service Routine
;
; function: IR Receiver judge
; Extern Interrupt High to low trigger
;
; Written by: Mr.Kelvin Yuan
; Date: 2004-06-30
;
;****************************************************************;
;================================================================;
;Constant Area
;================================================================;
;//04-03-17// revise for reducing the ir detect interval time
cnt_ir_lead_min equ #22 ;standard value shall be 24(2.5ms+0.5ms=3ms),3ms/125us
cnt_ir_lead_max equ #29 ;3.5ms+125us,1ms=8
cnt_ir_data_max equ #19 ;standard is 16(2.0ms),+4(0.5ms)
cnt_ir_data_min equ #4 ;the minium data 0 is 1ms,0.5ms is limited(4)
cnt_ir_data0_max equ #12 ;>=1.5ms is 1(2ms,16),<1.5ms is 0(1ms,8)
mouse_self_data equ #00001111b ;receive mouse self data
cheese_broadcast_data equ #01011010b ;receive cheese broadcast data
cheese_touched_data equ #11100001b ;receive cheese touched data
;================================================================;
;Data Area
;================================================================;
.area INT1_var(data)
temp_a_3:: .ds 1
temp_op1_3:: .ds 1
temp_dp_3:: .ds 1
status_ir_rcv:: .ds 1 ;0 states no data received,1 is lead received ready
;2 is data1 received ready;3 is data2 received ready,4 is data1 reverse ready,5 is data2 reverse ready
;6 is mouse_self ok,7 states cheese broadcast sign received,8 states cheese touched received.
ir_rcv_data:: .ds 1
;ir_rcv_data_temp:: .ds 1
;cnt_broadcast_tmr:: .ds 2
flg_rcv_broadcast:: .ds 1 ;1 broadcast sign received,it will be clear in 2s(timer2)
;temp_count:: .ds 2 ;for test
flg_rcv_touched:: .ds 1 ;touched sign be received flag
;cnt_ir_rcv_temp : .ds 5 ;for test
flg_rcv_barrier:: .ds 1 ;barrier sign received
;================================================================;
;Code Area
;================================================================;
.area INT2_isr(code)
INT2_isr::
sta temp_a_3
lda r_op1
sta temp_op1_3
lda r_dp
sta temp_dp_3
lda status_ir_rcv
cmpe #0 ;0 is the first entry interrupt
brz ir_rcv_first
cmpe #1 ;1 is the second entry intterrup
brz ir_rcv_lead ;lead code judge
lda cnt_ir_rcv
cmpe #cnt_ir_data_max ;cnt_ir_rcv>=cnt_ir_data_max,c=1,error
brc ir_rcv_data_err ;error process
cmpe #cnt_ir_data_min ;cnt_ir_rcv<cnt_ir_data_min,c=0,psuedo pulse,no process
;20040707
brnc ir_rcv_data_err ;psuedo pulse,skip,wait for the next int,count continue
cmpe #cnt_ir_data0_max ;>=1.5ms is 1,<1.5ms c=0,
lda ir_rcv_data
rolc
sta ir_rcv_data
lda status_ir_rcv
; cmpe #2
; brnz ir_rcv_data_test1
; lda cnt_ir_rcv
; sta cnt_ir_rcv_temp ;for test
; br test_return
;ir_rcv_data_test1:
; cmpe #3
; brnz ir_rcv_data_test2
; lda cnt_ir_rcv
; sta cnt_ir_rcv_temp+1 ;for test
; br test_return
;ir_rcv_data_test2:
; cmpe #4
; brnz ir_rcv_data_test3
; lda cnt_ir_rcv
; sta cnt_ir_rcv_temp+2 ;for test
; br test_return
;ir_rcv_data_test3:
; cmpe #5
; brnz test_return
; lda cnt_ir_rcv
; sta cnt_ir_rcv_temp+3 ;for test
; nop
;test_return:
lda #0
sta cnt_ir_rcv
lda status_ir_rcv
cmpe #9 ;is the last data reverse?
brz ir_rcv_data_ok
inca
sta status_ir_rcv
br INT2_isr_end
ir_rcv_data_ok:
; lda temp_count ;for test
; inca
; sta temp_count
; lda temp_count+1
; addc #0
; sta temp_count+1
lda ir_rcv_data
cmpe #mouse_self_data
brz ir_rcv_data_ok_self
cmpe #cheese_broadcast_data
brz ir_rcv_data_ok_bc
cmpe #cheese_touched_data
brz ir_rcv_data_ok_touched
ir_rcv_data_err:
lda #0 ;data wrong
sta status_ir_rcv
sta cnt_ir_rcv
sta ir_rcv_data
br INT2_isr_end
ir_rcv_data_ok_touched: ;maouse be touched,game will over
lda flg_touched_key ;it is wrong that touched sign is received before broadcast sign received and key presssed
cmpe #1
brnz ir_rcv_data_err
lda #1
sta flg_rcv_touched
lda #0
sta status_ir_transmit ;stop transmit IR
br ir_rcv_data_err ;the result is ok, only initial all,
ir_rcv_data_ok_bc:
lda #0 ;broadcast sign is received,will slow tx IR
sta cnt_broadcast_tmr
sta cnt_broadcast_tmr+1
lda #1
sta flg_rcv_broadcast ;setup the received broadcast flag
br ir_rcv_data_err ;the result is ok, only initial all,
ir_rcv_data_ok_self:
lda #1 ;barrier, will change director
sta flg_rcv_barrier
br ir_rcv_data_err ;the result is ok, only initial all,
ir_rcv_lead:
lda cnt_ir_rcv
cmpe #cnt_ir_lead_max ;cnt_ir_rcv>=cnt_ir_lead_max,c=1 jump
brc ir_rcv_data_err ;too big,error and exit,the status will be cleared in timer1_isr
cmpe #cnt_ir_lead_min ;c/=1,is too small,error.c=1 is ok,
brnc ir_rcv_data_err
lda #2
sta status_ir_rcv ;lead ok,ready to receive data
lda #0
sta ir_rcv_data ;clear receive data registor
sta cnt_ir_rcv ;clear ir receive counter,it will increase in timer1_isr
br INT2_isr_end
ir_rcv_first:
lda #1 ;the first entry INT,
sta status_ir_rcv
lda #0
sta cnt_ir_rcv
br INT2_isr_end
INT2_isr_end:
lda temp_dp_3
sta r_dp
lda temp_op1_3
sta r_op1
lda temp_a_3
reti ;/*04-06-30/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -