]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c
Add not-so-simple config switching from Amiga side
[pistorm] / platforms / amiga / pistorm-dev / pistorm_dev_amiga / pistorm_dev.c
1 // SPDX-License-Identifier: MIT
2
3 #include "../pistorm-dev-enums.h"
4
5 #include <exec/resident.h>
6 #include <exec/errors.h>
7 #include <exec/memory.h>
8 #include <exec/lists.h>
9 #include <exec/alerts.h>
10 #include <exec/tasks.h>
11 #include <exec/io.h>
12 #include <exec/execbase.h>
13
14 #include <libraries/expansion.h>
15
16 #include <devices/trackdisk.h>
17 #include <devices/timer.h>
18 #include <devices/scsidisk.h>
19
20 #include <dos/filehandler.h>
21
22 #include <proto/exec.h>
23 #include <proto/disk.h>
24 #include <proto/expansion.h>
25
26 #ifdef HAS_STDLIB
27 #include <stdio.h>
28 #endif
29
30 unsigned int pistorm_base_addr = 0xFFFFFFFF;
31
32 #define WRITESHORT(cmd, val) *(unsigned short *)((unsigned int)(pistorm_base_addr+cmd)) = val;
33 #define WRITELONG(cmd, val) *(unsigned int *)((unsigned int)(pistorm_base_addr+cmd)) = val;
34 #define WRITEBYTE(cmd, val) *(unsigned char *)((unsigned int)(pistorm_base_addr+cmd)) = val;
35
36 #define READSHORT(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
37 #define READLONG(cmd, var) var = *(volatile unsigned int *)(pistorm_base_addr + cmd);
38 #define READBYTE(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
39
40 unsigned short short_val;
41
42 unsigned int pi_find_pistorm() {
43     unsigned int board_addr = 0xFFFFFFFF;
44     struct ExpansionBase *expansionbase = (struct ExpansionBase *)OpenLibrary("expansion.library", 0L);
45         
46     if (expansionbase == NULL) {
47 #ifdef HAS_STDLIB
48             printf("Failed to open expansion.library.\n");
49 #endif
50         }
51         else {
52                 struct ConfigDev* cd = NULL;
53                 cd = (struct ConfigDev*)FindConfigDev(cd, 2011, 0x6B);
54                 if (cd != NULL)
55                         board_addr = (unsigned int)cd->cd_BoardAddr;
56         CloseLibrary((struct Library *)expansionbase);
57         }
58     return board_addr;
59 }
60
61 void pi_reset_amiga(unsigned short reset_code) {
62     WRITESHORT(PI_CMD_RESET, reset_code);
63 }
64
65 void pi_handle_config(unsigned char cmd, char *str) {
66         if (cmd == PICFG_LOAD) {
67                 WRITELONG(PI_STR1, (unsigned int)str);
68         }
69         WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
70 }
71
72 #define SIMPLEREAD_SHORT(a, b) \
73     unsigned short a() { READSHORT(b, short_val); return short_val; }
74
75 SIMPLEREAD_SHORT(pi_get_hw_rev, PI_CMD_HWREV);
76 SIMPLEREAD_SHORT(pi_get_sw_rev, PI_CMD_SWREV);
77 SIMPLEREAD_SHORT(pi_get_rtg_status, PI_CMD_RTGSTATUS);
78 SIMPLEREAD_SHORT(pi_get_net_status, PI_CMD_NETSTATUS);