/* testworld.c September 23, 1982 6:05 PM */
#include "lark.h"
#include "Encrypt.h"
#include "LarkSlave.h"
#include "env.h"
extern int Crypt(), EncEnd(); /* encryption */
struct ccb {
char cmd;
char *addr;
char count;
char stat;
};
struct ECB cbea, cbeb, cbd, cbdleft; /* encryption control blocks */
struct ccb outccb, inccb; /* ethernet control blocks */
char expsn; /* expected serial number */
int lastic; /* outgoing serial number */
int lasto; /* next speaker buffer index to use */
char key[8]; /* encryption key */
char ibuf[256], obuf[256]; /* ether buffers */
int *clock, oclock;
/* audio variables */
char *inbuf1, *obuf1, *obuf2, *obuf3;
int *ingain1, *outgain, *bufptr, *silval1;
/* program variables */
int first; /* =0 when next packet to send is first half mike buffer */
int etherb; /* ethernet active boolean */
int audiob; /* audio active boolean */
int desb; /* encryption active boolean */
int valid; /* for local loopback, indicates valid ibuf */
/* Test DMA encryption */
main()
{
char c;
wf("\rWorld test.\r");
initworld();
for (;;) {
checktx(); /* transmit, if done */
if (!audiob) fakeclock();
if (etherb) checkrx();
else checkpkt();
if (chav()) {
c = getchar() & 0177;
switch (c) {
case 'a': togaudio(); break;
case 'e': together(); break;
case 'd': togdes(); break;
case 'r': initworld(); break;
default: putchar(c);
};
};
};
};
togaudio()
{
wf("audio ");
if (audiob) audiob = 0;
else audiob = 1;
printb(audiob);
if (audiob) {
outbyte(pioa, 0x0000);
audon();
};
else outbyte(pioa, 0x0020);
};
together()
{
wf("ether ");
if (etherb) etherb = 0;
else etherb = 1;
printb(etherb);
if (etherb) {
inccb.count = 0;
slrstart(&inccb);
};
else slcinit(0x0055);
};
fakeclock()
{
int nclock;
nclock = *clock;
if (nclock != oclock) {
*bufptr = (*bufptr + ((nclock-oclock) << 3)) % 320;
oclock = nclock;
};
};
togdes()
{
wf("des ");
if (desb) desb = 0;
else desb = 1;
printb(desb);
if (desb) {
cbea.kp = key;
cbeb.kp = key;
cbd.kp = key;
cbdleft.kp = key;
};
else {
cbea.kp = 0;
cbeb.kp = 0;
cbd.kp = 0;
cbdleft.kp = 0;
};
};
printb(b)
int b;
{
if (b) wf("ON\r");
else wf("OFF\r");
};
checktx()
{
if (first == 0 && bptr() >= 160) {
Crypt(&cbea);
first = 1;
txone();
};
if (first != 0 && bptr() < 160) {
Crypt(&cbeb);
first = 0;
txone();
};
};
txone()
{
obuf[5] = lastic;
lastic += 1;
outccb.count = 166;
encw();
if (etherb) {
sltstart(&outccb);
waitccb(&outccb);
};
else {
ByteBlt(ibuf, obuf, 166);
valid = 1;
};
};
checkrx()
{
if (!(inccb.stat & 0x80)) return;
if (inccb.stat != 0x88) {
inccb.count = 0;
slrstart(&inccb);
return;
};
if (ibuf[4] != 0x98) {
inccb.count = 0;
slrstart(&inccb);
return;
};
rxone();
expsn += 1;
inccb.count = 0;
slrstart(&inccb);
};
checkpkt()
{
if (valid) {
rxone();
expsn +=1;
valid = 0;
};
};
rxone()
{
/* lost packet, start at current point plus 10 milliseconds */
if (ibuf[5] != expsn) {
/* must round to multiple of 8 due to block encryption */
lasto = (bptr() & 0xfff8) + 80;
/* wrap around ! can't be more than 80 too big */
expsn = ibuf[5];
};
/* decryption is potentially two parts, due to buffer wraparound */
if (lasto >= 320) lasto %= 320;
cbd.dstp = &obuf1[lasto];
if (lasto < 160) cbd.count = 160;
else cbd.count = 320 - lasto;
Crypt(&cbd);
lasto += 160;
encw();
if (cbd.count < 160) {
lasto = 160 - cbd.count;
cbdleft.srcp = &ibuf[cbd.count+6];
cbdleft.count = lasto;
Crypt(&cbdleft);
encw();
};
if (lasto >= 320) lasto %= 320;
};
encw()
{
if (desb) while(!EncEnd());
};
audon()
{
inbuf1 = InBuf1;
obuf1 = OutBuf1;
obuf2 = OutBuf2;
obuf3 = OutBuf3;
ingain1 = In1Gain;
outgain = OutGain;
bufptr = BufPtr;
silval1 = Sil1Val;
InitAnalog();
SetInGain(3, 0)
SetOutGain(0)
SetXbar(0, 3);
SetXbar(3, 0);
StartSlave(0, 0);
first = 0; /* first xmit packet will be low half */
};
ReadIRR() {};
int AlDInt;
EnableInt() {};
nullproc()
{
};
EncMore()
{
};
Block()
{
};
initworld()
{
int i;
clock = clklo;
audiob = 1; /* audio on */
audon();
etherb = 0; /* ether off */
desb = 0; /* des off */
valid = 0; /* no rx packet ready */
lasto = 0; /* first buffer address at beginning of buffer */
expsn = 25; /* random number */
/* packet header */
obuf[0] = 0x55; /* both from and to ourselves */
obuf[1] = 0x55;
obuf[2] = 0x01;
obuf[3] = 0xC0;
obuf[4] = 0x98; /* seal */
obuf[5] = 0x00; /* sequence number */
inccb.cmd = 0x00; /* rx */
inccb.addr = ibuf;
outccb.cmd = 0x50; /* tx */
outccb.addr = obuf;
lastic = 1; /* first tx sequence number = 1 */
for (i=0; i<8; i++) key[i] = 0x01; /* random key with odd byte parity */
slcinit(0x0055);
togdes(); /* turn on des, also sets up key fields of cbs */
/* cbea is the first half of the mike buffer */
cbea.srcp = &inbuf1[0];
cbeb.srcp = &inbuf1[160];
/* both encrypt into data part of packet */
cbea.dstp = &obuf[6];
cbeb.dstp = &obuf[6];
cbea.count = 160;
cbeb.count = 160;
cbea.encrypt = true;
cbeb.encrypt = true;
cbea.proc = (int) &nullproc;
cbeb.proc = (int) &nullproc;
/* cbd is the first part of decryption */
cbd.srcp = &ibuf[6];
cbdleft.dstp = &obuf1[0];
cbd.encrypt = false;
cbdleft.encrypt = false;
cbd.proc = (int) &nullproc;
cbdleft.proc = (int) &nullproc;
wf("g\r");
};
int bptr()
{
return(*bufptr);
};