Skip to content

Commit cd27310

Browse files
author
Federico Berti
committed
68k: MOVEM - pre-decrement long-writes on an address register store lsw first and then msw
1 parent 419a994 commit cd27310

2 files changed

Lines changed: 50 additions & 4 deletions

File tree

src/m68k/cpu/instructions/MOVEM.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -666,9 +666,9 @@ protected final int putMultipleLongPreDec(int reg, int reglist, int address)
666666
{
667667
start -= 4;
668668
if (reg == 7-n) // if the EA register itself is also moved, use initial value
669-
cpu.writeMemoryLong(start, oldreg);
669+
writeMemoryLongSwapped(start, oldreg);
670670
else
671-
cpu.writeMemoryLong(start, cpu.getAddrRegisterLong(7 - n));
671+
writeMemoryLongSwapped(start, cpu.getAddrRegisterLong(7 - n));
672672
regcount++;
673673
}
674674
bit <<= 1;
@@ -679,7 +679,7 @@ protected final int putMultipleLongPreDec(int reg, int reglist, int address)
679679
if((reglist & bit) != 0)
680680
{
681681
start -= 4;
682-
cpu.writeMemoryLong(start, cpu.getDataRegisterLong(7 - n));
682+
writeMemoryLongSwapped(start, cpu.getDataRegisterLong(7 - n));
683683
regcount++;
684684
}
685685
bit <<= 1;
@@ -689,4 +689,9 @@ protected final int putMultipleLongPreDec(int reg, int reglist, int address)
689689
return regcount;
690690
}
691691

692+
private void writeMemoryLongSwapped(int address, int value) {
693+
//swap word-write order, lsw first
694+
cpu.writeMemoryWord(address + 2, value & 0xFFFF);
695+
cpu.writeMemoryWord(address, (value >> 16) & 0xFFFF);
696+
}
692697
}

test/m68k/cpu/instructions/AddressRegisterPreDecOperandTest.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,13 @@ public void writeWord(int addr, int value) {
3333
wordWrites.put(addr, value);
3434
super.writeWord(addr, value);
3535
}
36+
37+
@Override
38+
public void writeLong(int addr, int value) {
39+
wordWrites.put(addr, (value >> 16) & 0xFFFF);
40+
wordWrites.put(addr + 2, value & 0xFFFF);
41+
super.writeLong(addr, value);
42+
}
3643
};
3744

3845
cpu = new MC68000();
@@ -42,7 +49,7 @@ public void writeWord(int addr, int value) {
4249
wordWrites.clear();
4350
}
4451

45-
public void testLswWrittenFirst() {
52+
public void testLswWrittenFirst_MOVE() {
4653
int lsw = 0x2222;
4754
int msw = 0x1111;
4855
int value = msw << 16 | lsw;
@@ -73,6 +80,40 @@ public void testLswWrittenFirst() {
7380
Map.Entry<Integer, Integer> second = i.next();
7481
Assert.assertEquals(firstWordPos, second.getKey().intValue());
7582
Assert.assertEquals(msw, second.getValue().intValue());
83+
}
84+
85+
public void testLswWrittenFirst_MOVEM() {
86+
int lsw = 0x2222;
87+
int msw = 0x1111;
88+
int value = msw << 16 | lsw;
89+
int startPos = 0x104;
90+
int endPos = startPos - 8; // 2 longs
91+
int valuePos = startPos - 4;
92+
93+
bus.writeLong(4, 0x48e1_8100); //48e1 8100 movem.l d0/d7,-(a1)
94+
cpu.setPC(4);
95+
cpu.setDataRegisterLong(7, value);
96+
cpu.setAddrRegisterLong(1, startPos);
7697

98+
wordWrites.clear();
99+
cpu.execute();
100+
101+
Assert.assertEquals(cpu.getAddrRegisterLong(1), endPos);
102+
103+
long res = bus.readLong(valuePos);
104+
Assert.assertEquals(res, value);
105+
106+
Assert.assertEquals(wordWrites.size(), 4);
107+
108+
int firstWordPos = startPos - 2;
109+
Iterator<Map.Entry<Integer, Integer>> i = wordWrites.entrySet().iterator();
110+
Map.Entry<Integer, Integer> first = i.next();
111+
Assert.assertEquals(firstWordPos, first.getKey().intValue());
112+
Assert.assertEquals(lsw, first.getValue().intValue());
113+
114+
int secondWordPos = firstWordPos - 2;
115+
Map.Entry<Integer, Integer> second = i.next();
116+
Assert.assertEquals(secondWordPos, second.getKey().intValue());
117+
Assert.assertEquals(msw, second.getValue().intValue());
77118
}
78119
}

0 commit comments

Comments
 (0)