]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c
The remainder of the initial PiStorm interaction stuff (I think)
[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 #define RETURN_CMDRES READSHORT(PI_CMDRESULT, short_val); return short_val;
41
42 unsigned short short_val;
43
44 unsigned int pi_find_pistorm() {
45     unsigned int board_addr = 0xFFFFFFFF;
46     struct ExpansionBase *expansionbase = (struct ExpansionBase *)OpenLibrary("expansion.library", 0L);
47         
48     if (expansionbase == NULL) {
49 #ifdef HAS_STDLIB
50             printf("Failed to open expansion.library.\n");
51 #endif
52         }
53         else {
54                 struct ConfigDev* cd = NULL;
55                 cd = (struct ConfigDev*)FindConfigDev(cd, 2011, 0x6B);
56                 if (cd != NULL)
57                         board_addr = (unsigned int)cd->cd_BoardAddr;
58         CloseLibrary((struct Library *)expansionbase);
59         }
60     return board_addr;
61 }
62
63 void pi_reset_amiga(unsigned short reset_code) {
64     WRITESHORT(PI_CMD_RESET, reset_code);
65 }
66
67 // Kickstart/Extended ROM stuff
68 unsigned short pi_remap_kickrom(char *filename) {
69         WRITELONG(PI_STR1, (unsigned int)filename);
70         WRITESHORT(PI_CMD_KICKROM, 1);
71
72         RETURN_CMDRES;
73 }
74
75 unsigned short pi_remap_extrom(char *filename) {
76         WRITELONG(PI_STR1, (unsigned int)filename);
77         WRITESHORT(PI_CMD_EXTROM, 1);
78
79         RETURN_CMDRES;
80 }
81
82 // PiSCSI stuff
83 // TODO: There's currently no way to read back what drives are mounted at which SCSI index.
84 unsigned short pi_piscsi_map_drive(char *filename, unsigned char index) {
85         WRITESHORT(PI_WORD1, index);
86         WRITELONG(PI_STR1, (unsigned int)filename);
87         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_MAP);
88
89         RETURN_CMDRES;
90 }
91
92 unsigned short pi_piscsi_unmap_drive(unsigned char index) {
93         WRITESHORT(PI_WORD1, index);
94         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_UNMAP);
95
96         RETURN_CMDRES;
97 }
98
99 // For virtual removable media. Not yet implemented.
100 unsigned short pi_piscsi_insert_media(char *filename, unsigned char index) {
101         WRITESHORT(PI_WORD1, index);
102         WRITELONG(PI_STR1, (unsigned int)filename);
103         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_INSERT);
104
105         RETURN_CMDRES;
106 }
107
108 unsigned short pi_piscsi_eject_media(unsigned char index) {
109         WRITESHORT(PI_WORD1, index);
110         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_EJECT);
111
112         RETURN_CMDRES;
113 }
114
115 // Config file stuff
116 unsigned short pi_load_config(char *filename) {
117         WRITELONG(PI_STR1, (unsigned int)filename);
118         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_LOAD);
119
120         RETURN_CMDRES;
121 }
122
123 void pi_reload_config() {
124         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_RELOAD);
125 }
126
127 void pi_load_default_config() {
128         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_DEFAULT);
129 }
130
131 unsigned short pi_handle_config(unsigned char cmd, char *str) {
132         if (cmd == PICFG_LOAD) {
133                 WRITELONG(PI_STR1, (unsigned int)str);
134         }
135         WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
136
137         RETURN_CMDRES;
138 }
139
140 // Generic stuff
141 #define SIMPLEWRITE_SHORT(a, b) \
142     void a(unsigned short val) { WRITESHORT(b, val); }
143
144 // Simple feature status write functions
145 SIMPLEWRITE_SHORT(pi_enable_rtg, PI_CMD_RTGSTATUS);
146 SIMPLEWRITE_SHORT(pi_enable_net, PI_CMD_NETSTATUS);
147 SIMPLEWRITE_SHORT(pi_enable_piscsi, PI_CMD_RTGSTATUS);
148
149 // Generic feature status setting function.
150 // Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG
151 //          pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI
152 void pi_set_feature_status(unsigned short cmd, unsigned char value) {
153         WRITESHORT(cmd, value);
154 }
155
156 #define SIMPLEREAD_SHORT(a, b) \
157     unsigned short a() { READSHORT(b, short_val); return short_val; }
158
159 // Simple feature status read functions
160 SIMPLEREAD_SHORT(pi_get_hw_rev, PI_CMD_HWREV);
161 SIMPLEREAD_SHORT(pi_get_sw_rev, PI_CMD_SWREV);
162 SIMPLEREAD_SHORT(pi_get_rtg_status, PI_CMD_RTGSTATUS);
163 SIMPLEREAD_SHORT(pi_get_net_status, PI_CMD_NETSTATUS);
164 SIMPLEREAD_SHORT(pi_get_piscsi_status, PI_CMD_PISCSI_CTRL);
165 SIMPLEREAD_SHORT(pi_get_cmd_result, PI_CMDRESULT);