summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Miodrag Milanovic <mmicko@gmail.com>2012-04-09 06:00:44 +0000
committer Miodrag Milanovic <mmicko@gmail.com>2012-04-09 06:00:44 +0000
commitbbddee4a75a88e15d5933594736dcd40c1513d3f (patch)
tree3f623e36582f5978f624e7a63673ebe7300264d9 /src
parent4f2850b93c17f5ce6e1ef787f47d7964f6d6249a (diff)
m68k improvements: [Hans Ostermeyer]
- Fixed BFINS, BFEXTU, and BFEXTS to fetch 8-bit quantities as 8 bits (corrects Domain/OS 10.3.5 crash on page boundry) - Added SoftFloat log functions and m68k FLOGNP1, FLOGN, FLOG2, and FLOG10 instructions
Diffstat (limited to 'src')
-rw-r--r--src/emu/cpu/m68000/m68k_in.c15
-rw-r--r--src/emu/cpu/m68000/m68kfpu.c28
2 files changed, 39 insertions, 4 deletions
diff --git a/src/emu/cpu/m68000/m68k_in.c b/src/emu/cpu/m68000/m68k_in.c
index bad6dceafe6..af18f1a95f2 100644
--- a/src/emu/cpu/m68000/m68k_in.c
+++ b/src/emu/cpu/m68000/m68k_in.c
@@ -2660,7 +2660,8 @@ M68KMAKE_OP(bfexts, 32, ., .)
}
width = ((width-1) & 31) + 1;
- data = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea);
+ data = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) :
+ (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea);
data = MASK_OUT_ABOVE_32(data<<offset);
@@ -2745,7 +2746,8 @@ M68KMAKE_OP(bfextu, 32, ., .)
}
width = ((width-1) & 31) + 1;
- data = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea);
+ data = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) :
+ (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea);
data = MASK_OUT_ABOVE_32(data<<offset);
if((offset+width) > 32)
@@ -2942,11 +2944,16 @@ M68KMAKE_OP(bfins, 32, ., .)
(mc68kcpu)->not_z_flag = insert_base;
insert_long = insert_base >> offset;
- data_long = (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea);
+ data_long = (offset+width) < 8 ? (m68ki_read_8((mc68kcpu), ea) << 24) :
+ (offset+width) < 16 ? (m68ki_read_16((mc68kcpu), ea) << 16) : m68ki_read_32((mc68kcpu), ea);
(mc68kcpu)->v_flag = VFLAG_CLEAR;
(mc68kcpu)->c_flag = CFLAG_CLEAR;
- if((width + offset) < 16)
+ if((width + offset) < 8)
+ {
+ m68ki_write_8((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 24);
+ }
+ else if((width + offset) < 16)
{
m68ki_write_16((mc68kcpu), ea, ((data_long & ~mask_long) | insert_long) >> 16);
}
diff --git a/src/emu/cpu/m68000/m68kfpu.c b/src/emu/cpu/m68000/m68kfpu.c
index 18a1d0e339d..7c2f295708e 100644
--- a/src/emu/cpu/m68000/m68kfpu.c
+++ b/src/emu/cpu/m68000/m68kfpu.c
@@ -1321,6 +1321,13 @@ static void fpgen_rm_reg(m68ki_cpu_core *m68k, UINT16 w2)
m68k->remaining_cycles -= 109;
break;
}
+ case 0x06: // FLOGNP1
+ {
+ REG_FP(m68k)[dst] = floatx80_flognp1 (source);
+ SET_CONDITION_CODES(m68k, REG_FP(m68k)[dst]);
+ m68k->remaining_cycles -= 594; // for MC68881
+ break;
+ }
case 0x0e: // FSIN
{
REG_FP(m68k)[dst] = source;
@@ -1337,6 +1344,27 @@ static void fpgen_rm_reg(m68ki_cpu_core *m68k, UINT16 w2)
m68k->remaining_cycles -= 75;
break;
}
+ case 0x14: // FLOGN
+ {
+ REG_FP(m68k)[dst] = floatx80_flogn (source);
+ SET_CONDITION_CODES(m68k, REG_FP(m68k)[dst]);
+ m68k->remaining_cycles -= 548; // for MC68881
+ break;
+ }
+ case 0x15: // FLOG10
+ {
+ REG_FP(m68k)[dst] = floatx80_flog10 (source);
+ SET_CONDITION_CODES(m68k, REG_FP(m68k)[dst]);
+ m68k->remaining_cycles -= 604; // for MC68881
+ break;
+ }
+ case 0x16: // FLOG2
+ {
+ REG_FP(m68k)[dst] = floatx80_flog2 (source);
+ SET_CONDITION_CODES(m68k, REG_FP(m68k)[dst]);
+ m68k->remaining_cycles -= 604; // for MC68881
+ break;
+ }
case 0x18: // FABS
{
REG_FP(m68k)[dst] = source;