<> <> <> <> <> <> <> <<>> <<>> DIRECTORY Convert USING [RopeFromTime], FS USING [StreamOpen], IO USING [Close, PutChar, PutRope, STREAM], Loader USING [BCDBuildTime], Rope USING [Cat, Length, ROPE]; MakeScannerProms: CEDAR PROGRAM IMPORTS Convert, FS, IO, Loader, Rope = BEGIN ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; mb: STREAM _ NIL; memory: CARDINAL _ 0; Bit: TYPE = BOOLEAN; clearOut: CARDINAL ~ 65135; minITime: CARDINAL ~ 63336; maxITime: CARDINAL ~ 40000; IntegrationTime: PROC = BEGIN addr: RECORD [ blank: [0..37B], -- 5 bits of waste. region: [0 .. 7B], -- 3 bits of selects clearOut: Bit, -- force clear out time iTime: [0 .. 77B], -- 6 bits of iTime highByte: Bit ]; -- low/high output: CARDINAL; inc: CARDINAL _ (minITime - maxITime)/ 64; StartNewMemory["ITime", 8]; FOR i: CARDINAL IN [0 .. 2048) DO TRUSTED { addr _ LOOPHOLE[i]; }; IF NOT addr.highByte THEN LOOP; output _ clearOut; SELECT addr.region FROM 0 => BEGIN IF NOT addr.clearOut THEN output _ minITime - (inc * addr.iTime); END; ENDCASE => NULL; PutWord[1]; -- Memory contents PutWord[0]; -- Source line number PutLowByte[output]; PutWord[1]; -- Memory contents PutWord[0]; -- Source line number PutHighByte[output]; ENDLOOP; END; PutTimeStamp: PROC [name: ROPE] = BEGIN PutWord[4]; -- Define (fake) Memory memory _ memory + 1; PutWord[memory]; PutWord[8]; name _ Rope.Cat[name, " of ", Convert.RopeFromTime[Loader.BCDBuildTime[DoIt]]]; PutRope[name]; END; StartNewMemory: PROC [name: ROPE, bitsPerWord: CARDINAL] = BEGIN PutWord[4]; -- Define Memory memory _ memory + 1; PutWord[memory]; PutWord[bitsPerWord]; PutRope[name]; PutWord[2]; -- Set Current Memory PutWord[memory]; PutWord[0]; -- Current PC END; PutRope: PROC [rope: ROPE] = BEGIN IO.PutRope[mb, rope]; PutByte[0]; -- End of string IF (rope.Length[] MOD 2) = 0 THEN PutByte[0]; -- Round up to word END; PutWord: PROC [data: CARDINAL] = TRUSTED BEGIN IO.PutChar[mb, LOOPHOLE[data/256, CHAR]]; IO.PutChar[mb, LOOPHOLE[data, CHAR]]; END; PutBytePair: PROC [data: CARDINAL] = BEGIN PutLowByte[data]; PutHighByte[data]; END; PutHighByte: PROC [data: CARDINAL] = TRUSTED BEGIN md: MACHINE DEPENDENT RECORD [a, b: [0 .. 256)] _ LOOPHOLE [data]; md.b _ 0; PutWord[LOOPHOLE[md]]; END; PutLowByte: PROC [data: CARDINAL] = TRUSTED BEGIN md: MACHINE DEPENDENT RECORD [a, b: [0 .. 256)] _ LOOPHOLE [data]; md.a _ md.b; md.b _ 0; PutWord[LOOPHOLE[md]]; END; PutByte: PROC [data: CARDINAL] = TRUSTED BEGIN IO.PutChar[mb, LOOPHOLE[data, CHAR]]; END; DoIt: PROCEDURE = BEGIN mb _ FS.StreamOpen["ScannerProms.mb", $create]; PutTimeStamp["ScannerProms.mb"]; IntegrationTime[]; PutWord[0]; -- End of data marker IO.Close[mb]; mb _ NIL; END; DoIt[]; END.