#include <linux/reboot.h>
#include <sys/reboot.h>
+#include <endian.h>
#define DEBUG_PISTORM_DEVICE
extern void adjust_ranges_amiga(struct emulator_config *cfg);
extern uint8_t rtg_enabled, rtg_on, pinet_enabled, piscsi_enabled, load_new_config, end_signal;
extern struct emulator_config *cfg;
+extern int cpu_emulation_running;
char cfg_filename[256] = "default.cfg";
char tmp_string[256];
pi_string[0] = 0;
pi_ptr[0] = 0;
break;
+ case PI_CMD_MEMCPY_Q:
+ DEBUG("CopyMemQuick.\n");
+ if ((pi_ptr[0] & 0x03) != 0) {
+ DEBUG("[!!!PISTORM-DEV] CopyMemQuick src not aligned: %.8X\n", pi_ptr[0]);
+ }
+ if (pi_ptr[1] & 0x03) {
+ DEBUG("[!!!PISTORM-DEV] CopyMemQuick dst not aligned: %.8X\n", pi_ptr[1]);
+ }
+ if (val & 0x03) {
+ DEBUG("[!!!PISTORM-DEV] CopyMemQuick size not aligned: %.8X\n", val);
+ }
+ // Fallthrough
case PI_CMD_MEMCPY:
//DEBUG("[PISTORM-DEV} Write to MEMCPY: %d (%.8X)\n", val, val);
if (pi_ptr[0] == 0 || pi_ptr[1] == 0) {
printf("[PISTORM-DEV] MEMCPY called with size 0. Aborting.\n");
pi_cmd_result = PI_RES_INVALIDVALUE;
} else {
+ //DEBUG("[PISTORM-DEV] Copy %d bytes from $%.8X to $%.8X\n", val, pi_ptr[0], pi_ptr[1]);
int32_t src = get_mapped_item_by_address(cfg, pi_ptr[0]);
int32_t dst = get_mapped_item_by_address(cfg, pi_ptr[1]);
if (cfg->map_type[dst] == MAPTYPE_ROM)
uint16_t tmps = 0;
for (uint32_t i = 0; i < val; i++) {
while (i + 2 < val) {
- if (src == -1) tmps = (uint16_t)m68k_read_memory_16(pi_ptr[0] + i);
+ if (src == -1) tmps = (uint16_t)htobe16(m68k_read_memory_16(pi_ptr[0] + i));
else memcpy(&tmps, &cfg->map_data[src][pi_ptr[0] - cfg->map_offset[src] + i], 2);
- if (dst == -1) m68k_write_memory_16(pi_ptr[1] + i, tmps);
+ if (dst == -1) m68k_write_memory_16(pi_ptr[1] + i, be16toh(tmps));
else memcpy(&cfg->map_data[dst][pi_ptr[1] - cfg->map_offset[dst] + i], &tmps, 2);
i += 2;
}
#define AUTO_MONITOR_ID ((options.bits.auto_mon==0)?(PAL_MONITOR_ID):((options.bits.auto_mon==1)?(NTSC_MONITOR_ID):(DEFAULT_MONITOR_ID)))
extern unsigned int pistorm_base_addr;
-#define WRITELONG(cmd, val) *(unsigned int *)((unsigned int)(pistorm_base_addr+cmd)) = val;
+#define WRITELONG(cmd, val) *(volatile unsigned int *)((unsigned int)(pistorm_base_addr+cmd)) = val;
void pi_CopyMem(unsigned char *src asm("a0"), unsigned char *dst asm("a1"), unsigned int size asm("d0")) {
WRITELONG(PI_PTR1, (unsigned int)src);
WRITELONG(PI_CMD_MEMCPY, size);
}
+void pi_CopyMemQuick(unsigned char *src asm("a0"), unsigned char *dst asm("a1"), unsigned int size asm("d0")) {
+ WRITELONG(PI_PTR1, (unsigned int)src);
+ WRITELONG(PI_PTR2, (unsigned int)dst);
+ WRITELONG(PI_CMD_MEMCPY_Q, size);
+}
+
int leave(int x)
{
Forbid();
oldCopyMemPtr = (APTR)SetFunction((struct Library *)SysBase, -0x270, pi_CopyMem);
- oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMem);
+ oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMemQuick);
+ //oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMem);
do
{