mirror of
https://github.com/holub/mame
synced 2025-04-17 22:13:04 +03:00
877 lines
23 KiB
C++
877 lines
23 KiB
C++
// license:BSD-3-Clause
|
|
// copyright-holders:Farfetch'd, R. Belmont
|
|
// AM3 Functions (for ReadAM)
|
|
// **************************
|
|
|
|
uint32_t v60_device::am3Register()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
SETREG8(m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
SETREG16(m_reg[m_modval & 0x1F], m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_reg[m_modval & 0x1F] = m_modwritevalw;
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
uint32_t v60_device::am3RegisterIndirect()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval & 0x1F], m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval & 0x1F], m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
uint32_t v60_device::am3RegisterIndirectIndexed()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval2 & 0x1F] + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval2 & 0x1F] + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval2 & 0x1F] + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
uint32_t v60_device::am3Autoincrement()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
m_reg[m_modval & 0x1F] += 1;
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval & 0x1F], m_modwritevalh);
|
|
m_reg[m_modval & 0x1F] += 2;
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval & 0x1F], m_modwritevalw);
|
|
m_reg[m_modval & 0x1F] += 4;
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
uint32_t v60_device::am3Autodecrement()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_reg[m_modval & 0x1F] -= 1;
|
|
m_program->write_byte(m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_reg[m_modval & 0x1F] -= 2;
|
|
m_program->write_word_unaligned(m_reg[m_modval & 0x1F], m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_reg[m_modval & 0x1F] -= 4;
|
|
m_program->write_dword_unaligned(m_reg[m_modval & 0x1F], m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
uint32_t v60_device::am3Displacement8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
uint32_t v60_device::am3Displacement16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3Displacement32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3DisplacementIndexed8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval2 & 0x1F] + (int8_t)OpRead8(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval2 & 0x1F] + (int8_t)OpRead8(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int8_t)OpRead8(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndexed16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval2 & 0x1F] + (int16_t)OpRead16(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval2 & 0x1F] + (int16_t)OpRead16(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int16_t)OpRead16(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndexed32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_reg[m_modval2 & 0x1F] + OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_reg[m_modval2 & 0x1F] + OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_reg[m_modval2 & 0x1F] + OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 6;
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3PCDisplacement8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(PC + (int8_t)OpRead8(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(PC + (int8_t)OpRead8(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacement16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(PC + (int16_t)OpRead16(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(PC + (int16_t)OpRead16(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacement32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(PC + OpRead32(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(PC + OpRead32(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(PC + OpRead32(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndexed8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(PC + (int8_t)OpRead8(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(PC + (int8_t)OpRead8(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndexed16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(PC + (int16_t)OpRead16(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(PC + (int16_t)OpRead16(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndexed32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(PC + OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(PC + OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(PC + OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 6;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndirect8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndirect16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndirect32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3DisplacementIndirectIndexed8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int8_t)OpRead8(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int8_t)OpRead8(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int8_t)OpRead8(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndirectIndexed16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int16_t)OpRead16(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int16_t)OpRead16(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + (int16_t)OpRead16(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
uint32_t v60_device::am3DisplacementIndirectIndexed32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval2 & 0x1F] + OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 6;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndirect8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 2;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndirect16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndirect32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndirectIndexed8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndirectIndexed16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 4;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDisplacementIndirectIndexed32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 6;
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3DoubleDisplacement8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1)) + (int8_t)OpRead8(m_modadd + 2), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1)) + (int8_t)OpRead8(m_modadd + 2), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int8_t)OpRead8(m_modadd + 1)) + (int8_t)OpRead8(m_modadd + 2), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3DoubleDisplacement16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1)) + (int16_t)OpRead16(m_modadd + 3), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1)) + (int16_t)OpRead16(m_modadd + 3), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + (int16_t)OpRead16(m_modadd + 1)) + (int16_t)OpRead16(m_modadd + 3), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
uint32_t v60_device::am3DoubleDisplacement32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1)) + OpRead32(m_modadd + 5), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1)) + OpRead32(m_modadd + 5), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(m_reg[m_modval & 0x1F] + OpRead32(m_modadd + 1)) + OpRead32(m_modadd + 5), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 9;
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3PCDoubleDisplacement8()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1)) + (int8_t)OpRead8(m_modadd + 2), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1)) + (int8_t)OpRead8(m_modadd + 2), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + (int8_t)OpRead8(m_modadd + 1)) + (int8_t)OpRead8(m_modadd + 2), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 3;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDoubleDisplacement16()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1)) + (int16_t)OpRead16(m_modadd + 3), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1)) + (int16_t)OpRead16(m_modadd + 3), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + (int16_t)OpRead16(m_modadd + 1)) + (int16_t)OpRead16(m_modadd + 3), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
uint32_t v60_device::am3PCDoubleDisplacement32()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 1)) + OpRead32(m_modadd + 5), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 1)) + OpRead32(m_modadd + 5), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(PC + OpRead32(m_modadd + 1)) + OpRead32(m_modadd + 5), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 9;
|
|
}
|
|
|
|
uint32_t v60_device::am3DirectAddress()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(OpRead32(m_modadd + 1), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(OpRead32(m_modadd + 1), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(OpRead32(m_modadd + 1), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
uint32_t v60_device::am3DirectAddressIndexed()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F] * 2, m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(OpRead32(m_modadd + 2) + m_reg[m_modval & 0x1F] * 4, m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 6;
|
|
}
|
|
|
|
uint32_t v60_device::am3DirectAddressDeferred()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(OpRead32(m_modadd + 1)), m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(OpRead32(m_modadd + 1)), m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(OpRead32(m_modadd + 1)), m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 5;
|
|
}
|
|
|
|
uint32_t v60_device::am3DirectAddressDeferredIndexed()
|
|
{
|
|
switch (m_moddim)
|
|
{
|
|
case 0:
|
|
m_program->write_byte(m_program->read_dword_unaligned(OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalb);
|
|
break;
|
|
case 1:
|
|
m_program->write_word_unaligned(m_program->read_dword_unaligned(OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalh);
|
|
break;
|
|
case 2:
|
|
m_program->write_dword_unaligned(m_program->read_dword_unaligned(OpRead32(m_modadd + 2)) + m_reg[m_modval & 0x1F], m_modwritevalw);
|
|
break;
|
|
}
|
|
|
|
return 6;
|
|
}
|
|
|
|
uint32_t v60_device::am3Immediate()
|
|
{
|
|
fatalerror("CPU - AM3 - IMM (PC=%06x)\n", PC);
|
|
}
|
|
|
|
uint32_t v60_device::am3ImmediateQuick()
|
|
{
|
|
fatalerror("CPU - AM3 - IMMQ (PC=%06x)\n", PC);
|
|
}
|
|
|
|
|
|
|
|
// AM3 Tables (for ReadAMAddress)
|
|
// ******************************
|
|
|
|
uint32_t v60_device::am3Error1()
|
|
{
|
|
fatalerror("CPU - AM3 - 1 (PC=%06x)\n", PC);
|
|
}
|
|
|
|
uint32_t v60_device::am3Error2()
|
|
{
|
|
fatalerror("CPU - AM3 - 2 (PC=%06x)\n", PC);
|
|
}
|
|
|
|
uint32_t v60_device::am3Error3()
|
|
{
|
|
fatalerror("CPU - AM3 - 3 (PC=%06x)\n", PC);
|
|
}
|
|
|
|
uint32_t v60_device::am3Error4()
|
|
{
|
|
fatalerror("CPU - AM3 - 4 (PC=%06x)\n", PC);
|
|
}
|
|
|
|
uint32_t v60_device::am3Error5()
|
|
{
|
|
fatalerror("CPU - AM3 - 5 (PC=%06x)\n", PC);
|
|
}
|
|
|
|
const v60_device::am_func v60_device::s_AMTable3_G7a[16] =
|
|
{
|
|
&v60_device::am3PCDisplacementIndexed8,
|
|
&v60_device::am3PCDisplacementIndexed16,
|
|
&v60_device::am3PCDisplacementIndexed32,
|
|
&v60_device::am3DirectAddressIndexed,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3PCDisplacementIndirectIndexed8,
|
|
&v60_device::am3PCDisplacementIndirectIndexed16,
|
|
&v60_device::am3PCDisplacementIndirectIndexed32,
|
|
&v60_device::am3DirectAddressDeferredIndexed,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3Error5,
|
|
&v60_device::am3Error5
|
|
};
|
|
|
|
uint32_t v60_device::am3Group7a()
|
|
{
|
|
if (!(m_modval2 & 0x10))
|
|
return am3Error4();
|
|
|
|
return (this->*s_AMTable3_G7a[m_modval2 & 0xF])();
|
|
}
|
|
|
|
const v60_device::am_func v60_device::s_AMTable3_G7[32] =
|
|
{
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3ImmediateQuick,
|
|
&v60_device::am3PCDisplacement8,
|
|
&v60_device::am3PCDisplacement16,
|
|
&v60_device::am3PCDisplacement32,
|
|
&v60_device::am3DirectAddress,
|
|
&v60_device::am3Immediate,
|
|
&v60_device::am3Error2,
|
|
&v60_device::am3Error2,
|
|
&v60_device::am3Error2,
|
|
&v60_device::am3PCDisplacementIndirect8,
|
|
&v60_device::am3PCDisplacementIndirect16,
|
|
&v60_device::am3PCDisplacementIndirect32,
|
|
&v60_device::am3DirectAddressDeferred,
|
|
&v60_device::am3PCDoubleDisplacement8,
|
|
&v60_device::am3PCDoubleDisplacement16,
|
|
&v60_device::am3PCDoubleDisplacement32,
|
|
&v60_device::am3Error2
|
|
};
|
|
|
|
const v60_device::am_func v60_device::s_AMTable3_G6[8] =
|
|
{
|
|
&v60_device::am3DisplacementIndexed8,
|
|
&v60_device::am3DisplacementIndexed16,
|
|
&v60_device::am3DisplacementIndexed32,
|
|
&v60_device::am3RegisterIndirectIndexed,
|
|
&v60_device::am3DisplacementIndirectIndexed8,
|
|
&v60_device::am3DisplacementIndirectIndexed16,
|
|
&v60_device::am3DisplacementIndirectIndexed32,
|
|
&v60_device::am3Group7a
|
|
};
|
|
|
|
|
|
|
|
|
|
uint32_t v60_device::am3Group6()
|
|
{
|
|
m_modval2 = OpRead8(m_modadd + 1);
|
|
return (this->*s_AMTable3_G6[m_modval2 >> 5])();
|
|
}
|
|
|
|
|
|
uint32_t v60_device::am3Group7()
|
|
{
|
|
return (this->*s_AMTable3_G7[m_modval & 0x1F])();
|
|
}
|
|
|
|
|
|
|
|
const v60_device::am_func v60_device::s_AMTable3[2][8] =
|
|
{
|
|
{
|
|
&v60_device::am3Displacement8,
|
|
&v60_device::am3Displacement16,
|
|
&v60_device::am3Displacement32,
|
|
&v60_device::am3RegisterIndirect,
|
|
&v60_device::am3DisplacementIndirect8,
|
|
&v60_device::am3DisplacementIndirect16,
|
|
&v60_device::am3DisplacementIndirect32,
|
|
&v60_device::am3Group7
|
|
},
|
|
|
|
{
|
|
&v60_device::am3DoubleDisplacement8,
|
|
&v60_device::am3DoubleDisplacement16,
|
|
&v60_device::am3DoubleDisplacement32,
|
|
&v60_device::am3Register,
|
|
&v60_device::am3Autoincrement,
|
|
&v60_device::am3Autodecrement,
|
|
&v60_device::am3Group6,
|
|
&v60_device::am3Error1
|
|
}
|
|
};
|