mirror of
https://github.com/pruten/shoebill.git
synced 2024-06-09 12:29:31 +00:00
Implemented movep
This commit is contained in:
parent
fd31d642b0
commit
4af4262993
40
core/cpu.c
40
core/cpu.c
|
@ -2208,7 +2208,45 @@ static void inst_eori_to_sr (void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void inst_movep (void) {
|
static void inst_movep (void) {
|
||||||
assert(!"inst_movep: fixme: I'm not implemented!\n");
|
~decompose(shoe.op, 0000 ddd 1mm 001 aaa);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 68kprm thoughtfully doesn't clarify whether the
|
||||||
|
* displacement is sign-extended or not. (It is.)
|
||||||
|
*/
|
||||||
|
const int16_t disp = nextword();
|
||||||
|
const uint32_t addr = shoe.a[a] + disp;
|
||||||
|
|
||||||
|
switch (m) {
|
||||||
|
case 0: { // word, mem->reg
|
||||||
|
uint16_t val = lget(addr, 1);
|
||||||
|
val = (val << 8) | lget(addr + 2, 1);
|
||||||
|
set_d(d, val, 2);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 1: { // long, mem->reg
|
||||||
|
uint32_t val = lget(addr, 1);
|
||||||
|
val = (val << 8) | lget(addr + 2, 1);
|
||||||
|
val = (val << 8) | lget(addr + 4, 1);
|
||||||
|
val = (val << 8) | lget(addr + 6, 1);
|
||||||
|
shoe.d[d] = val;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 2: { // word, reg->mem
|
||||||
|
const uint16_t val = shoe.d[d];
|
||||||
|
lset(addr + 0, 1, (val >> 8) & 0xff);
|
||||||
|
lset(addr + 2, 1, (val >> 0) & 0xff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 3: { // long, reg->mem
|
||||||
|
const uint32_t val = shoe.d[d];
|
||||||
|
lset(addr + 0, 1, (val >> 24) & 0xff);
|
||||||
|
lset(addr + 2, 1, (val >> 16) & 0xff);
|
||||||
|
lset(addr + 4, 1, (val >> 8) & 0xff);
|
||||||
|
lset(addr + 6, 1, (val >> 0) & 0xff);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
13
core/dis.c
13
core/dis.c
|
@ -537,7 +537,18 @@ void dis_eori_to_sr() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void dis_movep() {
|
void dis_movep() {
|
||||||
sprintf(dis.str, "movep???");
|
const int16_t disp = dis_next_word();
|
||||||
|
~decompose(dis_op, 0000 ddd 1 s r 001 aaa);
|
||||||
|
|
||||||
|
if (r) { // reg -> mem
|
||||||
|
sprintf(dis.str, "movep.%c d%u,%s0x%x(a%u)", "wl"[s], d,
|
||||||
|
(disp >= 0) ? "" : "-", abs(disp), a);
|
||||||
|
}
|
||||||
|
else { // mem -> reg
|
||||||
|
sprintf(dis.str, "movep.%c %s0x%x(a%u),d%u", "wl"[s],
|
||||||
|
(disp >= 0) ? "" : "-", abs(disp), a, d);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void dis_bfextu() {
|
void dis_bfextu() {
|
||||||
|
|
Loading…
Reference in New Issue
Block a user