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;
}
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))
{
@ -1438,7 +1438,7 @@ uint16_t arm946es_cpu_device::arm7_cpu_read16(uint32_t addr)
if (addr & 1)
{
result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
result = ((result >> 8) & 0xff) | ((result & 0xff) << 24);
}
return result;
@ -1567,9 +1567,9 @@ uint32_t arm7_cpu_device::arm7_cpu_read32(uint32_t addr)
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 )
{
@ -1583,7 +1583,7 @@ uint16_t arm7_cpu_device::arm7_cpu_read16(uint32_t addr)
if (addr & 1)
{
result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
result = ((result >> 8) & 0xff) | ((result & 0xff) << 24);
}
return result;

View File

@ -236,7 +236,7 @@ protected:
virtual void arm7_cpu_write16(uint32_t addr, uint16_t data);
virtual void arm7_cpu_write8(uint32_t addr, uint8_t data);
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);
// Coprocessor support
@ -623,7 +623,7 @@ public:
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 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;
private:

View File

@ -492,7 +492,7 @@ void arm7_cpu_device::HandleMemSingle(uint32_t insn)
R15 = data - 4;
else
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;
if ((data & 1) && m_archRev >= 5)
{
@ -648,10 +648,10 @@ void arm7_cpu_device::HandleHalfWordDT(uint32_t insn)
// Signed Half Word?
if (insn & 0x20) {
uint16_t signbyte, databyte;
databyte = READ16(rnv) & 0xFFFF;
signbyte = (databyte & 0x8000) ? 0xffff : 0;
newval = (uint32_t)(signbyte << 16)|databyte;
uint32_t databyte = READ16(rnv);
uint32_t mask = 0x0000ffff;
mask >>= (rnv & 1) ? 8 : 0;
newval = databyte | ((databyte & ((mask + 1) >> 1)) ? ~mask : 0);
}
// Signed Byte
else {