MBLoadmap.mesa
Edited by Sandman on 6-Aug-81 15:46:18
Edited by Lewis on 23-Sep-81 10:53:56
Exited by Levin on April 5, 1983 3:06 pm
DIRECTORY
Format USING [NumberFormat],
LongString USING [
AppendLongNumber, AppendNumber, AppendString, EquivalentSubStrings, SubStringDescriptor],
MB USING [Handle, MakeBootVersion],
MBOut USING [CR, SP, Spaces, Tab, Text, Time],
Segments USING [FHandle, NameForFile],
Streams USING [Destroy, NewStream, Handle, PutChar, Write],
Time USING [Append, Unpack];
MBLoadmap: PROGRAM
IMPORTS MB, MBOut, Segments, Streams, String: LongString, time: Time
EXPORTS MB, MBOut =
BEGIN
data: MB.Handle ← NIL;
loadmap: Streams.Handle ← NIL;
InitLoadmap: PUBLIC PROC [h: MB.Handle] = {data ← h};
FinishLoadmap: PUBLIC PROC = {
IF loadmap # NIL THEN {Streams.Destroy[loadmap]; loadmap ← NIL};
data ← NIL;
};
OpenLoadmap: PUBLIC PROC = {
s: STRING ← [100];
String.AppendString[s, data.loadmap];
loadmap ← Streams.NewStream[s, Streams.Write];
MBOut.Text[data.loadmap]; MBOut.CR[]; MBOut.CR[];
MBOut.Text["Loadmap for boot file: "L]; MBOut.Text[data.output]; MBOut.Spaces[3];
MBOut.Time[data.buildTime]; MBOut.CR[];
MB.MakeBootVersion[s];
MBOut.Text["Built by: "L]; MBOut.Text[s]; MBOut.CR[];
MBOut.CR[];
};
Char: PUBLIC PROC [c: CHARACTER] = {Streams.PutChar[loadmap, c]};
Text: PUBLIC PROC [s: LONG STRING, columns: CARDINAL ← 0] = {
i: CARDINAL;
FOR i IN [0..s.length) DO Streams.PutChar[loadmap, s[i]] ENDLOOP;
FOR i IN [s.length..columns) DO MBOut.SP[] ENDLOOP;
};
Line: PUBLIC PROC [s: LONG STRING] = {
FOR i: CARDINAL IN [0..s.length) DO Streams.PutChar[loadmap, s[i]] ENDLOOP;
MBOut.CR[];
};
Spaces: PUBLIC PROC [n: CARDINAL] = {
THROUGH [0..n/8) DO MBOut.Tab[] ENDLOOP;
THROUGH [0..n MOD 8) DO MBOut.SP[] ENDLOOP;
};
Level: PUBLIC PROC [level: CARDINAL] = {
MBOut.CR[];
MBOut.Spaces[level*2];
};
Time: PUBLIC PROC [t: LONG CARDINAL] = {
s: STRING ← [20];
time.Append[s, time.Unpack[LOOPHOLE[t]]];
Text[s];
};
FileName: PUBLIC PROC [f: Segments.FHandle] = {
name: STRING ← [40];
nss: String.SubStringDescriptor ← [base: name, offset: , length: 4];
bcdss: String.SubStringDescriptor ← [base: ".bcd"L, offset: 0, length: 4];
Segments.NameForFile[name, f];
IF name[name.length-1] = '. THEN name.length ← name.length - 1;
IF name.length > 4 THEN {
nss.offset ← name.length - 4;
IF String.EquivalentSubStrings[@nss, @bcdss] THEN name.length ← name.length - 4;
};
Text[name];
};
LongNumber: PUBLIC PROC [val: LONG CARDINAL, format: Format.NumberFormat] = {
neg: BOOLFALSE;
fill: CHARACTER = (IF format.zerofill THEN '0 ELSE ' );
s: STRING ← [20];
i: CARDINAL;
IF LOOPHOLE[val, LONG INTEGER] < 0 AND ~format.unsigned THEN
{val ← -LOOPHOLE[val, LONG INTEGER]; neg ← TRUE};
String.AppendLongNumber[s, val, IF data.hexLoadmap THEN 16 ELSE format.base];
i ← s.length;
IF neg THEN {
i ← i + 1;
IF format.zerofill THEN {Streams.PutChar[loadmap, '-]; neg ← FALSE};
};
THROUGH (i..format.columns] DO Streams.PutChar[loadmap, fill] ENDLOOP;
IF neg THEN Streams.PutChar[loadmap, '-];
Text[s];
};
Number: PUBLIC PROC [val: CARDINAL, format: Format.NumberFormat] = {
neg: BOOLFALSE;
fill: CHARACTER ← (IF format.zerofill THEN '0 ELSE ' );
s: STRING ← [10];
i: CARDINAL;
IF INTEGER[val] < 0 AND ~format.unsigned THEN {val ← -INTEGER[val]; neg ← TRUE};
String.AppendNumber[s, val, IF data.hexLoadmap THEN 16 ELSE format.base];
i ← s.length;
IF neg THEN {
i ← i + 1;
IF format.zerofill THEN {Streams.PutChar[loadmap, '-]; neg ← FALSE};
};
THROUGH (i..format.columns] DO Streams.PutChar[loadmap,fill] ENDLOOP;
IF neg THEN Streams.PutChar[loadmap,'-];
Text[s];
};
Decimal: PUBLIC PROC [val: CARDINAL] = {Number[val, [10,FALSE,FALSE,1]]};
Octal: PUBLIC PROC [val: UNSPECIFIED] = {
Number[val, [8,FALSE,TRUE,1]];
IF ~(val IN [0..7]) THEN Streams.PutChar[loadmap,'B];
};
END.