/* analog.c L. Stewart September 28, 1983, created from Analog LCS September 29, 1983 10:18 AM, changed InGain LCS September 29, 1983 3:44 PM, added OutGain and initialization LCS September 30, 1983 10:26 AM, added SilTabLoc */ #include "Env.h" #include "Lark.h" #include "LarkSlave.h" #include "ec.h" #include "LarkNet.h" /* PIOML.dsm */ extern PIOOn(); extern PIOOff(); extern SetPIO(); extern GetPIO(); extern SetCodec(); /* RegML.dsm */ extern ReadIRR(); /* runtime */ extern StoreW(); extern OutByte(); /* context */ char xBarState[8]; int wdtTimer; int event; 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(); /* Everyone silence */ XbarClear(); SetIngain(3, 0); SetOutgain(0); StoreW(SqrSilTab, SilTabLoc); }; 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); }; 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); }; PokeWDT() { KickWDT(); SetTmr(200, &wdtTimer); }; CheckWDT() { if (TmrExp(&wdtTimer)) PokeWDT(); }; /* 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 = InTab000; break; case 1: v = InTab025; break; case 2: v = InTab050; break; case 3: v = InTab075; break; case 4: v = InTab100; break; case 5: v = InTab125; break; case 6: v = InTab150; break; case 7: v = InTab175; break; case 8: v = InTab200; break; default: v = InTab000; }; if (ch & 1) StoreW(v, In1Gain); if (ch & 2) StoreW(v, In2Gain); }; SetOutgain() { StoreW(OutTab00, 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); }; }; NewEvent() { int newEvent; newEvent = 0; for (;;) { PIOOff(0x000f, iapioa); PIOOn(newEvent, iapioa); ResetAnalogInt(); if ((ReadIRR() & 0x0080) == 0) break; newEvent += 1; if (newEvent == 16) newEvent = 0; }; if (event == newEvent) return(false); event = newEvent; return(true); }; int GetDTMF() { return(GetPIO(iapioc) >> 4); }; SPMode(on) int on; { int *modep; modep = (int *) ModeFlag; if (on) *modep |= 3; else *modep &= 0xfffc; };