diff options
Diffstat (limited to 'src/devices/cpu/mb86235/mb86235fe.cpp')
-rw-r--r-- | src/devices/cpu/mb86235/mb86235fe.cpp | 365 |
1 files changed, 207 insertions, 158 deletions
diff --git a/src/devices/cpu/mb86235/mb86235fe.cpp b/src/devices/cpu/mb86235/mb86235fe.cpp index 4c4e0717034..f55fb0934bf 100644 --- a/src/devices/cpu/mb86235/mb86235fe.cpp +++ b/src/devices/cpu/mb86235/mb86235fe.cpp @@ -11,45 +11,45 @@ #include "mb86235fe.h" -#define AA_USED(desc,x) do { (desc).regin[0] |= 1 << (x); } while(0) -#define AA_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (x); } while(0) -#define AB_USED(desc,x) do { (desc).regin[0] |= 1 << (8+(x)); } while(0) -#define AB_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (8+(x)); } while(0) -#define MA_USED(desc,x) do { (desc).regin[0] |= 1 << (16+(x)); } while(0) -#define MA_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (16+(x)); } while(0) -#define MB_USED(desc,x) do { (desc).regin[0] |= 1 << (24+(x)); } while(0) -#define MB_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (24+(x)); } while(0) -#define AR_USED(desc,x) do { (desc).regin[1] |= 1 << (24+(x)); } while(0) -#define AR_MODIFIED(desc,x) do { (desc).regout[1] |= 1 << (24+(x)); } while(0) - -#define AZ_USED(desc) do { (desc).regin[1] |= 1 << 0; } while (0) -#define AZ_MODIFIED(desc) do { (desc).regout[1] |= 1 << 0; } while (0) -#define AN_USED(desc) do { (desc).regin[1] |= 1 << 1; } while (0) -#define AN_MODIFIED(desc) do { (desc).regout[1] |= 1 << 1; } while (0) -#define AV_USED(desc) do { (desc).regin[1] |= 1 << 2; } while (0) -#define AV_MODIFIED(desc) do { (desc).regout[1] |= 1 << 2; } while (0) -#define AU_USED(desc) do { (desc).regin[1] |= 1 << 3; } while (0) -#define AU_MODIFIED(desc) do { (desc).regout[1] |= 1 << 3; } while (0) -#define AD_USED(desc) do { (desc).regin[1] |= 1 << 4; } while (0) -#define AD_MODIFIED(desc) do { (desc).regout[1] |= 1 << 4; } while (0) -#define ZC_USED(desc) do { (desc).regin[1] |= 1 << 5; } while (0) -#define ZC_MODIFIED(desc) do { (desc).regout[1] |= 1 << 5; } while (0) -#define IL_USED(desc) do { (desc).regin[1] |= 1 << 6; } while (0) -#define IL_MODIFIED(desc) do { (desc).regout[1] |= 1 << 6; } while (0) -#define NR_USED(desc) do { (desc).regin[1] |= 1 << 7; } while (0) -#define NR_MODIFIED(desc) do { (desc).regout[1] |= 1 << 7; } while (0) -#define ZD_USED(desc) do { (desc).regin[1] |= 1 << 8; } while (0) -#define ZD_MODIFIED(desc) do { (desc).regout[1] |= 1 << 8; } while (0) -#define MN_USED(desc) do { (desc).regin[1] |= 1 << 9; } while (0) -#define MN_MODIFIED(desc) do { (desc).regout[1] |= 1 << 9; } while (0) -#define MZ_USED(desc) do { (desc).regin[1] |= 1 << 10; } while (0) -#define MZ_MODIFIED(desc) do { (desc).regout[1] |= 1 << 10; } while (0) -#define MV_USED(desc) do { (desc).regin[1] |= 1 << 11; } while (0) -#define MV_MODIFIED(desc) do { (desc).regout[1] |= 1 << 11; } while (0) -#define MU_USED(desc) do { (desc).regin[1] |= 1 << 12; } while (0) -#define MU_MODIFIED(desc) do { (desc).regout[1] |= 1 << 12; } while (0) -#define MD_USED(desc) do { (desc).regin[1] |= 1 << 13; } while (0) -#define MD_MODIFIED(desc) do { (desc).regout[1] |= 1 << 13; } while (0) +#define AA_USED(desc,x) do { (desc).regin[0] |= 1 << (x); } while(0) +#define AA_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (x); } while(0) +#define AB_USED(desc,x) do { (desc).regin[0] |= 1 << (8+(x)); } while(0) +#define AB_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (8+(x)); } while(0) +#define MA_USED(desc,x) do { (desc).regin[0] |= 1 << (16+(x)); } while(0) +#define MA_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (16+(x)); } while(0) +#define MB_USED(desc,x) do { (desc).regin[0] |= 1 << (24+(x)); } while(0) +#define MB_MODIFIED(desc,x) do { (desc).regout[0] |= 1 << (24+(x)); } while(0) +#define AR_USED(desc,x) do { (desc).regin[1] |= 1 << (24+(x)); } while(0) +#define AR_MODIFIED(desc,x) do { (desc).regout[1] |= 1 << (24+(x)); } while(0) + +#define AZ_USED(desc) do { (desc).regin[1] |= 1 << 0; } while (0) +#define AZ_MODIFIED(desc) do { (desc).regout[1] |= 1 << 0; } while (0) +#define AN_USED(desc) do { (desc).regin[1] |= 1 << 1; } while (0) +#define AN_MODIFIED(desc) do { (desc).regout[1] |= 1 << 1; } while (0) +#define AV_USED(desc) do { (desc).regin[1] |= 1 << 2; } while (0) +#define AV_MODIFIED(desc) do { (desc).regout[1] |= 1 << 2; } while (0) +#define AU_USED(desc) do { (desc).regin[1] |= 1 << 3; } while (0) +#define AU_MODIFIED(desc) do { (desc).regout[1] |= 1 << 3; } while (0) +#define AD_USED(desc) do { (desc).regin[1] |= 1 << 4; } while (0) +#define AD_MODIFIED(desc) do { (desc).regout[1] |= 1 << 4; } while (0) +#define ZC_USED(desc) do { (desc).regin[1] |= 1 << 5; } while (0) +#define ZC_MODIFIED(desc) do { (desc).regout[1] |= 1 << 5; } while (0) +#define IL_USED(desc) do { (desc).regin[1] |= 1 << 6; } while (0) +#define IL_MODIFIED(desc) do { (desc).regout[1] |= 1 << 6; } while (0) +#define NR_USED(desc) do { (desc).regin[1] |= 1 << 7; } while (0) +#define NR_MODIFIED(desc) do { (desc).regout[1] |= 1 << 7; } while (0) +#define ZD_USED(desc) do { (desc).regin[1] |= 1 << 8; } while (0) +#define ZD_MODIFIED(desc) do { (desc).regout[1] |= 1 << 8; } while (0) +#define MN_USED(desc) do { (desc).regin[1] |= 1 << 9; } while (0) +#define MN_MODIFIED(desc) do { (desc).regout[1] |= 1 << 9; } while (0) +#define MZ_USED(desc) do { (desc).regin[1] |= 1 << 10; } while (0) +#define MZ_MODIFIED(desc) do { (desc).regout[1] |= 1 << 10; } while (0) +#define MV_USED(desc) do { (desc).regin[1] |= 1 << 11; } while (0) +#define MV_MODIFIED(desc) do { (desc).regout[1] |= 1 << 11; } while (0) +#define MU_USED(desc) do { (desc).regin[1] |= 1 << 12; } while (0) +#define MU_MODIFIED(desc) do { (desc).regout[1] |= 1 << 12; } while (0) +#define MD_USED(desc) do { (desc).regin[1] |= 1 << 13; } while (0) +#define MD_MODIFIED(desc) do { (desc).regout[1] |= 1 << 13; } while (0) mb86235_frontend::mb86235_frontend(mb86235_device *core, uint32_t window_start, uint32_t window_end, uint32_t max_sequence) @@ -137,18 +137,18 @@ void mb86235_frontend::describe_alu_input(opcode_desc &desc, int reg) AB_USED(desc, reg & 7); break; - case 0x10: // PR + case 0x10: // PR break; - case 0x11: // PR++ + case 0x11: // PR++ desc.userflags &= ~OP_USERFLAG_PR_MASK; desc.userflags |= OP_USERFLAG_PR_INC; break; - case 0x12: // PR-- + case 0x12: // PR-- desc.userflags &= ~OP_USERFLAG_PR_MASK; desc.userflags |= OP_USERFLAG_PR_DEC; break; - case 0x13: // PR#0 + case 0x13: // PR#0 desc.userflags &= ~OP_USERFLAG_PR_MASK; desc.userflags |= OP_USERFLAG_PR_ZERO; break; @@ -171,23 +171,23 @@ void mb86235_frontend::describe_mul_input(opcode_desc &desc, int reg) MB_USED(desc, reg & 7); break; - case 0x10: // PR + case 0x10: // PR break; - case 0x11: // PR++ - if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU PR update has higher priority + case 0x11: // PR++ + if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU PR update has higher priority { desc.userflags |= OP_USERFLAG_PR_INC; } break; - case 0x12: // PR-- - if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU PR update has higher priority + case 0x12: // PR-- + if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU PR update has higher priority { desc.userflags |= OP_USERFLAG_PR_DEC; } break; - case 0x13: // PR#0 - if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU PR update has higher priority + case 0x13: // PR#0 + if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU PR update has higher priority { desc.userflags |= OP_USERFLAG_PR_ZERO; } @@ -248,31 +248,31 @@ void mb86235_frontend::describe_reg_read(opcode_desc &desc, int reg) AB_USED(desc, reg & 7); break; - case 0x31: // FI + case 0x31: // FI desc.userflags |= OP_USERFLAG_FIFOIN; - desc.flags |= OPFLAG_IS_BRANCH_TARGET; // fifo check makes this a branch target + desc.flags |= OPFLAG_IS_BRANCH_TARGET; // fifo check makes this a branch target break; - case 0x32: // FO0 + case 0x32: // FO0 break; - case 0x33: // FO1 + case 0x33: // FO1 break; - case 0x10: // EB - case 0x11: // EBU - case 0x12: // EBL - case 0x13: // EO - case 0x15: // ST - case 0x16: // MOD - case 0x17: // LRPC - case 0x34: // PDR - case 0x35: // DDR - case 0x36: // PRP - case 0x37: // PWP + case 0x10: // EB + case 0x11: // EBU + case 0x12: // EBL + case 0x13: // EO + case 0x15: // ST + case 0x16: // MOD + case 0x17: // LRPC + case 0x34: // PDR + case 0x35: // DDR + case 0x36: // PRP + case 0x37: // PWP break; - case 0x30: // PR - if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU and MUL PR updates have higher priority + case 0x30: // PR + if ((desc.userflags & OP_USERFLAG_PR_MASK) == 0) // ALU and MUL PR updates have higher priority { desc.userflags |= OP_USERFLAG_PR_INC; } @@ -305,32 +305,32 @@ void mb86235_frontend::describe_reg_write(opcode_desc &desc, int reg) AB_MODIFIED(desc, reg & 7); break; - case 0x31: // FI + case 0x31: // FI break; - case 0x32: // FO0 + case 0x32: // FO0 desc.userflags |= OP_USERFLAG_FIFOOUT0; - desc.flags |= OPFLAG_IS_BRANCH_TARGET; // fifo check makes this a branch target + desc.flags |= OPFLAG_IS_BRANCH_TARGET; // fifo check makes this a branch target break; - case 0x33: // FO1 + case 0x33: // FO1 desc.userflags |= OP_USERFLAG_FIFOOUT1; - desc.flags |= OPFLAG_IS_BRANCH_TARGET; // fifo check makes this a branch target + desc.flags |= OPFLAG_IS_BRANCH_TARGET; // fifo check makes this a branch target break; - case 0x10: // EB - case 0x11: // EBU - case 0x12: // EBL - case 0x13: // EO - case 0x15: // ST - case 0x16: // MOD - case 0x17: // LRPC - case 0x34: // PDR - case 0x35: // DDR - case 0x36: // PRP - case 0x37: // PWP + case 0x10: // EB + case 0x11: // EBU + case 0x12: // EBL + case 0x13: // EO + case 0x15: // ST + case 0x16: // MOD + case 0x17: // LRPC + case 0x34: // PDR + case 0x35: // DDR + case 0x36: // PRP + case 0x37: // PWP break; - case 0x30: // PR + case 0x30: // PR desc.userflags &= ~OP_USERFLAG_PW_MASK; desc.userflags |= OP_USERFLAG_PW_INC; break; @@ -347,14 +347,14 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) switch (op) { - case 0x00: // FADD + case 0x00: // FADD describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x01: // FADDZ + case 0x01: // FADDZ describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); ZC_MODIFIED(desc); AN_MODIFIED(desc); @@ -363,7 +363,7 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x02: // FSUB + case 0x02: // FSUB describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); @@ -371,7 +371,7 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x03: // FSUBZ + case 0x03: // FSUBZ describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); ZC_MODIFIED(desc); AN_MODIFIED(desc); @@ -380,7 +380,7 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x04: // FCMP + case 0x04: // FCMP describe_alu_input(desc, i1); describe_alu_input(desc, i2); AN_MODIFIED(desc); AZ_MODIFIED(desc); @@ -388,36 +388,36 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x05: // FABS + case 0x05: // FABS describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x06: // FABC + case 0x06: // FABC describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x07: // NOP + case 0x07: // NOP break; - case 0x08: // FEA + case 0x08: // FEA describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x09: // FES + case 0x09: // FES describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x0a: // FRCP + case 0x0a: // FRCP describe_alu_input(desc, i1); describe_alumul_output(desc, io); ZD_MODIFIED(desc); AN_MODIFIED(desc); @@ -425,7 +425,7 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x0b: // FRSQ + case 0x0b: // FRSQ describe_alu_input(desc, i1); describe_alumul_output(desc, io); NR_MODIFIED(desc); AN_MODIFIED(desc); @@ -433,26 +433,26 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AU_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x0c: // FLOG + case 0x0c: // FLOG describe_alu_input(desc, i1); describe_alumul_output(desc, io); IL_MODIFIED(desc); AN_MODIFIED(desc); AZ_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x0d: // CIF + case 0x0d: // CIF describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); break; - case 0x0e: // CFI + case 0x0e: // CFI describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AD_MODIFIED(desc); break; - case 0x0f: // CFIB + case 0x0f: // CFIB describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); @@ -460,99 +460,99 @@ void mb86235_frontend::describe_alu(opcode_desc &desc, uint32_t aluop) AD_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x10: // ADD + case 0x10: // ADD describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); break; - case 0x11: // ADDZ + case 0x11: // ADDZ describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); ZC_MODIFIED(desc); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); break; - case 0x12: // SUB + case 0x12: // SUB describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); break; - case 0x13: // SUBZ + case 0x13: // SUBZ describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); ZC_MODIFIED(desc); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); break; - case 0x14: // CMP + case 0x14: // CMP describe_alu_input(desc, i1); describe_alu_input(desc, i2); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); break; - case 0x15: // ABS + case 0x15: // ABS describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); break; - case 0x16: // ATR + case 0x16: // ATR describe_alu_input(desc, i1); describe_alumul_output(desc, io); break; - case 0x17: // ATRZ + case 0x17: // ATRZ describe_alu_input(desc, i1); describe_alumul_output(desc, io); ZC_MODIFIED(desc); break; - case 0x18: // AND + case 0x18: // AND describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x19: // OR + case 0x19: // OR describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x1a: // XOR + case 0x1a: // XOR describe_alu_input(desc, i1); describe_alu_input(desc, i2); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x1b: // NOT + case 0x1b: // NOT describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x1c: // LSR + case 0x1c: // LSR describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x1d: // LSL + case 0x1d: // LSL describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); AV_MODIFIED(desc); AU_MODIFIED(desc); break; - case 0x1e: // ASR + case 0x1e: // ASR describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); break; - case 0x1f: // ASL + case 0x1f: // ASL describe_alu_input(desc, i1); describe_alumul_output(desc, io); AN_MODIFIED(desc); AZ_MODIFIED(desc); @@ -593,51 +593,51 @@ void mb86235_frontend::describe_ea(opcode_desc &desc, int md, int arx, int ary, { switch (md) { - case 0x0: // @ARx + case 0x0: // @ARx AR_USED(desc, arx); break; - case 0x1: // @ARx++ + case 0x1: // @ARx++ AR_USED(desc, arx); AR_MODIFIED(desc, arx); break; - case 0x2: // @ARx-- + case 0x2: // @ARx-- AR_USED(desc, arx); AR_MODIFIED(desc, arx); break; - case 0x3: // @ARx++disp + case 0x3: // @ARx++disp AR_USED(desc, arx); AR_MODIFIED(desc, arx); break; - case 0x4: // @ARx+ARy + case 0x4: // @ARx+ARy AR_USED(desc, arx); AR_USED(desc, ary); break; - case 0x5: // @ARx+ARy++ + case 0x5: // @ARx+ARy++ AR_USED(desc, arx); AR_USED(desc, ary); AR_MODIFIED(desc, ary); break; - case 0x6: // @ARx+ARy-- + case 0x6: // @ARx+ARy-- AR_USED(desc, arx); AR_USED(desc, ary); AR_MODIFIED(desc, ary); break; - case 0x7: // @ARx+ARy++disp + case 0x7: // @ARx+ARy++disp AR_USED(desc, arx); AR_USED(desc, ary); AR_MODIFIED(desc, ary); break; - case 0x8: // @ARx+ARyU + case 0x8: // @ARx+ARyU AR_USED(desc, arx); AR_USED(desc, ary); break; - case 0x9: // @ARx+ARyL + case 0x9: // @ARx+ARyL AR_USED(desc, arx); AR_USED(desc, ary); break; - case 0xa: // @ARx+disp + case 0xa: // @ARx+disp AR_USED(desc, arx); break; - case 0xb: // @ARx+ARy+disp + case 0xb: // @ARx+ARy+disp AR_USED(desc, arx); AR_USED(desc, ary); break; - case 0xc: // @disp + case 0xc: // @disp break; - case 0xd: // @ARx+[ARy++] + case 0xd: // @ARx+[ARy++] AR_USED(desc, arx); AR_USED(desc, ary); AR_MODIFIED(desc, ary); break; - case 0xe: // @ARx+[ARy--] + case 0xe: // @ARx+[ARy--] AR_USED(desc, arx); AR_USED(desc, ary); AR_MODIFIED(desc, ary); break; - case 0xf: // @ARx+[ARy++disp] + case 0xf: // @ARx+[ARy++disp] AR_USED(desc, arx); AR_USED(desc, ary); AR_MODIFIED(desc, ary); break; } @@ -646,12 +646,61 @@ void mb86235_frontend::describe_ea(opcode_desc &desc, int md, int arx, int ary, void mb86235_frontend::describe_xfer1(opcode_desc &desc) { uint64_t opcode = desc.opptr.q[0]; - fatalerror("mb86235_frontend: describe_xfer1 at %08X (%08X%08X)", desc.pc, (uint32_t)(opcode >> 32), (uint32_t)(opcode)); + + int dr = (opcode >> 12) & 0x7f; + int sr = (opcode >> 19) & 0x7f; + int md = opcode & 0xf; + int ary = (opcode >> 4) & 7; + int disp5 = (opcode >> 7) & 0x1f; + int trm = (opcode >> 26) & 1; + int dir = (opcode >> 25) & 1; + + if (trm == 0) + { + if ((sr & 0x40) == 0) + { + describe_reg_read(desc, sr & 0x3f); + } + else if (sr == 0x58) + { + // MOV1 #imm12, DR + } + else + { + describe_ea(desc, md, sr & 7, ary, disp5); + desc.flags |= OPFLAG_READS_MEMORY; + } + + if ((dr & 0x40) == 0) + { + describe_reg_write(desc, dr & 0x3f); + } + else + { + describe_ea(desc, md, dr & 7, ary, disp5); + desc.flags |= OPFLAG_WRITES_MEMORY; + } + } + else + { + // external transfer + if (dir == 0) + { + describe_reg_read(desc, dr & 0x3f); + desc.flags |= OPFLAG_WRITES_MEMORY; + } + else + { + describe_reg_write(desc, dr & 0x3f); + desc.flags |= OPFLAG_READS_MEMORY; + } + } } void mb86235_frontend::describe_double_xfer1(opcode_desc &desc) { uint64_t opcode = desc.opptr.q[0]; + fatalerror("mb86235_frontend: describe_double_xfer1 at %08X (%08X%08X)", desc.pc, (uint32_t)(opcode >> 32), (uint32_t)(opcode)); } @@ -668,7 +717,7 @@ void mb86235_frontend::describe_xfer2(opcode_desc &desc) int md = opcode & 0xf; int disp14 = (opcode >> 7) & 0x3fff; - if (op == 0) // MOV2 + if (op == 0) // MOV2 { if (trm == 0) { @@ -711,7 +760,7 @@ void mb86235_frontend::describe_xfer2(opcode_desc &desc) } } } - else if (op == 2) // MOV4 + else if (op == 2) // MOV4 { fatalerror("mb86235_frontend: describe_xfer2 MOV4 at %08X (%08X%08X)", desc.pc, (uint32_t)(opcode >> 32), (uint32_t)(opcode)); } @@ -733,15 +782,15 @@ void mb86235_frontend::describe_xfer3(opcode_desc &desc) int ary = (opcode >> 4) & 7; int md = opcode & 0xf; - switch (dr >> 4) + switch (dr >> 5) { case 0: - case 1: // reg + case 1: // reg describe_reg_write(desc, dr & 0x3f); break; - case 2: // RAM-A - case 3: // RAM-B + case 2: // RAM-A + case 3: // RAM-B desc.flags |= OPFLAG_WRITES_MEMORY; describe_ea(desc, md, dr & 7, ary, disp); break; @@ -757,56 +806,56 @@ void mb86235_frontend::describe_control(opcode_desc &desc) switch (cop) { - case 0x00: // NOP + case 0x00: // NOP break; - case 0x01: // REP - if (ef1 != 0) // ARx + case 0x01: // REP + if (ef1 != 0) // ARx AR_USED(desc, (ef2 >> 12) & 7); desc.userflags |= OP_USERFLAG_REPEAT; break; - case 0x02: // SETL - if (ef1 != 0) // ARx + case 0x02: // SETL + if (ef1 != 0) // ARx AR_USED(desc, (ef2 >> 12) & 7); break; - case 0x03: // CLRFI/CLRFO/CLRF + case 0x03: // CLRFI/CLRFO/CLRF break; - case 0x04: // PUSH + case 0x04: // PUSH describe_reg_read(desc, (ef2 >> 6) & 0x3f); break; - case 0x05: // POP + case 0x05: // POP describe_reg_write(desc, (ef2 >> 6) & 0x3f); break; - case 0x08: // SETM #imm16 + case 0x08: // SETM #imm16 break; - case 0x09: // SETM #imm3, CBSA + case 0x09: // SETM #imm3, CBSA break; - case 0x0a: // SETM #imm3, CBSB + case 0x0a: // SETM #imm3, CBSB break; - case 0x0b: // SETM #imm1, RF + case 0x0b: // SETM #imm1, RF break; - case 0x0c: // SETM #imm1, RDY + case 0x0c: // SETM #imm1, RDY break; - case 0x0d: // SETM #imm1, WAIT + case 0x0d: // SETM #imm1, WAIT break; - case 0x13: // DBLP rel12 + case 0x13: // DBLP rel12 desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; desc.targetpc = desc.pc + rel12; desc.delayslots = 1; break; - case 0x14: // DBBC ARx:y, rel12 + case 0x14: // DBBC ARx:y, rel12 desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; desc.targetpc = desc.pc + rel12; desc.delayslots = 1; AR_USED(desc, ((desc.opptr.q[0] >> 13) & 7)); break; - case 0x15: // DBBS ARx:y, rel12 + case 0x15: // DBBS ARx:y, rel12 desc.flags |= OPFLAG_IS_CONDITIONAL_BRANCH; desc.targetpc = desc.pc + rel12; desc.delayslots = 1; AR_USED(desc, ((desc.opptr.q[0] >> 13) & 7)); break; - case 0x1b: // DRET + case 0x1b: // DRET desc.flags |= OPFLAG_IS_UNCONDITIONAL_BRANCH | OPFLAG_END_SEQUENCE; desc.targetpc = BRANCH_TARGET_DYNAMIC; desc.delayslots = 1; @@ -870,4 +919,4 @@ void mb86235_frontend::describe_control(opcode_desc &desc) break; } } -}
\ No newline at end of file +} |