diff options
author | 2007-12-17 15:19:59 +0000 | |
---|---|---|
committer | 2007-12-17 15:19:59 +0000 | |
commit | 7b77f1218624ea26dbb2efd85a19f795f5d4e02e (patch) | |
tree | 19209304095572b4fd61c2a2d6a5aa75c4e471ad /src/emu/cpu/v60/op2.c | |
parent | 3da7f476068b3ffef713218ba2fc1bd5030f2c38 (diff) |
Initial checkin of MAME 0.121.mame0121
Diffstat (limited to 'src/emu/cpu/v60/op2.c')
-rw-r--r-- | src/emu/cpu/v60/op2.c | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/src/emu/cpu/v60/op2.c b/src/emu/cpu/v60/op2.c new file mode 100644 index 00000000000..d1a6bc6c3d7 --- /dev/null +++ b/src/emu/cpu/v60/op2.c @@ -0,0 +1,359 @@ + + +#define if2 if12 +#define f2Op1 f12Op1 +#define f2Op2 f12Op2 +#define f2Flag1 f12Flag1 +#define f2Flag2 f12Flag2 + +#define F2END() \ + return 2+amLength1+amLength2; + +#define F2LOADOPFLOAT(num) \ + if (f2Flag##num) \ + appf = u2f(v60.reg[f2Op##num]); \ + else \ + appf = u2f(MemRead32(f2Op##num)); + +#define F2STOREOPFLOAT(num) \ + if (f2Flag##num) \ + v60.reg[f2Op##num] = f2u(appf); \ + else \ + MemWrite32(f2Op##num, f2u(appf)); + +static void F2DecodeFirstOperand(UINT32 (*DecodeOp1)(void), UINT8 dim1) +{ + modDim = dim1; + modM = if2 & 0x40; + modAdd = PC + 2; + amLength1 = DecodeOp1(); + f2Op1 = amOut; + f2Flag1 = amFlag; +} + +static void F2DecodeSecondOperand(UINT32 (*DecodeOp2)(void), UINT8 dim2) +{ + modDim = dim2; + modM = if2 & 0x20; + modAdd = PC + 2 + amLength1; + amLength2 = DecodeOp2(); + f2Op2 = amOut; + f2Flag2 = amFlag; +} + +static void F2WriteSecondOperand(UINT8 dim2) +{ + modDim = dim2; + modM = if2 & 0x20; + modAdd = PC + 2 + amLength1; + amLength2 = WriteAM(); +} + +static UINT32 opCVTWS(void) +{ + float val; + + F2DecodeFirstOperand(ReadAM,2); + + // Convert to float + val = (float)(INT32)f2Op1; + modWriteValW = f2u(val); + + _OV=0; + _CY=(val < 0.0f); + _S=((modWriteValW & 0x80000000)!=0); + _Z=(val == 0.0f); + + F2WriteSecondOperand(2); + F2END(); +} + +static UINT32 opCVTSW(void) +{ + float val; + + F2DecodeFirstOperand(ReadAM,2); + + // Convert to UINT32 + val = u2f(f2Op1); + modWriteValW = (UINT32)val; + + _OV=0; + _CY=(val < 0.0f); + _S=((modWriteValW & 0x80000000)!=0); + _Z=(val == 0.0f); + + F2WriteSecondOperand(2); + F2END(); +} + +static UINT32 opMOVFS(void) +{ + F2DecodeFirstOperand(ReadAM,2); + modWriteValW = f2Op1; + F2WriteSecondOperand(2); + F2END(); +} + +static UINT32 opNEGFS(void) +{ + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAMAddress, 2); + + appf = -u2f(f2Op1); + + _OV=0; + _CY=(appf < 0.0f); + _S=((f2u(appf) & 0x80000000)!=0); + _Z=(appf == 0.0f); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opABSFS(void) +{ + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAMAddress, 2); + + appf = u2f(f2Op1); + + if(appf < 0) + appf = -appf; + + _OV=0; + _CY=0; + _S=((f2u(appf) & 0x80000000)!=0); + _Z=(appf == 0.0f); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opADDFS(void) +{ + UINT32 appw; + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAMAddress, 2); + + F2LOADOPFLOAT(2); + + appf += u2f(f2Op1); + + appw = f2u(appf); + _OV = _CY = 0; + _S = ((appw & 0x80000000)!=0); + _Z = (appw == 0); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opSUBFS(void) +{ + UINT32 appw; + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAMAddress, 2); + + F2LOADOPFLOAT(2); + + appf -= u2f(f2Op1); + + appw = f2u(appf); + _OV = _CY = 0; + _S = ((appw & 0x80000000)!=0); + _Z = (appw == 0); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opMULFS(void) +{ + UINT32 appw; + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAMAddress, 2); + + F2LOADOPFLOAT(2); + + appf *= u2f(f2Op1); + + appw = f2u(appf); + _OV = _CY = 0; + _S = ((appw & 0x80000000)!=0); + _Z = (appw == 0); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opDIVFS(void) +{ + UINT32 appw; + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAMAddress, 2); + + F2LOADOPFLOAT(2); + + appf /= u2f(f2Op1); + + appw = f2u(appf); + _OV = _CY = 0; + _S = ((appw & 0x80000000)!=0); + _Z = (appw == 0); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opSCLFS(void) +{ + UINT32 appw; + float appf; + + F2DecodeFirstOperand(ReadAM, 1); + F2DecodeSecondOperand(ReadAMAddress, 2); + + F2LOADOPFLOAT(2); + + if ((INT16)f2Op1 < 0) + appf /= 1 << -(INT16)f2Op1; + else + appf *= 1 << f2Op1; + + appw = f2u(appf); + _OV = _CY = 0; + _S = ((appw & 0x80000000)!=0); + _Z = (appw == 0); + + F2STOREOPFLOAT(2); + F2END() +} + +static UINT32 opCMPF(void) +{ + float appf; + + F2DecodeFirstOperand(ReadAM, 2); + F2DecodeSecondOperand(ReadAM, 2); + + appf = u2f(f2Op2) - u2f(f2Op1); + + _Z = (appf == 0); + _S = (appf < 0); + _OV = 0; + _CY = 0; + + F2END(); +} + +static UINT32 op5FUNHANDLED(void) +{ + fatalerror("Unhandled 5F opcode at %08x", PC); + return 0; /* never reached, fatalerror won't return */ +} + +static UINT32 op5CUNHANDLED(void) +{ + fatalerror("Unhandled 5C opcode at %08x", PC); + return 0; /* never reached, fatalerror won't return */ +} + +static UINT32 (*const Op5FTable[32])(void) = +{ + opCVTWS, + opCVTSW, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED, + op5FUNHANDLED +}; + +static UINT32 (*const Op5CTable[32])(void) = +{ + opCMPF, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + opMOVFS, + opNEGFS, + opABSFS, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + + opSCLFS, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + opADDFS, + opSUBFS, + opMULFS, + opDIVFS, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED, + op5CUNHANDLED +}; + + +static UINT32 op5F(void) +{ + if2 = OpRead8(PC + 1); + return Op5FTable[if2&0x1F](); +} + + +static UINT32 op5C(void) +{ + if2 = OpRead8(PC + 1); + return Op5CTable[if2&0x1F](); +} |