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