#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* #include <conio.h> */
#define RX_LO_OFFSET +21400
#define TX_LO_OFFSET +20480
#define CHANNEL_SPACING +5
#define COUNTER_MODULUS +32
FILE *infile, *infile2, *outfile;
int chan, maxchan, scan;
unsigned long Rx, Tx, line;
char Data [100];
unsigned char eprom[0x800];
unsigned char work[3];
void main (void);
void do_parity (unsigned char *);
void do_work( unsigned long, unsigned long, unsigned long, unsigned long );
void main (void) {
int temp, div;
printf ("Programmer for Low band RT85 Radio by ");
printf ("Phil Rice 2002\n");
printf ("May contain traces of a program by Peter Baston\n\n");
if ( (outfile = fopen ("RT85.BIN","wb") ) == NULL ) {
printf ("Can not create binary file\n");
exit(0);
}
if ( (infile = fopen ("FREQ.PRG", "r")) == NULL ) {
fclose (outfile);
printf ("Error opening file: FREQ.PRG\n");
exit (0);
}
for (temp=0; temp < 0x800; temp++)
eprom[temp] = 0xFF;
eprom[0x3F1] = 0x01; /* No CTCSS, Busy lamp delay, Selcall. Silent switch inhibited */
eprom[0x3f2] = 0x00; /* No PTT hold, No TX timeout */
line = 0;
maxchan = 1;
while (1) {
fgets (Data, 95, infile);
if (feof (infile))
break;
if (sscanf (Data, "%d %ld %ld", &chan, &Rx, &Tx) != 3)
break;
div = (chan/10) * 0x40 + (chan%10) * 4 ;
do_work( Rx, RX_LO_OFFSET, CHANNEL_SPACING, COUNTER_MODULUS );
eprom[div+1] = work[0];
eprom[div+2] = work[1];
eprom[div+3] = work[2];
do_parity (&eprom[div]);
eprom[div+0+0x200] = 0;
eprom[div+1+0x200] = eprom[div+1];
eprom[div+2+0x200] = eprom[div+2];
eprom[div+3+0x200] = eprom[div+3];
do_work( Tx, TX_LO_OFFSET, CHANNEL_SPACING, COUNTER_MODULUS);
eprom[div+1+0x400] = work[0];
eprom[div+2+0x400] = work[1];
eprom[div+3+0x400] = work[2];
do_parity (&eprom[div+0x400]);
eprom[div+0+0x600] = 0;
eprom[div+1+0x600] = eprom[div+1+0x400];
eprom[div+2+0x600] = eprom[div+2+0x400];
eprom[div+3+0x600] = eprom[div+3+0x400];
if (maxchan < chan)
maxchan = chan;
line++;
}
fclose (infile);
eprom[0x3f0] = (unsigned char) (((maxchan) / 10) * 0x10) + ((maxchan) % 10);
printf ("Channels Programmed: %d\n", line);
if ( (infile2 = fopen ("SCAN.PRG", "r")) != NULL ) {
temp = 0;
while (1) {
fgets (Data, 95, infile2);
if (feof (infile2))
break;
if (sscanf (Data, "%d", &scan) != 1)
break;
if( scan<=32 ) {
eprom[ temp*4 ]= (unsigned char) ((scan / 10) * 0x10) + (scan % 10);
temp++;
}
}
eprom[0x3f3] = 0x52; /* Scan 0.2 sec/channel, hold for 2.5 sec */
printf("Scan data entered for %d channels\n", temp);
fclose (infile2);
} else {
eprom[0x3f3] = 0x00; /* No scanning */
printf ("Scan file: SCAN.PRG not found\n");
printf ("No scan data entered into EPROM\n\n");
}
fwrite (eprom, 0x800, 1, outfile);
fclose (outfile);
printf ("Processing Completed !\n");
}/* main */
void do_parity (unsigned char *data) {
unsigned char i,j,k;
i = data[1] ^ data[2] ^ data[3];
k = 0;
for (j=0; j < 8; j++) {
if (i & 0x01)
k++;
i >>= 1;
}
if (k & 0x01)
data[1] |= 0x40;
}
void do_work( unsigned long freq, unsigned long offset, unsigned long spacing, unsigned long modulus) {
/* uses global unsigned char work[3] */
unsigned long Divisor, Result;
Divisor = (freq + offset) / spacing;
/* Insert zeroes in the number to suit hardware ( Bits 6 & maybe 5 too ) */
Result = (Divisor/modulus) * 128 + Divisor%modulus;
/* printf("%ld %ld\n", Divisor, Result); */
work[0] = (Result >> 16) & 0xff;
work[1] = (Result >> 8) & 0xff;
work[2] = (Result ) & 0xff;
}