📄 ir_rcv_int.asl
字号:
+ 1 ;****************************************************************;
+ 2 ;INT2_isr Service Routine
+ 3 ;
+ 4 ; function: IR Receiver judge
+ 5 ; Extern Interrupt High to low trigger
+ 6 ;
+ 7 ; Written by: Mr.Kelvin Yuan
+ 8 ; Date: 2004-06-30
+ 9 ;
+ 10 ;****************************************************************;
+ 11
+ 12 ;================================================================;
+ 13 ;Constant Area
+ 14 ;================================================================;
+ 15 ;//04-03-17// revise for reducing the ir detect interval time
0016 16 cnt_ir_lead_min equ #22 ;standard value shall be 24(2.5ms+0.5ms=3ms),3ms/125us
001D 17 cnt_ir_lead_max equ #29 ;3.5ms+125us,1ms=8
0013 18 cnt_ir_data_max equ #19 ;standard is 16(2.0ms),+4(0.5ms)
0004 19 cnt_ir_data_min equ #4 ;the minium data 0 is 1ms,0.5ms is limited(4)
000C 20 cnt_ir_data0_max equ #12 ;>=1.5ms is 1(2ms,16),<1.5ms is 0(1ms,8)
000F 21 mouse_self_data equ #00001111b ;receive mouse self data
005A 22 cheese_broadcast_data equ #01011010b ;receive cheese broadcast data
00E1 23 cheese_touched_data equ #11100001b ;receive cheese touched data
+ 24 ;================================================================;
+ 25 ;Data Area
+ 26 ;================================================================;
+B 00 01
+ 27 .area INT1_var(data)
0000 28 temp_a_3:: .ds 1
0001 29 temp_op1_3:: .ds 1
0002 30 temp_dp_3:: .ds 1
0003 31 status_ir_rcv:: .ds 1 ;0 states no data received,1 is lead received ready
+ 32 ;2 is data1 received ready;3 is data2 received ready,4 is data1 reverse ready,5 is data2 reverse ready
+ 33 ;6 is mouse_self ok,7 states cheese broadcast sign received,8 states cheese touched received.
0004 34 ir_rcv_data:: .ds 1
+ 35 ;ir_rcv_data_temp:: .ds 1
+ 36 ;cnt_broadcast_tmr:: .ds 2
0005 37 flg_rcv_broadcast:: .ds 1 ;1 broadcast sign received,it will be clear in 2s(timer2)
0006 38 temp_count:: .ds 2 ;for test
0008 39 flg_rcv_touched:: .ds 1 ;touched sign be received flag
+ 40 ;cnt_ir_rcv_temp : .ds 5 ;for test
0009 41 flg_rcv_barrier:: .ds 1 ;barrier sign received
+ 42 ;================================================================;
+ 43 ;Code Area
+ 44 ;================================================================;
+B 00 02
+ 45 .area INT2_isr(code)
+ 46
0000 47 INT2_isr::
+ 48
0000 FD 00 49 sta temp_a_3
0002 F0 22 50 lda r_op1
0004 FD 01 51 sta temp_op1_3
0006 F0 21 52 lda r_dp
0008 FD 02 53 sta temp_dp_3
+ 54
000A F1 03 55 lda status_ir_rcv
000C A7 00 56 cmpe #0 ;0 is the first entry interrupt
000E 06 00 A2 57 brz ir_rcv_first
0011 A7 01 58 cmpe #1 ;1 is the second entry intterrup
0013 06 00 89 59 brz ir_rcv_lead ;lead code judge
0016 F1 00 60 lda cnt_ir_rcv
+ 61
0018 A7 13 62 cmpe #cnt_ir_data_max ;cnt_ir_rcv>=cnt_ir_data_max,c=1,error
001A 04 00 58 63 brc ir_rcv_data_err ;error process
001D A7 04 64 cmpe #cnt_ir_data_min ;cnt_ir_rcv<cnt_ir_data_min,c=0,psuedo pulse,no process
+ 65 ;20040707
001F 05 00 58 66 brnc ir_rcv_data_err
+ 67 ; brnc INT2_isr_end ;psuedo pulse,skip,wait for the next int,count continue
0022 A7 0C 68 cmpe #cnt_ir_data0_max ;>=1.5ms is 1,<1.5ms c=0,
+ 69 ; brc ir_rcv_data_1
+ 70 ;ir_rcv_data_1:
0024 F1 04 71 lda ir_rcv_data
0026 7E 72 rolc
0027 FD 04 73 sta ir_rcv_data
0029 F1 03 74 lda status_ir_rcv
+ 75 ; cmpe #2
+ 76 ; brnz ir_rcv_data_test1
+ 77 ; lda cnt_ir_rcv
+ 78 ; sta cnt_ir_rcv_temp ;for test
+ 79 ; br test_return
+ 80 ;ir_rcv_data_test1:
+ 81 ; cmpe #3
+ 82 ; brnz ir_rcv_data_test2
+ 83 ; lda cnt_ir_rcv
+ 84 ; sta cnt_ir_rcv_temp+1 ;for test
+ 85 ; br test_return
+ 86 ;ir_rcv_data_test2:
+ 87 ; cmpe #4
+ 88 ; brnz ir_rcv_data_test3
+ 89 ; lda cnt_ir_rcv
+ 90 ; sta cnt_ir_rcv_temp+2 ;for test
+ 91 ; br test_return
+ 92 ;ir_rcv_data_test3:
+ 93 ; cmpe #5
+ 94 ; brnz test_return
+ 95 ; lda cnt_ir_rcv
+ 96 ; sta cnt_ir_rcv_temp+3 ;for test
+ 97 ; nop
+ 98 ;test_return:
+ 99
002B F3 00 100 lda #0
002D FD 00 101 sta cnt_ir_rcv
002F F1 03 102 lda status_ir_rcv
0031 A7 09 103 cmpe #9 ;is the last data reverse?
0033 06 00 3C 104 brz ir_rcv_data_ok
0036 1F 105 inca
0037 FD 03 106 sta status_ir_rcv
0039 02 00 AD 107 br INT2_isr_end
+ 108 ;ir_rcv_data_check:
+ 109 ; lda ir_rcv_data
+ 110 ; sta ir_rcv_data_temp
+ 111 ; adda #0 ;clear cy
+ 112 ; rorc
+ 113 ; adda #0 ;celar cy
+ 114 ; rorc
+ 115 ; sta ir_rcv_data
+ 116 ; lda ir_rcv_data_temp
+ 117 ; anda #03 ;mask b7-b3
+ 118 ; xora #03 ;reverse the last 2bit
+ 119 ; cmpe ir_rcv_data
+ 120 ; brz ir_rcv_data_ok
+ 121
+ 122
003C 123 ir_rcv_data_ok:
003C F1 06 124 lda temp_count ;for test
003E 1F 125 inca
003F FD 06 126 sta temp_count
0041 F1 07 127 lda temp_count+1
0043 9B 00 128 addc #0
0045 FD 07 129 sta temp_count+1
0047 F1 04 130 lda ir_rcv_data
0049 A7 0F 131 cmpe #mouse_self_data
004B 06 00 82 132 brz ir_rcv_data_ok_self
004E A7 5A 133 cmpe #cheese_broadcast_data
0050 06 00 75 134 brz ir_rcv_data_ok_bc
0053 A7 E1 135 cmpe #cheese_touched_data
0055 06 00 63 136 brz ir_rcv_data_ok_touched
0058 137 ir_rcv_data_err:
0058 F3 00 138 lda #0 ;data wrong
005A FD 03 139 sta status_ir_rcv
005C FD 00 140 sta cnt_ir_rcv
005E FD 04 141 sta ir_rcv_data
0060 02 00 AD 142 br INT2_isr_end
+ 143
0063 144 ir_rcv_data_ok_touched: ;maouse be touched,game will over
0063 F1 05 145 lda flg_rcv_broadcast ;it is wrong that touched sign is received before broadcast sign received
0065 A7 01 146 cmpe #1
0067 07 00 58 147 brnz ir_rcv_data_err
006A F3 01 148 lda #1
006C FD 08 149 sta flg_rcv_touched
006E F3 00 150 lda #0
0070 FD 00 151 sta status_ir_transmit ;stop transmit IR
0072 02 00 58 152 br ir_rcv_data_err ;the result is ok, only initial all,
+ 153 ; br INT2_isr_end
+ 154
0075 155 ir_rcv_data_ok_bc:
0075 F3 00 156 lda #0 ;broadcast sign is received,will slow tx IR
+ 157 ; sta status_ir_rcv ;has set the flag,restore the status
0077 FD 00 158 sta cnt_broadcast_tmr
0079 FD 01 159 sta cnt_broadcast_tmr+1
007B F3 01 160 lda #1
007D FD 05 161 sta flg_rcv_broadcast ;setup the received broadcast flag
+ 162
007F 02 00 58 163 br ir_rcv_data_err ;the result is ok, only initial all,
+ 164
0082 165 ir_rcv_data_ok_self:
0082 F3 01 166 lda #1 ;barrier, will change director
0084 FD 09 167 sta flg_rcv_barrier
0086 02 00 58 168 br ir_rcv_data_err ;the result is ok, only initial all,
+ 169 ;ir_rcv_error:
+ 170 ; lda #0
+ 171 ; sta cnt_ir_rcv
+ 172 ; sta status_ir_rcv
+ 173 ; br INT2_isr_end
0089 174 ir_rcv_lead:
0089 F1 00 175 lda cnt_ir_rcv
+ 176 ;//考虑到要滤除毛刺,最小判断去掉?
+ 177 ; cmpe #cnt_ir_lead_min ;cnt_ir_rcv>=cnt_ir_lead_min,c=1 ok
+ 178 ; brnc INT2_isr_end ;c=0,too small,error,jump and exit
008B A7 1D 179 cmpe #cnt_ir_lead_max ;cnt_ir_rcv>=cnt_ir_lead_max,c=1 jump
008D 04 00 58 180 brc ir_rcv_data_err ;too big,error and exit,the status will be cleared in timer1_isr
0090 A7 16 181 cmpe #cnt_ir_lead_min ;c/=1,is too small,error.c=1 is ok,
0092 05 00 58 182 brnc ir_rcv_data_err
0095 F3 02 183 lda #2
0097 FD 03 184 sta status_ir_rcv ;lead ok,ready to receive data
0099 F3 00 185 lda #0
009B FD 04 186 sta ir_rcv_data ;clear receive data registor
009D FD 00 187 sta cnt_ir_rcv ;clear ir receive counter,it will increase in timer1_isr
009F 02 00 AD 188 br INT2_isr_end
00A2 189 ir_rcv_first:
00A2 F3 01 190 lda #1 ;the first entry INT,
00A4 FD 03 191 sta status_ir_rcv
00A6 F3 00 192 lda #0
00A8 FD 00 193 sta cnt_ir_rcv
00AA 02 00 AD 194 br INT2_isr_end
00AD 195 INT2_isr_end:
+ 196 ; lda #10000000b ;draw up the INT2 port
+ 197 ; ora r_prtd
+ 198 ; sta r_prtd
+ 199
00AD F1 02 200 lda temp_dp_3
00AF FC 21 201 sta r_dp
00B1 F1 01 202 lda temp_op1_3
00B3 FC 22 203 sta r_op1
00B5 F1 00 204 lda temp_a_3
00B7 25 205 reti ;/*04-06-30/
+
+Symbol Table
+
+ 2 INT2_isr 0000 GR
+ 2 INT2_isr_end 00AD R
+ cheese_broadcast_data = 005A
+ cheese_touched_data = 00E1
+ cnt_broadcast_tmr **** GX
+ cnt_ir_data0_max = 000C
+ cnt_ir_data_max = 0013
+ cnt_ir_data_min = 0004
+ cnt_ir_lead_max = 001D
+ cnt_ir_lead_min = 0016
+ cnt_ir_rcv **** GX
+ 1 flg_rcv_barrier 0009 GR
+ 1 flg_rcv_broadcast 0005 GR
+ 1 flg_rcv_touched 0008 GR
+ 1 ir_rcv_data 0004 GR
+ 2 ir_rcv_data_err 0058 R
+ 2 ir_rcv_data_ok 003C R
+ 2 ir_rcv_data_ok_bc 0075 R
+ 2 ir_rcv_data_ok_self 0082 R
+ 2 ir_rcv_data_ok_touched 0063 R
+ 2 ir_rcv_first 00A2 R
+ 2 ir_rcv_lead 0089 R
+ mouse_self_data = 000F
+ 1 status_ir_rcv 0003 GR
+ status_ir_transmit **** GX
+ 1 temp_a_3 0000 GR
+ 1 temp_count 0006 GR
+ 1 temp_dp_3 0002 GR
+ 1 temp_op1_3 0001 GR
+
+
+Area Table
+
+ 0 . size 0 flags 0
+ 1 INT1_var size A flags 2
+ 2 INT2_isr size B8 flags 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -