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

$INCLUDE(8086LIB.D)

$INCLUDE(rpcagent.DEC)

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

; #include <Env.h>

; extern struct ZN *myZone;

; extern int CallFailed;

; extern int ImportFailed;

; extern AddType();

; extern int CallFormatted();

; extern CONT();

; extern dBlock();

; extern ENABLE();

; extern struct ImportInstance *ImportInterface();

; extern struct ShortSTRING *CStringToString();

; static struct ImportInstance *agentInstance;

; static int args[10];

; static struct ShortSTRING *specABN, *specAA, *specW;

; static int zip[2];

;  int /* really Authentication */

; AgentAuthenticate(nonceId, caller, callee, lvAuthenticator)
←AgentAuthenticate:

;    int nonceId, caller, callee, *lvAuthenticator;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;    struct Seal sl;

;    int authentication;

;    if (ENABLE(CallFailed, &CONT, &sl) || (agentInstance==0 && AgentInitialize()==false)) return (0);
ADD SP,0FFFAX
MOV BX,←CallFailed
PUSH BX
;&←sl
LEA BX,[BP-8]
MOV CX,OFFSET ←CONT
CALL ←ENABLE
POP DX
OR BX,BX
JNZ X3
MOV BX,←agentInstance
OR BX,BX
JNZ X4
CALL ←AgentInitialize
OR BX,BX
X4:
JNZ X2
X3:
MOV AL,1
JR X5
X2:
XOR AL,AL
X5:
OR AL,AL
JZ X1
XOR BX,BX
MOV SP,BP
POP BP
RET;
X1:

;   args[0] = nonceId;

;	BX ← ←nonceId
MOV BX,[BP+6]
MOV ←args,BX

;   args[1] = caller;

;	BX ← ←caller
MOV BX,[BP+4]
MOV ←args+2,BX

;   args[2] = callee;

;	BX ← ←callee
MOV BX,[BP-2]
MOV ←args+4,BX

;   authentication = CallFormatted(agentInstance, doAuthenticate, specABN, specAA, args);
MOV BX,←agentInstance
PUSH BX
MOV BX,4
PUSH BX
MOV BX,←specABN
PUSH BX
LEA BX,←args
MOV CX,←specAA
CALL ←CallFormatted
ADD SP,6

;	←authentication ← BX
POP DX
PUSH BX

;   *lvAuthenticator = args[4];

;	BX ← ←lvAuthenticator
MOV BX,[BP-4]
MOV CX,←args+8
MOV [BX],CX

;   return (authentication);

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

;   };

; int /* really ShortSTRING */

; AgentInstanceForInterface(range, type, instance)
←AgentInstanceForInterface:

;   int range, type, instance;
 CALL StkChk
PUSH BP
MOV BP,SP
PUSH CX
PUSH BX

;   {

;   struct Seal sl;

;   if (ENABLE(CallFailed, &CONT, &sl) || (agentInstance==0 && AgentInitialize()==false)) return (0);
ADD SP,0FFFCX
MOV BX,←CallFailed
PUSH BX
;&←sl
LEA BX,[BP-8]
MOV CX,OFFSET ←CONT
CALL ←ENABLE
POP DX
OR BX,BX
JNZ X8
MOV BX,←agentInstance
OR BX,BX
JNZ X9
CALL ←AgentInitialize
OR BX,BX
X9:
JNZ X7
X8:
MOV AL,1
JR X10
X7:
XOR AL,AL
X10:
OR AL,AL
JZ X6
XOR BX,BX
MOV SP,BP
POP BP
RET;
X6:

;   args[0] = range ? range: (int) zip;

;	BX ← ←range
MOV BX,[BP+4]
OR BX,BX
JZ X11

;	BX ← ←range
MOV BX,[BP+4]
JR X12
X11:
LEA BX,←zip
X12:
MOV ←args,BX

;   args[1] = type;

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

;   args[2] = instance;

;	BX ← ←instance
MOV BX,[BP-4]
MOV ←args+4,BX

;   return (swab(CallFormatted(agentInstance, doInstanceForInterface, specABN, specW, args)));
MOV BX,←agentInstance
PUSH BX
MOV BX,5
PUSH BX
MOV BX,←specABN
PUSH BX
LEA BX,←args
MOV CX,←specW
CALL ←CallFormatted
ADD SP,6
CALL ←swab
MOV SP,BP
POP BP
RET;

;   };

; int /*BOOL*/ AgentInitialize()
←AgentInitialize:
 CALL StkChk
PUSH BP
MOV BP,SP

;   {

;   struct InterfaceName interface;

;   struct Seal sl;
ADD SP,0FFF4X

;   Zero(&interface, lenInterfaceName);
MOV BX,4
;&←interface
LEA CX,[BP-8]
CALL ←Zero

;   interface.type = CstringToString("Agent.Lark");
MOV BX,"Agent.Lark"
CALL ←CstringToString

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

;   interface.instance = 0;
MOV WORD PTR [BP-6],0

;   if (ENABLE(ImportFailed, &CONT, &sl)) return false;
MOV BX,←ImportFailed
PUSH BX
;&←sl
LEA BX,[BP-12]
MOV CX,OFFSET ←CONT
CALL ←ENABLE
POP DX
OR BX,BX
JZ X13
XOR BX,BX
MOV SP,BP
POP BP
RET;
X13:

;   agentInstance = ImportInterface(&interface);
;&←interface
LEA BX,[BP-8]
CALL ←ImportInterface
MOV ←agentInstance,BX

;   specABN = CstringToString("DSS");
MOV BX,"DSS"
CALL ←CstringToString
MOV ←specABN,BX

;   specAA = CstringToString("KK");
MOV BX,"KK"
CALL ←CstringToString
MOV ←specAA,BX

;   specW = CstringToString("W");
MOV BX,"W"
CALL ←CstringToString
MOV ←specW,BX

;   AddType('K', dBlock(16, 1, 0, true, false));
MOV BX,010X
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,04BX
CALL ←AddType

;   Block();
CALL ←Block

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

;   };

; Externals Declared Here
PUBLIC ←AgentAuthenticate
PUBLIC ←AgentInitialize
PUBLIC ←AgentInstanceForInterface

C←CODE ENDS

; Number of Bytes of Code = 0179X, (377)