]> git.sesse.net Git - pistorm/blob - platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c
10cc3facd03517b143ce5013503cddd533cafc5e
[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 <libraries/expansion.h>
16
17 #include <devices/trackdisk.h>
18 #include <devices/timer.h>
19 #include <devices/scsidisk.h>
20
21 #include <libraries/filehandler.h>
22
23 #include <proto/exec.h>
24 #include <proto/disk.h>
25 #include <clib/expansion_protos.h>
26
27 #ifdef HAS_STDLIB
28 #include <stdio.h>
29 #endif
30
31 unsigned int pistorm_base_addr = 0xFFFFFFFF;
32
33 #define WRITESHORT(cmd, val) *(unsigned short *)((unsigned int)(pistorm_base_addr+cmd)) = val;
34 #define WRITELONG(cmd, val) *(unsigned int *)((unsigned int)(pistorm_base_addr+cmd)) = val;
35 #define WRITEBYTE(cmd, val) *(unsigned char *)((unsigned int)(pistorm_base_addr+cmd)) = val;
36
37 #define READSHORT(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
38 #define READLONG(cmd, var) var = *(volatile unsigned int *)(pistorm_base_addr + cmd);
39 #define READBYTE(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
40
41 #define RETURN_CMDRES READSHORT(PI_CMDRESULT, short_val); return short_val;
42
43 unsigned short short_val;
44
45 unsigned int pi_find_pistorm() {
46     unsigned int board_addr = 0xFFFFFFFF;
47     struct ExpansionBase *expansionbase = (struct ExpansionBase *)OpenLibrary("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     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 // PiSCSI stuff
120 // TODO: There's currently no way to read back what drives are mounted at which SCSI index.
121 unsigned short pi_piscsi_map_drive(char *filename, unsigned char index) {
122         WRITESHORT(PI_WORD1, index);
123         WRITELONG(PI_STR1, (unsigned int)filename);
124         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_MAP);
125
126         RETURN_CMDRES;
127 }
128
129 unsigned short pi_piscsi_unmap_drive(unsigned char index) {
130         WRITESHORT(PI_WORD1, index);
131         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_UNMAP);
132
133         RETURN_CMDRES;
134 }
135
136 // For virtual removable media. Not yet implemented.
137 unsigned short pi_piscsi_insert_media(char *filename, unsigned char index) {
138         WRITESHORT(PI_WORD1, index);
139         WRITELONG(PI_STR1, (unsigned int)filename);
140         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_INSERT);
141
142         RETURN_CMDRES;
143 }
144
145 unsigned short pi_piscsi_eject_media(unsigned char index) {
146         WRITESHORT(PI_WORD1, index);
147         WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_EJECT);
148
149         RETURN_CMDRES;
150 }
151
152 // Config file stuff
153 unsigned short pi_load_config(char *filename) {
154         WRITELONG(PI_STR1, (unsigned int)filename);
155         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_LOAD);
156
157         RETURN_CMDRES;
158 }
159
160 void pi_reload_config() {
161         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_RELOAD);
162 }
163
164 void pi_load_default_config() {
165         WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_DEFAULT);
166 }
167
168 unsigned short pi_handle_config(unsigned char cmd, char *str) {
169         if (cmd == PICFG_LOAD) {
170                 WRITELONG(PI_STR1, (unsigned int)str);
171         }
172         WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
173
174         RETURN_CMDRES;
175 }
176
177 // Simple feature status write functions
178 void pi_enable_rtg(unsigned short val)
179 {
180     WRITESHORT(PI_CMD_RTGSTATUS, val);
181 }
182 void pi_enable_net(unsigned short val)
183 {
184     WRITESHORT(PI_CMD_NETSTATUS, val);
185 }
186 void pi_enable_piscsi(unsigned short val)
187 {
188     WRITESHORT(PI_CMD_PISCSI_CTRL, val);
189 }
190
191 // Generic feature status setting function.
192 // Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG
193 //          pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI
194 void pi_set_feature_status(unsigned short cmd, unsigned char value) {
195         WRITESHORT(cmd, value);
196 }
197
198 #define SIMPLEREAD_SHORT(a, b) \
199     unsigned short a() { READSHORT(b, short_val); return short_val; }
200
201 // Simple feature status read functions
202 unsigned short pi_get_hw_rev()
203 {
204     READSHORT(PI_CMD_HWREV, short_val);
205     return short_val;
206 }
207 unsigned short pi_get_sw_rev()
208 {
209     READSHORT(PI_CMD_SWREV, short_val);
210     return short_val;
211 }
212 unsigned short pi_get_rtg_status()
213 {
214     READSHORT(PI_CMD_RTGSTATUS, short_val);
215     return short_val;
216 }
217 unsigned short pi_get_net_status()
218 {
219     READSHORT(PI_CMD_NETSTATUS, short_val);
220     return short_val;
221 }
222 unsigned short pi_get_piscsi_status()
223 {
224     READSHORT(PI_CMD_PISCSI_CTRL, short_val);
225     return short_val;
226 }
227 unsigned short pi_get_cmd_result()
228 {
229     READSHORT(PI_CMDRESULT, short_val);
230     return short_val;
231 }