;************************************************************************ ;** ATV 23/13 RX/TX Synth TSA5511 controller (c) PE1MTH 1-1-95 ** ;************************************************************************ ; ; The synth. works with a 62500 Hz Raster ; In Receiving mode, there is a prescaler of 2 making a raster of 125000 Hz ; In Transmission mode, there is a prescaler of 2 (13 cm) making a raster of ; 250000 Hz **** 96 channels **** ; ;----------------------------------------------------------------------- LIST P=16C84 ; Processor type LIST R=DEC ; Default RADIX INCLUDE "PICREG.EQU" ; Predefinitions CHANNELS EQU 96 ; Maximum amount om channels KEYDELAY EQU 20 ; amount of main loops (repeat time delay) freq00 EQU 1220 freq01 EQU 1221 freq02 EQU 1222 freq03 EQU 1223 freq04 EQU 1224 freq05 EQU 1225 freq06 EQU 1226 freq07 EQU 1227 freq08 EQU 1228 freq09 EQU 1229 freq10 EQU 1230 freq11 EQU 1231 freq12 EQU 1232 freq13 EQU 1233 freq14 EQU 1234 freq15 EQU 1235 freq16 EQU 1236 freq17 EQU 1237 freq18 EQU 1238 freq19 EQU 1239 freq20 EQU 1240 freq21 EQU 1241 freq22 EQU 1242 freq23 EQU 1243 freq24 EQU 1244 freq25 EQU 1245 freq26 EQU 1246 freq27 EQU 1247 freq28 EQU 1248 freq29 EQU 1249 freq30 EQU 1250 freq31 EQU 1251 freq32 EQU 1252 freq33 EQU 1253 freq34 EQU 1254 freq35 EQU 1255 freq36 EQU 1256 freq37 EQU 1257 freq38 EQU 1258 freq39 EQU 1259 freq40 EQU 1260 freq41 EQU 1261 freq42 EQU 1262 freq43 EQU 1263 freq44 EQU 1264 freq45 EQU 1265 freq46 EQU 1266 freq47 EQU 1267 freq48 EQU 1268 freq49 EQU 1269 freq50 EQU 1270 freq51 EQU 1271 freq52 EQU 1272 freq53 EQU 1273 freq54 EQU 1274 freq55 EQU 1275 freq56 EQU 1276 freq57 EQU 1277 freq58 EQU 1278 freq59 EQU 1279 freq60 EQU 1280 freq61 EQU 1281 freq62 EQU 1282 freq63 EQU 1283 freq64 EQU 1284 freq65 EQU 1285 freq66 EQU 1286 freq67 EQU 1287 freq68 EQU 1288 freq69 EQU 1289 freq70 EQU 1290 freq71 EQU 1291 freq72 EQU 1292 freq73 EQU 1293 freq74 EQU 1294 freq75 EQU 1295 freq76 EQU 1296 freq77 EQU 1297 freq78 EQU 1298 freq79 EQU 1299 freq80 EQU 1300 freq81 EQU 1301 freq82 EQU 1302 freq83 EQU 1303 freq84 EQU 1304 freq85 EQU 1305 freq86 EQU 1306 freq87 EQU 1307 freq88 EQU 1308 freq89 EQU 1309 freq90 EQU 1310 freq91 EQU 1311 freq92 EQU 1312 freq93 EQU 1313 freq94 EQU 1314 freq95 EQU 1315 ;MFPLUS0 EQU 0x00 ; MF 489500 ;MFPLUS1 EQU 0x07 ;MFPLUS2 EQU 0x78 ;MFPLUS3 EQU 0x1c ;MFMIN0 EQU 0xff ; MF -489500 ;MFMIN1 EQU 0xf8 ;MFMIN2 EQU 0x87 ;MFMIN3 EQU 0xe3 MFPLUS0 EQU 0x00 ; MF 489500 MFPLUS1 EQU 0x07 MFPLUS2 EQU 0x78 MFPLUS3 EQU 0x1c MFMIN0 EQU 0xff ; MF -489500 MFMIN1 EQU 0xf8 MFMIN2 EQU 0x87 MFMIN3 EQU 0xe3 BANDADD EQU 1125 ;;ra EQU 5 ;;rb EQU 6 ;;rc EQU 7 DJNZ MACRO var, address DECFSZ var ; 1 uS GOTO address ; 2 uS ENDM DELAY MACRO var ; 2 + var * 3 uS cycles... LOCAL loopx MOVLW var ; 1 uS MOVWF dummy ; 1 uS loopx DJNZ dummy, loopx ; 3 uS ENDM ;** Register usage * BASE SET 0x0c counter EQU BASE dummy EQU BASE+1 oldport EQU BASE+2 value EQU BASE+3 BASE SET BASE+4 count EQU BASE temp EQU BASE+1 value_h EQU BASE+2 value_l EQU BASE+3 r0 EQU BASE+4 r1 EQU BASE+5 r2 EQU BASE+6 BASE SET BASE+7 disp1 EQU r0 ; Share it (Saving 3 regs) disp2 EQU r1 disp3 EQU r2 disp4 EQU BASE BASE SET BASE+1 FREQ_NR EQU BASE KEYDELAYCNT EQU BASE+1 DISPLAY_NR EQU BASE+2 BASE SET BASE+5 ; D = Key pressed longer ; P = Key pressed loop flag ; NN = Key number 0..3 ;******************* _I2CPORT EQU Port_B _SCL EQU CLB _SDA EQU DAT _SCLMASK EQU 1 << _SCL _SDAMASK EQU 1 << _SDA _I2CCOUNT EQU MULT2a _I2CVALUE EQU MULT2b _I2CDUMMY EQU MULT2c _I2CADRES EQU MULT2d ;**** Bit field **** KEY1 EQU 0 KEY2 EQU 1 DLEN EQU 5 ; Connections port B DAT EQU 6 ; SDA CLB EQU 7 ; SCL PTT EQU 0 ; Port RA BAND EQU 1 KEYPORT EQU 3 ;******************* ;*** EEPROM field *** EEP_FREQ EQU 16 ;******************** main ; MOVLW 0 ; MOVWF EEADR ; MOVLW 0 ; MOVWF EEDATA ; CALL EE_WRITE MOVLW 255 MOVWF count loop8 DELAY 255 DJNZ count,loop8 MOVLW 255 MOVWF count loop8a DELAY 255 DJNZ count,loop8a MOVLW 0xff TRIS ra ; Port A (0..3) input MOVLW 0x00 TRIS rb ; Port B output MOVLW EEP_FREQ MOVWF EEADR CALL EE_READ ; Read Current Frequention MOVWF FREQ_NR ; Check if Freq_nr is in range !! SUBLW CHANNELS-1 ; W = (CHANNELS-1) - W BTFSC STATUS,CARRY ; Skip if result is NEGATIVE.. GOTO NextItem MOVLW CHANNELS-1 MOVWF FREQ_NR ; Store in FREQ_NR MOVWF EEDATA ; And EEDATA MOVLW EEP_FREQ MOVWF EEADR CALL EE_WRITE ; Store it. (Save Store...) NextItem MOVLW 0 MOVWF KEYSTATUS CALL ReadKey ; KEYSTATUS & 0x03 say's Key nr : 1 or 2 ; 0 = none MOVF KEYSTATUS,W ANDLW 0x03 BTFSC STATUS,Z GOTO main2 BTFSC KEYSTATUS,0 GOTO DEFAULT BTFSC KEYSTATUS,1 GOTO MAINPROG GOTO main2 DEFAULT MOVLW 32 MOVWF FREQ_NR MOVLW EEP_FREQ MOVWF EEADR MOVF FREQ_NR,W ; Get FREQUENTION MOVWF EEDATA CALL EE_WRITE ; Store it. MOVLW 4 ; Base Address of MFPLUS0 MOVWF EEADR MOVLW MFPLUS0 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFPLUS1 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFPLUS2 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFPLUS3 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFMIN0 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFMIN1 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFMIN2 MOVWF EEDATA CALL EE_WRITE ; Store it. INCF EEADR ; Next Address MOVLW MFMIN3 MOVWF EEDATA CALL EE_WRITE ; Store it. xloop GOTO xloop main2 MOVF ra,W ; Read port A ANDLW 0x03 ; only bits 0..1 MOVWF oldport ; Store as default CALL I2C_Init CALL Synth ; Set Synth on default value MOVLW 0 MOVWF DISPLAY_NR loop MOVF ra,W ; Read port A ANDLW 0x03 MOVWF value ; Store at value SUBWF oldport,W ; if EQUAL, Zero bit is set. BTFSS STATUS,Z ; Test on Zero bit GOTO changed MOVF value,W ; Read old contents of port A MOVWF oldport ; Store as default ; Now do the display updates MOVLW 0x00 TRIS rb ; Port B output CALL Display MOVLW 4 MOVWF count loop9 DELAY 255 DJNZ count,loop9 MOVF DISPLAY_NR BTFSC STATUS,Z CALL Keying GOTO loop changed MOVF ra,W ; Read port A XORWF oldport,W ; differ. MOVWF temp BTFSS temp,BAND ; Test on changed GOTO change2 ;*** MUTE DISPLAY DURING LONG SWITCHOVER DELAY MOVLW 0x0f ; Mute Info MOVWF rb BSF rb,4 ; Latch it. BCF rb,4 ; Latch off. MOVLW 255 MOVWF temp chllp DELAY 255 DJNZ temp, chllp MOVLW 255 MOVWF temp chllp1 DELAY 255 DJNZ temp, chllp1 ; CALL Synth ; Set Synth on default value change2 MOVF value,W ; Read old contents of port A MOVWF oldport ; Store as default CALL Synth ; Set Synth on default value MOVLW EEP_FREQ MOVWF EEADR MOVF FREQ_NR,W ; Get FREQUENTION MOVWF EEDATA CALL EE_WRITE ; Store it. GOTO loop I2CDEL EQU 20 ;;;20 I2C_SET_TX MACRO MOVLW 255 - (_SCLMASK + _SDAMASK) TRIS _I2CPORT ENDM I2C_SET_RX MACRO MOVLW 255 - _SCLMASK TRIS _I2CPORT ENDM I2C_Init CALL I2C_Stop CALL I2C_Start CALL I2C_Stop RETURN I2C_Start I2C_SET_RX I2C_Start2 BTFSS _I2CPORT,_SDA GOTO I2C_Start2 I2C_SET_TX BSF _I2CPORT,_SDA BSF _I2CPORT,_SCL DELAY I2CDEL BCF _I2CPORT,_SDA DELAY I2CDEL BCF _I2CPORT,_SCL DELAY I2CDEL RETURN I2C_Stop I2C_SET_TX DELAY I2CDEL BCF _I2CPORT,_SDA DELAY I2CDEL BSF _I2CPORT,_SCL DELAY I2CDEL BSF _I2CPORT,_SDA DELAY I2CDEL RETURN I2C_Adres MOVWF _I2CDUMMY ; On Entry, W : 0=Write 1=Read RRF _I2CDUMMY ; R/W bit in Carry MOVF _I2CADRES,W MOVWF _I2CVALUE ; Copy it to value RLF _I2CVALUE ; Rotate it into LSB (R/W bit) CALL I2C_Start MOVLW 8 MOVWF _I2CCOUNT I2C_Adres1 RLF _I2CVALUE BCF _I2CPORT,_SDA BTFSC STATUS,CARRY BSF _I2CPORT,_SDA CALL I2C_Clock DJNZ _I2CCOUNT,I2C_Adres1 ; Now, get the ACK... I2C_SET_RX DELAY I2CDEL BTFSS _I2CPORT,_SDA GOTO I2C_ACK ; No ACK CALL I2C_Clock I2C_SET_TX RETLW 1 I2C_ACK CALL I2C_Clock I2C_SET_TX RETLW 0 I2C_Send MOVWF _I2CVALUE I2C_SET_TX MOVLW 8 MOVWF _I2CCOUNT I2C_Send1 RLF _I2CVALUE BCF _I2CPORT,_SDA BTFSC STATUS,CARRY BSF _I2CPORT,_SDA CALL I2C_Clock DJNZ _I2CCOUNT,I2C_Send1 ; Now, get the ACK... I2C_SET_RX DELAY I2CDEL BTFSS _I2CPORT,_SDA GOTO I2C_SACK ; No ACK CALL I2C_Clock RETLW 1 I2C_SACK CALL I2C_Clock RETLW 0 I2C_Clock DELAY I2CDEL BSF _I2CPORT,_SCL DELAY I2CDEL BCF _I2CPORT,_SCL DELAY I2CDEL RETURN ;******** Send to synth. ******** Synth CALL GetFreq ; !!! CALL Synth_S ; To Synth. RETURN ;******************************** Synth_S MOVLW 0x61 ; PLL adres MOVWF _I2CADRES MOVLW 0 ; W=0 -> TX-mode CALL I2C_Adres MOVF value_h,W CALL I2C_Send MOVF value_l,W CALL I2C_Send MOVLW 0x8e CALL I2C_Send MOVLW 0x00 CALL I2C_Send CALL I2C_Stop RETURN adjust_band ; adds 16 bits BANDADD to 16 bits value (high/low) ; ONLY if BAND is 13 cm BTFSS oldport,BAND GOTO adjskip MOVLW BANDADD & 0xff ; LSB add ADDWF value_l BTFSS STATUS,CARRY GOTO readyab INCF value_h readyab MOVLW BANDADD >> 8 ; MSB add ADDWF value_h adjskip RETURN GetFreq MOVLW 0x03 MOVWF PCLATH MOVF FREQ_NR,W CALL GetHVal ; Get High byte MOVWF value_h MOVF FREQ_NR,W CALL GetLVal ; Get High byte MOVWF value_l MOVLW 0x00 MOVWF PCLATH CALL adjust_band ; Correction in BAND switch ; BINAIR to BCD conversion CALL B2_BCD ;;; Converts Real Frequention in table to SYNTH value MOVLW 0x03 MOVWF PCLATH MOVF FREQ_NR,W CALL GetHVal ; Get High byte MOVWF value_h MOVF FREQ_NR,W CALL GetLVal ; Get Low byte MOVWF value_l MOVLW 0x00 MOVWF PCLATH CALL adjust_band ; Correction in BAND switch MOVLW RESULT ; Store freq in Mhz in RESULT MOVWF FSR CLRF 0 INCF FSR CLRF 0 INCF FSR MOVF value_h,W MOVWF 0 INCF FSR MOVF value_l,W MOVWF 0 BTFSS oldport,PTT ; no skip if TX mode : no offset GOTO pttena ; No offset in TX mode CALL MFOFFSET ; Transfer MF value in MULT1 CALL ADD32 MOVLW 3 ; Multiply by 8 * (2 divider in tuner...) MOVWF MULT1 ; = 16 CALL L_SHIFT32 GOTO nextf1 pttena MOVLW 4 ; Multiply by 16 (Transmit 23 cm) BTFSC oldport,BAND ; 23 / 13 select MOVLW 3 ; Multiply by 8 (Transmit 13 cm) MOVWF MULT1 CALL L_SHIFT32 nextf1 MOVLW RESULT ADDLW .2 ; Byte 3 and 4 MOVWF FSR MOVF 0,W ; Get MSB value MOVWF value_h INCF FSR MOVF 0,W ; Get LSB value MOVWF value_l RETLW 0 B2_BCD BCF STATUS,CARRY MOVLW .16 MOVWF count CLRF r0 CLRF r1 CLRF r2 loop16 RLF value_l RLF value_h RLF r2 RLF r1 RLF r0 ; DECFSZ count GOTO adjDEC ; r1 & r2 contains packed BCD display info MOVF r1,W ; packed BCD H/L MOVWF disp1 ; H/L in disp1 -> R1 SWAPF disp1 ; L/H in disp1 MOVLW 0x0f ANDWF disp1 ; H in disp1 MOVF r1,W ANDLW 0x0f ; L in W MOVWF disp2 ; L in disp2 MOVF r2,W ; packed BCD H/L MOVWF disp4 ; H/L in disp4 MOVLW 0x0f ANDWF disp4 ; l in disp4 SWAPF disp3 ; H/L in disp3 -> R2 MOVLW 0x0f ; H in disp3 ANDWF disp3 MOVF r1,W ANDLW 0x0f ; L in W MOVWF disp2 ; L in disp2 RETURN ; adjDEC MOVLW r2 MOVWF FSR CALL adjBCD MOVLW r1 MOVWF FSR CALL adjBCD MOVLW r0 MOVWF FSR CALL adjBCD GOTO loop16 adjBCD MOVLW 0x03 ADDWF 0,W MOVWF temp BTFSC temp,3 MOVWF 0 MOVLW 0x30 ADDWF 0,W MOVWF temp BTFSC temp,7 MOVWF 0 RETURN Display MOVLW disp1 MOVWF FSR ; set pointer on disp1 MOVF DISPLAY_NR,W ADDWF FSR ; add pointer with display_nr MOVF 0,W ; Get BCD value IORLW 0xe0 MOVWF rb ; display info (Auto Latch) MOVLW 0x03 MOVWF PCLATH MOVF DISPLAY_NR,W CALL SelectTable ; display selector info IORLW 0xe0 MOVWF rb ; display select MOVLW 0x00 MOVWF PCLATH INCF DISPLAY_NR MOVLW 3 ANDWF DISPLAY_NR RETURN FREQ_DOWN DECF FREQ_NR MOVF FREQ_NR,W BTFSS FREQ_NR,7 ; Underflow GOTO FREQD1 ; Yo, Underflow ! MOVLW 0 MOVWF FREQ_NR ; limiter. FREQD1 MOVLW 0x80 XORWF oldport RETURN FREQ_UP INCF FREQ_NR MOVF FREQ_NR,W SUBLW CHANNELS ; Channels - FREQ_NR BTFSS STATUS,Z GOTO FREQU1 ; Yo, to much ! (Overflow) MOVLW CHANNELS-1 MOVWF FREQ_NR ; limiter. FREQU1 MOVLW 0x80 ; Make sure, CHANGE is updated. XORWF oldport RETURN Keying CALL ReadKey ; KEYSTATUS & 0x03 say's Key nr : 1 or 2 ; 0 = none MOVF KEYSTATUS,W ANDLW 0x03 BTFSC STATUS,Z RETURN BTFSC KEYSTATUS,0 GOTO FREQ_UP BTFSC KEYSTATUS,1 GOTO FREQ_DOWN ;*********** This section is executed only in MF programming mode... MAINPROG MOVF ra,W ; Read port A ANDLW 0x03 ; only bits 0..1 MOVWF oldport ; Store as default CALL Synth ; Set Synth on default value MAINPROGLP CALL ReadKey ; KEYSTATUS & 0x03 say's Key nr : 1 or 2 ; 0 = none MOVF KEYSTATUS,W ANDLW 0x03 BTFSS STATUS,Z GOTO MAINPROGLP MOVLW 0 MOVWF DISPLAY_NR loopprog MOVF ra,W ; Read port A ANDLW 0x03 MOVWF value ; Store at value SUBWF oldport,W ; if EQUAL, Zero bit is set. BTFSS STATUS,Z ; Test on Zero bit GOTO changedprog MOVF value,W ; Read old contents of port B MOVWF oldport ; Store as default ; Now do the display updates MOVLW 0x00 TRIS rb ; Port B output CALL Display MOVLW 4 MOVWF count loop9prog DELAY 10 DJNZ count,loop9prog MOVF DISPLAY_NR BTFSC STATUS,Z CALL KeyingProg GOTO loopprog changedprog MOVF value,W ; Read old contents of port A MOVWF oldport ; Store as default CALL Synth ; Set Synth on default value MOVLW 0 MOVWF EEADR MOVF FREQ_NR,W ; Get FREQUENTION MOVWF EEDATA CALL EE_WRITE ; Store it. GOTO loopprog MF_UP BTFSC oldport,BAND ; 23 / 13 select GOTO mf13up MOVLW 6 ; Base Address of MFPLUS+2 1 GOTO mf23up mf13up MOVLW 10 ; Base Address of MFMIN+2 ! mf23up MOVWF EEADR CALL EE_READ ADDLW 1 ; Add '1' -> Generates a carry on OVFL MOVWF EEDATA CALL EE_WRITE DECF EEADR CALL EE_READ BTFSC STATUS,CARRY ADDLW 1 ; If carry, add '1' to MSB MOVWF EEDATA CALL EE_WRITE ; Store it again MOVLW 0xff ; Make sure, CHANGE is updated. MOVWF oldport RETURN MF_DOWN BTFSC oldport,BAND ; 23 / 13 select GOTO mf13dw MOVLW 6 ; Base Address of MFPLUS+2 1 GOTO mf23dw mf13dw MOVLW 10 ; Base Address of MFMIN+2 ! mf23dw MOVWF EEADR CALL EE_READ MOVLW 1 SUBWF EEDATA CALL EE_WRITE DECF EEADR CALL EE_READ MOVLW 1 BTFSS STATUS,CARRY ; If carry, sub '1' to MSB SUBWF EEDATA CALL EE_WRITE ; Store it again MOVLW 0xff ; Make sure, CHANGE is updated. MOVWF oldport RETURN KeyingProg CALL ReadKey ; KEYSTATUS & 0x03 say's Key nr : 1 or 2 ; 0 = none MOVF KEYSTATUS,W ANDLW 0x03 BTFSC STATUS,Z RETURN BTFSC KEYSTATUS,0 GOTO MF_UP BTFSC KEYSTATUS,1 GOTO MF_DOWN MFOFFSET BTFSC oldport,BAND ; ADD MFPLUS if 23 cm GOTO mf13add MOVLW 4 GOTO mf23add mf13add MOVLW 8 ; Base Address of MFMIN mf23add MOVWF EEADR MOVLW MULT1 MOVWF FSR CALL EE_READ MOVWF 0 INCF FSR INCF EEADR CALL EE_READ MOVWF 0 INCF FSR INCF EEADR CALL EE_READ MOVWF 0 INCF FSR INCF EEADR CALL EE_READ MOVWF 0 RETURN INCLUDE "MULT23.ASM" INCLUDE "EEPROM.ASM" INCLUDE "KEYBRD.ASM" ORG 0x300 ; accross page boundery... SelectTable ADDWF PC RETLW B'00010001' RETLW B'00010010' RETLW B'00010100' RETLW B'00011000' GetHVal ADDWF PC RETLW freq00 >> 8 RETLW freq01 >> 8 RETLW freq02 >> 8 RETLW freq03 >> 8 RETLW freq04 >> 8 RETLW freq05 >> 8 RETLW freq06 >> 8 RETLW freq07 >> 8 RETLW freq08 >> 8 RETLW freq09 >> 8 RETLW freq10 >> 8 RETLW freq11 >> 8 RETLW freq12 >> 8 RETLW freq13 >> 8 RETLW freq14 >> 8 RETLW freq15 >> 8 RETLW freq16 >> 8 RETLW freq17 >> 8 RETLW freq18 >> 8 RETLW freq19 >> 8 RETLW freq20 >> 8 RETLW freq21 >> 8 RETLW freq22 >> 8 RETLW freq23 >> 8 RETLW freq24 >> 8 RETLW freq25 >> 8 RETLW freq26 >> 8 RETLW freq27 >> 8 RETLW freq28 >> 8 RETLW freq29 >> 8 RETLW freq30 >> 8 RETLW freq31 >> 8 RETLW freq32 >> 8 RETLW freq33 >> 8 RETLW freq34 >> 8 RETLW freq35 >> 8 RETLW freq36 >> 8 RETLW freq37 >> 8 RETLW freq38 >> 8 RETLW freq39 >> 8 RETLW freq40 >> 8 RETLW freq41 >> 8 RETLW freq42 >> 8 RETLW freq43 >> 8 RETLW freq44 >> 8 RETLW freq45 >> 8 RETLW freq46 >> 8 RETLW freq47 >> 8 RETLW freq48 >> 8 RETLW freq49 >> 8 RETLW freq50 >> 8 RETLW freq51 >> 8 RETLW freq52 >> 8 RETLW freq53 >> 8 RETLW freq54 >> 8 RETLW freq55 >> 8 RETLW freq56 >> 8 RETLW freq57 >> 8 RETLW freq58 >> 8 RETLW freq59 >> 8 RETLW freq60 >> 8 RETLW freq61 >> 8 RETLW freq62 >> 8 RETLW freq63 >> 8 RETLW freq64 >> 8 RETLW freq65 >> 8 RETLW freq66 >> 8 RETLW freq67 >> 8 RETLW freq68 >> 8 RETLW freq69 >> 8 RETLW freq70 >> 8 RETLW freq71 >> 8 RETLW freq72 >> 8 RETLW freq73 >> 8 RETLW freq74 >> 8 RETLW freq75 >> 8 RETLW freq76 >> 8 RETLW freq77 >> 8 RETLW freq78 >> 8 RETLW freq79 >> 8 RETLW freq80 >> 8 RETLW freq81 >> 8 RETLW freq82 >> 8 RETLW freq83 >> 8 RETLW freq84 >> 8 RETLW freq85 >> 8 RETLW freq86 >> 8 RETLW freq87 >> 8 RETLW freq88 >> 8 RETLW freq89 >> 8 RETLW freq90 >> 8 RETLW freq91 >> 8 RETLW freq92 >> 8 RETLW freq93 >> 8 RETLW freq94 >> 8 RETLW freq95 >> 8 GetLVal ADDWF PC RETLW freq00 & 0xff RETLW freq01 & 0xff RETLW freq02 & 0xff RETLW freq03 & 0xff RETLW freq04 & 0xff RETLW freq05 & 0xff RETLW freq06 & 0xff RETLW freq07 & 0xff RETLW freq08 & 0xff RETLW freq09 & 0xff RETLW freq10 & 0xff RETLW freq11 & 0xff RETLW freq12 & 0xff RETLW freq13 & 0xff RETLW freq14 & 0xff RETLW freq15 & 0xff RETLW freq16 & 0xff RETLW freq17 & 0xff RETLW freq18 & 0xff RETLW freq19 & 0xff RETLW freq20 & 0xff RETLW freq21 & 0xff RETLW freq22 & 0xff RETLW freq23 & 0xff RETLW freq24 & 0xff RETLW freq25 & 0xff RETLW freq26 & 0xff RETLW freq27 & 0xff RETLW freq28 & 0xff RETLW freq29 & 0xff RETLW freq30 & 0xff RETLW freq31 & 0xff RETLW freq32 & 0xff RETLW freq33 & 0xff RETLW freq34 & 0xff RETLW freq35 & 0xff RETLW freq36 & 0xff RETLW freq37 & 0xff RETLW freq38 & 0xff RETLW freq39 & 0xff RETLW freq40 & 0xff RETLW freq41 & 0xff RETLW freq42 & 0xff RETLW freq43 & 0xff RETLW freq44 & 0xff RETLW freq45 & 0xff RETLW freq46 & 0xff RETLW freq47 & 0xff RETLW freq48 & 0xff RETLW freq49 & 0xff RETLW freq50 & 0xff RETLW freq51 & 0xff RETLW freq52 & 0xff RETLW freq53 & 0xff RETLW freq54 & 0xff RETLW freq55 & 0xff RETLW freq56 & 0xff RETLW freq57 & 0xff RETLW freq58 & 0xff RETLW freq59 & 0xff RETLW freq60 & 0xff RETLW freq61 & 0xff RETLW freq62 & 0xff RETLW freq63 & 0xff RETLW freq64 & 0xff RETLW freq65 & 0xff RETLW freq66 & 0xff RETLW freq67 & 0xff RETLW freq68 & 0xff RETLW freq69 & 0xff RETLW freq70 & 0xff RETLW freq71 & 0xff RETLW freq72 & 0xff RETLW freq73 & 0xff RETLW freq74 & 0xff RETLW freq75 & 0xff RETLW freq76 & 0xff RETLW freq77 & 0xff RETLW freq78 & 0xff RETLW freq79 & 0xff RETLW freq80 & 0xff RETLW freq81 & 0xff RETLW freq82 & 0xff RETLW freq83 & 0xff RETLW freq84 & 0xff RETLW freq85 & 0xff RETLW freq86 & 0xff RETLW freq87 & 0xff RETLW freq88 & 0xff RETLW freq89 & 0xff RETLW freq90 & 0xff RETLW freq91 & 0xff RETLW freq92 & 0xff RETLW freq93 & 0xff RETLW freq94 & 0xff RETLW freq95 & 0xff ORG 0x3FF GOTO 0 END