📄 ir_nec.asm
字号:
.ifnz IR_NEC
lda IR_PORT
and #IR_IN
cmp rIrBitStatus
bne lIrBitChange
inc rIrBitKeepLen ;;increase len
lda rIrBitKeepLen
cmp #IR_MAX_PULSE_LEN
bcs lAddHiByte ;;if len count > max -> from head
jmp lIrqIrExit
lAddHiByte:
inc rIrBitKeepLenH
lda rIrBitKeepLenH
cmp #IR_MAX_TWO_DATA_LEN
bcc lCheckFromHead ;;max count to 9
;;clear repeat control bit
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
;;--------------------------------------------------------------
SRAM_PG1: .section ;;PAGE1 start
;;--------------------------------------------------------------
lProcessIrState:
;;clear Hi-Byte counter
stz rIrBitKeepLenH
;;do process according current state
lda rIrState
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
lCheckNextState01:
jmp lIrDetectFromHead
lProcAddrData:
;;check the bit sign
txa
and #IR_IN
bne lSignDetectIsHi001
;;pervious sign is high
lda rIrBitKeepLen
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:
bbs 4,IOP_DATA5_H,lSkipCheckData ;;iop[5] , bit 12
;;check IR code is right?
lda rIrReceiver
eor rIrReceiver+1
cmp #$ff
bne lIrCodeErr
lSkipCheckData:
;;check and save customer code
;;lda rIrReceiver+3
;;sta rRecIrCustCode+1 ;;save customer code
;;lda rIrReceiver+2
;;sta rRecIrCustCode ;;save customer code
;;cmp rIrCustCode
;;bne lIrCodeErr
;;lda rIrReceiver+3
;;cmp rIrCustCode+1
;;bne lIrCodeErr
;;save address code
lda rIrReceiver+3
sta IOP_DATA6_H
lda rIrReceiver+2
sta IOP_DATA6_L
;;IR code is right
bbs 4,IOP_DATA5_H,lGet16bitLow
lda rIrReceiver+1
bra lGetLastIrDataOk
lGet16bitLow:
lda rIrReceiver
lGetLastIrDataOk:
sta IOP_DATA5_L ;;save to IOP_DATA5_L
.if 0 ;;standby mode code
;;check power key
lda bCheckIRPower
beq lNotEqualIR
lda IOP_DATA5_L
cmp IRPowerCode
bne lNotEqualIR
jmp lResetAll
lNotEqualIR:
.endif
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 #$0f ;;reset repeat count
sta rIrRepeateRate
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
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -