Bad cpu bug (nw)

This commit is contained in:
Olivier Galibert 2020-03-14 23:03:57 +01:00
parent d82a8abff9
commit 89d4403dcb
3 changed files with 36 additions and 4 deletions

View File

@ -287,7 +287,7 @@ void ks0164_cpu_device::execute_run()
// ALU functions with other register
// 10ff frrr Ssss w100
u16 rv = m_r[(opcode >> 4) & 7];
u16 v = opcode & 0x0004 ? rv : opcode & 0x0080 ? s8(rv) : u8(rv);
u16 v = opcode & 0x0008 ? rv : opcode & 0x0080 ? s8(rv) : u8(rv);
do_alu(opcode, v);
break;
@ -298,7 +298,7 @@ void ks0164_cpu_device::execute_run()
// 10ff frrr S... w101
u16 rv = m_program_cache->read_word(m_r[R_PC]);
m_r[R_PC] += 2;
u16 v = opcode & 0x0004 ? rv : opcode & 0x0080 ? s8(rv) : u8(rv);
u16 v = opcode & 0x0008 ? rv : opcode & 0x0080 ? s8(rv) : u8(rv);
do_alu(opcode, v);
break;
@ -308,7 +308,7 @@ void ks0164_cpu_device::execute_run()
// ALU functions from memory indexed
// 10ff frrr Ssss w110
u16 a = m_r[(opcode >> 4) & 7];
u16 v = opcode & 0x0004 ? m_program->read_word(a) : opcode & 0x0080 ? s8(m_program->read_byte(a)) : u8(m_program->read_byte(a));
u16 v = opcode & 0x0008 ? m_program->read_word(a) : opcode & 0x0080 ? s8(m_program->read_byte(a)) : u8(m_program->read_byte(a));
m_icount -= 2;
do_alu(opcode, v);
@ -320,7 +320,7 @@ void ks0164_cpu_device::execute_run()
// 10ff frrr Ssss w111
u16 a = m_r[(opcode >> 4) & 7] + m_program_cache->read_word(m_r[R_PC]);
m_r[R_PC] += 2;
u16 v = opcode & 0x0004 ? m_program->read_word(a) : opcode & 0x0080 ? s8(m_program->read_byte(a)) : u8(m_program->read_byte(a));
u16 v = opcode & 0x0008 ? m_program->read_word(a) : opcode & 0x0080 ? s8(m_program->read_byte(a)) : u8(m_program->read_byte(a));
m_icount -= 2;
do_alu(opcode, v);

View File

@ -63,6 +63,8 @@ void ks0164_device::device_reset()
memset(m_sregs, 0, sizeof(m_sregs));
m_unk60 = 0;
m_voice_select = 0;
m_irqen_76 = 0;
m_irqen_77 = 0;
}
u16 ks0164_device::vec_r(offs_t offset, u16 mem_mask)
@ -128,6 +130,28 @@ void ks0164_device::voice_w(offs_t offset, u16 data, u16 mem_mask)
logerror("voice %02x.%02x = %04x (%04x)\n", m_voice_select & 0x1f, offset, m_sregs[m_voice_select & 0x1f][offset], m_cpu->pc());
}
u8 ks0164_device::irqen_76_r()
{
return m_irqen_76;
}
void ks0164_device::irqen_76_w(u8 data)
{
m_irqen_76 = data;
logerror("irqen_76 = %02x (%04x)\n", m_irqen_76, m_cpu->pc());
}
u8 ks0164_device::irqen_77_r()
{
return m_irqen_77;
}
void ks0164_device::irqen_77_w(u8 data)
{
m_irqen_77 = data;
logerror("irqen_77 = %02x (%04x)\n", m_irqen_77, m_cpu->pc());
}
u8 ks0164_device::unk60_r()
{
return m_unk60;
@ -160,6 +184,9 @@ void ks0164_device::cpu_map(address_map &map)
map(0x0062, 0x0063).rw(FUNC(ks0164_device::bank1_select_r), FUNC(ks0164_device::bank1_select_w));
map(0x0064, 0x0065).rw(FUNC(ks0164_device::bank2_select_r), FUNC(ks0164_device::bank2_select_w));
map(0x0076, 0x0076).rw(FUNC(ks0164_device::irqen_76_r), FUNC(ks0164_device::irqen_76_w));
map(0x0077, 0x0077).rw(FUNC(ks0164_device::irqen_77_r), FUNC(ks0164_device::irqen_77_w));
map(0x0080, 0x3fff).r(FUNC(ks0164_device::rom_r));
map(0x4000, 0x7fff).rw(FUNC(ks0164_device::bank1_r), FUNC(ks0164_device::bank1_w));
map(0x8000, 0xbfff).rw(FUNC(ks0164_device::bank2_r), FUNC(ks0164_device::bank2_w));

View File

@ -41,6 +41,7 @@ private:
u8 m_unk60;
u8 m_voice_select;
u8 m_irqen_76, m_irqen_77;
void cpu_map(address_map &map);
@ -55,6 +56,10 @@ private:
u16 bank2_select_r();
void bank2_select_w(offs_t, u16 data, u16 mem_mask);
u8 irqen_76_r();
void irqen_76_w(u8 data);
u8 irqen_77_r();
void irqen_77_w(u8 data);
u8 unk60_r();
void unk60_w(u8 data);
u8 voice_select_r();