<> <> <> <> DIRECTORY CrRPC, RapunzelP2200V1; RapunzelP2200V1ServerImpl: CEDAR PROGRAM IMPORTS CrRPC, RapunzelP2200V1 ~ { OPEN RapunzelP2200V1; Server: CrRPC.ServerProc ~ { <<[h: Handle, pgm: CARD, pgmVersion: CARDINAL, proc: CARDINAL, beginReturn: BeginReturnProc, beginError: BeginErrorProc, beginReject: BeginRejectProc]>> ENABLE { RapunzelP2200V1.Fault => { -- (0) beginError[h, 0]; CrRPC.PutCARDINAL[h, ORD[code]]; CrRPC.PutCARD[h, address]; GO TO Finished; }; }; IF (pgmVersion # 1) THEN { beginReject[h, CrRPC.noSuchVersion]; CrRPC.PutCARDINAL[h, 1]; --low CrRPC.PutCARDINAL[h, 1]; --high RETURN }; SELECT proc FROM 4 => { -- PokeSeqShort address: CARD; valueSeq: RapunzelP2200V1.SeqShort; address _ CrRPC.GetCARD[h]; { length1: CARDINAL ~ CrRPC.GetCARDINAL[h]; valueSeq _ NEW[RapunzelP2200V1.SeqShortObject[length1]]; FOR i0: CARDINAL IN [0..length1) DO valueSeq.body[i0] _ CrRPC.GetCARDINAL[h]; ENDLOOP; }; [] _ PokeSeqShort[h, address, valueSeq]; beginReturn[h]; }; 6 => { -- PokeLong address: CARD; value: CARD; address _ CrRPC.GetCARD[h]; value _ CrRPC.GetCARD[h]; [] _ PokeLong[h, address, value]; beginReturn[h]; }; 7 => { -- DoCmds cmdSeq: RapunzelP2200V1.SeqCmd; resultSeq: RapunzelP2200V1.SeqResult; { length1: CARDINAL ~ CrRPC.GetCARDINAL[h]; cmdSeq _ NEW[RapunzelP2200V1.SeqCmdObject[length1]]; FOR i0: CARDINAL IN [0..length1) DO TRUSTED { tag2: RapunzelP2200V1.OpCode ~ VAL[CrRPC.GetCARDINAL[h]]; SELECT tag2 FROM peekShort => { x3: RapunzelP2200V1.PeekShortCmd; x3.address _ CrRPC.GetCARD[h]; cmdSeq.body[i0] _ [peekShort[x3]]; }; pokeShort => { x4: RapunzelP2200V1.PokeShortCmd; x4.address _ CrRPC.GetCARD[h]; x4.value _ CrRPC.GetCARDINAL[h]; cmdSeq.body[i0] _ [pokeShort[x4]]; }; ENDCASE; }; ENDLOOP; }; [resultSeq] _ DoCmds[h, cmdSeq]; beginReturn[h]; CrRPC.PutCARDINAL[h, resultSeq.length]; FOR i0: CARDINAL IN [0..resultSeq.length) DO CrRPC.PutCARDINAL[h, ORD[resultSeq.body[i0].type]]; WITH resultSeq.body[i0] SELECT FROM it: peekShort RapunzelP2200V1.Result => { CrRPC.PutCARDINAL[h, it.peekShort.value]; }; it: pokeShort RapunzelP2200V1.Result => { NULL; -- RECORD [] }; ENDCASE; ENDLOOP; }; 5 => { -- PeekLong address: CARD; result: CARD; address _ CrRPC.GetCARD[h]; [result] _ PeekLong[h, address]; beginReturn[h]; CrRPC.PutCARD[h, result]; }; 3 => { -- PeekSeqShort address: CARD; count: CARDINAL; resultSeq: RapunzelP2200V1.SeqShort; address _ CrRPC.GetCARD[h]; count _ CrRPC.GetCARDINAL[h]; [resultSeq] _ PeekSeqShort[h, address, count]; beginReturn[h]; CrRPC.PutCARDINAL[h, resultSeq.length]; FOR i0: CARDINAL IN [0..resultSeq.length) DO CrRPC.PutCARDINAL[h, resultSeq.body[i0]]; ENDLOOP; }; 1 => { -- PeekShort address: CARD; result: CARDINAL; address _ CrRPC.GetCARD[h]; [result] _ PeekShort[h, address]; beginReturn[h]; CrRPC.PutCARDINAL[h, result]; }; 2 => { -- PokeShort address: CARD; value: CARDINAL; address _ CrRPC.GetCARD[h]; value _ CrRPC.GetCARDINAL[h]; [] _ PokeShort[h, address, value]; beginReturn[h]; }; ENDCASE => { beginReject[h, CrRPC.noSuchProcedure]; }; EXITS Finished => { NULL }; }; CrRPC.RegisterServerProc[pgm~2200, serverProc~Server, pgmVersion~1]; CrRPC.EnsureListener[class~$SPP]; }...