Auslesen des internen ROM's und einfacher Disassembler mit Arduino UNO
Das Auslesen des internen ROM's ist eine der Standardübungen für den fortgeschrittenen Sharp-Pocket-Computer Programmierer.
Bei Pocket Computern mit der CPU SC61860 liegt in den ersten 8192 Speicherstellen das sogenannte interne ROM, das direkt in die CPU integriert ist.
Es lässt sich mit dem Basicbefehl PEEK jedoch nicht auslesen, sondern nur mit dem Maschinenbefehl DATA (Opcode 53).
Das hier vorgestellte Beispiel liest das interne ROM aus und überträgt es über zwei Pins der 11-poligen Schnittstelle an einen Arduino.
Im Arduino Programm ist noch ein einfacher Disassembler eingebaut, der die Opcodes der Maschinensprache in Mnemonics übersetzt.
Hardwaremäßig sind lediglich drei Verbindungskabel und zwei pull-down Widerstände bei den Datenleitungen erforderlich.
Im folgenden sind Beispielprogramme für die seinerzeit sehr populären Pocket Computer PC-1401 und PC-1403 wiedergegeben.
Beim ersten Aufruf muß das Programm mit RUN gestartet werden, um das Maschinenprogramm in den Speicher zu übertragen.
Das eigentliche Auslesen des internen ROM's und die Datenübertragung werden danach und in der Folge mit DEF A gestartet.
Das Arduino Programm bleibt für beide Pocket Computer das gleiche, die Ausgabe erfolgt z.B. über den Serial Monitor der Arduino IDE.
Die Übertragung und Disassemblierung der 8192 Bytes dauert ca. 20 Sekunden.
Programm für Sharp PC-1401:
10:RESTORE
20:FOR X=0 TO 42
30:READ A
40:POKE &4100+X,A
50:NEXT X
60:END
100:"A" PRINT "START"
110:CALL &4100
120:END
200:DATA 2,0,3,0,0,0,140,53,52
210:DATA 2,1,140,198,18,94,56,3,97,2,97,1,95,206,96,0,95,209,90
220:DATA 43,18,91,78,100,66,43,29
230:DATA 194,131,99,32,41,35,55
Pinbelegung
Arduino UNO Pin
Name
11-pol. Schnittstelle Sharp PC-1401
GND
GND
Pin 3
D9 (Input)
Busy
Pin 4 (Takt)
D8 (Input)
Dout
Pin 5 (Daten)
Maschinenprogramm für PC-1401
&4100:
002
000
LIA
0
003
000
LIB
0
000
000
LII
0
140
LP12
<
─
─
┬
┐
053
DATA
│
│
052
PUSH
│
│
002
001
LIA
1
│
│
140
LP12
<
─
┐
│
│
198
TSMA
│
│
│
018
094
LIP
94
│
│
│
056
003
JRZP
3
─
┐
│
│
│
097
002
ORIM
2
│
│
│
│
097
001
ORIM
1
<
┘
│
│
│
095
OUTF
│
│
│
206
NOPT
│
│
│
096
000
ANIM
0
│
│
│
095
OUTF
│
│
│
209
RC
│
│
│
090
SL
│
│
│
043
018
JRNCM
18
─
─
┘
│
│
091
POP
│
│
078
100
WAIT
100
│
│
066
INCA
│
│
043
029
JRNCM
29
─
─
─
┘
│
194
INCB
│
131
LP3
│
099
032
CPIM
32
│
041
035
JRNZM
35
─
─
─
─
┘
055
RTN
Programm für Sharp PC-1403:
10:RESTORE
20:FOR X=0 TO 44
30:READ A
40:POKE &E678+X,A
50:NEXT X
60:END
100:"A" PRINT "START"
110:CALL &E678
120:END
200:DATA 16,58,0,2,0,82,3,0,0,0,140,53,52
210:DATA 2,1,140,198,56,4,213,3,206,213,1,206,212,0,206,209,90
220:DATA 43,16,91,78,250,66,43,27
230:DATA 194,131,99,32,41,33,55
Pinbelegung
Arduino UNO Pin
Name
11-pol. Schnittstelle Sharp PC-1403
GND
GND
Pin 3
D9 (Input)
Port Ext1
Pin 11 (Takt)
D8 (Input)
Port Ext2
Pin 10 (Daten)
Maschinenprogramm für PC-1403
&E678:
016
058
000
LIDP
14848
002
000
LIA
0
082
STD
003
000
LIB
0
000
000
LII
0
140
LP12
<
─
─
┬
┐
053
DATA
│
│
052
PUSH
│
│
002
001
LIA
1
│
│
140
LP12
<
─
┐
│
│
198
TSMA
│
│
│
056
004
JRZP
4
─
┐
│
│
│
213
003
ORID
3
│
│
│
│
206
NOPT
│
│
│
│
213
001
ORID
1
<
┘
│
│
│
206
NOPT
│
│
│
212
000
ANID
0
│
│
│
206
NOPT
│
│
│
209
RC
│
│
│
090
SL
│
│
│
043
016
JRNCM
16
─
─
┘
│
│
091
POP
│
│
078
250
WAIT
250
│
│
066
INCA
│
│
043
027
JRNCM
27
─
─
─
┘
│
194
INCB
│
131
LP3
│
099
032
CPIM
32
│
041
033
JRNZM
33
─
─
─
─
┘
055
RTN
Programm für Arduino:
// IntROM fuer Arduino UNO
// Auslesen des internen ROMs von Sharp Pocket Computern mit CPU SC61860
const int IN_Daten = 8; // Daten, Arduino Pin D8
// PC-1401: pin 5 (Dout) der 11-pol. Schnittstelle
// PC-1403: pin 10 (EXT2) der 11-pol. Schnittstelle
const int IN_Takt = 9; // Takt, Arduino Pin D9
// PC-1401: pin 4 (Busy) der 11-pol. Schnittstelle
// PC-1403: pin 11 (EXT1) der 11-pol. Schnittstelle
boolean Busy;
int DataBit;
int DataByte;
int i;
int iPC;
int iJP;
int iAnz;
int iDTJ;
int iPTJ;
int iAdrAnz;
int iHiByte;
long longAdresse;
unsigned long longTimer = 0;
char charMCode[7]; // Zum speichern der Maschinen Befehle des Sharp PC
void setup() {
Serial.begin(57600); // langsamer geht nicht
pinMode(IN_Daten, INPUT);
pinMode(IN_Takt, INPUT);
Serial.println();
Serial.println("START");
resetValues();
}
void loop() {
if ((millis() - longTimer) > 100) {
resetValues();
}
Busy = digitalRead(IN_Takt);
if (Busy) { // Data valid
DataByte = 0;
for (i=0;i<8;i++) {
do {
Busy = digitalRead(IN_Takt);
} while (!Busy);
DataBit = digitalRead(IN_Daten);
DataByte = DataByte | (DataBit << i);
do {
Busy = digitalRead(IN_Takt);
} while (Busy);
}
Serial.print(iPC);
Serial.print(";");
Serial.print(DataByte);
if (iAnz==1){
Serial.print(";");
getMCode();
Serial.println(charMCode);
if (DataByte > 223) { // CALn m
iHiByte = DataByte - 224;
}
}
else {
if (iHiByte>-1) {
longAdresse = long(iHiByte) * 256 + DataByte;
iHiByte = -1;
Serial.print(";->;");
Serial.print(longAdresse);
}
if (iAnz == 3) {
iHiByte = DataByte;
}
if (iAnz > 4) { // nur bei DTJ
if (((iAnz + 1) % 3)==0) { // Ermittlung der bedingten Sprungadressen
iHiByte = DataByte;
}
}
if (iJP==2) { // relativer Sprung in positive Richtung
iJP = 0;
Serial.print(";->;");
Serial.print(iPC+DataByte);
}
if (iJP==(-2)) { // relativer Sprung in negative Richtung
iJP = 0;
Serial.print(";->;");
Serial.print(iPC-DataByte);
}
iAnz--;
Serial.println();
}
if (iPTJ==2) {
iPTJ = 0;
iAdrAnz = DataByte;
}
if (iPTJ==1) {
iPTJ++;
}
if (iDTJ==1) {
iDTJ = 0;
iAnz = iAdrAnz * 3 + 3; // 3 Byte pro bedingtem Sprung
iAdrAnz = 0;
}
if (iJP!=0) {
iJP = iJP + iJP;
}
longTimer = millis();
iPC++;
}
if (iPC > 8191) {
Serial.print("END");
iPC = 0;
}
} // Ende loop
void resetValues() {
iPC = 0;
iJP = 0;
iPTJ = 0;
iDTJ = 0;
iHiByte = -1;
iAnz = 1;
}
void getMCode() {
charMCode[0] = 0;
switch (DataByte) {
case 0: strcpy(charMCode, "LII"); iAnz=2; break; // LII n
case 1: strcpy(charMCode, "LIJ"); iAnz=2; break; // LIJ n
case 2: strcpy(charMCode, "LIA"); iAnz=2; break; // LIA n
case 3: strcpy(charMCode, "LIB"); iAnz=2; break; // LIB n
case 4: strcpy(charMCode, "IX"); iAnz=1; break; // IX
case 5: strcpy(charMCode, "DX"); iAnz=1; break; // DX
case 6: strcpy(charMCode, "IY"); iAnz=1; break; // IY
case 7: strcpy(charMCode, "DY"); iAnz=1; break; // DY
case 8: strcpy(charMCode, "MVW"); iAnz=1; break; // MVW
case 9: strcpy(charMCode, "EXW"); iAnz=1; break; // EXW
case 10: strcpy(charMCode, "MVB"); iAnz=1; break; // MVB
case 11: strcpy(charMCode, "EXB"); iAnz=1; break; // EXB
case 12: strcpy(charMCode, "ADN"); iAnz=1; break; // ADN
case 13: strcpy(charMCode, "SBN"); iAnz=1; break; // SBN
case 14: strcpy(charMCode, "ADW"); iAnz=1; break; // ADW
case 15: strcpy(charMCode, "SBW"); iAnz=1; break; // SBW
case 16: strcpy(charMCode, "LIDP"); iAnz=3; break; // LIDP n m
case 17: strcpy(charMCode, "LIDL"); iAnz=2; break; // LIDL n
case 18: strcpy(charMCode, "LIP"); iAnz=2; break; // LIP n
case 19: strcpy(charMCode, "LIQ"); iAnz=2; break; // LIQ n
case 20: strcpy(charMCode, "ADB"); iAnz=1; break; // ADB
case 21: strcpy(charMCode, "SBB"); iAnz=1; break; // SBB
case 22: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 23: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 24: strcpy(charMCode, "MVWD"); iAnz=1; break; // MVWD
case 25: strcpy(charMCode, "EXWD"); iAnz=1; break; // EXWD
case 26: strcpy(charMCode, "MVBD"); iAnz=1; break; // MVBD
case 27: strcpy(charMCode, "EXBD"); iAnz=1; break; // EXBD
case 28: strcpy(charMCode, "SRW"); iAnz=1; break; // SRW
case 29: strcpy(charMCode, "SLW"); iAnz=1; break; // SLW
case 30: strcpy(charMCode, "FILM"); iAnz=1; break; // FILM
case 31: strcpy(charMCode, "FILD"); iAnz=1; break; // FILD
case 32: strcpy(charMCode, "LDP"); iAnz=1; break; // LDP
case 33: strcpy(charMCode, "LDQ"); iAnz=1; break; // LDQ
case 34: strcpy(charMCode, "LDR"); iAnz=1; break; // LDR
case 35: strcpy(charMCode, "RA"); iAnz=1; break; // RA
case 36: strcpy(charMCode, "IXL"); iAnz=1; break; // IXL
case 37: strcpy(charMCode, "DXL"); iAnz=1; break; // DXL
case 38: strcpy(charMCode, "IYS"); iAnz=1; break; // IYS
case 39: strcpy(charMCode, "DYS"); iAnz=1; break; // DYS
case 40: strcpy(charMCode, "JRNZP"); iAnz=2; iJP=1; break; // JRNZP n
case 41: strcpy(charMCode, "JRNZM"); iAnz=2; iJP=-1; break; // JRNZM n
case 42: strcpy(charMCode, "JRNCP"); iAnz=2; iJP=1; break; // JRNCP n
case 43: strcpy(charMCode, "JRNCM"); iAnz=2; iJP=-1; break; // JRNCM n
case 44: strcpy(charMCode, "JRP"); iAnz=2; iJP=1; break; // JRP n
case 45: strcpy(charMCode, "JRM"); iAnz=2; iJP=-1; break; // JRM n
case 46: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 47: strcpy(charMCode, "LOOP"); iAnz=2; break; // LOOP n
case 48: strcpy(charMCode, "STP"); iAnz=1; break; // STP
case 49: strcpy(charMCode, "STQ"); iAnz=1; break; // STQ
case 50: strcpy(charMCode, "STR"); iAnz=1; break; // STR
case 51: strcpy(charMCode, "STH??"); iAnz=1; break; // STH??
case 52: strcpy(charMCode, "PUSH"); iAnz=1; break; // PUSH
case 53: strcpy(charMCode, "DATA"); iAnz=1; break; // DATA
case 54: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 55: strcpy(charMCode, "RTN"); iAnz=1; break; // RTN
case 56: strcpy(charMCode, "JRZP"); iAnz=2; iJP=1; break; // JRZP n
case 57: strcpy(charMCode, "JRZM"); iAnz=2; iJP=-1; break; // JRZM n
case 58: strcpy(charMCode, "JRCP"); iAnz=2; iJP=1; break; // JRCP n
case 59: strcpy(charMCode, "JRCM"); iAnz=2; iJP=-1; break; // JRCM n
case 60: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 61: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 62: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 63: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 64: strcpy(charMCode, "INCI"); iAnz=1; break; // INCI
case 65: strcpy(charMCode, "DECI"); iAnz=1; break; // DECI
case 66: strcpy(charMCode, "INCA"); iAnz=1; break; // INCA
case 67: strcpy(charMCode, "DECA"); iAnz=1; break; // DECA
case 68: strcpy(charMCode, "ADM"); iAnz=1; break; // ADM
case 69: strcpy(charMCode, "SBM"); iAnz=1; break; // SBM
case 70: strcpy(charMCode, "ANMA"); iAnz=1; break; // ANMA
case 71: strcpy(charMCode, "ORMA"); iAnz=1; break; // ORMA
case 72: strcpy(charMCode, "INCK"); iAnz=1; break; // INCK
case 73: strcpy(charMCode, "DECK"); iAnz=1; break; // DECK
case 74: strcpy(charMCode, "INCM"); iAnz=1; break; // INCM
case 75: strcpy(charMCode, "DECM"); iAnz=1; break; // DECM
case 76: strcpy(charMCode, "INA"); iAnz=1; break; // INA
case 77: strcpy(charMCode, "NOPW"); iAnz=1; break; // NOPW
case 78: strcpy(charMCode, "WAIT"); iAnz=2; break; // WAIT n
case 79: strcpy(charMCode, "WAITIL"); iAnz=1; break; // WAITIL
case 80: strcpy(charMCode, "INCP"); iAnz=1; break; // INCP
case 81: strcpy(charMCode, "DECP"); iAnz=1; break; // DECP
case 82: strcpy(charMCode, "STD"); iAnz=1; break; // STD
case 83: strcpy(charMCode, "MVDM"); iAnz=1; break; // MVDM
case 84: strcpy(charMCode, "READM");iAnz=1; break; // READM
case 85: strcpy(charMCode, "MVMD"); iAnz=1; break; // MVMD
case 86: strcpy(charMCode, "READA"); iAnz=1; break; // READA
case 87: strcpy(charMCode, "LDD"); iAnz=1; break; // LDD
case 88: strcpy(charMCode, "SWP"); iAnz=1; break; // SWP
case 89: strcpy(charMCode, "LDM"); iAnz=1; break; // LDM
case 90: strcpy(charMCode, "SL"); iAnz=1; break; // SL
case 91: strcpy(charMCode, "POP"); iAnz=1; break; // POP
case 92: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 93: strcpy(charMCode, "OUTA"); iAnz=1; break; // OUTA
case 94: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 95: strcpy(charMCode, "OUTF"); iAnz=1; break; // OUTF
case 96: strcpy(charMCode, "ANIM"); iAnz=2; break; // ANIM n
case 97: strcpy(charMCode, "ORIM"); iAnz=2; break; // ORIM n
case 98: strcpy(charMCode, "TSIM"); iAnz=2; break; // TSIM n
case 99: strcpy(charMCode, "CPIM"); iAnz=2; break; // CPIM n
case 100: strcpy(charMCode, "ANIA"); iAnz=2; break; // ANIA n
case 101: strcpy(charMCode, "ORIA"); iAnz=2; break; // ORIA n
case 102: strcpy(charMCode, "TSIA"); iAnz=2; break; // TSIA n
case 103: strcpy(charMCode, "CPIA"); iAnz=2; break; // CPIA n
case 104: strcpy(charMCode, "NOPT??"); iAnz=1; break; // NOPT??
case 105: strcpy(charMCode, "DTJ"); iAnz=1; iDTJ=1; break; // DTJ
case 106: strcpy(charMCode, "NOPT??"); iAnz=1; break; // NOPT??
case 107: strcpy(charMCode, "TEST"); iAnz=2; break; // TEST n
case 108: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 109: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 110: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 111: strcpy(charMCode, "WAITIH"); iAnz=1; break; // WAITIH
case 112: strcpy(charMCode, "ADIM"); iAnz=2; break; // ADIM n
case 113: strcpy(charMCode, "SBIM"); iAnz=2; break; // SBIM n
case 114: strcpy(charMCode, "LIIH??"); iAnz=2; break; // LIIH n??
case 115: strcpy(charMCode, "LIIH??"); iAnz=2; break; // LIIH n??
case 116: strcpy(charMCode, "ADIA"); iAnz=2; break; // ADIA n
case 117: strcpy(charMCode, "SBIA"); iAnz=2; break; // SBIA n
case 118: strcpy(charMCode, "LIIH??"); iAnz=2; break; // LIIH n??
case 119: strcpy(charMCode, "LIIH??"); iAnz=2; break; // LIIH n??
case 120: strcpy(charMCode, "CALL"); iAnz=3; break; // CALL n m
case 121: strcpy(charMCode, "JP"); iAnz=3; break; // JP n m
case 122: strcpy(charMCode, "PTJ"); iAnz=4; iPTJ=1; break; // PTJ i n m
case 123: strcpy(charMCode, "HALT??"); iAnz=1; break; // HALT??
case 124: strcpy(charMCode, "JPNZ"); iAnz=3; break; // JPNZ n m
case 125: strcpy(charMCode, "JPNC"); iAnz=3; break; // JPNC n m
case 126: strcpy(charMCode, "JPZ"); iAnz=3; break; // JPZ n m
case 127: strcpy(charMCode, "JPC"); iAnz=3; break; // JPC n m
case 128: strcpy(charMCode, "LP00"); iAnz=1; break; // LP0
case 129: strcpy(charMCode, "LP01"); iAnz=1; break; // LP1
case 130: strcpy(charMCode, "LP02"); iAnz=1; break; // LP2
case 131: strcpy(charMCode, "LP03"); iAnz=1; break; // LP3
case 132: strcpy(charMCode, "LP04"); iAnz=1; break; // LP4
case 133: strcpy(charMCode, "LP05"); iAnz=1; break; // LP5
case 134: strcpy(charMCode, "LP06"); iAnz=1; break; // LP6
case 135: strcpy(charMCode, "LP07"); iAnz=1; break; // LP7
case 136: strcpy(charMCode, "LP08"); iAnz=1; break; // LP8
case 137: strcpy(charMCode, "LP09"); iAnz=1; break; // LP9
case 138: strcpy(charMCode, "LP10"); iAnz=1; break; // LP10
case 139: strcpy(charMCode, "LP11"); iAnz=1; break; // LP11
case 140: strcpy(charMCode, "LP12"); iAnz=1; break; // LP12
case 141: strcpy(charMCode, "LP13"); iAnz=1; break; // LP13
case 142: strcpy(charMCode, "LP14"); iAnz=1; break; // LP14
case 143: strcpy(charMCode, "LP15"); iAnz=1; break; // LP15
case 144: strcpy(charMCode, "LP16"); iAnz=1; break; // LP16
case 145: strcpy(charMCode, "LP17"); iAnz=1; break; // LP17
case 146: strcpy(charMCode, "LP18"); iAnz=1; break; // LP18
case 147: strcpy(charMCode, "LP19"); iAnz=1; break; // LP19
case 148: strcpy(charMCode, "LP20"); iAnz=1; break; // LP20
case 149: strcpy(charMCode, "LP21"); iAnz=1; break; // LP21
case 150: strcpy(charMCode, "LP22"); iAnz=1; break; // LP22
case 151: strcpy(charMCode, "LP23"); iAnz=1; break; // LP23
case 152: strcpy(charMCode, "LP24"); iAnz=1; break; // LP24
case 153: strcpy(charMCode, "LP25"); iAnz=1; break; // LP25
case 154: strcpy(charMCode, "LP26"); iAnz=1; break; // LP26
case 155: strcpy(charMCode, "LP27"); iAnz=1; break; // LP27
case 156: strcpy(charMCode, "LP28"); iAnz=1; break; // LP28
case 157: strcpy(charMCode, "LP29"); iAnz=1; break; // LP29
case 158: strcpy(charMCode, "LP30"); iAnz=1; break; // LP30
case 159: strcpy(charMCode, "LP31"); iAnz=1; break; // LP31
case 160: strcpy(charMCode, "LP32"); iAnz=1; break; // LP32
case 161: strcpy(charMCode, "LP33"); iAnz=1; break; // LP33
case 162: strcpy(charMCode, "LP34"); iAnz=1; break; // LP34
case 163: strcpy(charMCode, "LP35"); iAnz=1; break; // LP35
case 164: strcpy(charMCode, "LP36"); iAnz=1; break; // LP36
case 165: strcpy(charMCode, "LP37"); iAnz=1; break; // LP37
case 166: strcpy(charMCode, "LP38"); iAnz=1; break; // LP38
case 167: strcpy(charMCode, "LP39"); iAnz=1; break; // LP39
case 168: strcpy(charMCode, "LP40"); iAnz=1; break; // LP40
case 169: strcpy(charMCode, "LP41"); iAnz=1; break; // LP41
case 170: strcpy(charMCode, "LP42"); iAnz=1; break; // LP42
case 171: strcpy(charMCode, "LP43"); iAnz=1; break; // LP43
case 172: strcpy(charMCode, "LP44"); iAnz=1; break; // LP44
case 173: strcpy(charMCode, "LP45"); iAnz=1; break; // LP45
case 174: strcpy(charMCode, "LP46"); iAnz=1; break; // LP46
case 175: strcpy(charMCode, "LP47"); iAnz=1; break; // LP47
case 176: strcpy(charMCode, "LP48"); iAnz=1; break; // LP48
case 177: strcpy(charMCode, "LP49"); iAnz=1; break; // LP49
case 178: strcpy(charMCode, "LP50"); iAnz=1; break; // LP50
case 179: strcpy(charMCode, "LP51"); iAnz=1; break; // LP51
case 180: strcpy(charMCode, "LP52"); iAnz=1; break; // LP52
case 181: strcpy(charMCode, "LP53"); iAnz=1; break; // LP53
case 182: strcpy(charMCode, "LP54"); iAnz=1; break; // LP54
case 183: strcpy(charMCode, "LP55"); iAnz=1; break; // LP55
case 184: strcpy(charMCode, "LP56"); iAnz=1; break; // LP56
case 185: strcpy(charMCode, "LP57"); iAnz=1; break; // LP57
case 186: strcpy(charMCode, "LP58"); iAnz=1; break; // LP58
case 187: strcpy(charMCode, "LP59"); iAnz=1; break; // LP59
case 188: strcpy(charMCode, "LP60"); iAnz=1; break; // LP60
case 189: strcpy(charMCode, "LP61"); iAnz=1; break; // LP61
case 190: strcpy(charMCode, "LP62"); iAnz=1; break; // LP62
case 191: strcpy(charMCode, "LP63"); iAnz=1; break; // LP63
case 192: strcpy(charMCode, "INCJ"); iAnz=1; break; // INCJ
case 193: strcpy(charMCode, "DECJ"); iAnz=1; break; // DECJ
case 194: strcpy(charMCode, "INCB"); iAnz=1; break; // INCB
case 195: strcpy(charMCode, "DECB"); iAnz=1; break; // DECB
case 196: strcpy(charMCode, "ADCM"); iAnz=1; break; // ADCM
case 197: strcpy(charMCode, "SBCM"); iAnz=1; break; // SBCM
case 198: strcpy(charMCode, "TSMA"); iAnz=1; break; // TSMA
case 199: strcpy(charMCode, "CPMA"); iAnz=1; break; // CPMA
case 200: strcpy(charMCode, "INCL"); iAnz=1; break; // INCL
case 201: strcpy(charMCode, "DECL"); iAnz=1; break; // DECL
case 202: strcpy(charMCode, "INCN"); iAnz=1; break; // INCN
case 203: strcpy(charMCode, "DECN"); iAnz=1; break; // DECN
case 204: strcpy(charMCode, "INB"); iAnz=1; break; // INB
case 205: strcpy(charMCode, "NOPW??"); iAnz=1; break; // NOPW??
case 206: strcpy(charMCode, "NOPT"); iAnz=1; break; // NOPT
case 207: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 208: strcpy(charMCode, "SC"); iAnz=1; break; // SC
case 209: strcpy(charMCode, "RC"); iAnz=1; break; // RC
case 210: strcpy(charMCode, "SR"); iAnz=1; break; // SR
case 211: strcpy(charMCode, "WRIT??"); iAnz=1; break; // WRIT??
case 212: strcpy(charMCode, "ANID"); iAnz=2; break; // ANID n
case 213: strcpy(charMCode, "ORID"); iAnz=2; break; // ORID n
case 214: strcpy(charMCode, "TSID"); iAnz=2; break; // TSID n
case 215: strcpy(charMCode, "CPID??"); iAnz=2; break; // CPID n ??
case 216: strcpy(charMCode, "LEAVE"); iAnz=1; break; // LEAVE
case 217: strcpy(charMCode, "NOPW??"); iAnz=1; break; // NOPW??
case 218: strcpy(charMCode, "EXAB"); iAnz=1; break; // EXAB
case 219: strcpy(charMCode, "EXAM"); iAnz=1; break; // EXAM
case 220: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 221: strcpy(charMCode, "OUTB"); iAnz=1; break; // OUTB
case 222: strcpy(charMCode, "??"); iAnz=1; break; // ??
case 223: strcpy(charMCode, "OUTC"); iAnz=1; break; // OUTC
case 224: strcpy(charMCode, "CAL00"); iAnz=2; break; // CAL0 m
case 225: strcpy(charMCode, "CAL01"); iAnz=2; break; // CAL256 m
case 226: strcpy(charMCode, "CAL02"); iAnz=2; break; // CAL512 m
case 227: strcpy(charMCode, "CAL03"); iAnz=2; break; // CAL768 m
case 228: strcpy(charMCode, "CAL04"); iAnz=2; break; // CAL1024 m
case 229: strcpy(charMCode, "CAL05"); iAnz=2; break; // CAL1280 m
case 230: strcpy(charMCode, "CAL06"); iAnz=2; break; // CAL1536 m
case 231: strcpy(charMCode, "CAL07"); iAnz=2; break; // CAL1792 m
case 232: strcpy(charMCode, "CAL08"); iAnz=2; break; // CAL2048 m
case 233: strcpy(charMCode, "CAL09"); iAnz=2; break; // CAL2304 m
case 234: strcpy(charMCode, "CAL10"); iAnz=2; break; // CAL2560 m
case 235: strcpy(charMCode, "CAL11"); iAnz=2; break; // CAL2816 m
case 236: strcpy(charMCode, "CAL12"); iAnz=2; break; // CAL3072 m
case 237: strcpy(charMCode, "CAL13"); iAnz=2; break; // CAL3328 m
case 238: strcpy(charMCode, "CAL14"); iAnz=2; break; // CAL3584 m
case 239: strcpy(charMCode, "CAL15"); iAnz=2; break; // CAL3840 m
case 240: strcpy(charMCode, "CAL16"); iAnz=2; break; // CAL4096 m
case 241: strcpy(charMCode, "CAL17"); iAnz=2; break; // CAL4352 m
case 242: strcpy(charMCode, "CAL18"); iAnz=2; break; // CAL4608 m
case 243: strcpy(charMCode, "CAL19"); iAnz=2; break; // CAL4864 m
case 244: strcpy(charMCode, "CAL20"); iAnz=2; break; // CAL5120 m
case 245: strcpy(charMCode, "CAL21"); iAnz=2; break; // CAL5376 m
case 246: strcpy(charMCode, "CAL22"); iAnz=2; break; // CAL5632 m
case 247: strcpy(charMCode, "CAL23"); iAnz=2; break; // CAL5888 m
case 248: strcpy(charMCode, "CAL24"); iAnz=2; break; // CAL6144 m
case 249: strcpy(charMCode, "CAL25"); iAnz=2; break; // CAL6400 m
case 250: strcpy(charMCode, "CAL26"); iAnz=2; break; // CAL6656 m
case 251: strcpy(charMCode, "CAL27"); iAnz=2; break; // CAL6912 m
case 252: strcpy(charMCode, "CAL28"); iAnz=2; break; // CAL7168 m
case 253: strcpy(charMCode, "CAL29"); iAnz=2; break; // CAL7424 m
case 254: strcpy(charMCode, "CAL30"); iAnz=2; break; // CAL7680 m
case 255: strcpy(charMCode, "CAL31"); iAnz=2; break; // CAL7936 m
}
}