#define READLONG(cmd, var) var = *(volatile unsigned int *)(pistorm_base_addr + cmd);
#define READBYTE(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
+#define RETURN_CMDRES READSHORT(PI_CMDRESULT, short_val); return short_val;
+
unsigned short short_val;
unsigned int pi_find_pistorm() {
WRITESHORT(PI_CMD_RESET, reset_code);
}
-void pi_handle_config(unsigned char cmd, char *str) {
+// Kickstart/Extended ROM stuff
+unsigned short pi_remap_kickrom(char *filename) {
+ WRITELONG(PI_STR1, (unsigned int)filename);
+ WRITESHORT(PI_CMD_KICKROM, 1);
+
+ RETURN_CMDRES;
+}
+
+unsigned short pi_remap_extrom(char *filename) {
+ WRITELONG(PI_STR1, (unsigned int)filename);
+ WRITESHORT(PI_CMD_EXTROM, 1);
+
+ RETURN_CMDRES;
+}
+
+// PiSCSI stuff
+// TODO: There's currently no way to read back what drives are mounted at which SCSI index.
+unsigned short pi_piscsi_map_drive(char *filename, unsigned char index) {
+ WRITESHORT(PI_WORD1, index);
+ WRITELONG(PI_STR1, (unsigned int)filename);
+ WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_MAP);
+
+ RETURN_CMDRES;
+}
+
+unsigned short pi_piscsi_unmap_drive(unsigned char index) {
+ WRITESHORT(PI_WORD1, index);
+ WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_UNMAP);
+
+ RETURN_CMDRES;
+}
+
+// For virtual removable media. Not yet implemented.
+unsigned short pi_piscsi_insert_media(char *filename, unsigned char index) {
+ WRITESHORT(PI_WORD1, index);
+ WRITELONG(PI_STR1, (unsigned int)filename);
+ WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_INSERT);
+
+ RETURN_CMDRES;
+}
+
+unsigned short pi_piscsi_eject_media(unsigned char index) {
+ WRITESHORT(PI_WORD1, index);
+ WRITESHORT(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_EJECT);
+
+ RETURN_CMDRES;
+}
+
+// Config file stuff
+unsigned short pi_load_config(char *filename) {
+ WRITELONG(PI_STR1, (unsigned int)filename);
+ WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_LOAD);
+
+ RETURN_CMDRES;
+}
+
+void pi_reload_config() {
+ WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_RELOAD);
+}
+
+void pi_load_default_config() {
+ WRITESHORT(PI_CMD_SWITCHCONFIG, PICFG_DEFAULT);
+}
+
+unsigned short pi_handle_config(unsigned char cmd, char *str) {
if (cmd == PICFG_LOAD) {
WRITELONG(PI_STR1, (unsigned int)str);
}
WRITESHORT(PI_CMD_SWITCHCONFIG, cmd);
+
+ RETURN_CMDRES;
+}
+
+// Generic stuff
+#define SIMPLEWRITE_SHORT(a, b) \
+ void a(unsigned short val) { WRITESHORT(b, val); }
+
+// Simple feature status write functions
+SIMPLEWRITE_SHORT(pi_enable_rtg, PI_CMD_RTGSTATUS);
+SIMPLEWRITE_SHORT(pi_enable_net, PI_CMD_NETSTATUS);
+SIMPLEWRITE_SHORT(pi_enable_piscsi, PI_CMD_RTGSTATUS);
+
+// Generic feature status setting function.
+// Example: pi_set_feature_status(PI_CMD_RTGSTATUS, 1) to enable RTG
+// pi_set_feature_status(PI_CMD_PISCSI_CTRL, PISCSI_CTRL_ENABLE) to enable PiSCSI
+void pi_set_feature_status(unsigned short cmd, unsigned char value) {
+ WRITESHORT(cmd, value);
}
#define SIMPLEREAD_SHORT(a, b) \
unsigned short a() { READSHORT(b, short_val); return short_val; }
+// Simple feature status read functions
SIMPLEREAD_SHORT(pi_get_hw_rev, PI_CMD_HWREV);
SIMPLEREAD_SHORT(pi_get_sw_rev, PI_CMD_SWREV);
SIMPLEREAD_SHORT(pi_get_rtg_status, PI_CMD_RTGSTATUS);
SIMPLEREAD_SHORT(pi_get_net_status, PI_CMD_NETSTATUS);
+SIMPLEREAD_SHORT(pi_get_piscsi_status, PI_CMD_PISCSI_CTRL);
+SIMPLEREAD_SHORT(pi_get_cmd_result, PI_CMDRESULT);