<> <> <> <> DIRECTORY CrRPC, RapunzelP2200V3; RapunzelP2200V3ServerImpl: CEDAR PROGRAM IMPORTS CrRPC, RapunzelP2200V3 ~ { OPEN RapunzelP2200V3; PokeSeqShortCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; valueSeq: SeqShort; { address _ CrRPC.GetCard32[s]; }; { valueSeq _ UProc19[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 _ UProc20[h, s]; }; [resultSeq] _ DoCmds[h, cmdSeq]; beginReturn[h]; { MProc21[h, s, resultSeq]; }; }; PeekSeqLongCaller: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, beginReturn: CrRPC.BeginReturnProc] ~ { address: CARD32; count: CARD16; resultSeq: SeqLong; { address _ CrRPC.GetCard32[s]; }; { count _ CrRPC.GetCard16[s]; }; [resultSeq] _ PeekSeqLong[h, address, count]; beginReturn[h]; { MProc22[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]; { MProc23[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 { RapunzelP2200V3.Fault => { -- (0 ) beginError[h, 0 ]; CrRPC.PutCard16[s, ORD[code]]; CrRPC.PutCard32[s, address]; GOTO Finished; }; }; IF (pgmVersion # 3) THEN { beginReject[h, CrRPC.noSuchVersion]; CrRPC.PutCard16[s, 3]; --low CrRPC.PutCard16[s, 3]; --high RETURN }; SELECT proc FROM 6 => PokeSeqShortCaller[h, s, beginReturn]; 8 => PokeLongCaller[h, s, beginReturn]; 10 => SetShftAddrsCaller[h, s, beginReturn]; 9 => DoCmdsCaller[h, s, beginReturn]; 5 => PeekSeqLongCaller[h, s, beginReturn]; 7 => PeekLongCaller[h, s, beginReturn]; 4 => PeekSeqShortCaller[h, s, beginReturn]; 1 => PeekShortCaller[h, s, beginReturn]; 3 => PokeShortCaller[h, s, beginReturn]; ENDCASE => { beginReject[h, CrRPC.noSuchProcedure]; }; EXITS Finished => { NULL }; }; <> UProc19: PROC [h: CrRPC.Handle, s: CrRPC.STREAM] RETURNS [res: SeqShort] ~ { { length25: CARDINAL ~ CrRPC.GetCard16[s]; res _ NEW[SeqShortObject[length25]]; FOR i24: CARDINAL IN [0..length25) DO res.body[i24] _ CrRPC.GetCard16[s]; ENDLOOP; }; }; MProc23: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, val: SeqShort] ~ { CrRPC.PutCard16[s, val.length]; FOR i26: CARDINAL IN [0..val.length) DO CrRPC.PutCard16[s, val.body[i26]]; ENDLOOP; }; UProc20: PROC [h: CrRPC.Handle, s: CrRPC.STREAM] RETURNS [res: SeqCmd] ~ { { length28: CARDINAL ~ CrRPC.GetCard16[s]; res _ NEW[SeqCmdObject[length28]]; FOR i27: CARDINAL IN [0..length28) DO res.body[i27] _ UProc29[h, s]; ENDLOOP; }; }; UProc29: PROC [h: CrRPC.Handle, s: CrRPC.STREAM] RETURNS [res: Cmd] ~ { { tag30: OpCode ~ VAL[CrRPC.GetCard16[s]]; SELECT tag30 FROM peekShort => { temp31: PeekShortCmd; temp31.address _ CrRPC.GetCard32[s]; res _ NEW[CmdObject.peekShort _ [peekShort[temp31]]] }; pokeShort => { temp31: PokeShortCmd; temp31.address _ CrRPC.GetCard32[s]; temp31.value _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.pokeShort _ [pokeShort[temp31]]] }; pokeLong => { temp31: PokeLongCmd; temp31.address _ CrRPC.GetCard32[s]; temp31.value _ CrRPC.GetCard32[s]; res _ NEW[CmdObject.pokeLong _ [pokeLong[temp31]]] }; shftRead => { temp31: ShftReadCmd; temp31.address _ CrRPC.GetCard32[s]; temp31.numRepeats _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.shftRead _ [shftRead[temp31]]] }; shftWrite => { temp31: ShftWriteCmd; temp31.address _ CrRPC.GetCard32[s]; temp31.numRepeats _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.shftWrite _ [shftWrite[temp31]]] }; returnLength => { temp31: ReturnLengthCmd; temp31.returnLength _ CrRPC.GetCard16[s]; res _ NEW[CmdObject.returnLength _ [returnLength[temp31]]] }; ENDCASE => ERROR; }; }; MProc22: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, val: SeqLong] ~ { CrRPC.PutCard16[s, val.length]; FOR i32: CARDINAL IN [0..val.length) DO CrRPC.PutCard32[s, val.body[i32]]; ENDLOOP; }; MProc21: PROC [h: CrRPC.Handle, s: CrRPC.STREAM, val: SeqResult] ~ { CrRPC.PutCard16[s, val.length]; FOR i33: CARDINAL IN [0..val.length) DO MProc34[h, s, val.body[i33]]; ENDLOOP; }; MProc34: 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.pokeLong => { 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; }; CrRPC.RegisterServerProc[pgm~2200, serverProc~Server, pgmVersion~3]; CrRPC.EnsureListener[class~$SPP]; }...