]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/copymems.c
973a66e09578463b9eb91f8bed6a1eebd898f7ae
[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) *(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 int leave(int x)
52 {
53     Forbid();
54     task->tc_Node.ln_Name = oldtaskname;
55     Permit();
56     return(x);
57 }
58
59 ULONG pistorm_addr = 0xFFFFFFFF;
60
61 int main(int argc,char *argv[])
62 {
63     char *task_name = "PiMems  ";
64     SysBase = *(struct ExecBase **)4L;
65
66     unsigned char no_quit = 1;
67
68     task = (struct Task *)FindTask((STRPTR)&task_name);
69
70     if(task)
71         return(0);
72
73     task = (struct Task *)FindTask(NULL);
74     oldtaskname = task->tc_Node.ln_Name;
75
76     Forbid();
77     task->tc_Node.ln_Name = (char *)&task_name;
78     Permit();
79
80     pistorm_addr = pi_find_pistorm();
81     if (pistorm_addr == 0xFFFFFFFF) {
82         printf("We dead!\n");
83         return(leave(50));
84     } else {
85         pistorm_base_addr = pistorm_addr;
86     }
87
88     oldCopyMemPtr = (APTR)SetFunction((struct Library *)SysBase, -0x270, pi_CopyMem);
89     
90     oldCopyMemQuickPtr = (APTR)SetFunction((struct Library *)SysBase, -0x276, pi_CopyMem);
91
92     do
93     {
94         Wait(SIGBREAKF_CTRL_C);
95     }
96     while(no_quit);
97
98     return(leave(0));
99 }