MODULE BootShell; IMPORT SYSTEM, KernelLog, Machine, Modules, Streams, Commands, Inputs, Strings, Locks; CONST Version = \"A2 Bootshell v1.0"\; LineWidth = 80; TraceHeight = 25; TraceBase = 753664; BufferHeight = 2048; BufferSize = (BufferHeight * LineWidth); TAB = 9X; CR = 0DX; LF = 0AX; SPACE = \" "\; Mode_Insert = 0; Mode_Overwrite = 1; Black = 0; Blue = 1; Green = 2; Cyan = 3; Red = 4; Magenta = 5; Brown = 6; White = 7; Gray = 8; LightBlue = 9; LightGreen = 10; LightCyan = 11; LightRed = 12; LightMagenta = 13; Yellow = 14; BrightWhite = 15; TYPE CommandsString = POINTER TO RECORD prev, next: CommandsString; string: Strings.String; END; CommandHistoryObject = OBJECT VAR first, current: CommandsString; PROCEDURE ^ GetNextCommand(): Strings.String; PROCEDURE ^ GetPreviousCommand(): Strings.String; PROCEDURE ^ AddCommand(string: Strings.String); PROCEDURE ^ & Init*; END CommandHistoryObject; Character = RECORD ch: CHAR; color: SHORTINT; END; Line = ARRAY LineWidth OF Character; TextBuffer = OBJECT VAR defaultColor: SHORTINT; currentColor: SHORTINT; lines: ARRAY BufferHeight OF Line; firstLine, lastLine: LONGINT; firstLineShown: LONGINT; editStartPosition, editEndPosition: LONGINT; cursorPosition: LONGINT; mode: LONGINT; lock: Locks.RecursiveLock; PROCEDURE ^ & Init*; PROCEDURE ^ Clear; PROCEDURE ^ SetColor(foreground, background: SHORTINT); PROCEDURE ^ SetEditStart; PROCEDURE ^ Send(CONST data: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: LONGINT); PROCEDURE ^ String(CONST string: ARRAY OF CHAR); PROCEDURE ^ Char(ch: CHAR); PROCEDURE ^ CheckVisibility; PROCEDURE ^ NextLine; PROCEDURE ^ MoveCharactersToRight; PROCEDURE ^ MoveCharactersToLeft; PROCEDURE ^ CharInternal(ch: CHAR); PROCEDURE ^ DeleteCurrentLine; PROCEDURE ^ GetCurrentLine(): Strings.String; PROCEDURE ^ Home; PROCEDURE ^ End; PROCEDURE ^ Backspace; PROCEDURE ^ Delete; PROCEDURE ^ ScrollUp(nofLines: LONGINT); PROCEDURE ^ ScrollDown(nofLines: LONGINT); PROCEDURE ^ CursorLeft; PROCEDURE ^ CursorRight; PROCEDURE ^ Dump(out: Streams.Writer); END TextBuffer; Shell = OBJECT (Inputs.Sink) VAR textBuffer: TextBuffer; history: CommandHistoryObject; PROCEDURE ^ & Init; PROCEDURE ^ Handle*(VAR msg: Inputs.Message); PROCEDURE ^ CommandHistory(next: BOOLEAN); PROCEDURE ^ Prompt; PROCEDURE ^ Execute; PROCEDURE ^ Quit; END Shell; VAR shell: Shell; PROCEDURE ^ Subtract(position, value, bufferSize: LONGINT): LONGINT; PROCEDURE ^ Add(position, value, bufferSize: LONGINT): LONGINT; PROCEDURE ^ Difference(end, start, bufferSize: LONGINT): LONGINT; PROCEDURE ^ ClearLine(VAR line: Line; from, to: LONGINT; color: SHORTINT); PROCEDURE ^ IsWhitespace(ch: CHAR): BOOLEAN; PROCEDURE ^ Min(a, b: LONGINT): LONGINT; PROCEDURE ^ Invalidate(textBuffer: TextBuffer); PROCEDURE ^ Open*; PROCEDURE ^ Close*; PROCEDURE ^ Dump*(context: Commands.Context); PROCEDURE ^ UpdateCursor(textBuffer: TextBuffer); PROCEDURE ^ Cleanup; PROCEDURE ^ Init; BEGIN END BootShell.