<> <> <> <> 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: BOOL _ FALSE; 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: BOOL _ FALSE; 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.