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