/* analog.c
L. Stewart September 23, 1982 5:09 PM
L. Stewart November 23, 1982 6:16 PM, invert LED
L. Stewart December 2, 1982 7:58 PM, new relays
L. Stewart February 7, 1983 8:00 PM, new monitor
L. Stewart February 18, 1983 6:56 PM, GetBootSwitches
L. Stewart February 23, 1983 10:13 AM, remove wdc
L. Stewart February 23, 1983 2:55 PM, EnableInt change
L. Stewart March 3, 1983 2:30 PM, read xbar state
*/
#include "Env.h"
#include "Lark.h"
#include "LarkSlave.h"
#include "ec.h"
#include "LarkNet.h"
/* pioml */
extern PIOOn();
extern PIOOff();
extern SetPIO();
extern GetPIO();
extern SetCodec();
/* interrupts */
extern ReadIRR();
extern EnableInt();
/*
extern int wdc;
*/
/* runtime */
extern StoreW();
extern OutByte();
/* context */
int inAn;
char xBarState[8];
extern /* FORWARD */ myAlDInt();
InitAnalog()
{
int row, col;
/* set up apio Port A, B, C0-3 Out, Port C4-7 In, mode 0 */
OutByte(apioctl, 0x0088);
/* initialize state of PIOML statics */
SetPIO(0x00c0, iapioa); /* both relays OFF */
SetPIO(0x0000, iapiob);
SetPIO(0x000c, iapioc); /* no ring or sidetone */
SetPIO(0x00e1, ipioa); /* LED Off */
SetPIO(0x0000, ipiob); /* Host ID really */
SetPIO(0x0030, ipioc); /* both relays off */
SetCodec(0x0c); /* timeslot 13 */
ResetAnalogInt();
myAlDInt(); /* get it set correctly on initialization */
/* Everyone silence */
XbarClear();
EnableInt(&myAlDInt, AlDTyp);
};
myAlDInt()
{
inAn = 0;
for (;;) {
PIOOff(0x000f, iapioa);
PIOOn(inAn, iapioa);
ResetAnalogInt();
if ((ReadIRR() & 0x0080) == 0) break;
inAn += 1;
if (inAn == 16) inAn = 0;
};
return(true);
};
SetXbar(row, col)
int row, col;
{
int r;
if (row == 4) {
for (r = 0; r < 8; r += 1) xbarcom(r, col, false);
};
else {
if (xBarState[col] & 0x10) xbarcom(4, col, false);
};
xbarcom(row, col, true);
};
ClearXbar(row, col)
int row, col;
{
xbarcom(row, col, false);
if (xBarState[col] == 0) xbarcom(4, col, true);
};
static xbarcom(row, col, on)
int row, col, on;
{
int data, clock, shift;
if (on) {
PIOOn(SwData, iapioc);
xBarState[col] |= (1 << row);
};
else {
PIOOff(SwData, iapioc);
xBarState[col] &= ((1 << row) ↑ 0xff);
};
data = (col & 3) | ((row & 3) << 2);
if (row < 4) shift = 0;
else shift = 1;
if (col >= 4) shift += 2;
clock = (SwStb0 << shift);
SetPIO(data, iapiob);
SetPIO(clock + data, iapiob);
SetPIO(data, iapiob);
};
Revert(active)
int active;
{
if (active) PIOOn(0x0080, iapioa);
else PIOOff(0x0080, iapioa);
};
GoOffHook(active)
int active;
{
if (active) PIOOff(0x0040, iapioa);
else PIOOn(0x0040, iapioa);
};
ARelay(active)
int active;
{
if (active) PIOOff(0x0010, ipioc);
else PIOOn(0x0010, ipioc);
};
RevertHS(active)
int active;
{
if (active) PIOOn(0x0020, ipioc);
else PIOOff(0x0020, ipioc);
};
SideTone(active)
int active;
{
if (active) PIOOff(0x0004, iapioc);
else PIOOn(0x0004, iapioc);
};
RingEnable(active)
int active;
{
if (active) PIOOff(0x0008, iapioc);
else PIOOn(0x0008, iapioc);
};
int GetDTMF()
{
int i, digit;
if (!(inAn & AIDTMF)) return(0);
i = GetPIO(iapioc) >> 4;
if ((i > 0) && (i < 10)) digit = i + '0';
else switch (i) {
case 0: digit = 'd'; break;
case 10: digit = '0'; break;
case 11: digit = '*'; break;
case 12: digit = '#'; break;
case 13: digit = 'a'; break;
case 14: digit = 'b'; break;
case 15: digit = 'c'; break;
default: digit = 0;
};
return(digit);
};
int ScanIn()
{
return(inAn);
};
ResetAnalogInt()
{
PIOOff(0x0080, ipioa);
PIOOn(0x0080, ipioa);
};
Led(active)
int active;
{
if (active) PIOOff(0x0040, ipioa);
else PIOOn(0x0040, ipioa);
};
KickWDT()
{
PIOOn(0x0008, ipioa);
PIOOff(0x0008, ipioa);
};
ResetEncInt()
{
PIOOff(0x0001, ipioa);
PIOOn(0x0001, ipioa);
};
/* 0 means default, 1 means O3I1, 2 means O2I2 */
StartSlave(prog, length)
int prog, length;
{
int i;
StoreW(prog, CodeLoc);
StoreW(length, CodeLen);
PIOOn(0x20, ipioa);
for (i=0; i< 20; i+= 1);
OutByte(dmamode, 0xc0);
OutByte(dmasmsk, 0x00);
PIOOff(0x20, ipioa);
for (i=0; i< 20; i+= 1);
if (prog != 0) {
PIOOff(0x10, ipioa);
PIOOn(0x10, ipioa);
PIOOff(0x10, ipioa);
};
};
SetIngain(ch, gain)
int ch, gain;
{
int v;
switch (gain) {
case 0: v = InTab00; break;
case 1: v = InTab05; break;
case 2: v = InTab10; break;
case 3: v = InTab15; break;
case 4: v = InTab20; break;
default: v = InTab00;
};
if (ch & 1) StoreW(v, In1Gain);
if (ch & 2) StoreW(v, In2Gain);
};
SetOutgain(gain)
int gain;
{
int v;
switch (gain) {
case 0: v = OutTab00; break;
case 1: v = OutTab03; break;
case 2: v = OutTab06; break;
default: v = OutTab00;
};
StoreW(v, OutGain);
};
XbarClear()
{
int row, col;
for (col = 0; col < 8; col += 1) {
for (row = 0; row < 8; row += 1) xbarcom(row, col, false);
xbarcom(4, col, true);
};
};
int GetBootSwitches()
{
int i;
i = (GetPIO(ipiob) >> 6) & 3;
return (i + (GetPIO(ipioc) & 4));
};
char *GetXBarState()
{
return (xBarState);
};