-- File: XDUtils.mesa edit by:
-- Bruce October 7, 1980 12:21 PM
-- Johnsson July 18, 1980 11:45 AM
DIRECTORY
Actions USING [],
BcdDefs USING [VersionStamp],
Commands USING [],
CompilerUtil USING [debug, error, parse, TableId],
DebugOps USING [Abort],
DLoadState USING [offset, state],
DOutput USING [Line, Text],
DSymOps USING [],
Event USING [Notify],
ImageDefs USING [ImageVersion],
ImageFormat USING [ImageHeader, VersionID],
Init USING [CommandTab, DebugTab, DIGrammar, FlushCaches, myPlace],
MachineDefs USING [PageNumber, PageSize],
MiscDefs USING [DestroyFakeModule],
NubOps USING [Place],
Profile USING [],
OsStaticDefs USING [OsStatics],
SegmentDefs USING [
LongFileSegmentAddress, DefaultAccess, DeleteFileSegment, FileHandle, FileNameError,
FileSegmentAddress, FileSegmentHandle, MoveFileSegment, NewFile, NewFileSegment,
PageCount, Read, SwapIn, Unlock],
State USING [GetGS, GSHandle, strings],
Storage USING [Pages],
String USING [AppendString],
StringDefs USING [MesaToBcplString],
Table USING [Base, Region],
TajoMisc USING [],
TajoOps USING [LimitAllWindowBoxes],
UserTerminalOps USING [SetBitmapBox],
Window USING [Box];
XDUtils: PROGRAM
IMPORTS
DebugOps, DLoadState, DOutput, Event, ImageDefs, Init, MiscDefs,
SegmentDefs, State, Storage, String, StringDefs, TajoOps, UserTerminalOps
EXPORTS Actions, CompilerUtil, DebugOps, DSymOps, NubOps, Profile, TajoMisc =
BEGIN OPEN CompilerUtil;
bitmap: PUBLIC Window.Box;
data: State.GSHandle ← State.GetGS[];
myVersion: PUBLIC BcdDefs.VersionStamp ← ImageDefs.ImageVersion[];
NonExistentMemoryPage: PUBLIC ERROR [page: MachineDefs.PageNumber] = CODE;
WriteProtected: PUBLIC SIGNAL [page: CARDINAL] = CODE;
WhereAmI: PUBLIC PROCEDURE RETURNS [NubOps.Place] = {RETURN[Init.myPlace]};
Tab: TYPE = RECORD [seg: SegmentDefs.FileSegmentHandle, state: {in, out}];
tables: ARRAY TableId[parse..debug] OF Tab ← ALL[[NIL,out]];
LockTableSegment: PUBLIC PROC [id: TableId] RETURNS [LONG POINTER] =
BEGIN
seg: SegmentDefs.FileSegmentHandle;
IF id ~IN TableId[parse..debug] THEN ERROR;
seg ← IF tables[id].seg = NIL THEN TableSegment[id] ELSE tables[id].seg;
IF tables[id].state = out THEN {
SegmentDefs.SwapIn[seg]; tables[id].seg ← seg; tables[id].state ← in};
RETURN [SegmentDefs.LongFileSegmentAddress[seg]];
END;
TableSegment: PUBLIC PROCEDURE [id: TableId]
RETURNS [seg: SegmentDefs.FileSegmentHandle] =
BEGIN OPEN CompilerUtil, Init;
offset: CARDINAL;
[seg, offset] ← MiscDefs.DestroyFakeModule[SELECT id FROM
parse => LOOPHOLE[DIGrammar],
error => LOOPHOLE[CommandTab],
debug => LOOPHOLE[DebugTab],
ENDCASE => ERROR];
IF offset # 0 THEN ERROR;
RETURN[seg];
END;
UnlockTableSegment: PUBLIC PROC [id: CompilerUtil.TableId] = {
IF id ~IN CompilerUtil.TableId[parse..debug] THEN ERROR;
IF tables[id].state = in THEN {
SegmentDefs.Unlock[tables[id].seg]; tables[id].state ← out}};
SetBitmap: PUBLIC PROCEDURE [box: Window.Box] =
BEGIN
bitmap ← UserTerminalOps.SetBitmapBox[box];
TajoOps.LimitAllWindowBoxes[];
Event.Notify[setDefaults];
END;
SetUserName: PUBLIC PROCEDURE [s: STRING] =
BEGIN OPEN String;
userName: STRING ← State.strings[user];
userName.length ← 0;
AppendString[userName,s];
StringDefs.MesaToBcplString[s: s, t: OsStaticDefs.OsStatics.UserName];
Event.Notify[setDefaults];
END;
SetUserPassword: PUBLIC PROCEDURE [s: STRING] =
BEGIN
password: STRING ← State.strings[password];
password.length ← 0;
String.AppendString[password,s];
StringDefs.MesaToBcplString[s: s, t: OsStaticDefs.OsStatics.UserPassword];
Event.Notify[setDefaults];
END;
ImageError: PROC [name: STRING] = {
DOutput.Text[name]; DOutput.Text[" is an invalid image file!"L];
SIGNAL DebugOps.Abort};
AttachImage: PUBLIC PROCEDURE [file: STRING] = {DoAttach[file, FALSE]};
AttachLoadState: PUBLIC PROCEDURE [file: STRING] = {DoAttach[file, TRUE]};
DoAttach: PROCEDURE [file: STRING, old: BOOLEAN] =
BEGIN OPEN SegmentDefs;
fileHandle: FileHandle;
oldseg, seg: FileSegmentHandle;
ImageRec: TYPE = RECORD [SELECT OVERLAID * FROM
imageFile => [image: ImageFormat.ImageHeader],
runFile => [pad: UNSPECIFIED, page: SegmentDefs.PageCount],
ENDCASE];
pass: {one,two} ← one;
header: POINTER TO ImageRec;
base, pages: CARDINAL;
DLoadState.offset ← 0;
CheckForExtension[file, ".image"L];
fileHandle ← NewFile[file, DefaultAccess !
FileNameError => {ImageError[file]; ERROR}];
seg ← NewFileSegment[fileHandle, 1, 1, Read];
DO
SwapIn[seg];
header ← FileSegmentAddress[seg];
IF header.image.prefix.versionident = ImageFormat.VersionID THEN EXIT;
Unlock[seg];
IF pass = one THEN {
DLoadState.offset ← header.page;
MoveFileSegment[seg, header.page + 1, 1];
pass ← two}
ELSE {DeleteFileSegment[seg]; ImageError[file]};
ENDLOOP;
base ← DLoadState.offset + (IF old THEN header.image.prefix.initialLoadStateBase
ELSE header.image.prefix.loadStateBase);
pages ← header.image.prefix.loadStatePages;
Unlock[seg];
MoveFileSegment[seg, base, pages];
IF (oldseg ← DLoadState.state) # NIL THEN
BEGIN
UNTIL oldseg.lock = 0 DO Unlock[oldseg]; ENDLOOP;
DeleteFileSegment[oldseg];
END;
DLoadState.state ← seg;
data.initBCD ← TRUE;
Init.FlushCaches[newFiles];
RETURN
END;
CheckForExtension: PUBLIC PROC [name, ext: STRING] =
BEGIN
i: CARDINAL;
FOR i IN [0..name.length) DO
IF name[i] = '. THEN RETURN;
ENDLOOP;
String.AppendString[name, ext];
RETURN
END;
TeleDebug: PUBLIC PROC [STRING] = {DOutput.Line["ReMote debugging not implemented!"L]};
SymbolTablePages: CARDINAL = 25;
SymbolTableSize: CARDINAL = SymbolTablePages*MachineDefs.PageSize;
GetRegion: PUBLIC PROCEDURE RETURNS [r: Table.Region] = {
r.origin ← LOOPHOLE[Storage.Pages[SymbolTablePages], Table.Base];
r.size ← SymbolTableSize};
END.