Program: 5486
Project: 5486
Buggy source:
public DbgInstruction disassemble(int pc,int[] memory,int[] reg,DbgInstruction dbg,int interrupt){
  int startPC=pc;
  int size=0;
  int instruction=memory[pc] + (memory[pc + 1] << 8);
  int op=instruction >> 12;
  boolean word=(instruction & 0x40) == 0;
  String output="String_Node_Str";
  if (interrupt > 0) {
    output="String_Node_Str" + Integer.toString(interrupt) + ' ';
  }
  String regs="String_Node_Str";
  if (pc < 0x0010) {
    output+="String_Node_Str" + Integer.toString(pc,16);
  }
 else   if (pc < 0x0100) {
    output+="String_Node_Str" + Integer.toString(pc,16);
  }
 else   if (pc < 0x1000) {
    output+="String_Node_Str" + Integer.toString(pc,16);
  }
 else {
    output+=Integer.toString(pc,16);
  }
  output+="String_Node_Str";
  pc+=2;
  size+=2;
switch (op) {
case 0:
{
      String opstr="String_Node_Str";
      op=instruction & 0xf0f0;
      int srcdata=(instruction & 0x0f00) >> 8;
      int dst=instruction & 0x000f;
      int nextData=memory[pc] + (memory[pc + 1] << 8);
      boolean rrword=true;
switch (op) {
case MOVA_IND:
        opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
      break;
case MOVA_IND_AUTOINC:
    opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
  break;
case MOVA_ABS2REG:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case MOVA_INDX2REG:
opstr="String_Node_Str" + Utils.hex16(nextData) + "String_Node_Str"+ srcdata+ "String_Node_Str"+ dst;
size+=2;
break;
case MOVA_REG2ABS:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ Utils.hex20(((dst << 16) | nextData));
size+=2;
break;
case MOVA_REG2INDX:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ Utils.hex16(nextData)+ "String_Node_Str"+ dst+ "String_Node_Str";
size+=2;
break;
case MOVA_IMM2REG:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case CMPA_IMM:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case ADDA_IMM:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case SUBA_IMM:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case MOVA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case CMPA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case ADDA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case SUBA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case RRXX_ADDR:
rrword=false;
case RRXX_WORD:
String rrwordStr=rrword ? "String_Node_Str" : "String_Node_Str";
int count=((instruction >> 10) & 0x03) + 1;
switch (instruction & RRMASK) {
case RRCM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
case RRAM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
case RLAM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
case RRUM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
}
break;
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str";
regs="String_Node_Str" + srcdata + "String_Node_Str"+ Utils.hex16(reg[srcdata]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
}
break;
case 1:
{
int dst=instruction & 0x000f;
int nextData=memory[pc] + (memory[pc + 1] << 8);
String opstr=null;
switch (instruction & 0xfff0) {
case CALLA_REG:
opstr="String_Node_Str" + dst;
break;
case CALLA_IND:
opstr="String_Node_Str" + dst;
break;
case CALLA_IND_AUTOINC:
opstr="String_Node_Str" + dst + "String_Node_Str";
break;
case CALLA_ABS:
opstr="String_Node_Str" + Utils.hex20(((dst << 16) | nextData));
size+=2;
break;
case CALLA_EDE:
opstr="String_Node_Str" + Utils.hex20(((dst << 16) | nextData)) + "String_Node_Str";
size+=2;
break;
case CALLA_IMM:
opstr="String_Node_Str" + Utils.hex20(((dst << 16) | nextData));
size+=2;
break;
default :
switch (instruction & 0xff00) {
case PUSHM_A:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
case PUSHM_W:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
case POPM_A:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
case POPM_W:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
}
}
if (opstr != null) {
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str";
regs="String_Node_Str" + dst + "String_Node_Str"+ Utils.hex16(reg[dst]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
}
 else {
int register=instruction & 0xf;
int ad=(instruction >> 4) & 3;
int dstAddress=0;
String adr="String_Node_Str";
switch (ad) {
case AM_REG:
adr="String_Node_Str" + register;
break;
case AM_INDEX:
dstAddress=memory[pc] + (memory[pc + 1] << 8);
adr="String_Node_Str" + register + "String_Node_Str"+ dstAddress+ "String_Node_Str";
dstAddress=(register == CG1 ? 0 : reg[register]) + dstAddress;
pc+=2;
size+=2;
break;
case AM_IND_REG:
adr="String_Node_Str" + register + "String_Node_Str";
dstAddress=reg[register];
break;
case AM_IND_AUTOINC:
if (register == 0) {
int tmp=memory[pc] + (memory[pc + 1] << 8);
MapEntry me;
if (map != null && (me=map.getEntry(tmp)) != null) {
adr=me.getName();
}
 else {
adr="String_Node_Str" + Utils.hex16(tmp);
}
size+=2;
}
 else {
adr="String_Node_Str" + register + "String_Node_Str";
dstAddress=reg[register];
}
break;
}
switch (instruction & 0xff80) {
case RRC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SWPB:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case RRA:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SXT:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case PUSH:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case CALL:
opstr="String_Node_Str";
break;
case RETI:
opstr="String_Node_Str";
break;
default :
if ((instruction & 0xf800) == 0x1800) {
int zc=(instruction & EXTWORD_ZC) > 0 ? 1 : 0;
int al=(instruction & EXTWORD_AL) > 0 ? 1 : 0;
int rp=(instruction & EXTWORD_REPEAT) > 0 ? 1 : 0;
int shi=(instruction & EXTWORD_SRC) >> 7;
int dhi=(instruction & EXTWORD_DST);
opstr="String_Node_Str" + Utils.hex16(instruction) + "String_Node_Str"+ zc+ "String_Node_Str"+ rp+ "String_Node_Str"+ al+ "String_Node_Str"+ shi+ "String_Node_Str"+ dhi;
dbg.setExtWord(true);
}
 else {
System.out.println("String_Node_Str" + Utils.hex16(instruction) + "String_Node_Str"+ Utils.hex16(startPC));
opstr="String_Node_Str";
}
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str" + adr;
regs="String_Node_Str" + register + "String_Node_Str"+ Utils.hex16(reg[register]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
}
}
break;
case 2:
case 3:
int jmpOffset=instruction & 0x3ff;
jmpOffset=(jmpOffset & 0x200) == 0 ? 2 * jmpOffset : -(2 * (0x200 - (jmpOffset & 0x1ff)));
boolean jump=false;
String opstr="String_Node_Str";
switch (instruction & 0xfc00) {
case JNE:
opstr="String_Node_Str";
break;
case JEQ:
opstr="String_Node_Str";
break;
case JNC:
opstr="String_Node_Str";
break;
case JC:
opstr="String_Node_Str";
break;
case JN:
opstr="String_Node_Str";
break;
case JGE:
opstr="String_Node_Str";
break;
case JL:
opstr="String_Node_Str";
break;
case JMP:
opstr="String_Node_Str";
break;
default :
System.out.println("String_Node_Str" + Utils.binary16(instruction));
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str" + Utils.hex16(jmpOffset);
regs="String_Node_Str" + dumpSR(reg[SR]);
break;
default :
int dstRegister=(instruction & 0xf);
int srcRegister=(instruction >> 8) & 0xf;
int as=(instruction >> 4) & 3;
boolean dstRegMode=((instruction >> 7) & 1) == 0;
int dstAddress=0;
int srcAddress=0;
int src=0;
int dst=0;
boolean write=false;
boolean updateStatus=true;
String srcadr="String_Node_Str";
String dstadr="String_Node_Str";
switch (as) {
case AM_REG:
if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else if (srcRegister == CG1) {
srcadr="String_Node_Str";
}
 else {
srcadr=getRegName(srcRegister);
}
break;
case AM_INDEX:
if (srcRegister == CG1) {
srcAddress=memory[pc] + (memory[pc + 1] << 8);
MapEntry me;
if (map != null && (me=map.getEntry(srcAddress)) != null) {
srcadr="String_Node_Str" + me.getName();
}
 else {
srcadr="String_Node_Str" + Utils.hex16(srcAddress);
}
size+=2;
}
 else if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else {
srcAddress=reg[srcRegister] + memory[pc] + (memory[pc + 1] << 8);
srcadr="String_Node_Str" + Utils.hex16(memory[pc] + (memory[pc + 1] << 8)) + "String_Node_Str"+ srcRegister+ "String_Node_Str";
size+=2;
}
break;
case AM_IND_REG:
if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else if (srcRegister == CG1) {
srcadr="String_Node_Str";
}
 else {
srcadr="String_Node_Str" + getRegName(srcRegister);
}
break;
case AM_IND_AUTOINC:
if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else if (srcRegister == CG1) {
srcadr="String_Node_Str";
}
 else if (srcRegister == PC) {
srcadr="String_Node_Str" + Utils.hex16(memory[pc] + (memory[pc + 1] << 8));
pc+=2;
size+=2;
}
 else if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else {
srcadr="String_Node_Str" + getRegName(srcRegister) + "String_Node_Str";
srcAddress=reg[srcRegister];
}
break;
}
if (dstRegMode) {
dstadr=getRegName(dstRegister);
}
 else {
dstAddress=memory[pc] + (memory[pc + 1] << 8);
MapEntry me=map != null ? map.getEntry(dstAddress) : null;
if (dstRegister == 2) {
if (me != null) {
dstadr="String_Node_Str" + me.getName();
}
 else {
dstadr="String_Node_Str" + Utils.hex16(dstAddress);
}
}
 else {
if (me != null) {
dstadr=me.getName() + "String_Node_Str" + dstRegister+ "String_Node_Str";
}
 else {
dstadr="String_Node_Str" + Utils.hex16(dstAddress) + "String_Node_Str"+ dstRegister+ "String_Node_Str";
}
}
pc+=2;
size+=2;
}
if (!word) {
src=src & 0xff;
dst=dst & 0xff;
}
opstr="String_Node_Str";
switch (op) {
case MOV:
if (instruction == 0x3041) {
opstr="String_Node_Str";
}
 else {
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
}
break;
case ADD:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case ADDC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SUBC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SUB:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case CMP:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case DADD:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case BIT:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case BIC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case BIS:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case XOR:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case AND:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
default :
if (startPC > 0x200) System.out.println(output + "String_Node_Str" + op+ "String_Node_Str"+ Utils.binary16(instruction)+ "String_Node_Str"+ Utils.hex16(instruction));
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str" + srcadr+ "String_Node_Str"+ dstadr;
regs="String_Node_Str" + dstRegister + "String_Node_Str"+ Utils.hex16(reg[dstRegister])+ "String_Node_Str"+ srcRegister+ "String_Node_Str"+ Utils.hex16(reg[srcRegister]);
regs+="String_Node_Str" + dumpSR(reg[SR]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
regs+="String_Node_Str" + as;
srcAddress&=0xffff;
if (srcAddress != -1) {
srcAddress&=0xffff;
regs+="String_Node_Str" + Utils.hex16(memory[srcAddress] + (memory[(srcAddress + 1) % 0xffff] << 8));
}
}
dbg.setASMLine(output);
dbg.setRegs(regs);
dbg.setInstruction(instruction,size);
if (map != null) {
dbg.setFunction(map.getFunctionName(startPC));
}
if (!step) {
String line="String_Node_Str";
try {
line=input.readLine();
}
 catch (Exception e) {
}
if (line != null && line.length() > 0 && line.charAt(0) == 'r') {
System.out.println("String_Node_Str");
for (int i=0, n=16; i < n; i++) {
System.out.print("String_Node_Str" + i + "String_Node_Str"+ Utils.hex16(reg[i])+ "String_Node_Str");
if (i % 7 == 0 && i != 0) System.out.println();
}
System.out.println();
}
}
return dbg;
}

Fixed version (ground truth):
public DbgInstruction disassemble(int pc,int[] memory,int[] reg,DbgInstruction dbg,int interrupt){
  int startPC=pc;
  int size=0;
  int instruction=memory[pc] + (memory[pc + 1] << 8);
  int op=instruction >> 12;
  boolean word=(instruction & 0x40) == 0;
  String output="String_Node_Str";
  if (interrupt > 0) {
    output="String_Node_Str" + Integer.toString(interrupt) + ' ';
  }
  String regs="String_Node_Str";
  if (pc < 0x0010) {
    output+="String_Node_Str" + Integer.toString(pc,16);
  }
 else   if (pc < 0x0100) {
    output+="String_Node_Str" + Integer.toString(pc,16);
  }
 else   if (pc < 0x1000) {
    output+="String_Node_Str" + Integer.toString(pc,16);
  }
 else {
    output+=Integer.toString(pc,16);
  }
  output+="String_Node_Str";
  pc+=2;
  size+=2;
switch (op) {
case 0:
{
      String opstr="String_Node_Str";
      op=instruction & 0xf0f0;
      int srcdata=(instruction & 0x0f00) >> 8;
      int dst=instruction & 0x000f;
      int nextData=memory[pc] + (memory[pc + 1] << 8);
      boolean rrword=true;
switch (op) {
case MOVA_IND:
        opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
      break;
case MOVA_IND_AUTOINC:
    opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
  break;
case MOVA_ABS2REG:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case MOVA_INDX2REG:
opstr="String_Node_Str" + Utils.hex16(nextData) + "String_Node_Str"+ srcdata+ "String_Node_Str"+ dst;
size+=2;
break;
case MOVA_REG2ABS:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ Utils.hex20(((dst << 16) | nextData));
size+=2;
break;
case MOVA_REG2INDX:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ Utils.hex16(nextData)+ "String_Node_Str"+ dst+ "String_Node_Str";
size+=2;
break;
case MOVA_IMM2REG:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case CMPA_IMM:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case ADDA_IMM:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case SUBA_IMM:
opstr="String_Node_Str" + Utils.hex20(((srcdata << 16) | nextData)) + "String_Node_Str"+ dst;
size+=2;
break;
case MOVA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case CMPA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case ADDA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case SUBA_REG:
opstr="String_Node_Str" + srcdata + "String_Node_Str"+ dst;
break;
case RRXX_ADDR:
rrword=false;
case RRXX_WORD:
String rrwordStr=rrword ? "String_Node_Str" : "String_Node_Str";
int count=((instruction >> 10) & 0x03) + 1;
switch (instruction & RRMASK) {
case RRCM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
case RRAM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
case RLAM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
case RRUM:
opstr="String_Node_Str" + rrwordStr + "String_Node_Str"+ count+ "String_Node_Str"+ dst;
break;
}
break;
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str";
regs="String_Node_Str" + srcdata + "String_Node_Str"+ Utils.hex16(reg[srcdata]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
}
break;
case 1:
{
int dst=instruction & 0x000f;
int nextData=memory[pc] + (memory[pc + 1] << 8);
String opstr=null;
switch (instruction & 0xfff0) {
case CALLA_REG:
opstr="String_Node_Str" + dst;
break;
case CALLA_IND:
opstr="String_Node_Str" + dst;
break;
case CALLA_IND_AUTOINC:
opstr="String_Node_Str" + dst + "String_Node_Str";
break;
case CALLA_ABS:
opstr="String_Node_Str" + Utils.hex20(((dst << 16) | nextData));
size+=2;
break;
case CALLA_EDE:
opstr="String_Node_Str" + Utils.hex20(((dst << 16) | nextData)) + "String_Node_Str";
size+=2;
break;
case CALLA_IMM:
opstr="String_Node_Str" + Utils.hex20(((dst << 16) | nextData));
size+=2;
break;
default :
switch (instruction & 0xff00) {
case PUSHM_A:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
case PUSHM_W:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
case POPM_A:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
case POPM_W:
opstr="String_Node_Str" + (1 + ((instruction >> 4) & 0x0f)) + "String_Node_Str"+ (instruction & 0x0f);
break;
}
}
if (opstr != null) {
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str";
regs="String_Node_Str" + dst + "String_Node_Str"+ Utils.hex16(reg[dst]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
}
 else {
int register=instruction & 0xf;
int ad=(instruction >> 4) & 3;
int dstAddress=0;
String adr="String_Node_Str";
switch (ad) {
case AM_REG:
adr="String_Node_Str" + register;
break;
case AM_INDEX:
dstAddress=memory[pc] + (memory[pc + 1] << 8);
adr="String_Node_Str" + register + "String_Node_Str"+ dstAddress+ "String_Node_Str";
dstAddress=(register == CG1 ? 0 : reg[register]) + dstAddress;
pc+=2;
size+=2;
break;
case AM_IND_REG:
adr="String_Node_Str" + register + "String_Node_Str";
dstAddress=reg[register];
break;
case AM_IND_AUTOINC:
if (register == 0) {
int tmp=memory[pc] + (memory[pc + 1] << 8);
MapEntry me;
if (map != null && (me=map.getEntry(tmp)) != null) {
adr=me.getName();
}
 else {
adr="String_Node_Str" + Utils.hex16(tmp);
}
size+=2;
}
 else {
adr="String_Node_Str" + register + "String_Node_Str";
dstAddress=reg[register];
}
break;
}
switch (instruction & 0xff80) {
case RRC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SWPB:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case RRA:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SXT:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case PUSH:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case CALL:
opstr="String_Node_Str";
break;
case RETI:
opstr="String_Node_Str";
break;
default :
if ((instruction & 0xf800) == 0x1800) {
int zc=(instruction & EXTWORD_ZC) > 0 ? 1 : 0;
int al=(instruction & EXTWORD_AL) > 0 ? 1 : 0;
int rp=(instruction & EXTWORD_REPEAT) > 0 ? 1 : 0;
int shi=(instruction & EXTWORD_SRC) >> 7;
int dhi=(instruction & EXTWORD_DST);
opstr="String_Node_Str" + Utils.hex16(instruction) + "String_Node_Str"+ zc+ "String_Node_Str"+ rp+ "String_Node_Str"+ al+ "String_Node_Str"+ shi+ "String_Node_Str"+ dhi;
dbg.setExtWord(true);
}
 else {
System.out.println("String_Node_Str" + Utils.hex16(instruction) + "String_Node_Str"+ Utils.hex16(startPC));
opstr="String_Node_Str";
}
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str" + adr;
regs="String_Node_Str" + register + "String_Node_Str"+ Utils.hex16(reg[register]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
}
}
break;
case 2:
case 3:
int jmpOffset=instruction & 0x3ff;
jmpOffset=(jmpOffset & 0x200) == 0 ? 2 * jmpOffset : -(2 * (0x200 - (jmpOffset & 0x1ff)));
boolean jump=false;
String opstr="String_Node_Str";
switch (instruction & 0xfc00) {
case JNE:
opstr="String_Node_Str";
break;
case JEQ:
opstr="String_Node_Str";
break;
case JNC:
opstr="String_Node_Str";
break;
case JC:
opstr="String_Node_Str";
break;
case JN:
opstr="String_Node_Str";
break;
case JGE:
opstr="String_Node_Str";
break;
case JL:
opstr="String_Node_Str";
break;
case JMP:
opstr="String_Node_Str";
break;
default :
System.out.println("String_Node_Str" + Utils.binary16(instruction));
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str" + Utils.hex16(jmpOffset);
regs="String_Node_Str" + dumpSR(reg[SR]);
break;
default :
int dstRegister=(instruction & 0xf);
int srcRegister=(instruction >> 8) & 0xf;
int as=(instruction >> 4) & 3;
boolean dstRegMode=((instruction >> 7) & 1) == 0;
int dstAddress=0;
int srcAddress=0;
int src=0;
int dst=0;
boolean write=false;
boolean updateStatus=true;
String srcadr="String_Node_Str";
String dstadr="String_Node_Str";
switch (as) {
case AM_REG:
if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else if (srcRegister == CG1) {
srcadr="String_Node_Str";
}
 else {
srcadr=getRegName(srcRegister);
}
break;
case AM_INDEX:
if (srcRegister == CG1) {
srcAddress=memory[pc] + (memory[pc + 1] << 8);
MapEntry me;
if (map != null && (me=map.getEntry(srcAddress)) != null) {
srcadr="String_Node_Str" + me.getName();
}
 else {
srcadr="String_Node_Str" + Utils.hex16(srcAddress);
}
size+=2;
}
 else if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else {
srcAddress=reg[srcRegister] + memory[pc] + (memory[pc + 1] << 8);
srcadr="String_Node_Str" + Utils.hex16(memory[pc] + (memory[pc + 1] << 8)) + "String_Node_Str"+ srcRegister+ "String_Node_Str";
size+=2;
}
pc+=2;
break;
case AM_IND_REG:
if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else if (srcRegister == CG1) {
srcadr="String_Node_Str";
}
 else {
srcadr="String_Node_Str" + getRegName(srcRegister);
}
break;
case AM_IND_AUTOINC:
if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else if (srcRegister == CG1) {
srcadr="String_Node_Str";
}
 else if (srcRegister == PC) {
srcadr="String_Node_Str" + Utils.hex16(memory[pc] + (memory[pc + 1] << 8));
pc+=2;
size+=2;
}
 else if (srcRegister == CG2) {
srcadr="String_Node_Str";
}
 else {
srcadr="String_Node_Str" + getRegName(srcRegister) + "String_Node_Str";
srcAddress=reg[srcRegister];
}
break;
}
if (dstRegMode) {
dstadr=getRegName(dstRegister);
}
 else {
dstAddress=memory[pc] + (memory[pc + 1] << 8);
MapEntry me=map != null ? map.getEntry(dstAddress) : null;
if (dstRegister == 2) {
if (me != null) {
dstadr="String_Node_Str" + me.getName();
}
 else {
dstadr="String_Node_Str" + Utils.hex16(dstAddress);
}
}
 else {
if (me != null) {
dstadr=me.getName() + "String_Node_Str" + dstRegister+ "String_Node_Str";
}
 else {
dstadr="String_Node_Str" + Utils.hex16(dstAddress) + "String_Node_Str"+ dstRegister+ "String_Node_Str";
}
}
pc+=2;
size+=2;
}
if (!word) {
src=src & 0xff;
dst=dst & 0xff;
}
opstr="String_Node_Str";
switch (op) {
case MOV:
if (instruction == 0x3041) {
opstr="String_Node_Str";
}
 else {
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
}
break;
case ADD:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case ADDC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SUBC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case SUB:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case CMP:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case DADD:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case BIT:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case BIC:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case BIS:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case XOR:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
case AND:
opstr="String_Node_Str" + (word ? "String_Node_Str" : "String_Node_Str");
break;
default :
if (startPC > 0x200) System.out.println(output + "String_Node_Str" + op+ "String_Node_Str"+ Utils.binary16(instruction)+ "String_Node_Str"+ Utils.hex16(instruction));
}
output+=dumpMem(startPC,size,memory);
output+=opstr + "String_Node_Str" + srcadr+ "String_Node_Str"+ dstadr;
regs="String_Node_Str" + dstRegister + "String_Node_Str"+ Utils.hex16(reg[dstRegister])+ "String_Node_Str"+ srcRegister+ "String_Node_Str"+ Utils.hex16(reg[srcRegister]);
regs+="String_Node_Str" + dumpSR(reg[SR]);
regs+="String_Node_Str" + Utils.hex16(reg[SP]);
regs+="String_Node_Str" + as;
srcAddress&=0xffff;
if (srcAddress != -1) {
srcAddress&=0xffff;
regs+="String_Node_Str" + Utils.hex16(memory[srcAddress] + (memory[(srcAddress + 1) % 0xffff] << 8));
}
}
dbg.setASMLine(output);
dbg.setRegs(regs);
dbg.setInstruction(instruction,size);
if (map != null) {
dbg.setFunction(map.getFunctionName(startPC));
}
if (!step) {
String line="String_Node_Str";
try {
line=input.readLine();
}
 catch (Exception e) {
}
if (line != null && line.length() > 0 && line.charAt(0) == 'r') {
System.out.println("String_Node_Str");
for (int i=0, n=16; i < n; i++) {
System.out.print("String_Node_Str" + i + "String_Node_Str"+ Utils.hex16(reg[i])+ "String_Node_Str");
if (i % 7 == 0 && i != 0) System.out.println();
}
System.out.println();
}
}
return dbg;
}