git-svn-id: https://svn.code.sf.net/p/libusbjava/code/trunk@96 94ad28fe-ef68-46b1-9651-e7ae4fcf1c4c
191 lines
4.7 KiB
Plaintext
191 lines
4.7 KiB
Plaintext
|
|
MODULE XoppcTrgtRegDict;
|
|
(** © ProXon/ED 3.9.94 / 22.11.98 / 4.12.00 / 14.2.02 | *)
|
|
(** target register operations*)
|
|
IMPORT
|
|
XE := XdeErrors, XU := XdeUtilities, BDI := UsbBDI555, Log := StdLog;
|
|
|
|
CONST
|
|
errPrefix = "RegDir_"; regDictPath = "Xoppc/Rsrc/RegisterDictionary.odc";
|
|
|
|
TYPE
|
|
RegName* = ARRAY 8 OF CHAR;
|
|
RegDesc = RECORD
|
|
type: RegName;
|
|
size: INTEGER;
|
|
END;
|
|
|
|
VAR
|
|
Done-: BOOLEAN; (** previous operation successfully completed *)
|
|
firstErr-: SHORTINT; (** first error occured, see error list at the end of this module *)
|
|
|
|
regTypeTab: ARRAY 8 OF RegDesc;
|
|
curReg, curRegCode, regTextPos: INTEGER; curRegName: RegName; curRegType: RegName;
|
|
regScn: XU.Scanner;
|
|
fprMoveAddr*: INTEGER;
|
|
|
|
PROCEDURE ClearRegAttr;
|
|
BEGIN
|
|
curReg := 0; curRegCode := 0; regTextPos := 0;
|
|
curRegType := regTypeTab[0].type; curRegName := ""
|
|
END ClearRegAttr;
|
|
|
|
PROCEDURE Error (errNr: SHORTINT);
|
|
BEGIN
|
|
IF Done THEN firstErr := errNr; Done := FALSE END;
|
|
XE.Error("", errPrefix, errNr, TRUE);
|
|
ClearRegAttr
|
|
END Error;
|
|
|
|
PROCEDURE LogInt (val: INTEGER);
|
|
BEGIN
|
|
Log.Int(val)
|
|
END LogInt;
|
|
|
|
PROCEDURE LogHex (val: INTEGER);
|
|
BEGIN
|
|
Log.Char('0'); Log.IntForm(val MOD 100000000L, Log.hexadecimal, 1, ' ', Log.hideBase); Log.Char('H')
|
|
END LogHex;
|
|
|
|
PROCEDURE SelectRegEntry;
|
|
BEGIN
|
|
curReg := 0;
|
|
WHILE (curReg < LEN(regTypeTab)) & (regTypeTab[curReg].type # curRegType) DO
|
|
INC(curReg)
|
|
END;
|
|
IF curReg >= LEN(regTypeTab) THEN Error(6) END
|
|
END SelectRegEntry;
|
|
|
|
PROCEDURE SelectNextReg * ;
|
|
VAR ch: CHAR;
|
|
BEGIN
|
|
regScn.Ident(curRegName); regTextPos := regScn.start;
|
|
regScn.Ident(curRegType);
|
|
regScn.Int(curRegCode); regScn.Char(ch);
|
|
IF ~regScn.done THEN
|
|
IF regScn.eot THEN
|
|
Done := FALSE; ClearRegAttr
|
|
ELSE
|
|
Error(8)
|
|
END
|
|
ELSIF ch # ';' THEN
|
|
Error(8)
|
|
ELSE
|
|
SelectRegEntry
|
|
END
|
|
END SelectNextReg;
|
|
|
|
PROCEDURE SelectFirstReg * ;
|
|
BEGIN
|
|
IF ~Done THEN
|
|
XU.GetScanner(regDictPath, regScn); Done := TRUE;
|
|
END;
|
|
regScn.SetPos(0); SelectNextReg
|
|
END SelectFirstReg;
|
|
|
|
PROCEDURE SelectReg * (IN name: ARRAY OF CHAR; OUT found: BOOLEAN);
|
|
BEGIN
|
|
SelectFirstReg;
|
|
WHILE Done & (name # curRegName) DO SelectNextReg END;
|
|
found := Done
|
|
END SelectReg;
|
|
|
|
PROCEDURE LogRegs * ;
|
|
BEGIN
|
|
SelectFirstReg;
|
|
WHILE Done DO
|
|
SelectNextReg;
|
|
Log.String(curRegName); Log.Tab; Log.String(curRegType); Log.Tab;
|
|
Log.Int(curRegCode); Log.Tab; Log.Int(regTextPos); Log.Ln
|
|
END
|
|
END LogRegs;
|
|
|
|
PROCEDURE ReadReg * (IN regName: ARRAY OF CHAR; OUT regVal: LONGINT; OUT size: INTEGER; OUT done: BOOLEAN);
|
|
BEGIN
|
|
Done := TRUE; done := TRUE;
|
|
IF curRegName # regName THEN SelectReg(regName, done) END;
|
|
IF done THEN
|
|
size := regTypeTab[curReg].size;
|
|
CASE curReg OF
|
|
| 0:
|
|
regVal := BDI.readGPR(curRegCode);
|
|
| 1:
|
|
regVal := BDI.readGPR(curRegCode);
|
|
| 2:
|
|
regVal := BDI.readSPR(curRegCode);
|
|
| 3:
|
|
regVal := BDI.readMSR();
|
|
| 4:
|
|
regVal := BDI.readFPR(curRegCode, fprMoveAddr);
|
|
| 5:
|
|
regVal := BDI.readCR();
|
|
| 6:
|
|
regVal := BDI.readFPSCR();
|
|
| 7:
|
|
regVal := BDI.readMem(curRegCode, 4);
|
|
END;
|
|
done := BDI.Done
|
|
END
|
|
END ReadReg;
|
|
|
|
PROCEDURE WriteReg * (IN regName: ARRAY OF CHAR; regVal: INTEGER; OUT done: BOOLEAN);
|
|
BEGIN
|
|
Done := TRUE; done := TRUE;
|
|
IF curRegName # regName THEN SelectReg(regName, done) END;
|
|
IF done THEN
|
|
CASE curReg OF
|
|
| 0:
|
|
BDI.writeGPR(curRegCode, regVal);
|
|
| 1:
|
|
BDI.writeGPR(curRegCode, regVal);
|
|
| 2:
|
|
BDI.writeSPR(curRegCode, regVal);
|
|
| 3:
|
|
BDI.writeMSR(regVal);
|
|
| 4:
|
|
BDI.writeFPR(curRegCode, fprMoveAddr, regVal);
|
|
| 5:
|
|
BDI.writeCR(regVal);
|
|
| 6:
|
|
BDI.writeFPSCR(regVal);
|
|
| 7:
|
|
BDI.writeMem(curRegCode, regVal, 4);
|
|
END;
|
|
done := BDI.Done
|
|
END
|
|
END WriteReg;
|
|
|
|
PROCEDURE Clear * ;
|
|
VAR n: INTEGER;
|
|
BEGIN
|
|
Done := TRUE; firstErr := 0;
|
|
FOR n := 0 TO LEN(regTypeTab) - 1 DO
|
|
regTypeTab[0].type := "???"; regTypeTab[0].size := 4;
|
|
END
|
|
END Clear;
|
|
|
|
PROCEDURE Init;
|
|
BEGIN
|
|
Clear;
|
|
(*__ setup stub reg type *)
|
|
regTypeTab[0].type := "???"; regTypeTab[0].size := 4;
|
|
ClearRegAttr;
|
|
|
|
(*__ setup register types *)
|
|
regTypeTab[1].type := "GPR"; regTypeTab[1].size := 4;
|
|
regTypeTab[2].type := "SPR"; regTypeTab[2].size := 4;
|
|
regTypeTab[3].type := "MSR"; regTypeTab[3].size := 4;
|
|
regTypeTab[4].type := "FPR"; regTypeTab[4].size := 8;
|
|
regTypeTab[5].type := "CR"; regTypeTab[5].size := 4;
|
|
regTypeTab[6].type := "FPSCR"; regTypeTab[6].size := 4;
|
|
regTypeTab[7].type := "CtrlReg"; regTypeTab[7].size := 4;
|
|
XU.GetScanner(regDictPath, regScn);
|
|
IF ~regScn.done THEN Error(3) END
|
|
END Init;
|
|
|
|
|
|
BEGIN
|
|
Init
|
|
END XoppcTrgtRegDict.
|
|
|