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等。
上述解释中的反码不是严格意义上的反码,只是原码按位取反的意思。
谢谢!
...全文
346 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
nes-c 2014-12-10
  • 打赏
  • 举报
回复
问题已经解决了: 主要是两个问题:1,该代码将物理键值进行了转换,固定了receive+1为82, 2,将改代码在底层进行了检测,去除了receive 和receive+1不是相反关系的码值。 解决问题1,主要去掉了这四句: ;; lda rIrReceiver ;;check IR code is right? ;; eor rIrReceiver+1 ;; cmp #$ff 这四句是对比键值和键值反码是否对应, ;; bne lIrCodeErr 上述四句的意思是:将rlrReceive放置到寄存器A,然后与rlrReceive+1进行异或,将异或的结果与0xff进行对比,如果不相等就跳转到错误, 其实就是对比rIrReceiver和rIrReceiver+1是不是相反码。 解决问题2,去掉了 bit IOP_DATA5_H 等与 IOP_DATA5_H 相关的语句,因为从上层代码发现键值放置到寄存器iop_data[5]中,所以后续处理并将值进行改变后的语句去掉就OK了,不能全部去掉,要先将值放进去以后才能去掉。
nes-c 2014-12-08
  • 打赏
  • 举报
回复
  前面发了就电脑卡机了,没想到还是发出去了, 请大神们,帮忙看看这段代码。   这是IR通信的底层汇编代码,主要信息有:NEC通信协议,前面有9+4.5ms的前导码,然后是数据码 ,分别是客户码,客户码反码和键值,以及键值反码,共8*4 = 32位。   数据符合规则,只要问题是,键值被替换成了82,无论发送什么数据到上层就只会打印82了。   例如接收到的数据:0x55aa821a,55aa是客户码及其反码,后面82成了固定码了,我分析了物理波形原始值不是82,只是该汇编处理以后就变成了82了,最后1a等是键值。   我需要将82也传到应用层,也就是IOP_data5里面。

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧