From 2a341891904a59b0feb790c44c68fcfae5e3d572 Mon Sep 17 00:00:00 2001 From: hap Date: Fri, 6 Dec 2024 23:06:43 +0100 Subject: irobot: fix compile issue, small cleanup --- src/mame/atari/irobot.cpp | 6 +- src/mame/atari/irobot.h | 70 +++-- src/mame/atari/irobot_m.cpp | 741 ++++++++++++++++++++++---------------------- src/mame/atari/irobot_v.cpp | 125 ++++---- src/mame/konami/twin16.cpp | 5 +- 5 files changed, 468 insertions(+), 479 deletions(-) diff --git a/src/mame/atari/irobot.cpp b/src/mame/atari/irobot.cpp index cf10debf2e9..96e5c1cfe44 100644 --- a/src/mame/atari/irobot.cpp +++ b/src/mame/atari/irobot.cpp @@ -97,13 +97,13 @@ void irobot_state::irobot_clearirq_w(uint8_t data) { - m_maincpu->set_input_line(M6809_IRQ_LINE ,CLEAR_LINE); + m_maincpu->set_input_line(M6809_IRQ_LINE, CLEAR_LINE); } void irobot_state::irobot_clearfirq_w(uint8_t data) { - m_maincpu->set_input_line(M6809_FIRQ_LINE ,CLEAR_LINE); + m_maincpu->set_input_line(M6809_FIRQ_LINE, CLEAR_LINE); } @@ -372,10 +372,10 @@ ROM_START( irobot ) ROM_LOAD( "136029-121.bin", 0x2820, 0x0400, CRC(adebcb99) SHA1(4628f8af43d82e578833b1452ec747eeb822b4e4) ) ROM_LOAD( "136029-122.bin", 0x2c20, 0x0400, CRC(da7b6f79) SHA1(02398ba6e7c56d961bf92e2755e530db1144219d) ) ROM_LOAD( "136029-123.bin", 0x3020, 0x0400, CRC(39fff18f) SHA1(85f338eeff7d8ed58804611bf8446ebb697d196d) ) -ROM_END /* Colorprom from John's driver. ? */ /* ROM_LOAD( "136029.125", 0x0000, 0x0020, CRC(c05abf82) ) */ +ROM_END diff --git a/src/mame/atari/irobot.h b/src/mame/atari/irobot.h index 7267fb798cb..ed3e1703d34 100644 --- a/src/mame/atari/irobot.h +++ b/src/mame/atari/irobot.h @@ -17,6 +17,7 @@ #include "screen.h" #define IR_TIMING 1 /* try to emulate MB and VG running time */ +#define DISASSEMBLE_MB_ROM 0 /* generate a disassembly of the mathbox ROMs */ class irobot_state : public driver_device { @@ -41,11 +42,17 @@ public: void irobot(machine_config &config); +protected: + virtual void machine_start() override ATTR_COLD; + virtual void machine_reset() override ATTR_COLD; + virtual void video_start() override ATTR_COLD; + private: struct irmb_ops { const struct irmb_ops *nxtop; uint32_t func; + uint32_t nxtadd; uint32_t diradd; uint32_t latchmask; uint32_t *areg; @@ -56,36 +63,6 @@ private: uint8_t ramsel; }; - virtual void machine_start() override ATTR_COLD; - virtual void machine_reset() override ATTR_COLD; - virtual void video_start() override ATTR_COLD; - void irobot_map(address_map &map) ATTR_COLD; - - void irobot_clearirq_w(uint8_t data); - void irobot_clearfirq_w(uint8_t data); - uint8_t irobot_sharedmem_r(offs_t offset); - void irobot_sharedmem_w(offs_t offset, uint8_t data); - void irobot_statwr_w(uint8_t data); - void irobot_out0_w(uint8_t data); - void irobot_rom_banksel_w(uint8_t data); - uint8_t irobot_status_r(); - void irobot_paletteram_w(offs_t offset, uint8_t data); - uint8_t quad_pokeyn_r(offs_t offset); - void quad_pokeyn_w(offs_t offset, uint8_t data); - void irobot_palette(palette_device &palette) const; - uint32_t screen_update_irobot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); - TIMER_CALLBACK_MEMBER(scanline_callback); - TIMER_DEVICE_CALLBACK_MEMBER(irobot_irvg_done_callback); - TIMER_DEVICE_CALLBACK_MEMBER(irobot_irmb_done_callback); - void irobot_poly_clear(uint8_t *bitmap_base); - void irobot_poly_clear(); - void draw_line(uint8_t *polybitmap, int x1, int y1, int x2, int y2, int col); - void irobot_run_video(); - uint32_t irmb_din(const irmb_ops *curop); - void irmb_dout(const irmb_ops *curop, uint32_t d); - void load_oproms(); - void irmb_run(); - required_shared_ptr m_videoram; uint8_t m_vg_clear = 0U; uint8_t m_bufsel = 0U; @@ -125,6 +102,39 @@ private: required_device m_novram; required_device_array m_pokey; output_finder<2> m_leds; + +#if DISASSEMBLE_MB_ROM + void disassemble_instruction(uint16_t offset, const irmb_ops *op); +#endif + + void irobot_map(address_map &map) ATTR_COLD; + + void irobot_clearirq_w(uint8_t data); + void irobot_clearfirq_w(uint8_t data); + uint8_t irobot_sharedmem_r(offs_t offset); + void irobot_sharedmem_w(offs_t offset, uint8_t data); + void irobot_statwr_w(uint8_t data); + void irobot_out0_w(uint8_t data); + void irobot_rom_banksel_w(uint8_t data); + uint8_t irobot_status_r(); + void irobot_paletteram_w(offs_t offset, uint8_t data); + uint8_t quad_pokeyn_r(offs_t offset); + void quad_pokeyn_w(offs_t offset, uint8_t data); + + void irobot_palette(palette_device &palette) const; + uint32_t screen_update_irobot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + TIMER_CALLBACK_MEMBER(scanline_callback); + TIMER_DEVICE_CALLBACK_MEMBER(irobot_irvg_done_callback); + TIMER_DEVICE_CALLBACK_MEMBER(irobot_irmb_done_callback); + void irobot_poly_clear(uint8_t *bitmap_base); + void irobot_poly_clear(); + void draw_line(uint8_t *polybitmap, int x1, int y1, int x2, int y2, int col); + void irobot_run_video(); + + uint32_t irmb_din(const irmb_ops *curop); + void irmb_dout(const irmb_ops *curop, uint32_t d); + void load_oproms(); + void irmb_run(); }; #endif // MAME_ATARI_IROBOT_H diff --git a/src/mame/atari/irobot_m.cpp b/src/mame/atari/irobot_m.cpp index ab8753b2fac..d6bde9cf633 100644 --- a/src/mame/atari/irobot_m.cpp +++ b/src/mame/atari/irobot_m.cpp @@ -13,7 +13,7 @@ /* Note: * There's probably something wrong with the way the Mathbox gets started. * Try compiling with IR_TIMING=1, run with logging on and take a look at - * the resulting logilfe. + * the resulting logfile. * The mathbox is started in short intervals (<10 scanlines) without (!) * checking its idle status. * It also seems that the mathbox in this emulation would have to cope with @@ -22,11 +22,8 @@ * too high. */ -#define DISASSEMBLE_MB_ROM 0 /* generate a disassembly of the mathbox ROMs */ - #define IR_CPU_STATE() \ - logerror(\ - "%s, scanline: %d\n", machine().describe_context(), m_screen->vpos()) + logerror("%s, scanline: %d\n", machine().describe_context(), m_screen->vpos()) uint8_t irobot_state::irobot_sharedmem_r(offs_t offset) @@ -35,7 +32,7 @@ uint8_t irobot_state::irobot_sharedmem_r(offs_t offset) return m_mbRAM[BYTE_XOR_BE(offset)]; if (m_outx == 2) - return m_combase[BYTE_XOR_BE(offset & 0xFFF)]; + return m_combase[BYTE_XOR_BE(offset & 0xfff)]; if (m_outx == 0) return m_mbROM[((m_mpage & 1) << 13) + BYTE_XOR_BE(offset)]; @@ -43,7 +40,7 @@ uint8_t irobot_state::irobot_sharedmem_r(offs_t offset) if (m_outx == 1) return m_mbROM[0x4000 + ((m_mpage & 3) << 13) + BYTE_XOR_BE(offset)]; - return 0xFF; + return 0xff; } /* Comment out the mbRAM =, comRAM2 = or comRAM1 = and it will start working */ @@ -53,7 +50,7 @@ void irobot_state::irobot_sharedmem_w(offs_t offset, uint8_t data) m_mbRAM[BYTE_XOR_BE(offset)] = data; if (m_outx == 2) - m_combase[BYTE_XOR_BE(offset & 0xFFF)] = data; + m_combase[BYTE_XOR_BE(offset & 0xfff)] = data; } TIMER_DEVICE_CALLBACK_MEMBER(irobot_state::irobot_irvg_done_callback) @@ -86,7 +83,7 @@ void irobot_state::irobot_statwr_w(uint8_t data) IR_CPU_STATE(); m_irvg_timer->adjust(attotime::from_msec(10)); #endif - m_irvg_running=1; + m_irvg_running = 1; } if (BIT(data, 4) && !BIT(m_statwr, 4)) irmb_run(); @@ -104,13 +101,13 @@ void irobot_state::irobot_out0_w(uint8_t data) switch (data & 0x60) { case 0: - membank("bank2")->set_base(&RAM[0x1C000]); + membank("bank2")->set_base(&RAM[0x1c000]); break; case 0x20: - membank("bank2")->set_base(&RAM[0x1C800]); + membank("bank2")->set_base(&RAM[0x1c800]); break; case 0x40: - membank("bank2")->set_base(&RAM[0x1D000]); + membank("bank2")->set_base(&RAM[0x1d000]); break; } m_outx = (data & 0x18) >> 3; @@ -122,7 +119,7 @@ void irobot_state::irobot_rom_banksel_w(uint8_t data) { uint8_t *RAM = memregion("maincpu")->base(); - switch ((data & 0x0E) >> 1) + switch ((data & 0x0e) >> 1) { case 0: membank("bank1")->set_base(&RAM[0x10000]); @@ -140,7 +137,7 @@ void irobot_state::irobot_rom_banksel_w(uint8_t data) membank("bank1")->set_base(&RAM[0x18000]); break; case 5: - membank("bank1")->set_base(&RAM[0x1A000]); + membank("bank1")->set_base(&RAM[0x1a000]); break; } m_leds[0] = BIT(data, 4); @@ -151,8 +148,8 @@ TIMER_CALLBACK_MEMBER(irobot_state::scanline_callback) { int scanline = param; - if (scanline == 0) m_irvg_vblank=0; - if (scanline == 224) m_irvg_vblank=1; + if (scanline == 0) m_irvg_vblank = 0; + if (scanline == 224) m_irvg_vblank = 1; logerror("SCANLINE CALLBACK %d\n",scanline); /* set the IRQ line state based on the 32V line state */ m_maincpu->set_input_line(M6809_IRQ_LINE, (scanline & 32) ? ASSERT_LINE : CLEAR_LINE); @@ -184,7 +181,7 @@ void irobot_state::machine_reset() m_comRAM[0] = MB + 0x0e000; m_comRAM[1] = MB + 0x0f000; - m_irvg_vblank=0; + m_irvg_vblank = 0; m_irvg_running = 0; m_irmb_running = 0; @@ -198,7 +195,7 @@ void irobot_state::machine_reset() them to simulate the mathbox and vector generator running in real time */ uint8_t irobot_state::irobot_status_r() { - int d=0; + int d = 0; logerror("status read. "); IR_CPU_STATE(); @@ -211,8 +208,8 @@ uint8_t irobot_state::irobot_status_r() #if IR_TIMING /* flags are cleared by callbacks */ #else - m_irmb_running=0; - m_irvg_running=0; + m_irmb_running = 0; + m_irvg_running = 0; #endif return d; } @@ -270,11 +267,6 @@ uint8_t irobot_state::irobot_status_r() #define FL_MBRW 0x80 -#if DISASSEMBLE_MB_ROM -static void disassemble_instruction(irobot_state::irmb_ops const *op); -#endif - - uint32_t irobot_state::irmb_din(const irmb_ops *curop) { uint32_t d = 0; @@ -286,9 +278,9 @@ uint32_t irobot_state::irmb_din(const irmb_ops *curop) if (curop->diren || (m_irmb_latch & 0x6000) == 0) d = ((uint16_t *)m_mbRAM)[ad & 0xfff]; /* MB RAM read */ else if (m_irmb_latch & 0x4000) - d = ((uint16_t *)m_mbROM)[ad + 0x2000]; /* MB ROM read, CEMATH = 1 */ + d = ((uint16_t *)m_mbROM)[ad + 0x2000]; /* MB ROM read, CEMATH = 1 */ else - d = ((uint16_t *)m_mbROM)[ad & 0x1fff]; /* MB ROM read, CEMATH = 0 */ + d = ((uint16_t *)m_mbROM)[ad & 0x1fff]; /* MB ROM read, CEMATH = 0 */ } return d; } @@ -323,29 +315,30 @@ void irobot_state::load_oproms() { int nxtadd, func, ramsel, diradd, latchmask, dirmask, time; - m_mbops[i].areg = &m_irmb_regs[MB[0x0000 + i] & 0x0F]; - m_mbops[i].breg = &m_irmb_regs[MB[0x0400 + i] & 0x0F]; - func = (MB[0x0800 + i] & 0x0F) << 5; - func |= ((MB[0x0C00 +i] & 0x0F) << 1); + m_mbops[i].areg = &m_irmb_regs[MB[0x0000 + i] & 0x0f]; + m_mbops[i].breg = &m_irmb_regs[MB[0x0400 + i] & 0x0f]; + func = (MB[0x0800 + i] & 0x0f) << 5; + func |= ((MB[0x0c00 +i] & 0x0f) << 1); func |= (MB[0x1000 + i] & 0x08) >> 3; time = MB[0x1000 + i] & 0x03; m_mbops[i].flags = (MB[0x1000 + i] & 0x04) >> 2; - nxtadd = (MB[0x1400 + i] & 0x0C) >> 2; + nxtadd = (MB[0x1400 + i] & 0x0c) >> 2; diradd = MB[0x1400 + i] & 0x03; - nxtadd |= ((MB[0x1800 + i] & 0x0F) << 6); - nxtadd |= ((MB[0x1C00 + i] & 0x0F) << 2); - diradd |= (MB[0x2000 + i] & 0x0F) << 2; - func |= (MB[0x2400 + i] & 0x0E) << 9; + nxtadd |= ((MB[0x1800 + i] & 0x0f) << 6); + nxtadd |= ((MB[0x1c00 + i] & 0x0f) << 2); + diradd |= (MB[0x2000 + i] & 0x0f) << 2; + func |= (MB[0x2400 + i] & 0x0e) << 9; m_mbops[i].flags |= (MB[0x2400 + i] & 0x01) << 1; - m_mbops[i].flags |= (MB[0x2800 + i] & 0x0F) << 2; - m_mbops[i].flags |= ((MB[0x2C00 + i] & 0x01) << 6); - m_mbops[i].flags |= (MB[0x2C00 + i] & 0x08) << 4; - ramsel = (MB[0x2C00 + i] & 0x06) >> 1; + m_mbops[i].flags |= (MB[0x2800 + i] & 0x0f) << 2; + m_mbops[i].flags |= ((MB[0x2c00 + i] & 0x01) << 6); + m_mbops[i].flags |= (MB[0x2c00 + i] & 0x08) << 4; + ramsel = (MB[0x2c00 + i] & 0x06) >> 1; diradd |= (MB[0x3000 + i] & 0x03) << 6; if (m_mbops[i].flags & FL_shift) func |= 0x200; m_mbops[i].func = func; + m_mbops[i].nxtadd = nxtadd; m_mbops[i].nxtop = &m_mbops[nxtadd]; /* determine the number of 12MHz cycles for this operation */ @@ -357,13 +350,13 @@ void irobot_state::load_oproms() /* precompute the hardcoded address bits and the mask to be used on the latch value */ if (ramsel == 0) { - dirmask = 0x00FC; + dirmask = 0x00fc; latchmask = 0x3000; } else { dirmask = 0x0000; - latchmask = 0x3FFC; + latchmask = 0x3ffc; } if (ramsel & 2) latchmask |= 0x0003; @@ -376,7 +369,7 @@ void irobot_state::load_oproms() m_mbops[i].diren = (ramsel == 0); #if DISASSEMBLE_MB_ROM - disassemble_instruction(&m_mbops[i]); + disassemble_instruction(i, &m_mbops[i]); #endif } } @@ -400,53 +393,53 @@ TIMER_DEVICE_CALLBACK_MEMBER(irobot_state::irobot_irmb_done_callback) #define COMPUTE_CI \ - CI = 0;\ - if (curop->flags & FL_DPSEL)\ - CI = cflag;\ - else\ - {\ - if (curop->flags & FL_carry)\ - CI = 1;\ - if (!(prevop->flags & FL_DIV) && !nflag)\ - CI = 1;\ + CI = 0; \ + if (curop->flags & FL_DPSEL) \ + CI = cflag; \ + else \ + { \ + if (curop->flags & FL_carry) \ + CI = 1; \ + if (!(prevop->flags & FL_DIV) && !nflag) \ + CI = 1; \ } #define ADD(r,s) \ - COMPUTE_CI;\ - result = r + s + CI;\ - cflag = (result >> 16) & 1;\ + COMPUTE_CI; \ + result = r + s + CI; \ + cflag = (result >> 16) & 1; \ vflag = (((r & 0x7fff) + (s & 0x7fff) + CI) >> 15) ^ cflag #define SUBR(r,s) \ - COMPUTE_CI;\ - result = (r ^ 0xFFFF) + s + CI; /*S - R + CI - 1*/ \ - cflag = (result >> 16) & 1;\ + COMPUTE_CI; \ + result = (r ^ 0xffff) + s + CI; /*S - R + CI - 1*/ \ + cflag = (result >> 16) & 1; \ vflag = (((s & 0x7fff) + ((r ^ 0xffff) & 0x7fff) + CI) >> 15) ^ cflag #define SUB(r,s) \ - COMPUTE_CI;\ - result = r + (s ^ 0xFFFF) + CI; /*R - S + CI - 1*/ \ - cflag = (result >> 16) & 1;\ + COMPUTE_CI; \ + result = r + (s ^ 0xffff) + CI; /*R - S + CI - 1*/ \ + cflag = (result >> 16) & 1; \ vflag = (((r & 0x7fff) + ((s ^ 0xffff) & 0x7fff) + CI) >> 15) ^ cflag #define OR(r,s) \ - result = r | s;\ + result = r | s; \ vflag = cflag = 0 #define AND(r,s) \ - result = r & s;\ + result = r & s; \ vflag = cflag = 0 #define IAND(r,s) \ - result = (r ^ 0xFFFF) & s;\ + result = (r ^ 0xffff) & s; \ vflag = cflag = 0 #define XOR(r,s) \ - result = r ^ s;\ + result = r ^ s; \ vflag = cflag = 0 #define IXOR(r,s) \ - result = (r ^ s) ^ 0xFFFF;\ + result = (r ^ s) ^ 0xffff; \ vflag = cflag = 0 @@ -457,47 +450,47 @@ TIMER_DEVICE_CALLBACK_MEMBER(irobot_state::irobot_irmb_done_callback) Y = zresult #define DEST2 \ - Y = *curop->areg;\ + Y = *curop->areg; \ *curop->breg = zresult #define DEST3 \ - *curop->breg = zresult;\ + *curop->breg = zresult; \ Y = zresult #define DEST4_NOSHIFT \ - *curop->breg = (zresult >> 1) | ((curop->flags & 0x20) << 10);\ - Q = (Q >> 1) | ((curop->flags & 0x20) << 10);\ + *curop->breg = (zresult >> 1) | ((curop->flags & 0x20) << 10); \ + Q = (Q >> 1) | ((curop->flags & 0x20) << 10); \ Y = zresult #define DEST4_SHIFT \ - *curop->breg = (zresult >> 1) | ((nflag ^ vflag) << 15);\ - Q = (Q >> 1) | ((zresult & 0x01) << 15);\ + *curop->breg = (zresult >> 1) | ((nflag ^ vflag) << 15); \ + Q = (Q >> 1) | ((zresult & 0x01) << 15); \ Y = zresult #define DEST5_NOSHIFT \ - *curop->breg = (zresult >> 1) | ((curop->flags & 0x20) << 10);\ + *curop->breg = (zresult >> 1) | ((curop->flags & 0x20) << 10); \ Y = zresult #define DEST5_SHIFT \ - *curop->breg = (zresult >> 1) | ((nflag ^ vflag) << 15);\ + *curop->breg = (zresult >> 1) | ((nflag ^ vflag) << 15); \ Y = zresult #define DEST6_NOSHIFT \ - *curop->breg = zresult << 1;\ - Q = ((Q << 1) & 0xffff) | (nflag ^ 1);\ + *curop->breg = zresult << 1; \ + Q = ((Q << 1) & 0xffff) | (nflag ^ 1); \ Y = zresult #define DEST6_SHIFT \ - *curop->breg = (zresult << 1) | ((Q & 0x8000) >> 15);\ - Q = (Q << 1) & 0xffff;\ + *curop->breg = (zresult << 1) | ((Q & 0x8000) >> 15); \ + Q = (Q << 1) & 0xffff; \ Y = zresult #define DEST7_NOSHIFT \ - *curop->breg = zresult << 1;\ + *curop->breg = zresult << 1; \ Y = zresult #define DEST7_SHIFT \ - *curop->breg = (zresult << 1) | ((Q & 0x8000) >> 15);\ + *curop->breg = (zresult << 1) | ((Q & 0x8000) >> 15); \ Y = zresult @@ -516,278 +509,274 @@ void irobot_state::irmb_run() { uint32_t icount = 0; + const irmb_ops *prevop = &m_mbops[0]; + const irmb_ops *curop = &m_mbops[0]; + + uint32_t Q = 0; + uint32_t Y = 0; + uint32_t nflag = 0; + uint32_t vflag = 0; + uint32_t cflag = 0; + uint32_t zresult = 1; + uint32_t CI = 0; + uint32_t SP = 0; + + auto profile = g_profiler.start(PROFILER_USER1); + + while ((prevop->flags & (FL_DPSEL | FL_carry)) != (FL_DPSEL | FL_carry)) { - const irmb_ops *prevop = &m_mbops[0]; - const irmb_ops *curop = &m_mbops[0]; + uint32_t result; + uint32_t fu; + uint32_t tmp; - uint32_t Q = 0; - uint32_t Y = 0; - uint32_t nflag = 0; - uint32_t vflag = 0; - uint32_t cflag = 0; - uint32_t zresult = 1; - uint32_t CI = 0; - uint32_t SP = 0; + icount += curop->cycles; - auto profile = g_profiler.start(PROFILER_USER1); + /* Get function code */ + fu = curop->func; - while ((prevop->flags & (FL_DPSEL | FL_carry)) != (FL_DPSEL | FL_carry)) + /* Modify function for MULT */ + if (!(prevop->flags & FL_MULT) || (Q & 1)) + fu = fu ^ 0x02; + else + fu = fu | 0x02; + + /* Modify function for DIV */ + if ((prevop->flags & FL_DIV) || nflag) + fu = fu ^ 0x08; + else + fu = fu | 0x08; + + /* Do source and operation */ + switch (fu & 0x03f) { - uint32_t result; - uint32_t fu; - uint32_t tmp; + case 0x00: ADD(*curop->areg, Q); break; + case 0x01: ADD(*curop->areg, *curop->breg); break; + case 0x02: ADD(0, Q); break; + case 0x03: ADD(0, *curop->breg); break; + case 0x04: ADD(0, *curop->areg); break; + case 0x05: tmp = irmb_din(curop); ADD(tmp, *curop->areg); break; + case 0x06: tmp = irmb_din(curop); ADD(tmp, Q); break; + case 0x07: tmp = irmb_din(curop); ADD(tmp, 0); break; + case 0x08: SUBR(*curop->areg, Q); break; + case 0x09: SUBR(*curop->areg, *curop->breg); break; + case 0x0a: SUBR(0, Q); break; + case 0x0b: SUBR(0, *curop->breg); break; + case 0x0c: SUBR(0, *curop->areg); break; + case 0x0d: tmp = irmb_din(curop); SUBR(tmp, *curop->areg); break; + case 0x0e: tmp = irmb_din(curop); SUBR(tmp, Q); break; + case 0x0f: tmp = irmb_din(curop); SUBR(tmp, 0); break; + case 0x10: SUB(*curop->areg, Q); break; + case 0x11: SUB(*curop->areg, *curop->breg); break; + case 0x12: SUB(0, Q); break; + case 0x13: SUB(0, *curop->breg); break; + case 0x14: SUB(0, *curop->areg); break; + case 0x15: tmp = irmb_din(curop); SUB(tmp, *curop->areg); break; + case 0x16: tmp = irmb_din(curop); SUB(tmp, Q); break; + case 0x17: tmp = irmb_din(curop); SUB(tmp, 0); break; + case 0x18: OR(*curop->areg, Q); break; + case 0x19: OR(*curop->areg, *curop->breg); break; + case 0x1a: OR(0, Q); break; + case 0x1b: OR(0, *curop->breg); break; + case 0x1c: OR(0, *curop->areg); break; + case 0x1d: OR(irmb_din(curop), *curop->areg); break; + case 0x1e: OR(irmb_din(curop), Q); break; + case 0x1f: OR(irmb_din(curop), 0); break; + case 0x20: AND(*curop->areg, Q); break; + case 0x21: AND(*curop->areg, *curop->breg); break; + case 0x22: AND(0, Q); break; + case 0x23: AND(0, *curop->breg); break; + case 0x24: AND(0, *curop->areg); break; + case 0x25: AND(irmb_din(curop), *curop->areg); break; + case 0x26: AND(irmb_din(curop), Q); break; + case 0x27: AND(irmb_din(curop), 0); break; + case 0x28: IAND(*curop->areg, Q); break; + case 0x29: IAND(*curop->areg, *curop->breg); break; + case 0x2a: IAND(0, Q); break; + case 0x2b: IAND(0, *curop->breg); break; + case 0x2c: IAND(0, *curop->areg); break; + case 0x2d: IAND(irmb_din(curop), *curop->areg); break; + case 0x2e: IAND(irmb_din(curop), Q); break; + case 0x2f: IAND(irmb_din(curop), 0); break; + case 0x30: XOR(*curop->areg, Q); break; + case 0x31: XOR(*curop->areg, *curop->breg); break; + case 0x32: XOR(0, Q); break; + case 0x33: XOR(0, *curop->breg); break; + case 0x34: XOR(0, *curop->areg); break; + case 0x35: XOR(irmb_din(curop), *curop->areg); break; + case 0x36: XOR(irmb_din(curop), Q); break; + case 0x37: XOR(irmb_din(curop), 0); break; + case 0x38: IXOR(*curop->areg, Q); break; + case 0x39: IXOR(*curop->areg, *curop->breg); break; + case 0x3a: IXOR(0, Q); break; + case 0x3b: IXOR(0, *curop->breg); break; + case 0x3c: IXOR(0, *curop->areg); break; + case 0x3d: IXOR(irmb_din(curop), *curop->areg); break; + case 0x3e: IXOR(irmb_din(curop), Q); break; + case 0x3f: IXOR(irmb_din(curop), 0); break; + } - icount += curop->cycles; + /* Evaluate flags */ + zresult = result & 0xffff; + nflag = zresult >> 15; - /* Get function code */ - fu = curop->func; + prevop = curop; - /* Modify function for MULT */ - if (!(prevop->flags & FL_MULT) || (Q & 1)) - fu = fu ^ 0x02; - else - fu = fu | 0x02; + /* Do destination and jump */ + switch (fu >> 6) + { + case 0x00: + case 0x08: DEST0; JUMP0; break; + case 0x01: + case 0x09: DEST1; JUMP0; break; + case 0x02: + case 0x0a: DEST2; JUMP0; break; + case 0x03: + case 0x0b: DEST3; JUMP0; break; + case 0x04: DEST4_NOSHIFT; JUMP0; break; + case 0x05: DEST5_NOSHIFT; JUMP0; break; + case 0x06: DEST6_NOSHIFT; JUMP0; break; + case 0x07: DEST7_NOSHIFT; JUMP0; break; + case 0x0c: DEST4_SHIFT; JUMP0; break; + case 0x0d: DEST5_SHIFT; JUMP0; break; + case 0x0e: DEST6_SHIFT; JUMP0; break; + case 0x0f: DEST7_SHIFT; JUMP0; break; + + case 0x10: + case 0x18: DEST0; JUMP1; break; + case 0x11: + case 0x19: DEST1; JUMP1; break; + case 0x12: + case 0x1a: DEST2; JUMP1; break; + case 0x13: + case 0x1b: DEST3; JUMP1; break; + case 0x14: DEST4_NOSHIFT; JUMP1; break; + case 0x15: DEST5_NOSHIFT; JUMP1; break; + case 0x16: DEST6_NOSHIFT; JUMP1; break; + case 0x17: DEST7_NOSHIFT; JUMP1; break; + case 0x1c: DEST4_SHIFT; JUMP1; break; + case 0x1d: DEST5_SHIFT; JUMP1; break; + case 0x1e: DEST6_SHIFT; JUMP1; break; + case 0x1f: DEST7_SHIFT; JUMP1; break; + + case 0x20: + case 0x28: DEST0; JUMP2; break; + case 0x21: + case 0x29: DEST1; JUMP2; break; + case 0x22: + case 0x2a: DEST2; JUMP2; break; + case 0x23: + case 0x2b: DEST3; JUMP2; break; + case 0x24: DEST4_NOSHIFT; JUMP2; break; + case 0x25: DEST5_NOSHIFT; JUMP2; break; + case 0x26: DEST6_NOSHIFT; JUMP2; break; + case 0x27: DEST7_NOSHIFT; JUMP2; break; + case 0x2c: DEST4_SHIFT; JUMP2; break; + case 0x2d: DEST5_SHIFT; JUMP2; break; + case 0x2e: DEST6_SHIFT; JUMP2; break; + case 0x2f: DEST7_SHIFT; JUMP2; break; + + case 0x30: + case 0x38: DEST0; JUMP3; break; + case 0x31: + case 0x39: DEST1; JUMP3; break; + case 0x32: + case 0x3a: DEST2; JUMP3; break; + case 0x33: + case 0x3b: DEST3; JUMP3; break; + case 0x34: DEST4_NOSHIFT; JUMP3; break; + case 0x35: DEST5_NOSHIFT; JUMP3; break; + case 0x36: DEST6_NOSHIFT; JUMP3; break; + case 0x37: DEST7_NOSHIFT; JUMP3; break; + case 0x3c: DEST4_SHIFT; JUMP3; break; + case 0x3d: DEST5_SHIFT; JUMP3; break; + case 0x3e: DEST6_SHIFT; JUMP3; break; + case 0x3f: DEST7_SHIFT; JUMP3; break; + + case 0x40: + case 0x48: DEST0; JUMP4; break; + case 0x41: + case 0x49: DEST1; JUMP4; break; + case 0x42: + case 0x4a: DEST2; JUMP4; break; + case 0x43: + case 0x4b: DEST3; JUMP4; break; + case 0x44: DEST4_NOSHIFT; JUMP4; break; + case 0x45: DEST5_NOSHIFT; JUMP4; break; + case 0x46: DEST6_NOSHIFT; JUMP4; break; + case 0x47: DEST7_NOSHIFT; JUMP4; break; + case 0x4c: DEST4_SHIFT; JUMP4; break; + case 0x4d: DEST5_SHIFT; JUMP4; break; + case 0x4e: DEST6_SHIFT; JUMP4; break; + case 0x4f: DEST7_SHIFT; JUMP4; break; + + case 0x50: + case 0x58: DEST0; JUMP5; break; + case 0x51: + case 0x59: DEST1; JUMP5; break; + case 0x52: + case 0x5a: DEST2; JUMP5; break; + case 0x53: + case 0x5b: DEST3; JUMP5; break; + case 0x54: DEST4_NOSHIFT; JUMP5; break; + case 0x55: DEST5_NOSHIFT; JUMP5; break; + case 0x56: DEST6_NOSHIFT; JUMP5; break; + case 0x57: DEST7_NOSHIFT; JUMP5; break; + case 0x5c: DEST4_SHIFT; JUMP5; break; + case 0x5d: DEST5_SHIFT; JUMP5; break; + case 0x5e: DEST6_SHIFT; JUMP5; break; + case 0x5f: DEST7_SHIFT; JUMP5; break; + + case 0x60: + case 0x68: DEST0; JUMP6; break; + case 0x61: + case 0x69: DEST1; JUMP6; break; + case 0x62: + case 0x6a: DEST2; JUMP6; break; + case 0x63: + case 0x6b: DEST3; JUMP6; break; + case 0x64: DEST4_NOSHIFT; JUMP6; break; + case 0x65: DEST5_NOSHIFT; JUMP6; break; + case 0x66: DEST6_NOSHIFT; JUMP6; break; + case 0x67: DEST7_NOSHIFT; JUMP6; break; + case 0x6c: DEST4_SHIFT; JUMP6; break; + case 0x6d: DEST5_SHIFT; JUMP6; break; + case 0x6e: DEST6_SHIFT; JUMP6; break; + case 0x6f: DEST7_SHIFT; JUMP6; break; + + case 0x70: + case 0x78: DEST0; JUMP7; break; + case 0x71: + case 0x79: DEST1; JUMP7; break; + case 0x72: + case 0x7a: DEST2; JUMP7; break; + case 0x73: + case 0x7b: DEST3; JUMP7; break; + case 0x74: DEST4_NOSHIFT; JUMP7; break; + case 0x75: DEST5_NOSHIFT; JUMP7; break; + case 0x76: DEST6_NOSHIFT; JUMP7; break; + case 0x77: DEST7_NOSHIFT; JUMP7; break; + case 0x7c: DEST4_SHIFT; JUMP7; break; + case 0x7d: DEST5_SHIFT; JUMP7; break; + case 0x7e: DEST6_SHIFT; JUMP7; break; + case 0x7f: DEST7_SHIFT; JUMP7; break; + } + + /* Do write */ + if (!(prevop->flags & FL_MBRW)) + irmb_dout(prevop, Y); - /* Modify function for DIV */ - if ((prevop->flags & FL_DIV) || nflag) - fu = fu ^ 0x08; + /* ADDEN */ + if (!(prevop->flags & FL_ADDEN)) + { + if (prevop->flags & FL_MBRW) + m_irmb_latch = irmb_din(prevop); else - fu = fu | 0x08; - - /* Do source and operation */ - switch (fu & 0x03f) - { - case 0x00: ADD(*curop->areg, Q); break; - case 0x01: ADD(*curop->areg, *curop->breg); break; - case 0x02: ADD(0, Q); break; - case 0x03: ADD(0, *curop->breg); break; - case 0x04: ADD(0, *curop->areg); break; - case 0x05: tmp = irmb_din(curop); ADD(tmp, *curop->areg); break; - case 0x06: tmp = irmb_din(curop); ADD(tmp, Q); break; - case 0x07: tmp = irmb_din(curop); ADD(tmp, 0); break; - case 0x08: SUBR(*curop->areg, Q); break; - case 0x09: SUBR(*curop->areg, *curop->breg); break; - case 0x0a: SUBR(0, Q); break; - case 0x0b: SUBR(0, *curop->breg); break; - case 0x0c: SUBR(0, *curop->areg); break; - case 0x0d: tmp = irmb_din(curop); SUBR(tmp, *curop->areg); break; - case 0x0e: tmp = irmb_din(curop); SUBR(tmp, Q); break; - case 0x0f: tmp = irmb_din(curop); SUBR(tmp, 0); break; - case 0x10: SUB(*curop->areg, Q); break; - case 0x11: SUB(*curop->areg, *curop->breg); break; - case 0x12: SUB(0, Q); break; - case 0x13: SUB(0, *curop->breg); break; - case 0x14: SUB(0, *curop->areg); break; - case 0x15: tmp = irmb_din(curop); SUB(tmp, *curop->areg); break; - case 0x16: tmp = irmb_din(curop); SUB(tmp, Q); break; - case 0x17: tmp = irmb_din(curop); SUB(tmp, 0); break; - case 0x18: OR(*curop->areg, Q); break; - case 0x19: OR(*curop->areg, *curop->breg); break; - case 0x1a: OR(0, Q); break; - case 0x1b: OR(0, *curop->breg); break; - case 0x1c: OR(0, *curop->areg); break; - case 0x1d: OR(irmb_din(curop), *curop->areg); break; - case 0x1e: OR(irmb_din(curop), Q); break; - case 0x1f: OR(irmb_din(curop), 0); break; - case 0x20: AND(*curop->areg, Q); break; - case 0x21: AND(*curop->areg, *curop->breg); break; - case 0x22: AND(0, Q); break; - case 0x23: AND(0, *curop->breg); break; - case 0x24: AND(0, *curop->areg); break; - case 0x25: AND(irmb_din(curop), *curop->areg); break; - case 0x26: AND(irmb_din(curop), Q); break; - case 0x27: AND(irmb_din(curop), 0); break; - case 0x28: IAND(*curop->areg, Q); break; - case 0x29: IAND(*curop->areg, *curop->breg); break; - case 0x2a: IAND(0, Q); break; - case 0x2b: IAND(0, *curop->breg); break; - case 0x2c: IAND(0, *curop->areg); break; - case 0x2d: IAND(irmb_din(curop), *curop->areg); break; - case 0x2e: IAND(irmb_din(curop), Q); break; - case 0x2f: IAND(irmb_din(curop), 0); break; - case 0x30: XOR(*curop->areg, Q); break; - case 0x31: XOR(*curop->areg, *curop->breg); break; - case 0x32: XOR(0, Q); break; - case 0x33: XOR(0, *curop->breg); break; - case 0x34: XOR(0, *curop->areg); break; - case 0x35: XOR(irmb_din(curop), *curop->areg); break; - case 0x36: XOR(irmb_din(curop), Q); break; - case 0x37: XOR(irmb_din(curop), 0); break; - case 0x38: IXOR(*curop->areg, Q); break; - case 0x39: IXOR(*curop->areg, *curop->breg); break; - case 0x3a: IXOR(0, Q); break; - case 0x3b: IXOR(0, *curop->breg); break; - case 0x3c: IXOR(0, *curop->areg); break; - case 0x3d: IXOR(irmb_din(curop), *curop->areg); break; - case 0x3e: IXOR(irmb_din(curop), Q); break; - default: case 0x3f: IXOR(irmb_din(curop), 0); break; - } - - /* Evaluate flags */ - zresult = result & 0xFFFF; - nflag = zresult >> 15; - - prevop = curop; - - /* Do destination and jump */ - switch (fu >> 6) - { - case 0x00: - case 0x08: DEST0; JUMP0; break; - case 0x01: - case 0x09: DEST1; JUMP0; break; - case 0x02: - case 0x0a: DEST2; JUMP0; break; - case 0x03: - case 0x0b: DEST3; JUMP0; break; - case 0x04: DEST4_NOSHIFT; JUMP0; break; - case 0x05: DEST5_NOSHIFT; JUMP0; break; - case 0x06: DEST6_NOSHIFT; JUMP0; break; - case 0x07: DEST7_NOSHIFT; JUMP0; break; - case 0x0c: DEST4_SHIFT; JUMP0; break; - case 0x0d: DEST5_SHIFT; JUMP0; break; - case 0x0e: DEST6_SHIFT; JUMP0; break; - case 0x0f: DEST7_SHIFT; JUMP0; break; - - case 0x10: - case 0x18: DEST0; JUMP1; break; - case 0x11: - case 0x19: DEST1; JUMP1; break; - case 0x12: - case 0x1a: DEST2; JUMP1; break; - case 0x13: - case 0x1b: DEST3; JUMP1; break; - case 0x14: DEST4_NOSHIFT; JUMP1; break; - case 0x15: DEST5_NOSHIFT; JUMP1; break; - case 0x16: DEST6_NOSHIFT; JUMP1; break; - case 0x17: DEST7_NOSHIFT; JUMP1; break; - case 0x1c: DEST4_SHIFT; JUMP1; break; - case 0x1d: DEST5_SHIFT; JUMP1; break; - case 0x1e: DEST6_SHIFT; JUMP1; break; - case 0x1f: DEST7_SHIFT; JUMP1; break; - - case 0x20: - case 0x28: DEST0; JUMP2; break; - case 0x21: - case 0x29: DEST1; JUMP2; break; - case 0x22: - case 0x2a: DEST2; JUMP2; break; - case 0x23: - case 0x2b: DEST3; JUMP2; break; - case 0x24: DEST4_NOSHIFT; JUMP2; break; - case 0x25: DEST5_NOSHIFT; JUMP2; break; - case 0x26: DEST6_NOSHIFT; JUMP2; break; - case 0x27: DEST7_NOSHIFT; JUMP2; break; - case 0x2c: DEST4_SHIFT; JUMP2; break; - case 0x2d: DEST5_SHIFT; JUMP2; break; - case 0x2e: DEST6_SHIFT; JUMP2; break; - case 0x2f: DEST7_SHIFT; JUMP2; break; - - case 0x30: - case 0x38: DEST0; JUMP3; break; - case 0x31: - case 0x39: DEST1; JUMP3; break; - case 0x32: - case 0x3a: DEST2; JUMP3; break; - case 0x33: - case 0x3b: DEST3; JUMP3; break; - case 0x34: DEST4_NOSHIFT; JUMP3; break; - case 0x35: DEST5_NOSHIFT; JUMP3; break; - case 0x36: DEST6_NOSHIFT; JUMP3; break; - case 0x37: DEST7_NOSHIFT; JUMP3; break; - case 0x3c: DEST4_SHIFT; JUMP3; break; - case 0x3d: DEST5_SHIFT; JUMP3; break; - case 0x3e: DEST6_SHIFT; JUMP3; break; - case 0x3f: DEST7_SHIFT; JUMP3; break; - - case 0x40: - case 0x48: DEST0; JUMP4; break; - case 0x41: - case 0x49: DEST1; JUMP4; break; - case 0x42: - case 0x4a: DEST2; JUMP4; break; - case 0x43: - case 0x4b: DEST3; JUMP4; break; - case 0x44: DEST4_NOSHIFT; JUMP4; break; - case 0x45: DEST5_NOSHIFT; JUMP4; break; - case 0x46: DEST6_NOSHIFT; JUMP4; break; - case 0x47: DEST7_NOSHIFT; JUMP4; break; - case 0x4c: DEST4_SHIFT; JUMP4; break; - case 0x4d: DEST5_SHIFT; JUMP4; break; - case 0x4e: DEST6_SHIFT; JUMP4; break; - case 0x4f: DEST7_SHIFT; JUMP4; break; - - case 0x50: - case 0x58: DEST0; JUMP5; break; - case 0x51: - case 0x59: DEST1; JUMP5; break; - case 0x52: - case 0x5a: DEST2; JUMP5; break; - case 0x53: - case 0x5b: DEST3; JUMP5; break; - case 0x54: DEST4_NOSHIFT; JUMP5; break; - case 0x55: DEST5_NOSHIFT; JUMP5; break; - case 0x56: DEST6_NOSHIFT; JUMP5; break; - case 0x57: DEST7_NOSHIFT; JUMP5; break; - case 0x5c: DEST4_SHIFT; JUMP5; break; - case 0x5d: DEST5_SHIFT; JUMP5; break; - case 0x5e: DEST6_SHIFT; JUMP5; break; - case 0x5f: DEST7_SHIFT; JUMP5; break; - - case 0x60: - case 0x68: DEST0; JUMP6; break; - case 0x61: - case 0x69: DEST1; JUMP6; break; - case 0x62: - case 0x6a: DEST2; JUMP6; break; - case 0x63: - case 0x6b: DEST3; JUMP6; break; - case 0x64: DEST4_NOSHIFT; JUMP6; break; - case 0x65: DEST5_NOSHIFT; JUMP6; break; - case 0x66: DEST6_NOSHIFT; JUMP6; break; - case 0x67: DEST7_NOSHIFT; JUMP6; break; - case 0x6c: DEST4_SHIFT; JUMP6; break; - case 0x6d: DEST5_SHIFT; JUMP6; break; - case 0x6e: DEST6_SHIFT; JUMP6; break; - case 0x6f: DEST7_SHIFT; JUMP6; break; - - case 0x70: - case 0x78: DEST0; JUMP7; break; - case 0x71: - case 0x79: DEST1; JUMP7; break; - case 0x72: - case 0x7a: DEST2; JUMP7; break; - case 0x73: - case 0x7b: DEST3; JUMP7; break; - case 0x74: DEST4_NOSHIFT; JUMP7; break; - case 0x75: DEST5_NOSHIFT; JUMP7; break; - case 0x76: DEST6_NOSHIFT; JUMP7; break; - case 0x77: DEST7_NOSHIFT; JUMP7; break; - case 0x7c: DEST4_SHIFT; JUMP7; break; - case 0x7d: DEST5_SHIFT; JUMP7; break; - case 0x7e: DEST6_SHIFT; JUMP7; break; - case 0x7f: DEST7_SHIFT; JUMP7; break; - } - - /* Do write */ - if (!(prevop->flags & FL_MBRW)) - irmb_dout(prevop, Y); - - /* ADDEN */ - if (!(prevop->flags & FL_ADDEN)) - { - if (prevop->flags & FL_MBRW) - m_irmb_latch = irmb_din(prevop); - else - m_irmb_latch = Y; - } + m_irmb_latch = Y; } - // stop profiling USER1 } logerror("%d instructions for Mathbox \n", icount); - #if IR_TIMING if (m_irmb_running == 0) { @@ -804,28 +793,25 @@ void irobot_state::irmb_run() #else m_maincpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE); #endif - m_irmb_running=1; + m_irmb_running = 1; } - #if DISASSEMBLE_MB_ROM -static void disassemble_instruction(irobot_state::irmb_ops const *op) +void irobot_state::disassemble_instruction(uint16_t offset, const irmb_ops *op) { - int lp; - - if (i==0) - logerror(" Address a b func stor: Q :Y, R, S RDCSAESM da m rs\n"); - logerror("%04X : ",i); - logerror("%X ",op->areg); - logerror("%X ",op->breg); - - lp=(op->func & 0x38)>>3; - if ((lp&1)==0) - lp|=1; + if (offset == 0) + logerror(" Address a b func stor: Q :Y, R, S RDCSAESM da rs\n"); + logerror("%04X : ", offset); + logerror("%X ", *op->areg); + logerror("%X ", *op->breg); + + int lp = (op->func & 0x38) >> 3; + if ((lp & 1) == 0) + lp |= 1; else if((op->flags & FL_DIV) != 0) - lp&=6; + lp &= 6; else logerror("*"); @@ -857,7 +843,7 @@ static void disassemble_instruction(irobot_state::irmb_ops const *op) break; } - switch ((op->func & 0x1c0)>>6) + switch ((op->func & 0x1c0) >> 6) { case 0: logerror(" - : Q :F,"); @@ -866,52 +852,52 @@ static void disassemble_instruction(irobot_state::irmb_ops const *op) logerror(" - : - :F,"); break; case 2: - logerror(" R%x: - :A,",op->breg); + logerror(" R%x: - :A,", *op->breg); break; case 3: - logerror(" R%x: - :F,",op->breg); + logerror(" R%x: - :F,", *op->breg); break; case 4: - logerror(">>R%x:>>Q:F,",op->breg); + logerror(">>R%x:>>Q:F,", *op->breg); break; case 5: - logerror(">>R%x: - :F,",op->breg); + logerror(">>R%x: - :F,", *op->breg); break; case 6: - logerror("<breg); + logerror("<breg); break; case 7: - logerror("<breg); + logerror("<breg); break; } - lp=(op->func & 0x7); - if ((lp&2)==0) - lp|=2; - else if((op->flags & FL_MULT) == 0) - lp&=5; + lp = (op->func & 0x7); + if ((lp & 2) == 0) + lp |= 2; + else if ((op->flags & FL_MULT) == 0) + lp &= 5; else logerror("*"); switch (lp) { case 0: - logerror("R%x, Q ",op->areg); + logerror("R%x, Q ", *op->areg); break; case 1: - logerror("R%x,R%x ",op->areg,op->breg); + logerror("R%x,R%x ", *op->areg, *op->breg); break; case 2: logerror("00, Q "); break; case 3: - logerror("00,R%x ",op->breg); + logerror("00,R%x ", *op->breg); break; case 4: - logerror("00,R%x ",op->areg); + logerror("00,R%x ", *op->areg); break; case 5: - logerror(" D,R%x ",op->areg); + logerror(" D,R%x ", *op->areg); break; case 6: logerror(" D, Q "); @@ -921,18 +907,19 @@ static void disassemble_instruction(irobot_state::irmb_ops const *op) break; } - for (lp=0;lp<8;lp++) - if (op->flags & (0x80>>lp)) + for (lp = 0; lp < 8; lp++) + if (op->flags & (0x80 >> lp)) logerror("1"); else logerror("0"); - logerror(" %02X ",op->diradd); - logerror("%X\n",op->ramsel); - if (op->jtype) + logerror(" %02X ", op->diradd); + logerror("%X\n", op->ramsel); + + if (int jt = ((op->func >> 6 & 0xf) >= 4) ? (op->func >> 10) : 0; jt != 0) { logerror(" "); - switch (op->jtype) + switch (jt) { case 1: logerror("BO "); @@ -956,8 +943,8 @@ static void disassemble_instruction(irobot_state::irmb_ops const *op) logerror("Return\n\n"); break; } - if (op->jtype != 7) logerror(" %04X \n",op->nxtadd); - if (op->jtype == 5) logerror("\n"); + if (jt != 7) logerror(" %04X \n", op->nxtadd); + if (jt == 5) logerror("\n"); } } #endif // DISASSEMBLE_MB_ROM diff --git a/src/mame/atari/irobot_v.cpp b/src/mame/atari/irobot_v.cpp index a8f49d57898..9b30a745c98 100644 --- a/src/mame/atari/irobot_v.cpp +++ b/src/mame/atari/irobot_v.cpp @@ -164,29 +164,29 @@ void irobot_state::video_start() void irobot_state::draw_line(uint8_t *polybitmap, int x1, int y1, int x2, int y2, int col) { - int dx,dy,sx,sy,cx,cy; + int dx, dy, sx, sy, cx, cy; - dx = abs(x1-x2); - dy = abs(y1-y2); + dx = abs(x1 - x2); + dy = abs(y1 - y2); sx = (x1 <= x2) ? 1: -1; sy = (y1 <= y2) ? 1: -1; - cx = dx/2; - cy = dy/2; + cx = dx / 2; + cy = dy / 2; - if (dx>=dy) + if (dx >= dy) { for (;;) { if (x1 >= m_ir_xmin && x1 < m_ir_xmax && y1 >= m_ir_ymin && y1 < m_ir_ymax) - draw_pixel (x1, y1, col); - if (x1 == x2) break; - x1 += sx; - cx -= dy; - if (cx < 0) - { - y1 += sy; - cx += dx; - } + draw_pixel (x1, y1, col); + if (x1 == x2) break; + x1 += sx; + cx -= dy; + if (cx < 0) + { + y1 += sy; + cx += dx; + } } } else @@ -200,8 +200,8 @@ void irobot_state::draw_line(uint8_t *polybitmap, int x1, int y1, int x2, int y2 cy -= dx; if (cy < 0) { - x1 += sx; - cy += dy; + x1 += sx; + cy += dy; } } } @@ -214,21 +214,21 @@ void irobot_state::irobot_run_video() { uint8_t *polybitmap; uint16_t *combase16 = (uint16_t *)m_combase; - int sx,sy,ex,ey,sx2,ey2; + int sx, sy, ex, ey, sx2, ey2; int color; uint32_t d1; - int lpnt,spnt,spnt2; + int lpnt, spnt, spnt2; int shp; - int32_t word1,word2; + int32_t word1, word2; - logerror("Starting Polygon Generator, Clear=%d\n",m_vg_clear); + logerror("Starting Polygon Generator, Clear=%d\n", m_vg_clear); if (m_bufsel) polybitmap = m_polybitmap2.get(); else polybitmap = m_polybitmap1.get(); - lpnt=0; + lpnt = 0; while (lpnt < 0x7ff) { d1 = combase16[lpnt++]; @@ -243,15 +243,15 @@ void irobot_state::irobot_run_video() { sx = combase16[spnt]; if (sx == 0xffff) break; - sy = combase16[spnt+1]; + sy = combase16[spnt + 1]; color = sy & 0x3f; sx = ROUND_TO_PIXEL(sx); sy = ROUND_TO_PIXEL(sy); if (sx >= m_ir_xmin && sx < m_ir_xmax && sy >= m_ir_ymin && sy < m_ir_ymax) - draw_pixel(sx,sy,color); - spnt+=2; - }//while object - }//if point + draw_pixel(sx, sy, color); + spnt += 2; + } // while object + } // if point /* line */ if (shp == 0xc) @@ -261,45 +261,43 @@ void irobot_state::irobot_run_video() ey = combase16[spnt]; if (ey == 0xffff) break; ey = ROUND_TO_PIXEL(ey); - sy = combase16[spnt+1]; + sy = combase16[spnt + 1]; color = sy & 0x3f; sy = ROUND_TO_PIXEL(sy); - sx = combase16[spnt+3]; - word1 = (int16_t)combase16[spnt+2]; + sx = combase16[spnt + 3]; + word1 = (int16_t)combase16[spnt + 2]; ex = sx + word1 * (ey - sy + 1); - draw_line(polybitmap, ROUND_TO_PIXEL(sx),sy,ROUND_TO_PIXEL(ex),ey,color); - spnt+=4; - }//while object - }//if line + draw_line(polybitmap, ROUND_TO_PIXEL(sx), sy, ROUND_TO_PIXEL(ex), ey, color); + spnt += 4; + } // while object + } // if line /* polygon */ if (shp == 0x4) { spnt2 = combase16[spnt] & 0x7ff; - sx = combase16[spnt+1]; - sx2 = combase16[spnt+2]; - sy = combase16[spnt+3]; + sx = combase16[spnt + 1]; + sx2 = combase16[spnt + 2]; + sy = combase16[spnt + 3]; color = sy & 0x3f; sy = ROUND_TO_PIXEL(sy); - spnt+=4; + spnt += 4; word1 = (int16_t)combase16[spnt]; - ey = combase16[spnt+1]; + ey = combase16[spnt + 1]; if (word1 != -1 || ey != 0xffff) { ey = ROUND_TO_PIXEL(ey); - spnt+=2; - - // sx += word1; + spnt += 2; + //sx += word1; word2 = (int16_t)combase16[spnt2]; - ey2 = ROUND_TO_PIXEL(combase16[spnt2+1]); - spnt2+=2; - - // sx2 += word2; + ey2 = ROUND_TO_PIXEL(combase16[spnt2 + 1]); + spnt2 += 2; + //sx2 += word2; - while(1) + while (1) { if (sy >= m_ir_ymin && sy < m_ir_ymax) { @@ -318,11 +316,11 @@ void irobot_state::irobot_run_video() if (sy > ey) { word1 = (int16_t)combase16[spnt]; - ey = combase16[spnt+1]; + ey = combase16[spnt + 1]; if (word1 == -1 && ey == 0xffff) break; ey = ROUND_TO_PIXEL(ey); - spnt+=2; + spnt += 2; } else sx += word1; @@ -330,41 +328,36 @@ void irobot_state::irobot_run_video() if (sy > ey2) { word2 = (int16_t)combase16[spnt2]; - ey2 = ROUND_TO_PIXEL(combase16[spnt2+1]); - spnt2+=2; + ey2 = ROUND_TO_PIXEL(combase16[spnt2 + 1]); + spnt2 += 2; } else sx2 += word2; - } //while polygon - }//if at least 2 sides - } //if polygon - } //while object + } // while polygon + } // if at least 2 sides + } // if polygon + } // while object } uint32_t irobot_state::screen_update_irobot(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) { - uint8_t *videoram = m_videoram; uint8_t *bitmap_base = m_bufsel ? m_polybitmap1.get() : m_polybitmap2.get(); - int x, y, offs; /* copy the polygon bitmap */ - for (y = cliprect.top(); y <= cliprect.bottom(); y++) + for (int y = cliprect.top(); y <= cliprect.bottom(); y++) draw_scanline8(bitmap, 0, y, BITMAP_WIDTH, &bitmap_base[y * BITMAP_WIDTH], nullptr); /* redraw the non-zero characters in the alpha layer */ - for (y = offs = 0; y < 32; y++) - for (x = 0; x < 32; x++, offs++) + for (int y = 0, offs = 0; y < 32; y++) + for (int x = 0; x < 32; x++, offs++) { - int code = videoram[offs] & 0x3f; - int color = ((videoram[offs] & 0xc0) >> 6) | (m_alphamap >> 3); + int code = m_videoram[offs] & 0x3f; + int color = ((m_videoram[offs] & 0xc0) >> 6) | (m_alphamap >> 3); - m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, - code, color, - 0,0, - 8*x,8*y,0); + m_gfxdecode->gfx(0)->transpen(bitmap,cliprect, code, color, 0, 0, 8 * x, 8 * y, 0); } return 0; diff --git a/src/mame/konami/twin16.cpp b/src/mame/konami/twin16.cpp index 7d65f2fb352..aa9b8945781 100644 --- a/src/mame/konami/twin16.cpp +++ b/src/mame/konami/twin16.cpp @@ -58,8 +58,6 @@ Known Issues: #include "speaker.h" - - int twin16_state::spriteram_process_enable() { return (m_CPUA_register & 0x40) == 0; @@ -133,6 +131,7 @@ void fround_state::fround_CPU_register_w(offs_t offset, uint16_t data, uint16_t */ uint16_t old = m_CPUA_register; COMBINE_DATA(&m_CPUA_register); + if (m_CPUA_register != old) { if ((old & 0x08) == 0 && (m_CPUA_register & 0x08)) @@ -171,7 +170,7 @@ void twin16_state::sound_map(address_map &map) map(0xd000, 0xd000).w(m_upd7759, FUNC(upd7759_device::port_w)); map(0xe000, 0xe000).w(FUNC(twin16_state::upd_start_w)); map(0xf000, 0xf000).r(FUNC(twin16_state::upd_busy_r)); // miaj writes 0 to it - } +} void twin16_state::main_map(address_map &map) { -- cgit v1.2.3