Files
jlibusb/blackbox/Xo68x32/Mod/System.otd
schlaepfer 2d735a5092 - blackbox files added
git-svn-id: https://svn.code.sf.net/p/libusbjava/code/trunk@96 94ad28fe-ef68-46b1-9651-e7ae4fcf1c4c
2006-01-19 07:17:20 +00:00

1933 lines
68 KiB
Plaintext

MODULE Xo68x32System;
(** © ProXon/ED 3.9.94 / 22.11.98 / 7.12.00 / 12.7.01 / 23.10.01 / 9.1.02 / 23.2.02 | *)
(*changes:
3.1.05, AS USB support
13.3.04, ED ShowExceptionHistory
August 1994, ED creation
*)
IMPORT
SYS := SYSTEM,
Services, Log := StdLog, Ports, TextModels, TextMappers, TextRulers, DevCommanders, DevMarkers, Strings,
Dialog,
XU := XdeUtilities, Errors := XdeErrors, BDI := UsbBDI332, BDIMain := UsbBDI,
CC := Xo68x32CompConsts, OPM := Xo68x32CompM, XE := XdeErrors, CRM := Xo68x32Modules,
RegDict := Xo68x32TrgtRegDict, ImFile := Xo68x32MemImageFile;
CONST
COMPARE_IMAGE = FALSE;
(* constants and types *)
CONST
signOnMsg = "MC68x32 Cross System V 3.0.1 / NTB/ED 23.2.02";
errPrefix = "System_"; excPrefix = "Exc_";
kernelModName = "TobKernel";
configText = "TargetConfig.odc"; configHdrText = "TargetConfigHdr.odc"; ramImageFileName = "RAM.tim";
CONST
MAX_NOF_LONGS_FILL = 84;
MAX_NOF_BYTES_WORDS_FILL = 126;
CONST
nul = 0X; ht = 9X; false = 0; true = 1; newErr = 0;
mm = Ports.mm;
safetyZoneSize = 4*4;
nofRegNamesPerLine = 8; nofRegNamesPerPage = 15;
CONST (*OPT Structure Forms (standard types) *)
(* structure forms *)
sfUndef = CC.sfUndef; sfSysByte = CC.sfSysByte; sfBool = CC.sfBool; sfShChar = CC.sfShChar;
sfByte = CC.sfByte; sfShInt = CC.sfShInt; sfInt = CC.sfInt;
sfShReal = CC.sfShReal; sfReal = CC.sfReal;
sfSet = CC.sfSet; sfByteSet = CC.sfByteSet; sfShSet = CC.sfShSet;
sfString = CC.sfString;
sfNilTyp = CC.sfNilTyp; sfNoTyp = CC.sfNoTyp;
sfPointer = CC.sfPointer; sfProcTyp = CC.sfProcTyp; sfComp = CC.sfComp;
TYPE
Name = OPM.Name; ShortName = ARRAY 16 OF CHAR; LongName = ARRAY 64 OF CHAR;
VarDesc = RECORD name: LongName; textPos, adr, ind, form, size, baseType: INTEGER END;
ConstVarDesc = RECORD
objMode, form, baseForm: BYTE;
valueAdr, size: INTEGER;
name: OPM.Name
END;
SystemConstEntry = RECORD name: Name; val: INTEGER END;
VAR
Done-: BOOLEAN;
(** previous operation successfully completed
*)
firstErr-, nofErrors-: SHORTINT;
(** first error occured, see error list in CRErrors.Text
*)
promCodeSize-, ramCodeSize-, romModsVarSize-, ramModsVarSize- (* targVarSize- *): INTEGER;
(** promCodeSize: size of code and constants of the set of target modules loaded to target RAM.
ramCodeSize: size of code and constants of the set of target modules loaded to target RAM.
targVarSize: size of all gloabal variables of the set of target modules defined by the parameter list of the Load command.
Note: these variables may only be evaluated by the procedure DefineMemory of the module Target. Outside of the activation of this proc, the two vars are not valid.
*)
(* Variables *)
itemNames: ARRAY 5 OF ARRAY 6 OF CHAR;
formSizes: ARRAY sfComp + 1 OF SHORTINT;
variables: ARRAY 8 OF VarDesc; nofVars: SHORTINT;
targetState: SHORTINT;
objRdr: OPM.ObjReader;
referencePos: INTEGER; kernItemName: Name;
(*
refTextModel: TextModels.Model; refTextRdr: TextModels.Reader; refTextScnr: TextMappers.Scanner;
*)
gScnr: XU.Scanner; (* gloabal scanner *) gScnrBeg, gScnrEnd: INTEGER;
CONST (* system table offsets *)
CIsupStackOrg = 00H; CIstartAdr = 01H; CIsupStackSize = 02H; (*CImoduleTabBase=03H;*)
CIcodeBaseRom = 04H; CIcodeSizeRom = 05H; CIcodeBaseRam = 06H; CIcodeSizeRam = 07H;
CIramModsVarBase = 08H; CIramModsVarSize = 09H; CIsafetyZoneVH = 0AH;
CIheapBase = 0CH; CIheapSize = 0DH; CIsafetyZoneHUS = 0EH;
CIuserStackOrg = 10H; CIuserStackSize = 11H; CIsafetyZoneUSSS = 12H; CIsafetyZoneSSTop = 13H;
CIsafetyZoneCode = 14H; (* 4 longs for safety zone codes *)
CImaxNofModules = 1EH; CInofModules = 1FH;
CIfirstModule = 20H;
(*R 971127
CItagFcs=LEN(sysTab)-1;
*)
VAR (* target parameters, extracted from TobKernel and/or calculated by Xo68x32System *)
systemParDefined, CwatchdogEnab: BOOLEAN;
(*R 971127
CromBase, CromSize, CramBase, CramSize, CperiphBase, CperiphSize: INTEGER;
*)
CromBase, CromSize, CramBase, CramSize: INTEGER;
VcommandAdr: INTEGER; (* offset of system variable Vcommand in module TobKernel *)
VAR
kernelMemDeviceId: SHORTINT;
configT: TextModels.Model; configTextForm: TextMappers.Formatter;
VAR (* targget/host system parameters *)
(*R 971127
sysTabAdr: INTEGER; sysTab: ARRAY (20H + (3*CmaxNofModules + 3 + 1)) OF INTEGER;
*)
sysTabAdr, sysTabSize, maxNofModules, vItagFcs: INTEGER; sysTab: POINTER TO ARRAY OF INTEGER;
sysConsts: ARRAY 32 OF SystemConstEntry; nofSysConsts: INTEGER;
anyCodeInReadOnly, anyCodeInRam: BOOLEAN;
tmpTargetInDebugMode: BOOLEAN;
VAR
Fcs: PROCEDURE (begin, end: INTEGER): SHORTINT;
VAR
addrList*, dataList*: ARRAY 10000 OF INTEGER;
maxDataListIndex*: INTEGER;
PROCEDURE Error (errNr: SHORTINT);
BEGIN
IF Done THEN firstErr := errNr; Done := FALSE END; INC(nofErrors);
XE.Error("", errPrefix, errNr, TRUE)
END Error;
(*
PROCEDURE SyntaxErrorLn (pos: INTEGER; errNr: SHORTINT);
BEGIN
Error(errNr); Log.Tab; Log.String("pos "); Log.Int(pos); Log.Ln
END SyntaxErrorLn;
*)
PROCEDURE SyntaxErrorAtScnrPos (pos: INTEGER; errNr: SHORTINT);
VAR errMsg: XU.String64;
BEGIN
IF Done THEN
Strings.IntToString(errNr, errMsg);
XE.GetErrorCommentByName(NIL, errPrefix + errMsg, errMsg);
DevMarkers.Insert(gScnr.Base(), pos, DevMarkers.dir.NewMsg(errMsg));
gScnr.SetPos(gScnr.Pos() + 1);
Error(errNr); Log.String(" (lokate marker)"); Log.Ln
END
END SyntaxErrorAtScnrPos;
PROCEDURE LogLine (s: ARRAY OF CHAR);
BEGIN
Log.String("Xo68x32System: "); Log.Tab; Log.String(s$); Log.Ln
END LogLine;
PROCEDURE LogHex (val: INTEGER);
BEGIN
Log.Char('0'); Log.IntForm(val MOD 100000000L, Log.hexadecimal, 1, ' ', Log.hideBase); Log.Char('H')
END LogHex;
PROCEDURE LogCmdr;
BEGIN
Log.View(DevCommanders.dir.New())
END LogCmdr;
PROCEDURE LogCmdrEnd;
BEGIN
Log.View(DevCommanders.dir.NewEnd())
END LogCmdrEnd;
PROCEDURE LogXo68x32SystemCmd (IN cmd: ARRAY OF CHAR);
BEGIN
Log.Char(' '); LogCmdr; Log.String("Xo68x32System." + cmd)
END LogXo68x32SystemCmd;
PROCEDURE ConnectGlobalScannerToCmdParams;
VAR parText: TextModels.Model;
BEGIN
XU.GetTextModel("@!", parText, gScnrBeg, gScnrEnd);
gScnr.ConnectTo(parText);
gScnr.SetOpts({XU.soReturnQualIdents, XU.soReturnViews});
gScnr.SetPos(gScnrBeg)
END ConnectGlobalScannerToCmdParams;
PROCEDURE GetTargetStateAndBreak;
BEGIN
tmpTargetInDebugMode := BDI.isTargetInDebugMode();
BDIMain.ConnectDevice;
IF ~BDI.isTargetInDebugMode() THEN
IF ~BDI.isFreezeAsserted () THEN
BDI.break_
END
END
END GetTargetStateAndBreak;
PROCEDURE TurnTargetToPrevState;
BEGIN
IF BDI.isTargetInDebugMode () & ~tmpTargetInDebugMode THEN BDI.go END
END TurnTargetToPrevState;
PROCEDURE ShowTargetState;
BEGIN
IF BDI.isTargetInDebugMode() THEN
Log.String("target stopped"); LogXo68x32SystemCmd("TargetGo ?"); Log.Ln
ELSE
Log.String("target running"); LogXo68x32SystemCmd("TargetBreak ?"); Log.Ln
END
END ShowTargetState;
PROCEDURE ObjRead (OUT byte: BYTE);
BEGIN
OPM.ReadByte(objRdr, byte)
END ObjRead;
PROCEDURE ObjReadInt (OUT val: INTEGER);
BEGIN
OPM.ReadInt(objRdr, val)
END ObjReadInt;
PROCEDURE RefOpen (IN modName: OPM.Name);
VAR tag, compVers: BYTE;
BEGIN
Done := TRUE;
objRdr := OPM.NewObjReader(modName, NIL);
IF objRdr = NIL THEN
Error(11)
ELSE
ObjRead(tag); IF tag # CC.tagObjFile THEN
Error(newErr)
ELSE
ObjRead(compVers); ObjReadInt(referencePos);
objRdr.SetPos(referencePos);
ObjRead(tag); IF tag # CC.tagReference THEN Error(2) END
END
END
END RefOpen;
PROCEDURE RefRead (OUT byte: BYTE);
BEGIN
OPM.ReadByte(objRdr, byte)
END RefRead;
PROCEDURE RefReadNum (OUT val: INTEGER);
BEGIN
OPM.ReadNum(objRdr, val)
END RefReadNum;
PROCEDURE RefReadInt (OUT val: INTEGER);
BEGIN
OPM.ReadNum(objRdr, val)
END RefReadInt;
PROCEDURE RefReadNameVis (OUT str: ARRAY OF CHAR; OUT visibility: BYTE);
BEGIN
OPM.RefRNameVis(objRdr, str, visibility)
END RefReadNameVis;
PROCEDURE SelectGlobItem (objMode: INTEGER; IN objName: ARRAY OF CHAR; OUT obj: ConstVarDesc);
VAR
valueAdr, size: INTEGER; oMode, form, baseForm: BYTE;
name: OPM.Name;
tag, vis: BYTE; found: BOOLEAN;
BEGIN
objRdr.SetPos(referencePos);
ObjRead(tag); IF tag # CC.tagReference THEN
Error(2)
ELSE
RefRead(tag);
IF tag # CC.tagRefBlock THEN
Error(3)
ELSE
RefReadNum(valueAdr); RefReadNameVis(name, vis); (* skip module body *)
REPEAT
RefRead(oMode); RefReadNameVis(name, vis); RefReadInt(valueAdr);
RefReadInt(size); RefRead(form); RefRead(baseForm);
found := ((objMode = oMode) & (objName = name))
UNTIL found OR (objMode = CC.tagRefBlock) OR objRdr.eof;
IF found THEN
obj.name := name;
obj.objMode := oMode; obj.form := form; obj.baseForm := baseForm; obj.size := size;
IF objMode = CC.omVar THEN DEC(valueAdr, OPM.maxCodeSize) END;
obj.valueAdr := valueAdr;
ELSE
obj.name := "";
obj.objMode := 0; obj.form := CC.sfUndef; obj.baseForm := CC.sfUndef;
obj.valueAdr := 0; obj.size := 0
END
END
END
END SelectGlobItem;
PROCEDURE TKernelRefOpen * ;
(** Opens the file TobKernel reference part of the object file
*)
VAR c0, c1: CHAR;
BEGIN
referencePos := 0; kernItemName := ""; RefOpen(kernelModName)
END TKernelRefOpen;
PROCEDURE TKernelConst * (IN name: ARRAY OF CHAR): INTEGER;
(** Returns the value of any global constant of module TobKernel. name is the const name without the module name.
Note: open the file with TobKernelRefOpen and than fetch constants in alphabetic order to speed up.
Exmpl: ramSize := TobKernelConst("CramSize");
*)
VAR cv: ConstVarDesc;
BEGIN
SelectGlobItem(CC.omConst, name, cv); (* PrintCV(cv); Log.Ln; *)
IF cv.objMode = 0 THEN Error(13) ELSE kernItemName := cv.name$ END;
RETURN cv.valueAdr
END TKernelConst;
PROCEDURE TKernelVarOffset (name: ARRAY OF CHAR): INTEGER;
VAR cv: ConstVarDesc;
VAR val: INTEGER; c0, c1: CHAR;
BEGIN
SelectGlobItem(CC.omVar, name, cv); (* PrintCV(cv); Log.Ln; *)
IF cv.objMode = 0 THEN Error(14) ELSE kernItemName := cv.name$ END;
RETURN cv.valueAdr
END TKernelVarOffset;
PROCEDURE CreateSystemTab (len: INTEGER);
VAR i: INTEGER;
BEGIN
Log.String("CreateSystemTab"); Log.Ln;
NEW(sysTab, len); vItagFcs := len - 1;
systemParDefined := FALSE;
FOR i := 0 TO LEN(sysTab^) - 1 DO sysTab[i] := 0 END;
sysTab[CIsafetyZoneCode] := 7F7F5E5EH; sysTab[CIsafetyZoneCode + 1] := 4D4D3C3CH;
sysTab[CIsafetyZoneCode + 2] := 2B2B1A1AH; sysTab[CIsafetyZoneCode + 3] := 55554AB3H
END CreateSystemTab;
PROCEDURE GetSystemConstants;
(* gets the system constants from TobKernel.Ref and creates the system tab *)
VAR n, v, offset: INTEGER;
BEGIN
Done := TRUE;
TKernelRefOpen;
(*R 971127*)
n := TKernelConst("COtagFcs");
maxNofModules := TKernelConst("CmaxNofModules");
sysTabSize := TKernelConst("CsysTabSize");
IF sysTabSize # (CIfirstModule + 3 * maxNofModules + 3 + 1) * 4 THEN Error(15) END;
IF Done THEN
CreateSystemTab(sysTabSize DIV 4);
IF n # (LEN(sysTab^) - 1) * 4 THEN Error(15) END
END;
IF Done THEN
n := 0;
WHILE Done & (n < nofSysConsts) DO
v := TKernelConst(sysConsts[n].name); offset := sysConsts[n].val;
IF offset >= 0 THEN
IF v # offset THEN
Error(16); Log.Tab; Log.String("const name "); Log.String(sysConsts[n].name$); Log.Ln
END
ELSE
sysTab[ABS(offset)] := v
END;
INC(n);
END;
(*R 971127
CperiphBase := TKernelConst("CperiphBase"); CperiphSize := TKernelConst("CperiphSize");
*)
CramBase := TKernelConst("CramBase"); CramSize := TKernelConst("CramSize");
CromBase := TKernelConst("CromBase"); CromSize := TKernelConst("CromSize");
CwatchdogEnab := TKernelConst("CwatchdogEnab") # false;
VcommandAdr := TKernelVarOffset("Vcommand"); (* offset by this time, inc in Xo68x32System.Load *)
END
END GetSystemConstants;
PROCEDURE InsertSysConst (name: ARRAY OF CHAR; val: INTEGER);
VAR n: INTEGER;
BEGIN
n := nofSysConsts - 1;
ASSERT(nofSysConsts < LEN(sysConsts), 99);
WHILE (n >= 0) & (name < sysConsts[n].name) DO
sysConsts[n + 1] := sysConsts[n]; DEC(n);
END;
INC(n);
ASSERT(name # sysConsts[n].name, 99);
sysConsts[n].name := name$; sysConsts[n].val := val;
INC(nofSysConsts)
END InsertSysConst;
PROCEDURE SystemConstantsSetUp;
(* gets the system constants from TKernel.Ref *)
BEGIN
(*R 971127
ClearSystemTab;
*)
(* system table offsets to be checked *)
nofSysConsts := 0;
InsertSysConst("COsupStackOrg", 4 * CIsupStackOrg); (* 00H *)
InsertSysConst("COstartAdr", 4 * CIstartAdr);
InsertSysConst("COsupStackSize", 4 * CIsupStackSize);
InsertSysConst("COcodeBaseRom", 4 * CIcodeBaseRom); (* 04H *)
InsertSysConst("COcodeSizeRom", 4 * CIcodeSizeRom);
InsertSysConst("COcodeBaseRam", 4 * CIcodeBaseRam);
InsertSysConst("COcodeSizeRam", 4 * CIcodeSizeRam);
InsertSysConst("COramModsVarBase", 4 * CIramModsVarBase); (* 08H *)
InsertSysConst("COramModsVarSize", 4 * CIramModsVarSize);
InsertSysConst("COsafetyZoneVH", 4 * CIsafetyZoneVH);
InsertSysConst("COheapBase", 4 * CIheapBase); (* 0CH *)
InsertSysConst("COheapSize", 4 * CIheapSize);
InsertSysConst("COsafetyZoneHUS", 4 * CIsafetyZoneHUS);
InsertSysConst("COuserStackOrg", 4 * CIuserStackOrg); (* 10H *)
InsertSysConst("COuserStackSize", 4 * CIuserStackSize);
InsertSysConst("COsafetyZoneUSSS", 4 * CIsafetyZoneUSSS);
InsertSysConst("COsafetyZoneSSTop", 4 * CIsafetyZoneSSTop);
InsertSysConst("COsafetyZoneCode", 4 * CIsafetyZoneCode); (* 14H .. 17H *)
InsertSysConst("COmaxNofModules", 4 * CImaxNofModules); (* 1EH *)
InsertSysConst("COnofModules", 4 * CInofModules); (* 1FH *)
InsertSysConst("COfirstModule", 4 * CIfirstModule); (* 20H *)
(*R 971127
InsertSysConst("COtagFcs", 4*CItagFcs); (* 20H *)
*)
(* system consts to be fetched *)
InsertSysConst("CsupStackSize", - CIsupStackSize);
InsertSysConst("CuserStackSize", - CIuserStackSize);
InsertSysConst("CmaxNofModules", - CImaxNofModules)
END SystemConstantsSetUp;
PROCEDURE ShowSysConsts * ;
(** Shows system constants in System.Log. (for developpers only)
*)
VAR n: INTEGER;
BEGIN
Log.Ln; Log.String("System Constants:"); Log.Ln; Log.Tab; Log.String("system table offsets"); Log.Ln;
n := 0;
WHILE n < nofSysConsts DO
Log.Tab; Log.Tab; Log.String(sysConsts[n].name$); Log.Tab; LogHex(sysConsts[n].val); Log.Ln;
INC(n);
END;
Log.Ln; Log.Tab; Log.String("system parameters"); Log.Ln;
Log.Ln; Log.Tab; Log.Tab; Log.String("CromBase"); Log.Tab; LogHex(CromBase);
Log.Ln; Log.Tab; Log.Tab; Log.String("CromSize"); Log.Tab; LogHex(CromSize);
Log.Ln; Log.Tab; Log.Tab; Log.String("CramBase"); Log.Tab; LogHex(CramBase);
Log.Ln; Log.Tab; Log.Tab; Log.String("CramSize"); Log.Tab; LogHex(CramSize);
(*R 971127
Log.Ln; Log.Tab; Log.Tab; Log.String("CperiphBase"); Log.Tab;LogHex(CperiphBase, 0);
Log.Ln; Log.Tab; Log.Tab; Log.String("CperiphSize"); Log.Tab;LogHex(CperiphSize, 0);
*)
Log.Ln; Log.Tab; Log.Tab; Log.String("CcodeInReadOnlyMem"); Log.Tab; Log.Bool(anyCodeInReadOnly);
Log.Ln; Log.Tab; Log.Tab; Log.String("CwatchdogEnab"); Log.Tab; Log.Bool(CwatchdogEnab)
END ShowSysConsts;
PROCEDURE ShowSystemTable * ;
(** Shows the content of the system table in System.Log
*)
VAR m, n, ln: INTEGER; name: Name;
BEGIN
Log.Ln; Log.String("System Table"); Log.Ln;
ln := 0;
IF ~systemParDefined THEN
Log.Tab; Log.String("not yet defined (do first 'Xo68x32System.Load' or 'Xo68x32System.GenPromFile'"); Log.Ln;
RETURN
END;
n := 0;
WHILE n < 20H DO
m := 0;
WHILE (m < nofSysConsts) & (sysConsts[m].val # 4 * n) DO INC(m) END;
IF m < nofSysConsts THEN
name := sysConsts[m].name; name[0] := ' '; name[1] := ' ';
Log.Tab; LogHex(n); Log.String(name$); Log.Char(":"); Log.Tab; LogHex(sysTab[n]);
IF n = CIsafetyZoneCode THEN
Log.Tab; LogHex(sysTab[CIsafetyZoneCode + 1]);
Log.Tab; LogHex(sysTab[CIsafetyZoneCode + 2]);
Log.Tab; LogHex(sysTab[CIsafetyZoneCode + 3])
END;
Log.Ln; ln := 0
ELSE
IF ln = 0 THEN Log.Ln END; INC(ln);
END;
INC(n);
END; Log.Ln;
m := 0; n := CIfirstModule;
WHILE (m < CRM.nofModules) DO
LogHex(n); Log.Tab; Log.String("code begin"); Log.Tab; Log.Int(m); Log.Char(":");
Log.Tab; LogHex(sysTab[n]); Log.Ln; INC(n);
LogHex(n); Log.Tab; Log.String("code limit "); Log.Tab; Log.Int(m); Log.Char(":");
Log.Tab; LogHex(sysTab[n]); Log.Ln; INC(n);
LogHex(n); Log.Tab; Log.String("body "); Log.Int(m); Log.Tab; Log.Char(":");
Log.Tab; LogHex(sysTab[n]); Log.Ln; INC(n);
INC(m); Log.Ln
END
(*R 971127
LogHex(LEN(sysTab^)-1, 3); Log.Tab; Log.String("tag,fcs:"); Log.Tab; LogHex(sysTab[LEN(sysTab^)-1], 0); Log.Ln;
*)
END ShowSystemTable;
PROCEDURE InsertVar (name: ARRAY OF CHAR; pos: INTEGER);
VAR n: INTEGER;
BEGIN
IF nofVars < LEN(variables) THEN
n := nofVars - 1;
WHILE (n >= 0) & (name < variables[n].name) DO
variables[n + 1] := variables[n]; DEC(n)
END;
INC(n);
variables[n].name := name$; variables[n].textPos := pos; variables[n].adr := 0;
variables[n].ind := 0; variables[n].form := 0; variables[n].size := 0; variables[n].baseType := 0;
INC(nofVars)
END
END InsertVar;
PROCEDURE PrintVariable (n: SHORTINT);
BEGIN
Log.Ln; Log.String("Variable["); Log.Int(n); Log.String("]: ");
Log.String("name="); Log.String(variables[n].name$);
Log.String(", textPos "); Log.Int(variables[n].textPos);
Log.Ln; Log.Tab; Log.String("adr="); LogHex(variables[n].adr);
Log.String(", ind="); Log.Int(variables[n].ind);
Log.String(", form="); Log.Int(variables[n].form);
Log.String(", size="); Log.Int(variables[n].size);
Log.String(", baseType="); Log.Int(variables[n].baseType); Log.Ln
END PrintVariable;
(*
PROCEDURE PrintVars;
VAR n: SHORTINT;
BEGIN
n := 0; WHILE n < nofVars DO PrintVariable(n); INC(n) END
END PrintVars;
*)
PROCEDURE WriteRegToLog (regName: ARRAY OF CHAR; VAR validName: BOOLEAN);
VAR
val: INTEGER; write: RegDict.WriteProc; n: SHORTINT;
BEGIN
Log.String(regName$); Log.String(" = ");
RegDict.SelectReg(regName, validName);
IF ~validName THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 0); RETURN END;
write := RegDict.RegWriteProc(); n := RegDict.RegSize();
CASE RegDict.RegType() OF
| RegDict.UserReg: val := BDI.readUserReg(RegDict.RegCode());
| RegDict.SysReg: val := BDI.readSysReg( RegDict.RegCode());
| RegDict.CtrlReg: val := BDI.readMem( RegDict.RegCode(), n);
ELSE
Error(1)
END;
CASE n OF |1: val := val MOD 100H; |2: val := val MOD 10000H ELSE END;
LogHex(val);
Log.String("(*" ); Log.Int(val); Log.String("*)"); Log.Ln
END WriteRegToLog;
PROCEDURE OutNum (hexVal, decVal, cardinal: INTEGER);
BEGIN
Log.String(" "); LogHex(hexVal); Log.String("(*"); Log.Int(decVal);
IF cardinal # 0 THEN Log.String(" | "); Log.Int(cardinal) END;
Log.String("*)")
END OutNum;
PROCEDURE OutItem (val: INTEGER; form: INTEGER);
VAR card: INTEGER; real: SHORTREAL; int: SHORTINT; short: BYTE; c: CHAR;
BEGIN
card := 0;
CASE form OF
|sfBool:
val := val MOD 100H; Log.String(" "); LogHex(val);
IF val = 0 THEN Log.String("(*FALSE*)") ELSE Log.String("(*TRUE*)") END;
|sfShChar:
c := SHORT(CHR(val));
IF (c >= ' ') & (c <= '~') THEN Log.Char(c) ELSE Log.Char('.') END;
|sfByte:
short := SHORT(SHORT(val)); IF short < 0 THEN card := LONG(short) + 100H END;
OutNum(val MOD 100H, short, card)
|sfShInt:
int := SHORT(val); IF int < 0 THEN card := LONG(int) + 10000H END;
OutNum(val MOD 10000H, int, card)
|sfInt: OutNum(val, val, 0)
|sfShReal:
Log.String(" "); real := SYS.VAL(SHORTREAL, val); Log.Real(real);
Log.String("(*"); LogHex(val); Log.String("*)")
ELSE
Log.String(" "); LogHex(val)
END
END OutItem;
PROCEDURE ReadMemLocs (memAddr: INTEGER; itemSize, len, form: INTEGER);
VAR
memData, m, dataLength, recLength, i: INTEGER; itemsPerLine: SHORTINT;
data: ARRAY MAX_NOF_LONGS_FILL OF INTEGER;
BEGIN
(*
Log.String("ReadMemLocs: addr="); LogHex(memAddr); Log.String(", itemSize="); LogHex(itemSize);
Log.String(", len="); LogHex(len); Log.String(", form="); LogHex(form); Log.Ln;
*)
itemsPerLine := 4; IF itemSize = 1 THEN itemsPerLine := 8 END;
IF form = sfShChar THEN itemsPerLine := 256 END;
m := 0; IF len > 256 THEN len := 256 END;
LOOP
IF m = 0 THEN
memData := BDI.readMem(memAddr, itemSize);
LogHex(memAddr); Log.Char(':'); IF form = sfShChar THEN Log.Tab END;
OutItem(memData, form); m := itemsPerLine;
recLength := 1;
ELSE
dataLength := MAX_NOF_LONGS_FILL;
IF len < MAX_NOF_LONGS_FILL THEN
dataLength := len
END;
(* FIXME: LEN(data) may be too long for the last dump *)
BDI.dumpMem(LEN(data), data, recLength);
(*
Log.Ln; Log.String("Dump: recLength: "); Log.Int(recLength);
Log.String(", len: "); Log.Int(len); Log.Ln;
*)
FOR i := 0 TO recLength - 1 DO
OutItem(data[i], form); Log.Ln;
END
END;
IF ~BDI.Done THEN
Error(41); EXIT
END;
INC(memAddr, LONG(itemSize) * recLength); DEC(len, recLength); IF len <= 0 THEN EXIT END;
DEC(m); IF m = 0 THEN LogCmdrEnd; Log.Ln END
END;
LogCmdrEnd; Log.Ln
END ReadMemLocs;
PROCEDURE ReadVariables;
VAR form, itemSize, len, n: INTEGER;
BEGIN
GetTargetStateAndBreak; n := 0;
WHILE n < nofVars DO
form := variables[n].form;
IF form = sfComp THEN form := variables[n].baseType END;
itemSize := formSizes[form];
len := variables[n].size DIV itemSize;
Log.String("Var: "); Log.String(variables[n].name$); Log.Ln;
Log.Tab; ReadMemLocs(variables[n].adr, itemSize, len, form);
INC(n)
END;
TurnTargetToPrevState; ShowTargetState
END ReadVariables;
PROCEDURE ReadMem (form: INTEGER);
VAR c: CHAR; ch: CHAR; memAddr: INTEGER; len, itemSize: INTEGER;
BEGIN
ConnectGlobalScannerToCmdParams;
IF ~gScnr.done THEN Error(22); RETURN END;
gScnr.SetOpts({XU.soSkipComments, XU.soScanComments, XU.soReturnViews});
itemSize := formSizes[form];
gScnr.Int(memAddr); IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 21); RETURN END;
gScnr.Char(ch); c := SHORT(ch);
IF ~gScnr.done OR (c # ':') THEN SyntaxErrorAtScnrPos(gScnr.Pos() - 1, 05); RETURN END;
gScnr.Int(len); IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 23); RETURN END;
GetTargetStateAndBreak;
ReadMemLocs(memAddr, itemSize, len, form);
TurnTargetToPrevState; ShowTargetState
END ReadMem;
PROCEDURE TargetInitSuccessful * (done: BOOLEAN);
(** Indicates successful initialisation of the target, called by proc Init in module Target.
*)
BEGIN
Done := done;
END TargetInitSuccessful;
PROCEDURE ReadVar * ;
(** parameters: varName {varName} "¿¿E". varName = moduleName "." variableName.
Shows the content of the variables listed in the parameter list. Var name need to be qualified by the module name.
*)
VAR
mod, prevMod: CRM.TargetModule;
len, dotPos, n, timeInt, pos: INTEGER;
name: LongName; modName, varName: Name; tempName: ARRAY 32 OF CHAR;
refTextModel: TextModels.Model; c0, c1: CHAR;
name2: ARRAY 64 OF CHAR;
cv: ConstVarDesc;
BEGIN
Done := TRUE; nofVars := 0; c1 := nul;
ConnectGlobalScannerToCmdParams; IF ~gScnr.done THEN Error(22); RETURN END;
gScnr.SetOpts({XU.soReturnQualIdents, XU.soReturnViews, XU.soSkipComments, XU.soScanComments});
IF gScnr.Next() = XU.stInt THEN gScnr.Int(timeInt) END;
pos := gScnr.Pos(); gScnr.Ident(name2); name := SHORT(name2$);
WHILE gScnr.done & (nofVars < LEN(variables)) DO
InsertVar(name, pos); pos := gScnr.Pos(); gScnr.Ident(name2); name := SHORT(name2$);
END;
IF nofVars = 0 THEN SyntaxErrorAtScnrPos(pos, 11); RETURN END;
IF gScnr.done THEN Error(19) END;
n := 0; prevMod := NIL;
LOOP
name := variables[n].name; pos := variables[n].textPos;
len := LEN(name$); Strings.Find(name$, ".", 0, dotPos);
IF (len = 0) OR (dotPos <= 0) THEN SyntaxErrorAtScnrPos(pos, 24); EXIT END;
Strings.Extract(name$, 0, dotPos, modName);
mod := CRM.ThisLoadedModule(modName);
IF mod = NIL THEN SyntaxErrorAtScnrPos(pos, 25); EXIT END;
IF mod # prevMod THEN
prevMod := mod;
referencePos := 0; RefOpen(modName);
IF referencePos = 0 THEN SyntaxErrorAtScnrPos(pos, 11); EXIT END;
(*
Log.String("Sys:ReadVar "); Log.String(name); Log.String(", modName: "); Log.String(modName);
XU.GetRefModel(modName$, refTextModel);
IF refTextModel = NIL THEN SyntaxErrorAtScnrPos(pos, 11); EXIT END;
gScnr.ConnectTo(refTextModel); gScnr.Scan; c1 := nul;
REPEAT c0 := c1; gScnr.Char(c1) UNTIL ~gScnr.done OR (c0 = '>') & (c1 = 'M');
IF ~gScnr.done THEN SyntaxErrorAtScnrPos(pos, 12); EXIT END;
*)
END;
Strings.Extract(name$, dotPos + 1, len - dotPos - 1, varName);
SelectGlobItem(CC.omVar, varName, cv);
IF cv.objMode = CC.omUndef THEN SyntaxErrorAtScnrPos(pos, 14); EXIT END;
(*
Log.String(", varName: "); Log.String(varName); Log.String(", modName"); Log.Ln;
REPEAT
REPEAT c0 := c1; gScnr.Char(c1) UNTIL ~gScnr.done OR (c0 = '>') & (c1 = 'V');
gScnr.Ident(name2); name := SHORT(name2$);
UNTIL ~gScnr.done OR (name = varName);
Log.Tab; Log.String("name: ");Log.String(name); Log.Ln;
Log.Tab; Log.String("adr0: "); LogHex(cv.valueAdr); Log.Ln;
Log.Tab; Log.String("VarBase: "); LogHex(CRM.VarBase(mod)); Log.Ln;
Log.Tab; Log.String("VarSize: "); LogHex(CRM.VarSize(mod)); Log.Ln;
*)
variables[n].ind := CC.omVar;
variables[n].adr := cv.valueAdr + CRM.VarBase(mod);
variables[n].form := cv.form;
variables[n].size := cv.size;
variables[n].baseType := cv.baseForm;
(*
Log.Tab; Log.String("oMode: "); LogHex(variables[n].ind); Log.Ln;
Log.Tab; Log.String("form: "); LogHex(variables[n].form); Log.Ln;
Log.Tab; Log.String("baseForm: "); LogHex(variables[n].baseType); Log.Ln;
Log.Tab; Log.String("size: "); LogHex(variables[n].size); Log.Ln;
Log.Tab; Log.String("adr: "); LogHex(variables[n].adr); Log.Ln;
gScnr.Int(variables[n].ind); gScnr.Int(variables[n].adr); INC(variables[n].adr, CRM.VarBase(mod));
gScnr.Int(variables[n].form); gScnr.Int(variables[n].size); gScnr.Int(variables[n].baseType);
IF ~gScnr.done THEN SyntaxErrorLn(pos, 12); EXIT END;
*)
INC(n); IF n >= nofVars THEN EXIT END;
END;
IF Done THEN ReadVariables END;
END ReadVar;
PROCEDURE LogExceptionsHead;
VAR ruler: TextRulers.Ruler;
BEGIN
ruler := TextRulers.dir.New(NIL);
(*
TextRulers.SetFirst(ruler, 8*mm); TextRulers.SetLeft(ruler, 12*mm);
exc# format vectNr vectOffset SR PC (addr) Module[pcOffset]
1 02H 06H 018H 02700H 01018CAH To68x32Heap[0932H]
*)
TextRulers.AddTab(ruler, 8 * mm); TextRulers.MakeRightTab(ruler); (*exc#*)
TextRulers.AddTab(ruler, 20 * mm); TextRulers.MakeRightTab(ruler); (*format*)
TextRulers.AddTab(ruler, 24 * mm); (*exception comment from Xde\Docu\Errors*)
TextRulers.AddTab(ruler, 34 * mm); TextRulers.MakeRightTab(ruler); (*evectNr*)
TextRulers.AddTab(ruler, 50 * mm); TextRulers.MakeRightTab(ruler); (*vectOffset*)
TextRulers.AddTab(ruler, 66 * mm); TextRulers.MakeRightTab(ruler); (*SR*)
TextRulers.AddTab(ruler, 90 * mm); TextRulers.MakeRightTab(ruler); (*PC (addr)*)
TextRulers.AddTab(ruler, 92 * mm); (*Module[pcOffset]*)
Log.View(ruler);
Log.Tab; Log.String("exc#"); Log.Tab; Log.String("format");
Log.Tab; Log.Tab; Log.String("vectNr"); Log.Tab; Log.String("vectOffset"); Log.Tab; Log.String("SR");
Log.Tab; Log.String("PC (addr)"); Log.Tab; Log.String("Module[pcOffset]"); Log.Ln;
END LogExceptionsHead;
PROCEDURE LogDefaultRuler;
VAR ruler: TextRulers.Ruler;
BEGIN
ruler := TextRulers.dir.New(NIL); Log.View(ruler)
END LogDefaultRuler;
PROCEDURE ShowExceptionHistory * ;
(** parameters: varName {varName} "¿¿E". varName = moduleName "." variableName.
Shows the content of the variables listed in the parameter list. Var name need to be qualified by the module name.
*)
VAR
mod: CRM.TargetModule;
len, dotPos, n, timeInt, intVal, vectNr: INTEGER;
mwordsPC: ARRAY 4 OF INTEGER; (*mwordsPC[0] = M[pc], mwordsPC[1] = M[pc-2], ... mwordsPC[3] = M[pc-6]*)
name: LongName; modName, varName: Name; tempName: ARRAY 32 OF CHAR;
refTextModel: TextModels.Model; c0, c1: CHAR;
cv: ConstVarDesc;
(*---- Kernel Variables*)
nofUnexpInt, trInd, stAdr: INTEGER; (* nofUnexpInt: total number, trInd: trace index (of last int) *)
pcs: ARRAY 16 OF INTEGER; (* address at which the unexpected int occured *)
status: ARRAY 16 OF INTEGER; (* status words *)
vect: ARRAY 16 OF INTEGER; (* interrupt type (4 bits) and vector number 12 bits *)
buff: ARRAY 16 OF INTEGER;
PROCEDURE ReadMemLocs (IN varName: ARRAY OF CHAR; OUT len: INTEGER;
OUT ints: ARRAY OF INTEGER);
VAR
memAddr, memData, m: INTEGER; itemSize, form, maxLen: INTEGER;
BEGIN
SelectGlobItem(CC.omVar, varName, cv);
IF cv.objMode = CC.omUndef THEN
Error(14)
ELSE
memAddr := cv.valueAdr + CRM.VarBase(mod);
form := cv.form;
IF form = sfComp THEN form := cv.baseForm END;
itemSize := formSizes[form];
len := cv.size DIV itemSize;
(*
Log.String("Var: "); Log.String(cv.name$); Log.Ln;
Log.String("addr="); LogHex(memAddr); Log.String(", itemSize="); LogHex(itemSize);
Log.String(", len="); LogHex(len); Log.String(", form="); LogHex(form); Log.Ln;
*)
GetTargetStateAndBreak;
memData := BDI.readMem(memAddr, itemSize); ints[0] := memData;
m := 1; maxLen := MIN(len, LEN(ints));
WHILE m < maxLen DO
HALT(35);
(* BDI.DumpMem(memData, itemSize); (*OutItem(memData, form);*) ints[m] := memData; *)
INC(m)
END;
TurnTargetToPrevState
END
END ReadMemLocs;
PROCEDURE LogLocation (pc: INTEGER);
VAR
mod: CRM.TargetModule; base: INTEGER;
name: OPM.LongName;
BEGIN
mod := CRM.FirstModule();
LOOP
IF mod = NIL THEN EXIT END;
base := CRM.CodeBase(mod);
IF (pc >= base) & (pc < base + CRM.CodeSize(mod)) THEN EXIT END;
mod := CRM.NextModule()
END;
IF mod # NIL THEN
CRM.GetModuleName(mod, name);
Log.Tab; Log.String(name); Log.Char('['); LogHex(pc - base); Log.Char(']')
END;
END LogLocation;
BEGIN
GetTargetStateAndBreak;
Done := TRUE; nofVars := 0; c1 := nul;
mod := CRM.ThisLoadedModule(kernelModName);
IF mod = NIL THEN
Error(25)
ELSE
referencePos := 0; RefOpen(kernelModName);
XU.GetRefModel(modName$, refTextModel);
IF referencePos = 0 THEN Error(11) END
END;
IF Done THEN
ReadMemLocs("nofUnexpInt", len, buff); nofUnexpInt := buff[0];
ReadMemLocs("trInd", len, buff); trInd := buff[0];
ReadMemLocs("stAdr", len, buff); stAdr := buff[0];
ReadMemLocs("pcs", len, pcs);
ReadMemLocs("status", len, status);
ReadMemLocs("vect", len, vect);
END;
IF Done THEN
Log.String("number of unexpected exceptions: "); Log.Int(nofUnexpInt);
IF nofUnexpInt > 0 THEN
Log.String(", trace index: "); Log.Int(trInd); Log.Ln;
n := MIN(len, nofUnexpInt);
LogExceptionsHead;
(* GetTargetState; *)
WHILE n > 0 DO
Log.Tab; Log.Int(nofUnexpInt);
intVal := vect[trInd]; vectNr := intVal MOD 1000H DIV 4;
Log.Tab; LogHex(intVal DIV 1000H MOD 16); (*format*)
Log.Tab; Log.Tab; Log.Int(vectNr); (*vectNr*)
Log.Tab; LogHex(vectNr * 4); (*vector offset*)
Log.Tab; LogHex(status[trInd]);
intVal := pcs[trInd]; Log.Tab; LogHex(intVal); LogLocation(intVal); Log.Ln;
Log.Tab; Log.Tab; Log.Tab;
IF vectNr < 32 THEN
Strings.IntToString(vectNr, tempName);
XE.GetErrorCommentByName(NIL, excPrefix + tempName$, tempName); tempName[0] := ' ';
Log.String(tempName$);
END;
IF vectNr = 7 THEN(*TRAPcc, TRAPV, read mem words frmo pc-6 ... pc*)
tempName := "";
mwordsPC[3] := BDI.readMem(intVal - 3 * 2, 2);
HALT(35);
(*
BDI.DumpMem(mwordsPC[2], 2);
BDI.DumpMem(mwordsPC[1], 2); BDI.DumpMem(mwordsPC[0], 2);
*)
IF mwordsPC[1] = 4E76H THEN (*TRAPV | TRAPcc with extension word of that pattern*)
tempName := ": TRAPV";
ELSIF mwordsPC[2] = 50FAH THEN (*TRAPT (HALT(ew))*)
Strings.IntToString(mwordsPC[1], tempName);
tempName := ": HALT(" + tempName + ")";
END;
Log.String(tempName$)
END;
Log.Ln;
trInd := (trInd - 1) MOD len; DEC(nofUnexpInt); DEC(n);
END;
(* TurnTargetToPrevState; ShowTargetState *)
LogDefaultRuler
END
END;
TurnTargetToPrevState; ShowTargetState
END ShowExceptionHistory;
PROCEDURE WriteMem (form: SHORTINT);
VAR
c: CHAR; memAddr, memStartAddr, memData: INTEGER; n, itemSize: SHORTINT;
BEGIN
n := 0; itemSize := formSizes[form];
ConnectGlobalScannerToCmdParams; IF ~gScnr.done THEN Error(22); RETURN END;
gScnr.SetOpts({XU.soSkipComments, XU.soScanComments, XU.soReturnViews});
gScnr.Int(memStartAddr); IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 21); RETURN END;
gScnr.Char(c);
IF ~gScnr.done OR (c # ':') THEN SyntaxErrorAtScnrPos(gScnr.Pos() - 1, 05); RETURN END;
gScnr.Int(memData); IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 26); RETURN END;
GetTargetStateAndBreak;
Log.Ln; Log.String("writing to memory:"); Log.Ln; LogHex(memStartAddr); Log.Char(':');
BDI.writeMem(memStartAddr, memData, itemSize); OutItem(memData, form);
memAddr := memStartAddr;
LOOP
IF ~BDI.Done THEN EXIT END;
INC(n, itemSize);
IF gScnr.Next() = XU.stChar THEN
gScnr.Char(c);
IF c = '~' THEN
Log.String("~"); Log.Ln;
gScnr.Int(memAddr); IF ~gScnr.done THEN EXIT END;
gScnr.Char(c); IF ~gScnr.done OR (c # ':') THEN EXIT END;
LogHex(memAddr); Log.Char(':');
END;
END;
gScnr.Int(memData);
IF gScnr.done THEN
HALT(35);
(*
BDI.FillMem(memData, itemSize); OutItem(memData, form);
*)
ELSE
EXIT
END;
END;
Log.Ln; Log.Int(n); Log.String(" bytes written to memory");
Log.Tab; LogXo68x32SystemCmd("ReadMem");
Log.String(itemNames[itemSize]$); Log.Char(' '); LogHex(memStartAddr); Log.String(": ");
Log.Int(n DIV itemSize); LogCmdrEnd; Log.Ln;
TurnTargetToPrevState; ShowTargetState
END WriteMem;
PROCEDURE WriteReg * (regName: ARRAY OF CHAR; val: INTEGER; VAR stillOk: BOOLEAN);
(* Sets the register defined by regName to val. regName must be member of the register dictionary (module RegDict).
stillOk := stillOk & operation successful
*)
VAR
found: BOOLEAN;
BEGIN
RegDict.SelectReg(regName, found); stillOk := stillOk & found;
IF stillOk THEN
CASE RegDict.RegType() OF
| RegDict.UserReg: BDI.writeUserReg(RegDict.RegCode(), val)
| RegDict.SysReg: BDI.writeSysReg( RegDict.RegCode(), val)
| RegDict.CtrlReg: BDI.writeMem( RegDict.RegCode(), val, RegDict.RegSize())
ELSE
stillOk := FALSE
END;
stillOk := stillOk & BDI.Done
END
END WriteReg;
PROCEDURE ShowUserRegNames * ;
(** Shows the user register names in System.Log.
*)
VAR n, m: INTEGER; name: RegDict.RegName;
BEGIN
RegDict.SelectFirstReg(); Log.Ln; Log.String("user registers:");
Log.Tab; LogXo68x32SystemCmd("ReadRegister" ); Log.Ln; Log.Tab;
m := nofRegNamesPerLine;
FOR n := 0 TO RegDict.nofRegs - 1 DO
IF RegDict.RegType() = RegDict.UserReg THEN
IF m = 0 THEN Log.Ln; Log.Tab; m := nofRegNamesPerLine END;
Log.Tab; RegDict.GetRegName(name); Log.String( name$); DEC(m)
END;
RegDict.SelectNextReg()
END;
LogCmdrEnd; Log.Ln
END ShowUserRegNames;
PROCEDURE ShowSysRegNames * ;
(** Shows the system register names in System.Log.
*)
VAR n, m: INTEGER; name: RegDict.RegName;
BEGIN
RegDict.SelectFirstReg(); Log.Ln; Log.String("system registers:");
Log.Tab; LogXo68x32SystemCmd("ReadRegister" ); Log.Ln; Log.Tab;
m := nofRegNamesPerLine;
FOR n := 0 TO RegDict.nofRegs - 1 DO
IF RegDict.RegType() = RegDict.SysReg THEN
IF m = 0 THEN Log.Ln; Log.Tab; m := nofRegNamesPerLine END;
Log.Tab; RegDict.GetRegName(name); Log.String(name$); DEC(m)
END;
RegDict.SelectNextReg()
END;
LogCmdrEnd; Log.Ln
END ShowSysRegNames;
PROCEDURE ShowCtrlRegNames * ;
(** Shows the control register names in System.Log.
*)
VAR n, m: INTEGER; name: RegDict.RegName;
BEGIN
RegDict.SelectFirstReg(); Log.Ln; Log.String("control registers:");
Log.Tab; LogXo68x32SystemCmd("ReadRegister" ); Log.Ln; Log.Tab;
m := nofRegNamesPerLine;
FOR n := 0 TO RegDict.nofRegs - 1 DO
IF RegDict.RegType() = RegDict.CtrlReg THEN
IF m = 0 THEN Log.Ln; Log.Tab; m := nofRegNamesPerLine END;
Log.Tab; RegDict.GetRegName(name); Log.String(name$); DEC(m)
END;
RegDict.SelectNextReg()
END;
LogCmdrEnd; Log.Ln
END ShowCtrlRegNames;
PROCEDURE ShowRegNames * ;
(** Shows all register names in System.Log.
*)
BEGIN
Log.Ln; Log.String("Register Dictionary:" );
Log.String(" (total nr of registers: " ); Log.Int(RegDict.nofRegs); Log.Ln;
ShowUserRegNames; Log.Ln;
ShowSysRegNames; Log.Ln;
ShowCtrlRegNames; Log.Ln
END ShowRegNames;
PROCEDURE DumpRegDictionary * ;
(** Shows the content of the register dictionary (all registers with there attributes) in System.Log.
*)
VAR n: INTEGER; name: RegDict.RegName;
BEGIN
RegDict.SelectFirstReg(); Log.String("Register Dictionary Dump:" ); Log.Ln;
FOR n := 0 TO RegDict.nofRegs - 1 DO
IF RegDict.RegType() = RegDict.CtrlReg THEN
Log.Tab; RegDict.GetRegName(name); Log.String(name$); Log.Char(',');
Log.Tab; LogHex(RegDict.RegCode());
Log.String(", size=" ); Log.Int(RegDict.RegSize());
Log.String(", type=" ); Log.Int(RegDict.RegType()); Log.Ln;
END;
RegDict.SelectNextReg()
END;
Log.Ln
END DumpRegDictionary;
PROCEDURE ClearUserRegs * ;
(** Clears the user registers of the target processor (loads them with 0).
*)
VAR n: INTEGER;
BEGIN
RegDict.SelectFirstReg();
FOR n := 0 TO RegDict.nofRegs - 1 DO
IF RegDict.RegType() = RegDict.UserReg THEN BDI.writeUserReg(RegDict.RegCode(), 0) END;
RegDict.SelectNextReg()
END
END ClearUserRegs;
PROCEDURE ReadRegister * ;
(** parameters: regName {regName} "¿¿E".
Shows the contents of the registers, listed in the parameter list.
*)
VAR
regName: Name; validName: BOOLEAN;
name2: ARRAY 32 OF CHAR;
BEGIN
ConnectGlobalScannerToCmdParams; IF ~gScnr.done THEN Error(22); RETURN END;
Log.Ln; LogXo68x32SystemCmd("WriteRegister"); Log.Ln;
gScnr.Ident(name2); regName := SHORT(name2$);
IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 00); RETURN END;
GetTargetStateAndBreak;
REPEAT
WriteRegToLog(regName, validName); gScnr.Ident(name2); regName := SHORT(name2$);
UNTIL ~gScnr.done OR ~validName;
TurnTargetToPrevState;
LogCmdrEnd; Log.Ln; ShowTargetState
END ReadRegister;
PROCEDURE WriteRegister * ;
(** parameters: regAssignment {regAssignment} "¿¿E". regAssignment = regName "=" value.
Loads the listed registers with the given values.
*)
VAR
regName: Name; c: CHAR; val: INTEGER; validName: BOOLEAN;
name2: ARRAY 32 OF CHAR;
BEGIN
ConnectGlobalScannerToCmdParams; IF ~gScnr.done THEN Error(22); RETURN END;
gScnr.SetOpts({XU.soSkipComments, XU.soScanComments, XU.soReturnViews});
Log.Ln; Log.String("writing to register(s): "); LogXo68x32SystemCmd("ReadRegister"); Log.Ln;
LOOP
gScnr.Ident(name2); regName := SHORT(name2$); Log.Tab; Log.String(regName$);
RegDict.SelectReg(regName, validName);
IF ~gScnr.done OR ~validName THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 00); EXIT END;
gScnr.Char(c);
IF ~gScnr.done OR (c # '=') THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 4); EXIT END;
gScnr.Int(val);
IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 26); EXIT END;
CASE RegDict.RegType() OF
| RegDict.UserReg: BDI.writeUserReg(RegDict.RegCode(), val);
| RegDict.SysReg: BDI.writeSysReg( RegDict.RegCode(), val);
| RegDict.CtrlReg: BDI.writeMem( RegDict.RegCode(), val, RegDict.RegSize());
ELSE
Error(1);
END;
IF ~BDI.Done THEN Error(27); EXIT END;
IF gScnr.Next() # XU.stIdent THEN EXIT END
END;
LogCmdrEnd; Log.Ln; ShowTargetState
END WriteRegister;
PROCEDURE ReadMemByte * ;
(** parameters: address ":" n.
Read n bytes at address and show them in System.Log (n <= 256).
*)
BEGIN ReadMem(sfByte)
END ReadMemByte;
PROCEDURE ReadMemWord * ;
(** parameters: address ":" n.
Read n words (2 byte locations) at address and show them in System.Log (n <= 256).
Note: address must be dividable by 2, otherwise it is truncated.
*)
BEGIN ReadMem(sfShInt)
END ReadMemWord;
PROCEDURE ReadMemLong * ;
(** parameters: address ":" n.
Read n long-words (4 byte locations) at address and show them in System.Log (n <= 256).
Note: address must be dividable by 4, otherwise it is truncated.
*)
BEGIN ReadMem(sfInt)
END ReadMemLong;
PROCEDURE WriteMemByte * ;
(** parameters: address ":" value {value} "¿¿E".
Write the list of values to memory, starting at address. The size of each memory location is 1 byte.
*)
BEGIN WriteMem(sfByte)
END WriteMemByte;
PROCEDURE WriteMemWord * ;
(** parameters: address ":" value {value} "¿¿E".
Write the list of values to memory, starting at address. The size of each memory location is 1 word (2 bytes).
Note: address must be dividable by 2, otherwise it is truncated.
*)
BEGIN WriteMem(sfShInt)
END WriteMemWord;
PROCEDURE WriteMemLong * ;
(** parameters: address ":" value {value} "¿¿E".
Write the list of values to memory, starting at address. The size of each memory location is 1 long-word (4 bytes).
Note: address must be dividable by 4, otherwise it is truncated.
*)
BEGIN WriteMem(sfInt)
END WriteMemLong;
PROCEDURE ResetTarget * ;
(** Resets the target board.
*)
BEGIN
BDIMain.ConnectDevice;
Done := TRUE; firstErr := 0;
BDI.reset_target;
IF BDI.Done THEN
LogLine("Target board reset");
ELSE
LogLine("Target board reset failed");
END
END ResetTarget;
PROCEDURE ResetHost * ;
(** Resets the cross system. *)
VAR n: SHORTINT;
BEGIN
Done := TRUE; firstErr := 0;
IF (Dialog.platform >= Dialog.windows32s) & (Dialog.platform <= Dialog.windows98) THEN
Fcs := NIL
ELSE
Error(51)
END;
CRM.Clear;
LogLine("cross system reset");
itemNames[0] := "*****"; itemNames[3] := "*****";
itemNames[1] := "Byte"; itemNames[2] := "Word"; itemNames[4] := "Long";
(*OPT Structure Forms (standard types) *)
FOR n := 0 TO LEN(formSizes) - 1 DO formSizes[n] := 4 END;
formSizes[sfUndef] := 1; formSizes[sfSysByte] := 1; formSizes[sfBool] := 1; formSizes[sfShChar] := 1;
formSizes[sfByte] := 1;
formSizes[sfShInt] := 2; formSizes[sfReal] := 8; formSizes[sfString] := 1;
SystemConstantsSetUp;
END ResetHost;
PROCEDURE ResetPeripherals * ;
(** Assertion of Reset on the target board, synonymous with CPU-RESET instruction (CPU itself is not reset).
*)
BEGIN
BDIMain.ConnectDevice;
BDI.reset_peripherals; ShowTargetState
END ResetPeripherals;
PROCEDURE GetModName (VAR name: ARRAY OF CHAR);
BEGIN
name := ""; IF gScnr.Next() = XU.stIdent THEN gScnr.Ident(name) END;
END GetModName;
PROCEDURE GetMemDeviceName (VAR name: ARRAY OF CHAR; VAR end: BOOLEAN);
VAR ch: CHAR; name2: ARRAY 32 OF CHAR;
BEGIN
name[0] := nul; end := FALSE;
IF gScnr.Next() = XU.stChar THEN
gScnr.Char(ch);
IF ch = '~' THEN end := TRUE
ELSIF (ch = '/') OR (ch = '\') THEN
IF gScnr.Next() = XU.stIdent THEN
gScnr.Ident(name2); name := SHORT(name2$)
ELSE
SyntaxErrorAtScnrPos(gScnr.Pos(), 6)
END;
ELSE SyntaxErrorAtScnrPos(gScnr.Pos(), 7)
END
END
END GetMemDeviceName;
PROCEDURE LoadModules (kernelMemDeviceId: SHORTINT);
VAR
moduleName, memDeviceName: Name;
mod, memDeviceId, romDeviceId: INTEGER; end: BOOLEAN;
romBaseDmy, romSizeDmy, ramBaseDmy, ramSizeDmy: INTEGER;
BEGIN
Log.Tab; Log.String("loading modules"); Log.Ln;
CRM.Clear; Services.Collect; GetSystemConstants; CRM.Init(maxNofModules);
(*????*)
romBaseDmy := 0; romSizeDmy := MAX(INTEGER) DIV 2 + 1;
ramBaseDmy := romSizeDmy; ramSizeDmy := romSizeDmy;
CRM.InsertMemDevice("RAM", ramBaseDmy, ramSizeDmy, ramSizeDmy, ramSizeDmy, 1, 2, FALSE);
CRM.InsertMemDevice("ROM", romBaseDmy, romSizeDmy, romSizeDmy, romSizeDmy, 1, 2, TRUE);
romDeviceId := CRM.MemDeviceId("ROM");
(*
CRM.InsertTargetMemSegment(romBaseDmy, romSizeDmy, CRM.sgtAttributes, romDeviceId);
CRM.InsertTargetMemSegment(ramBaseDmy, ramSizeDmy, CRM.sgtAttributes, CRM.ramDeviceId);
*)
IF kernelMemDeviceId # CRM.ramDeviceId THEN kernelMemDeviceId := SHORT(romDeviceId) END;
CRM.LoadSysMods(kernelMemDeviceId);
ConnectGlobalScannerToCmdParams;
gScnr.SetOpts({XU.soSkipComments, XU.soScanComments, XU.soReturnViews});
LOOP
GetModName(moduleName);
IF moduleName = "" THEN EXIT END;
GetMemDeviceName(memDeviceName, end);
IF memDeviceName = "" THEN
memDeviceId := CRM.ramDeviceId
ELSE
memDeviceId := romDeviceId
END;
CRM.LoadTopMod(moduleName, SHORT(memDeviceId));
IF ~CRM.Done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 18); EXIT END;
IF end THEN EXIT END
END;
Done := Done & CRM.Done
END LoadModules;
(*
PROCEDURE EvaluateCodeVarSize;
VAR
moduleName, memDeviceName: Name;
mod, memDeviceId, romDeviceId: INTEGER; end: BOOLEAN;
romBaseDmy, romSizeDmy, ramBaseDmy, ramSizeDmy: INTEGER;
BEGIN
Log.Tab; Log.String("evaluating code & data size"); Log.Ln;
CRM.Clear; Services.Collect; GetSystemConstants; CRM.Init(maxNofModules);
romBaseDmy := 0; romSizeDmy := MAX(INTEGER) DIV 2 + 1;
ramBaseDmy := romSizeDmy; ramSizeDmy := romSizeDmy;
CRM.InsertMemDevice("RAM", ramBaseDmy, ramSizeDmy, ramSizeDmy, ramSizeDmy, 1, 2, FALSE);
CRM.InsertMemDevice("ROM", romBaseDmy, romSizeDmy, romSizeDmy, romSizeDmy, 1, 2, TRUE);
romDeviceId := CRM.MemDeviceId("ROM");
CRM.InsertTargetMemSegment(romBaseDmy, romSizeDmy, CRM.sgtAttributes, romDeviceId);
CRM.InsertTargetMemSegment(ramBaseDmy, ramSizeDmy, CRM.sgtAttributes, CRM.ramDeviceId);
IF kernelMemDeviceId # CRM.ramDeviceId THEN kernelMemDeviceId := SHORT(romDeviceId) END;
mod := CRM.ThisMod("TobKernel", kernelMemDeviceId);
IF mod = -1 THEN Error(17); RETURN END;
mod := CRM.ThisMod("To68x32Oberon", kernelMemDeviceId);
IF mod = -1 THEN Error(17); RETURN END;
ConnectGlobalScannerToCmdParams;
gScnr.SetOpts({XU.soSkipComments, XU.soScanComments, XU.soReturnViews});
LOOP
GetModName(moduleName);
IF moduleName = "" THEN EXIT END;
GetMemDeviceName(memDeviceName, end);
IF memDeviceName = "" THEN memDeviceId := CRM.ramDeviceId ELSE memDeviceId := romDeviceId END;
mod := CRM.ThisMod(moduleName, SHORT(memDeviceId));
IF mod = -1 THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 18); EXIT END;
IF end THEN EXIT END
END;
Done := Done & CRM.Done
END EvaluateCodeVarSize;
PROCEDURE SelectModules (kernelMemDeviceId: SHORTINT);
VAR
moduleName, memDeviceName: Name;
mod, memDeviceId: INTEGER; end: BOOLEAN;
BEGIN
mod := CRM.ThisMod("TobKernel", kernelMemDeviceId);
IF mod = -1 THEN Error(17); RETURN END;
mod := CRM.ThisMod("To68x32Oberon", kernelMemDeviceId);
IF mod = -1 THEN Error(17); RETURN END;
ConnectGlobalScannerToCmdParams;
gScnr.SetOpts({XU.soSkipComments, XU.soScanComments, XU.soReturnViews});
LOOP
GetModName(moduleName);
IF moduleName = "" THEN EXIT END;
GetMemDeviceName(memDeviceName, end);
IF memDeviceName = "" THEN memDeviceId := CRM.ramDeviceId
ELSE memDeviceId := CRM.MemDeviceId(memDeviceName)
END;
IF memDeviceId < 0 THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 6); EXIT END;
mod := CRM.ThisMod(moduleName, SHORT(memDeviceId));
IF mod = -1 THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 5); EXIT END;
IF end THEN EXIT END;
END;
Done := Done & CRM.Done
END SelectModules;
*)
PROCEDURE BuildTargetSystem;
VAR
name: Name;
startAdr, res: INTEGER; start: CRM.Command; segmAttr: SET;
memDevId, nofModules: INTEGER; end: BOOLEAN;
BEGIN
LogLine("building target system:"); Done := TRUE;
(* check command line syntax and memory device names *)
(* Oberon.Call("Target.DefineMemory", Oberon.Par, FALSE, res); *)
Dialog.Call("Xo68x32ImcTarget.DefineMemory", "error calling Xo68x32ImcTarget.DefineMemory", res);
IF res # 0 THEN Error(31); RETURN END;
(*
Log.String("Sys200"); Log.Bool(Done); Log.Ln;
*)
Log.String("XXX"); Log.Ln;
kernelMemDeviceId := CRM.ramDeviceId; anyCodeInRam := FALSE; anyCodeInReadOnly := FALSE;
ConnectGlobalScannerToCmdParams; nofModules := 0;
LOOP
IF ~Done THEN EXIT END;
GetModName(name);
IF name = "" THEN EXIT END;
INC(nofModules);
GetMemDeviceName(name, end);
IF end THEN EXIT END;
memDevId := CRM.ramDeviceId;
IF name # "" THEN memDevId := CRM.MemDeviceId(name) END;
IF memDevId < 0 THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 6); EXIT END;
anyCodeInRam := anyCodeInRam OR (memDevId = CRM.ramDeviceId);
IF ~anyCodeInReadOnly & (memDevId # CRM.ramDeviceId) THEN
anyCodeInReadOnly := TRUE; kernelMemDeviceId := SHORT(memDevId)
END;
END;
Done := Done & (nofModules > 0);
IF Done THEN
LoadModules(kernelMemDeviceId); CRM.EvaluateCodeAndDataSize
END;
IF Done THEN
promCodeSize := CRM.promCodeSize; ramCodeSize := CRM.ramCodeSize;
romModsVarSize := CRM.romModsVarSize + 4; ramModsVarSize := CRM.ramModsVarSize;
sysTab[CIcodeSizeRom] := CRM.promCodeSize;
sysTab[CIcodeSizeRam] := CRM.ramCodeSize;
(*
CRM.Clear; Services.Collect; CRM.Init(maxNofModules);
*)
Dialog.Call("Xo68x32ImcTarget.DefineMemory", "error calling Xo68x32ImcTarget.DefineMemory", res);
IF res # 0 THEN Error(31) END;
END;
IF Done THEN
IF anyCodeInReadOnly THEN
CRM.AllocateBlock(sysTabAdr, segmAttr, {CRM.sgtSystemConsts}, kernelMemDeviceId, sysTabSize);
IF sysTabAdr # CromBase THEN Error(32) END;
END;
CRM.AllocateBlock(sysTabAdr, segmAttr, {CRM.sgtSystemVars}, CRM.ramDeviceId, sysTabSize);
IF sysTabAdr # CramBase THEN Error(33) END;
Log.Tab; Log.String("selecting modules"); Log.Ln;
CRM.AllocateMemory
(*
SelectModules(kernelMemDeviceId);
*)
END;
IF Done THEN
Log.Ln; Log.Tab; Log.String("number of modules:"); Log.Tab; Log.Int(CRM.nofModules);
Log.Ln; Log.Tab; Log.String("size of code in ROMs:"); Log.Tab;
LogHex(sysTab[CIcodeSizeRom]); Log.Char('='); Log.Int(sysTab[CIcodeSizeRom]);
Log.Ln; Log.Tab; Log.String("size of code in RAM:"); Log.Tab;
LogHex(sysTab[CIcodeSizeRam]); Log.Char('='); Log.Int(sysTab[CIcodeSizeRam]);
Log.String(" bytes"); Log.Ln; Log.Tab; Log.String("size of glob. vars of ROM-modules:"); Log.Tab;
LogHex(romModsVarSize); Log.Char('='); Log.Int(romModsVarSize);
Log.String(" bytes"); Log.Ln; Log.Tab; Log.String("size of glob. vars of RAM-modules:"); Log.Tab;
LogHex(ramModsVarSize); Log.Char('='); Log.Int(ramModsVarSize); Log.String(" bytes");
Log.Ln;
(*
kernel := CRM.ThisLoadedModule("TobKernel"); start := 0;
IF kernel = 0 THEN start := CRM.ThisCommand(SHORT(kernel), "TargetStart") END;
IF start = 0 THEN Error(34) END;
*)
startAdr := CRM.StartAddress();
INC(VcommandAdr, CRM.VarBase(CRM.kernel))
END;
IF Done THEN
sysTab[CIsupStackOrg] := CramBase + CramSize - safetyZoneSize;
sysTab[CIstartAdr] := startAdr;
(* sysTab[CIsupStackSize] set up by SystemConstantsSetUp *)
sysTab[CIcodeBaseRom] := CromBase + sysTabSize;
sysTab[CIcodeBaseRam] := CramBase + sysTabSize + romModsVarSize;
sysTab[CIramModsVarBase] := sysTab[CIcodeBaseRam] + sysTab[CIcodeSizeRam];
sysTab[CIramModsVarSize] := ramModsVarSize;
sysTab[CIsafetyZoneVH] := sysTab[CIramModsVarBase] + ramModsVarSize;
sysTab[CIheapBase] := sysTab[CIsafetyZoneVH] + safetyZoneSize;
sysTab[CIsafetyZoneSSTop] := sysTab[CIsupStackOrg];
sysTab[CIsafetyZoneUSSS] := sysTab[CIsupStackOrg] - sysTab[CIsupStackSize] - safetyZoneSize;
(* sysTab[CIuserStackSize] set up by SystemConstantsSetUp *)
sysTab[CIuserStackOrg] := sysTab[CIsafetyZoneUSSS];
sysTab[CIsafetyZoneHUS] := sysTab[CIuserStackOrg] - sysTab[CIuserStackSize] - safetyZoneSize;
sysTab[CIheapSize] := sysTab[CIsafetyZoneHUS] - sysTab[CIheapBase];
sysTab[CInofModules] := CRM.nofModules;
END;
IF sysTab[CIheapSize] < 0 THEN Error(35) END
END BuildTargetSystem;
PROCEDURE PutModToImageFile (module: CRM.TargetModule);
VAR
blLen, offset, targAdr: INTEGER;
codeBlock: ARRAY 256 OF INTEGER;
name: Name;
BEGIN
CRM.GetModuleName(module, name);
configTextForm.WriteTab; configTextForm.WriteString(name$);
(*
hostAdr := CRM.HostCodeBase(modNr); hostEndAdr := hostAdr + CRM.TargConstBlockSize(modNr);
SYS.PUT(hostEndAdr-4, 55550000H); SYS.PUT(hostEndAdr-2, Fcs(hostAdr, hostEndAdr-2));
WHILE hostAdr < hostEndAdr DO
blSize := LEN(codeBlock)*4;
IF hostEndAdr-hostAdr < blSize THEN blSize := hostEndAdr-hostAdr END;
m := 0; blLen := blSize DIV 4;
REPEAT
SYS.GET(hostAdr, highWord); INC(hostAdr, 2); SYS.GET(hostAdr, lowWord); INC(hostAdr, 2);
codeBlock[m] := ASH(highWord, 16) + lowWord MOD 10000H; INC(m);
UNTIL m >= blLen;
ImFile.WriteDataBlock(targAdr, blLen, codeBlock);
INC(targAdr, blSize)
END;
*)
(*
CRM.PutCodeFcs(modNr);
*)
targAdr := CRM.ConstBlockBase(module);
offset := 0;
REPEAT
CRM.GetCodeBlock(module, offset, blLen, codeBlock);
ImFile.WriteDataBlock(targAdr, blLen, codeBlock);
INC(targAdr, blLen * 4); INC(offset, blLen);
UNTIL blLen < LEN(codeBlock);
IF ~ImFile.Done THEN Error(36) END
END PutModToImageFile;
PROCEDURE Build * ;
(** parameters: moduleName ["/" memDeviceName] {moduleName ["/" memDeviceName]} "¿¿E".
description: Resets the target board, selects the modules given by the parameter list and all other modules according to their import lists. It then evaluates the size of code and variables, activates Target.DefineMemory and generates for each memory component an memory image file.
The memory component RAM is the default component. All code which can be loaded into the target ram is put to file "RAM.Tim".
The command Xo68x32System.LoadRam loads this image to the target ram and brings the target into the state ready to go.
*)
VAR
mod: CRM.TargetModule;
name: Name; targAdr, nofErrorsAtBegin: INTEGER;
m, n, memDeviceId: INTEGER; codeInRam, codeInReadOnly: BOOLEAN;
memDevice: CRM.MemDevice;
BEGIN
Done := TRUE; kernelMemDeviceId := - 1;
nofErrors := 0; nofErrorsAtBegin := Errors.nofErrors;
configT := TextModels.dir.New(); configTextForm.ConnectTo(configT);
XU.Register(configT, NIL, "Tim/" + configText);
(*
OutTexts.Open(configT, configHdrText, configText);
OutTexts.ShowTextInSystemViewer(configT, "^System.Menu.Text");
Log.String("Sys100"); Log.Ln;
*)
BuildTargetSystem;
IF Done THEN
Log.Ln; Log.String("Xo68x32System: building starts"); Log.Ln;
Log.Tab; Log.Int(CRM.nofModules); Log.String(" modules will be linked"); Log.Ln;
IF CRM.nofModules > maxNofModules THEN Error(37) END;
(* enter mod in system table and log *)
mod := CRM.FirstModule(); m := 0;
WHILE mod # NIL DO
n := CIfirstModule + 3 * m;
sysTab[n] := CRM.ConstBlockBase(CRM.selectedMod);
sysTab[n + 1] := sysTab[n] + CRM.TargConstBlockSize(CRM.selectedMod);
sysTab[n + 2] := CRM.CodeBase(CRM.selectedMod);
CRM.GetModuleName(CRM.selectedMod, name);
Log.Ln; Log.String("module "); Log.String(name$); Log.Char(',');
Log.Tab; Log.String("systemTab[O+"); Log.Int(m);
memDeviceId := CRM.MemDeviceIdOfMod(CRM.selectedMod);
CRM.GetMemDevice(memDevice, memDeviceId);
Log.String("],"); Log.Tab; Log.String("memory device: "); Log.String(memDevice.name$); Log.Ln;
Log.Tab; Log.String("code:"); Log.Tab; LogHex(sysTab[n]); Log.String(" .. "); LogHex(sysTab[n + 1] - 1);
Log.Tab; Log.String("size = "); LogHex(CRM.TargConstBlockSize(CRM.selectedMod));
Log.Char('='); Log.Int(CRM.TargConstBlockSize(CRM.selectedMod));
Log.Ln; Log.Tab; Log.String("variables:"); Log.Tab; LogHex(CRM.VarBase(CRM.selectedMod));
Log.String(" .. "); LogHex(CRM.VarBase(CRM.selectedMod) + CRM.VarSize(CRM.selectedMod) - 1);
Log.Tab; Log.String("size = ");
LogHex(CRM.VarSize(CRM.selectedMod)); Log.Char('='); Log.Int(CRM.VarSize(CRM.selectedMod));
Log.Ln; Log.Tab; Log.String("body:"); Log.Tab; LogHex(sysTab[n + 2]);
Log.Ln;
INC(m); mod := CRM.NextModule()
END;
CRM.SortModsAccToMemDevices;
codeInRam := FALSE; codeInReadOnly := FALSE;
mod := CRM.FirstModule(); m := 0;
WHILE mod # NIL DO
memDeviceId := CRM.MemDeviceIdOfMod(CRM.selectedMod);
codeInRam := codeInRam OR (memDeviceId = CRM.ramDeviceId);
codeInReadOnly := codeInReadOnly OR (memDeviceId # CRM.ramDeviceId);
CRM.GetMemDevice(memDevice, memDeviceId); name := memDevice.name$;
ImFile.SetFileName(name); ImFile.OpenWrite(name$, memDeviceId);
configTextForm.WriteString("ImageFile: " + name$); configTextForm.WriteLn;
configTextForm.WriteString("Modules:");
WHILE (CRM.selectedMod # NIL) & (CRM.MemDeviceIdOfMod(CRM.selectedMod) = memDeviceId) DO
PutModToImageFile(CRM.selectedMod); INC(m); mod := CRM.NextModule()
END;
configTextForm.WriteLn;
ImFile.Close;
END;
configTextForm.WriteLn; configTextForm.WriteString("END."); configTextForm.WriteLn;
XU.Register(configT, NIL, "Tim/" + configText);
sysTab[LEN(sysTab^) - 1] := 55550000H;
(*
sysTab[LEN(sysTab^)-1] := 55550000H+LONG(Fcs(SYS.ADR(sysTab),SYS.ADR(sysTab)+sysTabSize-2)) MOD 10000H;
*)
systemParDefined := TRUE;
IF codeInReadOnly THEN targAdr := CromBase ELSE targAdr := CramBase END;
CRM.GetMemDeviceName(name, kernelMemDeviceId);
ImFile.SetFileName(name); ImFile.Append(name$);
ImFile.WriteDataBlock(targAdr, LEN(sysTab^), sysTab^);
ImFile.Close;
Log.Ln; Log.Tab; Log.String("system table put to image file: "); Log.String(name$); Log.Ln;
IF kernelMemDeviceId # CRM.ramDeviceId THEN
name := "RAM"; ImFile.SetFileName(name); ImFile.Append(name$);
IF ~ImFile.Done THEN ImFile.OpenWrite(name$, CRM.ramDeviceId) END;
ImFile.WriteDataBlock(CramBase, LEN(sysTab^), sysTab^);
IF ~ImFile.Done THEN Error(38) END;
ImFile.Close;
Log.Ln; Log.Tab; Log.String("system table put to RAM.Tim");
END;
(* CRM.CollectCodeDataRefBlks; Services.Collect; *)
END;
Log.Ln; Log.Tab; Log.String("system build completed with"); Log.Tab;
nofErrors := SHORT(Errors.nofErrors - nofErrorsAtBegin);
Log.Ln; Log.Tab; Log.Int(nofErrors); Log.String(" errors"); Log.Ln; Log.Ln
END Build;
PROCEDURE LoadRam * ;
(** Preconditions: the targets Read Only Memory Deviceonents are up to date (click on Xo68x32System.CheckReadOnlyMem)
there is an image file RAM.Tim
if neccessary, click on Xo68x32System.Build to update all images
Description: the image in file RAM.Tim is loaded to the target ram.
Postconditions: the target is ready to go: click on: Xo68x32System.TargetGo
*)
VAR
codeBlock: ARRAY 256 OF INTEGER; name: Name; adr, len: INTEGER;
res, n, dataLength, recLength, i: INTEGER;
data: ARRAY MAX_NOF_LONGS_FILL OF INTEGER;
firstAddrSet: BOOLEAN; index: INTEGER;
BEGIN
ResetTarget;
Dialog.Call("Xo68x32ImcTarget.Init", "error calling Xo68x32ImcTarget.Init", res);
IF res # 0 THEN Error(39) END;
IF ~Done OR ~BDI.Done THEN Error(40); RETURN END;
Log.Tab; Log.String("controller reset and initialised"); Log.Ln;
Log.Ln; Log.String("loading of target RAM from file ");
name := "RAM";
ImFile.SetFileName(name); ImFile.OpenRead(name$); Log.String(name$); Log.Ln;
(*
Log.String(" starts"); Log.Ln;
*)
IF COMPARE_IMAGE THEN
firstAddrSet := FALSE;
index := 0;
FOR i := 0 TO LEN(addrList) - 1 DO
addrList[i] := 0;
END
END;
REPEAT
(*
Log.String("ReadDataBlock..."); Log.Ln;
*)
ImFile.ReadDataBlock(adr, len, codeBlock);
IF COMPARE_IMAGE THEN
IF ~firstAddrSet THEN
firstAddrSet := TRUE;
END;
FOR i := 0 TO len - 1 DO
addrList[index + i] := adr + i * 4;
dataList[index + i] := codeBlock[i]
END;
END;
(*
FOR i := 0 TO len - 1 DO
Log.String("addr: "); LogHex(adr + i*4); Log.String(", val: "); LogHex(codeBlock[i]); Log.Ln;
END;
*)
IF len > 0 THEN
(*
Log.String("**Setup address: "); LogHex(adr); Log.String(", val: "); LogHex(codeBlock[0]); Log.Ln;
*)
BDI.writeMem(adr, codeBlock[0], 4)
END;
n := 1;
WHILE (n < len) & BDI.Done DO
dataLength := MAX_NOF_LONGS_FILL;
IF len - n <= MAX_NOF_LONGS_FILL THEN
dataLength := len - n
END;
FOR i := 0 TO dataLength - 1 DO
data[i] := codeBlock[n + i];
(*
Log.String("i: "); Log.Int(i); Log.String(", addr: "); LogHex(adr + n*4 + i*4);
Log.String(", val: "); LogHex(codeBlock[n + i]); Log.Ln;
*)
END;
(*
Log.String("Fill: dataLength: "); Log.Int(dataLength);
Log.String(" n: "); Log.Int(n); Log.String(" len: "); Log.Int(len); Log.Ln;
*)
INC(n, dataLength);
BDI.fillMem(data, dataLength);
END;
Log.Char('.');
index := index + len;
UNTIL ImFile.eof OR ~ImFile.Done OR ~BDI.Done;
maxDataListIndex := index;
Log.Ln;
ASSERT(ImFile.Done, 99);
ImFile.Close;
sysTab[0] := BDI.readMem(CramBase, 4); n := 1;
REPEAT
dataLength := MAX_NOF_LONGS_FILL;
IF LEN(sysTab^) - n < MAX_NOF_LONGS_FILL THEN
dataLength := LEN(sysTab^) - n
END;
(* FIXME: LEN(data) may be too long for the last dump *)
BDI.dumpMem(LEN(data), data, recLength);
(*
Log.String("Dump: recLength: "); Log.Int(recLength);
Log.String(", LEN(sysTab^): "); Log.Int(LEN(sysTab^));
Log.String(", n: "); Log.Int(n); Log.Ln;
*)
FOR i := 0 TO dataLength - 1 DO
sysTab[n + i] := data[i]
END;
INC(n, recLength)
UNTIL (n >= LEN(sysTab^)) OR ~BDI.Done;
IF ~Done THEN Error(41) END;
WriteReg("SSP", sysTab[CIsupStackOrg], Done); WriteReg("USP", sysTab[CIuserStackOrg], Done);
WriteReg("PCC", sysTab[CIstartAdr], Done); WriteReg("RPC", sysTab[CIstartAdr], Done);
WriteReg("VBR", CramBase, Done);
IF ~Done THEN Error(42)
ELSE
Log.Ln; Log.String("Xo68x32System: ram image successfully loaded"); Log.Ln;
ShowTargetState
END
END LoadRam;
(*
PROCEDURE CheckImage*;
VAR
codeBlock: ARRAY 256 OF INTEGER; name: Name;
adr, romBase, long, len: INTEGER; n, nofIMFs: SHORTINT; ch: SHORTCHAR; error, cmpOk: BOOLEAN;
BEGIN
Done := TRUE; nofIMFs := 0; Log.Ln;
romBase := TKernelConst("CromBase");
In.OpenTextFile("TargetConfig.Text");
LOOP
IF ~gScnr.done THEN Error(43); EXIT END;
REPEAT
IF gScnr.Next() = Utilities.stIdent THEN gScnr.Ident(name)
ELSE gScnr.Char(ch)
END;
UNTIL ~gScnr.done OR (name="ImageFile:") OR (name="END.");
IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 44); EXIT
ELSIF name="END." THEN EXIT END;
gScnr.Ident(name);
IF ~gScnr.done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 45); EXIT END;
Log.String("checking image file: "); Log.String(name); Log.Ln;
ImFile.OpenRead(name);
IF ~ImFile.Done THEN SyntaxErrorAtScnrPos(gScnr.Pos(), 46); EXIT END;
REPEAT
ImFile.ReadDataBlock(adr, len, codeBlock);
IF len > 0 THEN BDI.ReadMem(adr, long, 4) END;
n := 0;
WHILE (n < len) & BDI.Done & (codeBlock[n]=long) DO INC(n); BDI.DumpMem(long, 4) END;
cmpOk := (n = len) & BDI.Done;
error := ~ImFile.Done OR ~cmpOk;
UNTIL ~cmpOk OR ImFile.eof OR error;
IF (n < len) & (adr = romBase) & (len=LEN(sysTab^)) THEN
Log.String("\nsystem table at "); LogHex(adr+n*4, 0); Log.String(" has changed (might be ok)\n")
ELSIF error THEN
IF ~ImFile.Done THEN Error(47)
ELSIF ~BDI.Done THEN Error(48)
ELSE
Error(50);
Log.String("\n\tat mem loc: "); LogHex(adr+n*4, 0);
Log.String("\n\tval on target: "); LogHex(long, 0);
Log.String("\n\tval in file: "); LogHex(codeBlock[n], 0);
Log.Ln
END;
EXIT
END;
INC(nofIMFs);
END;
IF Done THEN
IF nofIMFs > 0 THEN Log.Ln; Log.Int(nofIMFs, 0); Log.String(" image file(s) checked successfully")
ELSE Error(49)
END
ELSE
Log.String("checking terminated with errror")
END;
Log.Ln
END CheckImage;
*)
PROCEDURE TargetGo * ;
(** Resumes execution of the target program at RPC
*)
BEGIN (* GetTargetState; *) BDI.go; ShowTargetState
END TargetGo;
PROCEDURE TargetBreak * ;
(** Breaks execution of the target program and enters background debug mode. Click Xo68x32System.TargetGo to carry on.
*)
BEGIN
BDI.break_;
ShowTargetState
END TargetBreak;
PROCEDURE TargetCmd * ;
(** Activates the command specified by the parameter.
Expl: Xo68x32System.TargetCmd TReflect.ChangeDot activates command ChangeDot of module TReflect on target.
*)
VAR
mod: CRM.TargetModule; cmd: CRM.Command;
name: LongName; p: INTEGER;
cmdName: ARRAY 64 OF CHAR;
name2: ARRAY 32 OF CHAR;
BEGIN
GetTargetStateAndBreak;
ConnectGlobalScannerToCmdParams;
IF gScnr.done THEN
gScnr.Ident(name2); name := SHORT(name2$);
IF ~gScnr.done THEN RETURN END;
Strings.Find(name$, ".", 0, p);
IF p = 0 THEN RETURN END;
Log.String("target cmd: "); Log.String(name$);
Strings.Extract(name$, p + 1, LEN(name$) - p - 1, cmdName);
name[p] := 0X;
mod := CRM.ThisLoadedModule(name); cmd := 0;
IF mod # NIL THEN cmd := CRM.ThisCommand(mod, SHORT(cmdName$)) END;
IF cmd # 0 THEN
Log.String(" ["); LogHex(cmd); Log.Char('['); Log.Ln;
BDI.writeMem(VcommandAdr, cmd, 4);
TargetGo;
ELSE
Log.String(" not found");
END;
Log.Ln;
END;
TurnTargetToPrevState
END TargetCmd;
(* Execute after LoadRam to compare the Image and the downloaded data from the mc *)
PROCEDURE CompareImage * ;
VAR
startIndex, i, memData, recLength, oldAddr: INTEGER;
data: ARRAY MAX_NOF_LONGS_FILL OF INTEGER;
sameAddress: BOOLEAN;
PROCEDURE LogListError (pos, addr, dataList, dataMC: INTEGER);
BEGIN
Log.String(" at "); Log.Int(pos); Log.String(", addr: "); Log.IntForm(addr, Log.hexadecimal, 8, ' ', FALSE);
Log.String(", dataList: "); Log.IntForm(dataList, Log.hexadecimal, 8, ' ', FALSE);
Log.String(", MC: "); Log.IntForm(dataMC, Log.hexadecimal, 8, ' ', FALSE); Log.Ln;
END LogListError;
BEGIN
IF ~COMPARE_IMAGE THEN
Log.String("set constant COMPARE_IMAGE to TRUE first"); Log.Ln; RETURN;
END;
Log.String("CompareImage start"); Log.Ln;
startIndex := 0;
WHILE startIndex < maxDataListIndex DO
memData := BDI.readMem(addrList[startIndex], 4);
IF memData # dataList[startIndex] THEN
Log.String("ERROR");
LogListError(0, addrList[startIndex], dataList[startIndex], memData);
END;
BDI.dumpMem(LEN(data), data, recLength);
(* Log.String("recLength: "); Log.Int(recLength); Log.Ln; *)
i := 1; sameAddress := TRUE; oldAddr := addrList[startIndex + i] - 4;
WHILE (i <= recLength) & (sameAddress) DO
IF dataList[startIndex + i] # data[i - 1] THEN
Log.String("ERROR: ");
LogListError(startIndex + i, addrList[startIndex + i], dataList[startIndex + i], data[i - 1]);
END;
(* Log.String("addrList[startIndex + i] "); Log.Int(addrList[startIndex + i]);
Log.String(", (oldAddr + 4)"); Log.Int((oldAddr + 4)); Log.Ln; *)
IF addrList[startIndex + i] # (oldAddr + 4) THEN
sameAddress := FALSE
ELSE
oldAddr := addrList[startIndex + i];
INC(i);
END;
END;
startIndex := startIndex + i;
END;
Log.String("CompareImage done"); Log.Ln;
END CompareImage;
BEGIN
Log.Ln; Log.String(signOnMsg); Log.Ln; ResetHost;
END Xo68x32System.