#include <cstdlib>
#include <iostream>
#include <string>
#include <cstring>

#include "kbox.h"
#include "kwindow.h"

using namespace std;

extern kbox_type	VISUAL_KBOX;
extern kwindow_type*	KBOX_WINDOW;
extern klunk		MAXPC;

/* ----------------------------------------------------- */

// kfedex.cpp

/* ----------------------------------------------------- */

void kwindow_type::fedex (klunk pc,bool& halt_flag)
{
  string opcode;
  string oper1,   oper2,   oper3;
  char   r_type1, r_type2, r_type3;
  klunk  r_index1,r_index2,r_index3;

  if (pc >= MAXPC)
  {
    opcode = "HALT";
    oper1 = oper2 = oper3 = "";
  }
  else
  {
    halt_flag = false;
    code_entry instruction =
      VISUAL_KBOX.INSTRUCTIONS.get_instruction(pc);
    opcode = instruction.get_opcode();
    oper1 =  instruction.get_operand1();
    oper2 =  instruction.get_operand2();
    oper3 =  instruction.get_operand3();
    VISUAL_KBOX.FLAGS.setPC(pc+1);
  }

  if (opcode == "HALT")
  {
    halt_flag = true;
    VISUAL_KBOX.FLAGS.setPC(MAXPC);
    KBOX_WINDOW->console_display->printf
      ("halt instruction!\n");
    return;
  }

  else if (opcode == "NOP")
    return;

  else if (opcode == "I2F")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid I2F operands: %s,%s\n",
        oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,flt2klunk(static_cast<flt64>(klunk2int
      (VISUAL_KBOX.REGISTERS.get_register(oper2)))));
  }
  else if (opcode == "F2I")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid F2I operands: %s,%s\n",
        oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,int2klunk(static_cast<int64>(klunk2flt
      (VISUAL_KBOX.REGISTERS.get_register(oper2)))));
  }

  else if (opcode == "LDA")
  {
    map_entry memory_info;
    if ((oper2[0] != '=') ||
        (!VISUAL_KBOX.MEMORY.is_map_entry
          (oper2.substr(1,oper2.size()-1),memory_info)))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LDA second operand: %s\n",oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    if ((VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) &&
        (r_type1 == 'I'))
      VISUAL_KBOX.REGISTERS.set_register
        (oper1,memory_info.get_address());
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LDA first operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "LDR")
  {
    if ((VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) &&
        (r_type2 == 'I'))
      if (VISUAL_KBOX.REGISTERS.is_register
           (oper1,r_type1,r_index1))
      {
        VISUAL_KBOX.REGISTERS.set_register(oper1,
          VISUAL_KBOX.MEMORY.peek
            (VISUAL_KBOX.REGISTERS.get_register(oper2)));
      }
      else
      {
        printf ("invalid LDR first operand: %s\n",
          oper1.c_str());
        VISUAL_KBOX.FLAGS.setPC(MAXPC);
        return;
      }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LDR second operand: %s\n",oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "STR")
  {
    if ((VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) &&
        (r_type2 == 'I'))
      if (VISUAL_KBOX.REGISTERS.is_register
           (oper1,r_type1,r_index1))
          VISUAL_KBOX.MEMORY.poke
            (VISUAL_KBOX.REGISTERS.get_register(oper2),
             VISUAL_KBOX.REGISTERS.get_register(oper1));
      else
      {
        KBOX_WINDOW->console_display->printf
          ("invalid STR first operand: %s\n",
          oper1.c_str());
        VISUAL_KBOX.FLAGS.setPC(MAXPC);
        return;
      }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid STR second operand: %s\n",
        oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }

  else if (opcode == "MOV")
  {
    if (!VISUAL_KBOX.REGISTERS.is_register
         (oper1,r_type1,r_index1))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid MOV first operand: %s\n",
        oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    if (!VISUAL_KBOX.REGISTERS.is_register
         (oper2,r_type2,r_index2))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid MOV second operand: %s\n",
        oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,VISUAL_KBOX.REGISTERS.get_register(oper2));
  }
  else if (opcode == "MOVI")
  {
    if (!VISUAL_KBOX.REGISTERS.is_register
         (oper1,r_type1,r_index1))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid MOVI first operand: %s\n",
        oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk imm_value = literal2klunk (oper2);
    VISUAL_KBOX.REGISTERS.set_register(oper1,imm_value);
  }

  else if (opcode == "PUSH")
  {
    if (VISUAL_KBOX.REGISTERS.is_register
         (oper1,r_type1,r_index1))
    {
      string sp_reg = "I12";
      klunk sp =
        VISUAL_KBOX.REGISTERS.get_register(sp_reg);
      string hp_reg = "I15";
      klunk hp =
        VISUAL_KBOX.REGISTERS.get_register(hp_reg);
      if (sp > hp)
      {
        VISUAL_KBOX.REGISTERS.set_register(sp_reg,sp-1);
        VISUAL_KBOX.MEMORY.poke
          (sp-1,VISUAL_KBOX.REGISTERS.get_register(oper1));
      }
      else
      {
        KBOX_WINDOW->console_display->printf
          ("stack overflow\n");
        VISUAL_KBOX.FLAGS.setPC(MAXPC);
        return;
      }
    }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid PUSH operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "POP")
  {
    if (VISUAL_KBOX.REGISTERS.is_register
         (oper1,r_type1,r_index1))
    {
      string sp_reg = "I12";
      klunk sp =
        VISUAL_KBOX.REGISTERS.get_register(sp_reg);
      VISUAL_KBOX.REGISTERS.set_register(oper1,
        VISUAL_KBOX.MEMORY.peek(sp));
      VISUAL_KBOX.REGISTERS.set_register(sp_reg,sp+1);
    }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid POP operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }

  else if (opcode == "ADD")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid ADD operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,int2klunk(
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper2)) +
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper3))));
  }
  else if (opcode == "SUB")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid SUB operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,int2klunk(
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper2)) -
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper3))));
  }
  else if (opcode == "MUL")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid MUL operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,int2klunk(
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper2)) *
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper3))));
  }
  else if (opcode == "DIV")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid DIV operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    int64 divisor = klunk2int
      (VISUAL_KBOX.REGISTERS.get_register(oper3));
    if (divisor == 0)
    {
      KBOX_WINDOW->console_display->printf
        ("division by 0 not permitted!\n");
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,int2klunk(
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper2)) /
      divisor));
  }
  else if (opcode == "MOD")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid MOD operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    int64 divisor = klunk2int
      (VISUAL_KBOX.REGISTERS.get_register(oper3));
    if (divisor == 0)
    {
      KBOX_WINDOW->console_display->printf
        ("division by 0 not permitted!\n");
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,int2klunk(
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper2)) %
      divisor));
  }
  else if (opcode == "NEG")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid NEG operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,int2klunk(
      - klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper1))));
  }

  else if (opcode == "UADD")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid UADD operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) +
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "USUB")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid USUB operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) -
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "UMUL")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid UMUL operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) -
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "UDIV")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid UDIV operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk divisor =
      VISUAL_KBOX.REGISTERS.get_register(oper3);
    if (divisor == 0)
    {
      KBOX_WINDOW->console_display->printf
        ("division by 0 not permitted!\n");
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) /
      divisor);
  }
  else if (opcode == "UMOD")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid UMOD operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk divisor =
      VISUAL_KBOX.REGISTERS.get_register(oper3);
    if (divisor == 0)
    {
      KBOX_WINDOW->console_display->printf
        ("division by 0 not permitted!\n");
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) /
      divisor);
  }

  else if (opcode == "FADD")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid FADD operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,flt2klunk(
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper2)) +
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper3))));
  }
  else if (opcode == "FSUB")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid FSUB operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,flt2klunk(
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper2)) -
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper3))));
  }
  else if (opcode == "FMUL")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid FMUL operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,flt2klunk(
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper2)) *
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper3))));
  }
  else if (opcode == "FDIV")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid FDIV operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    flt64 divisor =
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper3));
    if (divisor == 0.0)
    {
      KBOX_WINDOW->console_display->printf
        ("division by 0 not permitted!\n");
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,flt2klunk(
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper2)) /
      divisor));
  }
  else if (opcode == "FNEG")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid FNEG operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,flt2klunk(
      - klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper1))));
  }

  else if (opcode == "LAND")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LAND operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) &&
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "LOR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LOR operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) ||
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "LXOR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LXOR operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      (VISUAL_KBOX.REGISTERS.get_register(oper2) &&
      (!VISUAL_KBOX.REGISTERS.get_register(oper3))) ||
      (VISUAL_KBOX.REGISTERS.get_register(oper3) &&
      (!VISUAL_KBOX.REGISTERS.get_register(oper2))));
  }
  else if (opcode == "LNOT")
  {
   if ((!VISUAL_KBOX.REGISTERS.is_register
         (oper1,r_type1,r_index1)) ||
       (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid LNOT operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      !VISUAL_KBOX.REGISTERS.get_register(oper1));
  }

  else if (opcode == "BAND")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid BAND operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) &
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "BOR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid BOR operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) |
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "BXOR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper3,r_type3,r_index3)) ||
        (r_type3 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid BXOR operands: %s, %s, %s\n",
          oper1.c_str(),oper2.c_str(),oper3.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper2) ^
      VISUAL_KBOX.REGISTERS.get_register(oper3));
  }
  else if (opcode == "BNOT")
  {
   if ((!VISUAL_KBOX.REGISTERS.is_register
         (oper1,r_type1,r_index1)) ||
       (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid BNOT operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      ~VISUAL_KBOX.REGISTERS.get_register(oper1));
  }

  else if (opcode == "CMP")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid CMP operands: %s, %s\n",
          oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    int64 diff =
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper1)) -
      klunk2int(VISUAL_KBOX.REGISTERS.get_register(oper2));
    if (diff == 0LL)
      VISUAL_KBOX.FLAGS.setEQ ();
    else if (diff > 0LL)
      VISUAL_KBOX.FLAGS.setGT ();
    else // (diff < 0LL)
      VISUAL_KBOX.FLAGS.setLT ();
  }
  else if (opcode == "UCMP")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid UCMP operands: %s, %s\n",
          oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    int64 diff =
      VISUAL_KBOX.REGISTERS.get_register(oper1) -
      VISUAL_KBOX.REGISTERS.get_register(oper2);
    if (diff == 0LL)
      VISUAL_KBOX.FLAGS.setEQ ();
    else if (diff > 0LL)
      VISUAL_KBOX.FLAGS.setGT();
    else // (diff < 0LL)
      VISUAL_KBOX.FLAGS.setLT();
  }
else if (opcode == "FCMP")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'F') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'F'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid FCMP operands: %s, %s\n",
          oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    flt64 diff =
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper1)) -
      klunk2flt(VISUAL_KBOX.REGISTERS.get_register(oper2));
    if (diff == 0.0)
      VISUAL_KBOX.FLAGS.setEQ ();
    else if (diff > 0.0)
      VISUAL_KBOX.FLAGS.setGT ();
    else // (diff < 0.0)
      VISUAL_KBOX.FLAGS.setLT ();
  }

  else if (opcode == "JMP")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      VISUAL_KBOX.FLAGS.setPC(
        VISUAL_KBOX.LABELS.get_location (oper1));
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }

  else if (opcode == "JEQ")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      if (VISUAL_KBOX.FLAGS.getEQ())
        VISUAL_KBOX.FLAGS.setPC(
            VISUAL_KBOX.LABELS.get_location(oper1));
      else
      {  }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "JNE")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      if (!VISUAL_KBOX.FLAGS.getEQ())
        VISUAL_KBOX.FLAGS.setPC(
            VISUAL_KBOX.LABELS.get_location(oper1));
      else
      {  }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "JGT")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      if (VISUAL_KBOX.FLAGS.getGT())
        VISUAL_KBOX.FLAGS.setPC(
            VISUAL_KBOX.LABELS.get_location(oper1));
      else
      {  }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "JLT")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      if (VISUAL_KBOX.FLAGS.getLT())
        VISUAL_KBOX.FLAGS.setPC(
            VISUAL_KBOX.LABELS.get_location(oper1));
      else
      {  }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "JGE")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      if (!VISUAL_KBOX.FLAGS.getLT())
        VISUAL_KBOX.FLAGS.setPC(
            VISUAL_KBOX.LABELS.get_location(oper1));
      else
      {  }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "JLE")
  {
    if (VISUAL_KBOX.LABELS.is_label(oper1))
      if (!VISUAL_KBOX.FLAGS.getGT())
        VISUAL_KBOX.FLAGS.setPC(
            VISUAL_KBOX.LABELS.get_location(oper1));
      else
      {  }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }

  else if (opcode == "ROL")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid ROL register: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk bit_pattern =
      VISUAL_KBOX.REGISTERS.get_register(oper1);
    string imm = oper2;
    int shift = stoi(imm) & 0X3F;
    klunk parta = bit_pattern << shift;
    klunk partb = bit_pattern >> (64-shift);
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,parta | partb);
  }
  else if (opcode == "ROR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid ROR register: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk bit_pattern =
      VISUAL_KBOX.REGISTERS.get_register(oper1);
    string imm = oper2;
    int shift = stoi(imm) & 0X3F;
    klunk parta = bit_pattern >> shift;
    klunk partb = bit_pattern << (64-shift);
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,parta | partb);
  }
  else if (opcode == "SHL")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid SHL register: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk bit_pattern =
      VISUAL_KBOX.REGISTERS.get_register(oper1);
    string imm = oper2;
    int shift = stoi(imm) & 0X3F;
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,bit_pattern << shift);
  }
  else if (opcode == "SHR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid SHR register: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk bit_pattern =
      VISUAL_KBOX.REGISTERS.get_register(oper1);
    string imm = oper2;
    int shift = stoi(imm) & 0X3F;
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,bit_pattern >> shift);
  }
  else if (opcode == "ASHL")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid ASHL register: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    klunk bit_pattern =
      VISUAL_KBOX.REGISTERS.get_register(oper1);
    string imm = oper2;
    int shift = stoi(imm) & 0X3F;
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,bit_pattern << shift);
  }
  else if (opcode == "ASHR")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid ASHR register: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    // note: bit pattern must be considered as
    // a signed and not an unsigned value
    int64 bit_pattern =
      VISUAL_KBOX.REGISTERS.get_register(oper1);
    string imm = oper2;
    int shift = stoi(imm) & 0X3F;
    VISUAL_KBOX.REGISTERS.set_register
      (oper1,bit_pattern >> shift);
  }

 else if (opcode =="CALL")
  {
    string rp_reg = "I14";
    if (VISUAL_KBOX.LABELS.is_label(oper1))
    {
      VISUAL_KBOX.REGISTERS.set_register
        (rp_reg,VISUAL_KBOX.FLAGS.getPC());
      VISUAL_KBOX.FLAGS.setPC
        (VISUAL_KBOX.LABELS.get_location(oper1));
    }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("undefined label: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "RET")
  {
    string rp_reg = "I14";
    VISUAL_KBOX.FLAGS.setPC
      (VISUAL_KBOX.REGISTERS.get_register(rp_reg));
  }

  else if (opcode == "INC")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid INC operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper1)+1);
  }
  else if (opcode == "DEC")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid DEC operand: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(oper1,
      VISUAL_KBOX.REGISTERS.get_register(oper1)-1);
  }

  else if (opcode == "MALLOC")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid MALLOC operands: %s, %s\n",
        oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    string sp_reg = "I12";
    klunk sp =
      VISUAL_KBOX.REGISTERS.get_register(sp_reg);
    string hp_reg = "I15";
    klunk hp =
      VISUAL_KBOX.REGISTERS.get_register(hp_reg);
    klunk no_klunks =
      VISUAL_KBOX.REGISTERS.get_register(oper2);
    if ((sp - hp) > no_klunks)
    {
      VISUAL_KBOX.REGISTERS.set_register(oper1,hp);
      VISUAL_KBOX.REGISTERS.set_register
        (hp_reg,hp+no_klunks);
    }
    else
      VISUAL_KBOX.REGISTERS.set_register(oper1,0);
  }
  else if (opcode == "DALLOC")
  {
    if ((!VISUAL_KBOX.REGISTERS.is_register
          (oper1,r_type1,r_index1)) ||
        (r_type1 != 'I') ||
        (!VISUAL_KBOX.REGISTERS.is_register
          (oper2,r_type2,r_index2)) ||
        (r_type2 != 'I'))
    {
      KBOX_WINDOW->console_display->printf
        ("invalid DALLOC operands: %s, %s\n",
        oper1.c_str(),oper2.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    else
    {
       // yes, do nothing!
       // this is minimal memory management
       // more like NON-EXISTENT memory management
    }
  }

  else if (opcode == "GET")
  {
    string sp_reg = "I12";
    VISUAL_KBOX.REGISTERS.set_register(sp_reg,
      VISUAL_KBOX.REGISTERS.get_register(sp_reg)-1);
    string fmt = oper1;
    str64 buffer = (char*) malloc (LITERAL_SIZE);
    if (fmt == "INT")
    {
      popup("enter integer: ",buffer);
      // immediately echo the input buffer
      // to the console display
      KBOX_WINDOW->console_display->printf
        ("%s\n",buffer);
      int64 data = atoll(buffer);
      VISUAL_KBOX.MEMORY.poke
        (VISUAL_KBOX.REGISTERS.get_register(sp_reg),
         int2klunk(data));
    }
    else if (fmt == "FLT")
    {
      popup("enter real: ",buffer);
      KBOX_WINDOW->console_display->printf
        ("%s\n",buffer);
      flt64 data = atof(buffer);
      VISUAL_KBOX.MEMORY.poke
        (VISUAL_KBOX.REGISTERS.get_register(sp_reg),
         flt2klunk(data));
    }
    else if (fmt == "CHR")
    {
      popup("enter single character: ",buffer);
      KBOX_WINDOW->console_display->printf
        ("%s\n",buffer);
      chr64 data = buffer[0];
      VISUAL_KBOX.MEMORY.poke
        (VISUAL_KBOX.REGISTERS.get_register(sp_reg),
         chr2klunk(data));
    }
    else if (fmt == "STR")
    {
      popup("enter string: ",buffer);
      KBOX_WINDOW->console_display->printf
        ("%s/n",buffer);
      VISUAL_KBOX.MEMORY.poke
        (VISUAL_KBOX.REGISTERS.get_register(sp_reg),
         str2klunk(buffer));
    }
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid format entry: %s\n",fmt.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
  }
  else if (opcode == "GETLN")
  {
    // popup window in graphical user interface
    // makes this instruction essentially obsolete!
    KBOX_WINDOW->console_display->printf
      ("\n");
  }

  else if (opcode == "PUT")
  {
    string sp_reg = "I12";
    klunk data =
      VISUAL_KBOX.MEMORY.peek
        (VISUAL_KBOX.REGISTERS.get_register(sp_reg));
    string fmt = oper1;
    if (fmt == "INT")
      KBOX_WINDOW->console_display->printf
        ("%lld",klunk2int(data));
    else if (fmt == "FLT")
      KBOX_WINDOW->console_display->printf
        ("%f",klunk2flt(data));
    else if (fmt == "CHR")
      KBOX_WINDOW->console_display->printf
        ("%c",klunk2chr(data));
    else if (fmt == "STR")
      KBOX_WINDOW->console_display->printf
        ("%s",klunk2str(data));
    else if ((fmt == "HEX") ||
             (fmt == "PTR"))
      KBOX_WINDOW->console_display->printf
        ("%016llx",data);
    else
    {
      KBOX_WINDOW->console_display->printf
        ("invalid format entry: %s\n",oper1.c_str());
      VISUAL_KBOX.FLAGS.setPC(MAXPC);
      return;
    }
    VISUAL_KBOX.REGISTERS.set_register(sp_reg,
      VISUAL_KBOX.REGISTERS.get_register(sp_reg)+1);
  }
  else if (opcode == "PUTLN")
    KBOX_WINDOW->console_display->printf
      ("\n");

  else
  {
    KBOX_WINDOW->console_display->printf
      ("unrecognized instruction: %s\n",opcode.c_str());
    VISUAL_KBOX.FLAGS.setPC(MAXPC);
    return;
  }
}
