56 #ifdef LS_INCLUDE_GENERIC 64 uint32_t
addr =
reg(ic->arg[1]) +
77 int low_pc = ((size_t)ic - (
size_t)cpu->
cd.
m88k.cur_ic_page)
78 /
sizeof(
struct m88k_instr_call);
92 int dreg = (((uint32_t *)ic->arg[0]) - &cpu->
cd.
m88k.
r[0]);
93 if (dreg < 1 || dreg > 31) {
94 fatal(
"HUH? dreg = %i in cpu_m88k_instr_loadstore.c." 95 " Internal error.\n", dreg);
134 int dreg = (((uint32_t *)ic->arg[0]) - &cpu->
cd.
m88k.
r[0]);
136 if (dreg < 1 || dreg > 31) {
137 fatal(
"HUH? dreg = %i in cpu_m88k_instr_loadstore.c." 138 " Internal error.\n", dreg);
163 fatal(
"{ m88k dyntrans alignment exception, size = %i," 164 " addr = %08" PRIx32
", pc = %08" PRIx32
" }\n",
LS_SIZE,
165 (uint32_t) addr, (uint32_t) cpu->
pc);
170 cpu->
cd.
m88k.next_ic = ¬hing_call;
180 if (!cpu->
memory_rw(cpu, cpu->
mem, addr, data,
sizeof(data),
188 reg(ic->arg[0]) = x >> 32;
189 reg(ic->arg[0] + 4) = x;
192 reg(ic->arg[0] + 4) = x >> 32;
213 x = ((uint64_t)
reg(ic->arg[0]) << 32) +
reg(ic->arg[0] + 4);
215 x = ((uint64_t)
reg(ic->arg[0] + 4) << 32) +
reg(ic->arg[0]);
223 if (!cpu->
memory_rw(cpu, cpu->
mem, addr, data,
sizeof(data),
233 void LS_N(
struct cpu *cpu,
struct m88k_instr_call *ic)
235 uint32_t addr =
reg(ic->arg[1]) +
247 uint8_t *p = cpu->
cd.
m88k.host_load_usr[addr >> 12];
249 uint8_t *p = cpu->
cd.
m88k.host_store_usr[addr >> 12];
253 uint8_t *p = cpu->
cd.
m88k.host_load[addr >> 12];
255 uint8_t *p = cpu->
cd.
m88k.host_store[addr >> 12];
299 #ifdef HOST_BIG_ENDIAN
300 ( *(uint16_t *)(p +
addr) );
302 ((p[
addr]<<8) + p[addr+1]);
305 #ifdef HOST_LITTLE_ENDIAN 306 ( *(uint16_t *)(p + addr) );
308 (p[
addr] + (p[addr+1]<<8));
321 #ifdef HOST_BIG_ENDIAN 322 ( *(uint32_t *)(p + addr) );
324 ((p[
addr]<<24) + (p[addr+1]<<16) + (p[addr+2]<<8) + p[addr+3]);
327 #ifdef HOST_LITTLE_ENDIAN 328 ( *(uint32_t *)(p + addr) );
330 (p[
addr] + (p[addr+1]<<8) + (p[addr+2]<<16) + (p[addr+3]<<24));
340 #ifdef HOST_BIG_ENDIAN 341 ( *(uint32_t *)(p + addr) );
343 ((p[
addr]<<24) + (p[addr+1]<<16) + (p[addr+2]<<8) + p[addr+3]);
346 #ifdef HOST_LITTLE_ENDIAN 347 ( *(uint32_t *)(p + addr + 4) );
349 (p[addr+4] + (p[addr+5]<<8) + (p[addr+6]<<16) + (p[addr+7]<<24));
354 reg(ic->arg[0] + 4) =
356 #ifdef HOST_BIG_ENDIAN 357 ( *(uint32_t *)(p + addr + 4) );
359 ((p[addr+4]<<24) + (p[addr+5]<<16) + (p[addr+6]<<8) + p[addr+7]);
362 #ifdef HOST_LITTLE_ENDIAN 363 ( *(uint32_t *)(p + addr) );
365 (p[
addr] + (p[addr+1]<<8) + (p[addr+2]<<16) + (p[addr+3]<<24));
378 { uint32_t x =
reg(ic->arg[0]);
380 #ifdef HOST_BIG_ENDIAN 381 *((uint16_t *)(p+addr)) = x; }
383 p[
addr] = x >> 8; p[addr+1] = x; }
386 #ifdef HOST_LITTLE_ENDIAN 387 *((uint16_t *)(p+addr)) = x; }
389 p[
addr] = x; p[addr+1] = x >> 8; }
394 { uint32_t x =
reg(ic->arg[0]);
396 #ifdef HOST_BIG_ENDIAN 397 *((uint32_t *)(p+addr)) = x; }
399 p[
addr] = x >> 24; p[addr+1] = x >> 16;
400 p[addr+2] = x >> 8; p[addr+3] = x; }
403 #ifdef HOST_LITTLE_ENDIAN 404 *((uint32_t *)(p+addr)) = x; }
406 p[
addr] = x; p[addr+1] = x >> 8;
407 p[addr+2] = x >> 16; p[addr+3] = x >> 24; }
414 { uint32_t x =
reg(ic->arg[0]);
416 #ifdef HOST_BIG_ENDIAN 417 *((uint32_t *)(p+addr)) = x; }
419 p[
addr] = x >> 24; p[addr+1] = x >> 16;
420 p[addr+2] = x >> 8; p[addr+3] = x; }
423 #ifdef HOST_LITTLE_ENDIAN 424 *((uint32_t *)(p+addr+4)) = x; }
426 p[addr +4] = x; p[addr+1+4] = x >> 8;
427 p[addr+2+4] = x >> 16; p[addr+3+4] = x >> 24; }
432 { uint32_t x =
reg(ic->arg[0] + 4);
434 #ifdef HOST_BIG_ENDIAN 435 *((uint32_t *)(p+addr+4)) = x; }
437 p[addr +4] = x >> 24; p[addr+1+4] = x >> 16;
438 p[addr+2+4] = x >> 8; p[addr+3+4] = x; }
441 #ifdef HOST_LITTLE_ENDIAN 442 *((uint32_t *)(p+addr)) = x; }
444 p[
addr ] = x; p[addr+1] = x >> 8;
445 p[addr+2] = x >> 16; p[addr+3] = x >> 24; }
uint64_t memory_readmax64(struct cpu *cpu, unsigned char *buf, int len)
void fatal(const char *fmt,...)
struct arm_instr_call * ic
#define M88K_IC_ENTRIES_PER_PAGE
uint32_t r[N_M88K_REGS+1]
void m88k_exception(struct cpu *cpu, int vector, int is_trap)
#define M88K_EXCEPTION_MISALIGNED_ACCESS
#define EMUL_LITTLE_ENDIAN
int debugger_n_steps_left_before_interaction
void LS_N(struct cpu *cpu, struct m88k_instr_call *ic)
int(* memory_rw)(struct cpu *cpu, struct memory *mem, uint64_t vaddr, unsigned char *data, size_t len, int writeflag, int cache_flags)
void LS_GENERIC_N(struct cpu *cpu, struct ppc_instr_call *ic)
#define M88K_EXCEPTION_PRIVILEGE_VIOLATION
uint32_t cr[N_M88K_CONTROL_REGS]
#define MEMORY_USER_ACCESS
void memory_writemax64(struct cpu *cpu, unsigned char *buf, int len, uint64_t data)
#define EXCEPTION_IN_DELAY_SLOT
#define M88K_INSTR_ALIGNMENT_SHIFT