📄 pocsag_decoder.lst
字号:
0114: 93 17 CALL _PGA_1_SetGain
(0075)
(0076)
(0077) mov reg[PRT0DR], 80h ;POWER LED ON
0116: 62 00 80 MOV REG[0],128
(0078)
(0079) ;Power-ON LEDs test
(0080) mov reg[PRT2DR], 07h ;rate LEDs ON
0119: 62 08 07 MOV REG[8],7
(0081) mov reg[RES_WDT], 38h ; reset the sleep timer
011C: 62 E3 38 MOV REG[227],56
(0082) or reg[INT_MSK0],40h ;enable sleep interrupt
011F: 43 E0 40 OR REG[224],64
0122: 71 01 OR F,1
(0083) M8C_EnableGInt ;enable global interrupts
(0084)
(0085) lp_sleep: ;Sleep timer period is 1 sec.,
(0086) mov A, reg[INT_MSK0] ;ones interrupt is ocurred, it will be disabled
0124: 5D E0 MOV A,REG[224]
(0087) jnz lp_sleep ;so wait untill INT_MSK0 is zero!
0126: BF FD JNZ 0x0124
0128: 70 FE AND F,254
(0088) M8C_DisableGInt ;disable Global INT
(0089) mov REG[PRT2DR], 00h ;rate LEDs OFF
012A: 62 08 00 MOV REG[8],0
(0090)
(0091) ;Varibles Init
(0092) mov [inverse], 0 ;reset inverse flag
012D: 55 0C 00 MOV [12],0
(0093) mov [batch_cnt], 0 ;reset batch counter
0130: 55 0D 00 MOV [13],0
(0094) mov [sample_cnt], 0 ;reset sampling counter
0133: 55 09 00 MOV [9],0
(0095) mov [bit_ptr], 0 ;reset bit pointer
0136: 55 04 00 MOV [4],0
(0096) mov [ready], 0 ;reset ready flag
0139: 55 01 00 MOV [__r0+1],0
(0097) mov [start], 0 ;reset start flag
013C: 55 02 00 MOV [__r0+2],0
(0098)
(0099) ;Timer Init
(0100) mov A, FFh ;timer period 2ms
013F: 50 FF MOV A,255
(0101) call Timer8_1_WritePeriod ;write timer period
0141: 91 BC CALL _Timer8_1_WritePeriod
(0102) nop
0143: 40 NOP
(0103) call Timer8_1_Start ;start timer
0144: 91 B1 CALL _Timer8_1_Start
(0104) call Timer8_1_EnableInt ;enable timer INT
0146: 91 9D CALL Timer8_1_EnableInt
0148: 43 E0 20 OR REG[224],32
014B: 71 01 OR F,1
(0105) M8C_EnableIntMask INT_MSK0, INT_MSK0_GPIO ;enable GPIO INT
(0106)
(0107) l_start:
(0108)
(0109) M8C_EnableGInt ;enable Global INT
(0110)
(0111) l_wait: nop ;wait untill ready flag is set
014D: 40 NOP
(0112) mov A, [ready]
014E: 51 01 MOV A,[__r0+1]
(0113) jz l_wait
0150: AF FC JZ 0x014D
0152: 70 FE AND F,254
(0114)
(0115) M8C_DisableGInt ;disable Global INT
(0116) mov [ready], 0 ;reset ready flag
0154: 55 01 00 MOV [__r0+1],0
(0117) mov A, [sample_cnt] ;check for timer overflow
0157: 51 09 MOV A,[9]
(0118) jz l_search ;
0159: A0 09 JZ 0x0163
(0119) mov [sample_cnt], 0 ;reset sample_cnt
015B: 55 09 00 MOV [9],0
(0120) mov [bit_ptr], 0 ;reset bit_ptr
015E: 55 04 00 MOV [4],0
(0121) jmp l_start ;start over
0161: 8F E9 JMP 0x014B
(0122)
(0123) l_search:
(0124) ;if timer is not overflows, check data rate
(0125) mov X, 0
0163: 57 00 MOV X,0
(0126) mov A, [rate] ;load rate into Acc.
0165: 51 03 MOV A,[__r0+3]
(0127) cmp A, RATE_2400_HI
0167: 39 DA CMP A,218
(0128) jnc brn_search_end ;finish search if rate > 2400 hi margin
0169: D0 28 JNC 0x0192
(0129) cmp A, RATE_2400_LO
016B: 39 BC CMP A,188
(0130) jc brn_search_1200 ;continue if rate < 2400 lo margin
016D: C0 08 JC 0x0176
(0131) mov X, 01h ;it is in 2400 range, set bit 0
016F: 57 01 MOV X,1
(0132) mov [sampling_rate], SAMPLING_RATE_2400 ;set sampling rate
0171: 55 0A 05 MOV [10],5
(0133) jmp brn_search_end ;finish search
0174: 80 1D JMP 0x0192
(0134)
(0135) brn_search_1200:
(0136) cmp A, RATE_1200_HI
0176: 39 B5 CMP A,181
(0137) jnc brn_search_end ;finish search if rate > 1200 hi margin
0178: D0 19 JNC 0x0192
(0138) cmp A, RATE_1200_LO
017A: 39 79 CMP A,121
(0139) jc brn_search_512 ;;continue if rate < 1200 lo margin
017C: C0 08 JC 0x0185
(0140) mov X, 02h ;it is in 1200 range, set bit 1
017E: 57 02 MOV X,2
(0141) mov [sampling_rate], SAMPLING_RATE_1200 ;set sampling rate
0180: 55 0A 0B MOV [10],11
(0142) jmp brn_search_end ;finish search
0183: 80 0E JMP 0x0192
(0143)
(0144) brn_search_512:
(0145) cmp A, RATE_512_HI
0185: 39 47 CMP A,71
(0146) jnc brn_search_end ;finish search if rate > 512 hi margin
0187: D0 0A JNC 0x0192
(0147) cmp A, RATE_512_LO
0189: 39 01 CMP A,1
(0148) jc brn_search_end ;finish search if rate < 512 lo margin
018B: C0 06 JC 0x0192
(0149) mov X, 04h ;it is in 512 range, set bit 3
018D: 57 04 MOV X,4
(0150) mov [sampling_rate], SAMPLING_RATE_512 ;set sampling rate
018F: 55 0A 1A MOV [10],26
(0151)
(0152) brn_search_end:
(0153) mov A, X
0192: 5B MOV A,X
(0154) jnz l_preamb ;if rate does not match
0193: B0 06 JNZ 0x019A
(0155) mov [bit_ptr], 0 ;reset bit_ptr
0195: 55 04 00 MOV [4],0
(0156) jmp l_start ;start over
0198: 8F B2 JMP 0x014B
(0157)
(0158) l_preamb:
(0159) ;if rate does match
(0160) mov A, [bit_ptr]
019A: 51 04 MOV A,[4]
(0161) jnz brn_ptr_1 ;if it is the first bit
019C: B0 07 JNZ 0x01A4
(0162) inc [bit_ptr] ;increment bit_ptr
019E: 76 04 INC [4]
(0163) mov [saved_bit], X ;save search result as saved_bit
01A0: 5A 0B MOV [11],X
(0164) jmp l_start ;start for the next bit
01A2: 8F A8 JMP 0x014B
(0165)
(0166) brn_ptr_1:
(0167) ;if it is not first bit
(0168) mov A, X
01A4: 5B MOV A,X
(0169) and A, [saved_bit] ;if search result does not
01A5: 22 0B AND A,[11]
(0170) jnz brn_ptr_2 ;match previos results
01A7: B0 06 JNZ 0x01AE
(0171) mov [bit_ptr], 0 ;reset bit_ptr
01A9: 55 04 00 MOV [4],0
(0172) jmp l_start ;start over
01AC: 8F 9E JMP 0x014B
(0173)
(0174) brn_ptr_2:
(0175) ;if search result matches previos one
(0176) inc [bit_ptr] ;increment bit_ptr
01AE: 76 04 INC [4]
(0177) cmp [bit_ptr], RATE_CHECK ;if counter does not reach RATE_CHECK
01B0: 3C 04 FF CMP [4],255
(0178) jc l_start ;start for the next bit
01B3: CF 97 JC 0x014B
(0179)
(0180) ;if search result shows valid data rate and it consistent
(0181) ;for RATE_CHECK times, assume that receiving data is POCSAG preambule.
(0182) ;Init varibles, set start flag and set timer period to recived data rate
(0183) mov REG[PRT2DR], A ;turn 512, 1200, or 2400 rate LED
01B5: 60 08 MOV REG[8],A
(0184) mov A, 0
01B7: 50 00 MOV A,0
(0185) mov [bit_ptr], A
01B9: 53 04 MOV [4],A
(0186) mov [hi_cnt], A
01BB: 53 05 MOV [5],A
(0187) mov [lo_cnt], A
01BD: 53 06 MOV [6],A
(0188) mov [byte_cnt], A
01BF: 53 08 MOV [8],A
(0189) mov [data], A
01C1: 53 07 MOV [7],A
(0190) mov [start], 1 ;set start flag
01C3: 55 02 01 MOV [__r0+2],1
(0191) mov A, [sampling_rate] ;rate for sampling
01C6: 51 0A MOV A,[10]
(0192) call Timer8_1_WritePeriod ;write timer period
01C8: 91 35 CALL _Timer8_1_WritePeriod
01CA: 71 01 OR F,1
(0193) M8C_EnableGInt ;enable Global INT
(0194)
(0195)
(0196) lp_sample: nop ;wait until counter reaches
01CC: 40 NOP
(0197) cmp [sample_cnt], SAMPLE_NUM ;number SAMPLE_NUM
01CD: 3C 09 09 CMP [9],9
(0198) jc lp_sample
01D0: CF FB JC 0x01CC
01D2: 70 FE AND F,254
(0199) M8C_DisableGInt ;disable Global INT
(0200) mov A, [hi_cnt]
01D4: 51 05 MOV A,[5]
(0201) cmp A, [lo_cnt] ;if hi_cnt < lo_cnt
01D6: 3A 06 CMP A,[6]
(0202) jc .brn_temp ;do nothing
01D8: C0 04 JC 0x01DD
(0203) or [data], 1 ;else, LSB bit of data set to 1
01DA: 2E 07 01 OR [7],1
(0204) .brn_temp:
(0205) mov A, 0
01DD: 50 00 MOV A,0
(0206) mov [hi_cnt], A ;reset hi_cnt
01DF: 53 05 MOV [5],A
(0207) mov [lo_cnt], A ;reset lo_cnt
01E1: 53 06 MOV [6],A
(0208) mov [sample_cnt], A ;reset sampling counter
01E3: 53 09 MOV [9],A
01E5: 71 01 OR F,1
(0209) M8C_EnableGInt ;enable Global INT
(0210) mov A, [bit_ptr]
01E7: 51 04 MOV A,[4]
(0211) cmp A, MSB_NUM
01E9: 39 07 CMP A,7
(0212) jz lp_next_byte ;if bit_ptr != MSB_NUM
01EB: A0 08 JZ 0x01F4
(0213) inc A ;inc. bit_ptr
01ED: 74 INC A
(0214) mov [bit_ptr], A
01EE: 53 04 MOV [4],A
(0215) asl [data] ;shift data to the left
01F0: 65 07 ASL [7]
(0216) jmp lp_sample ;start sampling again
01F2: 8F D9 JMP 0x01CC
(0217)
(0218) lp_next_byte:
(0219) ;if bit_ptr == MSB_NUM
(0220) mov A, [byte_cnt]
01F4: 51 08 MOV A,[8]
(0221) jnz lp_not_first_byte ;if byte_cnt == 0
01F6: B0 34 JNZ 0x022B
(0222) mov A, [batch_cnt]
01F8: 51 0D MOV A,[13]
(0223) jnz lp_not_first_batch ;and if batch_cnt == 0
01FA: B0 22 JNZ 0x021D
(0224) mov A, [data]
01FC: 51 07 MOV A,[7]
(0225) mov X, A
01FE: 5C MOV X,A
(0226) cmp A, 0x54 ;if data != 0x54
01FF: 39 54 CMP A,84
(0227) jz lp_first_byte
0201: A0 0A JZ 0x020C
(0228) cpl A ;invert data
0203: 73 CPL A
(0229) cmp A, 0x54 ;check again, if data != 0x54
0204: 39 54 CMP A,84
(0230) jz lp_first_byte
0206: A0 05 JZ 0x020C
(0231) asl [data] ;shift data to the left
0208: 65 07 ASL [7]
(0232) jmp lp_sample ;start sampling again
020A: 8F C1 JMP 0x01CC
(0233)
(0234) lp_first_byte:
(0235) ;if data or inverted data == 0x54
(0236) mov A, X
020C: 5B MOV A,X
(0237) cmp A, 0xAB ;if data is inverted
020D: 39 AB CMP A,171
(0238) jnz .temp
020F: B0 04 JNZ 0x0214
(0239) mov [inverse], 1 ;set inverse flag
0211: 55 0C 01 MOV [12],1
(0240) .temp:
(0241) asl [data] ;shift data to the left
0214: 65 07 ASL [7]
(0242) mov [bit_ptr], 1 ;set bit_ptr to 1 (first bit after preambule)
0216: 55 04 01 MOV [4],1
(0243) inc [byte_cnt] ;inc. byte_cnt
0219: 76 08 INC [8]
(0244) jmp lp_sample ;start sampling again
021B: 8F B0 JMP 0x01CC
(0245)
(0246) lp_not_first_batch:
(0247) ;if byte_cnt == 0 and batch_cnt != 0
(0248) mov A, [data]
021D: 51 07 MOV A,[7]
(0249) cmp [inverse], 1 ;if inverse == 1
021F: 3C 0C 01 CMP [12],1
(0250) jnz .temp
0222: B0 02 JNZ 0x0225
(0251) cpl A ;inverse data
0224: 73 CPL A
(0252) .temp:
(0253) cmp A, 0x7C ;if data != begining of the next batch
0225: 39 7C CMP A,124
(0254) jnz lp_end ;end receving
0227: B0 24 JNZ 0x024C
(0255) inc [byte_cnt] ;else inc. byte_cnt
0229: 76 08 INC [8]
(0256)
(0257) lp_not_first_byte:
(0258) ;if byte_cnt != 0
(0259) mov [bit_ptr], 0 ;reset bit_ptr
022B: 55 04 00 MOV [4],0
(0260) mov A, [data]
022E: 51 07 MOV A,[7]
(0261) cmp [inverse], 1 ;if inverse == 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -