]> git.sesse.net Git - pistorm/commitdiff
The remainder of the initial PiStorm interaction stuff (I think)
authorbeeanyew <beeanyew@gmail.com>
Fri, 23 Apr 2021 14:03:36 +0000 (16:03 +0200)
committerbeeanyew <beeanyew@gmail.com>
Fri, 23 Apr 2021 14:03:36 +0000 (16:03 +0200)
17 files changed:
config_file/config_file.h
default.cfg
emulator.c
platforms/amiga/amiga-platform.c
platforms/amiga/net/pi-net.c
platforms/amiga/net/pi-net.h
platforms/amiga/piscsi/piscsi.c
platforms/amiga/piscsi/piscsi.h
platforms/amiga/pistorm-dev/pistorm-dev-enums.h
platforms/amiga/pistorm-dev/pistorm-dev.c
platforms/amiga/pistorm-dev/pistorm-dev.h
platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple
platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh
platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c
platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h
platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c
platforms/amiga/rtg/rtg.h

index af2ca630c459260897f7ec44b040368f545f42eb..0f1625cbeb265acd17c28eb7a90d42a59cedb544 100644 (file)
@@ -101,6 +101,7 @@ int handle_mapped_read(struct emulator_config *cfg, unsigned int addr, unsigned
 int handle_mapped_write(struct emulator_config *cfg, unsigned int addr, unsigned int value, unsigned char type);
 int get_named_mapped_item(struct emulator_config *cfg, char *name);
 int get_mapped_item_by_address(struct emulator_config *cfg, uint32_t address);
+void add_mapping(struct emulator_config *cfg, unsigned int type, unsigned int addr, unsigned int size, int mirr_addr, char *filename, char *map_id);
 unsigned int get_int(char *str);
 
 #endif /* _CONFIG_FILE_H */
index 76d49e01156de2fa2f81b3b66615c2507c942a24..552f4a839885f762372df60b4e1f8d53acd8d05e 100644 (file)
@@ -1,9 +1,9 @@
 # Sets CPU type. Valid types are (probably) 68000, 68010, 68020, 68EC020, 68030, 68EC030, 68040, 68EC040, 68LC040 and some STTTT thing.
 cpu 68020
 # Map 512KB kickstart ROM to default offset.
-map type=rom address=0xF80000 size=0x80000 file=kick.rom ovl=0
+map type=rom address=0xF80000 size=0x80000 file=kick.rom ovl=0 id=kickstart
 # Want to map an extended ROM, such as CDTV or CD32?
-#map type=rom address=0xF00000 size=0x80000 file=cdtv.rom
+#map type=rom address=0xF00000 size=0x80000 file=cdtv.rom id=extended
 
 # Map 128MB of Fast RAM at 0x8000000, also known as 32-bit Fast RAM or CPU local Fast RAM.
 # Only supported properly on select Kickstarts, such as 3.1+ for Amiga 1200, 3000 and 4000.
index bbd69f0a6346e4b43cae65863a1813d826505e72..306ae7cf2874236f38baf21f566902fad47b8dc5 100644 (file)
@@ -14,6 +14,7 @@
 #include "platforms/amiga/net/pi-net.h"
 #include "platforms/amiga/net/pi-net-enums.h"
 #include "platforms/amiga/pistorm-dev/pistorm-dev.h"
+#include "platforms/amiga/pistorm-dev/pistorm-dev-enums.h"
 #include "gpio/ps_protocol.h"
 
 #include <assert.h>
@@ -456,6 +457,9 @@ int main(int argc, char *argv[]) {
       } else {
         g++;
         cfg = load_config_file(argv[g]);
+        if (cfg) {
+          set_pistorm_devcfg_filename(argv[g]);
+        }
       }
     }
     else if (strcmp(argv[g], "--keyboard-file") == 0 || strcmp(argv[g], "--kbfile") == 0) {
@@ -469,7 +473,8 @@ int main(int argc, char *argv[]) {
   }
 
 switch_config:
-  if (load_new_config) {
+  if (load_new_config != 0) {
+    uint8_t config_action = load_new_config - 1;
     load_new_config = 0;
     free_config_file(cfg);
     if (cfg) {
@@ -477,7 +482,19 @@ switch_config:
       cfg = NULL;
     }
 
-    cfg = load_config_file(get_pistorm_devcfg_filename());
+    for(int i = 0; i < 2 * SIZE_MEGA; i++) {
+      write8(i, 0);
+    }
+
+    switch(config_action) {
+      case PICFG_LOAD:
+      case PICFG_RELOAD:
+        cfg = load_config_file(get_pistorm_devcfg_filename());
+        break;
+      case PICFG_DEFAULT:
+        cfg = load_config_file("default.cfg");
+        break;
+    }
   }
 
   if (!cfg) {
@@ -587,14 +604,16 @@ switch_config:
   m68k_set_cpu_type(cpu_type);
   cpu_pulse_reset();
 
-  pthread_t ipl_tid, cpu_tid, kbd_tid;
+  pthread_t ipl_tid = 0, cpu_tid, kbd_tid;
   int err;
-  err = pthread_create(&ipl_tid, NULL, &ipl_task, NULL);
-  if (err != 0)
-    printf("[ERROR] Cannot create IPL thread: [%s]", strerror(err));
-  else {
-    pthread_setname_np(ipl_tid, "pistorm: ipl");
-    printf("IPL thread created successfully\n");
+  if (ipl_tid == 0) {
+    err = pthread_create(&ipl_tid, NULL, &ipl_task, NULL);
+    if (err != 0)
+      printf("[ERROR] Cannot create IPL thread: [%s]", strerror(err));
+    else {
+      pthread_setname_np(ipl_tid, "pistorm: ipl");
+      printf("IPL thread created successfully\n");
+    }
   }
 
   // create keyboard task
@@ -618,7 +637,7 @@ switch_config:
   // wait for cpu task to end before closing up and finishing
   pthread_join(cpu_tid, NULL);
 
-  if (!load_new_config)
+  if (load_new_config == 0)
     printf("[MAIN] All threads appear to have concluded; ending process\n");
 
   if (mouse_fd != -1)
@@ -626,7 +645,7 @@ switch_config:
   if (mem_fd)
     close(mem_fd);
 
-  if (load_new_config)
+  if (load_new_config != 0)
     goto switch_config;
 
   if (cfg->platform->shutdown) {
index ceae1f15ad6efc95f372f64f0b47cffd318ce1aa..0b21a26ee2e43d0e706cefde47addff8a3382d79 100644 (file)
 #define DEBUG(...)
 #endif
 
-
 int handle_register_read_amiga(unsigned int addr, unsigned char type, unsigned int *val);
 int handle_register_write_amiga(unsigned int addr, unsigned int value, unsigned char type);
-int init_rtg_data();
-void shutdown_rtg();
 
 extern int ac_z2_current_pic;
 extern int ac_z2_done;
index de3650f5c6793006fbdc072786fac30829bb4343..bc3b87ca48b4a05815f9977ca8e188b648586b9c 100644 (file)
@@ -23,6 +23,10 @@ void pinet_init(char *dev) {
     (void)dev;
 }
 
+void pinet_shutdown() {
+    // Aaahh!
+}
+
 uint8_t PI_MAC[6] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
 uint8_t PI_IP[4] = { 192, 168, 1, 9 };
 
index 5bf64e3bbe1effc2b4628b2f83c1bfae0b2e14a1..a3621ccf98770c2dbd2e1072ffcec67a8707b90f 100644 (file)
@@ -1,5 +1,6 @@
 // SPDX-License-Identifier: MIT
 
 void pinet_init(char *dev);
+void pinet_shutdown();
 void handle_pinet_write(uint32_t addr, uint32_t val, uint8_t type);
 uint32_t handle_pinet_read(uint32_t addr, uint8_t type);
index 07df2bef12cd29c3e1133d543d395385d3bbbfd4..f976f7954838aa561fff342242e3f2b841c8020b 100644 (file)
@@ -308,6 +308,10 @@ fs_done:;
         free(fhb_block);
 }
 
+struct piscsi_dev *piscsi_get_dev(uint8_t index) {
+    return &devs[index];
+}
+
 void piscsi_map_drive(char *filename, uint8_t index) {
     if (index > 7) {
         printf("[PISCSI] Drive index %d out of range.\nUnable to map file %s to drive.\n", index, filename);
index 9d9d5be6ce01a4d73a2a51603b8f325b53e97b14..ccf7cb129f2ec84aeabd3e86388eede760d90909 100644 (file)
@@ -257,6 +257,8 @@ struct FileSysHeaderBlock {
 void piscsi_init();
 void piscsi_shutdown();
 void piscsi_map_drive(char *filename, uint8_t index);
+void piscsi_unmap_drive(uint8_t index);
+struct piscsi_dev *piscsi_get_dev(uint8_t index);
 
 void handle_piscsi_write(uint32_t addr, uint32_t val, uint8_t type);
 uint32_t handle_piscsi_read(uint32_t addr, uint8_t type);
index 3c4f1b7d3ead558b7e33fab70d8bcedb6f16e112..ece375d31ed3a538f53bb13100274ffdde418371 100644 (file)
@@ -63,12 +63,14 @@ enum pistorm_dev_cmds {
     PI_CMDRESULT        = 0x2100, // [R] Check the result of any command that provides a "return value".
 };
 
-enum pistorm_piscsi_ctrl_commands {
+enum pistorm_piscsi_commands {
     PISCSI_CTRL_NONE,
     PISCSI_CTRL_MAP,        // For hard drives
     PISCSI_CTRL_UNMAP,      //
     PISCSI_CTRL_EJECT,      // For optical media, not yet implemented
     PISCSI_CTRL_INSERT,     //
+    PISCSI_CTRL_ENABLE,     // Enable PiSCSI
+    PISCSI_CTRL_DISABLE,    // Disable PiSCSI
     PISCSI_CTRL_NUM,
 };
 
@@ -78,3 +80,13 @@ enum pistorm_config_commands {
     PICFG_DEFAULT,          // Load default.cfg if it exists
     PICFG_NUM,
 };
+
+enum pistorm_command_results {
+    PI_RES_OK,
+    PI_RES_FAILED,
+    PI_RES_NOCHANGE,
+    PI_RES_FILENOTFOUND,
+    PI_RES_INVALIDVALUE,
+    PI_RES_INVALIDCMD,
+    PI_RES_NUM,
+};
index 54621276e1027ab4729f7055daf3cfc600a0fa4c..30c0dfb1492c42e61c6d6c6853c5baed414d11e6 100644 (file)
@@ -1,12 +1,16 @@
 // SPDX-License-Identifier: MIT
 
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "pistorm-dev.h"
 #include "pistorm-dev-enums.h"
 #include "platforms/platforms.h"
 #include "gpio/ps_protocol.h"
-
-#include <stdio.h>
-#include <string.h>
+#include "platforms/amiga/rtg/rtg.h"
+#include "platforms/amiga/piscsi/piscsi.h"
+#include "platforms/amiga/net/pi-net.h"
 
 #define DEBUG_PISTORM_DEVICE
 
@@ -28,10 +32,12 @@ static const char *op_type_names[4] = {
 extern uint32_t pistorm_dev_base;
 extern uint32_t do_reset;
 
+extern void adjust_ranges_amiga(struct emulator_config *cfg);
 extern uint8_t rtg_enabled, rtg_on, pinet_enabled, piscsi_enabled, load_new_config;
 extern struct emulator_config *cfg;
 
-char cfg_filename[256];
+char cfg_filename[256] = "default.cfg";
+char tmp_string[256];
 
 static uint8_t pi_byte[8];
 static uint16_t pi_word[4];
@@ -73,6 +79,10 @@ char *get_pistorm_devcfg_filename() {
     return cfg_filename;
 }
 
+void set_pistorm_devcfg_filename(char *filename) {
+    strcpy(cfg_filename, filename);
+}
+
 void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) {
     uint32_t addr = (addr_ & 0xFFFF);
 
@@ -108,6 +118,177 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) {
             pi_string[(addr - PI_STR1) / 4] = val;
             break;
 
+        case PI_CMD_RTGSTATUS:
+            DEBUG("[PISTORM-DEV] Write to RTGSTATUS: %d\n", val);
+            if (val == 1 && !rtg_enabled) {
+                init_rtg_data();
+                rtg_enabled = 1;
+                pi_cmd_result = PI_RES_OK;
+            } else if (val == 0 && rtg_enabled) {
+                if (!rtg_on) {
+                    shutdown_rtg();
+                    rtg_enabled = 0;
+                    pi_cmd_result = PI_RES_OK;
+                } else {
+                    // Refuse to disable RTG if it's currently in use.
+                    pi_cmd_result = PI_RES_FAILED;
+                }
+            } else {
+                pi_cmd_result = PI_RES_NOCHANGE;
+            }
+            adjust_ranges_amiga(cfg);
+            break;
+        case PI_CMD_NETSTATUS:
+            DEBUG("[PISTORM-DEV] Write to NETSTATUS: %d\n", val);
+            if (val == 1 && !pinet_enabled) {
+                pinet_init(NULL);
+                pinet_enabled = 1;
+                pi_cmd_result = PI_RES_OK;
+            } else if (val == 0 && pinet_enabled) {
+                pinet_shutdown();
+                pinet_enabled = 0;
+                pi_cmd_result = PI_RES_OK;
+            } else {
+                pi_cmd_result = PI_RES_NOCHANGE;
+            }
+            adjust_ranges_amiga(cfg);
+            break;
+        case PI_CMD_PISCSI_CTRL:
+            DEBUG("[PISTORM-DEV] Write to PISCSI_CTRL: ");
+            switch(val) {
+                case PISCSI_CTRL_DISABLE:
+                    DEBUG("DISABLE\n");
+                    if (piscsi_enabled) {
+                        piscsi_shutdown();
+                        piscsi_enabled = 0;
+                        // Probably not OK... depends on if you booted from floppy, I guess.
+                        pi_cmd_result = PI_RES_OK;
+                    } else {
+                        pi_cmd_result = PI_RES_NOCHANGE;
+                    }
+                    break;
+                case PISCSI_CTRL_ENABLE:
+                    DEBUG("ENABLE\n");
+                    if (!piscsi_enabled) {
+                        piscsi_init();
+                        piscsi_enabled = 1;
+                        piscsi_refresh_drives();
+                        pi_cmd_result = PI_RES_OK;
+                    } else {
+                        pi_cmd_result = PI_RES_NOCHANGE;
+                    }
+                    break;
+                case PISCSI_CTRL_MAP:
+                    DEBUG("MAP\n");
+                    if (pi_string[0] == 0 || grab_amiga_string(pi_string[0], (uint8_t *)tmp_string, 255) == -1)  {
+                        printf("[PISTORM-DEV] Failed to grab string for PISCSI drive filename. Aborting.\n");
+                        pi_cmd_result = PI_RES_FAILED;
+                    } else {
+                        FILE *tmp = fopen(tmp_string, "rb");
+                        if (tmp == NULL) {
+                            printf("[PISTORM-DEV] Failed to open file %s for PISCSI drive mapping. Aborting.\n", cfg_filename);
+                            pi_cmd_result = PI_RES_FILENOTFOUND;
+                        } else {
+                            fclose(tmp);
+                            printf("[PISTORM-DEV] Attempting to map file %s as PISCSI drive %d...\n", cfg_filename, pi_word[0]);
+                            piscsi_unmap_drive(pi_word[0]);
+                            piscsi_map_drive(tmp_string, pi_word[0]);
+                            pi_cmd_result = PI_RES_OK;
+                        }
+                    }
+                    pi_string[0] = 0;
+                    break;
+                case PISCSI_CTRL_UNMAP:
+                    DEBUG("UNMAP\n");
+                    if (pi_word[0] > 7) {
+                        printf("[PISTORM-DEV] Invalid drive ID %d for PISCSI unmap command.", pi_word[0]);
+                        pi_cmd_result = PI_RES_INVALIDVALUE;
+                    } else {
+                        if (piscsi_get_dev(pi_word[0])->fd != -1) {
+                            piscsi_unmap_drive(pi_word[0]);
+                            pi_cmd_result = PI_RES_OK;
+                        } else {
+                            pi_cmd_result = PI_RES_NOCHANGE;
+                        }
+                    }
+                    break;
+                case PISCSI_CTRL_EJECT:
+                    DEBUG("EJECT (NYI)\n");
+                    pi_cmd_result = PI_RES_NOCHANGE;
+                    break;
+                case PISCSI_CTRL_INSERT:
+                    DEBUG("INSERT (NYI)\n");
+                    pi_cmd_result = PI_RES_NOCHANGE;
+                    break;
+                default:
+                    DEBUG("UNKNOWN/UNHANDLED. Aborting.\n");
+                    pi_cmd_result = PI_RES_INVALIDVALUE;
+                    break;
+            }
+            adjust_ranges_amiga(cfg);
+            break;
+        
+        case PI_CMD_KICKROM:
+            DEBUG("[PISTORM-DEV] Write to KICKROM.\n");
+            if (pi_string[0] == 0 || grab_amiga_string(pi_string[0], (uint8_t *)tmp_string, 255) == -1)  {
+                printf("[PISTORM-DEV] Failed to grab string KICKROM filename. Aborting.\n");
+                pi_cmd_result = PI_RES_FAILED;
+            } else {
+                FILE *tmp = fopen(tmp_string, "rb");
+                if (tmp == NULL) {
+                    printf("[PISTORM-DEV] Failed to open file %s for KICKROM mapping. Aborting.\n", cfg_filename);
+                    pi_cmd_result = PI_RES_FILENOTFOUND;
+                } else {
+                    fclose(tmp);
+                    if (get_named_mapped_item(cfg, "kickstart") != -1) {
+                        uint32_t index = get_named_mapped_item(cfg, "kickstart");
+                        free(cfg->map_data[index]);
+                        free(cfg->map_id[index]);
+                        cfg->map_type[index] = MAPTYPE_NONE;
+                        // Dirty hack, I am sleepy and lazy.
+                        add_mapping(cfg, MAPTYPE_ROM, cfg->map_offset[index], cfg->map_size[index], 0, tmp_string, "kickstart");
+                        pi_cmd_result = PI_RES_OK;
+                        do_reset = 1;
+                    } else {
+                        printf ("[PISTORM-DEV] Could not find mapped range 'kickstart', cannot remap KICKROM.\n");
+                        pi_cmd_result = PI_RES_FAILED;
+                    }
+                }
+            }
+            adjust_ranges_amiga(cfg);
+            pi_string[0] = 0;
+            break;
+        case PI_CMD_EXTROM:
+            DEBUG("[PISTORM-DEV] Write to EXTROM.\n");
+            if (pi_string[0] == 0 || grab_amiga_string(pi_string[0], (uint8_t *)tmp_string, 255) == -1)  {
+                printf("[PISTORM-DEV] Failed to grab string EXTROM filename. Aborting.\n");
+                pi_cmd_result = PI_RES_FAILED;
+            } else {
+                FILE *tmp = fopen(tmp_string, "rb");
+                if (tmp == NULL) {
+                    printf("[PISTORM-DEV] Failed to open file %s for EXTROM mapping. Aborting.\n", cfg_filename);
+                    pi_cmd_result = PI_RES_FILENOTFOUND;
+                } else {
+                    fclose(tmp);
+                    if (get_named_mapped_item(cfg, "extended") != -1) {
+                        uint32_t index = get_named_mapped_item(cfg, "extended");
+                        free(cfg->map_data[index]);
+                        free(cfg->map_id[index]);
+                        cfg->map_type[index] = MAPTYPE_NONE;
+                        // Dirty hack, I am tired and lazy.
+                        add_mapping(cfg, MAPTYPE_ROM, cfg->map_offset[index], cfg->map_size[index], 0, tmp_string, "extended");
+                        pi_cmd_result = PI_RES_OK;
+                        do_reset = 1;
+                    } else {
+                        printf ("[PISTORM-DEV] Could not find mapped range 'extrom', cannot remap EXTROM.\n");
+                        pi_cmd_result = PI_RES_FAILED;
+                    }
+                }
+            }
+            adjust_ranges_amiga(cfg);
+            pi_string[0] = 0;
+            break;
+
         case PI_CMD_RESET:
             DEBUG("[PISTORM-DEV] System reset called, code %d\n", (val & 0xFFFF));
             do_reset = 1;
@@ -118,31 +299,41 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) {
                 case PICFG_LOAD:
                     DEBUG("LOAD\n");
                     if (pi_string[0] == 0 || grab_amiga_string(pi_string[0], (uint8_t *)cfg_filename, 255) == -1) {
-                        printf("[PISTORM-DEV] Failed to grab string for config filename. Aborting.\n");
+                        printf("[PISTORM-DEV] Failed to grab string for CONFIG filename. Aborting.\n");
+                        pi_cmd_result = PI_RES_FAILED;
                     } else {
                         FILE *tmp = fopen(cfg_filename, "rb");
                         if (tmp == NULL) {
-                            printf("[PISTORM-DEV] Failed to open config file %s for reading. Aborting.\n", cfg_filename);
+                            printf("[PISTORM-DEV] Failed to open CONFIG file %s for reading. Aborting.\n", cfg_filename);
+                            pi_cmd_result = PI_RES_FILENOTFOUND;
                         } else {
+                            fclose(tmp);
                             printf("[PISTORM-DEV] Attempting to load config file %s...\n", cfg_filename);
-                            load_new_config = 1;
+                            load_new_config = val + 1;
+                            pi_cmd_result = PI_RES_OK;
                         }
                     }
                     pi_string[0] = 0;
                     break;
                 case PICFG_RELOAD:
                     DEBUG("RELOAD\n");
+                    printf("[PISTORM-DEV] Reloading current config file (%s)...\n", cfg_filename);
+                    load_new_config = val + 1;
                     break;
                 case PICFG_DEFAULT:
                     DEBUG("DEFAULT\n");
+                    printf("[PISTORM-DEV] Loading default.cfg...\n");
+                    load_new_config = val + 1;
                     break;
                 default:
-                    DEBUG("UNKNOWN. Command ignored.\n");
+                    DEBUG("UNKNOWN/UNHANDLED. Command ignored.\n");
+                    pi_cmd_result = PI_RES_INVALIDVALUE;
                     break;
             }
             break;
         default:
             DEBUG("[PISTORM-DEV] WARN: Unhandled %s register write to %.4X: %d\n", op_type_names[type], addr - pistorm_dev_base, val);
+            pi_cmd_result = PI_RES_INVALIDCMD;
             break;
     }
 }
index 80e5a086d2fb7a00d6db3084f473a242303159b4..5520521666cd5de2eb2651ec9ed30a28941d44db 100644 (file)
@@ -5,3 +5,4 @@
 void handle_pistorm_dev_write(uint32_t addr, uint32_t val, uint8_t type);
 uint32_t handle_pistorm_dev_read(uint32_t addr, uint8_t type);
 char *get_pistorm_devcfg_filename();
+void set_pistorm_devcfg_filename(char *filename);
index b03b85d26afb9be828efda81c533a14912d3f701..b6355d91f955cd2e97459a4d736b8c28a2af6b02 100644 (file)
Binary files a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple and b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple differ
index f71c6ef4115cfe744608033c173c87b8216620fa..99fed1c76c02106c28f6f248341a34f7bcac4941 100644 (file)
@@ -1 +1 @@
-m68k-amigaos-gcc pistorm_dev.c simple_interact.c -mregparm -m68020 -O2 -o PiSimple -Wno-unused-parameter -noixemul -DHAS_STDLIB
+m68k-amigaos-gcc pistorm_dev.c simple_interact.c -mregparm -m68020 -O2 -o PiSimple -Wno-unused-parameter -noixemul -DHAS_STDLIB -Wall
index a0ec0ede9633c5908611aab528becab8ee645100..778f02192ad5b068e39eebc3327b7b0263feab48 100644 (file)
@@ -37,6 +37,8 @@ unsigned int pistorm_base_addr = 0xFFFFFFFF;
 #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() {
@@ -62,17 +64,102 @@ void pi_reset_amiga(unsigned short reset_code) {
     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);
index 3c796e9ae8e603552f790a1b553606d2b396eadd..feff2dad9b371172927a6216fcd84c940c972ebd 100644 (file)
@@ -6,6 +6,25 @@ unsigned short pi_get_hw_rev();
 unsigned short pi_get_sw_rev();
 unsigned short pi_get_net_status();
 unsigned short pi_get_rtg_status();
+unsigned short pi_get_piscsi_status();
+
+void enable_rtg(unsigned short val);
+void enable_net(unsigned short val);
+void enable_piscsi(unsigned short val);
 
 void pi_reset_amiga(unsigned short reset_code);
-void pi_handle_config(unsigned char cmd, char *str);
+unsigned short pi_handle_config(unsigned char cmd, char *str);
+
+void pi_set_feature_status(unsigned short cmd, unsigned char value);
+
+unsigned short pi_piscsi_map_drive(char *filename, unsigned char index);
+unsigned short pi_piscsi_unmap_drive(unsigned char index);
+unsigned short pi_piscsi_insert_media(char *filename, unsigned char index);
+unsigned short pi_piscsi_eject_media(unsigned char index);
+
+unsigned short pi_load_config(char *filename);
+void pi_reload_config();
+void pi_load_default_config();
+
+unsigned short pi_remap_kickrom(char *filename);
+unsigned short pi_remap_extrom(char *filename);
index 061dae195fa28417c096c430eee7e82933a7b6c4..eaf2903be818e550e59e43bc68f327e0f49dc70c 100644 (file)
@@ -79,6 +79,7 @@ int __stdargs main (int argc, char *argv[]) {
             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");
+            printf ("PiSCSI: %s\n", pi_get_piscsi_status() ? "Enabled" : "Disabled");
             break;
         case PI_CMD_SWITCHCONFIG:
             if (cmd_arg == PICFG_LOAD) {
@@ -108,6 +109,14 @@ int get_command(char *cmd) {
         cmd_arg = PICFG_LOAD;
         return PI_CMD_SWITCHCONFIG;
     }
+    if (strcmp(cmd, "--config-reload") == 0 || strcmp(cmd, "--reload-config") == 0 || strcmp(cmd, "--reloadcfg") == 0) {
+        cmd_arg = PICFG_RELOAD;
+        return PI_CMD_SWITCHCONFIG;
+    }
+    if (strcmp(cmd, "--config-default") == 0 || strcmp(cmd, "--default-config") == 0 || strcmp(cmd, "--defcfg") == 0) {
+        cmd_arg = PICFG_DEFAULT;
+        return PI_CMD_SWITCHCONFIG;
+    }
 
     return -1;
 }
index f8bdf11f98078db115281c75e9787863ff92114d..dbf7815cefd17514eefad2a49fe5fcdd9f2c8c0f 100644 (file)
@@ -17,6 +17,9 @@ void rtg_set_clut_entry(uint8_t index, uint32_t xrgb);
 void rtg_init_display();
 void rtg_shutdown_display();
 
+int init_rtg_data();
+void shutdown_rtg();
+
 void rtg_fillrect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint32_t color, uint16_t pitch, uint16_t format, uint8_t mask);
 void rtg_fillrect_solid(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint32_t color, uint16_t pitch, uint16_t format);
 void rtg_invertrect(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t pitch, uint16_t format, uint8_t mask);