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); }
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); }