static void ALU( mb86233_state *cpustate, UINT32 alu) { float ftmp; switch(alu) { case 0x00: /* NOP */ break; case 0x01: /* D = D & A */ GETD().u &= GETA().u; FLAGSI(cpustate, GETD().u); break; case 0x02: /* D = D | A */ GETD().u |= GETA().u; FLAGSI(cpustate, GETD().u); break; case 0x03: /* D = D ^ A */ GETD().u ^= GETA().u; FLAGSI(cpustate, GETD().u); break; case 0x05: /* CMP D,A */ ftmp = GETD().f - GETA().f; FLAGSF(cpustate, ftmp); cpustate->icount--; break; case 0x06: /* D = D + A */ GETD().f += GETA().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x07: /* D = D - A */ GETD().f -= GETA().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x08: /* P = A * B */ GETP().f = GETA().f * GETB().f; cpustate->icount--; break; case 0x09: /* D = D + P; P = A * B */ GETD().f += GETP().f; GETP().f = GETA().f * GETB().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x0A: /* D = D - P; P = A * B */ GETD().f -= GETP().f; GETP().f = GETA().f * GETB().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x0B: /* D = fabs(D) */ GETD().f = fabs( GETD().f ); FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x0C: /* D = D + P */ GETD().f += GETP().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x0D: /* D = P; P = A * B */ GETD().f = GETP().f; GETP().f = GETA().f * GETB().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x0E: /* D = float(D) */ GETD().f = (float)GETD().i; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x0F: /* D = int(D) */ GETD().i = (INT32)GETD().f; FLAGSI(cpustate, GETD().u); break; case 0x10: /* D = D / A */ if ( GETA().u != 0 ) GETD().f = GETD().f / GETA().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x11: /* D = -D */ GETD().f = -GETD().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x13: /* D = A + B */ GETD().f = GETA().f + GETB().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x14: /* D = B - A */ GETD().f = GETB().f - GETA().f; FLAGSF(cpustate, GETD().f); cpustate->icount--; break; case 0x16: /* LSR D, SHIFT */ GETD().u >>= GETSHIFT(); FLAGSI(cpustate, GETD().u); break; case 0x17: /* LSL D, SHIFT */ GETD().u <<= GETSHIFT(); FLAGSI(cpustate, GETD().u); break; case 0x18: /* ASR D, SHIFT */ // GETD().u = (GETD().u & 0x80000000) | (GETD().u >> GETSHIFT()); GETD().i >>= GETSHIFT(); FLAGSI(cpustate, GETD().u); break; case 0x1A: /* D = D + A */ GETD().i += GETA().i; FLAGSI(cpustate, GETD().u); break; case 0x1B: /* D = D - A */ GETD().i -= GETA().i; FLAGSI(cpustate, GETD().u); break; default: logerror( "TGP: Unknown ALU op %x at PC:%04x\n", alu, GETPC() ); break; } }
void mb86233_cpu_device::ALU( UINT32 alu) { float ftmp; switch(alu) { case 0x00: /* NOP */ break; case 0x01: /* D = D & A */ GETD().u &= GETA().u; FLAGSI( GETD().u); break; case 0x02: /* D = D | A */ GETD().u |= GETA().u; FLAGSI( GETD().u); break; case 0x03: /* D = D ^ A */ GETD().u ^= GETA().u; FLAGSI( GETD().u); break; case 0x04: /* D = D ~ A */ GETD().u = ~GETA().u; FLAGSI( GETD().u); break; case 0x05: /* CMP D,A */ ftmp = GETD().f - GETA().f; FLAGSF( ftmp); m_icount--; break; case 0x06: /* D = D + A */ GETD().f += GETA().f; FLAGSF( GETD().f); m_icount--; break; case 0x07: /* D = D - A */ GETD().f -= GETA().f; FLAGSF( GETD().f); m_icount--; break; case 0x08: /* P = A * B */ GETP().f = GETA().f * GETB().f; m_icount--; break; case 0x09: /* D = D + P; P = A * B */ GETD().f += GETP().f; GETP().f = GETA().f * GETB().f; FLAGSF( GETD().f); m_icount--; break; case 0x0A: /* D = D - P; P = A * B */ GETD().f -= GETP().f; GETP().f = GETA().f * GETB().f; FLAGSF( GETD().f); m_icount--; break; case 0x0B: /* D = fabs(D) */ GETD().f = fabs( GETD().f ); FLAGSF( GETD().f); m_icount--; break; case 0x0C: /* D = D + P */ GETD().f += GETP().f; FLAGSF( GETD().f); m_icount--; break; case 0x0D: /* D = P; P = A * B */ GETD().f = GETP().f; GETP().f = GETA().f * GETB().f; FLAGSF( GETD().f); m_icount--; break; case 0x0E: /* D = float(D) */ GETD().f = (float)GETD().i; FLAGSF( GETD().f); m_icount--; break; case 0x0F: /* D = int(D) */ switch((m_fpucontrol>>1)&3) { //case 0: GETD().i = floor(GETD().f+0.5f); break; //case 1: GETD().i = ceil(GETD().f); break; case 2: GETD().i = floor(GETD().f); break; // Manx TT case 3: GETD().i = (INT32)GETD().f; break; default: popmessage("TGP uses D = int(D) with FPU control = %02x, contact MAMEdev",m_fpucontrol>>1); break; } FLAGSI( GETD().i); break; case 0x10: /* D = D / A */ if ( GETA().u != 0 ) GETD().f = GETD().f / GETA().f; FLAGSF( GETD().f); m_icount--; break; case 0x11: /* D = -D */ GETD().f = -GETD().f; FLAGSF( GETD().f); m_icount--; break; case 0x13: /* D = A + B */ GETD().f = GETA().f + GETB().f; FLAGSF( GETD().f); m_icount--; break; case 0x14: /* D = B - A */ GETD().f = GETB().f - GETA().f; FLAGSF( GETD().f); m_icount--; break; case 0x16: /* LSR D, SHIFT */ GETD().u >>= GETSHIFT(); FLAGSI( GETD().u); break; case 0x17: /* LSL D, SHIFT */ GETD().u <<= GETSHIFT(); FLAGSI( GETD().u); break; case 0x18: /* ASR D, SHIFT */ // GETD().u = (GETD().u & 0x80000000) | (GETD().u >> GETSHIFT()); GETD().i >>= GETSHIFT(); FLAGSI( GETD().u); break; case 0x1A: /* D = D + A */ GETD().i += GETA().i; FLAGSI( GETD().u); break; case 0x1B: /* D = D - A */ GETD().i -= GETA().i; FLAGSI( GETD().u); break; default: fatalerror( "TGP: Unknown ALU op %x at PC:%04x\n", alu, GETPC() ); } }