⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pocsag_decoder.lst

📁 A very good POCSAG Paging Protocol Decoder.
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -