📄 ir_m3004.asm
字号:
.ifnz IR_M3004
;;--------------------------------------------------------------
SRAM_PG1: .section ;;PAGE1 start
;;--------------------------------------------------------------
lda IrStateFlag
cmp #IR_IDLE_STATE
beq M_idle_state
cmp #IR_HIGH_STATE
beq M_high_state
cmp #IR_LOW_STATE
beq Pre_M_low_state
bra M_idle_state
Pre_M_low_state:
jmp M_low_state
;;===========================================================================
M_idle_state:
lda IR_PORT
and #IR_IN
beq Idle_low
lda First_pulse_flag
cmp #1
bne pre_M_error_handle
stz Idle_counter ;;clear Idle_counter
stz First_pulse_flag ;;clear First_pulse_flag
lda #IR_HIGH_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
Idle_low:
inc Idle_counter
lda Idle_counter
cmp #BIT_1_TOP
bcc Exit_idle_state
stz Idle_counter
lda #1
sta First_pulse_flag
Exit_idle_state:
lda #IR_IDLE_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
pre_M_error_handle:
jmp M_error_handle
;;===========================================================================
M_high_state:
lda IR_PORT
and #IR_IN
bne Exit_high_state
lda Level_high_flag
cmp #1
bne Process_next_pulse ;;fisrt pulse
stz Level_high_flag ;;clear Level_high_flag
lda Bit01_counter
cmp #BIT_1_TOP ;;max length
bcs M_error_handle
cmp #BIT_1_BOTTOM
bcs Bit_is_1
cmp #BIT_0_BOTTOM
bcs Bit_is_0
jmp M_error_handle
Bit_is_1:
sec
bra Receive_bit_end
Bit_is_0:
clc
Receive_bit_end:
rol Last_8bit_data
rol First_5bit_data
inc Data_bit_counter
lda Data_bit_counter
cmp #13
bne Process_next_pulse
stz Data_bit_counter
jmp ProcessIRData ;;exit and receive data
Process_next_pulse:
stz Bit01_counter ;;clear Bit01_counter
lda #IR_LOW_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
Exit_high_state:
lda Level_high_flag
cmp #1
bne No_increment_counter
inc Bit01_counter
No_increment_counter:
lda #IR_HIGH_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
;;===========================================================================
M_low_state:
lda IR_PORT
and #IR_IN
beq Exit_low_state
lda #1
sta Level_high_flag
lda #IR_HIGH_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
Exit_low_state:
inc Bit01_counter
lda #IR_LOW_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
M_error_handle:
stz Idle_counter
stz Bit01_counter
stz Data_bit_counter
lda #IR_IDLE_STATE
sta IrStateFlag
jmp Exit_IR_interrupt
ProcessIRData:
lda First_5bit_data
and #%00010111
eor #%00010101
bne M_error_handle
;;lda Last_8bit_data
;;and #%00000011
;;eor #%00000000
;;bne M_error_handle
lda Prev_first5bit
cmp First_5bit_data
bne SendIRdataToRISC
lda Prev_last8bit
cmp Last_8bit_data
bne SendIRdataToRISC
inc DataRepeatCounter
lda IOP_DATA5_H
and #$0f
cmp DataRepeatCounter
bne ClearRepeatCounter
stz DataRepeatCounter
lda IOP_DATA5_H
ora #%11000000
sta IOP_DATA5_H
bra Exit_receive_data
ClearRepeatCounter:
lda IOP_DATA5_H
and #%10111111
sta IOP_DATA5_H
bra Exit_receive_data
SendIRdataToRISC:
lda Last_8bit_data
sta Prev_last8bit
lda First_5bit_data
sta Prev_first5bit
lda Last_8bit_data
sta IOP_DATA5_L
lda First_5bit_data
and #%00000111
sta IOP_DATA6_L
lda IOP_DATA5_H
and #$80
bne Exit_receive_data
lda IOP_DATA5_H
ora #%10000000
sta IOP_DATA5_H
Exit_receive_data:
stz First_5bit_data
stz Last_8bit_data
lda #IR_IDLE_STATE
sta IrStateFlag
Exit_IR_interrupt:
;;===========================================================================
.endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -