summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/machine/mathbox.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/machine/mathbox.c')
-rw-r--r--src/mame/machine/mathbox.c314
1 files changed, 156 insertions, 158 deletions
diff --git a/src/mame/machine/mathbox.c b/src/mame/machine/mathbox.c
index 5dfb4c8faba..6ab953a8132 100644
--- a/src/mame/machine/mathbox.c
+++ b/src/mame/machine/mathbox.c
@@ -62,224 +62,224 @@ INLINE mathbox_state *get_safe_token(device_t *device)
WRITE8_DEVICE_HANDLER( mathbox_go_w )
{
- mathbox_state *mb = get_safe_token(device);
+ mathbox_state *mb = get_safe_token(device);
- INT32 mb_temp; /* temp 32-bit multiply results */
- INT16 mb_q; /* temp used in division */
- int msb;
+ INT32 mb_temp; /* temp 32-bit multiply results */
+ INT16 mb_q; /* temp used in division */
+ int msb;
- LOG(("math box command %02x data %02x ", offset, data));
+ LOG(("math box command %02x data %02x ", offset, data));
- switch (offset)
- {
- case 0x00: mb->result = REG0 = (REG0 & 0xff00) | data; break;
- case 0x01: mb->result = REG0 = (REG0 & 0x00ff) | (data << 8); break;
- case 0x02: mb->result = REG1 = (REG1 & 0xff00) | data; break;
- case 0x03: mb->result = REG1 = (REG1 & 0x00ff) | (data << 8); break;
- case 0x04: mb->result = REG2 = (REG2 & 0xff00) | data; break;
- case 0x05: mb->result = REG2 = (REG2 & 0x00ff) | (data << 8); break;
- case 0x06: mb->result = REG3 = (REG3 & 0xff00) | data; break;
- case 0x07: mb->result = REG3 = (REG3 & 0x00ff) | (data << 8); break;
- case 0x08: mb->result = REG4 = (REG4 & 0xff00) | data; break;
- case 0x09: mb->result = REG4 = (REG4 & 0x00ff) | (data << 8); break;
+ switch (offset)
+ {
+ case 0x00: mb->result = REG0 = (REG0 & 0xff00) | data; break;
+ case 0x01: mb->result = REG0 = (REG0 & 0x00ff) | (data << 8); break;
+ case 0x02: mb->result = REG1 = (REG1 & 0xff00) | data; break;
+ case 0x03: mb->result = REG1 = (REG1 & 0x00ff) | (data << 8); break;
+ case 0x04: mb->result = REG2 = (REG2 & 0xff00) | data; break;
+ case 0x05: mb->result = REG2 = (REG2 & 0x00ff) | (data << 8); break;
+ case 0x06: mb->result = REG3 = (REG3 & 0xff00) | data; break;
+ case 0x07: mb->result = REG3 = (REG3 & 0x00ff) | (data << 8); break;
+ case 0x08: mb->result = REG4 = (REG4 & 0xff00) | data; break;
+ case 0x09: mb->result = REG4 = (REG4 & 0x00ff) | (data << 8); break;
- case 0x0a: mb->result = REG5 = (REG5 & 0xff00) | data; break;
- /* note: no function loads low part of REG5 without performing a computation */
+ case 0x0a: mb->result = REG5 = (REG5 & 0xff00) | data; break;
+ /* note: no function loads low part of REG5 without performing a computation */
- case 0x0c: mb->result = REG6 = data; break;
- /* note: no function loads high part of REG6 */
+ case 0x0c: mb->result = REG6 = data; break;
+ /* note: no function loads high part of REG6 */
- case 0x15: mb->result = REG7 = (REG7 & 0xff00) | data; break;
- case 0x16: mb->result = REG7 = (REG7 & 0x00ff) | (data << 8); break;
+ case 0x15: mb->result = REG7 = (REG7 & 0xff00) | data; break;
+ case 0x16: mb->result = REG7 = (REG7 & 0x00ff) | (data << 8); break;
- case 0x1a: mb->result = REG8 = (REG8 & 0xff00) | data; break;
- case 0x1b: mb->result = REG8 = (REG8 & 0x00ff) | (data << 8); break;
+ case 0x1a: mb->result = REG8 = (REG8 & 0xff00) | data; break;
+ case 0x1b: mb->result = REG8 = (REG8 & 0x00ff) | (data << 8); break;
- case 0x0d: mb->result = REGa = (REGa & 0xff00) | data; break;
- case 0x0e: mb->result = REGa = (REGa & 0x00ff) | (data << 8); break;
- case 0x0f: mb->result = REGb = (REGb & 0xff00) | data; break;
- case 0x10: mb->result = REGb = (REGb & 0x00ff) | (data << 8); break;
+ case 0x0d: mb->result = REGa = (REGa & 0xff00) | data; break;
+ case 0x0e: mb->result = REGa = (REGa & 0x00ff) | (data << 8); break;
+ case 0x0f: mb->result = REGb = (REGb & 0xff00) | data; break;
+ case 0x10: mb->result = REGb = (REGb & 0x00ff) | (data << 8); break;
- case 0x17: mb->result = REG7; break;
- case 0x19: mb->result = REG8; break;
- case 0x18: mb->result = REG9; break;
+ case 0x17: mb->result = REG7; break;
+ case 0x19: mb->result = REG8; break;
+ case 0x18: mb->result = REG9; break;
- case 0x0b:
+ case 0x0b:
- REG5 = (REG5 & 0x00ff) | (data << 8);
+ REG5 = (REG5 & 0x00ff) | (data << 8);
- REGf = (INT16)0xffff;
- REG4 -= REG2;
- REG5 -= REG3;
+ REGf = (INT16)0xffff;
+ REG4 -= REG2;
+ REG5 -= REG3;
- step_048:
+ step_048:
- mb_temp = ((INT32) REG0) * ((INT32) REG4);
- REGc = mb_temp >> 16;
- REGe = mb_temp & 0xffff;
+ mb_temp = ((INT32) REG0) * ((INT32) REG4);
+ REGc = mb_temp >> 16;
+ REGe = mb_temp & 0xffff;
- mb_temp = ((INT32) -REG1) * ((INT32) REG5);
- REG7 = mb_temp >> 16;
- mb_q = mb_temp & 0xffff;
+ mb_temp = ((INT32) -REG1) * ((INT32) REG5);
+ REG7 = mb_temp >> 16;
+ mb_q = mb_temp & 0xffff;
- REG7 += REGc;
+ REG7 += REGc;
- /* rounding */
- REGe = (REGe >> 1) & 0x7fff;
- REGc = (mb_q >> 1) & 0x7fff;
- mb_q = REGc + REGe;
- if (mb_q < 0)
+ /* rounding */
+ REGe = (REGe >> 1) & 0x7fff;
+ REGc = (mb_q >> 1) & 0x7fff;
+ mb_q = REGc + REGe;
+ if (mb_q < 0)
REG7++;
- mb->result = REG7;
+ mb->result = REG7;
- if (REGf < 0)
+ if (REGf < 0)
break;
- REG7 += REG2;
+ REG7 += REG2;
- /* fall into command 12 */
+ /* fall into command 12 */
- case 0x12:
+ case 0x12:
- mb_temp = ((INT32) REG1) * ((INT32) REG4);
- REGc = mb_temp >> 16;
- REG9 = mb_temp & 0xffff;
+ mb_temp = ((INT32) REG1) * ((INT32) REG4);
+ REGc = mb_temp >> 16;
+ REG9 = mb_temp & 0xffff;
- mb_temp = ((INT32) REG0) * ((INT32) REG5);
- REG8 = mb_temp >> 16;
- mb_q = mb_temp & 0xffff;
+ mb_temp = ((INT32) REG0) * ((INT32) REG5);
+ REG8 = mb_temp >> 16;
+ mb_q = mb_temp & 0xffff;
- REG8 += REGc;
+ REG8 += REGc;
- /* rounding */
- REG9 = (REG9 >> 1) & 0x7fff;
- REGc = (mb_q >> 1) & 0x7fff;
- REG9 += REGc;
- if (REG9 < 0)
+ /* rounding */
+ REG9 = (REG9 >> 1) & 0x7fff;
+ REGc = (mb_q >> 1) & 0x7fff;
+ REG9 += REGc;
+ if (REG9 < 0)
REG8++;
- REG9 <<= 1; /* why? only to get the desired load address? */
+ REG9 <<= 1; /* why? only to get the desired load address? */
- mb->result = REG8;
+ mb->result = REG8;
- if (REGf < 0)
+ if (REGf < 0)
break;
- REG8 += REG3;
+ REG8 += REG3;
- REG9 &= 0xff00;
+ REG9 &= 0xff00;
- /* fall into command 13 */
+ /* fall into command 13 */
- case 0x13:
- LOG(("\nR7: %04x R8: %04x R9: %04x\n", REG7, REG8, REG9));
+ case 0x13:
+ LOG(("\nR7: %04x R8: %04x R9: %04x\n", REG7, REG8, REG9));
- REGc = REG9;
- mb_q = REG8;
- goto step_0bf;
+ REGc = REG9;
+ mb_q = REG8;
+ goto step_0bf;
- case 0x14:
- REGc = REGa;
- mb_q = REGb;
+ case 0x14:
+ REGc = REGa;
+ mb_q = REGb;
- step_0bf:
- REGe = REG7 ^ mb_q; /* save sign of result */
- REGd = mb_q;
- if (mb_q >= 0)
+ step_0bf:
+ REGe = REG7 ^ mb_q; /* save sign of result */
+ REGd = mb_q;
+ if (mb_q >= 0)
mb_q = REGc;
- else
+ else
{
- REGd = - mb_q - 1;
- mb_q = - REGc - 1;
- if ((mb_q < 0) && ((mb_q + 1) < 0))
- REGd++;
- mb_q++;
+ REGd = - mb_q - 1;
+ mb_q = - REGc - 1;
+ if ((mb_q < 0) && ((mb_q + 1) < 0))
+ REGd++;
+ mb_q++;
}
- /* step 0c9: */
- /* REGc = abs (REG7) */
- if (REG7 >= 0)
+ /* step 0c9: */
+ /* REGc = abs (REG7) */
+ if (REG7 >= 0)
REGc = REG7;
- else
- REGc = -REG7;
+ else
+ REGc = -REG7;
- REGf = REG6; /* step counter */
+ REGf = REG6; /* step counter */
- do
+ do
{
- REGd -= REGc;
- msb = ((mb_q & 0x8000) != 0);
- mb_q <<= 1;
- if (REGd >= 0)
- mb_q++;
- else
- REGd += REGc;
- REGd <<= 1;
- REGd += msb;
+ REGd -= REGc;
+ msb = ((mb_q & 0x8000) != 0);
+ mb_q <<= 1;
+ if (REGd >= 0)
+ mb_q++;
+ else
+ REGd += REGc;
+ REGd <<= 1;
+ REGd += msb;
}
- while (--REGf >= 0);
+ while (--REGf >= 0);
- if (REGe >= 0)
+ if (REGe >= 0)
mb->result = mb_q;
- else
+ else
mb->result = - mb_q;
- break;
-
- case 0x11:
- REG5 = (REG5 & 0x00ff) | (data << 8);
- REGf = 0x0000; /* do everything in one step */
- goto step_048;
- //break; // never reached
-
- case 0x1c:
- /* window test? */
- REG5 = (REG5 & 0x00ff) | (data << 8);
- do
+ break;
+
+ case 0x11:
+ REG5 = (REG5 & 0x00ff) | (data << 8);
+ REGf = 0x0000; /* do everything in one step */
+ goto step_048;
+ //break; // never reached
+
+ case 0x1c:
+ /* window test? */
+ REG5 = (REG5 & 0x00ff) | (data << 8);
+ do
{
- REGe = (REG4 + REG7) >> 1;
- REGf = (REG5 + REG8) >> 1;
- if ((REGb < REGe) && (REGf < REGe) && ((REGe + REGf) >= 0))
- { REG7 = REGe; REG8 = REGf; }
- else
- { REG4 = REGe; REG5 = REGf; }
+ REGe = (REG4 + REG7) >> 1;
+ REGf = (REG5 + REG8) >> 1;
+ if ((REGb < REGe) && (REGf < REGe) && ((REGe + REGf) >= 0))
+ { REG7 = REGe; REG8 = REGf; }
+ else
+ { REG4 = REGe; REG5 = REGf; }
}
- while (--REG6 >= 0);
+ while (--REG6 >= 0);
- mb->result = REG8;
- break;
+ mb->result = REG8;
+ break;
- case 0x1d:
- REG3 = (REG3 & 0x00ff) | (data << 8);
+ case 0x1d:
+ REG3 = (REG3 & 0x00ff) | (data << 8);
- REG2 -= REG0;
- if (REG2 < 0)
+ REG2 -= REG0;
+ if (REG2 < 0)
REG2 = -REG2;
- REG3 -= REG1;
- if (REG3 < 0)
+ REG3 -= REG1;
+ if (REG3 < 0)
REG3 = -REG3;
- /* fall into command 1e */
+ /* fall into command 1e */
- case 0x1e:
- /* result = max (REG2, REG3) + 3/8 * min (REG2, REG3) */
- if (REG3 >= REG2)
- { REGc = REG2; REGd = REG3; }
- else
+ case 0x1e:
+ /* result = max (REG2, REG3) + 3/8 * min (REG2, REG3) */
+ if (REG3 >= REG2)
+ { REGc = REG2; REGd = REG3; }
+ else
{ REGd = REG2; REGc = REG3; }
- REGc >>= 2;
- REGd += REGc;
- REGc >>= 1;
- mb->result = REGd = (REGc + REGd);
- break;
-
- case 0x1f:
- logerror("math box function 0x1f\n");
- /* $$$ do some computation here (selftest? signature analysis? */
- break;
- }
-
- LOG((" result %04x\n", mb->result & 0xffff));
+ REGc >>= 2;
+ REGd += REGc;
+ REGc >>= 1;
+ mb->result = REGd = (REGc + REGd);
+ break;
+
+ case 0x1f:
+ logerror("math box function 0x1f\n");
+ /* $$$ do some computation here (selftest? signature analysis? */
+ break;
+ }
+
+ LOG((" result %04x\n", mb->result & 0xffff));
}
READ8_DEVICE_HANDLER( mathbox_status_r )
@@ -372,5 +372,3 @@ void mathbox_device::device_reset()
{
DEVICE_RESET_NAME( mathbox )(this);
}
-
-