SoftHdwSimImpl.mesa
Barth, March 8, 1989 11:56:01 am PST
DIRECTORY Arpa, ArpaName, PBasics, Rope, SoftHdwSim, SunAuthUnix, SunPMap, SunPMapClient, SunRPC, SunRPCAuth, UserCredentials;
SoftHdwSimImpl: CEDAR PROGRAM
IMPORTS ArpaName, PBasics, SunAuthUnix, SunPMapClient, SunRPC, SunRPCAuth, UserCredentials
EXPORTS SoftHdwSim
= BEGIN OPEN SoftHdwSim;
timeout: CARD = 2000;
retry: CARD = 5;
host: Rope.ROPE ← "cmsun";
program: INT = 555002207;
version : INT = 1;
CREATEBASE: INT = 1;
FETCH: INT = 2;
STORE: INT = 3;
MASTERTOSLAVE: INT = 4;
RELAX: INT = 5;
CreateBase: PUBLIC PROC [sizes: ArrayPosition] RETURNS [array: ArrayBase] = {
addr: Arpa.Address; status: ArpaName.ReplyStatus;
myName, myPassword: Rope.ROPE;
port: CARD ← 0;
[addr, status] ← ArpaName.NameToAddress[host];
IF status#ok THEN ERROR;
array ← NEW[ArrayBaseRec];
array.h ← SunRPC.Create[addr, PBasics.HFromCard16[SunPMap.udpPort]];
[myName, myPassword] ← UserCredentials.Get[];
array.c ← SunRPCAuth.Initiate[SunRPCAuth.nullFlavor, SunAuthUnix.FixNameForUnix[myName], myPassword];
port ← SunPMapClient.GetPort[array.h, array.c, program, version, SunPMap.ipProtocolUDP];
IF port = 0 THEN ERROR;
array.h ← SunRPC.SetRemote[array.h, addr, PBasics.HFromCard16[PBasics.LowHalf[port]]];
SunRPC.StartCall[array.h, array.c, program, version, CREATEBASE];
SendArrayPosition[array.h, sizes];
[] ← SunRPC.SendCallAndReceiveReply[array.h, timeout, retry];
array.id ← SunRPC.GetCard32[array.h];
SunRPC.ReleaseReply[array.h];
};
Fetch: PUBLIC PROC [array: ArrayBase, bit: ArrayPosition] RETURNS [value: BOOL] = {
SunRPC.StartCall[array.h, array.c, program, version, FETCH];
SunRPC.PutCard32[array.h, array.id];
SendArrayPosition[array.h, bit];
[] ← SunRPC.SendCallAndReceiveReply[array.h, timeout, retry];
value ← GetBool[array.h];
SunRPC.ReleaseReply[array.h];
};
Store: PUBLIC PROC [array: ArrayBase, bit: ArrayPosition, value: BOOL] = {
SunRPC.StartCall[array.h, array.c, program, version, STORE];
SunRPC.PutCard32[array.h, array.id];
SendArrayPosition[array.h, bit];
SendBool[array.h, value];
[] ← SunRPC.SendCallAndReceiveReply[array.h, timeout, retry];
[] ← SunRPC.GetCard32[array.h]; -- throw away bogus return value to make RPC work
SunRPC.ReleaseReply[array.h];
};
MasterToSlave: PUBLIC PROC [array: ArrayBase] = {
SunRPC.StartCall[array.h, array.c, program, version, MASTERTOSLAVE];
SunRPC.PutCard32[array.h, array.id];
[] ← SunRPC.SendCallAndReceiveReply[array.h, timeout, retry];
[] ← SunRPC.GetCard32[array.h]; -- throw away bogus return value to make RPC work
SunRPC.ReleaseReply[array.h];
};
Relax: PUBLIC PROC [array: ArrayBase] = {
SunRPC.StartCall[array.h, array.c, program, version, RELAX];
SunRPC.PutCard32[array.h, array.id];
[] ← SunRPC.SendCallAndReceiveReply[array.h, timeout, retry];
[] ← SunRPC.GetCard32[array.h]; -- throw away bogus return value to make RPC work
SunRPC.ReleaseReply[array.h];
};
SendArrayPosition: PROC [h: SunRPC.Handle, position: ArrayPosition] = {
SunRPC.PutCard32[h, ORD[position.type]];
SunRPC.PutCard32[h, ORD[position.orientation]];
SendPosition[h, position.chip];
SendPosition[h, position.minorArray];
SendPosition[h, position.grain];
};
SendPosition: PROC [h: SunRPC.Handle, position: Position] = {
SunRPC.PutInt32[h, position.x];
SunRPC.PutInt32[h, position.y];
};
SendBool: PROC [h: SunRPC.Handle, value: BOOL] = {
SunRPC.PutInt32[h, IF value THEN 1 ELSE 0];
};
GetBool: PROC [h: SunRPC.Handle] RETURNS [value: BOOL] = {
value ← IF SunRPC.GetCard32[h]=0 THEN FALSE ELSE TRUE;
};
END.