IR_NEC协议的底层处理汇编求解释
nes-c 2014-12-05 01:56:01
.ifnz IR_NEC
lda IR_PORT ;; 口 GPIO_PORT7_IN
and #IR_IN ;;%00100000
cmp rIrBitStatus 比较ir标志位的状态
bne lIrBitChange 不符合条件就跳转,
inc rIrBitKeepLen ;;increase len
lda rIrBitKeepLen
cmp #IR_MAX_PULSE_LEN ;;12ms
bcs lAddHiByte ;;if len count > max -> from head
jmp lIrqIrExit
lAddHiByte:
inc rIrBitKeepLenH
lda rIrBitKeepLenH
cmp #IR_MAX_TWO_DATA_LEN ;;(9+2) =108/12ms
bcc lCheckFromHead ;;max count to 9
lda rRepValid ;;
beq lDetectRepeatStop
lda rRepValidCount
cmp #1
bcc lDetectRepeatStop
stz rRepValidCount
stz rIrBitKeepLenH
stz rRepValid
lda IOP_DATA5_H
ora #IR_REPEAT_STOP
ora #IR_READY ;;set ready flag
sta IOP_DATA5_H
jmp lsetIRISR
lDetectRepeatStop:
;;clear repeat control bit
stz rRepValidCount
stz rIrBitKeepLenH
stz rRepValid ;;can't accept repeat code
lCheckFromHead:
jmp lIrDetectFromHead
lIrBitChange:
;;IR bit is change
sta rIrBitStatus ;;keep now status
tax ;;save on x
jmp lProcessIrState
lProcessIrState:
stz rIrBitKeepLenH ;;clear Hi-Byte counter
lda rIrState ;;do process according current state
cmp #IR_CHK_HEAD
bne lContinueCheck
jmp lProcHeadCode
lContinueCheck:
cmp #IR_CHK_OFF
bne lCheckNextState00
jmp lProcOffCode
lCheckNextState00:
cmp #IR_CHK_ADDR_DAT
beq lProcAddrData
jmp lIrDetectFromHead
lProcAddrData: ;;check the bit sign
txa
and #IR_IN
bne lSignDetectIsHi001
lda rIrBitKeepLen ;;pervious sign is high
cmp #IR_HI_PULSE ;;1680us
bcs lDataIsHi
cmp #IR_LOW_PULSE
bcs lDataIsLow
jmp lIrDetectFromHead
lDataIsLow:
clc
bcc lToMakeIrData
lDataIsHi:
sec
lToMakeIrData:
rol rIrReceiver ;;键值
rol rIrReceiver+1 ;; 键值反码
rol rIrReceiver+2 ;;客户码
rol rIrReceiver+3 ;;客户码反码
bcs lGetIrDataOk ;;check the last bit shift out ?
jmp lClearLenExit
lGetIrDataOk:
lda IOP_DATA5_H 取出DATA5里的数据到寄存器
sta rTmpBuffer 从寄存器放到rTmpBuffer中 上两句相当于mov IOP_DARA5_H rTmpBuffer
;;bbs 4,IOP_DATA5_H,lSkipCheckData ;;iop[5] , bit 12
bbs 4,rTmpBuffer,lSkipCheckData ;;iop[5] , bit 12 IOP【5】就是键值基层器,在上层可以读到
;; lda rIrReceiver ;;check IR code is right?
;; eor rIrReceiver+1
;; cmp #$ff 这四句是对比键值和键值反码是否对应,
;; bne lIrCodeErr
lSkipCheckData:
lda rIrReceiver+3 ;;save address code
sta IOP_DATA6_H
lda rIrReceiver+2
sta IOP_DATA6_L
lda IOP_DATA5_H ;;IR code is right
sta rTmpBuffer
bbs 4,rTmpBuffer,lGet16bitLow ;;changed for bbs
;;bbs 4,IOP_DATA5_H,lGet16bitLow
lda rIrReceiver+1
bra lGetLastIrDataOk
lGet16bitLow:
lda rIrReceiver
lGetLastIrDataOk:
sta IOP_DATA5_L ;;save to IOP_DATA5_L
lda IOP_DATA5_H
and #!IR_REPEAT ;;clear repeat flag
lCheckTheReplaceFlag:
bit IOP_DATA5_H
bpl lPerviousNoKey
ora #IR_REPLACE ;;set replace flag
bne lSetReplaceFlagOk
lPerviousNoKey:
and #!IR_REPLACE ;;clear replace flag
lSetReplaceFlagOk:
ora #IR_READY ;;set ready flag
sta IOP_DATA5_H
sta rRepValid ;;can accept repeat code
and #$07 ;;reset repeat count
sta rIrRepeateRate
lsetIRISR:
lda ISR_REG;;IOP_DATA11_H ;;venter added for IR ISR
ora #IR_ISR
sta ISR_REG;;IOP_DATA11_H
smb INT_RISCA_bit,Reset_RISC ;;risc0
smb INT_RISCB_bit,Reset_RISC ;;risc1 ;;2010/6/1 lizhan modify for fix mantis bug 0090338
nop
nop
nop
nop
nop
nop
rmb INT_RISCA_bit,Reset_RISC
rmb INT_RISCB_bit,Reset_RISC ;;risc1 ;;2010/6/1 lizhan modify for fix mantis bug 0090338
jmp lIrDetectFromHead
lSignDetectIsHi001: ;;pervious sign is low
lda rIrBitKeepLen
cmp #IR_LOW_PULSE ;;560us
bcs lCheckNextPulse
lIrCodeErr:
jmp lIrDetectFromHead
lCheckNextPulse:
jmp lClearLenExit
;;**************************************************************
lProcHeadCode:
;;check the bit sign
txa
and #IR_IN
beq lIrDetectFromHead ;;0 is fail
lda rIrBitKeepLen
cmp #IR_HEAD_PULSE_LEN ;;70~80 (9000us)
bcc lIrDetectFromHead
lHeadCodeIsRight:
lda #IR_CHK_OFF ;;go next state
sta rIrState
jmp lClearLenExit
;;**************************************************************
lProcOffCode:
;;check the bit sign
txa
and #IR_IN
bne lIrDetectFromHead ;;1 is fail
lda rIrBitKeepLen
cmp #IR_OFF_PULSE_LEN ;;35~40 (4500us)
bcs lOffCodeIsRight
cmp #IR_REP_PULSE_LEN ;;20 ~22 (2500us)
bcs lOffCodeIsRepeat
jmp lIrDetectFromHead
lOffCodeIsRight:
lda #IR_CHK_ADDR_DAT ;;go next state
sta rIrState
;;lda #0
stz rIrReceiver+1
stz rIrReceiver+2
stz rIrReceiver+3
lda #1 ;;32 bit = 0x00000001
sta rIrReceiver
jmp lClearLenExit
lOffCodeIsRepeat:
lda rRepValid ;;if has code
beq lIrDetectFromHead
lda rIrRepeateRate
bne lNoAcceptRepeat
lda IOP_DATA5_H
ora #IR_REPEAT
inc rRepValidCount
jmp lCheckTheReplaceFlag
lNoAcceptRepeat:
dec rIrRepeateRate
;;detect from head
;;**************************************************************
lIrDetectFromHead:
lda #IR_CHK_HEAD ;;process state from head code
sta rIrState
lClearLenExit:
lda #1
sta rIrBitKeepLen
.endif
主要帮忙分析哪一块跟将82替换掉键值有关,然后几个指令稍微解释一下,bcc bcs bbs等。
上述解释中的反码不是严格意义上的反码,只是原码按位取反的意思。
谢谢!