-- Test2764.mesa -- Last Edit: Stewart, October 8, 1982 9:54 pm -- Last Edit: Stewart, December 6, 1982 4:07 pm, Cedar 3.5 DIRECTORY FileIO, Inline USING [BITAND, BITSHIFT, HighByte, LowByte, LowHalf], IO, Rope USING [Cat, Fetch, Length, ROPE], Transaction, UserExec USING [RegisterCommand, CommandProc]; LarkPromsImpl: PROGRAM IMPORTS FileIO, Inline, IO, Rope, UserExec = BEGIN Bit: TYPE = BOOL; PromAddress: TYPE = MACHINE DEPENDENT RECORD [ pad (0: 0..2): [0..7B], adr (0: 3..15): [0..17777B] ]; PromData: TYPE = MACHINE DEPENDENT RECORD [ data (0: 0..7): [0..377B], pad (0: 8..15): [0..377B] ]; PromProc: TYPE = PROC [in: CARDINAL] RETURNS [out: CARDINAL]; IncrementLowProm: PromProc = { address: PromAddress = LOOPHOLE[in]; data: PromData; data.pad ← 0; -- PROM logic goes here data.data ← Inline.BITAND[address.adr, 377B]; out ← LOOPHOLE[data, CARDINAL]; }; IncrementHighProm: PromProc = { address: PromAddress = LOOPHOLE[in]; data: PromData; data.pad ← 0; -- PROM logic goes here data.data ← Inline.BITSHIFT[address.adr, -5]; out ← LOOPHOLE[data, CARDINAL]; }; OByte: PROC [s: IO.Handle, x: CARDINAL] = INLINE { s.PutChar[LOOPHOLE[x]]; }; OWord: PROC [s: IO.Handle, x: CARDINAL] = INLINE { s.PutChar[LOOPHOLE[Inline.HighByte[x]]]; s.PutChar[LOOPHOLE[Inline.LowByte[x]]]; }; MakeMBFile: PROC [name: Rope.ROPE, size: CARDINAL, width: CARDINAL, proc: PromProc] = { filename: Rope.ROPE ← Rope.Cat[name, ".mb"]; s: IO.STREAM ← FileIO.Open[filename, FileIO.AccessOptions[overwrite]]; namelength: INT ← name.Length[]; OWord[s, 4]; -- boilerplate OWord[s, 1]; -- memorynumber OWord[s, width]; -- memorywidth in bits FOR i: INT IN [0..namelength) DO OByte[s, name.Fetch[i]-0C]; ENDLOOP; OByte[s, 0]; -- ASCIZ end of string -- pad to word boundary IF Inline.BITAND[Inline.LowHalf[namelength], 1] = 0 THEN OByte[s, 0]; OWord[s, 2]; -- set current memory and location OWord[s, 1]; -- memorynumber again OWord[s, 0]; -- location FOR i: CARDINAL IN [0..size) DO OWord[s, 1]; -- memory data word OWord[s, 0]; -- source line number (not used) OWord[s, proc[i]]; -- left justified ENDLOOP; OWord[s, 0]; -- end of file s.Close[]; }; Main: UserExec.CommandProc = TRUSTED { MakeMBFile["IncLow", 8192, 8, IncrementLowProm]; MakeMBFile["IncHigh", 8192, 8, IncrementHighProm]; }; -- Mainline Code UserExec.RegisterCommand["Test2764.~", Main, "Create .mb files for testing 2764"]; END. March 21, 1982 6:12 pm, Stewart, created