summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/irobot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/irobot.cpp')
-rw-r--r--src/mame/machine/irobot.cpp965
1 files changed, 0 insertions, 965 deletions
diff --git a/src/mame/machine/irobot.cpp b/src/mame/machine/irobot.cpp
deleted file mode 100644
index 755f29e8312..00000000000
--- a/src/mame/machine/irobot.cpp
+++ /dev/null
@@ -1,965 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Dan Boris
-/***************************************************************************
-
- Atari I, Robot hardware
-
-***************************************************************************/
-
-#include "emu.h"
-#include "cpu/m6809/m6809.h"
-#include "includes/irobot.h"
-
-/* 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 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
- * approx. 5000 instructions per scanline [look at the number of instructions
- * and the number of scanlines to the next mathbox start]. This seems a bit
- * 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())
-
-
-READ8_MEMBER(irobot_state::irobot_sharedmem_r)
-{
- if (m_outx == 3)
- return m_mbRAM[BYTE_XOR_BE(offset)];
-
- if (m_outx == 2)
- return m_combase[BYTE_XOR_BE(offset & 0xFFF)];
-
- if (m_outx == 0)
- return m_mbROM[((m_mpage & 1) << 13) + BYTE_XOR_BE(offset)];
-
- if (m_outx == 1)
- return m_mbROM[0x4000 + ((m_mpage & 3) << 13) + BYTE_XOR_BE(offset)];
-
- return 0xFF;
-}
-
-/* Comment out the mbRAM =, comRAM2 = or comRAM1 = and it will start working */
-WRITE8_MEMBER(irobot_state::irobot_sharedmem_w)
-{
- if (m_outx == 3)
- m_mbRAM[BYTE_XOR_BE(offset)] = data;
-
- if (m_outx == 2)
- m_combase[BYTE_XOR_BE(offset & 0xFFF)] = data;
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(irobot_state::irobot_irvg_done_callback)
-{
- logerror("vg done. ");
- m_irvg_running = 0;
-}
-
-WRITE8_MEMBER(irobot_state::irobot_statwr_w)
-{
- logerror("write %2x ", data);
- IR_CPU_STATE();
-
- m_combase = m_comRAM[BIT(data, 7)];
- m_combase_mb = m_comRAM[BIT(data, 7) ^ 1];
- m_bufsel = BIT(data, 1);
- if (BIT(data, 0) && (m_vg_clear == 0))
- irobot_poly_clear();
-
- m_vg_clear = BIT(data, 0);
-
- if (BIT(data, 2) && !BIT(m_statwr, 2))
- {
- irobot_run_video();
-#if IR_TIMING
- if (m_irvg_running == 0)
- logerror("vg start ");
- else
- logerror("vg start [busy!] ");
- IR_CPU_STATE();
- m_irvg_timer->adjust(attotime::from_msec(10));
-#endif
- m_irvg_running=1;
- }
- if (BIT(data, 4) && !BIT(m_statwr, 4))
- irmb_run();
-
- m_novram->recall(!BIT(data, 6));
-
- m_statwr = data;
-}
-
-WRITE8_MEMBER(irobot_state::irobot_out0_w)
-{
- uint8_t *RAM = memregion("maincpu")->base();
-
- m_out0 = data;
- switch (data & 0x60)
- {
- case 0:
- membank("bank2")->set_base(&RAM[0x1C000]);
- break;
- case 0x20:
- membank("bank2")->set_base(&RAM[0x1C800]);
- break;
- case 0x40:
- membank("bank2")->set_base(&RAM[0x1D000]);
- break;
- }
- m_outx = (data & 0x18) >> 3;
- m_mpage = (data & 0x06) >> 1;
- m_alphamap = (data & 0x80);
-}
-
-WRITE8_MEMBER(irobot_state::irobot_rom_banksel_w)
-{
- uint8_t *RAM = memregion("maincpu")->base();
-
- switch ((data & 0x0E) >> 1)
- {
- case 0:
- membank("bank1")->set_base(&RAM[0x10000]);
- break;
- case 1:
- membank("bank1")->set_base(&RAM[0x12000]);
- break;
- case 2:
- membank("bank1")->set_base(&RAM[0x14000]);
- break;
- case 3:
- membank("bank1")->set_base(&RAM[0x16000]);
- break;
- case 4:
- membank("bank1")->set_base(&RAM[0x18000]);
- break;
- case 5:
- membank("bank1")->set_base(&RAM[0x1A000]);
- break;
- }
- m_leds[0] = BIT(data, 4);
- m_leds[1] = BIT(data, 5);
-}
-
-TIMER_CALLBACK_MEMBER(irobot_state::scanline_callback)
-{
- int scanline = param;
-
- 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);
-
- /* set a callback for the next 32-scanline increment */
- scanline += 32;
- if (scanline >= 256) scanline = 0;
- m_scanline_timer->adjust(m_screen->time_until_pos(scanline), scanline);
-}
-
-void irobot_state::machine_start()
-{
- m_leds.resolve();
- m_vg_clear = 0;
- m_statwr = 0;
-
- /* set an initial timer to go off on scanline 0 */
- m_scanline_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(irobot_state::scanline_callback), this));
- m_scanline_timer->adjust(m_screen->time_until_pos(0));
-}
-
-void irobot_state::machine_reset()
-{
- uint8_t *MB = memregion("mathbox")->base();
-
- /* initialize the memory regions */
- m_mbROM = MB + 0x00000;
- m_mbRAM = MB + 0x0c000;
- m_comRAM[0] = MB + 0x0e000;
- m_comRAM[1] = MB + 0x0f000;
-
- m_irvg_vblank=0;
- m_irvg_running = 0;
- m_irmb_running = 0;
-
- address_space &space = machine().dummy_space();
- irobot_rom_banksel_w(space, 0, 0);
- irobot_out0_w(space, 0, 0);
- irobot_statwr_w(space, 0, 0);
- m_outx = 0;
-}
-
-/* we allow irmb_running and irvg_running to appear running before clearing
- them to simulate the mathbox and vector generator running in real time */
-READ8_MEMBER(irobot_state::irobot_status_r)
-{
- int d=0;
-
- logerror("status read. ");
- IR_CPU_STATE();
-
- if (!m_irmb_running) d |= 0x20;
- if (m_irvg_running) d |= 0x40;
-
- // d = (m_irmb_running * 0x20) | (m_irvg_running * 0x40);
- if (m_irvg_vblank) d = d | 0x80;
-#if IR_TIMING
- /* flags are cleared by callbacks */
-#else
- m_irmb_running=0;
- m_irvg_running=0;
-#endif
- return d;
-}
-
-
-/***********************************************************************
-
- I-Robot Mathbox
-
- Based on 4 2901 chips slice processors connected to form a 16-bit ALU
-
- Microcode roms:
- 6N: bits 0..3: Address of ALU A register
- 5P: bits 0..3: Address of ALU B register
- 6M: bits 0..3: ALU Function bits 5..8
- 7N: bits 0..3: ALU Function bits 1..4
- 8N: bits 0,1: Memory write timing
- bit 2: Hardware multiply mode
- bit 3: ALU Function bit 0
- 6P: bits 0,1: Direct addressing bits 0,1
- bits 2,3: Jump address bits 0,1
- 8M: bits 0..3: Jump address bits 6..9
- 9N: bits 0..3: Jump address bits 2..5
- 8P: bits 0..3: Memory address bits 2..5
- 9M: bit 0: Shift control
- bits 1..3: Jump type
- 0 = No Jump
- 1 = On carry
- 2 = On zero
- 3 = On positive
- 4 = On negative
- 5 = Unconditional
- 6 = Jump to Subroutine
- 7 = Return from Subroutine
- 7M: Bit 0: Mathbox memory enable
- Bit 1: Latch data to address bus
- Bit 2: Carry in select
- Bit 3: Carry in value
- (if 2,3 = 11 then mathbox is done)
- 9P: Bit 0: Hardware divide enable
- Bits 1,2: Memory select
- Bit 3: Memory R/W
- 7P: Bits 0,1: Direct addressing bits 6,7
- Bits 2,3: Unused
-
-***********************************************************************/
-
-#define FL_MULT 0x01
-#define FL_shift 0x02
-#define FL_MBMEMDEC 0x04
-#define FL_ADDEN 0x08
-#define FL_DPSEL 0x10
-#define FL_carry 0x20
-#define FL_DIV 0x40
-#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;
-
- if (!(curop->flags & FL_MBMEMDEC) && (curop->flags & FL_MBRW))
- {
- uint32_t ad = curop->diradd | (m_irmb_latch & curop->latchmask);
-
- 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 */
- else
- d = ((uint16_t *)m_mbROM)[ad & 0x1fff]; /* MB ROM read, CEMATH = 0 */
- }
- return d;
-}
-
-
-void irobot_state::irmb_dout(const irmb_ops *curop, uint32_t d)
-{
- /* Write to video com ram */
- if (curop->ramsel == 3)
- ((uint16_t *)m_combase_mb)[m_irmb_latch & 0x7ff] = d;
-
- /* Write to mathox ram */
- if (!(curop->flags & FL_MBMEMDEC))
- {
- uint32_t ad = curop->diradd | (m_irmb_latch & curop->latchmask);
-
- if (curop->diren || (m_irmb_latch & 0x6000) == 0)
- ((uint16_t *)m_mbRAM)[ad & 0xfff] = d; /* MB RAM write */
- }
-}
-
-
-/* Convert microcode roms to a more usable form */
-void irobot_state::load_oproms()
-{
- uint8_t *MB = memregion("proms")->base() + 0x20;
- int i;
-
- /* allocate RAM */
- m_mbops = auto_alloc_array(machine(), irmb_ops, 1024);
-
- for (i = 0; i < 1024; i++)
- {
- 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);
- 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;
- 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;
- 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;
- diradd |= (MB[0x3000 + i] & 0x03) << 6;
-
- if (m_mbops[i].flags & FL_shift) func |= 0x200;
-
- m_mbops[i].func = func;
- m_mbops[i].nxtop = &m_mbops[nxtadd];
-
- /* determine the number of 12MHz cycles for this operation */
- if (time == 3)
- m_mbops[i].cycles = 2;
- else
- m_mbops[i].cycles = 3 + time;
-
- /* precompute the hardcoded address bits and the mask to be used on the latch value */
- if (ramsel == 0)
- {
- dirmask = 0x00FC;
- latchmask = 0x3000;
- }
- else
- {
- dirmask = 0x0000;
- latchmask = 0x3FFC;
- }
- if (ramsel & 2)
- latchmask |= 0x0003;
- else
- dirmask |= 0x0003;
-
- m_mbops[i].ramsel = ramsel;
- m_mbops[i].diradd = diradd & dirmask;
- m_mbops[i].latchmask = latchmask;
- m_mbops[i].diren = (ramsel == 0);
-
-#if DISASSEMBLE_MB_ROM
- disassemble_instruction(&m_mbops[i]);
-#endif
- }
-}
-
-
-/* Init mathbox (only called once) */
-void irobot_state::init_irobot()
-{
- for (int i = 0; i < 16; i++)
- {
- m_irmb_stack[i] = &m_mbops[0];
- m_irmb_regs[i] = 0;
- }
- m_irmb_latch = 0;
- load_oproms();
-}
-
-TIMER_DEVICE_CALLBACK_MEMBER(irobot_state::irobot_irmb_done_callback)
-{
- logerror("mb done. ");
- m_irmb_running = 0;
- m_maincpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE);
-}
-
-
-#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;\
- }
-
-#define ADD(r,s) \
- 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;\
- 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;\
- vflag = (((r & 0x7fff) + ((s ^ 0xffff) & 0x7fff) + CI) >> 15) ^ cflag
-
-#define OR(r,s) \
- result = r | s;\
- vflag = cflag = 0
-
-#define AND(r,s) \
- result = r & s;\
- vflag = cflag = 0
-
-#define IAND(r,s) \
- result = (r ^ 0xFFFF) & s;\
- vflag = cflag = 0
-
-#define XOR(r,s) \
- result = r ^ s;\
- vflag = cflag = 0
-
-#define IXOR(r,s) \
- result = (r ^ s) ^ 0xFFFF;\
- vflag = cflag = 0
-
-
-#define DEST0 \
- Q = Y = zresult
-
-#define DEST1 \
- Y = zresult
-
-#define DEST2 \
- Y = *curop->areg;\
- *curop->breg = zresult
-
-#define DEST3 \
- *curop->breg = zresult;\
- Y = zresult
-
-#define DEST4_NOSHIFT \
- *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);\
- Y = zresult
-
-#define DEST5_NOSHIFT \
- *curop->breg = (zresult >> 1) | ((curop->flags & 0x20) << 10);\
- Y = zresult
-
-#define DEST5_SHIFT \
- *curop->breg = (zresult >> 1) | ((nflag ^ vflag) << 15);\
- Y = zresult
-
-#define DEST6_NOSHIFT \
- *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;\
- Y = zresult
-
-#define DEST7_NOSHIFT \
- *curop->breg = zresult << 1;\
- Y = zresult
-
-#define DEST7_SHIFT \
- *curop->breg = (zresult << 1) | ((Q & 0x8000) >> 15);\
- Y = zresult
-
-
-#define JUMP0 curop++;
-#define JUMP1 if (cflag) curop = curop->nxtop; else curop++;
-#define JUMP2 if (!zresult) curop = curop->nxtop; else curop++;
-#define JUMP3 if (!nflag) curop = curop->nxtop; else curop++;
-#define JUMP4 if (nflag) curop = curop->nxtop; else curop++;
-#define JUMP5 curop = curop->nxtop;
-#define JUMP6 m_irmb_stack[SP] = curop + 1; SP = (SP + 1) & 15; curop = curop->nxtop;
-#define JUMP7 SP = (SP - 1) & 15; curop = m_irmb_stack[SP];
-
-
-/* Run mathbox */
-void irobot_state::irmb_run()
-{
- 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;
- uint32_t icount = 0;
-
- g_profiler.start(PROFILER_USER1);
-
- while ((prevop->flags & (FL_DPSEL | FL_carry)) != (FL_DPSEL | FL_carry))
- {
- uint32_t result;
- uint32_t fu;
- uint32_t tmp;
-
- icount += curop->cycles;
-
- /* Get function code */
- fu = curop->func;
-
- /* 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)
- {
- 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;
- }
- }
- g_profiler.stop();
-
- logerror("%d instructions for Mathbox \n", icount);
-
-
-#if IR_TIMING
- if (m_irmb_running == 0)
- {
- m_irmb_timer->adjust(attotime::from_hz(12000000) * icount);
- logerror("mb start ");
- IR_CPU_STATE();
- }
- else
- {
- logerror("mb start [busy!] ");
- IR_CPU_STATE();
- m_irmb_timer->adjust(attotime::from_hz(200) * icount);
- }
-#else
- m_maincpu->set_input_line(M6809_FIRQ_LINE, ASSERT_LINE);
-#endif
- m_irmb_running=1;
-}
-
-
-
-
-#if DISASSEMBLE_MB_ROM
-static void disassemble_instruction(irobot_state::irmb_ops const *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;
- else if((op->flags & FL_DIV) != 0)
- lp&=6;
- else
- logerror("*");
-
- switch (lp)
- {
- case 0:
- logerror("ADD ");
- break;
- case 1:
- logerror("SUBR ");
- break;
- case 2:
- logerror("SUB ");
- break;
- case 3:
- logerror("OR ");
- break;
- case 4:
- logerror("AND ");
- break;
- case 5:
- logerror("AND ");
- break;
- case 6:
- logerror("XOR ");
- break;
- case 7:
- logerror("XNOR ");
- break;
- }
-
- switch ((op->func & 0x1c0)>>6)
- {
- case 0:
- logerror(" - : Q :F,");
- break;
- case 1:
- logerror(" - : - :F,");
- break;
- case 2:
- logerror(" R%x: - :A,",op->breg);
- break;
- case 3:
- logerror(" R%x: - :F,",op->breg);
- break;
- case 4:
- logerror(">>R%x:>>Q:F,",op->breg);
- break;
- case 5:
- logerror(">>R%x: - :F,",op->breg);
- break;
- case 6:
- logerror("<<R%x:<<Q:F,",op->breg);
- break;
- case 7:
- logerror("<<R%x: - :F,",op->breg);
- break;
- }
-
- 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);
- break;
- case 1:
- logerror("R%x,R%x ",op->areg,op->breg);
- break;
- case 2:
- logerror("00, Q ");
- break;
- case 3:
- logerror("00,R%x ",op->breg);
- break;
- case 4:
- logerror("00,R%x ",op->areg);
- break;
- case 5:
- logerror(" D,R%x ",op->areg);
- break;
- case 6:
- logerror(" D, Q ");
- break;
- case 7:
- logerror(" D,00 ");
- break;
- }
-
- 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(" ");
- switch (op->jtype)
- {
- case 1:
- logerror("BO ");
- break;
- case 2:
- logerror("BZ ");
- break;
- case 3:
- logerror("BH ");
- break;
- case 4:
- logerror("BL ");
- break;
- case 5:
- logerror("B ");
- break;
- case 6:
- logerror("Cl ");
- break;
- case 7:
- logerror("Return\n\n");
- break;
- }
- if (op->jtype != 7) logerror(" %04X \n",op->nxtadd);
- if (op->jtype == 5) logerror("\n");
- }
-}
-#endif // DISASSEMBLE_MB_ROM