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

$INCLUDE(8086LIB.D)

$INCLUDE(rpcpktiob.DEC)

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

; #include <Context.h>

; extern EnqueueAgain();

; extern EnqueueBcst();

; extern ServerMain();

; extern struct Queue idlerQ;

; extern struct Queue *myCtxQ;

; extern struct Machine myHost;

; extern BindingInitialize();

; extern SecurityInitialize();

; struct Port {

;   union Machine m;

;   struct Socket s;

;   };

; RPCInitializeCtx(hearBroadcasts)
←RPCInitializeCtx:

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

;   {

;   int i, tmr;

;   struct Port port;

;   struct Machine m;
ADD SP,0FFF4X

;   InitPupLevel1 (myCtxQ, 28, 230); /* for 256 byte ether packets */
MOV BX,←myCtxQ
PUSH BX
MOV BX,0E6X
MOV CX,01CX
CALL ←InitPupLevel1
POP DX

;   for (i = 0; i < 4; i += 1) {
MOV WORD PTR [BP-4],0
X3:

;	BX ← ←i
MOV BX,[BP-4]
CMP BX,4
JGE X2
JR X1
X4:
INC WORD PTR [BP-4]
JR X3
X1:

;     RequestRoute(0);	/* Initialize Routing tables */
XOR BX,BX
CALL ←RequestRoute

;     Dismiss(100); /* Wait for multiple response packets to arrive */
MOV BX,064X
CALL ←Dismiss

;     SetTmr(2000, &tmr);
;&←tmr
LEA BX,[BP-6]
MOV CX,07D0X
CALL ←SetTmr

;     while (!TmrExp(&tmr)) {
X5:
;&←tmr
LEA BX,[BP-6]
CALL ←TmrExp
OR BX,BX
JNZ X6

;       m.w = GetPupHost();
CALL ←GetPupHost

;	←m ← BX
POP DX
PUSH BX

;       if (m.b.net != 0) goto Break2;

;	AL ← ←m
POP AX
PUSH AX
OR AL,AL
JZ X7
JMP ←Break2
X7:

;       Block();
CALL ←Block

;       };
JR X5
X6:

;     };
JR X4
X2:
←Break2:

; Break2:

;   InitCalendar(4);	/* Get time of day set up */
MOV BX,4
CALL ←InitCalendar

;   port.m.w = myHost.w = GetPupHost();
CALL ←GetPupHost
MOV WORD PTR ←myHost,BX

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

;   port.s.ms = port.s.midS = 0;
MOV BYTE PTR [BP-8],0
MOV WORD PTR [BP-10],0

;   port.s.LS = rpcSocket;
MOV BYTE PTR [BP-7],01EX

;   OpenLevel1Socket(&port, &EnqueueAgain, 0);
;&←port
LEA BX,[BP-12]
PUSH BX
XOR BX,BX
MOV CX,OFFSET ←EnqueueAgain
CALL ←OpenLevel1Socket
POP DX

;   port.s.LS = rpcBcstSocket;
MOV BYTE PTR [BP-7],025X

;   if (hearBroadcasts) OpenLevel1Socket(&port, &EnqueueBcst, 0);

;	BX ← ←hearBroadcasts
MOV BX,[BP-2]
OR BX,BX
JZ X8
;&←port
LEA BX,[BP-12]
PUSH BX
XOR BX,BX
MOV CX,OFFSET ←EnqueueBcst
CALL ←OpenLevel1Socket
POP DX
X8:

;   BindingRopes();
CALL ←BindingRopes

;   AgentRopes();
CALL ←AgentRopes

;   BindingInitialize();
CALL ←BindingInitialize

;   SecurityInitialize();
CALL ←SecurityInitialize

;   StreamInitialize();
CALL ←StreamInitialize

;   InitQueue(&idlerQ);
LEA BX,←idlerQ
CALL ←InitQueue

;   for (i = 1; i < 4; i += 1)
MOV WORD PTR [BP-4],1
X11:

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

;     StartNProcess("RPCServer", myCtxQ, &ServerMain, 300, 90);
MOV BX,"RPCServer"
PUSH BX
MOV BX,←myCtxQ
PUSH BX
MOV BX,OFFSET ←ServerMain
PUSH BX
MOV BX,05AX
MOV CX,012CX
CALL ←StartNProcess
ADD SP,6
JR X12
X10:

;   };
MOV SP,BP
POP BP
RET;

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

;   {

;   StreamRestart();   /* forget connection counts */
CALL ←StreamRestart

;   SecurityRestart(); /* invalidate local conversations */
CALL ←SecurityRestart

;   BindingRestart();  /* nothing? */
CALL ←BindingRestart

;   };
MOV SP,BP
POP BP
RET;

; Externals Declared Here
PUBLIC ←RPCInitializeCtx
PUBLIC ←RPCRestart

C←CODE ENDS

; Number of Bytes of Code = 0F7X, (247)