DIRECTORY Commander: TYPE USING [Handle, Register], FileIO: TYPE USING [Open, OpenFailed], IO: TYPE USING [card, char, Close, CR, EndOf, GetChar, GetCard, GetToken, Put, PutChar, PutF, PutRope, rope, STREAM, time, UnsafePutBlock], Rope: TYPE USING [Equal, Fetch, Length, ROPE]; OpDefsGenerator: PROGRAM IMPORTS Commander, FileIO, IO, Rope = { CompStrDesc: TYPE = RECORD[offset, length: CARDINAL]; nChars: CARDINAL; nOpCodes: CARDINAL = 256; OpCode: TYPE = [0..nOpCodes); StringArray: TYPE = ARRAY OpCode OF Rope.ROPE; NumberArray: TYPE = ARRAY OpCode OF CARDINAL; CharArray: TYPE = ARRAY OpCode OF CHAR; name: REF StringArray _ NEW[StringArray _ ALL[NIL]]; push: REF NumberArray _ NEW[NumberArray]; pop: REF NumberArray _ NEW[NumberArray]; len: REF NumberArray _ NEW[NumberArray]; mark: REF CharArray _ NEW[CharArray]; SyntaxError: SIGNAL = CODE; CollectOpData: PROC[in, out: IO.STREAM] = { id: Rope.ROPE; code: CARDINAL; CRcount: CARDINAL _ 0; push^ _ pop^ _ len^ _ ALL[0]; mark^ _ ALL['F]; name^ _ ALL[NIL]; nChars _ 0; UNTIL CRcount = 3 DO IF IO.GetChar[in] = '\n THEN CRcount _ CRcount+1; ENDLOOP; code _ 177777b; THROUGH OpCode DO id _ in.GetToken[]; IF IO.EndOf[in] THEN EXIT; nChars _ nChars + id.Length[]; [] _ in.GetCard[]; -- octal number [] _ in.GetChar[]; -- ( code _ in.GetCard[]; -- decimal number [] _ in.GetChar[]; -- ) name[code] _ id; push[code] _ in.GetCard[]; [] _ in.GetChar[]; -- , pop[code] _ in.GetCard[]; [] _ in.GetChar[]; -- , len[code] _ in.GetCard[]; [] _ in.GetChar[]; -- , mark[code] _ in.GetChar[]; ENDLOOP; FOR i: OpCode IN OpCode DO IF i MOD 4 = 0 THEN { IO.PutF[out, "--%13g%13g%13g%13g ", IO.rope[name[i]], IO.rope[name[i+1]], IO.rope[name[i+2]], IO.rope[name[i+3]]]; IO.PutF[out, " %03b-%03b\n ", IO.card[i], IO.card[i+3]]}; IO.PutF[out, " Q[%b,%b,%b,%g],", IO.card[push[i]], IO.card[pop[i]], IO.card[len[i]], IO.char[mark[i]]]; IF i MOD 4 = 3 THEN { IF i = OpCode.LAST THEN IO.PutRope[out, "];"] ELSE IO.PutChar[out, ',]; IO.PutChar[out, '\n]} ELSE IO.PutChar[out, ',]; ENDLOOP}; OctalDecimalError: SIGNAL [CARDINAL] = CODE; OpNameTooLong: ERROR [CARDINAL] = CODE; OutStrings: PROC[fileName: Rope.ROPE] = { PutWord: PROC [stream: IO.STREAM, word: WORD] = { stream.UnsafePutBlock[[@word, 0, 1]]}; out: IO.STREAM _ FileIO.Open[fileName]; charpos: CARDINAL _ 0; PutWord[out, CARDINAL.SIZE + nOpCodes*(CompStrDesc.SIZE)]; FOR i: OpCode IN OpCode DO j: CARDINAL = name[i].Length[]; PutWord[out, charpos]; PutWord[out, j]; charpos _ charpos + j; ENDLOOP; PutWord[out, nChars]; PutWord[out, nChars]; FOR i: OpCode IN OpCode DO IF name[i] # NIL THEN { FOR j: INT IN [0..name[i].Length[]) DO IO.PutChar[out, name[i].Fetch[j]] ENDLOOP}; ENDLOOP; IO.Close[out]}; OutOpParams: PROC[inName, outName: Rope.ROPE] = { in: IO.STREAM _ FileIO.Open[inName, write]; out: IO.STREAM _ FileIO.Open[outName, write]; IO.PutRope[out, " -- generated by OpDefsGenerator "]; IO.Put[out, IO.time[]]; IO.PutRope[out, " Q: TYPE = PRIVATE RECORD [ push: [0..3], pop: [0..7], length: [0..3], mark: BOOL]; T: BOOL = TRUE; F: BOOL = FALSE; OpParms: PRIVATE ARRAY [0..256) OF Q = [\n"]; CollectOpData[in, out]; IO.Close[in]; IO.Close[out]}; OutMopcodes: PROC[filename, modulename, prefix: Rope.ROPE] = { stream: IO.STREAM _ FileIO.Open[filename, write]; i: OpCode; j: CARDINAL; IO.PutRope[stream, " -- generated by OpDefsGenerator "]; IO.Put[stream, IO.time[]]; IO.PutChar[stream, '\n]; IO.PutRope[stream, modulename]; IO.PutRope[stream, ": DEFINITIONS = { op: TYPE = [0..400B); "]; FOR i IN OpCode DO length: INT _ name[i].Length[]; IF length > 10 THEN OpNameTooLong[i]; IF length # 0 THEN stream.PutF["%11g: op = %3bB;", IO.rope[name[i]], IO.card[i]] ELSE { -- null item, check for rest of line empty FOR j _ i, j+1 DO IF name[j].Length[] # 0 THEN EXIT; IF j MOD 4 = 3 THEN GOTO empty; ENDLOOP; FOR j IN [0..22) DO stream.PutChar[' ]; ENDLOOP; EXITS empty => { blank: BOOL _ j-i=3; -- TRUE iff whole line empty i _ j; IF blank THEN LOOP}}; -- no CR IF (i MOD 4) # 3 THEN stream.PutChar[' ] ELSE stream.PutChar['\n]; ENDLOOP; IO.PutRope[stream, "}.\n"]; IO.Close[stream]}; OutListing: PROC[filename: Rope.ROPE] = { stream: IO.STREAM _ FileIO.Open[filename, write]; stream.PutF["%g; %g\n", IO.rope[filename], IO.time[]]; IO.PutRope[stream, "Format: name octal(decimal)push,pop,count,mark\n\n"]; FOR i: OpCode IN OpCode DO stream.PutF["%-8g%3b(%3d)", IO.rope[name[i]], IO.card[i], IO.card[i]]; stream.PutF["%g,%g,%g,%g;", IO.card[push[i]], IO.card[pop[i]], IO.card[len[i]], IO.char[mark[i]]]; IF i MOD 4 = 3 THEN IO.PutChar[stream, IO.CR] ELSE IO.PutRope[stream, " "]; ENDLOOP; IO.Close[stream]}; GetResponse: PROC[cmd: Commander.Handle, prompt, default: Rope.ROPE] RETURNS[response: Rope.ROPE] = { cmd.out.PutRope[prompt]; IF default # NIL THEN cmd.out.Put[IO.rope[" ("], IO.rope[default], IO.rope[") "]]; response _ cmd.in.GetToken[]; IF response.Length[] = 0 THEN response _ default}; DoCommand: SAFE PROC[cmd: Commander.Handle] = TRUSTED { listfile, modulename, prefix: Rope.ROPE; infile, apoutfile, amoutfile, boutfile: Rope.ROPE; cmd.out.PutRope["\nMesa OpData Generator\n"]; SELECT TRUE FROM Rope.Equal[cmd.command, "Mopdata", FALSE] => { infile _ "OpCodes.txt"; apoutfile _ "OpParams"; amoutfile _ "Mopcodes.mesa"; boutfile _ "OpNames.binary"; listfile _ "Mopcodes.list"; modulename _ "Mopcodes"; prefix _ "z"}; Rope.Equal[cmd.command, "Fopdata", FALSE] => { infile _ "FOpCodes.txt"; apoutfile _ "FOpParams"; amoutfile _ "FOpCodes.mesa"; boutfile _ "FOpNames.binary"; listfile _ "FOpCodes.list"; modulename _ "FOpCodes"; prefix _ "q"}; ENDCASE => ERROR; cmd.out.PutRope["\nType CR to get defaults\n"]; infile _ GetResponse[cmd, "Input file: ", infile]; IF infile.Length[] = 0 THEN GOTO badFile; apoutfile _ GetResponse[cmd, " OpParams file: ", apoutfile]; amoutfile _ GetResponse[cmd, " Mopcodes file: ", amoutfile]; modulename _ GetResponse[cmd, " Module name (capitalize correctly): ", modulename]; prefix _ GetResponse[cmd, " Prefix with: ", prefix]; boutfile _ GetResponse[cmd, " binary file for OpName strings: ", boutfile]; listfile _ GetResponse[cmd, " listing file: ", listfile]; BEGIN ENABLE FileIO.OpenFailed => GOTO badFile; OutOpParams[listfile, apoutfile]; OutStrings[boutfile]; OutMopcodes[amoutfile, modulename, prefix]; OutListing[listfile]; END; EXITS badFile => cmd.out.PutRope["\nError: bad file name.\n"]}; Commander.Register["Mopdata", DoCommand, "Generate Mop codes."]; Commander.Register["Fopdata", DoCommand, "Generate Fop codes."]; }. àOpDefsGenerator.mesa last edited by Johnsson, November 2, 1978 10:22 AM last edited by Satterthwaite, May 10, 1983 12:54 pm Last Edited by: Maxwell, August 8, 1983 8:29 am -- name octal(decimal)push,pop,len,mark; Ê ˜Jšœ™Jšœ3™3Jšœ3™3J™/J™šÏk ˜ Jšœ œœ˜)Jšœœœ˜&Jš œœœœHœ˜‹Jšœœœœ˜.J˜—šœ˜Jšœœ ˜'J˜—Jšœ œœœ˜5J˜Jšœœ˜J˜Jšœ œ˜Jšœœ˜Jš œ œœœœ˜.Jš œ œœœœ˜-Jš œ œœœœ˜'J˜Jš œœœœœ˜4Jšœœœ˜)Jšœœœ˜(Jšœœœ˜(Jšœœ œ ˜%J˜Jšœ œœ˜J˜J˜šÏn œœ œœ˜+Jšœ œ˜Jšœœ˜Jšœ œ˜Jšœœ˜Jšœœ˜Jšœœœ˜J˜J˜ šœ ˜Jšœœœ˜1Jšœ˜—J˜šœ˜Jšœ*™*Jšœ˜Jšœœ œœ˜J˜J˜"J˜JšœÏc˜&J˜Jšœ˜J˜J˜J˜J˜J˜J˜J˜Jšœ˜J˜—šœ œ˜šœœœ˜šœ$˜&Jšœœ˜&Jšœœ˜(—Jšœœ œ ˜<—šœ ˜"Jšœœ˜#Jšœœ˜#—šœœœ˜Jšœ œœœ˜-Jšœœ˜Jšœ˜—Jšœœ˜Jšœ˜ J˜——Jšœœœœ˜,Jšœœœœ˜'J˜šž œœœ˜)š žœœ œœœ˜1Jšœ&˜&—Jšœœœ˜'Jšœ œ˜Jšœ œœœ˜:šœ œ˜Jšœœ˜Jšœ˜Jšœ˜J˜Jšœ˜—Jšœ˜Jšœ˜šœ œ˜šœ œœ˜šœœœ˜&Jšœ œ˜+——Jšœ˜—Jšœ ˜J˜J˜—šž œœœ˜1Jšœœœ˜+Jšœœœ˜-Jšœ4˜6Jšœ œ ˜Jšœ˜J˜šœœœœ˜Jšœ1œ˜7—Jš œœœœœœ˜ J˜Jš œ œœ œœ ˜-J˜Jšœ ˜ Jšœ ˜—J˜J˜šž œœ$œ˜>Jšœœœ ˜1J˜ Jšœœ˜ Jšœ7˜9Jšœ œ ˜Jšœ˜Jšœ˜Jšœ#˜%J˜—Jšœœ ˜J˜˜šœœ˜Jšœœ˜Jšœ œ˜%šœ ˜Jšœ!œœ ˜BšœŸ*˜2šœ ˜Jšœœœ˜"Jšœœœœ˜Jšœ˜——Jšœœ œœ˜0šœ ˜Jšœœ Ÿ˜1JšœœœœŸ˜%——Jšœœœœ˜BJšœ˜—Jšœ˜Jšœ˜J˜—šž œœœ˜)Jšœœœ ˜1Jšœœœ ˜7JšœG˜Išœ œ˜Jšœœœ œ ˜Fšœœœ˜?Jšœœ˜#—Jšœœœœœœœœ˜LJšœ˜—Jšœ˜J˜—šž œœ.œ˜EJšœœ˜ J˜Jš œ œœ œ œœ ˜RJšœ˜Jšœœ˜2J˜—šž œœœœ˜7Jšœ#œ˜(Jšœ-œ˜3Jšœ-˜-šœœ˜šœ#œ˜.Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—šœ#œ˜.Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜Jšœ˜—Jšœœ˜—Jšœœ˜/Jšœ2˜2Jšœœœ ˜)J˜=J˜=J˜WJ˜8J˜LJ˜:J˜Jš˜Jšœœ ˜)J˜"J˜J˜,J˜Jšœ˜J˜Jšœ:˜?J˜J˜—Jšœ@˜@Jšœ@˜@J˜J˜J˜J˜—…—†#