/* cmtslc.c September 24, 1982 2:48 PM */
#define slrcmd 0x0020
#define slrccbhi 0x0021
#define slrccblo 0x0022
#define sltcmd 0x0024
#define sltccbhi 0x0025
#define sltccblo 0x0026
#define stoffset 0x0004
#define ctoffset 0x0003
#define adoffset 0x0001
#define cmoffset 0x0000
#define slcsio 0x000c
#define slchio 0x000d
#define slcrio 0x000f
#define slcnop 0x00f0
#define slctx 0x0050
#define slcrx 0x0000
#define slcindir 0x0001
#define slcchain 0x0004
#define slcsetmode 0x00e0
#define slcsetaddr 0x00c0
struct ccb {
char cmd;
char *addr;
char count;
char stat;
};
struct ccb tlccb, rchain[3], tchain[3];
char tsltmode, tslrmode, teneta;
char ibuf[256], obuf[256];
int sendb, receiveb;
tslc()
{
char c;
obuf[0] = 0x55;
obuf[1] = 0x55;
wf("slc: ");
c = egetchar();
switch (c) {
case 'c': tslcinit(); break;
case 'l': receive(); break;
case 'r': tslrinit(1); break;
case 's': send(); break;
case 'S': lsend(); break;
case 't': tsltinit(1); break;
case '1': trone(); break;
default: wf("?\r"); break;
};
};
lsend() /* loop send */
{
/*
for (;;) {
tchain[0].cmd = slctx;
tchain[0].addr = obuf;
tchain[0].count = 64;
tchain[0].stat = 0;
sltstart(&tchain[0]);
if (twaitccb(&tchain[0], 20)) {
wf("#");
slrinit(0);
sltinit(0);
};
if (chav()) break;
};
getchar();
*/
};
send()
{
if (sendb) {
sendb = 0;
tsltinit();
}
else {
sendb = 1;
tchain[0].cmd = slctx + slcchain;
tchain[0].addr = obuf;
tchain[0].count = 64;
tchain[0].stat = 0;
tchain[1].cmd = slcnop + slcindir;
tchain[1].addr = &tchain[0];
tchain[1].count = 0;
tchain[1].stat = 0;
sltstart(&tchain[0]);
SysHalt()
};
if (sendb) wf("tx on\r");
else wf("tx off\r");
};
trone()
{
tchain[0].cmd = slctx;
tchain[0].addr = obuf;
tchain[0].count = 64;
tchain[0].stat = 0;
sltstart(&tchain[0]);
};
receive()
{
/*
if (receiveb) {
receiveb = 0;
tslrinit();
};
else {
receiveb = 1;
rchain[0].cmd = slcrx + slcchain;
rchain[0].addr = ibuf;
rchain[0].count = 0;
rchain[0].stat = 0;
rchain[1].cmd = slcnop + slcindir;
rchain[1].addr = &rchain[0];
rchain[1].count = 0;
rchain[1].stat = 0;
slrstart(&rchain[0]);
};
if (receiveb) wf("rx on\r");
else wf("rx off\r");
*/
};
tslcinit()
{
teneta = 0x55;
tslrinit(1);
tsltinit(1);
};
tslrinit(v)
int v;
{
receiveb = 0;
if (v) wf("tslrinit,");
tslrmode = 0;
outbyte(slrcmd, slcrio);
tlccb.cmd = slcsetmode;
tlccb.addr = &tslrmode;
tlccb.count = 0xff;
tlccb.stat = 0;
slrstart(&tlccb);
if (twaitccb(&tlccb, 50) && v) wf(" t.o.");
if (v) wf1(" mode status: %02x,", tlccb.stat & 0xff);
tlccb.cmd = slcsetaddr;
tlccb.addr = &teneta;
tlccb.count = 0xff;
tlccb.stat = 0;
slrstart(&tlccb);
if (twaitccb(&tlccb, 50) && v) wf(" t.o.");
if (v) wf1(" addr status: %02x\r", tlccb.stat & 0xff);
};
tsltinit(v)
int v;
{
sendb = 0;
tsltmode = 0;
if (v) wf("tsltinit,");
outbyte(sltcmd, slcrio);
tlccb.cmd = slcsetmode;
tlccb.addr = &tsltmode;
tlccb.count = 1;
tlccb.stat = 0;
sltstart(&tlccb);
if (twaitccb(&tlccb, 50) && v) wf(" t.o.");
if (v) wf1(" mode status: %02x\r", tlccb.stat & 0xff);
};
twaitccb(p, t)
struct ccb *p;
int t;
{
int tim;
settmr(t, &tim);
for (;;) {
if (p->stat != 0) return (0);
if (tmrexp(&tim)) return (1);
};
};