mirror of
https://github.com/holub/mame
synced 2025-07-04 09:28:51 +03:00
arm7: fix unaligned 16-bit loads
This commit is contained in:
parent
4854fdf2c6
commit
475cf95575
@ -1417,9 +1417,9 @@ uint32_t arm946es_cpu_device::arm7_cpu_read32(uint32_t addr)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t arm946es_cpu_device::arm7_cpu_read16(uint32_t addr)
|
uint32_t arm946es_cpu_device::arm7_cpu_read16(uint32_t addr)
|
||||||
{
|
{
|
||||||
uint16_t result;
|
uint32_t result;
|
||||||
|
|
||||||
if ((addr >= cp15_itcm_base) && (addr <= cp15_itcm_end))
|
if ((addr >= cp15_itcm_base) && (addr <= cp15_itcm_end))
|
||||||
{
|
{
|
||||||
@ -1438,7 +1438,7 @@ uint16_t arm946es_cpu_device::arm7_cpu_read16(uint32_t addr)
|
|||||||
|
|
||||||
if (addr & 1)
|
if (addr & 1)
|
||||||
{
|
{
|
||||||
result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
|
result = ((result >> 8) & 0xff) | ((result & 0xff) << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
@ -1567,9 +1567,9 @@ uint32_t arm7_cpu_device::arm7_cpu_read32(uint32_t addr)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t arm7_cpu_device::arm7_cpu_read16(uint32_t addr)
|
uint32_t arm7_cpu_device::arm7_cpu_read16(uint32_t addr)
|
||||||
{
|
{
|
||||||
uint16_t result;
|
uint32_t result;
|
||||||
|
|
||||||
if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
|
if( COPRO_CTRL & COPRO_CTRL_MMU_EN )
|
||||||
{
|
{
|
||||||
@ -1583,7 +1583,7 @@ uint16_t arm7_cpu_device::arm7_cpu_read16(uint32_t addr)
|
|||||||
|
|
||||||
if (addr & 1)
|
if (addr & 1)
|
||||||
{
|
{
|
||||||
result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
|
result = ((result >> 8) & 0xff) | ((result & 0xff) << 24);
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -236,7 +236,7 @@ protected:
|
|||||||
virtual void arm7_cpu_write16(uint32_t addr, uint16_t data);
|
virtual void arm7_cpu_write16(uint32_t addr, uint16_t data);
|
||||||
virtual void arm7_cpu_write8(uint32_t addr, uint8_t data);
|
virtual void arm7_cpu_write8(uint32_t addr, uint8_t data);
|
||||||
virtual uint32_t arm7_cpu_read32(uint32_t addr);
|
virtual uint32_t arm7_cpu_read32(uint32_t addr);
|
||||||
virtual uint16_t arm7_cpu_read16(uint32_t addr);
|
virtual uint32_t arm7_cpu_read16(uint32_t addr);
|
||||||
virtual uint8_t arm7_cpu_read8(uint32_t addr);
|
virtual uint8_t arm7_cpu_read8(uint32_t addr);
|
||||||
|
|
||||||
// Coprocessor support
|
// Coprocessor support
|
||||||
@ -623,7 +623,7 @@ public:
|
|||||||
virtual void arm7_cpu_write16(uint32_t addr, uint16_t data) override;
|
virtual void arm7_cpu_write16(uint32_t addr, uint16_t data) override;
|
||||||
virtual void arm7_cpu_write8(uint32_t addr, uint8_t data) override;
|
virtual void arm7_cpu_write8(uint32_t addr, uint8_t data) override;
|
||||||
virtual uint32_t arm7_cpu_read32(uint32_t addr) override;
|
virtual uint32_t arm7_cpu_read32(uint32_t addr) override;
|
||||||
virtual uint16_t arm7_cpu_read16(uint32_t addr) override;
|
virtual uint32_t arm7_cpu_read16(uint32_t addr) override;
|
||||||
virtual uint8_t arm7_cpu_read8(uint32_t addr) override;
|
virtual uint8_t arm7_cpu_read8(uint32_t addr) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -492,7 +492,7 @@ void arm7_cpu_device::HandleMemSingle(uint32_t insn)
|
|||||||
R15 = data - 4;
|
R15 = data - 4;
|
||||||
else
|
else
|
||||||
R15 = (R15 & ~0x03FFFFFC) /* N Z C V I F M1 M0 */ | ((data - 4) & 0x03FFFFFC);
|
R15 = (R15 & ~0x03FFFFFC) /* N Z C V I F M1 M0 */ | ((data - 4) & 0x03FFFFFC);
|
||||||
// LDR, PC takes 2S + 2N + 1I (5 total cycles)
|
// LDR, PC takes 2S + 2N + 1I (5 total cycles)
|
||||||
ARM7_ICOUNT -= 2;
|
ARM7_ICOUNT -= 2;
|
||||||
if ((data & 1) && m_archRev >= 5)
|
if ((data & 1) && m_archRev >= 5)
|
||||||
{
|
{
|
||||||
@ -648,10 +648,10 @@ void arm7_cpu_device::HandleHalfWordDT(uint32_t insn)
|
|||||||
|
|
||||||
// Signed Half Word?
|
// Signed Half Word?
|
||||||
if (insn & 0x20) {
|
if (insn & 0x20) {
|
||||||
uint16_t signbyte, databyte;
|
uint32_t databyte = READ16(rnv);
|
||||||
databyte = READ16(rnv) & 0xFFFF;
|
uint32_t mask = 0x0000ffff;
|
||||||
signbyte = (databyte & 0x8000) ? 0xffff : 0;
|
mask >>= (rnv & 1) ? 8 : 0;
|
||||||
newval = (uint32_t)(signbyte << 16)|databyte;
|
newval = databyte | ((databyte & ((mask + 1) >> 1)) ? ~mask : 0);
|
||||||
}
|
}
|
||||||
// Signed Byte
|
// Signed Byte
|
||||||
else {
|
else {
|
||||||
|
Loading…
Reference in New Issue
Block a user