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.
|
|||
|
|