Beispiel #1
0
static uint32 decode(uint8 offset_type, uint32 addr) {
  uint32 r = 0;

  switch(offset_type) {
    case OPTYPE_DP:
      r = (Registers.D.W + (addr & 0xffff)) & 0xffff;
      break;
    case OPTYPE_DPX:
      r = (Registers.D.W + Registers.X.W + (addr & 0xffff)) & 0xffff;
      break;
    case OPTYPE_DPY:
      r = (Registers.D.W + Registers.Y.W + (addr & 0xffff)) & 0xffff;
      break;
    case OPTYPE_IDP:
      addr = (Registers.D.W + (addr & 0xffff)) & 0xffff;
      r = (Registers.DB << 16) + dreadw(addr);
      break;
    case OPTYPE_IDPX:
      addr = (Registers.D.W + Registers.X.W + (addr & 0xffff)) & 0xffff;
      r = (Registers.DB << 16) + dreadw(addr);
      break;
    case OPTYPE_IDPY:
      addr = (Registers.D.W + (addr & 0xffff)) & 0xffff;
      r = (Registers.DB << 16) + dreadw(addr) + Registers.Y.W;
      break;
    case OPTYPE_ILDP:
      addr = (Registers.D.W + (addr & 0xffff)) & 0xffff;
      r = dreadl(addr);
      break;
    case OPTYPE_ILDPY:
      addr = (Registers.D.W + (addr & 0xffff)) & 0xffff;
      r = dreadl(addr) + Registers.Y.W;
      break;
    case OPTYPE_ADDR:
      r = (Registers.DB << 16) + (addr & 0xffff);
      break;
    case OPTYPE_ADDR_PC:
      r = (Registers.PB << 16) + (addr & 0xffff);
      break;
    case OPTYPE_ADDRX:
      r = (Registers.DB << 16) + (addr & 0xffff) + Registers.X.W;
      break;
    case OPTYPE_ADDRY:
      r = (Registers.DB << 16) + (addr & 0xffff) + Registers.Y.W;
      break;
    case OPTYPE_IADDR_PC:
      r = (Registers.PB << 16) + (addr & 0xffff);
      break;
    case OPTYPE_IADDRX:
      r = (Registers.PB << 16) + ((addr + Registers.X.W) & 0xffff);
      break;
    case OPTYPE_ILADDR:
      r = addr;
      break;
    case OPTYPE_LONG:
      r = addr;
      break;
    case OPTYPE_LONGX:
      r = (addr + Registers.X.W);
      break;
    case OPTYPE_SR:
      r = (Registers.S.W + (addr & 0xff)) & 0xffff;
      break;
    case OPTYPE_ISRY:
      addr = (Registers.S.W + (addr & 0xff)) & 0xffff;
      r = (Registers.DB << 16) + dreadw(addr) + Registers.Y.W;
      break;
    case OPTYPE_RELB:
      r  = (Registers.PB << 16) + ((Registers.PCw + 2) & 0xffff);
      r += (int8)(addr & 0xff);
      break;
    case OPTYPE_RELW:
      r  = (Registers.PB << 16) + ((Registers.PCw + 3) & 0xffff);
      r += (int16)(addr & 0xffff);
      break;
  }

  return(r & 0xffffff);
}
Beispiel #2
0
uint32 CPU::decode(uint8 offset_type, uint32 addr) {
    uint32 r = 0;

    switch(offset_type) {
    case OPTYPE_DP:
        r = (regs.d + (addr & 0xffff)) & 0xffff;
        break;
    case OPTYPE_DPX:
        r = (regs.d + regs.x + (addr & 0xffff)) & 0xffff;
        break;
    case OPTYPE_DPY:
        r = (regs.d + regs.y + (addr & 0xffff)) & 0xffff;
        break;
    case OPTYPE_IDP:
        addr = (regs.d + (addr & 0xffff)) & 0xffff;
        r = (regs.db << 16) + dreadw(addr);
        break;
    case OPTYPE_IDPX:
        addr = (regs.d + regs.x + (addr & 0xffff)) & 0xffff;
        r = (regs.db << 16) + dreadw(addr);
        break;
    case OPTYPE_IDPY:
        addr = (regs.d + (addr & 0xffff)) & 0xffff;
        r = (regs.db << 16) + dreadw(addr) + regs.y;
        break;
    case OPTYPE_ILDP:
        addr = (regs.d + (addr & 0xffff)) & 0xffff;
        r = dreadl(addr);
        break;
    case OPTYPE_ILDPY:
        addr = (regs.d + (addr & 0xffff)) & 0xffff;
        r = dreadl(addr) + regs.y;
        break;
    case OPTYPE_ADDR:
        r = (regs.db << 16) + (addr & 0xffff);
        break;
    case OPTYPE_ADDR_PC:
        r = (regs.pc.b << 16) + (addr & 0xffff);
        break;
    case OPTYPE_ADDRX:
        r = (regs.db << 16) + (addr & 0xffff) + regs.x;
        break;
    case OPTYPE_ADDRY:
        r = (regs.db << 16) + (addr & 0xffff) + regs.y;
        break;
    case OPTYPE_IADDR_PC:
        r = (regs.pc.b << 16) + (addr & 0xffff);
        break;
    case OPTYPE_IADDRX:
        r = (regs.pc.b << 16) + ((addr + regs.x) & 0xffff);
        break;
    case OPTYPE_ILADDR:
        r = addr;
        break;
    case OPTYPE_LONG:
        r = addr;
        break;
    case OPTYPE_LONGX:
        r = (addr + regs.x);
        break;
    case OPTYPE_SR:
        r = (regs.s + (addr & 0xff)) & 0xffff;
        break;
    case OPTYPE_ISRY:
        addr = (regs.s + (addr & 0xff)) & 0xffff;
        r = (regs.db << 16) + dreadw(addr) + regs.y;
        break;
    case OPTYPE_RELB:
        r  = (regs.pc.b << 16) + ((regs.pc.w + 2) & 0xffff);
        r += int8(addr);
        break;
    case OPTYPE_RELW:
        r  = (regs.pc.b << 16) + ((regs.pc.w + 3) & 0xffff);
        r += int16(addr);
        break;
    }

    return(r & 0xffffff);
}