232 lines
8.7 KiB
Plaintext
232 lines
8.7 KiB
Plaintext
(******************************************************************************)
|
||
(* *)
|
||
(* MODULA-2 Library *)
|
||
(* *)
|
||
(* LOGITECH SA, CH-1111 Romanel (Switzerland) *)
|
||
(* LOGITECH Inc, Fremont, CA 94555 (USA) *)
|
||
(* *)
|
||
(* Module : RTSMain.DEF, Modula-2 definition for RTSMain interface *)
|
||
(* *)
|
||
(* Release : 3.0 - July 87 *)
|
||
(* *)
|
||
(* Copyright (C) 1987 Logitech, All rights reserved *)
|
||
(* *)
|
||
(* Permission is hereby granted to registered users to use or abstract *)
|
||
(* the following program in the implementation of customized versions. *)
|
||
(* This permission does not include the right to redistribute the *)
|
||
(* source code of this program. *)
|
||
(* *)
|
||
(******************************************************************************)
|
||
(*$A+*)
|
||
DEFINITION MODULE RTSMain;
|
||
|
||
FROM SYSTEM IMPORT ADDRESS, BYTE, PROCESS;
|
||
|
||
EXPORT QUALIFIED
|
||
Status, GetMessage,
|
||
ProcPtr, ProcDescriptor,
|
||
OverlayKey, OverlayName, OverlayPtr, OverlayDescriptor, overlayList,
|
||
RegisterBlock, ProcessDescriptor, ProcedureKind, ActivationBlock,
|
||
PSPAddress, blockList, deviceMask, dyingOverlay,
|
||
Process, ProcessPtr, curProcess, activProcess, errorCode,
|
||
Terminate, InstallTermProc, CallTermProc, InstallInitProc, CallInitProc,
|
||
RTDProc, DebuggerRecord, debuggerRecord, Execute,
|
||
overlayInitProc, overlayTermProc;
|
||
|
||
|
||
(* Type definition above shall imperatively correspond to the structures *)
|
||
(* defined in RTS.INC *)
|
||
|
||
CONST
|
||
CheckValue = 0FA50H;
|
||
|
||
(* ***** Status and program termination ***** *)
|
||
|
||
TYPE
|
||
Status = ( Normal, Warning, Stopped, Fatal,
|
||
Halt, CaseErr, StackOvf, HeapOvf,
|
||
FunctionErr, AdressOverflow, RealOverflow, RealUnderflow,
|
||
BadOperand, CardinalOverflow, IntegerOverflow, RangeErr,
|
||
DivideByZero, CoroutineEnd, CorruptedData, FileStructureErr,
|
||
IllegalInstr, IllErrorCode, TooManyIOProcesses, TermListFull,
|
||
InitListFull, NoCoprocessor87 );
|
||
|
||
VAR
|
||
errorCode : CARDINAL;
|
||
|
||
PROCEDURE Terminate( st : Status );
|
||
(* force the termination of the current overlay with given status *)
|
||
|
||
PROCEDURE GetMessage(status: Status; VAR message: ARRAY OF CHAR);
|
||
(* returns the message corresponding to the given status *)
|
||
|
||
|
||
(* ***** Internal informations ***** *)
|
||
|
||
VAR
|
||
PSPAddress : ADDRESS;
|
||
blockList : ADDRESS;
|
||
|
||
|
||
(* Type for the termination and initialization procedures *)
|
||
|
||
TYPE
|
||
ProcPtr = POINTER TO ProcDescriptor;
|
||
ProcDescriptor = RECORD
|
||
next : ProcPtr;
|
||
termProc : PROC;
|
||
END;
|
||
|
||
TYPE
|
||
Process = POINTER TO ProcessDescriptor;
|
||
ProcessPtr = POINTER TO Process;
|
||
|
||
|
||
|
||
(* ***** SubPrograms and Resident Overlays ***** *)
|
||
|
||
TYPE
|
||
OverlayName = ARRAY [0..39] OF CHAR;
|
||
OverlayKey = ARRAY [0.. 2] OF CARDINAL;
|
||
|
||
OverlayPtr = POINTER TO OverlayDescriptor;
|
||
OverlayDescriptor = RECORD
|
||
overlayKey : OverlayKey;
|
||
overlayName : OverlayName;
|
||
|
||
checkWord : CARDINAL;
|
||
|
||
memoryAddr : ADDRESS;
|
||
memorySize : CARDINAL; (* in paragraphs *)
|
||
codeSegment : CARDINAL;
|
||
|
||
programLevel: CARDINAL;
|
||
termProc : ProcPtr;
|
||
initProc : ProcPtr;
|
||
freeList : ProcPtr;
|
||
|
||
next ,
|
||
prev : OverlayPtr;
|
||
|
||
CASE overlay : CARDINAL OF
|
||
0 : notUsed : ARRAY [0..14] OF CARDINAL;
|
||
| 1,2 : loaderProcess: Process;
|
||
|
||
priorityMask : CARDINAL;
|
||
|
||
SP, SS, BP : CARDINAL;
|
||
overlayStatus: Status;
|
||
|
||
father ,
|
||
parent : OverlayPtr;
|
||
processList : Process;
|
||
resource : ADDRESS;
|
||
END;
|
||
layer : ADDRESS;
|
||
dummy : ARRAY [1..7] OF ADDRESS;
|
||
END(* OverlayDescriptor*);
|
||
|
||
VAR
|
||
overlayList : OverlayPtr;
|
||
|
||
(* ***** Overlay Interface procedures ***** *)
|
||
|
||
VAR
|
||
overlayInitProc : PROC;
|
||
overlayTermProc : PROC;
|
||
|
||
(* ***** Process descriptor ***** *)
|
||
|
||
TYPE
|
||
RegisterBlock = RECORD
|
||
ES : CARDINAL;
|
||
DS : CARDINAL;
|
||
DI : CARDINAL;
|
||
SI : CARDINAL;
|
||
BP : CARDINAL;
|
||
dummy : CARDINAL;
|
||
BX : CARDINAL;
|
||
DX : CARDINAL;
|
||
CX : CARDINAL;
|
||
AX : CARDINAL;
|
||
IP : CARDINAL;
|
||
CS : CARDINAL;
|
||
flag : CARDINAL;
|
||
END;
|
||
|
||
ProcedureKind = (FarProcedure, NearProcedure, NestedProcedure);
|
||
ActivationBlock = RECORD
|
||
dynamicLink: ADDRESS;
|
||
IP : CARDINAL;
|
||
|
||
CASE ProcedureKind OF
|
||
NearProcedure:
|
||
| FarProcedure:
|
||
CS: CARDINAL;
|
||
| NestedProcedure:
|
||
staticLink: ADDRESS
|
||
END;
|
||
END;
|
||
|
||
ProcessDescriptor = RECORD
|
||
topStack : POINTER TO RegisterBlock;
|
||
progStatus : Status; (* alignement mandatory *)
|
||
priorityMask : BITSET;
|
||
programLevel : CARDINAL;
|
||
heapDesc : ADDRESS;
|
||
termOverlay : OverlayPtr;
|
||
checkWord : CARDINAL;
|
||
bottomStack : CARDINAL; (* still used ??? *)
|
||
currOverlay : OverlayPtr;
|
||
interruptDesc : CARDINAL;
|
||
processList : Process;
|
||
dummy : ARRAY [1..3] OF ADDRESS;
|
||
END;
|
||
|
||
|
||
VAR
|
||
curProcess : ProcessPtr; (* always points to activProcess *)
|
||
activProcess : Process; (* points to the ProcessDescriptor *)
|
||
(* of the active PROCESS *)
|
||
|
||
|
||
(* ***** Debugger interface ***** *)
|
||
|
||
TYPE
|
||
RTDProc = PROCEDURE(PROCESS, ADDRESS);
|
||
(* active process and overlay list *)
|
||
|
||
DebuggerRecord = RECORD
|
||
(* The debugger ID is initialized with the CheckValue *)
|
||
(* The RTD initialize it to 0 *)
|
||
debuggerId : CARDINAL;
|
||
beforeInitCode : RTDProc;
|
||
beforeMainCode : RTDProc;
|
||
beforeTermProc : RTDProc;
|
||
beforeExit : RTDProc;
|
||
END;
|
||
|
||
VAR
|
||
debuggerRecord : DebuggerRecord;
|
||
|
||
(* ***** Miscelanous ***** *)
|
||
|
||
VAR
|
||
deviceMask : BITSET;
|
||
dyingOverlay : OverlayPtr;
|
||
|
||
PROCEDURE Execute;
|
||
(* Warning : upon entry, ES:DI is a pointer to the address of the code *)
|
||
(* to execute !!! *)
|
||
|
||
(* ***** Termination procedures ***** *)
|
||
|
||
PROCEDURE InstallTermProc( p : PROC );
|
||
PROCEDURE CallTermProc;
|
||
|
||
PROCEDURE InstallInitProc( p : PROC );
|
||
PROCEDURE CallInitProc;
|
||
|
||
|
||
END RTSMain.
|
||
|