Ejemplo n.º 1
0
static void delay_slot(UINT16 startpc)
{
	tms.op = ROPCODE();
	tms32051_opcode_table[tms.op >> 8]();

	while (tms.pc - startpc < 2)
	{
		tms.op = ROPCODE();
		tms32051_opcode_table[tms.op >> 8]();
	}
}
Ejemplo n.º 2
0
static void delay_slot(tms32051_state *cpustate, UINT16 startpc)
{
	cpustate->op = ROPCODE(cpustate);
	tms32051_opcode_table[cpustate->op >> 8](cpustate);

	while (cpustate->pc - startpc < 2)
	{
		cpustate->op = ROPCODE(cpustate);
		tms32051_opcode_table[cpustate->op >> 8](cpustate);
	}
}
Ejemplo n.º 3
0
INLINE void CHANGE_PC(UINT32 newpc)
{
	sharc.pc = newpc;
	sharc.daddr = newpc;
	sharc.faddr = newpc+1;
	sharc.nfaddr = newpc+2;

	// next instruction to be executed
	sharc.decode_opcode = ROPCODE(sharc.daddr);
	// next instruction to be decoded
	sharc.fetch_opcode = ROPCODE(sharc.faddr);
}
Ejemplo n.º 4
0
static int t11_execute(int cycles)
{
	t11_ICount = cycles;
	t11_ICount -= t11.interrupt_cycles;
	t11.interrupt_cycles = 0;

	if (t11.wait_state)
	{
		t11_ICount = 0;
		goto getout;
	}

	do
	{
		t11.ppc = t11.reg[7];	/* copy PC to previous PC */

		CALL_DEBUGGER(PCD);

		t11.op = ROPCODE();
		(*opcode_table[t11.op >> 3])();

	} while (t11_ICount > 0);

getout:

	t11_ICount -= t11.interrupt_cycles;
	t11.interrupt_cycles = 0;

	return cycles - t11_ICount;
}
Ejemplo n.º 5
0
static CPU_EXECUTE( t11 )
{
	t11_state *cpustate = get_safe_token(device);

	t11_check_irqs(cpustate);

	if (cpustate->wait_state)
	{
		cpustate->icount = 0;
		goto getout;
	}

	do
	{
		UINT16 op;

		cpustate->ppc = cpustate->reg[7];	/* copy PC to previous PC */

		debugger_instruction_hook(device, cpustate->PCD);

		op = ROPCODE(cpustate);
		(*opcode_table[op >> 3])(cpustate, op);

	} while (cpustate->icount > 0);

getout:
	;
}
Ejemplo n.º 6
0
static int tms_execute(int num_cycles)
{
	tms_icount = num_cycles;

	while(tms_icount > 0)
	{
		UINT16 ppc;

		// handle block repeat
		if (tms.pmst.braf)
		{
			if (tms.pc == tms.paer)
			{
				if (tms.brcr > 0)
				{
					CHANGE_PC(tms.pasr);
				}

				tms.brcr--;
				if (tms.brcr <= 0)
				{
					tms.pmst.braf = 0;
				}
			}
		}

		ppc = tms.pc;
		CALL_DEBUGGER(tms.pc);

		tms.op = ROPCODE();
		tms32051_opcode_table[tms.op >> 8]();

		// handle single repeat
		if (tms.rptc > 0)
		{
			if (ppc == tms.rpt_end)
			{
				CHANGE_PC(tms.rpt_start);
				tms.rptc--;
			}
		}
		else
		{
			tms.rptc = 0;
		}

		tms.timer.psc--;
		if (tms.timer.psc <= 0)
		{
			tms.timer.psc = tms.timer.tddr;
			tms.timer.tim--;
			if (tms.timer.tim <= 0)
			{
				// reset timer
				tms.timer.tim = tms.timer.prd;

				tms_interrupt(INTERRUPT_TINT);
			}
		}
	}
	return num_cycles - tms_icount;
}
Ejemplo n.º 7
0
unsigned dasmmips3(char *buffer, unsigned pc)
{
	UINT32 op = ROPCODE(pc);
	int rs = (op >> 21) & 31;
	int rt = (op >> 16) & 31;
	int rd = (op >> 11) & 31;
	int shift = (op >> 6) & 31;

	switch (op >> 26)
	{
		case 0x00:	/* SPECIAL */
			switch (op & 63)
			{
				case 0x00:	if (op == 0)
							sprintf(buffer, "nop");
							else
							sprintf(buffer, "sll    %s,%s,%d", reg[rd], reg[rt], shift);			break;
				case 0x01:	sprintf(buffer, "mov%c   %s,%s,%d", ((op >> 16) & 1) ? 't' : 'f', reg[rd], reg[rt], (op >> 18) & 7); break;
				case 0x02:	sprintf(buffer, "srl    %s,%s,%d", reg[rd], reg[rt], shift);			break;
				case 0x03:	sprintf(buffer, "sra    %s,%s,%d", reg[rd], reg[rt], shift);			break;
				case 0x04:	sprintf(buffer, "sllv   %s,%s,%s", reg[rd], reg[rt], reg[rs]);			break;
				case 0x06:	sprintf(buffer, "srlv   %s,%s,%s", reg[rd], reg[rt], reg[rs]);			break;
				case 0x07:	sprintf(buffer, "srav   %s,%s,%s", reg[rd], reg[rt], reg[rs]);			break;
				case 0x08:	sprintf(buffer, "jr     %s", reg[rs]);									break;
				case 0x09:	if (rd == 31)
							sprintf(buffer, "jalr   %s", reg[rs]);
							else
							sprintf(buffer, "jalr   %s,%s", reg[rs], reg[rd]);						break;
				case 0x0a:	sprintf(buffer, "movz   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x0b:	sprintf(buffer, "movn   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x0c:	sprintf(buffer, "syscall");												break;
				case 0x0d:	sprintf(buffer, "break");												break;
				case 0x0f:	sprintf(buffer, "sync");												break;
				case 0x10:	sprintf(buffer, "mfhi   %s", reg[rd]);									break;
				case 0x11:	sprintf(buffer, "mthi   %s", reg[rs]);									break;
				case 0x12:	sprintf(buffer, "mflo   %s", reg[rd]);									break;
				case 0x13:	sprintf(buffer, "mtlo   %s", reg[rs]);									break;
				case 0x14:	sprintf(buffer, "dsllv  %s,%s,%s", reg[rd], reg[rt], reg[rs]);			break;
				case 0x16:	sprintf(buffer, "dsrlv  %s,%s,%s", reg[rd], reg[rt], reg[rs]);			break;
				case 0x17:	sprintf(buffer, "dsrav  %s,%s,%s", reg[rd], reg[rt], reg[rs]);			break;
				case 0x18:	sprintf(buffer, "mult   %s,%s", reg[rs], reg[rt]);						break;
				case 0x19:	sprintf(buffer, "multu  %s,%s", reg[rs], reg[rt]);						break;
				case 0x1a:	sprintf(buffer, "div    %s,%s", reg[rs], reg[rt]);						break;
				case 0x1b:	sprintf(buffer, "divu   %s,%s", reg[rs], reg[rt]);						break;
				case 0x1c:	sprintf(buffer, "dmult  %s,%s", reg[rs], reg[rt]);						break;
				case 0x1d:	sprintf(buffer, "dmultu %s,%s", reg[rs], reg[rt]);						break;
				case 0x1e:	sprintf(buffer, "ddiv   %s,%s", reg[rs], reg[rt]);						break;
				case 0x1f:	sprintf(buffer, "ddivu  %s,%s", reg[rs], reg[rt]);						break;
				case 0x20:	sprintf(buffer, "add    %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x21:	sprintf(buffer, "addu   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x22:	sprintf(buffer, "sub    %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x23:	sprintf(buffer, "subu   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x24:	sprintf(buffer, "and    %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x25:	sprintf(buffer, "or     %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x26:	sprintf(buffer, "xor    %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x27:	sprintf(buffer, "nor    %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x2a:	sprintf(buffer, "slt    %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x2b:	sprintf(buffer, "sltu   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x2c:	sprintf(buffer, "dadd   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x2d:	sprintf(buffer, "daddu  %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x2e:	sprintf(buffer, "dsub   %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x2f:	sprintf(buffer, "dsubu  %s,%s,%s", reg[rd], reg[rs], reg[rt]);			break;
				case 0x30:	sprintf(buffer, "tge    %s,%s", reg[rs], reg[rt]);						break;
				case 0x31:	sprintf(buffer, "tgeu   %s,%s", reg[rs], reg[rt]);						break;
				case 0x32:	sprintf(buffer, "tlt    %s,%s", reg[rs], reg[rt]);						break;
				case 0x33:	sprintf(buffer, "tltu   %s,%s", reg[rs], reg[rt]);						break;
				case 0x34:	sprintf(buffer, "teq    %s,%s", reg[rs], reg[rt]);						break;
				case 0x36:	sprintf(buffer, "tne    %s,%s", reg[rs], reg[rt]);						break;
				case 0x38:	sprintf(buffer, "dsll   %s,%s,%d", reg[rd], reg[rt], shift);			break;
				case 0x3a:	sprintf(buffer, "dsrl   %s,%s,%d", reg[rd], reg[rt], shift);			break;
				case 0x3b:	sprintf(buffer, "dsra   %s,%s,%d", reg[rd], reg[rt], shift);			break;
				case 0x3c:	sprintf(buffer, "dsll   %s,%s,%d", reg[rd], reg[rt], shift+32);			break;
				case 0x3e:	sprintf(buffer, "dsrl   %s,%s,%d", reg[rd], reg[rt], shift+32);			break;
				case 0x3f:	sprintf(buffer, "dsra   %s,%s,%d", reg[rd], reg[rt], shift+32);			break;
				default:	sprintf(buffer, "dc.l   $%08x [invalid]", op);							break;
			}
			break;

		case 0x01:	/* REGIMM */
			switch ((op >> 16) & 31)
			{
				case 0x00:	sprintf(buffer, "bltz   %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));	break;
				case 0x01:	sprintf(buffer, "bgez   %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));	break;
				case 0x02:	sprintf(buffer, "bltzl  %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));	break;
				case 0x03:	sprintf(buffer, "bgezl  %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));	break;
				case 0x08:	sprintf(buffer, "tgei   %s,%s", reg[rs], signed_16bit(op));				break;
				case 0x09:	sprintf(buffer, "tgeiu  %s,%s", reg[rs], signed_16bit(op));				break;
				case 0x0a:	sprintf(buffer, "tlti   %s,%s", reg[rs], signed_16bit(op));				break;
				case 0x0b:	sprintf(buffer, "tltiu  %s,%s", reg[rs], signed_16bit(op));				break;
				case 0x0c:	sprintf(buffer, "teqi   %s,%s", reg[rs], signed_16bit(op));				break;
				case 0x0e:	sprintf(buffer, "tnei   %s,%s", reg[rs], signed_16bit(op));				break;
				case 0x10:	sprintf(buffer, "bltzal %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));	break;
				case 0x11:	sprintf(buffer, "bgezal %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));	break;
				case 0x12:	sprintf(buffer, "bltzall %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));break;
				case 0x13:	sprintf(buffer, "bgezall %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));break;
				default:	sprintf(buffer, "dc.l   $%08x [invalid]", op);							break;
			}
			break;

		case 0x02:	sprintf(buffer, "j      $%08x", (pc & 0xf0000000) | ((op & 0x0fffffff) << 2));	break;
		case 0x03:	sprintf(buffer, "jal    $%08x", (pc & 0xf0000000) | ((op & 0x0fffffff) << 2));	break;
		case 0x04:	if (rs == 0 && rt == 0)
					sprintf(buffer, "b      $%08x", pc + 4 + ((INT16)op << 2));
					else
					sprintf(buffer, "beq    %s,%s,$%08x", reg[rs], reg[rt], pc + 4 + ((INT16)op << 2));break;
		case 0x05:	sprintf(buffer, "bne    %s,%s,$%08x", reg[rs], reg[rt], pc + 4 + ((INT16)op << 2));break;
		case 0x06:	sprintf(buffer, "blez   %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));			break;
		case 0x07:	sprintf(buffer, "bgtz   %s,$%08x", reg[rs], pc + 4 + ((INT16)op << 2));			break;
		case 0x08:	sprintf(buffer, "addi   %s,%s,%s", reg[rt], reg[rs], signed_16bit(op));			break;
		case 0x09:	sprintf(buffer, "addiu  %s,%s,%s", reg[rt], reg[rs], signed_16bit(op));			break;
		case 0x0a:	sprintf(buffer, "slti   %s,%s,%s", reg[rt], reg[rs], signed_16bit(op));			break;
		case 0x0b:	sprintf(buffer, "sltiu  %s,%s,%s", reg[rt], reg[rs], signed_16bit(op));			break;
		case 0x0c:	sprintf(buffer, "andi   %s,%s,$%04x", reg[rt], reg[rs], (UINT16)op);			break;
		case 0x0d:	sprintf(buffer, "ori    %s,%s,$%04x", reg[rt], reg[rs], (UINT16)op);			break;
		case 0x0e:	sprintf(buffer, "xori   %s,%s,$%04x", reg[rt], reg[rs], (UINT16)op);			break;
		case 0x0f:	sprintf(buffer, "lui    %s,$%04x", reg[rt], (UINT16)op);						break;
		case 0x10:	dasm_cop0(pc, op, buffer);														break;
		case 0x11:	dasm_cop1(pc, op, buffer);														break;
		case 0x12:	dasm_cop2(pc, op, buffer);														break;
		case 0x13:	dasm_cop1x(pc, op, buffer);														break;
		case 0x14:	sprintf(buffer, "beql   %s,%s,$%08x", reg[rs], reg[rt], pc + 4 + ((INT16)op << 2));break;
		case 0x15:	sprintf(buffer, "bnel   %s,%s,$%08x", reg[rs], reg[rt], pc + 4 + ((INT16)op << 2));break;
		case 0x16:	sprintf(buffer, "blezl  %s,%s,$%08x", reg[rs], reg[rt], pc + 4 + ((INT16)op << 2));break;
		case 0x17:	sprintf(buffer, "bgtzl  %s,%s,$%08x", reg[rs], reg[rt], pc + 4 + ((INT16)op << 2));break;
		case 0x18:	sprintf(buffer, "daddi  %s,%s,%s", reg[rt], reg[rs], signed_16bit(op));			break;
		case 0x19:	sprintf(buffer, "daddiu %s,%s,%s", reg[rt], reg[rs], signed_16bit(op));			break;
		case 0x1a:	sprintf(buffer, "ldl    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x1b:	sprintf(buffer, "ldr    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x20:	sprintf(buffer, "lb     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x21:	sprintf(buffer, "lh     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x22:	sprintf(buffer, "lwl    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x23:	sprintf(buffer, "lw     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x24:	sprintf(buffer, "lbu    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x25:	sprintf(buffer, "lhu    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x26:	sprintf(buffer, "lwr    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x27:	sprintf(buffer, "lwu    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x28:	sprintf(buffer, "sb     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x29:	sprintf(buffer, "sh     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x2a:	sprintf(buffer, "swl    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x2b:	sprintf(buffer, "sw     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x2c:	sprintf(buffer, "sdl    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x2d:	sprintf(buffer, "sdr    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x2e:	sprintf(buffer, "swr    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x2f:	sprintf(buffer, "cache  %s(%s)", reg[rs], signed_16bit(op));					break;
		case 0x30:	sprintf(buffer, "ll     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x31:	sprintf(buffer, "lwc1   %s,%s(%s)", cpreg[1][rt], signed_16bit(op), reg[rs]);	break;
		case 0x32:	sprintf(buffer, "lwc2   %s,%s(%s)", cpreg[2][rt], signed_16bit(op), reg[rs]);	break;
		case 0x33:	sprintf(buffer, "pref   $%x,%s(%s)", rt, signed_16bit(op), reg[rs]);			break;
		case 0x34:	sprintf(buffer, "lld    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x35:	sprintf(buffer, "ldc1   %s,%s(%s)", cpreg[1][rt], signed_16bit(op), reg[rs]);	break;
		case 0x36:	sprintf(buffer, "ldc2   %s,%s(%s)", cpreg[2][rt], signed_16bit(op), reg[rs]);	break;
		case 0x37:	sprintf(buffer, "ld     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x38:	sprintf(buffer, "sc     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x39:	sprintf(buffer, "swc1   %s,%s(%s)", cpreg[1][rt], signed_16bit(op), reg[rs]);	break;
		case 0x3a:	sprintf(buffer, "swc2   %s,%s(%s)", cpreg[2][rt], signed_16bit(op), reg[rs]);	break;
		case 0x3c:	sprintf(buffer, "scd    %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		case 0x3d:	sprintf(buffer, "sdc1   %s,%s(%s)", cpreg[1][rt], signed_16bit(op), reg[rs]);	break;
		case 0x3e:	sprintf(buffer, "sdc2   %s,%s(%s)", cpreg[2][rt], signed_16bit(op), reg[rs]);	break;
		case 0x3f:	sprintf(buffer, "sd     %s,%s(%s)", reg[rt], signed_16bit(op), reg[rs]);		break;
		default:	sprintf(buffer, "dc.l   $%08x [invalid]", op);									break;
	}
	return 4;
}
Ejemplo n.º 8
0
static CPU_EXECUTE( tms )
{
	tms32051_state *cpustate = get_safe_token(device);

	while(cpustate->icount > 0)
	{
		UINT16 ppc;

		// handle block repeat
		if (cpustate->pmst.braf)
		{
			if (cpustate->pc == cpustate->paer)
			{
				if (cpustate->brcr > 0)
				{
					CHANGE_PC(cpustate, cpustate->pasr);
				}

				cpustate->brcr--;
				if (cpustate->brcr <= 0)
				{
					cpustate->pmst.braf = 0;
				}
			}
		}

		ppc = cpustate->pc;
		debugger_instruction_hook(device, cpustate->pc);

		cpustate->op = ROPCODE(cpustate);
		tms32051_opcode_table[cpustate->op >> 8](cpustate);

		// handle single repeat
		if (cpustate->rptc > 0)
		{
			if (ppc == cpustate->rpt_end)
			{
				CHANGE_PC(cpustate, cpustate->rpt_start);
				cpustate->rptc--;
			}
		}
		else
		{
			cpustate->rptc = 0;
		}

		cpustate->timer.psc--;
		if (cpustate->timer.psc <= 0)
		{
			cpustate->timer.psc = cpustate->timer.tddr;
			cpustate->timer.tim--;
			if (cpustate->timer.tim <= 0)
			{
				// reset timer
				cpustate->timer.tim = cpustate->timer.prd;

				tms_interrupt(cpustate, INTERRUPT_TINT);
			}
		}
	}
}
Ejemplo n.º 9
0
static unsigned dasmjag(int variant, char *buffer, unsigned pc, const UINT8 *oprom)
{
	UINT32 flags = 0;
	int op = ROPCODE(0);
	int reg1 = (op >> 5) & 31;
	int reg2 = op & 31;
	int size = 2;

	pc += 2;
	switch (op >> 10)
	{
		case 0:     sprintf(buffer, "add     r%d,r%d", reg1, reg2);                 break;
		case 1:     sprintf(buffer, "addc    r%d,r%d", reg1, reg2);                 break;
		case 2:     sprintf(buffer, "addq    $%x,r%d", convert_zero[reg1], reg2);   break;
		case 3:     sprintf(buffer, "addqt   $%x,r%d", convert_zero[reg1], reg2);   break;
		case 4:     sprintf(buffer, "sub     r%d,r%d", reg1, reg2);                 break;
		case 5:     sprintf(buffer, "subc    r%d,r%d", reg1, reg2);                 break;
		case 6:     sprintf(buffer, "subq    $%x,r%d", convert_zero[reg1], reg2);   break;
		case 7:     sprintf(buffer, "subqt   $%x,r%d", convert_zero[reg1], reg2);   break;
		case 8:     sprintf(buffer, "neg     r%d", reg2);                           break;
		case 9:     sprintf(buffer, "and     r%d,r%d", reg1, reg2);                 break;
		case 10:    sprintf(buffer, "or      r%d,r%d", reg1, reg2);                 break;
		case 11:    sprintf(buffer, "xor     r%d,r%d", reg1, reg2);                 break;
		case 12:    sprintf(buffer, "not     r%d", reg2);                           break;
		case 13:    sprintf(buffer, "btst    $%x,r%d", reg1, reg2);                 break;
		case 14:    sprintf(buffer, "bset    $%x,r%d", reg1, reg2);                 break;
		case 15:    sprintf(buffer, "bclr    $%x,r%d", reg1, reg2);                 break;
		case 16:    sprintf(buffer, "mult    r%d,r%d", reg1, reg2);                 break;
		case 17:    sprintf(buffer, "imult   r%d,r%d", reg1, reg2);                 break;
		case 18:    sprintf(buffer, "imultn  r%d,r%d", reg1, reg2);                 break;
		case 19:    sprintf(buffer, "resmac  r%d", reg2);                           break;
		case 20:    sprintf(buffer, "imacn   r%d,r%d", reg1, reg2);                 break;
		case 21:    sprintf(buffer, "div     r%d,r%d", reg1, reg2);                 break;
		case 22:    sprintf(buffer, "abs     r%d", reg2);                           break;
		case 23:    sprintf(buffer, "sh      r%d,r%d", reg1, reg2);                 break;
		case 24:    sprintf(buffer, "shlq    $%x,r%d", 32 - convert_zero[reg1], reg2);  break;
		case 25:    sprintf(buffer, "shrq    $%x,r%d", convert_zero[reg1], reg2);   break;
		case 26:    sprintf(buffer, "sha     r%d,r%d", reg1, reg2);                 break;
		case 27:    sprintf(buffer, "sharq   $%x,r%d", convert_zero[reg1], reg2);   break;
		case 28:    sprintf(buffer, "ror     r%d,r%d", reg1, reg2);                 break;
		case 29:    sprintf(buffer, "rorq    $%x,r%d", convert_zero[reg1], reg2);   break;
		case 30:    sprintf(buffer, "cmp     r%d,r%d", reg1, reg2);                 break;
		case 31:    sprintf(buffer, "cmpq    %s,r%d", signed_16bit((INT16)(reg1 << 11) >> 11), reg2);break;
		case 32:    if (variant == JAGUAR_VARIANT_GPU)
					sprintf(buffer, "sat8    r%d", reg2);
					else
					sprintf(buffer, "subqmod $%x,r%d", convert_zero[reg1], reg2);
					break;
		case 33:    if (variant == JAGUAR_VARIANT_GPU)
					sprintf(buffer, "sat16   r%d", reg2);
					else
					sprintf(buffer, "sat16s  r%d", reg2);
					break;
		case 34:    sprintf(buffer, "move    r%d,r%d", reg1, reg2);                 break;
		case 35:    sprintf(buffer, "moveq   %d,r%d", reg1, reg2);                  break;
		case 36:    sprintf(buffer, "moveta  r%d,r%d", reg1, reg2);                 break;
		case 37:    sprintf(buffer, "movefa  r%d,r%d", reg1, reg2);                 break;
		case 38:    sprintf(buffer, "movei   $%x,r%d", ROPCODE(2) | (ROPCODE(4)<<16), reg2); size = 6; break;
		case 39:    sprintf(buffer, "loadb   (r%d),r%d", reg1, reg2);                   break;
		case 40:    sprintf(buffer, "loadw   (r%d),r%d", reg1, reg2);                   break;
		case 41:    sprintf(buffer, "load    (r%d),r%d", reg1, reg2);                   break;
		case 42:    if (variant == JAGUAR_VARIANT_GPU)
					sprintf(buffer, "loadp   (r%d),r%d", reg1, reg2);
					else
					sprintf(buffer, "sat32s  r%d", reg2);
					break;
		case 43:    sprintf(buffer, "load    (r14+$%x),r%d", convert_zero[reg1]*4, reg2);break;
		case 44:    sprintf(buffer, "load    (r15+$%x),r%d", convert_zero[reg1]*4, reg2);break;
		case 45:    sprintf(buffer, "storeb  r%d,(r%d)", reg2, reg1);               break;
		case 46:    sprintf(buffer, "storew  r%d,(r%d)", reg2, reg1);               break;
		case 47:    sprintf(buffer, "store   r%d,(r%d)", reg2, reg1);                   break;
		case 48:    if (variant == JAGUAR_VARIANT_GPU)
					sprintf(buffer, "storep  r%d,(r%d)", reg2, reg1);
					else
					sprintf(buffer, "mirror  r%d", reg2);
					break;
		case 49:    sprintf(buffer, "store   r%d,(r14+$%x)", reg2, convert_zero[reg1]*4);break;
		case 50:    sprintf(buffer, "store   r%d,(r15+$%x)", reg2, convert_zero[reg1]*4);break;
		case 51:    sprintf(buffer, "move    pc,r%d", reg2);                            break;
		case 52:    sprintf(buffer, "jump    %s(r%d)", condition[reg2], reg1);          break;
		case 53:    sprintf(buffer, "jr      %s%08X", condition[reg2], pc + ((INT8)(reg1 << 3) >> 2)); break;
		case 54:    sprintf(buffer, "mmult   r%d,r%d", reg1, reg2);                 break;
		case 55:    sprintf(buffer, "mtoi    r%d,r%d", reg1, reg2);                 break;
		case 56:    sprintf(buffer, "normi   r%d,r%d", reg1, reg2);                 break;
		case 57:    sprintf(buffer, "nop");                                         break;
		case 58:    sprintf(buffer, "load    (r14+r%d),r%d", reg1, reg2);               break;
		case 59:    sprintf(buffer, "load    (r15+r%d),r%d", reg1, reg2);               break;
		case 60:    sprintf(buffer, "store   r%d,(r14+r%d)", reg2, reg1);               break;
		case 61:    sprintf(buffer, "store   r%d,(r15+r%d)", reg2, reg1);               break;
		case 62:    if (variant == JAGUAR_VARIANT_GPU)
					sprintf(buffer, "sat24   r%d", reg2);
					else
					sprintf(buffer, "illegal");
					break;
		case 63:    if (variant == JAGUAR_VARIANT_GPU)
					sprintf(buffer, reg1 ?
									"unpack  r%d" :
									"pack    r%d", reg2);
					else
					sprintf(buffer, "addqmod $%x,r%d", convert_zero[reg1], reg2);
					break;
	}
	return size | flags | DASMFLAG_SUPPORTED;
}
Ejemplo n.º 10
0
static int sharc_execute(int cycles)
{
	sharc_icount = cycles;

	if (sharc.idle && sharc.irq_active == 0)
	{
		// handle pending DMA transfers
		if (dmaop_cycles > 0)
		{
			dmaop_cycles -= cycles;
			if (dmaop_cycles <= 0)
			{
				dmaop_cycles = 0;
				dma_op(dmaop_src, dmaop_dst, dmaop_src_modifier, dmaop_dst_modifier, dmaop_src_count, dmaop_dst_count, dmaop_pmode);
				if (dmaop_chain_ptr != 0)
				{
					schedule_chained_dma_op(dmaop_channel, dmaop_chain_ptr, dmaop_chained_direction);
				}
			}
		}

		sharc_icount = 0;
		CALL_MAME_DEBUG;

		return cycles;
	}
	if (sharc.irq_active != 0)
	{
		check_interrupts();
		sharc.idle = 0;
	}

	// fill the initial pipeline

	// next executed instruction
	sharc.opcode = ROPCODE(sharc.daddr);
	sharc.opcode_handler = sharc_op[(sharc.opcode >> 39) & 0x1ff];

	// next decoded instruction
	sharc.fetch_opcode = ROPCODE(sharc.faddr);

	while (sharc_icount > 0 && !sharc.idle)
	{
		sharc.pc = sharc.daddr;
		sharc.daddr = sharc.faddr;
		sharc.faddr = sharc.nfaddr;
		sharc.nfaddr++;

		sharc.decode_opcode = sharc.fetch_opcode;

		// fetch next instruction
		sharc.fetch_opcode = ROPCODE(sharc.faddr);

		CALL_MAME_DEBUG;

		// handle looping
		if (sharc.pc == (sharc.laddr & 0xffffff))
		{
			switch (sharc.laddr >> 30)
			{
				case 0:		// arithmetic condition-based
				{
					int condition = (sharc.laddr >> 24) & 0x1f;

					if (DO_CONDITION_CODE(condition))
					{
						POP_LOOP();
						POP_PC();
					}
					else
					{
						CHANGE_PC(TOP_PC());
					}
					break;
				}
				case 1:		// counter-based, length 1
				{
					//fatalerror("SHARC: counter-based loop, length 1 at %08X", sharc.pc);
					//break;
				}
				case 2:		// counter-based, length 2
				{
					//fatalerror("SHARC: counter-based loop, length 2 at %08X", sharc.pc);
					//break;
				}
				case 3:		// counter-based, length >2
				{
					--sharc.lcstack[sharc.lstkp];
					--sharc.curlcntr;
					if (sharc.curlcntr == 0)
					{
						POP_LOOP();
						POP_PC();
					}
					else
					{
						CHANGE_PC(TOP_PC());
					}
				}
			}
		}

		// execute current instruction
		sharc.opcode_handler();

		// decode next instruction
		sharc.opcode = sharc.decode_opcode;
		sharc.opcode_handler = sharc_op[(sharc.opcode >> 39) & 0x1ff];




		// System register latency effect
		if (systemreg_latency_cycles > 0)
		{
			--systemreg_latency_cycles;
			if (systemreg_latency_cycles <= 0)
			{
				systemreg_write_latency_effect();
			}
		}

		// IOP register latency effect
		if (iop_latency_cycles > 0)
		{
			--iop_latency_cycles;
			if (iop_latency_cycles <= 0)
			{
				iop_write_latency_effect();
			}
		}

		// DMA transfer
		if (dmaop_cycles > 0)
		{
			--dmaop_cycles;
			if (dmaop_cycles <= 0)
			{
				dma_op(dmaop_src, dmaop_dst, dmaop_src_modifier, dmaop_dst_modifier, dmaop_src_count, dmaop_dst_count, dmaop_pmode);
				if (dmaop_chain_ptr != 0)
				{
					schedule_chained_dma_op(dmaop_channel, dmaop_chain_ptr, dmaop_chained_direction);
				}
			}
		}



		--sharc_icount;
	};

	return cycles - sharc_icount;
}
Ejemplo n.º 11
0
unsigned dasmjag(int dsp_type, char * bufferOut, unsigned pc)
{
	char buffer[64];
	int op = ROPCODE(pc);
	int reg1 = (op >> 5) & 31;
	int reg2 = op & 31;
	int size = 2;
	pc += 2;

	switch (op >> 10)
	{
		case 0:		sprintf(buffer, "ADD     R%02d,R%02d", reg1, reg2);				break;
		case 1:		sprintf(buffer, "ADDC    R%02d,R%02d", reg1, reg2);				break;
		case 2:		sprintf(buffer, "ADDQ    $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 3:		sprintf(buffer, "ADDQT   $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 4:		sprintf(buffer, "SUB     R%02d,R%02d", reg1, reg2);				break;
		case 5:		sprintf(buffer, "SUBC    R%02d,R%02d", reg1, reg2);				break;
		case 6:		sprintf(buffer, "SUBQ    $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 7:		sprintf(buffer, "SUBQT   $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 8:		sprintf(buffer, "NEG     R%02d", reg2);							break;
		case 9:		sprintf(buffer, "AND     R%02d,R%02d", reg1, reg2);				break;
		case 10:	sprintf(buffer, "OR      R%02d,R%02d", reg1, reg2);				break;
		case 11:	sprintf(buffer, "XOR     R%02d,R%02d", reg1, reg2);				break;
		case 12:	sprintf(buffer, "NOT     R%02d", reg2);							break;
		case 13:	sprintf(buffer, "BTST    $%X,R%02d", reg1, reg2);				break;
		case 14:	sprintf(buffer, "BSET    $%X,R%02d", reg1, reg2);				break;
		case 15:	sprintf(buffer, "BCLR    $%X,R%02d", reg1, reg2);				break;
		case 16:	sprintf(buffer, "MULT    R%02d,R%02d", reg1, reg2);				break;
		case 17:	sprintf(buffer, "IMULT   R%02d,R%02d", reg1, reg2);				break;
		case 18:	sprintf(buffer, "IMULTN  R%02d,R%02d", reg1, reg2);				break;
		case 19:	sprintf(buffer, "RESMAC  R%02d", reg2);							break;
		case 20:	sprintf(buffer, "IMACN   R%02d,R%02d", reg1, reg2);				break;
		case 21:	sprintf(buffer, "DIV     R%02d,R%02d", reg1, reg2);				break;
		case 22:	sprintf(buffer, "ABS     R%02d", reg2);							break;
		case 23:	sprintf(buffer, "SH      R%02d,R%02d", reg1, reg2);				break;
		case 24:	sprintf(buffer, "SHLQ    $%X,R%02d", 32 - reg1, reg2);	break;
		case 25:	sprintf(buffer, "SHRQ    $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 26:	sprintf(buffer, "SHA     R%02d,R%02d", reg1, reg2);				break;
		case 27:	sprintf(buffer, "SHARQ   $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 28:	sprintf(buffer, "ROR     R%02d,R%02d", reg1, reg2);				break;
		case 29:	sprintf(buffer, "RORQ    $%X,R%02d", convert_zero[reg1], reg2);	break;
		case 30:	sprintf(buffer, "CMP     R%02d,R%02d", reg1, reg2);				break;
		case 31:	sprintf(buffer, "CMPQ    %s,R%02d", signed_16bit((int16_t)(reg1 << 11) >> 11), reg2);break;
		case 32:	if (dsp_type == JAGUAR_GPU)
						sprintf(buffer, "SAT8    R%02d", reg2);
					else
						sprintf(buffer, "SUBQMOD $%X,R%02d", convert_zero[reg1], reg2);
					break;
		case 33:	if (dsp_type == JAGUAR_GPU)
						sprintf(buffer, "SAT16   R%02d", reg2);
					else
						sprintf(buffer, "SAT16S  R%02d", reg2);
					break;
		case 34:	sprintf(buffer, "MOVE    R%02d,R%02d", reg1, reg2);				break;
		case 35:	sprintf(buffer, "MOVEQ   %d,R%02d", reg1, reg2);				break;
		case 36:	sprintf(buffer, "MOVETA  R%02d,R%02d", reg1, reg2);				break;
		case 37:	sprintf(buffer, "MOVEFA  R%02d,R%02d", reg1, reg2);				break;
		case 38:	sprintf(buffer, "MOVEI   #$%X,R%02d", ROPCODE(pc) | (ROPCODE(pc+2)<<16), reg2); size = 6; break;
		case 39:	sprintf(buffer, "LOADB   (R%02d),R%02d", reg1, reg2);			break;
		case 40:	sprintf(buffer, "LOADW   (R%02d),R%02d", reg1, reg2);			break;
		case 41:	sprintf(buffer, "LOAD    (R%02d),R%02d", reg1, reg2);			break;
		case 42:	if (dsp_type == JAGUAR_GPU)
						sprintf(buffer, "LOADP   (R%02d),R%02d", reg1, reg2);
					else
						sprintf(buffer, "SAT32S  R%02d", reg2);
					break;
		case 43:	sprintf(buffer, "LOAD    (R14+$%X),R%02d", convert_zero[reg1]*4, reg2);break;
		case 44:	sprintf(buffer, "LOAD    (R15+$%X),R%02d", convert_zero[reg1]*4, reg2);break;
		case 45:	sprintf(buffer, "STOREB  R%02d,(R%02d)", reg2, reg1);			break;
		case 46:	sprintf(buffer, "STOREW  R%02d,(R%02d)", reg2, reg1);			break;
		case 47:	sprintf(buffer, "STORE   R%02d,(R%02d)", reg2, reg1);			break;
		case 48:	if (dsp_type == JAGUAR_GPU)
						sprintf(buffer, "STOREP  R%02d,(R%02d)", reg2, reg1);
					else
						sprintf(buffer, "MIRROR  R%02d", reg2);
					break;
		case 49:	sprintf(buffer, "STORE   R%02d,(R14+$%X)", reg2, convert_zero[reg1]*4);break;
		case 50:	sprintf(buffer, "STORE   R%02d,(R15+$%X)", reg2, convert_zero[reg1]*4);break;
		case 51:	sprintf(buffer, "MOVE    PC,R%02d", reg2);						break;
		case 52:	sprintf(buffer, "JUMP    %s(R%02d)", condition[reg2], reg1);	break;
		case 53:	sprintf(buffer, "JR      %s$%X", condition[reg2], pc + ((int8_t)(reg1 << 3) >> 2)); break;
		case 54:	sprintf(buffer, "MMULT   R%02d,R%02d", reg1, reg2);				break;
		case 55:	sprintf(buffer, "MTOI    R%02d,R%02d", reg1, reg2);				break;
		case 56:	sprintf(buffer, "NORMI   R%02d,R%02d", reg1, reg2);				break;
		case 57:	sprintf(buffer, "NOP");											break;
		case 58:	sprintf(buffer, "LOAD    (R14+R%02d),R%02d", reg1, reg2);		break;
		case 59:	sprintf(buffer, "LOAD    (R15+R%02d),R%02d", reg1, reg2);		break;
		case 60:	sprintf(buffer, "STORE   R%02d,(R14+R%02d)", reg2, reg1);		break;
		case 61:	sprintf(buffer, "STORE   R%02d,(R15+R%02d)", reg2, reg1);		break;
		case 62:	if (dsp_type == JAGUAR_GPU)
						sprintf(buffer, "SAT24   R%02d", reg2);
					else
						sprintf(buffer, "illegal [%d,%d]", reg1, reg2);
					break;
		case 63:	if (dsp_type == JAGUAR_GPU)
						sprintf(buffer, (reg1 ? "UNPACK  R%02d" : "PACK    R%02d"), reg2);
					else
						sprintf(buffer, "ADDQMOD $%X,R%02d", convert_zero[reg1], reg2);
					break;
	}

	if (size == 2)
		sprintf(bufferOut, "%04X            %-24s", op, buffer);
	else
	{
		uint16_t word1 = ROPCODE(pc), word2 = ROPCODE(pc + 2);
		sprintf(bufferOut, "%04X %04X %04X  %-24s", op, word1, word2, buffer);
	}

	return size;
}