--- mon/src/mon_z80.cpp 2002/01/18 16:03:33 1.3 +++ mon/src/mon_z80.cpp 2002/08/04 14:53:33 1.4 @@ -46,10 +46,12 @@ enum { A_COND, // condition code (bits 3..5 of opcode) A_COND2, // condition code (bits 3..4 of opcode) A_BIT, // bit number (bits 3..5 of opcode) + A_BIT_REG1, // bit number (bits 3..5 of opcode) followed by 8-bit register (bits 0..2 of opcode) A_RST, // restart A_BC_IND, // (bc) A_DE_IND, // (de) A_HL_IND, // (hl) or (ix) or (iy) + A_XY_IND, // (ix+d) or (iy+d) A_SP_IND, // (sp) A_DE_HL, // de,hl A_AF_AF, // af,af' @@ -271,6 +273,15 @@ static void operand(SFILE *f, char mode, mon_sprintf(f, "%d", (op >> 3) & 7); break; + case A_BIT_REG1: { // undoc + int reg = op & 7; + if (reg == 6) + mon_sprintf(f, "%d", (op >> 3) & 7); + else + mon_sprintf(f, "%d,%s", (op >> 3) & 7, reg_name[reg]); + break; + } + case A_RST: mon_sprintf(f, "$%02x", op & 0x38); break; @@ -287,6 +298,10 @@ static void operand(SFILE *f, char mode, mon_sprintf(f, ix ? "(ix)" : (iy ? "(iy)" : "(hl)")); break; + case A_XY_IND: // undoc + mon_sprintf(f, "(%s+$%02x)", ix ? "ix" : "iy", mon_read_byte(adr)); adr++; + break; + case A_SP_IND: mon_sprintf(f, "(sp)"); break; @@ -337,7 +352,9 @@ static int disass_cb(SFILE *f, uint32 ad char mnem = M_ILLEGAL, dst_mode = A_IMPL, src_mode = A_IMPL; switch (op & 0xc0) { case 0x00: - dst_mode = A_REG1; + dst_mode = A_REG1X; + if ((ix || iy) && ((op & 7) != 6)) + src_mode = A_XY_IND; switch ((op >> 3) & 7) { case 0: mnem = M_RLC; break; case 1: mnem = M_RRC; break; @@ -350,13 +367,31 @@ static int disass_cb(SFILE *f, uint32 ad } break; case 0x40: - mnem = M_BIT; dst_mode = A_BIT; src_mode = A_REG1; + mnem = M_BIT; dst_mode = A_BIT; + if (ix || iy) + src_mode = A_XY_IND; + else + src_mode = A_REG1; break; case 0x80: - mnem = M_RES; dst_mode = A_BIT; src_mode = A_REG1; + mnem = M_RES; + if (ix || iy) { + dst_mode = A_BIT_REG1; + src_mode = A_XY_IND; + } else { + dst_mode = A_BIT; + src_mode = A_REG1; + } break; case 0xc0: - mnem = M_SET; dst_mode = A_BIT; src_mode = A_REG1; + mnem = M_SET; + if (ix || iy) { + dst_mode = A_BIT_REG1; + src_mode = A_XY_IND; + } else { + dst_mode = A_BIT; + src_mode = A_REG1; + } break; } @@ -380,10 +415,10 @@ static int disass_ed(SFILE *f, uint32 ad case 0x60: case 0x68: case 0x78: - mon_sprintf(f, "in\t%s,(c)", reg_name[(op >> 3) & 7]); + mon_sprintf(f, "in %s,(c)", reg_name[(op >> 3) & 7]); return 1; case 0x70: - mon_sprintf(f, "in\t(c)"); + mon_sprintf(f, "in (c)"); return 1; case 0x41: @@ -393,10 +428,10 @@ static int disass_ed(SFILE *f, uint32 ad case 0x61: case 0x69: case 0x79: - mon_sprintf(f, "out\t(c),%s", reg_name[(op >> 3) & 7]); + mon_sprintf(f, "out (c),%s", reg_name[(op >> 3) & 7]); return 1; case 0x71: // undoc - mon_sprintf(f, "out\t(c),0"); + mon_sprintf(f, "out (c),0"); return 1; case 0x42: @@ -465,16 +500,16 @@ static int disass_ed(SFILE *f, uint32 ad break; case 0x47: - mon_sprintf(f, "ld\ti,a"); + mon_sprintf(f, "ld i,a"); return 1; case 0x4f: - mon_sprintf(f, "ld\tr,a"); + mon_sprintf(f, "ld r,a"); return 1; case 0x57: - mon_sprintf(f, "ld\ta,i"); + mon_sprintf(f, "ld a,i"); return 1; case 0x5f: - mon_sprintf(f, "ld\ta,r"); + mon_sprintf(f, "ld a,r"); return 1; case 0x67: mnem = M_RRD; break; @@ -498,7 +533,7 @@ static int disass_ed(SFILE *f, uint32 ad case 0xbb: mnem = M_OTDR; break; default: - mnem = M_ILLEGAL; + mnem = M_NOP; break; }