-- u255Test.mesa
-- L. Stewart, last updated: September 20, 1979 3:49 PM
DIRECTORY
DisplayDefs: FROM "DisplayDefs",
InlineDefs: FROM "InlineDefs",
IODefs: FROM "IODefs",
RamDefs: FROM "RamDefs",
u255Defs: FROM "u255Defs",
WFDefs: FROM "WFDefs";
u255Test: PROGRAM
IMPORTS DisplayDefs, InlineDefs, IODefs, RamDefs, u255Defs, WFDefs =
BEGIN OPEN InlineDefs, IODefs, u255Defs, WFDefs;
sysDispPages: CARDINAL ← 40;
useUC: BOOLEAN←FALSE;
low: ARRAY [0..177B] OF INTEGER;
out: ARRAY [0..177B] OF INTEGER;
high: ARRAY [0..177B] OF INTEGER;
SetDisplay: PUBLIC PROCEDURE =
BEGIN
WF0["Display Pages? "L];
sysDispPages ← ReadNumber[sysDispPages,10];
WFCR[];
DisplayDefs.SetSystemDisplaySize[sysDispPages,(3*sysDispPages)/2];
END;
EndOfString: PUBLIC PROCEDURE[c: CHARACTER] RETURNS[b: BOOLEAN] =
BEGIN
SELECT c FROM
CR, TAB, LF, SP => b ← TRUE;
ENDCASE => b ← FALSE;
END;
YesOrNo: PUBLIC PROCEDURE[s: STRING] RETURNS[b: BOOLEAN] =
BEGIN
WF1["%s ", s];
SELECT ReadChar[] FROM
’Y, ’y, CR => b ← TRUE;
ENDCASE => b ← FALSE;
WF0[IF b THEN "Yes*n" ELSE "No*n"];
END;
ToggleUC: PROCEDURE =
BEGIN
useUC ← NOT useUC;
WF0["Microcode is "L];
WF0[IF useUC THEN "ON" ELSE "OFF"];
WFCR[];
END;
EC: PROCEDURE[v: INTEGER] RETURNS[INTEGER] =
BEGIN
IF useUC THEN RETURN[Encode[v]]
ELSE RETURN[EncodeMesa[v]];
END;
DC: PROCEDURE[v: INTEGER] RETURNS[INTEGER] =
BEGIN
IF useUC THEN RETURN[Decode[v]]
ELSE RETURN[DecodeMesa[v]];
END;
TestDecode: PROCEDURE =
BEGIN
i, o: INTEGER;
WF0["Decode*n"L];
WF0[" 12 bit is right justified, for convenience.*n"L];
WF0[" input in octal, end with DEL.*n"L];
DO
i ← ReadNumber[i,8 ! Rubout => GOTO Reject];
IF i NOT IN [0..377B] THEN
BEGIN
WriteLine["Value too big."L];
LOOP;
END;
o ← DC[i];
WF2[" input (oct): %3b, output (dec): %6d *n",i, o/16];
ENDLOOP;
EXITS Reject => WFCR[];
END;
TestEncode: PROCEDURE =
BEGIN
i, in, o: INTEGER;
WF0["Encode*n"L];
WF0[" 12 bit is right justified, for convenience.*n"L];
WF0[" input in decimal, end with DEL.*n"L];
DO
i ← ReadNumber[i,10 ! Rubout => GOTO Reject];
IF i NOT IN [-2048..2047] THEN
BEGIN
WriteLine["Value too big."L];
LOOP;
END;
in ← BITSHIFT[i,4]; -- left justify
o ← EC[in];
WF2[" pcm (dec): %6d, u-255 (oct): %3b *n",i, o];
ENDLOOP;
EXITS Reject => WFCR[];
END;
PrintDecodeTable: PROCEDURE =
BEGIN
i, j, k, l: INTEGER;
WF0["Decode Table*n*n "L];
FOR j IN [0..7] DO
WF1["%6d ",j];
ENDLOOP;
WFCR[];
FOR i IN [0..15] DO
WF1["%2b:",i];
FOR j IN [0..7] DO
k ← i+(j*16);
l ← BITSHIFT[DC[k],-4];
WF1["%6d ",l];
ENDLOOP;
WFCR[];
ENDLOOP;
END;
PrintEncodeTable: PROCEDURE =
BEGIN
j, k, l: INTEGER;
WF0["Encode Table*n*n "L];
FOR j IN [0..177B] DO
low[j] ← out[j] ← high[j] ← -1;
ENDLOOP;
l ← 0;
low[0] ← 0;
FOR j IN [0..2047] DO
k ← EC[j*16];
IF k<l THEN EXIT;
out[k] ← DC[k]/16;
IF k>l THEN low[k]←j
ELSE high[l]←j;
l ← k;
ENDLOOP;
WF0["code low out high*n"];
FOR j IN [0..177B] DO
WF4["%5b %4d %4d %4d*n", j, low[j], out[j], high[j]];
ENDLOOP;
END;
LoadMicrocode: PROCEDURE =
BEGIN
s: STRING ← [40];
uc: RamDefs.MuImage;
WF0["Load microcode.*n microcode.br filename? "];
ReadID[s];
uc ← RamDefs.ReadPackedMuFile[s];
IF RamDefs.LoadRamAndBoot[uc, FALSE]#0 THEN WF0[" ...failed.*n"]
ELSE WF0[" ...OK.*n"];
RamDefs.ReleaseMuImage[uc];
END;
u255MainLoop: PUBLIC PROCEDURE =
BEGIN
c: CHARACTER;
DO ENABLE Rubout => CONTINUE;
WF0[">"];
SELECT ReadChar[] FROM
’ => WF0["*n"L];
’. => WF0[".*n"L];
’- =>
BEGIN
WF0["-- "L];
UNTIL (c←ReadChar[])=CR DO WriteChar[c]; ENDLOOP;
WF0["*n"L];
END;
’L, ’l => LoadMicrocode[];
’D, ’d => TestDecode[];
’E, ’e => TestEncode[];
’M, ’m =>
BEGIN
WF0["Miscellaneous "L];
SELECT ReadChar[] FROM
’D, ’d => SetDisplay[];
’? => WF0[" Display.*n"L];
ENDCASE => WF0["???*n"L];
END;
’P, ’p =>
BEGIN
WF0["Print "L];
SELECT ReadChar[] FROM
’D, ’d => PrintDecodeTable[];
’E, ’e => PrintEncodeTable[];
’? => WF0[" Decode Table, Encode Table. *n"L];
ENDCASE => WF0["???*n"L];
END;
’Q, ’q => IF YesOrNo["Quit."L] THEN RETURN[];
’U, ’u => ToggleUC[];
’? => BEGIN
WF0["Decode "];
WF0["Encode "];
WF0["Filter "];
WF0["Load Microcode "];
WF0["Miscillaneous "];
WF0["Print "];
WF0["Quit "];
WF0["u(Toggle ucode) "];
WF0["*n"];
END;
ENDCASE => WF0["???*n"L];
ENDLOOP;
END;
-- Main Line Code
u255MainLoop[];
END.