;Alto->8086 small-c compiler rev 2.0
C←CODE SEGMENT

$INCLUDE(8086LIB.D)

$INCLUDE(Analog.DEC)

ASSUME CS:C←CODE, DS:C←DATA

; #include	"Env.h"

; extern PIOOn();

; extern PIOOff();

; extern SetPIO();

; extern GetPIO();

; extern SetCodec();

; extern ReadIRR();

; extern EnableInt();

; extern StoreW();

; extern OutByte();

; int inAn;

; char xBarState[8];

; extern /* FORWARD */ myAlDInt();

; InitAnalog()
←InitAnalog:
PUSH BP
MOV BP,SP

;   {

;   int row, col;
ADD SP,0FFFCX

;   OutByte(apioctl, 0x0088);
MOV BX,088X
MOV CX,070X
CALL ←OutByte

;   SetPIO(0x00c0, iapioa);  /* both relays OFF */
MOV BX,3
MOV CX,0C0X
CALL ←SetPIO

;   SetPIO(0x0000, iapiob);
MOV BX,4
XOR CX,CX
CALL ←SetPIO

;   SetPIO(0x000c, iapioc);  /* no ring or sidetone */
MOV BX,5
MOV CX,0CX
CALL ←SetPIO

;   SetPIO(0x00e1, ipioa);  /* LED Off */
XOR BX,BX
MOV CX,0E1X
CALL ←SetPIO

;   SetPIO(0x0000, ipiob);  /* Host ID really */
MOV BX,1
XOR CX,CX
CALL ←SetPIO

;   SetPIO(0x0030, ipioc);  /* both relays off */
MOV BX,2
MOV CX,030X
CALL ←SetPIO

;   SetCodec(0x0c);   /* timeslot 13 */
MOV BX,0CX
CALL ←SetCodec

;   ResetAnalogInt();
CALL ←ResetAnalogInt

;   myAlDInt();		/* get it set correctly on initialization */
CALL ←myAlDInt

;   XbarClear();
CALL ←XbarClear

;   EnableInt(&myAlDInt, AlDTyp);
MOV BX,7
MOV CX,OFFSET ←myAlDInt
CALL ←EnableInt

;   };
MOV SP,BP
POP BP
RET;

; myAlDInt()
←myAlDInt:
PUSH BP
MOV BP,SP

;   {

;   inAn = 0;
MOV ←inAn,0

;   for (;;) {
X1:

;     PIOOff(0x000f, iapioa);
MOV BX,3
MOV CX,0FX
CALL ←PIOOff

;     PIOOn(inAn, iapioa);
MOV BX,3
MOV CX,←inAn
CALL ←PIOOn

;     ResetAnalogInt();
CALL ←ResetAnalogInt

;     if ((ReadIRR() & 0x0080) == 0) break;
CALL ←ReadIRR
AND BX,080X
OR BX,BX
JNZ X3
JR X2
X3:

;     inAn += 1;
INC ←inAn

;     if (inAn == 16) inAn = 0;
MOV BX,←inAn
CMP BX,010X
JNZ X4
MOV ←inAn,0
X4:

;     };
JR X1
X2:

;   return(true);
MOV BX,0FFFFX
MOV SP,BP
POP BP
RET;

;   };

; SetXbar(row, col)
←SetXbar:

;   int row, col;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int r;

;   if (row == 4) {
PUSH DX

;	BX ← ←row
MOV BX,[BP-2]
CMP BX,4
JNZ X5

;     for (r = 0; r < 8; r += 1) xbarcom(r, col, false);
MOV WORD PTR [BP-6],0
X8:

;	BX ← ←r
POP BX
PUSH BX
CMP BX,8
JGE X7
JR X6
X9:
INC WORD PTR [BP-6]
JR X8
X6:

;	BX ← ←r
POP BX
PUSH BX
PUSH BX
XOR BX,BX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX
JR X9
X7:

;     };

;   else {
JR X10
X5:

;     if (xBarState[col] & 0x10) xbarcom(4, col, false);

;	BX ← ←col
MOV BX,[BP-4]
LEA CX,←xBarState
ADD BX,CX
MOV AL,[BX]
AND AL,010X
OR AL,AL
JZ X11
MOV BX,4
PUSH BX
XOR BX,BX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX
X11:

;     };
X10:

;   xbarcom(row, col, true);

;	BX ← ←row
MOV BX,[BP-2]
PUSH BX
MOV BX,0FFFFX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX

;   };
MOV SP,BP
POP BP
RET;

; ClearXbar(row, col)
←ClearXbar:

;   int row, col;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   xbarcom(row, col, false);

;	BX ← ←row
MOV BX,[BP-2]
PUSH BX
XOR BX,BX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX

;   if (xBarState[col] == 0) xbarcom(4, col, true);

;	BX ← ←col
POP BX
PUSH BX
LEA CX,←xBarState
ADD BX,CX
MOV AL,[BX]
OR AL,AL
JNZ X12
MOV BX,4
PUSH BX
MOV BX,0FFFFX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX
X12:

;   };
MOV SP,BP
POP BP
RET;

; static xbarcom(row, col, on)
←xbarcom:

;   int row, col, on;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int data, clock, shift;

;   if (on) {
ADD SP,0FFFAX

;	BX ← ←on
MOV BX,[BP-4]
OR BX,BX
JZ X13

;     PIOOn(SwData, iapioc);
MOV BX,5
MOV CX,1
CALL ←PIOOn

;     xBarState[col] |= (1 << row);

;	BX ← ←col
MOV BX,[BP-2]
LEA CX,←xBarState
ADD BX,CX

;	CX ← ←row
MOV CX,[BP+4]
MOV AX,1
SAL AX,CX
OR [BX],AL

;     };

;   else {
JR X14
X13:

;     PIOOff(SwData, iapioc);
MOV BX,5
MOV CX,1
CALL ←PIOOff

;     xBarState[col] &= ((1 << row) ↑ 0xff);

;	BX ← ←col
MOV BX,[BP-2]
LEA CX,←xBarState
ADD BX,CX

;	CX ← ←row
MOV CX,[BP+4]
MOV AX,1
SAL AX,CX
PUSH BX
MOV BX,AX
XOR BX,0FFX
MOV CX,BX
POP BX
AND [BX],CL

;     };
X14:

;   data = (col & 3) | ((row & 3) << 2);

;	BX ← ←col
MOV BX,[BP-2]
AND BX,3
PUSH BX

;	BX ← ←row
MOV BX,[BP+4]
AND BX,3
MOV CX,2
SAL BX,CX
POP CX
OR CX,BX

;	←data ← CX
MOV [BP-6],CX

;   if (row < 4) shift = 0;

;	BX ← ←row
MOV BX,[BP+4]
CMP BX,4
JGE X15
MOV WORD PTR [BP-10],0

;   else shift = 1;
JR X16
X15:
MOV WORD PTR [BP-10],1
X16:

;   if (col >= 4) shift += 2;

;	BX ← ←col
MOV BX,[BP-2]
CMP BX,4
JL X17
ADD WORD PTR [BP-10],2
X17:

;   clock = (SwStb0 << shift);

;	CX ← ←shift
POP CX
PUSH CX
MOV BX,010X
SAL BX,CX

;	←clock ← BX
MOV [BP-8],BX

;   SetPIO(data, iapiob);
MOV BX,4

;	CX ← ←data
MOV CX,[BP-6]
CALL ←SetPIO

;   SetPIO(clock + data, iapiob);

;	BX ← ←data
MOV BX,[BP-6]

;	CX ← ←clock
MOV CX,[BP-8]
ADD CX,BX
MOV BX,4
CALL ←SetPIO

;   SetPIO(data, iapiob);
MOV BX,4

;	CX ← ←data
MOV CX,[BP-6]
CALL ←SetPIO

;   };
MOV SP,BP
POP BP
RET;

; Revert(active)
←Revert:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOn(0x0080, iapioa);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X18
MOV BX,3
MOV CX,080X
CALL ←PIOOn

;   else PIOOff(0x0080, iapioa);
JR X19
X18:
MOV BX,3
MOV CX,080X
CALL ←PIOOff
X19:

;   };
MOV SP,BP
POP BP
RET;

; GoOffHook(active)
←GoOffHook:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOff(0x0040, iapioa);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X20
MOV BX,3
MOV CX,040X
CALL ←PIOOff

;   else PIOOn(0x0040, iapioa);
JR X21
X20:
MOV BX,3
MOV CX,040X
CALL ←PIOOn
X21:

;   };
MOV SP,BP
POP BP
RET;

; ARelay(active)
←ARelay:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOff(0x0010, ipioc);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X22
MOV BX,2
MOV CX,010X
CALL ←PIOOff

;   else PIOOn(0x0010, ipioc);
JR X23
X22:
MOV BX,2
MOV CX,010X
CALL ←PIOOn
X23:

;   };
MOV SP,BP
POP BP
RET;

; RevertHS(active)
←RevertHS:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOn(0x0020, ipioc);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X24
MOV BX,2
MOV CX,020X
CALL ←PIOOn

;   else PIOOff(0x0020, ipioc);
JR X25
X24:
MOV BX,2
MOV CX,020X
CALL ←PIOOff
X25:

;   };
MOV SP,BP
POP BP
RET;

; SideTone(active)
←SideTone:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOff(0x0004, iapioc);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X26
MOV BX,5
MOV CX,4
CALL ←PIOOff

;   else PIOOn(0x0004, iapioc);
JR X27
X26:
MOV BX,5
MOV CX,4
CALL ←PIOOn
X27:

;   };
MOV SP,BP
POP BP
RET;

; RingEnable(active)
←RingEnable:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOff(0x0008, iapioc);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X28
MOV BX,5
MOV CX,8
CALL ←PIOOff

;   else PIOOn(0x0008, iapioc);
JR X29
X28:
MOV BX,5
MOV CX,8
CALL ←PIOOn
X29:

;   };
MOV SP,BP
POP BP
RET;

; int GetDTMF()
←GetDTMF:
PUSH BP
MOV BP,SP

;   {

;   int i, digit;

;   if (!(inAn & AIDTMF)) return(0);
ADD SP,0FFFCX
MOV BX,←inAn
AND BX,1
OR BX,BX
JNZ X30
XOR BX,BX
MOV SP,BP
POP BP
RET;
X30:

;   i = GetPIO(iapioc) >> 4;
MOV BX,5
CALL ←GetPIO
MOV CX,4
SHR BX,CX

;	←i ← BX
MOV [BP-2],BX

;   if ((i > 0) && (i < 10)) digit = i + '0';

;	BX ← ←i
MOV BX,[BP-2]
CMP BX,0
JLE X32

;	BX ← ←i
MOV BX,[BP-2]
CMP BX,0AX
JGE X32
MOV AL,1
JR X33
X32:
XOR AL,AL
X33:
OR AL,AL
JZ X31

;	BX ← ←i
MOV BX,[BP-2]
ADD BX,030X

;	←digit ← BX
POP DX
PUSH BX

;   else switch (i) {
JR X34
X31:

;	BX ← ←i
MOV BX,[BP-2]
JR X35

;     case 0: digit = 'd'; break;
X37:
MOV WORD PTR [BP-4],064X
JR X36

;     case 10: digit = '0'; break;
X38:
MOV WORD PTR [BP-4],030X
JR X36

;     case 11: digit = '*'; break;
X39:
MOV WORD PTR [BP-4],02AX
JR X36

;     case 12: digit = '#'; break;
X40:
MOV WORD PTR [BP-4],023X
JR X36

;     case 13: digit = 'a'; break;
X41:
MOV WORD PTR [BP-4],061X
JR X36

;     case 14: digit = 'b'; break;
X42:
MOV WORD PTR [BP-4],062X
JR X36

;     case 15: digit = 'c'; break;
X43:
MOV WORD PTR [BP-4],063X
JR X36

;     default: digit = 0;
X44:
MOV WORD PTR [BP-4],0

;     };
JR X36
X35:
MOV AL,BH
OR AL,AL
JNZ X44
MOV AL,BL
CMP AL,0
JZ X37
CMP AL,0AX
JZ X38
CMP AL,0BX
JZ X39
CMP AL,0CX
JZ X40
CMP AL,0DX
JZ X41
CMP AL,0EX
JZ X42
CMP AL,0FX
JZ X43
JR X44
X36:
X34:

;   return(digit);

;	BX ← ←digit
POP BX
PUSH BX
MOV SP,BP
POP BP
RET;

;   };

; int ScanIn()
←ScanIn:
PUSH BP
MOV BP,SP

;   {

;   return(inAn);
MOV BX,←inAn
MOV SP,BP
POP BP
RET;

;   };

; ResetAnalogInt()
←ResetAnalogInt:
PUSH BP
MOV BP,SP

;   {

;   PIOOff(0x0080, ipioa);
XOR BX,BX
MOV CX,080X
CALL ←PIOOff

;   PIOOn(0x0080, ipioa);
XOR BX,BX
MOV CX,080X
CALL ←PIOOn

;   };
MOV SP,BP
POP BP
RET;

; Led(active)
←Led:

;   int active;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   if (active) PIOOff(0x0040, ipioa);

;	BX ← ←active
POP BX
PUSH BX
OR BX,BX
JZ X45
XOR BX,BX
MOV CX,040X
CALL ←PIOOff

;   else PIOOn(0x0040, ipioa);
JR X46
X45:
XOR BX,BX
MOV CX,040X
CALL ←PIOOn
X46:

;   };
MOV SP,BP
POP BP
RET;

; KickWDT()
←KickWDT:
PUSH BP
MOV BP,SP

;   {

;   PIOOn(0x0008, ipioa);
XOR BX,BX
MOV CX,8
CALL ←PIOOn

;   PIOOff(0x0008, ipioa);
XOR BX,BX
MOV CX,8
CALL ←PIOOff

;   };
MOV SP,BP
POP BP
RET;

; ResetEncInt()
←ResetEncInt:
PUSH BP
MOV BP,SP

;   {

;   PIOOff(0x0001, ipioa);
XOR BX,BX
MOV CX,1
CALL ←PIOOff

;   PIOOn(0x0001, ipioa);
XOR BX,BX
MOV CX,1
CALL ←PIOOn

;   };
MOV SP,BP
POP BP
RET;

; StartSlave(prog, length)
←StartSlave:

;   int prog, length;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int i;
PUSH DX

;   StoreW(prog, CodeLoc);
MOV BX,0D9FCX

;	CX ← ←prog
MOV CX,[BP-2]
CALL ←StoreW

;   StoreW(length, CodeLen);
MOV BX,0D9FEX

;	CX ← ←length
MOV CX,[BP-4]
CALL ←StoreW

;   PIOOn(0x20, ipioa);
XOR BX,BX
MOV CX,020X
CALL ←PIOOn

;   for (i=0; i< 20; i+= 1);
MOV WORD PTR [BP-6],0
X49:

;	BX ← ←i
POP BX
PUSH BX
CMP BX,014X
JGE X48
JR X47
X50:
INC WORD PTR [BP-6]
JR X49
X47:
JR X50
X48:

;   OutByte(dmamode, 0xc0);
MOV BX,0C0X
MOV CX,01BX
CALL ←OutByte

;   OutByte(dmasmsk, 0x00);
XOR BX,BX
MOV CX,01AX
CALL ←OutByte

;   PIOOff(0x20, ipioa);
XOR BX,BX
MOV CX,020X
CALL ←PIOOff

;   for (i=0; i< 20; i+= 1);
MOV WORD PTR [BP-6],0
X53:

;	BX ← ←i
POP BX
PUSH BX
CMP BX,014X
JGE X52
JR X51
X54:
INC WORD PTR [BP-6]
JR X53
X51:
JR X54
X52:

;   if (prog != 0) {

;	BX ← ←prog
MOV BX,[BP-2]
OR BX,BX
JZ X55

;     PIOOff(0x10, ipioa);
XOR BX,BX
MOV CX,010X
CALL ←PIOOff

;     PIOOn(0x10, ipioa);
XOR BX,BX
MOV CX,010X
CALL ←PIOOn

;     PIOOff(0x10, ipioa);
XOR BX,BX
MOV CX,010X
CALL ←PIOOff

;     };
X55:

;   };
MOV SP,BP
POP BP
RET;

; SetIngain(ch, gain)
←SetIngain:

;   int ch, gain;
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int v;

;   switch (gain) {
PUSH DX

;	BX ← ←gain
MOV BX,[BP-4]
JR X56

;     case 0: v = InTab00; break;
X58:
MOV WORD PTR [BP-6],0FA00X
JR X57

;     case 1: v = InTab05; break;
X59:
MOV WORD PTR [BP-6],0FB00X
JR X57

;     case 2: v = InTab10; break;
X60:
MOV WORD PTR [BP-6],0FC00X
JR X57

;     case 3: v = InTab15; break;
X61:
MOV WORD PTR [BP-6],0FD00X
JR X57

;     case 4: v = InTab20; break;
X62:
MOV WORD PTR [BP-6],0FE00X
JR X57

;     default: v = InTab00;
X63:
MOV WORD PTR [BP-6],0FA00X

;     };
JR X57
X56:
MOV AL,BH
OR AL,AL
JNZ X63
MOV AL,BL
CMP AL,0
JZ X58
CMP AL,1
JZ X59
CMP AL,2
JZ X60
CMP AL,3
JZ X61
CMP AL,4
JZ X62
JR X63
X57:

;   if (ch & 1) StoreW(v, In1Gain);

;	BX ← ←ch
MOV BX,[BP-2]
AND BX,1
OR BX,BX
JZ X64
MOV BX,0D9F2X

;	CX ← ←v
POP CX
PUSH CX
CALL ←StoreW
X64:

;   if (ch & 2) StoreW(v, In2Gain);

;	BX ← ←ch
MOV BX,[BP-2]
AND BX,2
OR BX,BX
JZ X65
MOV BX,0D9F0X

;	CX ← ←v
POP CX
PUSH CX
CALL ←StoreW
X65:

;   };
MOV SP,BP
POP BP
RET;

; SetOutgain(gain)
←SetOutgain:

;   int gain;
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   int v;

;   switch (gain) {
PUSH DX

;	BX ← ←gain
MOV BX,[BP-2]
JR X66

;     case 0: v = OutTab00; break;
X68:
MOV WORD PTR [BP-4],0EA00X
JR X67

;     case 1: v = OutTab03; break;
X69:
MOV WORD PTR [BP-4],0EC00X
JR X67

;     case 2: v = OutTab06; break;
X70:
MOV WORD PTR [BP-4],0EE00X
JR X67

;     default: v = OutTab00;
X71:
MOV WORD PTR [BP-4],0EA00X

;     };
JR X67
X66:
MOV AL,BH
OR AL,AL
JNZ X71
MOV AL,BL
CMP AL,0
JZ X68
CMP AL,1
JZ X69
CMP AL,2
JZ X70
JR X71
X67:

;   StoreW(v, OutGain);
MOV BX,0D9F4X

;	CX ← ←v
POP CX
PUSH CX
CALL ←StoreW

;   };
MOV SP,BP
POP BP
RET;

; XbarClear()
←XbarClear:
PUSH BP
MOV BP,SP

;   {

;   int row, col;

;   for (col = 0; col < 8; col += 1) {
ADD SP,0FFFCX
MOV WORD PTR [BP-4],0
X74:

;	BX ← ←col
POP BX
PUSH BX
CMP BX,8
JGE X73
JR X72
X75:
INC WORD PTR [BP-4]
JR X74
X72:

;     for (row = 0; row < 8; row += 1) xbarcom(row, col, false);
MOV WORD PTR [BP-2],0
X78:

;	BX ← ←row
MOV BX,[BP-2]
CMP BX,8
JGE X77
JR X76
X79:
INC WORD PTR [BP-2]
JR X78
X76:

;	BX ← ←row
MOV BX,[BP-2]
PUSH BX
XOR BX,BX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX
JR X79
X77:

;     xbarcom(4, col, true);
MOV BX,4
PUSH BX
MOV BX,0FFFFX

;	CX ← ←col
MOV CX,[BP-4]
CALL ←xbarcom
POP DX

;     };
JR X75
X73:

;   };
MOV SP,BP
POP BP
RET;

; int GetBootSwitches()
←GetBootSwitches:
PUSH BP
MOV BP,SP

;   {

;   int i;
PUSH DX

;   i = (GetPIO(ipiob) >> 6) & 3;
MOV BX,1
CALL ←GetPIO
MOV CX,6
SHR BX,CX
AND BX,3

;	←i ← BX
POP DX
PUSH BX

;   return (i + (GetPIO(ipioc) & 4));
MOV BX,2
CALL ←GetPIO
AND BX,4

;	CX ← ←i
POP CX
PUSH CX
ADD CX,BX
MOV BX,CX
MOV SP,BP
POP BP
RET;

;   };

; char *GetXBarState()
←GetXBarState:
PUSH BP
MOV BP,SP

;   {

;   return (xBarState);
LEA BX,←xBarState
MOV SP,BP
POP BP
RET;

;   };

; Externals Declared Here
PUBLIC ←inAn
PUBLIC ←xBarState
PUBLIC ←myAlDInt
PUBLIC ←InitAnalog
PUBLIC ←ResetAnalogInt
PUBLIC ←XbarClear
PUBLIC ←SetXbar
PUBLIC ←ClearXbar
PUBLIC ←Revert
PUBLIC ←GoOffHook
PUBLIC ←ARelay
PUBLIC ←RevertHS
PUBLIC ←SideTone
PUBLIC ←RingEnable
PUBLIC ←GetDTMF
PUBLIC ←ScanIn
PUBLIC ←Led
PUBLIC ←KickWDT
PUBLIC ←ResetEncInt
PUBLIC ←StartSlave
PUBLIC ←SetIngain
PUBLIC ←SetOutgain
PUBLIC ←GetBootSwitches
PUBLIC ←GetXBarState

C←CODE ENDS

; Number of Bytes of Code = 05B2X, (1458)