]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c
Get rid of having to manually set pistorm_base_addr for PiStorm device SDK
[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/types.h>
6 #include <exec/resident.h>
7 #include <exec/errors.h>
8 #include <exec/memory.h>
9 #include <exec/lists.h>
10 #include <exec/alerts.h>
11 #include <exec/tasks.h>
12 #include <exec/io.h>
13 #include <exec/execbase.h>
14
15 #include <devices/trackdisk.h>
16 #include <devices/timer.h>
17 #include <devices/scsidisk.h>
18
19 #include <libraries/filehandler.h>
20
21 #include <proto/exec.h>
22 #include <proto/disk.h>
23 #include <clib/expansion_protos.h>
24
25 #ifdef HAS_STDLIB
26 #include <stdio.h>
27 #endif
28
29 unsigned int pistorm_base_addr = 0xFFFFFFFF;
30
31 #define WRITESHORT(cmd, val) *(unsigned short *)((unsigned int)(pistorm_base_addr+cmd)) = val;
32 #define WRITELONG(cmd, val) *(unsigned int *)((unsigned int)(pistorm_base_addr+cmd)) = val;
33 #define WRITEBYTE(cmd, val) *(unsigned char *)((unsigned int)(pistorm_base_addr+cmd)) = val;
34
35 #define READSHORT(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
36 #define READLONG(cmd, var) var = *(volatile unsigned int *)(pistorm_base_addr + cmd);
37 #define READBYTE(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
38
39 #define RETURN_CMDRES READSHORT(PI_CMDRESULT, short_val); return short_val;
40
41 unsigned short short_val;
42 unsigned int long_val;
43
44 unsigned int pi_find_pistorm(void) {
45     unsigned int board_addr = 0xFFFFFFFF;
46     struct ExpansionBase *expansionbase = (struct ExpansionBase *)OpenLibrary((STRPTR)"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         pistorm_base_addr = board_addr;
61     return board_addr;
62 }
63
64 void pi_reset_amiga(unsigned short reset_code) {
65     WRITESHORT(PI_CMD_RESET, reset_code);
66 }
67
68 unsigned short pi_shutdown_pi(unsigned short shutdown_code) {
69         WRITESHORT(PI_CMD_SHUTDOWN, shutdown_code);
70
71         RETURN_CMDRES;
72 }
73
74 unsigned short pi_confirm_shutdown(unsigned short shutdown_code) {
75         WRITESHORT(PI_CMD_CONFIRMSHUTDOWN, shutdown_code);
76
77         RETURN_CMDRES;
78 }
79
80 // Kickstart/Extended ROM stuff
81 unsigned short pi_remap_kickrom(char *filename) {
82         WRITELONG(PI_STR1, (unsigned int)filename);
83         WRITESHORT(PI_CMD_KICKROM, 1);
84
85         RETURN_CMDRES;
86 }
87
88 unsigned short pi_remap_extrom(char *filename) {
89         WRITELONG(PI_STR1, (unsigned int)filename);
90         WRITESHORT(PI_CMD_EXTROM, 1);
91
92         RETURN_CMDRES;
93 }
94
95 // File operation things
96 unsigned short pi_get_filesize(char *filename, unsigned int *file_size) {
97         WRITELONG(PI_STR1, (unsigned int)filename);
98         READLONG(PI_CMD_FILESIZE, *file_size);
99
100         RETURN_CMDRES;
101 }
102
103 unsigned short pi_transfer_file(char *filename, unsigned char *dest_ptr) {
104         WRITELONG(PI_STR1, (unsigned int)filename);
105         WRITELONG(PI_PTR1, (unsigned int)dest_ptr);
106         WRITESHORT(PI_CMD_TRANSFERFILE, 1);
107
108         RETURN_CMDRES;
109 }
110
111 unsigned short pi_memcpy(unsigned char *dst, unsigned char *src, unsigned int size) {
112         WRITELONG(PI_PTR1, (unsigned int)src);
113         WRITELONG(PI_PTR2, (unsigned int)dst);
114         WRITELONG(PI_CMD_MEMCPY, size);
115
116         RETURN_CMDRES;
117 }
118
119 unsigned short pi_memset(unsigned char *dst, unsigned char val, unsigned int size) {
120         WRITELONG(PI_PTR1, (unsigned int)dst);
121         WRITEBYTE(PI_BYTE1, val);
122         WRITELONG(PI_CMD_MEMSET, size);
123
124         RETURN_CMDRES;
125 }
126
127 // Generic memory copyrect, assuming that the src/dst offsets are already adjusted for X/Y coordinates.
128 void pi_copyrect(unsigned char *dst, unsigned char *src,
129                                  unsigned short src_pitch, unsigned short dst_pitch,
130                                  unsigned short w, unsigned short h) {
131         WRITELONG(PI_PTR1, (unsigned int)src);
132         WRITELONG(PI_PTR2, (unsigned int)dst);
133         WRITESHORT(PI_WORD1, src_pitch);
134         WRITESHORT(PI_WORD2, dst_pitch);
135         WRITESHORT(PI_WORD3, w);
136         WRITESHORT(PI_WORD4, h);
137
138         WRITESHORT(PI_CMD_COPYRECT, 1);
139 }
140
141 // Extended memory copyrect, allowing specifying of source/dest X/Y coordinates.
142 void pi_copyrect_ex(unsigned char *dst, unsigned char *src,
143                                         unsigned short src_pitch, unsigned short dst_pitch,
144                                         unsigned short src_x, unsigned short src_y,
145                                         unsigned short dst_x, unsigned short dst_y,
146                                         unsigned short w, unsigned short h) {
147         WRITELONG(PI_PTR1, (unsigned int)src);
148         WRITELONG(PI_PTR2, (unsigned int)dst);
149         WRITESHORT(PI_WORD1, src_pitch);
150         WRITESHORT(PI_WORD2, dst_pitch);
151         WRITESHORT(PI_WORD3, w);
152         WRITESHORT(PI_WORD4, h);
153
154         WRITESHORT(PI_WORD5, src_x);
155         WRITESHORT(PI_WORD6, src_y);
156         WRITESHORT(PI_WORD7, dst_x);
157         WRITESHORT(PI_WORD8, dst_y);
158
159         WRITESHORT(PI_CMD_COPYRECT_EX, 1);
160 }
161
162 // PiSCSI stuff
163 // TODO: There's currently no way to read back what drives are mounted at which SCSI index.
164 unsigned short pi_piscsi_map_drive(char *filename, unsigned char index) {
165         WRITESHORT(PI_WORD1, index);
166         WRITELONG(PI_STR1, (unsigned int)filename);
167         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_MAP);
168
169         RETURN_CMDRES;
170 }
171
172 unsigned short pi_piscsi_unmap_drive(unsigned char index) {
173         WRITESHORT(PI_WORD1, index);
174         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_UNMAP);
175
176         RETURN_CMDRES;
177 }
178
179 // For virtual removable media. Not yet implemented.
180 unsigned short pi_piscsi_insert_media(char *filename, unsigned char index) {
181         WRITESHORT(PI_WORD1, index);
182         WRITELONG(PI_STR1, (unsigned int)filename);
183         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_INSERT);
184
185         RETURN_CMDRES;
186 }
187
188 unsigned short pi_piscsi_eject_media(unsigned char index) {
189         WRITESHORT(PI_WORD1, index);
190         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_EJECT);
191
192         RETURN_CMDRES;
193 }
194
195 // Config file stuff
196 unsigned short pi_load_config(char *filename) {
197         WRITELONG(PI_STR1, (unsigned int)filename);
198         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_LOAD);
199
200         RETURN_CMDRES;
201 }
202
203 void pi_reload_config(void) {
204         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_RELOAD);
205 }
206
207 void pi_load_default_config(void) {
208         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_DEFAULT);
209 }
210
211 unsigned short pi_handle_config(unsigned char cmd, char *str) {
212         if (cmd == PICFG_LOAD) {
213                 WRITELONG(PI_STR1, (unsigned int)str);
214         }
215         WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
216
217         RETURN_CMDRES;
218 }
219
220 // Simple feature status write functions
221 void pi_enable_rtg(unsigned short val)
222 {
223     WRITESHORT(PI_CMD_RTGSTATUS, val);
224 }
225 void pi_enable_net(unsigned short val)
226 {
227     WRITESHORT(PI_CMD_NETSTATUS, val);
228 }
229 void pi_enable_piscsi(unsigned short val)
230 {
231     WRITESHORT(PI_CMD_PISCSI_CTRL, val);
232 }
233
234 // Generic feature status setting function.
235 // Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG
236 //          pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI
237 void pi_set_feature_status(unsigned short cmd, unsigned char value) {
238         WRITESHORT(cmd, value);
239 }
240
241 #define SIMPLEREAD_SHORT(a, b) \
242     unsigned short a(void) { READSHORT(b, short_val); return short_val; }
243
244 unsigned int pi_get_fb(void) {
245         READLONG(PI_CMD_GET_FB, long_val);
246         return long_val;
247 }
248
249 // Simple feature status read functions
250 unsigned short pi_get_hw_rev(void)
251 {
252     READSHORT(PI_CMD_HWREV, short_val);
253     return short_val;
254 }
255 unsigned short pi_get_sw_rev(void)
256 {
257     READSHORT(PI_CMD_SWREV, short_val);
258     return short_val;
259 }
260 unsigned short pi_get_rtg_status(void)
261 {
262     READSHORT(PI_CMD_RTGSTATUS, short_val);
263     return short_val;
264 }
265 unsigned short pi_get_net_status(void)
266 {
267     READSHORT(PI_CMD_NETSTATUS, short_val);
268     return short_val;
269 }
270 unsigned short pi_get_piscsi_status(void)
271 {
272     READSHORT(PI_CMD_PISCSI_CTRL, short_val);
273     return short_val;
274 }
275 unsigned short pi_get_cmd_result(void)
276 {
277     READSHORT(PI_CMDRESULT, short_val);
278     return short_val;
279 }