home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Gold Fish 2
/
goldfish_vol2_cd1.bin
/
files
/
dev
/
obero
/
oberon-a
/
source
/
oc
/
ocp.mod
< prev
next >
Wrap
Text File
|
1994-08-08
|
41KB
|
1,203 lines
(***************************************************************************
$RCSfile: OCP.mod $
Description: Code selection for standard procedures
Created by: fjc (Frank Copeland)
$Revision: 4.9 $
$Author: fjc $
$Date: 1994/08/03 11:44:38 $
Copyright © 1990-1993, ETH Zuerich
Copyright © 1993-1994, Frank Copeland
This module forms part of the OC program
See OC.doc for conditions of use and distribution
Log entries are at the end of the file.
***************************************************************************)
MODULE OCP;
(*
** $C= CaseChk $I= IndexChk $L+ LongAdr $N= NilChk
** $P- PortableCode $R= RangeChk $S= StackChk $T= TypeChk
** $V= OvflChk $Z= ZeroVars
*)
IMPORT OCG, OCS, OCT, OCC, OCI, OCE, SYS := SYSTEM;
(* --- Local declarations ----------------------------------------------- *)
CONST
(* object modes *)
Var = OCG.Var; VarX = OCG.VarX; VarR = OCG.VarR; Ind = OCG.Ind;
IndX = OCG.IndX; IndR = OCG.IndR; RegI = OCG.RegI; RegX = OCG.RegX;
Lab = OCG.Lab; LabI = OCG.LabI; Con = OCG.Con; Push = OCG.Push;
Pop = OCG.Pop; Coc = OCG.Coc; Reg = OCG.Reg; Fld = OCG.Fld;
Typ = OCG.Typ; Abs = OCG.Abs; XProc = OCG.XProc;
(* structure forms *)
Undef = OCT.Undef; Byte = OCT.Byte; Bool = OCT.Bool; Char = OCT.Char;
SInt = OCT.SInt; Int = OCT.Int; LInt = OCT.LInt; Real = OCT.Real;
LReal = OCT.LReal; Set = OCT.Set; String = OCT.String;
NilTyp = OCT.NilTyp; NoTyp = OCT.NoTyp; Pointer = OCT.Pointer;
ProcTyp = OCT.ProcTyp; Array = OCT.Array; DynArr = OCT.DynArr;
Record = OCT.Record; PtrTyp = OCT.PtrTyp; CPtrTyp = OCT.CPtrTyp;
BPtrTyp = OCT.BPtrTyp; BPointer = OCT.BPointer; CPointer = OCT.CPointer;
BSet = OCT.BSet; WSet = OCT.WSet; Word = OCT.Word;
Longword = OCT.Longword; TagTyp = OCT.TagTyp;
intSet = {SInt, Int, LInt};
realSet = {Real, LReal};
setSet = {BSet, WSet, Set};
ptrSet = {Pointer, CPointer, BPointer, PtrTyp, CPtrTyp, BPtrTyp};
uptrSet = {CPointer, BPointer, CPtrTyp, BPtrTyp};
allSet = {0 .. 31};
adrSet = {LInt, Pointer, PtrTyp, CPointer, CPtrTyp, Longword};
bitOpSet = intSet + setSet + {Byte, Char, Word, Longword};
putSet =
{Undef .. LInt, Word, Longword, ProcTyp} + setSet + ptrSet + realSet;
(* CPU Registers *)
D0 = 0; D1 = 1; D7 = 7; A0 = 8; A1 = 9; A3 = 11; A4 = 12; A5 = 13;
A6 = 14; A7 = 15; BP = A4; FP = A5; SP = A7;
DataRegs = {D0 .. D7};
AdrRegs = {A0 .. A7};
(* Data sizes *)
B = 1; W = 2; L = 4;
(* CONST mname = "OCP"; *)
(* --- Procedure declarations ------------------------------------------- *)
(*------------------------------------*)
PROCEDURE Entier (VAR x : OCT.Item);
(* CONST pname = "Entier"; *)
CONST SPFix = -30;
VAR base, br : OCT.Item; R : SET;
BEGIN (* Entier *)
(* OCG.TraceIn (mname, pname); *)
br.mode := Reg; br.a0 := A6;
base.mode := Lab; base.a0 := OCT.mathBase; base.a1 := 4;
base.symbol := OCT.OberonSysVAR;
OCC.LoadRegParams1 (R, x);
OCC.Move (L, base, br);
br.mode := RegI; br.a1 := SPFix;
OCC.PutF3 (OCC.JSR, br);
OCC.RestoreRegisters (R, x)
(* ;OCG.TraceOut (mname, pname); *)
END Entier;
(*------------------------------------*)
PROCEDURE CheckCleanupProc (VAR x : OCT.Item);
(* CONST pname = "CheckCleanupProc"; *)
VAR par : OCT.Object; typ : OCT.Struct;
BEGIN (* CheckCleanupProc *)
(* OCG.TraceIn (mname, pname); *)
IF (x.mode = XProc) OR (x.typ.form = ProcTyp) THEN
IF x.mode = XProc THEN par := x.obj.link; typ := x.typ
ELSE par := x.typ.link; typ := x.typ.BaseTyp;
END;
IF OCI.IsParam (par) THEN OCS.Mark (117) END;
IF typ # OCT.notyp THEN OCS.Mark (301) END
ELSE
OCS.Mark (300)
END
(* ;OCG.TraceOut (mname, pname); *)
END CheckCleanupProc;
(*------------------------------------*)
PROCEDURE NeedsTag (typ : OCT.Struct) : BOOLEAN;
VAR fld : OCT.Object;
BEGIN (* NeedsTag *)
IF typ.form IN {Pointer, Record} THEN
RETURN TRUE
ELSIF typ.form IN {Array, DynArr} THEN
RETURN NeedsTag (typ.BaseTyp)
(*
ELSIF typ.form = Record THEN
IF (typ.BaseTyp # NIL) & NeedsTag (typ.BaseTyp) THEN RETURN TRUE END;
fld := typ.link;
WHILE fld # NIL DO
IF (fld.name < 0) OR NeedsTag (fld.typ) THEN RETURN TRUE END;
fld := fld.left
END
*)
END;
RETURN FALSE
END NeedsTag;
(*------------------------------------*)
PROCEDURE StPar1 * (VAR x : OCT.Item; fctno : INTEGER; VAR R : SET);
(* CONST pname = "StPar1"; *)
VAR f, f1 : INTEGER; y, z, r0, r1 : OCT.Item;
L0, L1 : INTEGER; size : LONGINT; par : OCT.Object;
typ : OCT.Struct; sym : OCT.Symbol; desc : OCT.Desc;
BEGIN (* StPar1 *)
(* OCG.TraceIn (mname, pname); *)
IF (fctno = OCT.pGC) OR (fctno = OCT.pRC) THEN OCS.Mark (64); RETURN END;
f := x.typ.form; size := x.typ.size;
CASE fctno OF
OCT.pABS :
IF f IN intSet THEN
IF x.mode = Con THEN
x.a0 := ABS (x.a0)
ELSE
OCI.Load (x); (* MOVE.z x,Dn *)
OCC.PutF1 (OCC.TST, size, x); (* TST.z Dn *)
OCC.PutWord (6A02H); (* BPL 1$ *)
OCC.PutF1 (OCC.NEG, size, x) (* NEG.z Dn *)
END
ELSE
OCS.Mark (111)
END
|
OCT.pCAP :
IF (f = String) & (x.a1 <= 2) THEN
x.a0 := x.a2; x.typ := OCT.chartyp; f := Char
END;
IF f = Char THEN
IF x.mode = Con THEN
x.a0 := ORD (CAP (CHR (x.a0)))
ELSE
y.mode := Con; y.typ := OCT.chartyp;
OCI.Load (x); (* MOVE x,Dn *)
y.a0 := ORD ("a");
OCC.PutF6 (OCC.CMPI, B, y, x); (* CMPI "a", Dn *)
OCC.PutWord (6510H); (* BCS 1$ *)
y.a0 := ORD ("z");
OCC.PutF6 (OCC.CMPI, B, y, x); (* CMPI "z", Dn *)
OCC.PutWord (6306H); (* BLS 0$ *)
y.a0 := 0E0H; OCC.PutF6 (OCC.CMPI, B, y, x); (* CMPI 0E0X,Dn *)
OCC.PutWord (6504H); (* BCS 1$ *)
y.a0 := 0DFH; OCC.PutF6 (OCC.ANDI, B, y, x); (* 0$ ANDI 0DFH,Dn *)
END (* 1$ *)
ELSE
OCS.Mark (111); x.typ := OCT.chartyp
END
|
OCT.pCHR :
IF ~(f IN {Undef, Byte, SInt, Int, LInt}) THEN OCS.Mark (111) END;
IF ~(f IN {Byte, SInt}) & (x.mode # Con) THEN OCI.Load (x) END;
x.typ := OCT.chartyp
|
OCT.pENTIER :
IF f IN realSet THEN Entier (x)
ELSE OCS.Mark (111)
END;
x.typ := OCT.linttyp;
|
OCT.pHALT :
IF (f IN intSet) & (x.mode = Con) THEN
y.mode := Lab; y.a0 := OCT.returnCode; y.a1 := 4;
y.symbol := OCT.OberonSysVAR;
OCC.Move (L, x, y);
y.mode := Lab; y.a0 := 0; y.a1 := 4;
y.symbol := OCT.OberonSysCLEANUP;
OCC.PutF3 (OCC.JMP, y);
ELSE
OCS.Mark (17)
END;
x.typ := OCT.notyp
|
OCT.pLONG :
IF (f = String) & (x.a1 <= 2) THEN
x.a0 := x.a2; x.typ := OCT.chartyp; f := Char
END;
IF f = SInt THEN OCE.ConvertInts (x, OCT.inttyp)
ELSIF f = Int THEN OCE.ConvertInts (x, OCT.linttyp)
ELSIF f = BSet THEN
IF OCS.portableCode THEN OCS.Mark (915) END;
IF x.mode # Con THEN
y := x; x.mode := Con; x.a0 := 0; x.typ := OCT.wsettyp;
OCI.Load (x); OCC.Move (B, y, x)
END;
x.typ := OCT.wsettyp
ELSIF f = WSet THEN
IF OCS.portableCode THEN OCS.Mark (915) END;
IF x.mode # Con THEN
y := x; x.mode := Con; x.a0 := 0; x.typ := OCT.settyp;
OCI.Load (x); OCC.Move (W, y, x)
END;
x.typ := OCT.settyp
ELSIF f = Real THEN
x.typ := OCT.lrltyp
ELSIF f = Char THEN
IF x.mode # Con THEN
y := x; x.mode := Con; x.a0 := 0; x.typ := OCT.linttyp;
OCI.Load (x); OCC.Move (B, y, x)
END;
x.typ := OCT.linttyp
ELSE
OCS.Mark (111)
END
|
OCT.pMAX :
IF x.mode = Typ THEN
x.mode := Con;
CASE f OF
Bool : x.a0 := OCG.MaxBool |
Char : x.a0 := OCG.MaxChar |
SInt : x.a0 := OCG.MaxSInt |
Int : x.a0 := OCG.MaxInt |
LInt : x.a0 := OCG.MaxLInt |
Real : x.a0 := SYS.VAL (LONGINT, OCG.MaxReal) |
LReal : x.a0 := SYS.VAL (LONGINT, OCG.MaxLReal) |
BSet : x.a0 := OCG.MaxBSet; x.typ := OCT.inttyp |
WSet : x.a0 := OCG.MaxWSet; x.typ := OCT.inttyp |
Set : x.a0 := OCG.MaxSet; x.typ := OCT.inttyp |
ELSE
OCS.Mark (111)
END; (* CASE f *)
ELSE
OCS.Mark (110)
END
|
OCT.pMIN :
IF x.mode = Typ THEN
x.mode := Con;
CASE f OF
Bool : x.a0 := OCG.MinBool |
Char : x.a0 := OCG.MinChar |
SInt : x.a0 := OCG.MinSInt |
Int : x.a0 := OCG.MinInt |
LInt : x.a0 := OCG.MinLInt |
Real : x.a0 := SYS.VAL (LONGINT, OCG.MinReal) |
LReal : x.a0 := SYS.VAL (LONGINT, OCG.MinLReal) |
BSet, WSet, Set : x.a0 := OCG.MinSet; x.typ := OCT.inttyp |
ELSE
OCS.Mark (111)
END; (* CASE f *)
ELSE
OCS.Mark (110)
END
|
OCT.pNEW :
IF (f IN {Pointer, CPointer, BPointer}) & (x.mode # Con) THEN
IF x.rdOnly THEN OCS.Mark (324) END;
f1 := f; typ := x.typ.BaseTyp; f := typ.form;
r0.mode := Reg; r0.a0 := D0;
IF (f1 = Pointer) & NeedsTag (typ) THEN
IF f = Array THEN
y.mode := Con; y.a0 := typ.size;
OCC.Move (L, y, r0) (* MOVE.L #size,D0 *)
END
ELSE
IF f # DynArr THEN
y.mode := Con; y.a0 := typ.size;
OCC.Move (L, y, r0) (* MOVE.L #size,D0 *)
END
END;
IF f = DynArr THEN
OCI.UnloadDesc (x);
desc := x.desc; IF desc = NIL THEN desc := OCT.AllocDesc() END;
desc.lev := x.lev; desc.mode := x.mode; desc.a0 := x.a0;
desc.a1 := x.a1; desc.a2 := x.a2; x.desc := desc;
END
ELSE OCS.Mark (111)
END
|
OCT.pODD :
IF f IN intSet THEN
y.mode := Con; y.a0 := 0; y.typ := OCT.inttyp;
IF f = SInt THEN OCC.Bit (OCC.BTST, y, x);
ELSE OCI.Load (x); OCC.Bit (OCC.BTST, y, x); OCI.Unload (x)
END;
ELSE
OCS.Mark (111)
END;
OCE.setCC (x, OCC.NE)
|
OCT.pORD :
IF (f = String) & (x.a1 <= 2) THEN
x.a0 := x.a2; x.typ := OCT.chartyp; f := Char
END;
IF (f = Char) OR (f = Byte) THEN
IF x.mode # Con THEN
y := x; x.mode := Con; x.a0 := 0; x.typ := OCT.inttyp;
OCI.Load (x); OCC.Move (B, y, x)
END
ELSE
OCS.Mark (111)
END;
x.typ := OCT.inttyp
|
OCT.pSHORT :
IF f = LInt THEN (* range test missing *)
IF x.mode = Con THEN
OCE.SetIntType (x); IF x.typ.form = LInt THEN OCS.Mark (203) END
ELSE
OCI.Load (x)
END;
x.typ := OCT.inttyp
ELSIF f = Int THEN (* range test missing *)
IF x.mode = Con THEN
OCE.SetIntType (x); IF x.typ.form # SInt THEN OCS.Mark (203) END
ELSE
OCI.Load (x)
END;
x.typ := OCT.sinttyp
ELSIF f = Set THEN (* range test missing *)
IF OCS.portableCode THEN OCS.Mark (915) END;
IF x.mode # Con THEN OCI.Load (x) END;
x.typ := OCT.wsettyp
ELSIF f = WSet THEN (* range test missing *)
IF OCS.portableCode THEN OCS.Mark (915) END;
IF x.mode # Con THEN OCI.Load (x) END;
x.typ := OCT.bsettyp
ELSIF f = LReal THEN
x.typ := OCT.realtyp
ELSE
OCS.Mark (111)
END
|
OCT.pADR :
OCI.Adr (x); x.typ := OCT.cptrtyp
|
OCT.pARGLEN, OCT.pARGS :
IF x.mode >= Con THEN OCS.Mark (122)
ELSIF f = LInt THEN
IF x.rdOnly THEN OCS.Mark (324) END;
y.mode := Lab; y.a1 := 4; y.symbol := OCT.OberonSysVAR;
IF fctno = OCT.pARGLEN THEN y.a0 := OCT.argLen
ELSE y.a0 := OCT.args
END;
OCC.Move (L, y, x)
ELSE
OCS.Mark (111)
END;
x.typ := OCT.notyp
|
OCT.pDISPOSE :
IF f IN ptrSet THEN
IF x.rdOnly THEN OCS.Mark (324) END;
r0.mode := Reg; r0.a0 := D0;
OCC.Move (L, x, r0); (* MOVE.L x,D0 *)
IF f = BPointer THEN
OCC.PutWord (-2F80H); (* ADD.L D0,D0 *)
OCC.PutWord (-2F80H); (* ADD.L D0,D0 *)
END;
z.mode := Lab; z.a0 := 0; z.a1 := 4;
z.symbol := OCT.OberonSysDISPOSE;
OCC.SaveRegisters (R, z, OCC.AllRegs);
OCC.PutF3 (OCC.JSR, z); (* JSR DISPOSE *)
OCC.RestoreRegisters (R, z);
y.mode := Con; y.a0 := 0; y.typ := OCT.niltyp;
OCC.Move (L, y, x) (* MOVE.L #NIL,x *)
ELSE
OCS.Mark (111)
END;
x.typ := OCT.notyp
|
OCT.pSETCLEANUP :
CheckCleanupProc (x); IF x.mode = XProc THEN OCI.Adr (x) END;
y.mode := Reg; y.a0 := D0; OCC.Move (L, x, y);
y.mode := Lab; y.a0 := 0; y.a1 := 4;
y.symbol := OCT.OberonSysSETCLEANUP;
OCC.PutF3 (OCC.JSR, y);
x.typ := OCT.notyp
|
OCT.pSIZE :
IF x.mode = Typ THEN x.a0 := x.typ.size
ELSE OCS.Mark (110); x.a0 := 1
END;
x.mode := Con; OCE.SetIntType (x)
|
OCT.pSTRLEN :
IF ((f = Array) OR (f = DynArr)) & (x.typ.BaseTyp.form = Char) THEN
y := x; OCI.LoadAdr (y); y.mode := Pop; (* LEA <y>,Ay *)
x.mode := Con; x.a0 := 0; x.typ := OCT.linttyp;
OCI.Load (x); (* MOVEQ #0,Dx *)
OCC.PutF1 (OCC.TST, B, y); OCC.FreeReg (y); (* 1$ TST.B (Ay)+ *)
OCC.PutWord (6704H); (* BEQ 2$ *)
OCC.PutF7 (OCC.ADDQ, L, 1, x); (* ADDQ.L #1,Dx *)
OCC.PutWord (60F8H); (* BRA 1$ *)
ELSIF f = String THEN (* 2$ *)
x.mode := Con; x.a0 := x.a1 - 1; x.typ := OCT.linttyp
ELSE
OCS.Mark (111)
END
|
OCT.pASH :
IF f IN intSet THEN
OCI.Load (x); IF f # LInt THEN OCE.ConvertInts (x, OCT.linttyp) END
ELSE
OCS.Mark (111)
END
|
OCT.pASSERT :
IF f = Bool THEN
IF x.mode = Con THEN
IF x.a0 = 0 THEN OCS.Mark (319) ELSE OCS.Mark (320) END;
OCE.setCC (x, OCC.T)
END;
ELSE OCS.Mark (120)
END
|
OCT.pBIND :
IF (x.mode # Typ) THEN
IF
(f = Pointer) & (x.typ.BaseTyp # OCT.undftyp)
& (x.typ.BaseTyp.form # Array)
THEN
OCS.Mark (110)
ELSIF (f # CPointer) (*& (f # BPointer)*) THEN
OCS.Mark (110)
END
END
|
OCT.pCOPY :
IF
~((((f = Array) OR (f = DynArr)) & (x.typ.BaseTyp.form = Char))
OR (f = String))
THEN
OCS.Mark (111)
END
|
OCT.pDEC, OCT.pINC :
IF x.mode >= Con THEN OCS.Mark (112)
ELSIF ~(f IN intSet) THEN OCS.Mark (111)
ELSIF x.rdOnly THEN OCS.Mark (324)
END
|
OCT.pINCL, OCT.pEXCL :
IF x.mode >= Con THEN OCS.Mark (112)
ELSIF ~(f IN setSet) THEN OCS.Mark (111); x.typ := OCT.settyp
ELSIF x.rdOnly THEN OCS.Mark (324)
END
|
OCT.pLEN :
IF (f # DynArr) & (f # Array) THEN OCS.Mark (131) END
|
OCT.pAND, OCT.pOR, OCT.pXOR :
IF ~(f IN bitOpSet) THEN OCS.Mark (111) END
|
OCT.pBIT, OCT.pGET, OCT.pPUT :
IF (f IN intSet) & (x.mode = Con) THEN
x.mode := Abs
ELSIF f IN adrSet THEN
IF x.mode = Var THEN
x.mode := Ind; x.a1 := 0
ELSE
OCC.GetAReg (y); OCC.Move (L, x, y);
x := y; x.mode := RegI; x.a1 := 0
END
ELSE
OCS.Mark (111)
END
|
OCT.pGETREG, OCT.pPUTREG, OCT.pREG :
IF (f IN intSet) & (x.mode = Con) THEN
IF (0 <= x.a0) & (x.a0 <= 15) THEN
x.mode := Reg;
IF fctno = OCT.pREG THEN
OCC.ReserveReg (SHORT (x.a0)); x.typ := OCT.lwordtyp
END
ELSE OCS.Mark (219)
END
ELSE
OCS.Mark (17)
END
|
OCT.pLSH, OCT.pROT :
IF (f = String) & (x.a1 <= 2) THEN
x.a0 := x.a2; x.typ := OCT.chartyp; f := Char
END;
IF f IN bitOpSet THEN OCI.Load (x)
ELSE OCS.Mark (111)
END
|
OCT.pSYSNEW :
IF ~(f IN ptrSet) OR (x.mode = Con) THEN OCS.Mark (111)
ELSIF x.rdOnly THEN OCS.Mark (324)
(* ELSIF NeedsTag (x.typ) THEN OCS.Mark (339) *)
END
|
OCT.pVAL : IF x.mode # Typ THEN OCS.Mark (110) END
|
OCT.pMOVE :
IF (f IN adrSet) THEN
OCC.ReserveReg (A0); r0.mode := Reg; r0.a0 := A0;
OCC.Move (L, x, r0); OCI.Unload (x);
ELSE
OCS.Mark (111)
END
|
OCT.pTAG :
typ := x.typ; IF f = Pointer THEN typ := typ.BaseTyp END;
IF typ.form = Record THEN
IF x.mode = Typ THEN (* Type *)
x.mode := LabI; x.a0 := 0; x.a1 := 4; x.symbol := typ.symbol
ELSIF (x.mode <= RegX) & (f = Pointer) THEN (* Pointer variable *)
OCE.DeRef (x); x.a1 := -4
ELSIF (x.mode = Ind) & (x.obj # NIL) & (x.obj # OCC.wasderef) THEN
(* VAR parameter *)
x.mode := Var; INC (x.a0, 4)
ELSE (* Bzzzzt! *)
OCS.Mark (338)
END
ELSIF f = PtrTyp THEN
IF (x.mode <= RegX) THEN (* Pointer variable *)
IF x.mode = Var THEN
IF OCS.nilCheck THEN
y := x;
OCC.PutF1 (OCC.TST, L, y); (* TST.L x *)
OCC.PutWord (6602H); (* BNE 1$ *)
OCC.PutWord (OCC.TRAP + OCC.NilCheck);(* TRAP #NilCheck *)
OCI.Unload (y) (* 1$ *)
END;
x.mode := Ind
ELSE
y := x; y.typ := OCT.ptrtyp; OCC.GetAReg (x);
IF OCS.nilCheck THEN
OCI.Load (y); (* MOVE.L x,Dn *)
OCC.PutWord (6602H); (* BNE 1$ *)
OCC.PutWord (OCC.TRAP + OCC.NilCheck);
(* TRAP #NilCheck *)
END; (* 1$ *)
OCC.Move (L, y, x); (* MOVEA.L x, An *)
OCI.Unload (y); x.mode := RegI
END;
x.a1 := -4; x.rdOnly := FALSE
ELSE (* Bzzzzt! *)
OCS.Mark (338)
END
ELSE
OCS.Mark (53)
END;
x.typ := OCT.tagtyp; x.rdOnly := FALSE
|
OCT.pSIZETAG :
IF f = TagTyp THEN
OCI.UnloadDesc (x);
IF x.mode = Var THEN
x.mode := Ind
ELSE
y := x; OCC.GetAReg (x); OCC.Move (L, y, x); (* MOVEA.L x, An *)
OCI.Unload (y); x.mode := RegI
END
ELSE
OCS.Mark (111)
END;
x.typ := OCT.linttyp; x.rdOnly := FALSE; x.a1 := 0
|
OCT.pGETNAME :
IF (f # TagTyp) OR (x.mode = Con) THEN
OCS.Mark (111)
END
|
OCT.pNEWTAG :
IF ~(f IN {Pointer, PtrTyp}) OR (x.mode = Con) THEN OCS.Mark (111)
ELSIF x.rdOnly THEN OCS.Mark (324)
END
|
ELSE
OCS.Mark (1014); OCS.Mark (fctno)
END; (* CASE fctno *)
(* ;OCG.TraceOut (mname, pname); *)
END StPar1;
(*------------------------------------*)
PROCEDURE StPar2 * (
VAR par1, par2 : OCT.Item; fctno : INTEGER; VAR R : SET);
(* CONST pname = "StPar2"; *)
VAR f : INTEGER; op, dim : INTEGER; typ, btyp, t1 : OCT.Struct;
freePar2 : BOOLEAN; L0, L1 : INTEGER; x, y, r0, r1 : OCT.Item;
dsc : OCT.Desc;
BEGIN (* StPar2 *)
(* OCG.TraceIn (mname, pname); *)
f := par2.typ.form; freePar2 := FALSE;
IF fctno < OCT.TwoPar THEN OCS.Mark (64); RETURN END;
CASE fctno OF
OCT.pASH, OCT.pLSH, OCT.pROT :
IF
((fctno = OCT.pASH) & (f IN intSet)) OR
((fctno # OCT.pASH) & (f IN bitOpSet))
THEN
IF (par2.mode = Con) & (par2.a0 = 0) THEN RETURN END;
IF fctno = OCT.pASH THEN op := OCC.ASR
ELSIF fctno = OCT.pLSH THEN op := OCC.LSR
ELSE op := OCC.ROR
END;
IF par2.mode = Con THEN
IF par2.a0 < 0 THEN par2.a0 := -par2.a0 ELSE INC (op, 100H) END;
IF par2.a0 > 8 THEN OCI.Load (par2); freePar2 := TRUE END;
OCC.Shift (op, par1.typ.size, par2, par1);
IF freePar2 THEN OCC.FreeReg (par2) END
ELSE
OCI.Load (par2); (* MOVE.L <par2>,Dn *)
OCC.PutF1 (OCC.TST, par2.typ.size, par2);(* TST.? Dn *)
L0 := OCC.pc; OCC.PutWord (6A00H); (* BPL.S 1$ *)
OCC.PutF1 (OCC.NEG, par2.typ.size, par2);(* NEG.? Dn *)
OCC.Shift (op, par1.typ.size, par2, par1);
(* opR.? Dn,<par1> *)
L1 := OCC.pc; OCC.PutWord (6000H); (* BRA.S $2 *)
OCC.PatchWord (L0, OCC.pc - L0 - 2);
OCC.Shift (op+100H, par1.typ.size, par2, par1);
(* 1$ opL.? Dn,<par1> *)
OCC.PatchWord (L1, OCC.pc - L1 - 2); (* 2$ *)
END
ELSE
OCS.Mark (111)
END
|
OCT.pASSERT :
IF (par2.mode = Con) & (f IN intSet) THEN
IF par1.mode # Coc THEN
OCC.PutF1 (OCC.TST, B, par1); (* TST.B <par1> *)
OCI.Unload (par1); L0 := OCC.pc;
OCC.PutWord (OCC.BNE) (* BNE.S 2$ *)
ELSE
op := OCC.Bcc + (SHORT (par1.a0) * 100H);
OCC.PutWord (op);
OCC.PutWord (SHORT (par1.a1)); (* Bcc 2$ *)
L0 := OCC.pc - 2; OCC.FixLink (par1.a2);
END;
x.mode := Lab; x.a0 := OCT.returnCode; x.a1 := 4;
x.symbol := OCT.OberonSysVAR;
OCC.Move (L, par2, x); (* 1$ MOVE.L <par2>,D0 *)
x.mode := Lab; x.a0 := 0; x.a1 := 4;
x.symbol := OCT.OberonSysCLEANUP;
OCC.PutF3 (OCC.JMP, x); (* JMP CLEANUP *)
IF par1.mode # Coc THEN (* 2$ *)
OCC.PatchWord (L0, OCC.pc - L0 - 2)
ELSE OCC.FixLink (L0)
END;
ELSE OCS.Mark (17)
END;
par1.typ := OCT.notyp
|
OCT.pBIND :
typ := par1.typ; btyp := typ.BaseTyp; par1.typ := OCT.cptrtyp;
IF
(btyp = OCT.undftyp) OR (par2.typ = NIL) OR (par2.typ = OCT.undftyp)
THEN
OCS.Mark (111)
ELSIF btyp # par2.typ THEN
IF
(typ.form = CPointer) & (btyp.form = Record)
& (par2.typ.form = Record)
THEN
t1 := par2.typ;
WHILE (t1 # NIL) & (t1 # btyp) DO t1 := t1.BaseTyp END;
IF t1 # btyp THEN OCS.Mark (111) END;
ELSE
OCS.Mark (111)
END
END;
par1 := par2; OCI.Adr (par1); par1.typ := typ;
|
OCT.pDEC, OCT.pINC :
IF par1.typ # par2.typ THEN
IF (par2.mode = Con) & (f IN intSet) THEN par2.typ := par1.typ
ELSIF (par1.typ.form = Int) & (f = SInt) THEN
OCE.ConvertInts (par2, OCT.inttyp)
ELSIF (par1.typ.form = LInt) & (f IN {SInt, Int}) THEN
OCE.ConvertInts (par2, OCT.linttyp)
ELSE OCS.Mark (111)
END
ELSIF par2.mode # Con THEN
OCI.Load (par2)
END;
IF fctno = OCT.pDEC THEN op := OCC.SUB ELSE op := OCC.ADD END;
OCC.PutF5 (op, par1.typ.size, par2, par1);
IF OCS.overflowCheck THEN OCC.PutWord (OCC.TRAPV) END;
par1.typ := OCT.notyp
|
OCT.pEXCL :
OCE.Set0 (x, par2);
IF x.mode = Con THEN
x.a0 := SYS.VAL (LONGINT, allSet - SYS.VAL (SET, x.a0));
OCC.PutF6 (OCC.ANDI, par1.typ.size, x, par1)
ELSE
OCC.PutF1 (OCC.NOT, L, x);
OCC.PutF5 (OCC.AND, par1.typ.size, x, par1)
END;
par1.typ := OCT.notyp
|
OCT.pINCL :
OCE.Set0 (x, par2);
IF x.mode = Con THEN OCC.PutF6 (OCC.ORI, par1.typ.size, x, par1)
ELSE OCC.PutF5 (OCC.iOR, par1.typ.size, x, par1)
END;
par1.typ := OCT.notyp
|
OCT.pLEN :
IF (par2.mode = Con) & (f = SInt) THEN
dim := SHORT (par2.a0); typ := par1.typ;
WHILE (dim > 0) & (typ.form IN {DynArr, Array}) DO
typ := typ.BaseTyp; DEC (dim)
END;
IF (dim # 0) OR ~(typ.form IN {DynArr, Array}) THEN OCS.Mark (132)
ELSE
IF typ.form = DynArr THEN OCI.DescItem (par1, par1.desc, typ.adr)
ELSE par1.mode := Con; par1.a0 := typ.n
END;
par1.typ := OCT.linttyp
END
ELSE
OCS.Mark (111)
END
|
OCT.pAND, OCT.pOR, OCT.pXOR :
IF f IN bitOpSet THEN
IF (par1.mode = Con) & (par2.mode = Con) THEN
IF fctno = OCT.pAND THEN
par1.a0 := SYS.AND (par1.a0, par2.a0)
ELSIF fctno = OCT.pXOR THEN
par1.a0 := SYS.XOR (par1.a0, par2.a0)
ELSE
par1.a0 := SYS.LOR (par1.a0, par2.a0)
END;
IF f IN intSet THEN OCE.SetIntType (par1) END
ELSE
IF fctno = OCT.pAND THEN op := OCC.AND
ELSIF fctno = OCT.pXOR THEN op := OCC.EOR
ELSE op := OCC.iOR
END;
IF par1.mode = Con THEN
IF par1.typ.form # par2.typ.form THEN par1.typ := par2.typ END;
OCI.Load (par2); OCC.PutF5 (op, par2.typ.size, par1, par2);
par1 := par2
ELSIF par2.mode = Con THEN
IF par2.typ.form # par1.typ.form THEN par2.typ := par1.typ END;
OCI.Load (par1); OCC.PutF5 (op, par1.typ.size, par2, par1)
ELSE
IF par1.typ.form = par2.typ.form THEN
OCI.Load (par1); IF op = OCC.EOR THEN OCI.Load (par2) END;
OCC.PutF5 (op, par1.typ.size, par2, par1); OCI.Unload (par2)
ELSE
OCS.Mark (100)
END
END
END
ELSE
OCS.Mark (111)
END
|
OCT.pBIT :
IF f IN intSet THEN
IF (par2.mode = Con) & (par2.a0 >= 8) THEN OCI.Load (par1)
ELSIF (par2.mode # Con) THEN OCI.Load (par1); OCI.Load (par2)
END;
OCC.Bit (OCC.BTST, par2, par1); OCI.Unload (par1); OCI.Unload (par2)
ELSE
OCS.Mark (111)
END;
OCE.setCC (par1, OCC.NE)
|
OCT.pGET, OCT.pGETREG :
IF par2.mode >= Con THEN OCS.Mark (112)
ELSIF ~(f IN realSet) THEN
IF par2.rdOnly THEN OCS.Mark (324) END;
OCC.Move (par2.typ.size, par1, par2)
ELSE OCS.Mark (111)
END;
par1.typ := OCT.notyp
|
OCT.pPUT, OCT.pPUTREG :
IF f IN putSet THEN OCC.Move (par2.typ.size, par2, par1) END;
par1.typ := OCT.notyp
|
OCT.pSYSNEW :
r0.mode := Reg; r0.a0 := D0;
IF par2.mode = Con THEN par2.typ := OCT.linttyp END;
OCC.Move (par2.typ.size, par2, r0); (* MOVE.z <size>,D0 *)
r0.typ := par2.typ;
IF par2.typ.form # LInt THEN OCE.ConvertInts (r0, OCT.linttyp) END;
OCI.Unload (par2); OCC.ReserveReg (D0)
|
OCT.pVAL : par2.typ := par1.typ; par1 := par2
|
OCT.pCOPY :
IF
((f = Array) OR (f = DynArr)) & (par2.typ.BaseTyp.form = Char)
THEN
IF par2.rdOnly THEN OCS.Mark (324) END;
IF f = Array THEN
x.mode := Con; x.a0 := par2.typ.n;
IF (par1.typ.form = String) & (par1.a1 < x.a0) THEN
x.a0 := par1.a1
ELSIF (par1.typ.form = Array) & (par1.typ.n < x.a0) THEN
x.a0 := par1.typ.n
END;
DEC (x.a0); OCE.SetIntType (x)
ELSE
IF (par1.typ.form = String) & (par1.a1 = 1) THEN
x.mode := Con; x.a0 := 0; x.typ := OCT.sinttyp
ELSE OCI.DescItem (x, par2.desc, par2.typ.adr)
END
END;
OCI.CopyString (par1, par2, x)
ELSE
OCS.Mark (111)
END;
par1.typ := OCT.notyp
|
OCT.pMOVE :
IF (f IN adrSet) THEN
OCC.ReserveReg (A1); r0.mode := Reg; r0.a0 := A1;
OCC.Move (L, par2, r0); OCI.Unload (par2)
ELSE
OCS.Mark (111)
END
|
OCT.pGETNAME :
IF
((f = Array) OR (f = DynArr)) & (par2.typ.BaseTyp.form = Char)
THEN
IF par2.rdOnly THEN OCS.Mark (324) END;
IF f = Array THEN
x.mode := Con; x.a0 := par2.typ.n - 1; OCE.SetIntType (x)
ELSE
OCI.DescItem (x, par2.desc, par2.typ.adr)
END;
y := par1; OCC.GetAReg (par1);
OCC.Move (L, y, par1); OCI.Unload (y);
par1.mode := RegI; par1.a1 := 36;
OCC.PutF2 (OCC.LEA, par1, par1.a0);
par1.mode := Pop; par1.a1 := 0; OCC.GetDReg (y);
L0 := OCC.pc; OCC.Move (L, par1, y); OCC.FreeReg (y);
OCC.PutWord (06CFCH); par1.mode := RegI; par1.a1 := 0;
OCI.CopyString (par1, par2, x)
ELSE
OCS.Mark (111)
END;
par1.typ := OCT.notyp
|
OCT.pNEWTAG :
IF (f = TagTyp) & (par2.mode # Con) THEN
r0.mode := Reg; r0.a0 := D0; r1.mode := Reg; r1.a0 := D1;
x.mode := Lab; x.a0 := 0; x.a1 := 4; x.symbol := OCT.OberonSysNEW;
OCC.Move (L, par2, r1); OCI.Unload (par2); (* MOVE.L <tag>,D1 *)
OCC.SaveRegisters (R, x, OCC.AllRegs);
OCC.PutF3 (OCC.JSR, x); (* JSR NEW *)
OCC.RestoreRegisters (R, x);
OCC.Move (L, r0, par1); (* MOVE.L D0,<var> *)
ELSE
OCS.Mark (111)
END;
par1.typ := OCT.notyp
|
ELSE
OCS.Mark (1015); OCS.Mark (fctno)
END; (* CASE fctno *)
(* ;OCG.TraceOut (mname, pname); *)
END StPar2;
(*------------------------------------*)
PROCEDURE StPar3 * (VAR p, x : OCT.Item; fctno : INTEGER; VAR R : SET);
(* CONST pname = "StPar3"; *)
VAR f : INTEGER; r, sproc : OCT.Item;
BEGIN (* StPar3 *)
(* OCG.TraceIn (mname, pname); *)
f := x.typ.form;
IF fctno = OCT.pMOVE THEN
IF f IN intSet THEN
r.mode := Reg; r.a0 := D0;
IF x.mode = Con THEN x.typ := OCT.linttyp END;
OCC.Move (x.typ.size, x, r); r.typ := x.typ;
IF f # LInt THEN OCE.ConvertInts (r, OCT.linttyp) END;
OCI.Unload (x);
OCC.UnReserveReg (A0); OCC.UnReserveReg (A1);
sproc.mode := Lab; sproc.a0 := 0; sproc.a1 := 4;
sproc.symbol := OCT.OberonSysMOVE;
OCC.SaveRegisters (R, sproc, OCC.AllRegs);
OCC.PutF3 (OCC.JSR, sproc);
OCC.RestoreRegisters (R, sproc)
ELSE
OCS.Mark (111)
END;
p.typ := OCT.notyp
ELSIF fctno = OCT.pSYSNEW THEN
IF (f = Set) OR ((x.mode = Con) & (f IN setSet)) THEN
r.mode := Reg; r.a0 := D1; OCC.Move (L, x, r); (* MOVE.L memReq,D1 *)
OCI.Unload (x);
ELSE
OCS.Mark (111)
END
ELSE
OCS.Mark (64)
END
(* ;OCG.TraceOut (mname, pname); *)
END StPar3;
(*------------------------------------*)
PROCEDURE StFct * (VAR p : OCT.Item; fctno, parno : INTEGER; VAR R : SET);
(* CONST pname = "StFct"; *)
VAR p2, r0, r1, x : OCT.Item; L0, f, f1 : INTEGER; btyp : OCT.Struct;
BEGIN (* StFct *)
(* OCG.TraceIn (mname, pname); *)
IF fctno >= OCT.TwoPar THEN
IF (fctno = OCT.pASSERT) & (parno = 1) THEN
IF p.mode # Coc THEN
OCC.PutF1 (OCC.TST, B, p); (* TST.B <p> *)
OCI.Unload (p); L0 := OCC.pc;
OCC.PutWord (OCC.BNE) (* BNE.S 2$ *)
ELSE
OCC.PutWord (OCC.Bcc + (SHORT (p.a0) * 100H));
OCC.PutWord (SHORT (p.a1)); (* Bcc 2$ *)
L0 := OCC.pc - 2; OCC.FixLink (p.a2);
END;
p2.mode := Con; p2.a0 := 20; p2.typ := OCT.linttyp;
x.mode := Lab; x.a0 := OCT.returnCode; x.a1 := 4;
x.symbol := OCT.OberonSysVAR;
OCC.Move (L, p2, x); (* 1$ MOVEQ #20,D0 *)
x.mode := Lab; x.a0 := 0; x.a1 := 4;
x.symbol := OCT.OberonSysCLEANUP;
OCC.PutF3 (OCC.JMP, x); (* JMP CLEANUP *)
IF p.mode # Coc THEN (* 2$ *)
OCC.PatchWord (L0, OCC.pc - L0 - 2)
ELSE OCC.FixLink (L0)
END;
p.typ := OCT.notyp
ELSIF (fctno = OCT.pDEC) & (parno = 1) THEN
IF p.rdOnly THEN OCS.Mark (324) END;
p2.mode := Con; p2.a0 := 1; p2.typ := p.typ;
OCC.PutF5 (OCC.SUB, p.typ.size, p2, p);
IF OCS.overflowCheck THEN OCC.PutWord (OCC.TRAPV) END;
p.typ := OCT.notyp
ELSIF (fctno = OCT.pINC) & (parno = 1) THEN
IF p.rdOnly THEN OCS.Mark (324) END;
p2.mode := Con; p2.a0 := 1; p2.typ := p.typ;
OCC.PutF5 (OCC.ADD, p.typ.size, p2, p);
IF OCS.overflowCheck THEN OCC.PutWord (OCC.TRAPV) END;
p.typ := OCT.notyp
ELSIF (fctno = OCT.pLEN) & (parno = 1) THEN
IF p.typ.form = DynArr THEN OCI.DescItem (p, p.desc, p.typ.adr)
ELSE p.mode := Con; p.a0 := p.typ.n; p.typ := OCT.linttyp
END
ELSIF fctno = OCT.pINLINE THEN
p.typ := OCT.notyp
ELSIF fctno = OCT.pSYSNEW THEN
IF parno = 2 THEN (* Supply a memory req *)
p2.mode := Con; p2.typ := OCT.settyp;
IF OCS.zeroVars THEN p2.a0 := 10000H (* {memClear} *)
ELSE p2.a0 := 0 (* {} *)
END;
r1.mode := Reg; r1.a0 := D1;
OCC.Move (L, p2, r1); (* MOVE.L memReq,D1 *)
END;
IF p.typ.form IN {Pointer, PtrTyp} THEN
OCC.PutWord (50C2H) (* ST D2 *)
ELSE
OCC.PutWord (51C2H) (* SF D2 *)
END;
OCC.UnReserveReg (D0);
x.mode := Lab; x.a0 := 0; x.a1 := 4; x.symbol := OCT.OberonSysSYSNEW;
OCC.SaveRegisters (R, x, OCC.AllRegs);
OCC.PutF3 (OCC.JSR, x); (* JSR SYSNEW *)
IF p.typ.form = BPointer THEN
OCC.PutWord (-1B80H) (* ASR.L #2,D0 *)
END;
OCC.RestoreRegisters (R, x);
r0.mode := Reg; r0.a0 := D0;
OCC.Move (L, r0, p); (* MOVE.L D0,<var> *)
p.typ := OCT.notyp
ELSIF (parno < 2) OR (fctno = OCT.pMOVE) & (parno < 3) THEN
OCS.Mark (65)
END
ELSIF (fctno = OCT.pNEW) & (parno >= 1) THEN
f := p.typ.form;
IF f IN {Pointer, CPointer, BPointer} THEN
f1 := f; btyp := p.typ.BaseTyp; f := btyp.form;
r0.mode := Reg; r0.a0 := D0; x.mode := Lab; x.a0 := 0; x.a1 := 4;
IF (f1 = Pointer) & NeedsTag (btyp) THEN
IF f = Record THEN
IF parno > 1 THEN OCS.Mark (64) END;
OCC.PutWord (223CH);
OCC.PutLongRef (0, btyp.symbol) (* MOVE.L #tag,D1 *)
ELSIF f = Array THEN
IF parno > 1 THEN OCS.Mark (64) END;
WHILE btyp.form = Array DO btyp := btyp.BaseTyp END;
OCC.PutWord (223CH); (* MOVE.L #tag+2,D1 *)
OCC.PutLongRef (2, btyp.symbol);
ELSIF f = DynArr THEN
WHILE btyp.form = DynArr DO btyp := btyp.BaseTyp; DEC (parno) END;
WHILE btyp.form = Array DO btyp := btyp.BaseTyp END;
IF parno > 1 THEN OCS.Mark (64)
ELSIF parno < 1 THEN OCS.Mark (65)
END;
OCC.PutWord (223CH); (* MOVE.L #tag+2,D1 *)
OCC.PutLongRef (2, btyp.symbol)
END;
x.symbol := OCT.OberonSysNEW
ELSE
p2.mode := Con; p2.typ := OCT.settyp;
IF OCS.zeroVars THEN p2.a0 := 10000H (* {memClear} *)
ELSE p2.a0 := 0 (* {} *)
END;
r1.mode := Reg; r1.a0 := D1;
OCC.Move (L, p2, r1); (* MOVE.L memReq,D1 *)
IF f1 = Pointer THEN
IF f = DynArr THEN
WHILE btyp.form = DynArr DO
btyp := btyp.BaseTyp; DEC (parno)
END;
IF parno > 1 THEN OCS.Mark (64)
ELSIF parno < 1 THEN OCS.Mark (65)
END
END;
OCC.PutWord (50C2H) (* ST D2 *)
ELSE OCC.PutWord (51C2H) (* SF D2 *)
END;
x.symbol := OCT.OberonSysSYSNEW
END;
OCC.SaveRegisters (R, x, OCC.AllRegs);
OCC.PutF3 (OCC.JSR, x); (* JSR (SYS)NEW *)
IF f1 = BPointer THEN
OCC.PutWord (-1B80H) (* ASR.L #2,D0 *)
END;
OCC.RestoreRegisters (R, x);
OCC.Move (L, r0, p); (* MOVE.L D0,<var> *)
END;
p.typ := OCT.notyp
ELSIF fctno = OCT.pGC THEN
p2.mode := Lab; p2.a0 := 0; p2.a1 := 4;
p2.symbol := OCT.OberonSysGC;
OCC.PutF3 (OCC.JSR, p2)
ELSIF fctno = OCT.pRC THEN
p.mode := Lab; p.a0 := OCT.returnCode; p.a1 := 4;
p.symbol := OCT.OberonSysVAR; p.typ := OCT.linttyp
ELSIF parno < 1 THEN
OCS.Mark (65)
END
(* ;OCG.TraceOut (mname, pname); *)
END StFct;
(*------------------------------------*)
PROCEDURE Inline * (VAR x : OCT.Item);
(* CONST pname = "Inline"; *)
VAR f : INTEGER;
BEGIN (* Inline *)
(* OCG.TraceIn (mname, pname); *)
f := x.typ.form;
IF (f IN intSet) & (x.mode = Con) THEN
IF f = LInt THEN OCC.PutLong (x.a0)
ELSE OCC.PutWord (SHORT (x.a0))
END
ELSE
OCS.Mark (17)
END
(* ;OCG.TraceOut (mname, pname); *)
END Inline;
(*------------------------------------*)
PROCEDURE NewPar * (VAR x, p : OCT.Item; n : INTEGER);
(* CONST pname = "NewPar"; *)
VAR f, i : INTEGER; btyp : OCT.Struct; desc, r0, y : OCT.Item;
calcSize : BOOLEAN;
BEGIN (* NewPar *)
(* OCG.TraceIn (mname, pname); *)
IF p.typ.form IN intSet THEN
f := x.typ.form;
IF f = Pointer THEN
btyp := x.typ; i := 0;
WHILE (btyp.BaseTyp # NIL) & (i < n) DO
btyp := btyp.BaseTyp; INC (i)
END;
f := btyp.form;
IF f = DynArr THEN
IF p.typ.form # LInt THEN OCE.ConvertInts (p, OCT.linttyp) END;
OCI.DescItem (desc, x.desc, btyp.adr);
OCC.Move (L, p, desc);
(*OCI.UpdateDesc (x, btyp.adr);*)
btyp := btyp.BaseTyp; f := btyp.form;
r0.mode := Reg; r0.a0 := D0; r0.typ := OCT.linttyp;
IF p.mode = Con THEN
IF f # DynArr THEN p.a0 := p.a0 * btyp.size END;
calcSize := FALSE
ELSE
calcSize := TRUE
END;
IF n = 1 THEN OCC.Move (L, p, r0); OCI.Unload (p)
ELSE OCE.Op (OCS.times, r0, p, TRUE)
END;
IF calcSize & (f # DynArr) & (btyp.size > 1) THEN
y.mode := Con; y.a0 := btyp.size; y.typ := OCT.linttyp;
OCE.Op (OCS.times, r0, y, TRUE)
END
ELSE OCS.Mark (64)
END
END
ELSE OCS.Mark (328)
END
(* ;OCG.TraceOut (mname, pname); *)
END NewPar;
END OCP.
(***************************************************************************
$Log: OCP.mod $
Revision 4.9 1994/08/03 11:44:38 fjc
- Changed error codes.
- Changed bit operations (LSH, AND, etc.) to work with
more types.
Revision 4.8 1994/07/26 18:35:51 fjc
*** empty log message ***
Revision 4.7 1994/07/23 16:02:09 fjc
- Implemented NIL checking.
- Changed to use new OCC.SaveRegisters() format.
Revision 4.6 1994/07/22 14:10:28 fjc
- Fixed code generated for ASSERT.
Revision 4.5 1994/07/10 13:20:48 fjc
- Commented out trace code.
- Implemented RC.
- Re-implemented SETCLEANUP to call OberonSys_SETCLEANUP.
- Added optional memreqs parameter to SYSNEW.
Revision 4.4 1994/07/03 14:46:46 fjc
- Fixed bug in checking parameters for GETNAME.
Revision 4.3 1994/06/17 17:57:56 fjc
- Implemented TypTag:
- SYSTEM procedures TAG, GETNAME, SIZETAG, NEWTAG
- Implemented SETREG and REG.
Revision 4.2 1994/06/05 22:49:24 fjc
- Changed to use new symbol table format.
- Removed references to defunct standard procedures.
Revision 4.1 1994/06/01 09:33:44 fjc
- Bumped version number
***************************************************************************)