PI_CMD_RESET = 0x00, // [W] Reset the host system.
PI_CMD_SWITCHCONFIG = 0x02, // [W] Switch config file to string at PI_STR1, if it exists.
// This will reset the Amiga if the config loads successfully.
- PI_CMD_PISCSI_CTRL = 0x04, // [W] Control a PiSCSI device. The command written here uses values
- // From various data registers around $2000.
+ PI_CMD_PISCSI_CTRL = 0x04, // [RW] Write: Control a PiSCSI device. The command written here uses
+ // values From various data registers around $2000.
+ // Read: Returns whether PiSCSI is enabled or not.
PI_CMD_RTGSTATUS = 0x06, // [RW] Read: Check RTG status Write: Set RTG status (enabled/disabled)
PI_CMD_NETSTATUS = 0x08, // [RW] Read: Check ETH status Write: Set ETH status (enabled/disabled)
PI_CMD_KICKROM = 0x0A, // [W] Map a different Kickstart ROM to the standard address using
PI_CMD_HWREV = 0x10, // [R] Check the PiStorm hardware version/revision
PI_CMD_SWREV = 0x12, // [R] Check the PiStorm software version/revision
- PI_CMD_QBASIC = 0xFC, // QBasic
- PI_CMD_NIBBLES = 0xFE, // Nibbles
+ PI_CMD_QBASIC = 0x0FFC, // QBasic
+ PI_CMD_NIBBLES = 0x0FFE, // Nibbles
PI_DBG_MSG = 0x1000, // [W] Trigger debug message output to avoid slow serial kprintf.
PI_DBG_VAL1 = 0x1010, // [RW]
#ifdef DEBUG_PISTORM_DEVICE
#define DEBUG printf
+#define PIDEV_SWREV 0x0105
+
static const char *op_type_names[4] = {
"BYTE",
"WORD",
extern uint32_t pistorm_dev_base;
extern uint32_t do_reset;
+extern uint8_t rtg_enabled, rtg_on, pinet_enabled, piscsi_enabled;
+
void handle_pistorm_dev_write(uint32_t addr, uint32_t val, uint8_t type) {
switch((addr & 0xFFFF)) {
case PI_CMD_RESET:
- DEBUG("[PISTORM-DEV] System reset called through PiStorm interaction device, code %.4X\n", (val & 0xFFFF));
+ DEBUG("[PISTORM-DEV] System reset called through PiStorm interaction device, code %d\n", (val & 0xFFFF));
do_reset = 1;
break;
default:
uint32_t handle_pistorm_dev_read(uint32_t addr, uint8_t type) {
switch((addr & 0xFFFF)) {
-
+ case PI_CMD_HWREV:
+ // Probably replace this with some read from the CPLD to get a simple hardware revision.
+ DEBUG("[PISTORM-DEV] %s Read from HWREV\n", op_type_names[type]);
+ return 0x0101; // 1.1
+ break;
+ case PI_CMD_SWREV:
+ DEBUG("[PISTORM-DEV] %s Read from SWREV\n", op_type_names[type]);
+ return PIDEV_SWREV;
+ break;
+ case PI_CMD_RTGSTATUS:
+ DEBUG("[PISTORM-DEV] %s Read from RTGSTATUS\n", op_type_names[type]);
+ return (rtg_on << 1) | rtg_enabled;
+ break;
+ case PI_CMD_NETSTATUS:
+ DEBUG("[PISTORM-DEV] %s Read from NETSTATUS\n", op_type_names[type]);
+ return pinet_enabled;
+ break;
+ case PI_CMD_PISCSI_CTRL:
+ DEBUG("[PISTORM-DEV] %s Read from PISCSI_CTRL\n", op_type_names[type]);
+ return piscsi_enabled;
+ break;
default:
DEBUG("[PISTORM-DEV] WARN: Unhandled %s register read from %.4X\n", op_type_names[type], addr - pistorm_dev_base);
break;
#define READLONG(cmd, var) var = *(volatile unsigned int *)(pistorm_base_addr + cmd);
#define READBYTE(cmd, var) var = *(volatile unsigned short *)(pistorm_base_addr + cmd);
+unsigned short short_val;
+
unsigned int pi_find_pistorm() {
unsigned int board_addr = 0xFFFFFFFF;
struct ExpansionBase *expansionbase = (struct ExpansionBase *)OpenLibrary("expansion.library", 0L);
void pi_reset_amiga(unsigned short reset_code) {
WRITESHORT(PI_CMD_RESET, reset_code);
-}
\ No newline at end of file
+}
+
+#define SIMPLEREAD_SHORT(a, b) \
+ unsigned short a() { READSHORT(b, short_val); return short_val; }
+
+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);
unsigned long pi_find_pistorm();
+unsigned short pi_get_hw_rev();
+unsigned short pi_get_sw_rev();
+unsigned short pi_get_net_status();
+unsigned short pi_get_rtg_status();
+
void pi_reset_amiga(unsigned short reset_code);
tmpshort = (unsigned short)atoi(argv[2]);
pi_reset_amiga(tmpshort);
break;
+ case PI_CMD_SWREV:
+ printf ("PiStorm ----------------------------\n");
+ printf ("Hardware revision: %d.%d\n", (pi_get_hw_rev() >> 8), (pi_get_hw_rev() & 0xFF));
+ printf ("Software revision: %d.%d\n", (pi_get_sw_rev() >> 8), (pi_get_sw_rev() & 0xFF));
+ printf ("RTG: %s - %s\n", (pi_get_rtg_status() & 0x01) ? "Enabled" : "Disabled", (pi_get_rtg_status() & 0x02) ? "In use" : "Not in use");
+ printf ("NET: %s\n", pi_get_net_status() ? "Enabled" : "Disabled");
+ break;
default:
printf ("Unhandled command %s.\n", argv[1]);
return 1;
}
int get_command(char *cmd) {
- if (strcmp(cmd, "--restart") == 0 || strcmp(cmd, "--reboot") || strcmp(cmd, "--reset") == 0) {
+ if (strcmp(cmd, "--restart") == 0 || strcmp(cmd, "--reboot") == 0 || strcmp(cmd, "--reset") == 0) {
return PI_CMD_RESET;
}
+ if (strcmp(cmd, "--check") == 0 || strcmp(cmd, "--find") == 0 || strcmp(cmd, "--info") == 0) {
+ return PI_CMD_SWREV;
+ }
return -1;
}
printf ("Usage: %s --[command] (arguments)\n", exe);
printf ("Example: %s --restart, --reboot or --reset\n", exe);
printf (" Restarts the Amiga.\n");
- printf (" %s --check or --find\n", exe);
+ printf (" %s --check, --find or --info\n", exe);
printf (" Finds the PiStorm device and prints some data.\n");
return;