233 lines
6.3 KiB
Plaintext
233 lines
6.3 KiB
Plaintext
(* Version 1.10, Nov 1984 *)
|
||
DEFINITION MODULE System;
|
||
(*
|
||
Additional system-dependent facilities
|
||
|
||
This module may be seen as an extension of the standard
|
||
pseudo-module SYSTEM.
|
||
|
||
Derived from the Lilith Modula-2 system developed by the
|
||
group of Prof. N. Wirth at ETH Zurich, Switzerland.
|
||
*)
|
||
|
||
|
||
FROM SYSTEM IMPORT ADDRESS, PROCESS;
|
||
|
||
EXPORT QUALIFIED
|
||
Status, Terminate,
|
||
ProcessDescriptor, ProcessPtr, curProcess,
|
||
TermProcedure, CallTermProc,
|
||
InitProcedure, CallInitProc,
|
||
|
||
(* The following constants define the processor's
|
||
registers. These constants are exported here for
|
||
reasons of compatibility with older versions and
|
||
they should not be used any more. Instead, the
|
||
corresponding constants (AX, BX, etc) from the
|
||
pseudo-module SYSTEM should be used.
|
||
*)
|
||
RegAX, RegBX, RegCX, RegDX, RegSI, RegDI,
|
||
RegES, RegDS, RegCS, RegSS, RegBP, RegSP;
|
||
|
||
|
||
TYPE
|
||
Status =
|
||
(normal, warned,
|
||
(*
|
||
- considered non-fatal; no dump is produced for
|
||
these two cases
|
||
*)
|
||
stopped, asserted, halted,
|
||
caseerr, stackovf, heapovf,
|
||
functionerr, addressoverflow,
|
||
realoverflow, realunderflow, badoperand,
|
||
cardinaloverflow, integeroverflow,
|
||
rangeerr, dividebyzero,
|
||
coroutineend,
|
||
loaderr, callerr, programnotfound,
|
||
modulenotfound, incompatiblemodule, filestructureerr,
|
||
illegalinstr, RTSfunctionerr,
|
||
interrupterr);
|
||
(*
|
||
- This type defines the possible values for a program's
|
||
status. The meaning of these values can be printed to
|
||
the terminal by means of ProgMessage.WriteStatus .
|
||
*)
|
||
|
||
|
||
PROCEDURE Terminate (st: Status);
|
||
(*
|
||
- Terminate the current (sub) program.
|
||
|
||
in: st terminating status.
|
||
|
||
If the value of 'st' is different from 'normal' or
|
||
'warned', memory is dumped on the disk file MEMORY.PMD,
|
||
which can be used for subsequent debugging. The value of
|
||
'st' will be returned to the caller of the terminating
|
||
program by means of the parameter 'st' of the procedure
|
||
'Program.Call'.
|
||
|
||
This procedure never returns to the caller.
|
||
*)
|
||
|
||
|
||
TYPE
|
||
ProcessDescriptor =
|
||
RECORD
|
||
AX, BX, CX, DX : CARDINAL;
|
||
SP, BP, SI, DI : CARDINAL;
|
||
DS, SS, ES, CS : CARDINAL;
|
||
IP : CARDINAL;
|
||
flags : BITSET;
|
||
(*
|
||
- all the above fileds denote the values of the
|
||
processor's registers for the process
|
||
*)
|
||
status : Status;
|
||
(*- status of the process *)
|
||
programId : CARDINAL;
|
||
(*
|
||
- identifier of the current program, incremented
|
||
for every layer of overlay.
|
||
*)
|
||
auxId : CARDINAL;
|
||
(*- currently not used *)
|
||
sharedId : CARDINAL;
|
||
(*
|
||
- program identifier of the last overlay layer,
|
||
which was called with parameter 'shared' = FALSE
|
||
(see module 'Program').
|
||
*)
|
||
fatherProcess : PROCESS;
|
||
(*
|
||
- process which created this process (by means
|
||
of NEWPROCESS)
|
||
*)
|
||
unused : CARDINAL;
|
||
(*- currently not used *)
|
||
interruptMask : BITSET;
|
||
(*
|
||
- priority mask effective while this process is
|
||
running. The mask register of the interrupt
|
||
controller is set to the logical OR of this
|
||
priority mask and of the device mask kept by
|
||
the Modula-2 system.
|
||
*)
|
||
debugStatus : CARDINAL;
|
||
(*- auxiliary status field used for the debugger *)
|
||
progEndStack : ADDRESS;
|
||
(*
|
||
- value of (SS,SP), used by the system for
|
||
aborting a program.
|
||
*)
|
||
intVector : CARDINAL;
|
||
(*
|
||
- interrupt vector used by this process if it is
|
||
an interrupt service routine.
|
||
*)
|
||
oldISR : ADDRESS;
|
||
(*
|
||
- old value of interrupt vector if process is
|
||
interrupt service routine.
|
||
*)
|
||
interruptedProcess : ADDRESS;
|
||
(*- used by IOTRANSFER *)
|
||
heapBase : ADDRESS;
|
||
(*
|
||
- address of heap base, with the header of the
|
||
free-list.
|
||
*)
|
||
heapTop : ADDRESS;
|
||
(*
|
||
- address of first free byte after the last
|
||
allocated area on the heap.
|
||
*)
|
||
modTable : ADDRESS;
|
||
(*
|
||
- points to the last element in a list with
|
||
module descriptors.
|
||
*)
|
||
END;
|
||
|
||
|
||
TYPE
|
||
ProcessPtr = POINTER TO POINTER TO ProcessDescriptor;
|
||
|
||
|
||
VAR
|
||
curProcess: ProcessPtr;
|
||
(*
|
||
- Points to a pointer, which in turn points at any
|
||
moment to the workspace of the current process's.
|
||
This variable is 'read-only' and should not be used
|
||
in application programs.
|
||
|
||
WARNING: Improper use of this variable may cause
|
||
unpredictable behaviour of the system.
|
||
*)
|
||
|
||
|
||
PROCEDURE TermProcedure (p: PROC);
|
||
(*
|
||
- Declare a termination routine.
|
||
|
||
in: p termination procedure.
|
||
|
||
The procedure 'p' will be called upon termination of the
|
||
currentprogram or subprogram. Typical use is for drivers,
|
||
which have to release resources used by the terminating
|
||
program. Up to 20 termination routines can be installed.
|
||
*)
|
||
|
||
|
||
PROCEDURE CallTermProc;
|
||
(*
|
||
- Call all termination procedures for the current
|
||
program.
|
||
|
||
Calls all procedures declared with 'TermProcedure' in the
|
||
current program. 'CallTermProc' is automatically called
|
||
at the termination of a program or subprogram.
|
||
*)
|
||
|
||
|
||
PROCEDURE InitProcedure (p: PROC);
|
||
(*
|
||
- Declare an initialization routine.
|
||
|
||
in: p initialization procedure.
|
||
|
||
Analoguous to 'TermProcedure', but for routines that have
|
||
to be called before execution of a program.
|
||
Up to 20 initialization routines can be installed.
|
||
*)
|
||
|
||
|
||
PROCEDURE CallInitProc;
|
||
(*
|
||
- Call all initialization procedures for the current
|
||
program.
|
||
|
||
Analoguous to 'CallTermProc'.
|
||
*)
|
||
|
||
|
||
CONST
|
||
RegAX = 0; RegCX = 1; RegDX = 2; RegBX = 3;
|
||
RegSP = 4; RegBP = 5; RegSI = 6; RegDI = 7;
|
||
RegES = 8; RegCS = 9; RegSS = 10; RegDS = 11;
|
||
(*
|
||
- These constants define the processor's registers.
|
||
They are declared here for reasons of compatibility
|
||
with older versions and they should not be used any
|
||
more. Instead, the corresponding constants (AX, BX,
|
||
etc) from the pseudo-module SYSTEM should be used.
|
||
They may be used as parameters for the standard
|
||
procedures SETREG and GETREG (except that SP, BP,
|
||
CS, SS may not be used with SETREG).
|
||
*)
|
||
|
||
|
||
END System.
|
||
|