<> <> <> <> DIRECTORY CrRPC, RapunzelP2200V2; RapunzelP2200V2ServerImpl: CEDAR PROGRAM IMPORTS CrRPC, RapunzelP2200V2 ~ { OPEN RapunzelP2200V2; PokeSeqShortCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; valueSeq: SeqShort; { address _ CrRPC.GetCard32[s]; }; { valueSeq _ UProc16[h, s]; }; [] _ PokeSeqShort[h, address, valueSeq]; beginReturn[h]; }; PokeLongCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; value: CARD32; { address _ CrRPC.GetCard32[s]; }; { value _ CrRPC.GetCard32[s]; }; [] _ PokeLong[h, address, value]; beginReturn[h]; }; SetShftAddrsCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { shftA: CARD32; shftB: CARD32; { shftA _ CrRPC.GetCard32[s]; }; { shftB _ CrRPC.GetCard32[s]; }; [] _ SetShftAddrs[h, shftA, shftB]; beginReturn[h]; }; DoCmdsCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { cmdSeq: SeqCmd; resultSeq: SeqResult; { cmdSeq _ UProc17[h, s]; }; [resultSeq] _ DoCmds[h, cmdSeq]; beginReturn[h]; { MProc18[h, s, resultSeq]; }; }; PeekLongCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; result: CARD32; { address _ CrRPC.GetCard32[s]; }; [result] _ PeekLong[h, address]; beginReturn[h]; { CrRPC.PutCard32[s, result]; }; }; PeekSeqShortCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; count: CARD16; resultSeq: SeqShort; { address _ CrRPC.GetCard32[s]; }; { count _ CrRPC.GetCard16[s]; }; [resultSeq] _ PeekSeqShort[h, address, count]; beginReturn[h]; { MProc19[h, s, resultSeq]; }; }; PeekShortCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; result: CARD16; { address _ CrRPC.GetCard32[s]; }; [result] _ PeekShort[h, address]; beginReturn[h]; { CrRPC.PutCard16[s, result]; }; }; PokeShortCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; value: CARD16; { address _ CrRPC.GetCard32[s]; }; { value _ CrRPC.GetCard16[s]; }; [] _ PokeShort[h, address, value]; beginReturn[h]; }; Server: CrRPC.ServerProc ~ { <<[h: Handle, s: STREAM, pgm: CARD32, pgmVersion: CARD16, proc: CARD16, beginReturn: BeginReturnProc, beginError: BeginErrorProc, beginReject: BeginRejectProc]>> ENABLE { RapunzelP2200V2.Fault => { -- (0 ) beginError[h, 0 ]; CrRPC.PutCard16[s, ORD[code]]; CrRPC.PutCard32[s, address]; GOTO Finished; }; }; IF (pgmVersion # 2) THEN { beginReject[h, CrRPC.noSuchVersion]; CrRPC.PutCard16[s, 2]; --low CrRPC.PutCard16[s, 2]; --high RETURN }; SELECT proc FROM 4 => PokeSeqShortCaller[h, s, beginReturn]; 6 => PokeLongCaller[h, s, beginReturn]; 8 => SetShftAddrsCaller[h, s, beginReturn]; 7 => DoCmdsCaller[h, s, beginReturn]; 5 => PeekLongCaller[h, s, beginReturn]; 3 => PeekSeqShortCaller[h, s, beginReturn]; 1 => PeekShortCaller[h, s, beginReturn]; 2 => PokeShortCaller[h, s, beginReturn]; ENDCASE => { beginReject[h, CrRPC.noSuchProcedure]; }; EXITS Finished => { NULL }; }; <> MProc19: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, val: SeqShort] ~ { CrRPC.PutCard16[s, val.length]; FOR i20: CARDINAL IN [0..val.length) DO CrRPC.PutCard16[s, val.body[i20]]; ENDLOOP; }; UProc17: PROC [h: CrRPC.Handle, s: CrRPC.STREAM] RETURNS [res: SeqCmd] ~ { { length22: CARDINAL ~ CrRPC.GetCard16[s]; res _ NEW[SeqCmdObject[length22]]; FOR i21: CARDINAL IN [0..length22) DO res.body[i21] _ UProc23[h, s]; ENDLOOP; }; }; MProc18: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, val: SeqResult] ~ { CrRPC.PutCard16[s, val.length]; FOR i24: CARDINAL IN [0..val.length) DO MProc25[h, s, val.body[i24]]; ENDLOOP; }; UProc16: PROC [h: CrRPC.Handle, s: CrRPC.STREAM] RETURNS [res: SeqShort] ~ { { length27: CARDINAL ~ CrRPC.GetCard16[s]; res _ NEW[SeqShortObject[length27]]; FOR i26: CARDINAL IN [0..length27) DO res.body[i26] _ CrRPC.GetCard16[s]; ENDLOOP; }; }; MProc25: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, val: Result] ~ { CrRPC.PutCard16[s, ORD[val.type]]; WITH val SELECT FROM it: REF ResultObject.peekShort => { CrRPC.PutCard16[s, it^.peekShort.value]; }; it: REF ResultObject.pokeShort => { NULL; -- RECORD [] -- }; it: REF ResultObject.shftRead => { CrRPC.PutCard16[s, it^.shftRead.numRepeats]; }; it: REF ResultObject.shftWrite => { CrRPC.PutCard16[s, it^.shftWrite.numRepeats]; }; it: REF ResultObject.returnLength => { NULL; -- RECORD [] -- }; ENDCASE; }; UProc23: PROC [h: CrRPC.Handle, s: CrRPC.STREAM] RETURNS [res: Cmd] ~ { { tag29: OpCode ~ VAL[CrRPC.GetCard16[s]]; SELECT tag29 FROM peekShort => { temp30: PeekShortCmd; temp30.address _ CrRPC.GetCard32[s]; res _ NEW[CmdObject.peekShort _ [peekShort[temp30]]] }; pokeShort => { temp30: PokeShortCmd; temp30.address _ CrRPC.GetCard32[s]; temp30.value _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.pokeShort _ [pokeShort[temp30]]] }; shftRead => { temp30: ShftReadCmd; temp30.address _ CrRPC.GetCard32[s]; temp30.numRepeats _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.shftRead _ [shftRead[temp30]]] }; shftWrite => { temp30: ShftWriteCmd; temp30.address _ CrRPC.GetCard32[s]; temp30.numRepeats _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.shftWrite _ [shftWrite[temp30]]] }; returnLength => { temp30: ReturnLengthCmd; temp30.returnLength _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.returnLength _ [returnLength[temp30]]] }; ENDCASE => ERROR; }; }; CrRPC.RegisterServerProc[pgm~2200, serverProc~Server, pgmVersion~2]; CrRPC.EnsureListener[class~$SPP]; }...