]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c
7bdddaeb70acc8f2292ee7e85e4369f9fa88e771
[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     return board_addr;
61 }
62
63 void pi_reset_amiga(unsigned short reset_code) {
64     WRITESHORT(PI_CMD_RESET, reset_code);
65 }
66
67 unsigned short pi_shutdown_pi(unsigned short shutdown_code) {
68         WRITESHORT(PI_CMD_SHUTDOWN, shutdown_code);
69
70         RETURN_CMDRES;
71 }
72
73 unsigned short pi_confirm_shutdown(unsigned short shutdown_code) {
74         WRITESHORT(PI_CMD_CONFIRMSHUTDOWN, shutdown_code);
75
76         RETURN_CMDRES;
77 }
78
79 // Kickstart/Extended ROM stuff
80 unsigned short pi_remap_kickrom(char *filename) {
81         WRITELONG(PI_STR1, (unsigned int)filename);
82         WRITESHORT(PI_CMD_KICKROM, 1);
83
84         RETURN_CMDRES;
85 }
86
87 unsigned short pi_remap_extrom(char *filename) {
88         WRITELONG(PI_STR1, (unsigned int)filename);
89         WRITESHORT(PI_CMD_EXTROM, 1);
90
91         RETURN_CMDRES;
92 }
93
94 // File operation things
95 unsigned short pi_get_filesize(char *filename, unsigned int *file_size) {
96         WRITELONG(PI_STR1, (unsigned int)filename);
97         READLONG(PI_CMD_FILESIZE, *file_size);
98
99         RETURN_CMDRES;
100 }
101
102 unsigned short pi_transfer_file(char *filename, unsigned char *dest_ptr) {
103         WRITELONG(PI_STR1, (unsigned int)filename);
104         WRITELONG(PI_PTR1, (unsigned int)dest_ptr);
105         WRITESHORT(PI_CMD_TRANSFERFILE, 1);
106
107         RETURN_CMDRES;
108 }
109
110 unsigned short pi_memcpy(unsigned char *dst, unsigned char *src, unsigned int size) {
111         WRITELONG(PI_PTR1, (unsigned int)src);
112         WRITELONG(PI_PTR2, (unsigned int)dst);
113         WRITELONG(PI_CMD_MEMCPY, size);
114
115         RETURN_CMDRES;
116 }
117
118 // PiSCSI stuff
119 // TODO: There's currently no way to read back what drives are mounted at which SCSI index.
120 unsigned short pi_piscsi_map_drive(char *filename, unsigned char index) {
121         WRITESHORT(PI_WORD1, index);
122         WRITELONG(PI_STR1, (unsigned int)filename);
123         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_MAP);
124
125         RETURN_CMDRES;
126 }
127
128 unsigned short pi_piscsi_unmap_drive(unsigned char index) {
129         WRITESHORT(PI_WORD1, index);
130         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_UNMAP);
131
132         RETURN_CMDRES;
133 }
134
135 // For virtual removable media. Not yet implemented.
136 unsigned short pi_piscsi_insert_media(char *filename, unsigned char index) {
137         WRITESHORT(PI_WORD1, index);
138         WRITELONG(PI_STR1, (unsigned int)filename);
139         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_INSERT);
140
141         RETURN_CMDRES;
142 }
143
144 unsigned short pi_piscsi_eject_media(unsigned char index) {
145         WRITESHORT(PI_WORD1, index);
146         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_EJECT);
147
148         RETURN_CMDRES;
149 }
150
151 // Config file stuff
152 unsigned short pi_load_config(char *filename) {
153         WRITELONG(PI_STR1, (unsigned int)filename);
154         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_LOAD);
155
156         RETURN_CMDRES;
157 }
158
159 void pi_reload_config(void) {
160         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_RELOAD);
161 }
162
163 void pi_load_default_config(void) {
164         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_DEFAULT);
165 }
166
167 unsigned short pi_handle_config(unsigned char cmd, char *str) {
168         if (cmd == PICFG_LOAD) {
169                 WRITELONG(PI_STR1, (unsigned int)str);
170         }
171         WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
172
173         RETURN_CMDRES;
174 }
175
176 // Simple feature status write functions
177 void pi_enable_rtg(unsigned short val)
178 {
179     WRITESHORT(PI_CMD_RTGSTATUS, val);
180 }
181 void pi_enable_net(unsigned short val)
182 {
183     WRITESHORT(PI_CMD_NETSTATUS, val);
184 }
185 void pi_enable_piscsi(unsigned short val)
186 {
187     WRITESHORT(PI_CMD_PISCSI_CTRL, val);
188 }
189
190 // Generic feature status setting function.
191 // Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG
192 //          pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI
193 void pi_set_feature_status(unsigned short cmd, unsigned char value) {
194         WRITESHORT(cmd, value);
195 }
196
197 #define SIMPLEREAD_SHORT(a, b) \
198     unsigned short a(void) { READSHORT(b, short_val); return short_val; }
199
200 unsigned int pi_get_fb(void) {
201         READLONG(PI_CMD_GET_FB, long_val);
202         return long_val;
203 }
204
205 // Simple feature status read functions
206 unsigned short pi_get_hw_rev(void)
207 {
208     READSHORT(PI_CMD_HWREV, short_val);
209     return short_val;
210 }
211 unsigned short pi_get_sw_rev(void)
212 {
213     READSHORT(PI_CMD_SWREV, short_val);
214     return short_val;
215 }
216 unsigned short pi_get_rtg_status(void)
217 {
218     READSHORT(PI_CMD_RTGSTATUS, short_val);
219     return short_val;
220 }
221 unsigned short pi_get_net_status(void)
222 {
223     READSHORT(PI_CMD_NETSTATUS, short_val);
224     return short_val;
225 }
226 unsigned short pi_get_piscsi_status(void)
227 {
228     READSHORT(PI_CMD_PISCSI_CTRL, short_val);
229     return short_val;
230 }
231 unsigned short pi_get_cmd_result(void)
232 {
233     READSHORT(PI_CMDRESULT, short_val);
234     return short_val;
235 }