diff options
Diffstat (limited to 'src/devices/cpu/xavix2/xavix2d.cpp')
-rw-r--r-- | src/devices/cpu/xavix2/xavix2d.cpp | 99 |
1 files changed, 62 insertions, 37 deletions
diff --git a/src/devices/cpu/xavix2/xavix2d.cpp b/src/devices/cpu/xavix2/xavix2d.cpp index c0aa33ab716..7e36eb4e280 100644 --- a/src/devices/cpu/xavix2/xavix2d.cpp +++ b/src/devices/cpu/xavix2/xavix2d.cpp @@ -39,6 +39,15 @@ std::string xavix2_disassembler::val22s() return util::string_format("%06x", r); } +std::string xavix2_disassembler::val19s() +{ + u32 r = m_opcode & 0x7ffff; + if(m_opcode & 0x40000) + return util::string_format("-%06x", 0x80000 - r); + else + return util::string_format("%06x", r); +} + std::string xavix2_disassembler::val19u() { return util::string_format("%05x", m_opcode & 0x7ffff); @@ -145,16 +154,21 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d u32 flags = 0; switch(m_opcode >> 24) { - // 00-05 + case 0x00: case 0x01: util::stream_format(stream, "%s = %s + %s", r1(), r2(), val19s()); break; + // 02-03 + case 0x04: case 0x05: util::stream_format(stream, "%s = %s - %s", r1(), r2(), val19s()); break; case 0x06: case 0x07: util::stream_format(stream, "%s = %s", r1(), val22s()); break; case 0x08: util::stream_format(stream, "jmp %s", adr24()); break; case 0x09: util::stream_format(stream, "jsr %s", adr24()); flags = STEP_OVER; break; case 0x0a: case 0x0b: util::stream_format(stream, "%s = %s & %s", r1(), r2(), val19u()); break; case 0x0c: case 0x0d: util::stream_format(stream, "%s = %s | %s", r1(), r2(), val19u()); break; - // 0e-1f + case 0x0e: case 0x0f: util::stream_format(stream, "%s = %s ^ %s", r1(), r2(), val19u()); break; + + // 10-1f - case 0x20: util::stream_format(stream, "jmp %s", adr16()); break; - case 0x21: util::stream_format(stream, "jsr %s", adr16()); flags = STEP_OVER; break; + // case 0x20: util::stream_format(stream, "jmp %s", adr16()); break; + // case 0x21: util::stream_format(stream, "jsr %s", adr16()); flags = STEP_OVER; break; + case 0x20: case 0x21: util::stream_format(stream, "%s += %s", r1(), val14s()); break; case 0x22: case 0x23: util::stream_format(stream, "%s = %s", r1(), val14h()); break; case 0x24: case 0x25: util::stream_format(stream, "%s -= %s", r1(), val14s()); break; case 0x26: case 0x27: util::stream_format(stream, "cmp %s, %s", r1(), val14s()); break; @@ -162,21 +176,24 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case 0x29: util::stream_format(stream, "bsr %s", rel16()); flags = STEP_OVER; break; case 0x2a: case 0x2b: util::stream_format(stream, "%s = %s & %s", r1(), r2(), val11u()); break; case 0x2c: case 0x2d: util::stream_format(stream, "%s = %s | %s", r1(), r2(), val11u()); break; - // 2e-41 + case 0x2e: case 0x2f: util::stream_format(stream, "%s = %s ^ %s", r1(), r2(), val11u()); break; + + // 30-3f - case 0x42: case 0x43: util::stream_format(stream, "%s = (%s%s).b", r1(), r2(), off11s()); break; - case 0x44: case 0x45: util::stream_format(stream, "%s = (%s%s).w", r1(), r2(), off11s()); break; - case 0x46: case 0x47: util::stream_format(stream, "%s = (%s%s).w???", r1(), r2(), off11s()); break; + case 0x40: case 0x41: util::stream_format(stream, "%s = (%s%s).bs", r1(), r2(), off11s()); break; + case 0x42: case 0x43: util::stream_format(stream, "%s = (%s%s).bu", r1(), r2(), off11s()); break; + case 0x44: case 0x45: util::stream_format(stream, "%s = (%s%s).ws", r1(), r2(), off11s()); break; + case 0x46: case 0x47: util::stream_format(stream, "%s = (%s%s).wu", r1(), r2(), off11s()); break; case 0x48: case 0x49: util::stream_format(stream, "%s = (%s%s).l", r1(), r2(), off11s()); break; case 0x4a: case 0x4b: util::stream_format(stream, "(%s%s).b = %s", r2(), off11s(), r1()); break; case 0x4c: case 0x4d: util::stream_format(stream, "(%s%s).w = %s", r2(), off11s(), r1()); break; case 0x4e: case 0x4f: util::stream_format(stream, "(%s%s).l = %s", r2(), off11s(), r1()); break; - case 0x50: case 0x51: util::stream_format(stream, "%s = %s.b???", r1(), val14u()); break; - case 0x52: case 0x53: util::stream_format(stream, "%s = %s.b", r1(), val14u()); break; - case 0x54: case 0x55: util::stream_format(stream, "%s = %s.w", r1(), val14u()); break; - case 0x56: case 0x57: util::stream_format(stream, "%s = %s.l", r1(), val14u()); break; - case 0x58: case 0x59: util::stream_format(stream, "%s.b = %s???", val14u(), r1()); break; + case 0x50: case 0x51: util::stream_format(stream, "%s = %s.bs", r1(), val14u()); break; + case 0x52: case 0x53: util::stream_format(stream, "%s = %s.bu", r1(), val14u()); break; + case 0x54: case 0x55: util::stream_format(stream, "%s = %s.ws", r1(), val14u()); break; + case 0x56: case 0x57: util::stream_format(stream, "%s = %s.wu", r1(), val14u()); break; + case 0x58: case 0x59: util::stream_format(stream, "%s = %s.l", r1(), val14u()); break; case 0x5a: case 0x5b: util::stream_format(stream, "%s.b = %s", val14u(), r1()); break; case 0x5c: case 0x5d: util::stream_format(stream, "%s.w = %s", val14u(), r1()); break; case 0x5e: case 0x5f: util::stream_format(stream, "%s.l = %s", val14u(), r1()); break; @@ -185,27 +202,32 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case 0x62: case 0x63: util::stream_format(stream, "%s = %s", r1(), val6s()); break; case 0x64: case 0x65: util::stream_format(stream, "%s -= %s", r1(), val6s()); break; case 0x66: case 0x67: util::stream_format(stream, "cmp %s, %s", r1(), val6s()); break; - // 68-6b + // 68-69 + case 0x6a: case 0x6b: util::stream_format(stream, "%s = %s >>s %s", r1(), r2(), val3u()); break; case 0x6c: case 0x6d: util::stream_format(stream, "%s = %s >> %s", r1(), r2(), val3u()); break; case 0x6e: case 0x6f: util::stream_format(stream, "%s = %s << %s", r1(), r2(), val3u()); break; - // 70-77 + case 0x70: case 0x71: util::stream_format(stream, "%s = (sp%s).bs", r1(), off6s()); break; + case 0x72: case 0x73: util::stream_format(stream, "%s = (sp%s).bu", r1(), off6s()); break; + case 0x74: case 0x75: util::stream_format(stream, "%s = (sp%s).ws", r1(), off6s()); break; + case 0x76: case 0x77: util::stream_format(stream, "%s = (sp%s).wu", r1(), off6s()); break; case 0x78: case 0x79: util::stream_format(stream, "%s = (sp%s).l", r1(), off6s()); break; - // 7a-7d + case 0x7a: case 0x7b: util::stream_format(stream, "(sp%s).b = %s", off6s(), r1()); break; + case 0x7c: case 0x7d: util::stream_format(stream, "(sp%s).w = %s", off6s(), r1()); break; case 0x7e: case 0x7f: util::stream_format(stream, "(sp%s).l = %s", off6s(), r1()); break; case 0x80: case 0x81: util::stream_format(stream, "%s = %s + %s", r1(), r2(), r3()); break; // 82-83 - case 0x84: case 0x85: util::stream_format(stream, "?84 %s %s %s", r1(), r2(), r3()); break; + case 0x84: case 0x85: util::stream_format(stream, "%s = %s - %s", r1(), r2(), r3()); break; // 86-89 case 0x8a: case 0x8b: util::stream_format(stream, "%s = %s & %s", r1(), r2(), r3()); break; case 0x8c: case 0x8d: util::stream_format(stream, "%s = %s | %s", r1(), r2(), r3()); break; - // 8e-8f + case 0x8e: case 0x8f: util::stream_format(stream, "%s = %s ^ %s", r1(), r2(), r3()); break; - case 0x90: case 0x91: util::stream_format(stream, "%s = (%s%s).b???", r1(), r2(), off3s()); break; - case 0x92: case 0x93: util::stream_format(stream, "%s = (%s%s).b", r1(), r2(), off3s()); break; - case 0x94: case 0x95: util::stream_format(stream, "(%s%s).b = %s???", r2(), off3s(), r1()); break; - case 0x96: case 0x97: util::stream_format(stream, "%s = (%s%s).w", r1(), r2(), off3s()); break; + case 0x90: case 0x91: util::stream_format(stream, "%s = (%s%s).bs", r1(), r2(), off3s()); break; + case 0x92: case 0x93: util::stream_format(stream, "%s = (%s%s).bu", r1(), r2(), off3s()); break; + case 0x94: case 0x95: util::stream_format(stream, "%s = (%s%s).ws", r1(), r2(), off3s()); break; + case 0x96: case 0x97: util::stream_format(stream, "%s = (%s%s).wu", r1(), r2(), off3s()); break; case 0x98: case 0x99: util::stream_format(stream, "%s = (%s%s).l", r1(), r2(), off3s()); break; case 0x9a: case 0x9b: util::stream_format(stream, "(%s%s).b = %s", r2(), off3s(), r1()); break; case 0x9c: case 0x9d: util::stream_format(stream, "(%s%s).w = %s", r2(), off3s(), r1()); break; @@ -215,7 +237,8 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case 0xa2: case 0xa3: util::stream_format(stream, "%s = %s", r1(), r2()); break; // a4-a5 case 0xa6: case 0xa7: util::stream_format(stream, "cmp %s, %s", r1(), r2()); break; - // a8-ab + // a8-a9 + case 0xaa: case 0xab: util::stream_format(stream, "%s = %s >>s %s", r1(), r2(), r3()); break; case 0xac: case 0xad: util::stream_format(stream, "%s = %s >> %s", r1(), r2(), r3()); break; case 0xae: case 0xaf: util::stream_format(stream, "%s = %s << %s", r1(), r2(), r3()); break; @@ -223,28 +246,30 @@ offs_t xavix2_disassembler::disassemble(std::ostream &stream, offs_t pc, const d case 0xb2: case 0xb3: util::stream_format(stream, "?b2 %s %s %s", r1(), r2(), r3()); break; // b4-cf - case 0xd0: util::stream_format(stream, "b??0 %s", rel8()); break; - case 0xd1: util::stream_format(stream, "b??1 %s", rel8()); break; - case 0xd2: util::stream_format(stream, "bles %s", rel8()); break; - case 0xd3: util::stream_format(stream, "b??3 %s", rel8()); break; - case 0xd4: util::stream_format(stream, "b??4 %s", rel8()); break; - case 0xd5: util::stream_format(stream, "b??5 %s", rel8()); break; - case 0xd6: util::stream_format(stream, "b??6 %s", rel8()); break; + case 0xd0: util::stream_format(stream, "b?0 %s", rel8()); break; + case 0xd1: util::stream_format(stream, "b?1 %s", rel8()); break; + case 0xd2: util::stream_format(stream, "beq %s", rel8()); break; + case 0xd3: util::stream_format(stream, "bles %s", rel8()); break; + case 0xd4: util::stream_format(stream, "b?4 %s", rel8()); break; + case 0xd5: util::stream_format(stream, "bra %s", rel8()); break; + case 0xd6: util::stream_format(stream, "b?6 %s", rel8()); break; case 0xd7: util::stream_format(stream, "bleu %s", rel8()); break; - case 0xd8: util::stream_format(stream, "b??8 %s", rel8()); break; - case 0xd9: util::stream_format(stream, "b??9 %s", rel8()); break; + case 0xd8: util::stream_format(stream, "b?8 %s", rel8()); break; + case 0xd9: util::stream_format(stream, "b?9 %s", rel8()); break; case 0xda: util::stream_format(stream, "bne %s", rel8()); break; case 0xdb: util::stream_format(stream, "bgts %s", rel8()); break; - case 0xdc: util::stream_format(stream, "b??c %s", rel8()); break; - case 0xdd: util::stream_format(stream, "b??d %s", rel8()); break; - case 0xde: util::stream_format(stream, "b??e %s", rel8()); break; - case 0xdf: util::stream_format(stream, "b??f %s", rel8()); break; + case 0xdc: util::stream_format(stream, "b?c %s", rel8()); break; + case 0xdd: util::stream_format(stream, "b?d %s", rel8()); break; + case 0xde: util::stream_format(stream, "b?e %s", rel8()); break; + case 0xdf: util::stream_format(stream, "b?f %s", rel8()); break; case 0xe0: util::stream_format(stream, "jmp lr"); flags = STEP_OUT; break; case 0xe1: util::stream_format(stream, "rti1"); flags = STEP_OUT; break; // e2 case 0xe3: util::stream_format(stream, "rti2"); flags = STEP_OUT; break; - // e4-ff + // e4-fb + case 0xfc: util::stream_format(stream, "nop"); break; + // fd-ff default: util::stream_format(stream, "?%02x", m_opcode >> 24); } |