m68k: fix corner case for 020+ bitfield instructions [Till Harbaum]

This commit is contained in:
arbee 2015-09-21 09:24:09 -04:00
parent 2b82915526
commit 75d08240a5
2 changed files with 34 additions and 47 deletions

View File

@ -91,7 +91,6 @@ M68KMAKE_PROTOTYPE_HEADER
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
M68KMAKE_PROTOTYPE_FOOTER
/* Build the opcode handler table */
void m68ki_build_opcode_table(void);
@ -2490,7 +2489,7 @@ M68KMAKE_OP(bfchg, 32, ., .)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte);
@ -2581,7 +2580,7 @@ M68KMAKE_OP(bfclr, 32, ., .)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte);
@ -2959,7 +2958,7 @@ M68KMAKE_OP(bfins, 32, ., .)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
insert_byte = MASK_OUT_ABOVE_8(insert_base);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
@ -3022,7 +3021,6 @@ M68KMAKE_OP(bfset, 32, ., .)
UINT32 mask_byte = 0;
UINT32 ea = M68KMAKE_GET_EA_AY_8;
if(BIT_B(word2))
offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]);
if(BIT_5(word2))
@ -3038,7 +3036,6 @@ M68KMAKE_OP(bfset, 32, ., .)
}
width = ((width-1) & 31) + 1;
mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
mask_long = mask_base >> offset;
@ -3052,7 +3049,7 @@ M68KMAKE_OP(bfset, 32, ., .)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte);
@ -3139,7 +3136,7 @@ M68KMAKE_OP(bftst, 32, ., .)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}

View File

@ -1,5 +1,3 @@
// license:BSD-3-Clause
// copyright-holders:Karl Stenerud
#include "emu.h"
#include "m68kcpu.h"
extern void m68040_fpu_op0(m68000_base_device *m68k);
@ -5346,7 +5344,7 @@ void m68000_base_device_ops::m68k_op_bfchg_32_ai(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte);
@ -5400,7 +5398,7 @@ void m68000_base_device_ops::m68k_op_bfchg_32_di(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte);
@ -5454,7 +5452,7 @@ void m68000_base_device_ops::m68k_op_bfchg_32_ix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte);
@ -5508,7 +5506,7 @@ void m68000_base_device_ops::m68k_op_bfchg_32_aw(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte);
@ -5562,7 +5560,7 @@ void m68000_base_device_ops::m68k_op_bfchg_32_al(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte ^ mask_byte);
@ -5653,7 +5651,7 @@ void m68000_base_device_ops::m68k_op_bfclr_32_ai(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte);
@ -5707,7 +5705,7 @@ void m68000_base_device_ops::m68k_op_bfclr_32_di(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte);
@ -5761,7 +5759,7 @@ void m68000_base_device_ops::m68k_op_bfclr_32_ix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte);
@ -5815,7 +5813,7 @@ void m68000_base_device_ops::m68k_op_bfclr_32_aw(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte);
@ -5869,7 +5867,7 @@ void m68000_base_device_ops::m68k_op_bfclr_32_al(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte & ~mask_byte);
@ -7177,7 +7175,7 @@ void m68000_base_device_ops::m68k_op_bfins_32_ai(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
insert_byte = MASK_OUT_ABOVE_8(insert_base);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
@ -7253,7 +7251,7 @@ void m68000_base_device_ops::m68k_op_bfins_32_di(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
insert_byte = MASK_OUT_ABOVE_8(insert_base);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
@ -7329,7 +7327,7 @@ void m68000_base_device_ops::m68k_op_bfins_32_ix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
insert_byte = MASK_OUT_ABOVE_8(insert_base);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
@ -7405,7 +7403,7 @@ void m68000_base_device_ops::m68k_op_bfins_32_aw(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
insert_byte = MASK_OUT_ABOVE_8(insert_base);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
@ -7481,7 +7479,7 @@ void m68000_base_device_ops::m68k_op_bfins_32_al(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
insert_byte = MASK_OUT_ABOVE_8(insert_base);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
@ -7544,7 +7542,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_ai(m68000_base_device* mc68kcpu)
UINT32 mask_byte = 0;
UINT32 ea = EA_AY_AI_8(mc68kcpu);
if(BIT_B(word2))
offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]);
if(BIT_5(word2))
@ -7560,7 +7557,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_ai(m68000_base_device* mc68kcpu)
}
width = ((width-1) & 31) + 1;
mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
mask_long = mask_base >> offset;
@ -7574,7 +7570,7 @@ void m68000_base_device_ops::m68k_op_bfset_32_ai(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte);
@ -7599,7 +7595,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_di(m68000_base_device* mc68kcpu)
UINT32 mask_byte = 0;
UINT32 ea = EA_AY_DI_8(mc68kcpu);
if(BIT_B(word2))
offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]);
if(BIT_5(word2))
@ -7615,7 +7610,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_di(m68000_base_device* mc68kcpu)
}
width = ((width-1) & 31) + 1;
mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
mask_long = mask_base >> offset;
@ -7629,7 +7623,7 @@ void m68000_base_device_ops::m68k_op_bfset_32_di(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte);
@ -7654,7 +7648,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_ix(m68000_base_device* mc68kcpu)
UINT32 mask_byte = 0;
UINT32 ea = EA_AY_IX_8(mc68kcpu);
if(BIT_B(word2))
offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]);
if(BIT_5(word2))
@ -7670,7 +7663,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_ix(m68000_base_device* mc68kcpu)
}
width = ((width-1) & 31) + 1;
mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
mask_long = mask_base >> offset;
@ -7684,7 +7676,7 @@ void m68000_base_device_ops::m68k_op_bfset_32_ix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte);
@ -7709,7 +7701,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_aw(m68000_base_device* mc68kcpu)
UINT32 mask_byte = 0;
UINT32 ea = EA_AW_8(mc68kcpu);
if(BIT_B(word2))
offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]);
if(BIT_5(word2))
@ -7725,7 +7716,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_aw(m68000_base_device* mc68kcpu)
}
width = ((width-1) & 31) + 1;
mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
mask_long = mask_base >> offset;
@ -7739,7 +7729,7 @@ void m68000_base_device_ops::m68k_op_bfset_32_aw(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte);
@ -7764,7 +7754,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_al(m68000_base_device* mc68kcpu)
UINT32 mask_byte = 0;
UINT32 ea = EA_AL_8(mc68kcpu);
if(BIT_B(word2))
offset = MAKE_INT_32(REG_D(mc68kcpu)[offset&7]);
if(BIT_5(word2))
@ -7780,7 +7769,6 @@ void m68000_base_device_ops::m68k_op_bfset_32_al(m68000_base_device* mc68kcpu)
}
width = ((width-1) & 31) + 1;
mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));
mask_long = mask_base >> offset;
@ -7794,7 +7782,7 @@ void m68000_base_device_ops::m68k_op_bfset_32_al(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
m68ki_write_8((mc68kcpu), ea+4, data_byte | mask_byte);
@ -7881,7 +7869,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_ai(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -7932,7 +7920,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_di(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -7983,7 +7971,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_ix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -8034,7 +8022,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_aw(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -8085,7 +8073,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_al(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -8136,7 +8124,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_pcdi(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -8187,7 +8175,7 @@ void m68000_base_device_ops::m68k_op_bftst_32_pcix(m68000_base_device* mc68kcpu)
if((width + offset) > 32)
{
mask_byte = MASK_OUT_ABOVE_8(mask_base);
mask_byte = MASK_OUT_ABOVE_8(mask_base) << (8-offset);
data_byte = m68ki_read_8((mc68kcpu), ea+4);
(mc68kcpu)->not_z_flag |= (data_byte & mask_byte);
}
@ -34884,3 +34872,5 @@ void m68ki_build_opcode_table(void)
/* ======================================================================== */
/* ============================== END OF FILE ============================= */
/* ======================================================================== */