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

$INCLUDE(8086LIB.D)

$INCLUDE(RPCFir.DEC)

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

; #include <Alloc.h>

; extern int Call();

; extern int *mySoc;

; extern struct ZN *myZone;

; extern StartCall();

; extern int CallFailed;

; extern int RejectUnbound;

; extern struct PBI *GetPBI();

; extern ReleasePBI();

; extern int *Allocate();

; extern int *MyFrame();

; extern Free();

; extern int *MyFrame();

; extern int **CallersFrame();

; extern Marshall(/* swapBytes, dest, source, nWords */);

; extern int apply(/* int args[], proc, nargs */ );

; struct Type {

;   int esWord; /* = {

;   int overhead;  /* non-duplicated header, assumed words (to be swapped) */

;   int length;  /* number of elements, or index thereof */

;   };

; struct Sequence {

;   int maxLength;

;   int data[1];

;   };

; struct DSpecs {

;   int *proc;  /* The remote procedure !!! */

;   struct ShortSTRING *argSpecs;  /* string specifying parameters */

;   struct ShortSTRING *resSpecs; /* one-character string specifying results. */

;   };

; struct DSpecsTable {

;   int *Free;  /*: PROC{dSpecsTable;}; -- releases table */

;   int maxProcs;

;   struct DSpecs entries[1];

;   };

; static struct Type *types[];

; struct Type

; *dBlock(elementSize, overhead, length, atLen, eltWd) 
←dBlock:

;   int elementSize, overhead, length, atLen, eltWd;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   struct Type *res;
PUSH DX

;   res = (struct Type *) Allocate(myZone, lenType);
MOV BX,3
MOV CX,←myZone
CALL ←Allocate

;	←res ← BX
POP DX
PUSH BX

;   res->esWord = elementSize;  /* element size field is low order */

;	BX ← ←res
POP BX
PUSH BX

;	CX ← ←elementSize
MOV CX,[BP+8]
MOV [BX],CX

;   res->overhead = overhead;

;	BX ← ←res
POP BX
PUSH BX

;	CX ← ←overhead
MOV CX,[BP+6]
MOV [BX+2],CX

;   res->length = length;

;	BX ← ←res
POP BX
PUSH BX

;	CX ← ←length
MOV CX,[BP+4]
MOV [BX+4],CX

;   if (atLen) res->esWord |= atLenField;

;	BX ← ←atLen
MOV BX,[BP-2]
OR BX,BX
JZ X1

;	BX ← ←res
POP BX
PUSH BX
OR WORD PTR [BX],04000X
X1:

;   if (eltWd) res->esWord |= eltsAreWordsField;

;	BX ← ←eltWd
MOV BX,[BP-4]
OR BX,BX
JZ X2

;	BX ← ←res
POP BX
PUSH BX
OR WORD PTR [BX],08000X
X2:

;   return (res);

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

;   };

; static int

; BlockSize(loc, type, lvLen) 
←BlockSize:

;   int loc[]; struct Type *type; int *lvLen;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int eltLen, numElts, temp;

;   if ((type->esWord&atLenField)==0) numElts = type->length;
ADD SP,0FFFAX

;	DI ← ←type
MOV DI,[BP-2]
MOV BX,[DI]
AND BX,04000X
OR BX,BX
JNZ X3

;	BX ← ←type
MOV BX,[BP-2]
MOV CX,[BX+4]

;	←numElts ← CX
MOV [BP-8],CX

;   else {
JR X4
X3:

;     numElts = loc[type->length];

;	BX ← ←type
MOV BX,[BP-2]
MOV CX,[BX+4]

;	BX ← ←loc
MOV BX,[BP+4]
SAL CX
ADD BX,CX
MOV CX,[BX]

;	←numElts ← CX
MOV [BP-8],CX

;     if (lvLen==0) numElts =  swab(numElts);

;	BX ← ←lvLen
MOV BX,[BP-4]
OR BX,BX
JNZ X5

;	BX ← ←numElts
MOV BX,[BP-8]
CALL ←swab

;	←numElts ← BX
MOV [BP-8],BX
X5:

;     };
X4:

;   if (lvLen) *lvLen=swab(numElts);

;	BX ← ←lvLen
MOV BX,[BP-4]
OR BX,BX
JZ X6

;	BX ← ←numElts
MOV BX,[BP-8]
CALL ←swab
MOV CX,BX

;	BX ← ←lvLen
MOV BX,[BP-4]
MOV [BX],CX
X6:

;   eltLen = type->esWord&elementSizeField;

;	DI ← ←type
MOV DI,[BP-2]
MOV BX,[DI]
AND BX,07FFX

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

;   if (eltLen >= 16) temp = (eltLen >> 4)*numElts;

;	BX ← ←eltLen
MOV BX,[BP-6]
CMP BX,010X
JL X7
MOV CX,4

;	BX ← ←eltLen
MOV BX,[BP-6]
SHR BX,CX
MOV AX,BX

;	BX ← ←numElts
MOV BX,[BP-8]
IMUL AX,BX

;	←temp ← AX
POP DX
PUSH AX

;   else temp = ((numElts-1)/(16/eltLen))+1;
JR X8
X7:

;	BX ← ←numElts
MOV BX,[BP-8]
DEC BX
MOV AX,010X

;	CX ← ←eltLen
MOV CX,[BP-6]
CWD
IDIV AX,CX
XCHG AX,BX
CWD
IDIV AX,BX
INC AX

;	←temp ← AX
POP DX
PUSH AX
X8:

;   Block();
CALL ←Block

;   return (type->overhead + temp);

;	BX ← ←type
MOV BX,[BP-2]
MOV CX,[BX+2]

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

;   };

; int

; MarshallFormatted(spec, pkt, pktLength, args)
←MarshallFormatted:

;   struct ShortSTRING *spec; struct PBI *pkt; int pktLength; int *args[];
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int dest[];

;   int i; char tChar;

;   struct Header *hdr;

;   struct ShortSTRING *ss;

;   struct Type *type;

;   int src[], len, isNil, swapBytes, oLen;
ADD SP,0FFEAX

;   hdr = pkt->pup;

;	BX ← ←pkt
MOV BX,[BP+4]
MOV CX,[BX+6]

;	←hdr ← CX
MOV [BP-12],CX

;   dest = hdr->callData.words;

;	BX ← ←hdr
MOV BX,[BP-12]
ADD BX,028X

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

;   for (i = 0; i<spec->length; ++i) {
MOV WORD PTR [BP-8],0
X11:

;	DI ← ←spec
MOV DI,[BP+6]
MOV BX,[DI]

;	CX ← ←i
MOV CX,[BP-8]
CMP CX,BX
JGE X10
JR X9
X12:
INC WORD PTR [BP-8]
JR X11
X9:

;     Block();
CALL ←Block

;     swapBytes=false; oLen=0;
MOV WORD PTR [BP-24],0
MOV WORD PTR [BP-26],0

;     src = args[i];

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

;	CX ← ←args
MOV CX,[BP-4]
SAL BX
ADD BX,CX
MOV CX,[BX]

;	←src ← CX
MOV [BP-18],CX

;     isNil = (src)? 0: swapped1;

;	BX ← ←src
MOV BX,[BP-18]
OR BX,BX
JZ X13
XOR BX,BX
JR X14
X13:
MOV BX,0100X
X14:

;	←isNil ← BX
MOV [BP-22],BX

;     dest[pktLength++] = isNil;  /* isNil spec */
INC WORD PTR [BP-2]

;	BX ← ←pktLength
MOV BX,[BP-2]
DEC BX

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX

;	CX ← ←isNil
MOV CX,[BP-22]
MOV [BX],CX

;     switch (tChar=spec->text[i]) {

;	BX ← ←spec
MOV BX,[BP+6]
ADD BX,4

;	CX ← ←i
MOV CX,[BP-8]
ADD BX,CX
MOV AL,[BX]

;	←tChar ← AL
MOV [BP-10],AL
JR X15

;       case 'W': {
X17:

;         dest[pktLength-1] = swab(src);

;	BX ← ←pktLength
MOV BX,[BP-2]
DEC BX

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←src
MOV BX,[BP-18]
CALL ←swab
MOV CX,BX
POP BX
MOV [BX],CX

;         continue;
JR X12

;         };

;       case 'B': {
X18:

;         dest[pktLength-1] = (int) src;

;	BX ← ←pktLength
MOV BX,[BP-2]
JR $+5
X10:
JMP X19
DEC BX

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX

;	CX ← ←src
MOV CX,[BP-18]
MOV [BX],CX

;         continue;
JMP X12

;         };

;       case 'D': {
X20:

;         --pktLength; /* no "isNil" word */
DEC WORD PTR [BP-2]

;         len=2;
MOV WORD PTR [BP-20],2

;         swapBytes=true;
MOV WORD PTR [BP-24],0FFFFX

;         break;
JR X16

;         };

;       case 'S': {
X21:

;         ss=(struct ShortSTRING *) src;

;	BX ← ←src
MOV BX,[BP-18]

;	←ss ← BX
MOV [BP-14],BX

;         ++src;
ADD WORD PTR [BP-18],2

;         len=(ss->length+3)/2;

;	DI ← ←ss
MOV DI,[BP-14]
MOV BX,[DI]
ADD BX,3
SAR BX

;	←len ← BX
MOV [BP-20],BX

;         oLen=1;
MOV WORD PTR [BP-26],1

;         break;
JR X16

;         };

;       default: {
X22:

;         if (isNil) continue;

;	BX ← ←isNil
MOV BX,[BP-22]
OR BX,BX
JZ X23
JMP X12
X23:

;         type = types[tChar-'A'];

;	AL ← ←tChar
MOV AL,[BP-10]
ADD AL,0BFX
XOR AH,AH
MOV BX,←types
SAL AX
JR $+5
X15:
JMP X24
ADD BX,AX
MOV CX,[BX]

;	←type ← CX
MOV [BP-16],CX

;         if (type==0) SIGNAL(CallFailed, badArgs);

;	BX ← ←type
MOV BX,[BP-16]
OR BX,BX
JNZ X25
MOV BX,011X
MOV CX,←CallFailed
CALL ←SIGNAL
X25:

;         len = BlockSize(src, type, &dest[pktLength++]);

;	BX ← ←src
MOV BX,[BP-18]
PUSH BX
INC WORD PTR [BP-2]

;	BX ← ←pktLength
MOV BX,[BP-2]
DEC BX

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX

;	CX ← ←type
MOV CX,[BP-16]
CALL ←BlockSize
POP DX

;	←len ← BX
MOV [BP-20],BX

;         oLen = type->overhead;

;	BX ← ←type
MOV BX,[BP-16]
MOV CX,[BX+2]

;	←oLen ← CX
POP DX
PUSH CX

;         swapBytes = type->esWord&eltsAreWordsField;

;	DI ← ←type
JR $+5
X16:
JMP X26
MOV DI,[BP-16]
MOV BX,[DI]
AND BX,08000X

;	←swapBytes ← BX
MOV [BP-24],BX

;         if ((type->esWord&atLenField)!=0) dest[pktLength++] = 0;

;	DI ← ←type
MOV DI,[BP-16]
MOV BX,[DI]
AND BX,04000X
OR BX,BX
JZ X27
INC WORD PTR [BP-2]

;	BX ← ←pktLength
MOV BX,[BP-2]
DEC BX

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX
MOV WORD PTR [BX],0

;          else pktLength -= 1;
JR X28
X27:
DEC WORD PTR [BP-2]
X28:

;          };

;       };
JMP X26
X24:
CMP AL,057X
JMPZ X17
CMP AL,042X
JMPZ X18
CMP AL,044X
JMPZ X20
CMP AL,053X
JMPZ X21
JMP X22
X26:

;     if (isNil) continue;

;	BX ← ←isNil
MOV BX,[BP-22]
OR BX,BX
JZ X29
JMP X12
X29:

;     if (oLen) Marshall(true, &dest[pktLength], src, oLen);

;	BX ← ←oLen
POP BX
PUSH BX
OR BX,BX
JZ X30
MOV BX,0FFFFX
PUSH BX

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

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←oLen
MOV BX,[BP-26]

;	CX ← ←src
MOV CX,[BP-18]
CALL ←Marshall
ADD SP,4
X30:

;     pktLength += oLen;

;	BX ← ←oLen
POP BX
PUSH BX
ADD [BP-2],BX

;     len-=oLen;

;	BX ← ←oLen
POP BX
PUSH BX
SUB [BP-20],BX

;     if (len) Marshall(swapBytes, &dest[pktLength], &src[oLen], len);

;	BX ← ←len
MOV BX,[BP-20]
OR BX,BX
JZ X31

;	BX ← ←swapBytes
MOV BX,[BP-24]
PUSH BX

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

;	CX ← ←dest
MOV CX,[BP-6]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←oLen
MOV BX,[BP-26]

;	CX ← ←src
MOV CX,[BP-18]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←len
MOV BX,[BP-20]
POP CX
CALL ←Marshall
ADD SP,4
X31:

;     pktLength += len;

;	BX ← ←len
MOV BX,[BP-20]
ADD [BP-2],BX

;     };
JMP X12
X19:

;   if (pktLength > maxDataLength) SIGNAL(CallFailed, badArgs);

;	BX ← ←pktLength
MOV BX,[BP-2]
CMP BX,076X
JLE X32
MOV BX,011X
MOV CX,←CallFailed
CALL ←SIGNAL
X32:

;   return pktLength;

;	BX ← ←pktLength
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;

;   };

; int

; UnmarshallFormatted(spec, pkt, pktLength, vbls)
←UnmarshallFormatted:

;   struct ShortSTRING *spec;

;   struct PBI *pkt;

;   int pktLength;

;   int vbls[];
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int src[];

;   int *dests, dest[], len, i;

;   char tChar;

;   struct Header *hdr;

;   struct ShortSTRING *ss;

;   struct Type *type;

;   int isNil, val, oLen, swapBytes;
ADD SP,0FFE6X

;   hdr=pkt->pup;

;	BX ← ←pkt
MOV BX,[BP+4]
MOV CX,[BX+6]

;	←hdr ← CX
MOV [BP-18],CX

;   src = hdr->callData.words;

;	BX ← ←hdr
MOV BX,[BP-18]
ADD BX,028X

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

;   for (i = 0; i<spec->length; ++i) {
MOV WORD PTR [BP-14],0
X35:

;	DI ← ←spec
MOV DI,[BP+6]
MOV BX,[DI]

;	CX ← ←i
MOV CX,[BP-14]
CMP CX,BX
JGE X34
JR X33
X36:
INC WORD PTR [BP-14]
JR X35
X33:

;     Block();
CALL ←Block

;     swapBytes = oLen = 0;
MOV WORD PTR [BP-28],0
MOV WORD PTR [BP-30],0

;     isNil = src[pktLength++];
INC WORD PTR [BP-2]

;	BX ← ←pktLength
MOV BX,[BP-2]
DEC BX

;	CX ← ←src
MOV CX,[BP-6]
SAL BX
ADD BX,CX
MOV CX,[BX]

;	←isNil ← CX
MOV [BP-24],CX

;     dests=&vbls[i]; if (isNil) *dests=0;

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

;	CX ← ←vbls
MOV CX,[BP-4]
SAL BX
ADD BX,CX

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

;	BX ← ←isNil
MOV BX,[BP-24]
OR BX,BX
JZ X37

;	BX ← ←dests
MOV BX,[BP-8]
MOV WORD PTR [BX],0
X37:

;     switch (tChar=spec->text[i]) {

;	BX ← ←spec
MOV BX,[BP+6]
ADD BX,4

;	CX ← ←i
MOV CX,[BP-14]
ADD BX,CX
MOV AL,[BX]

;	←tChar ← AL
MOV [BP-16],AL
JR X38

;       case 'W':  {
X40:

;         *dests = swab(isNil); /* no nil test, really */

;	BX ← ←isNil
MOV BX,[BP-24]
CALL ←swab
MOV CX,BX

;	BX ← ←dests
MOV BX,[BP-8]
MOV [BX],CX

;         continue;
JR X36

;         };

;       case 'B': {
X41:

;         *dests = isNil;

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

;	CX ← ←isNil
MOV CX,[BP-24]
MOV [BX],CX

;         continue;
JR X36

;         };

;       case 'D': {
X42:

;         --pktLength; /* no "isNil" */
DEC WORD PTR [BP-2]

;         len=2;
MOV WORD PTR [BP-12],2

;         swapBytes=true;
JR $+5
X34:
JMP X43
MOV WORD PTR [BP-30],0FFFFX

;         break;
JR X39

;         };

;       case 'S': {
X44:

;         if (isNil)  continue;

;	BX ← ←isNil
MOV BX,[BP-24]
OR BX,BX
JZ X45
JMP X36
X45:

;         ss = (struct ShortSTRING *) &src[pktLength];

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

;	CX ← ←src
MOV CX,[BP-6]
SAL BX
ADD BX,CX

;	←ss ← BX
MOV [BP-20],BX

;         len = (swab(ss->length)+5)/2;

;	DI ← ←ss
MOV DI,[BP-20]
MOV BX,[DI]
CALL ←swab
ADD BX,5
SAR BX

;	←len ← BX
MOV [BP-12],BX

;         --pktLength;
DEC WORD PTR [BP-2]

;         src[pktLength]=src[pktLength+1];

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

;	CX ← ←src
MOV CX,[BP-6]
SAL BX
ADD BX,CX

;	CX ← ←pktLength
MOV CX,[BP-2]
INC CX

;	AX ← ←src
MOV AX,[BP-6]
SAL CX
ADD CX,AX
MOV DI,CX
MOV CX,[DI]
MOV [BX],CX

;         oLen=2;
JR $+5
X38:
JMP X46
MOV WORD PTR [BP-28],2

;         break;
JR X39

;         };

;       default: {
X47:

;         if (isNil)  continue;

;	BX ← ←isNil
MOV BX,[BP-24]
OR BX,BX
JZ X48
JMP X36
X48:

;         type = types[tChar-'A'];

;	AL ← ←tChar
MOV AL,[BP-16]
ADD AL,0BFX
XOR AH,AH
MOV BX,←types
SAL AX
ADD BX,AX
MOV CX,[BX]

;	←type ← CX
MOV [BP-22],CX

;         if (type==0) SIGNAL(CallFailed, badArgs);

;	BX ← ←type
MOV BX,[BP-22]
OR BX,BX
JR $+5
X39:
JMP X50
JNZ X49
MOV BX,011X
MOV CX,←CallFailed
CALL ←SIGNAL
X49:

;         if ((type->esWord&atLenField)!=0) pktLength+=2;

;	DI ← ←type
MOV DI,[BP-22]
MOV BX,[DI]
AND BX,04000X
OR BX,BX
JZ X51
ADD WORD PTR [BP-2],2
X51:

;         len=BlockSize(&src[pktLength], type, 0);

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

;	CX ← ←src
MOV CX,[BP-6]
SAL BX
ADD BX,CX
PUSH BX
XOR BX,BX

;	CX ← ←type
MOV CX,[BP-22]
CALL ←BlockSize
POP DX

;	←len ← BX
MOV [BP-12],BX

;         oLen=type->overhead;

;	BX ← ←type
MOV BX,[BP-22]
MOV CX,[BX+2]

;	←oLen ← CX
MOV [BP-28],CX

;         swapBytes = type->esWord&eltsAreWordsField;

;	DI ← ←type
MOV DI,[BP-22]
MOV BX,[DI]
AND BX,08000X

;	←swapBytes ← BX
POP DX
PUSH BX

;         };

;       };
JMP X50
X46:
CMP AL,057X
JMPZ X40
CMP AL,042X
JMPZ X41
CMP AL,044X
JMPZ X42
CMP AL,053X
JMPZ X44
JMP X47
X50:

;     *dests= (int) (dest=Allocate(myZone, len));

;	BX ← ←len
MOV BX,[BP-12]
MOV CX,←myZone
CALL ←Allocate

;	←dest ← BX
MOV [BP-10],BX
MOV CX,BX

;	BX ← ←dests
MOV BX,[BP-8]
MOV [BX],CX

;     if (oLen) Marshall(true, dest, &src[pktLength], oLen);

;	BX ← ←oLen
MOV BX,[BP-28]
OR BX,BX
JZ X52
MOV BX,0FFFFX
PUSH BX

;	BX ← ←dest
MOV BX,[BP-10]
PUSH BX

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

;	CX ← ←src
MOV CX,[BP-6]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←oLen
MOV BX,[BP-28]
POP CX
CALL ←Marshall
ADD SP,4
X52:

;     if (len -= oLen) Marshall(swapBytes, &dest[oLen], &src[pktLength+=oLen], len);

;	BX ← ←oLen
MOV BX,[BP-28]
SUB [BP-12],BX

;	BX ← ←len
MOV BX,[BP-12]
OR BX,BX
JZ X53

;	BX ← ←swapBytes
POP BX
PUSH BX
PUSH BX

;	BX ← ←oLen
MOV BX,[BP-28]

;	CX ← ←dest
MOV CX,[BP-10]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←oLen
MOV BX,[BP-28]
ADD [BP-2],BX

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

;	CX ← ←src
MOV CX,[BP-6]
SAL BX
ADD BX,CX
PUSH BX

;	BX ← ←len
MOV BX,[BP-12]
POP CX
CALL ←Marshall
ADD SP,4
X53:

;     pktLength+=len;

;	BX ← ←len
MOV BX,[BP-12]
ADD [BP-2],BX

;     };
JMP X36
X43:

;   if (pktLength > (swab(hdr->length)>>1)-headerSize-1) SIGNAL(CallFailed, badArgs);

;	DI ← ←hdr
MOV DI,[BP-18]
MOV BX,[DI]
CALL ←swab
SHR BX
ADD BX,0FFEDX

;	CX ← ←pktLength
MOV CX,[BP-2]
CMP CX,BX
JLE X54
MOV BX,011X
MOV CX,←CallFailed
CALL ←SIGNAL
X54:

;   return pktLength;

;	BX ← ←pktLength
MOV BX,[BP-2]
MOV SP,BP
POP BP
RET;

;   };

; static UnwindPkt(sig, code, seal)
←UnwindPkt:

;   int sig, code;

;   struct Seal1 *seal;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   ReleasePBI(seal->data[0]);

;	BX ← ←seal
POP BX
PUSH BX
ADD BX,4
MOV CX,[BX]
MOV BX,CX
CALL ←ReleasePBI

;   DISABLE(seal);

;	BX ← ←seal
POP BX
PUSH BX
CALL ←DISABLE

;   };
MOV SP,BP
POP BP
RET;

; static struct PBI

; *GetUnwindPkt(seal)
←GetUnwindPkt:

;   struct Seal1 *seal;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   struct PBI *pkt;
PUSH DX

;   pkt = GetPBI(mySoc);
MOV BX,←mySoc
CALL ←GetPBI

;	←pkt ← BX
POP DX
PUSH BX

;   ENABLEWithFrame(UNWIND, &UnwindPkt, seal, MyFrame());
MOV BX,1
PUSH BX
MOV BX,OFFSET ←UnwindPkt
PUSH BX
CALL ←MyFrame

;	CX ← ←seal
MOV CX,[BP-2]
CALL ←ENABLEWithFrame
ADD SP,4

;   seal->data[0] = (int) pkt;

;	BX ← ←seal
MOV BX,[BP-2]
ADD BX,4

;	CX ← ←pkt
POP CX
PUSH CX
MOV [BX],CX

;   return (pkt);

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

;   };

; int

; CallFormatted(interface, proc, argSpec, retSpec, args)
←CallFormatted:

;   struct ImportInstance *interface;

;   int *proc;

;   struct ShortSTRING *argSpec, *retSpec;

;   int *args;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int pktLength;

;   int defArgs[10];

;   int callResults[];

;   struct PBI *pkt; struct Header *hdr;

;   struct Seal1 seal;

;   int na;
ADD SP,0FFDCX

;   pkt = GetUnwindPkt(&seal);
;&←seal
LEA BX,[BP-38]
CALL ←GetUnwindPkt

;	←pkt ← BX
MOV [BP-30],BX

;   na = argSpec->length;

;	DI ← ←argSpec
MOV DI,[BP+4]
MOV BX,[DI]

;	←na ← BX
POP DX
PUSH BX

;   if (args==0) args = defArgs;

;	BX ← ←args
MOV BX,[BP-4]
OR BX,BX
JNZ X55
;&←defArgs
LEA BX,[BP-26]

;	←args ← BX
MOV [BP-4],BX
X55:

;   StartCall(pkt, interface, interface->currentConversation);

;	BX ← ←pkt
MOV BX,[BP-30]
PUSH BX

;	BX ← ←interface
MOV BX,[BP+8]
MOV CX,[BX+2]
MOV BX,CX

;	CX ← ←interface
MOV CX,[BP+8]
CALL ←StartCall
POP DX

;   hdr = pkt->pup;

;	BX ← ←pkt
MOV BX,[BP-30]
MOV CX,[BX+6]

;	←hdr ← CX
MOV [BP-32],CX

;   hdr->callData.words[0] = swab(proc);

;	BX ← ←hdr
MOV BX,[BP-32]
ADD BX,028X
PUSH BX

;	BX ← ←proc
MOV BX,[BP+6]
CALL ←swab
MOV CX,BX
POP BX
MOV [BX],CX

;   pktLength = MarshallFormatted(argSpec, pkt, 1, args);

;	BX ← ←argSpec
MOV BX,[BP+4]
PUSH BX

;	BX ← ←pkt
MOV BX,[BP-30]
PUSH BX

;	BX ← ←args
MOV BX,[BP-4]
MOV CX,1
CALL ←MarshallFormatted
ADD SP,4

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

;   Call(pkt, pktLength, maxDataLength);

;	BX ← ←pkt
MOV BX,[BP-30]
PUSH BX
MOV BX,076X

;	CX ← ←pktLength
MOV CX,[BP-6]
CALL ←Call
POP DX

;   callResults = &args[na];

;	BX ← ←na
POP BX
PUSH BX

;	CX ← ←args
MOV CX,[BP-4]
SAL BX
ADD BX,CX

;	←callResults ← BX
MOV [BP-28],BX

;   UnmarshallFormatted(retSpec, pkt, 0, callResults);

;	BX ← ←retSpec
MOV BX,[BP-2]
PUSH BX

;	BX ← ←pkt
MOV BX,[BP-30]
PUSH BX

;	BX ← ←callResults
MOV BX,[BP-28]
XOR CX,CX
CALL ←UnmarshallFormatted
ADD SP,4

;   UnwindPkt(0,0,&seal);
XOR BX,BX
PUSH BX
;&←seal
LEA BX,[BP-38]
XOR CX,CX
CALL ←UnwindPkt
POP DX

;   return callResults[0];

;	DI ← ←callResults
MOV DI,[BP-28]
MOV BX,[DI]
MOV SP,BP
POP BP
RET;

;   };

; FreeSpecs(dSpecsT)
←FreeSpecs:

;   struct DSpecsTable *dSpecsT;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   Free(myZone, dSpecsT);

;	BX ← ←dSpecsT
POP BX
PUSH BX
MOV CX,←myZone
CALL ←Free

;   };
MOV SP,BP
POP BP
RET;

; struct DSpecsTable

; *StartDispatcherSpecs(maxProcs)
←StartDispatcherSpecs:

;   int maxProcs;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH BX

;   {

;   struct DSpecsTable *res;

;   if (types==0) AddType('Z', 0); /* force type table initialization */
PUSH DX
MOV BX,←types
OR BX,BX
JNZ X56
XOR BX,BX
MOV CX,05AX
CALL ←AddType
X56:

;   res = (struct DSpecsTable *) Allocate(myZone, lenDSpecsTable + (maxProcs * lenDSpecs));

;	BX ← ←maxProcs
MOV BX,[BP-2]
MOV DX,BX
SAL BX
ADD BX,DX
INC BX
INC BX
MOV CX,←myZone
CALL ←Allocate

;	←res ← BX
POP DX
PUSH BX

;   res->Free = &FreeSpecs;

;	BX ← ←res
POP BX
PUSH BX
MOV CX,OFFSET ←FreeSpecs
MOV [BX],CX

;   res->maxProcs = maxProcs;

;	BX ← ←res
POP BX
PUSH BX

;	CX ← ←maxProcs
MOV CX,[BP-2]
MOV [BX+2],CX

;   return res;

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

;   };

; AddToDispatcherSpecs(dSpecsT, procIndex, proc, argSpec, retSpec)
←AddToDispatcherSpecs:

;    struct DSpecsTable *dSpecsT;

;   int procIndex, *proc;

;   struct ShortSTRING *argSpec, *retSpec;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   struct DSpecs *dSpecs;
PUSH DX

;   procIndex -= lupineOffset;
SUB WORD PTR [BP+6],4

;   if (procIndex >= dSpecsT->maxProcs) SIGNAL(ERROR);

;	BX ← ←dSpecsT
MOV BX,[BP+8]
MOV CX,[BX+2]

;	BX ← ←procIndex
MOV BX,[BP+6]
CMP BX,CX
JL X57
MOV BX,2
CALL ←SIGNAL
X57:

;   dSpecs = &dSpecsT->entries[procIndex];

;	BX ← ←dSpecsT
MOV BX,[BP+8]
ADD BX,4

;	CX ← ←procIndex
MOV CX,[BP+6]
MOV AX,6
IMUL AX,CX
ADD BX,AX

;	←dSpecs ← BX
POP DX
PUSH BX

;   dSpecs->proc = proc;

;	BX ← ←dSpecs
POP BX
PUSH BX

;	CX ← ←proc
MOV CX,[BP+4]
MOV [BX],CX

;   dSpecs->argSpecs = argSpec;

;	BX ← ←dSpecs
POP BX
PUSH BX

;	CX ← ←argSpec
MOV CX,[BP-2]
MOV [BX+2],CX

;   dSpecs->resSpecs = retSpec;

;	BX ← ←dSpecs
POP BX
PUSH BX

;	CX ← ←retSpec
MOV CX,[BP-4]
MOV [BX+4],CX

;   Block( );
CALL ←Block

;   };
MOV SP,BP
POP BP
RET;

; AddType(letter, type)
←AddType:

;   char letter;

;   struct Type *type;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   if (type==0) {

;	BX ← ←type
POP BX
PUSH BX
OR BX,BX
JNZ X58

;     types = (struct Type **) Allocate(myZone, 26);
MOV BX,01AX
MOV CX,←myZone
CALL ←Allocate
MOV ←types,BX

;     AddType('Q', dBlock(16, 1, 0, true, true));   /* Word Sequence */
MOV BX,010X
PUSH BX
MOV BX,1
PUSH BX
XOR BX,BX
PUSH BX
MOV BX,0FFFFX
MOV CX,0FFFFX
CALL ←dBlock
ADD SP,6
MOV CX,051X
CALL ←AddType

;     AddType('C', dBlock(8, 1, 0, true, false)); /* Byte Sequence */
MOV BX,8
PUSH BX
MOV BX,1
PUSH BX
XOR BX,BX
PUSH BX
XOR BX,BX
MOV CX,0FFFFX
CALL ←dBlock
ADD SP,6
MOV CX,043X
CALL ←AddType

;     };
X58:

;   types[letter-'A'] = type;

;	AL ← ←letter
MOV AL,[BP-2]
ADD AL,0BFX
XOR AH,AH
MOV BX,←types
SAL AX
ADD BX,AX

;	CX ← ←type
POP CX
PUSH CX
MOV [BX],CX

;   };
MOV SP,BP
POP BP
RET;

; int

; StdDispatcher(pkt, newLength, conversation, dSpecsT)
←StdDispatcher:

;   struct PBI *pkt;

;   int newLength;

;   int *conversation;

;   struct DSpecsTable *dSpecsT;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   int args[10];

;   int rout, argLen;

;   struct DSpecs *dSpecs;

;   struct ShortSTRING *argSpecs;

;   struct Header *hdr;
ADD SP,0FFE2X

;   hdr = pkt->pup;

;	BX ← ←pkt
MOV BX,[BP+6]
MOV CX,[BX+6]

;	←hdr ← CX
POP DX
PUSH CX

;   rout = swab(hdr->callData.words[0]) - lupineOffset;

;	BX ← ←hdr
POP BX
PUSH BX
ADD BX,028X
MOV CX,[BX]
MOV BX,CX
CALL ←swab
ADD BX,0FFFCX

;	←rout ← BX
MOV [BP-26],BX

;   if (rout >= dSpecsT->maxProcs) SIGNAL(RejectUnbound);

;	BX ← ←dSpecsT
MOV BX,[BP-4]
MOV CX,[BX+2]

;	BX ← ←rout
MOV BX,[BP-26]
CMP BX,CX
JL X59
MOV BX,←RejectUnbound
CALL ←SIGNAL
X59:

;   dSpecs = &dSpecsT->entries[rout];

;	BX ← ←dSpecsT
MOV BX,[BP-4]
ADD BX,4

;	CX ← ←rout
MOV CX,[BP-26]
MOV AX,6
IMUL AX,CX
ADD BX,AX

;	←dSpecs ← BX
MOV [BP-30],BX

;   argSpecs = dSpecs->argSpecs;

;	BX ← ←dSpecs
MOV BX,[BP-30]
MOV CX,[BX+2]

;	←argSpecs ← CX
MOV [BP-32],CX

;   argLen = argSpecs->length;

;	DI ← ←argSpecs
MOV DI,[BP-32]
MOV BX,[DI]

;	←argLen ← BX
MOV [BP-28],BX

;   if (argLen>10) SIGNAL(CallFailed, badArgs);

;	BX ← ←argLen
MOV BX,[BP-28]
CMP BX,0AX
JLE X60
MOV BX,011X
MOV CX,←CallFailed
CALL ←SIGNAL
X60:

;   if (dSpecs->proc == 0) SIGNAL(RejectUnbound);

;	DI ← ←dSpecs
MOV DI,[BP-30]
MOV BX,[DI]
OR BX,BX
JNZ X61
MOV BX,←RejectUnbound
CALL ←SIGNAL
X61:

;   UnmarshallFormatted(argSpecs, pkt, 1, args);

;	BX ← ←argSpecs
MOV BX,[BP-32]
PUSH BX

;	BX ← ←pkt
MOV BX,[BP+6]
PUSH BX
;&←args
LEA BX,[BP-24]
MOV CX,1
CALL ←UnmarshallFormatted
ADD SP,4

;   args[0] = apply(args, dSpecs->proc, argLen); 
;&←args
LEA BX,[BP-24]
PUSH BX

;	DI ← ←dSpecs
MOV DI,[BP-30]
MOV BX,[DI]
PUSH BX

;	BX ← ←argLen
MOV BX,[BP-28]
POP CX
CALL ←apply
POP DX

;	←args ← BX
MOV [BP-24],BX

;   return (MarshallFormatted(dSpecs->resSpecs, pkt, 0, args));

;	BX ← ←dSpecs
MOV BX,[BP-30]
MOV CX,[BX+4]
PUSH CX

;	BX ← ←pkt
MOV BX,[BP+6]
PUSH BX
;&←args
LEA BX,[BP-24]
XOR CX,CX
CALL ←MarshallFormatted
ADD SP,4
MOV SP,BP
POP BP
RET;

;   };

; int *GetDispatcherArgs()
←GetDispatcherArgs:
 CALL StkChk
PUSH BP
MOV BP,SP

;   {

;   int *f[];
PUSH DX

;   f = CallersFrame /* to apply frame */

;     (CallersFrame /* to interface procedure */

;       (MyFrame /* to GetDispatchersArgs frame */ ()));
CALL ←MyFrame
CALL ←CallersFrame
CALL ←CallersFrame

;	←f ← BX
POP DX
PUSH BX

;   return (f[2]);

;	BX ← ←f
POP BX
PUSH BX
MOV CX,[BX+4]
MOV BX,CX
MOV SP,BP
POP BP
RET;

;   };

; int *GetServerConversation()
←GetServerConversation:
 CALL StkChk
PUSH BP
MOV BP,SP

;   {

;   int *f[];
PUSH DX

;   f = CallersFrame /* to StdDispatcher's frame */

;     (CallersFrame /* to apply frame */

;       (CallersFrame /* to interface procedure */

;         (MyFrame /* to GetDispatchersArgs frame */ ())));
CALL ←MyFrame
CALL ←CallersFrame
CALL ←CallersFrame
CALL ←CallersFrame

;	←f ← BX
POP DX
PUSH BX

;   return (f[-1]);

;	BX ← ←f
POP BX
PUSH BX
MOV CX,[BX-2]
MOV BX,CX
MOV SP,BP
POP BP
RET;

;   };

; Externals Declared Here
PUBLIC ←dBlock
PUBLIC ←MarshallFormatted
PUBLIC ←UnmarshallFormatted
PUBLIC ←CallFormatted
PUBLIC ←FreeSpecs
PUBLIC ←StartDispatcherSpecs
PUBLIC ←AddType
PUBLIC ←AddToDispatcherSpecs
PUBLIC ←StdDispatcher
PUBLIC ←GetDispatcherArgs
PUBLIC ←GetServerConversation

C←CODE ENDS

; Number of Bytes of Code = 081EX, (2078)