201 lines
6.1 KiB
Plaintext
201 lines
6.1 KiB
Plaintext
|
DEFINITION MODULE System;
|
|||
|
(*
|
|||
|
Additional system-dependent facilities
|
|||
|
|
|||
|
|
|||
|
Derived from the Lilith Modula-2 system developed by the
|
|||
|
group of Prof. N. Wirth at ETH Zurich, Switzerland.
|
|||
|
|
|||
|
|
|||
|
This module may be seen as an extension of the standard
|
|||
|
pseudo-module SYSTEM.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
FROM SYSTEM IMPORT ADDRESS, PROCESS;
|
|||
|
|
|||
|
EXPORT QUALIFIED
|
|||
|
EOL,
|
|||
|
Status, Terminate,
|
|||
|
ProcessDescriptor, ProcessPtr, curProcess,
|
|||
|
targetSystem,
|
|||
|
SetTime, GetTime, Time,
|
|||
|
TermProcedure, CallTermProc, InitProcedure, CallInitProc,
|
|||
|
RTSCall,
|
|||
|
RegAX, RegBX,
|
|||
|
RegCX, RegDX,
|
|||
|
RegSI, RegDI,
|
|||
|
RegES, RegDS,
|
|||
|
RegCS, RegSS,
|
|||
|
RegBP, RegSP;
|
|||
|
|
|||
|
|
|||
|
CONST
|
|||
|
EOL = 36C;
|
|||
|
(* This constant defines the internal name of the
|
|||
|
End-Of-Line character. Using this constant has the
|
|||
|
advantage, that only one character is used to
|
|||
|
specify line ends (as opposed to CR/LF).
|
|||
|
The standard I/O modules interpret this character
|
|||
|
and transform it into the End-Of-Line (sequence of)
|
|||
|
code(s) required by the device they support. See
|
|||
|
definition modules of 'Terminal' and 'FileSystem'.
|
|||
|
*)
|
|||
|
|
|||
|
TYPE
|
|||
|
Status = (normal, warned,
|
|||
|
(* no dump produced for these two cases *)
|
|||
|
stopped, asserted, halted,
|
|||
|
caseerr, stackovf, heapovf,
|
|||
|
functionerr, addressoverflow, realoverflow,
|
|||
|
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, SP, BP, SI, DI : CARDINAL;
|
|||
|
DS, SS, ES, CS, IP : CARDINAL;
|
|||
|
flags : BITSET;
|
|||
|
status : Status;
|
|||
|
programId, auxId, sharedId : CARDINAL;
|
|||
|
fatherProcess : PROCESS;
|
|||
|
stackLimit : CARDINAL;
|
|||
|
interruptMask : BITSET;
|
|||
|
retStack : CARDINAL;
|
|||
|
progEndStack : ADDRESS;
|
|||
|
intVector : CARDINAL;
|
|||
|
oldISR, interruptedProcess : ADDRESS;
|
|||
|
heapBase, heapTop : ADDRESS;
|
|||
|
modTable : ADDRESS;
|
|||
|
END;
|
|||
|
|
|||
|
|
|||
|
TYPE
|
|||
|
ProcessPtr = POINTER TO ProcessDescriptor;
|
|||
|
|
|||
|
|
|||
|
VAR
|
|||
|
curProcess: ProcessPtr;
|
|||
|
(* Points at any moment to the current process's workspace.
|
|||
|
This variable is 'read-only' and must not be used in
|
|||
|
application programs.
|
|||
|
WARNING: improper use of this variable may cause unpredictable
|
|||
|
======= behaviour of the system.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
CONST
|
|||
|
targetSystem = 0; (* first implementation *)
|
|||
|
(* May be used to check compatibility of file or programs with the
|
|||
|
present system.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
TYPE Time = RECORD day, minute, millisec: CARDINAL; END;
|
|||
|
(* 'day' is : Bits 0..4 = day of month (1..31),
|
|||
|
Bits 5..8 = month of the year (1..12),
|
|||
|
Bits 9..15 = year - 1900.
|
|||
|
'minute' is hour * 60 + minutes.
|
|||
|
'millisec' is second * 1000 + milliseconds,
|
|||
|
starting with 0 at every minute.
|
|||
|
*)
|
|||
|
|
|||
|
PROCEDURE GetTime (VAR curTime: Time);
|
|||
|
(*- Return the current date and time.
|
|||
|
out: curTime record containing date and time.
|
|||
|
|
|||
|
On systems which do not keep date or time, 'GetTime'
|
|||
|
returns a pseudo-random number.
|
|||
|
*)
|
|||
|
|
|||
|
PROCEDURE SetTime (curTime: Time);
|
|||
|
(*- Set the current date and time.
|
|||
|
in: curTime record containing date and time.
|
|||
|
|
|||
|
On systems which do not keep date or time, this call has no effect.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
|
|||
|
PROCEDURE TermProcedure (p: PROC);
|
|||
|
(*- Declare a termination routine.
|
|||
|
in: p termination procedure.
|
|||
|
|
|||
|
The procedure 'p' will be called upon termination of the current
|
|||
|
program 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
|
|||
|
RTSCall = 228;
|
|||
|
(* Interrupt vector for general entry of RTS (for
|
|||
|
Run-Time Support). The RTS is a resident assembly
|
|||
|
program, providing the basic support for running
|
|||
|
Modula-2 programs.
|
|||
|
*)
|
|||
|
|
|||
|
CONST
|
|||
|
(* Define the processor's registers, which may be
|
|||
|
used as parameters for the standard procedures
|
|||
|
SETREG and GETREG (except that SP, BP, CS, SS
|
|||
|
may not be used with SETREG).
|
|||
|
*)
|
|||
|
RegAX = 0; RegCX = 1;
|
|||
|
RegDX = 2; RegBX = 3;
|
|||
|
RegSP = 4; RegBP = 5;
|
|||
|
RegSI = 6; RegDI = 7;
|
|||
|
RegES = 8; RegCS = 9;
|
|||
|
RegSS = 10; RegDS = 11;
|
|||
|
|
|||
|
END System.
|
|||
|
|