diff options
author | 2015-06-15 22:08:18 +0200 | |
---|---|---|
committer | 2015-06-15 22:08:18 +0200 | |
commit | de3fd6441e5c7bd31c74a1b01137b67dc09a67f9 (patch) | |
tree | daab06422dcec5974efba776f2b81cef1f9ab671 /src/emu/cpu/melps4/m58846.c | |
parent | 63cc0ad2144b47c1614a7c0227235e4a71cc2c5a (diff) |
fix stupid bug and added undocumented opcodes
Diffstat (limited to 'src/emu/cpu/melps4/m58846.c')
-rw-r--r-- | src/emu/cpu/melps4/m58846.c | 49 |
1 files changed, 21 insertions, 28 deletions
diff --git a/src/emu/cpu/melps4/m58846.c b/src/emu/cpu/melps4/m58846.c index 824969f8cd6..17161da2fb5 100644 --- a/src/emu/cpu/melps4/m58846.c +++ b/src/emu/cpu/melps4/m58846.c @@ -50,9 +50,7 @@ offs_t m58846_device::disasm_disassemble(char *buffer, offs_t pc, const UINT8 *o void m58846_device::device_start() { melps4_cpu_device::device_start(); - - m_timer[0] = timer_alloc(0); - m_timer[1] = timer_alloc(1); + m_timer = timer_alloc(0); } @@ -66,7 +64,7 @@ void m58846_device::device_reset() melps4_cpu_device::device_reset(); // timer 1 runs continuously - reset_timer1(); + reset_timer(); } @@ -75,37 +73,30 @@ void m58846_device::device_reset() // timers //------------------------------------------------- -void m58846_device::reset_timer1() +void m58846_device::reset_timer() { // reset 7-bit prescaler attotime base = attotime::from_ticks(6 * 128, unscaled_clock()); - m_timer[0]->adjust(base); + m_timer->adjust(base); } void m58846_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) { - switch (id) - { - // timer 1 - case 0: - m_irqflag[1] = true; - m_possible_irq = true; - reset_timer1(); - break; - - // timer 2 - case 1: - break; - - default: - assert_always(FALSE, "Unknown id in m58846_device::device_timer"); - break; - } + if (id != 0) + return; + + // timer 1 overflow + m_irqflag[1] = true; + m_possible_irq = true; + reset_timer(); } void m58846_device::write_v(UINT8 data) { // d0: enable timer 1 irq + // d1: enable timer 2 irq? (TODO) + // d2: ? + // d3: timer 2 enable? m_tmr_irq_enabled[0] = (data & 1) ? true : false; m_possible_irq = true; @@ -121,7 +112,7 @@ void m58846_device::write_v(UINT8 data) void m58846_device::execute_one() { // handle one opcode - switch (m_op & 0xf0) + switch (m_op & 0x1f0) { case 0x30: op_sey(); break; case 0x70: op_sp(); break; @@ -131,7 +122,7 @@ void m58846_device::execute_one() case 0xc0: case 0xd0: case 0xe0: case 0xf0: op_lxy(); break; default: - switch (m_op & 0xfc) + switch (m_op & 0x1fc) { case 0x20: op_szb(); break; case 0x4c: op_sb(); break; @@ -156,11 +147,11 @@ void m58846_device::execute_one() case 0x03: op_dey(); break; case 0x04: op_di(); break; case 0x05: op_ei(); break; + case 0x09: op_tabe(); break; // undocumented case 0x0a: op_am(); break; case 0x0b: op_ose(); break; case 0x0c: op_tya(); break; case 0x0f: op_cma(); break; - // 0x18 RAR undocumented? case 0x10: op_cls(); break; case 0x11: op_clds(); break; @@ -169,6 +160,8 @@ void m58846_device::execute_one() case 0x15: op_sd(); break; case 0x16: op_tepa(); break; case 0x17: op_ospa(); break; + case 0x18: op_rl(); break; // undocumented + case 0x19: op_rr(); break; // undocumented case 0x1a: op_teab(); break; case 0x1b: op_osab(); break; case 0x1c: op_tba(); break; @@ -203,10 +196,10 @@ void m58846_device::execute_one() break; } - break; // 0xff + break; // 0x1ff } - break; // 0xfc + break; // 0x1fc } // big switch } |