arm7: fix unaligned 16-bit loads

This commit is contained in:
Vas Crabb 2017-11-30 19:58:51 +11:00
parent 4854fdf2c6
commit 475cf95575
3 changed files with 13 additions and 13 deletions

View File

@ -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;

View File

@ -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:

View File

@ -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 {