From: beeanyew Date: Thu, 13 May 2021 17:06:40 +0000 (+0200) Subject: Add makeshift PiStorm-powered CopyMem/Quick patcher X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=9f1f1589c178d0a6edfe2ab4668d9f2c4caac002;p=pistorm Add makeshift PiStorm-powered CopyMem/Quick patcher Probably doesn't work properly with MMU libraries installed, be advised. --- diff --git a/platforms/amiga/pistorm-dev/pistorm-dev.c b/platforms/amiga/pistorm-dev/pistorm-dev.c index 622eec4..6f25da4 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev.c +++ b/platforms/amiga/pistorm-dev/pistorm-dev.c @@ -197,7 +197,6 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { uint8_t *dst_ptr = &cfg->map_data[dst][(pi_ptr[1] - cfg->map_offset[dst])]; memcpy(dst_ptr, src_ptr, val); } else { - printf("!!! doing manual memcpy\n"); uint8_t tmp = 0; for (uint32_t i = 0; i < val; i++) { if (src == -1) tmp = (unsigned char)m68k_read_memory_8(pi_ptr[0] + i); diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/CopyMems b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/CopyMems new file mode 100644 index 0000000..d5cfe29 Binary files /dev/null and b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/CopyMems differ diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh index 99fed1c..be0c259 100755 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh @@ -1 +1,2 @@ m68k-amigaos-gcc pistorm_dev.c simple_interact.c -mregparm -m68020 -O2 -o PiSimple -Wno-unused-parameter -noixemul -DHAS_STDLIB -Wall +m68k-amigaos-gcc pistorm_dev.c copymems.c -m68020 -O2 -o CopyMems -Wno-unused-parameter -noixemul -DHAS_STDLIB -Wall -Wall -Wpedantic diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/copymems.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/copymems.c new file mode 100644 index 0000000..973a66e --- /dev/null +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/copymems.c @@ -0,0 +1,99 @@ +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include +#include "pistorm_dev.h" +#include "../pistorm-dev-enums.h" + +#include +#include + +struct ExecBase *SysBase; + +char *oldtaskname; +struct Task *task; + +void (*oldCopyMem)(unsigned char *asm("a0"), unsigned char *asm("a1"), unsigned int asm("d0")); +void (*oldCopyMemQuick)(unsigned char *asm("a0"), unsigned char *asm("a1"), unsigned int asm("d0")); +APTR oldCopyMemPtr; +APTR oldCopyMemQuickPtr; + +struct Screen *(*oldOpenScreenTagList)(struct NewScreen *n asm("a0"), struct TagItem *asm("a1")); +struct Screen *(*oldOpenScreen)(struct NewScreen *asm("a0")); + +#define NORM_MONITOR_ID ((options.bits.norm_mon==1)?(PAL_MONITOR_ID):((options.bits.norm_mon==2)?(NTSC_MONITOR_ID):(DEFAULT_MONITOR_ID))) +#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; + +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_PTR2, (unsigned int)dst); + WRITELONG(PI_CMD_MEMCPY, size); +} + +int leave(int x) +{ + Forbid(); + task->tc_Node.ln_Name = oldtaskname; + Permit(); + return(x); +} + +ULONG pistorm_addr = 0xFFFFFFFF; + +int main(int argc,char *argv[]) +{ + char *task_name = "PiMems "; + SysBase = *(struct ExecBase **)4L; + + unsigned char no_quit = 1; + + task = (struct Task *)FindTask((STRPTR)&task_name); + + if(task) + return(0); + + task = (struct Task *)FindTask(NULL); + oldtaskname = task->tc_Node.ln_Name; + + Forbid(); + task->tc_Node.ln_Name = (char *)&task_name; + Permit(); + + pistorm_addr = pi_find_pistorm(); + if (pistorm_addr == 0xFFFFFFFF) { + printf("We dead!\n"); + return(leave(50)); + } else { + pistorm_base_addr = pistorm_addr; + } + + oldCopyMemPtr = (APTR)SetFunction((struct Library *)SysBase, -0x270, pi_CopyMem); + + oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMem); + + do + { + Wait(SIGBREAKF_CTRL_C); + } + while(no_quit); + + return(leave(0)); +}