1 // SPDX-License-Identifier: MIT
3 #include "../pistorm-dev-enums.h"
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>
13 #include <exec/execbase.h>
15 #include <devices/trackdisk.h>
16 #include <devices/timer.h>
17 #include <devices/scsidisk.h>
19 #include <libraries/filehandler.h>
21 #include <proto/exec.h>
22 #include <proto/disk.h>
23 #include <clib/expansion_protos.h>
29 unsigned int pistorm_base_addr = 0xFFFFFFFF;
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;
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);
39 #define RETURN_CMDRES READSHORT(PI_CMDRESULT, short_val); return short_val;
41 unsigned short short_val;
42 unsigned int long_val;
44 unsigned int pi_find_pistorm(void) {
45 unsigned int board_addr = 0xFFFFFFFF;
46 struct ExpansionBase *expansionbase = (struct ExpansionBase *)OpenLibrary((STRPTR)"expansion.library", 0L);
48 if (expansionbase == NULL) {
50 printf("Failed to open expansion.library.\n");
54 struct ConfigDev* cd = NULL;
55 cd = (struct ConfigDev*)FindConfigDev(cd, 2011, 0x6B);
57 board_addr = (unsigned int)cd->cd_BoardAddr;
58 CloseLibrary((struct Library *)expansionbase);
63 void pi_reset_amiga(unsigned short reset_code) {
64 WRITESHORT(PI_CMD_RESET, reset_code);
67 unsigned short pi_shutdown_pi(unsigned short shutdown_code) {
68 WRITESHORT(PI_CMD_SHUTDOWN, shutdown_code);
73 unsigned short pi_confirm_shutdown(unsigned short shutdown_code) {
74 WRITESHORT(PI_CMD_CONFIRMSHUTDOWN, shutdown_code);
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);
87 unsigned short pi_remap_extrom(char *filename) {
88 WRITELONG(PI_STR1, (unsigned int)filename);
89 WRITESHORT(PI_CMD_EXTROM, 1);
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);
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);
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);
118 unsigned short pi_memset(unsigned char *dst, unsigned char val, unsigned int size) {
119 WRITELONG(PI_PTR1, (unsigned int)dst);
120 WRITEBYTE(PI_BYTE1, val);
121 WRITELONG(PI_CMD_MEMSET, size);
126 // Generic memory copyrect, assuming that the src/dst offsets are already adjusted for X/Y coordinates.
127 void pi_copyrect(unsigned char *dst, unsigned char *src,
128 unsigned short src_pitch, unsigned short dst_pitch,
129 unsigned short w, unsigned short h) {
130 WRITELONG(PI_PTR1, (unsigned int)src);
131 WRITELONG(PI_PTR2, (unsigned int)dst);
132 WRITESHORT(PI_WORD1, src_pitch);
133 WRITESHORT(PI_WORD2, dst_pitch);
134 WRITESHORT(PI_WORD3, w);
135 WRITESHORT(PI_WORD4, h);
137 WRITESHORT(PI_CMD_COPYRECT, 1);
140 // Extended memory copyrect, allowing specifying of source/dest X/Y coordinates.
141 void pi_copyrect_ex(unsigned char *dst, unsigned char *src,
142 unsigned short src_pitch, unsigned short dst_pitch,
143 unsigned short src_x, unsigned short src_y,
144 unsigned short dst_x, unsigned short dst_y,
145 unsigned short w, unsigned short h) {
146 WRITELONG(PI_PTR1, (unsigned int)src);
147 WRITELONG(PI_PTR2, (unsigned int)dst);
148 WRITESHORT(PI_WORD1, src_pitch);
149 WRITESHORT(PI_WORD2, dst_pitch);
150 WRITESHORT(PI_WORD3, w);
151 WRITESHORT(PI_WORD4, h);
153 WRITESHORT(PI_WORD5, src_x);
154 WRITESHORT(PI_WORD6, src_y);
155 WRITESHORT(PI_WORD7, dst_x);
156 WRITESHORT(PI_WORD8, dst_y);
158 WRITESHORT(PI_CMD_COPYRECT_EX, 1);
162 // TODO: There's currently no way to read back what drives are mounted at which SCSI index.
163 unsigned short pi_piscsi_map_drive(char *filename, unsigned char index) {
164 WRITESHORT(PI_WORD1, index);
165 WRITELONG(PI_STR1, (unsigned int)filename);
166 WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_MAP);
171 unsigned short pi_piscsi_unmap_drive(unsigned char index) {
172 WRITESHORT(PI_WORD1, index);
173 WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_UNMAP);
178 // For virtual removable media. Not yet implemented.
179 unsigned short pi_piscsi_insert_media(char *filename, unsigned char index) {
180 WRITESHORT(PI_WORD1, index);
181 WRITELONG(PI_STR1, (unsigned int)filename);
182 WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_INSERT);
187 unsigned short pi_piscsi_eject_media(unsigned char index) {
188 WRITESHORT(PI_WORD1, index);
189 WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_EJECT);
195 unsigned short pi_load_config(char *filename) {
196 WRITELONG(PI_STR1, (unsigned int)filename);
197 WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_LOAD);
202 void pi_reload_config(void) {
203 WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_RELOAD);
206 void pi_load_default_config(void) {
207 WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_DEFAULT);
210 unsigned short pi_handle_config(unsigned char cmd, char *str) {
211 if (cmd == PICFG_LOAD) {
212 WRITELONG(PI_STR1, (unsigned int)str);
214 WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
219 // Simple feature status write functions
220 void pi_enable_rtg(unsigned short val)
222 WRITESHORT(PI_CMD_RTGSTATUS, val);
224 void pi_enable_net(unsigned short val)
226 WRITESHORT(PI_CMD_NETSTATUS, val);
228 void pi_enable_piscsi(unsigned short val)
230 WRITESHORT(PI_CMD_PISCSI_CTRL, val);
233 // Generic feature status setting function.
234 // Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG
235 // pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI
236 void pi_set_feature_status(unsigned short cmd, unsigned char value) {
237 WRITESHORT(cmd, value);
240 #define SIMPLEREAD_SHORT(a, b) \
241 unsigned short a(void) { READSHORT(b, short_val); return short_val; }
243 unsigned int pi_get_fb(void) {
244 READLONG(PI_CMD_GET_FB, long_val);
248 // Simple feature status read functions
249 unsigned short pi_get_hw_rev(void)
251 READSHORT(PI_CMD_HWREV, short_val);
254 unsigned short pi_get_sw_rev(void)
256 READSHORT(PI_CMD_SWREV, short_val);
259 unsigned short pi_get_rtg_status(void)
261 READSHORT(PI_CMD_RTGSTATUS, short_val);
264 unsigned short pi_get_net_status(void)
266 READSHORT(PI_CMD_NETSTATUS, short_val);
269 unsigned short pi_get_piscsi_status(void)
271 READSHORT(PI_CMD_PISCSI_CTRL, short_val);
274 unsigned short pi_get_cmd_result(void)
276 READSHORT(PI_CMDRESULT, short_val);