From 9f1f1589c178d0a6edfe2ab4668d9f2c4caac002 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Thu, 13 May 2021 19:06:40 +0200 Subject: [PATCH] Add makeshift PiStorm-powered CopyMem/Quick patcher Probably doesn't work properly with MMU libraries installed, be advised. --- platforms/amiga/pistorm-dev/pistorm-dev.c | 1 - .../pistorm-dev/pistorm_dev_amiga/CopyMems | Bin 0 -> 10032 bytes .../pistorm-dev/pistorm_dev_amiga/build.sh | 1 + .../pistorm-dev/pistorm_dev_amiga/copymems.c | 99 ++++++++++++++++++ 4 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 platforms/amiga/pistorm-dev/pistorm_dev_amiga/CopyMems create mode 100644 platforms/amiga/pistorm-dev/pistorm_dev_amiga/copymems.c 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 0000000000000000000000000000000000000000..d5cfe29d6e852c8a8531ee75f2af4f724ac5d714 GIT binary patch literal 10032 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 D?TT3b literal 0 HcmV?d00001 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)); +} -- 2.39.2