]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/copymems.c
Fix PiStorm dev memcpy, correct extern gayle_emulation_enabled type
[pistorm] / platforms / amiga / pistorm-dev / pistorm_dev_amiga / copymems.c
1 #include <clib/exec_protos.h>
2 #include <clib/intuition_protos.h>
3 #include <clib/utility_protos.h>
4 #include <clib/graphics_protos.h>
5
6 #include <exec/types.h>
7 #include <exec/resident.h>
8 #include <exec/errors.h>
9 #include <exec/memory.h>
10 #include <exec/lists.h>
11 #include <exec/alerts.h>
12 #include <exec/tasks.h>
13 #include <exec/io.h>
14 #include <exec/execbase.h>
15
16 #include <intuition/intuition.h>
17 #include <intuition/screens.h>
18
19 #include <graphics/displayinfo.h>
20 #include "pistorm_dev.h"
21 #include "../pistorm-dev-enums.h"
22
23 #include <dos/dos.h>
24 #include <stdio.h>
25
26 struct ExecBase *SysBase;
27
28 char *oldtaskname;
29 struct Task *task;
30
31 void (*oldCopyMem)(unsigned char *asm("a0"), unsigned char *asm("a1"), unsigned int asm("d0"));
32 void (*oldCopyMemQuick)(unsigned char *asm("a0"), unsigned char *asm("a1"), unsigned int asm("d0"));
33 APTR oldCopyMemPtr;
34 APTR oldCopyMemQuickPtr;
35
36 struct Screen *(*oldOpenScreenTagList)(struct NewScreen *n asm("a0"), struct TagItem *asm("a1"));
37 struct Screen *(*oldOpenScreen)(struct NewScreen *asm("a0"));
38
39 #define NORM_MONITOR_ID ((options.bits.norm_mon==1)?(PAL_MONITOR_ID):((options.bits.norm_mon==2)?(NTSC_MONITOR_ID):(DEFAULT_MONITOR_ID)))
40 #define AUTO_MONITOR_ID ((options.bits.auto_mon==0)?(PAL_MONITOR_ID):((options.bits.auto_mon==1)?(NTSC_MONITOR_ID):(DEFAULT_MONITOR_ID)))
41
42 extern unsigned int pistorm_base_addr;
43 #define WRITELONG(cmd, val) *(volatile unsigned int *)((unsigned int)(pistorm_base_addr+cmd)) = val;
44
45 void pi_CopyMem(unsigned char *src asm("a0"), unsigned char *dst asm("a1"), unsigned int size asm("d0")) {
46         WRITELONG(PI_PTR1, (unsigned int)src);
47         WRITELONG(PI_PTR2, (unsigned int)dst);
48         WRITELONG(PI_CMD_MEMCPY, size);
49 }
50
51 void pi_CopyMemQuick(unsigned char *src asm("a0"), unsigned char *dst asm("a1"), unsigned int size asm("d0")) {
52         WRITELONG(PI_PTR1, (unsigned int)src);
53         WRITELONG(PI_PTR2, (unsigned int)dst);
54         WRITELONG(PI_CMD_MEMCPY_Q, size);
55 }
56
57 int leave(int x)
58 {
59     Forbid();
60     task->tc_Node.ln_Name = oldtaskname;
61     Permit();
62     return(x);
63 }
64
65 ULONG pistorm_addr = 0xFFFFFFFF;
66
67 int main(int argc,char *argv[])
68 {
69     char *task_name = "PiMems  ";
70     SysBase = *(struct ExecBase **)4L;
71
72     unsigned char no_quit = 1;
73
74     task = (struct Task *)FindTask((STRPTR)&task_name);
75
76     if(task)
77         return(0);
78
79     task = (struct Task *)FindTask(NULL);
80     oldtaskname = task->tc_Node.ln_Name;
81
82     Forbid();
83     task->tc_Node.ln_Name = (char *)&task_name;
84     Permit();
85
86     pistorm_addr = pi_find_pistorm();
87     if (pistorm_addr == 0xFFFFFFFF) {
88         printf("We dead!\n");
89         return(leave(50));
90     } else {
91         pistorm_base_addr = pistorm_addr;
92     }
93
94     oldCopyMemPtr = (APTR)SetFunction((struct Library *)SysBase, -0x270, pi_CopyMem);
95     
96     oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMemQuick);
97     //oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMem);
98
99     do
100     {
101         Wait(SIGBREAKF_CTRL_C);
102     }
103     while(no_quit);
104
105     return(leave(0));
106 }