From 3296b79e7507f152575c43158e3f840a4e909bf9 Mon Sep 17 00:00:00 2001 From: beeanyew Date: Fri, 23 Apr 2021 16:03:36 +0200 Subject: [PATCH] The remainder of the initial PiStorm interaction stuff (I think) --- config_file/config_file.h | 1 + default.cfg | 4 +- emulator.c | 41 +++- platforms/amiga/amiga-platform.c | 3 - platforms/amiga/net/pi-net.c | 4 + platforms/amiga/net/pi-net.h | 1 + platforms/amiga/piscsi/piscsi.c | 4 + platforms/amiga/piscsi/piscsi.h | 2 + .../amiga/pistorm-dev/pistorm-dev-enums.h | 14 +- platforms/amiga/pistorm-dev/pistorm-dev.c | 207 +++++++++++++++++- platforms/amiga/pistorm-dev/pistorm-dev.h | 1 + .../pistorm-dev/pistorm_dev_amiga/PiSimple | Bin 13064 -> 14256 bytes .../pistorm-dev/pistorm_dev_amiga/build.sh | 2 +- .../pistorm_dev_amiga/pistorm_dev.c | 89 +++++++- .../pistorm_dev_amiga/pistorm_dev.h | 21 +- .../pistorm_dev_amiga/simple_interact.c | 9 + platforms/amiga/rtg/rtg.h | 3 + 17 files changed, 378 insertions(+), 28 deletions(-) diff --git a/config_file/config_file.h b/config_file/config_file.h index af2ca63..0f1625c 100644 --- a/config_file/config_file.h +++ b/config_file/config_file.h @@ -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 */ diff --git a/default.cfg b/default.cfg index 76d49e0..552f4a8 100644 --- a/default.cfg +++ b/default.cfg @@ -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. diff --git a/emulator.c b/emulator.c index bbd69f0..306ae7c 100644 --- a/emulator.c +++ b/emulator.c @@ -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 @@ -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) { diff --git a/platforms/amiga/amiga-platform.c b/platforms/amiga/amiga-platform.c index ceae1f1..0b21a26 100644 --- a/platforms/amiga/amiga-platform.c +++ b/platforms/amiga/amiga-platform.c @@ -25,11 +25,8 @@ #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; diff --git a/platforms/amiga/net/pi-net.c b/platforms/amiga/net/pi-net.c index de3650f..bc3b87c 100644 --- a/platforms/amiga/net/pi-net.c +++ b/platforms/amiga/net/pi-net.c @@ -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 }; diff --git a/platforms/amiga/net/pi-net.h b/platforms/amiga/net/pi-net.h index 5bf64e3..a3621cc 100644 --- a/platforms/amiga/net/pi-net.h +++ b/platforms/amiga/net/pi-net.h @@ -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); diff --git a/platforms/amiga/piscsi/piscsi.c b/platforms/amiga/piscsi/piscsi.c index 07df2be..f976f79 100644 --- a/platforms/amiga/piscsi/piscsi.c +++ b/platforms/amiga/piscsi/piscsi.c @@ -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); diff --git a/platforms/amiga/piscsi/piscsi.h b/platforms/amiga/piscsi/piscsi.h index 9d9d5be..ccf7cb1 100644 --- a/platforms/amiga/piscsi/piscsi.h +++ b/platforms/amiga/piscsi/piscsi.h @@ -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); diff --git a/platforms/amiga/pistorm-dev/pistorm-dev-enums.h b/platforms/amiga/pistorm-dev/pistorm-dev-enums.h index 3c4f1b7..ece375d 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev-enums.h +++ b/platforms/amiga/pistorm-dev/pistorm-dev-enums.h @@ -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, +}; diff --git a/platforms/amiga/pistorm-dev/pistorm-dev.c b/platforms/amiga/pistorm-dev/pistorm-dev.c index 5462127..30c0dfb 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev.c +++ b/platforms/amiga/pistorm-dev/pistorm-dev.c @@ -1,12 +1,16 @@ // SPDX-License-Identifier: MIT +#include +#include +#include + #include "pistorm-dev.h" #include "pistorm-dev-enums.h" #include "platforms/platforms.h" #include "gpio/ps_protocol.h" - -#include -#include +#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; } } diff --git a/platforms/amiga/pistorm-dev/pistorm-dev.h b/platforms/amiga/pistorm-dev/pistorm-dev.h index 80e5a08..5520521 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev.h +++ b/platforms/amiga/pistorm-dev/pistorm-dev.h @@ -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); diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/PiSimple index b03b85d26afb9be828efda81c533a14912d3f701..b6355d91f955cd2e97459a4d736b8c28a2af6b02 100644 GIT binary patch delta 3987 zcmZ`*3v5%@8UF8a;yTVv8f}nL;y5>sxoo&dl9?|t zRN*4AWvY{+_GJSr!!?a8+6X?Qa@0>$jclTp=GuxRM~M~|*gLea;k}aIlc=zNgp5B* zKWfBW;oj$7XO_J_(K+1f@c-hfsy-@*18_bqR(k#lBrJ!70H4fNhp z-VI(Tl8r#o>inNLPaaQ6iqt*U^_5&?_6ba{7Luv&KZT*0;6w`rC)j?NUhuImF0Zor zBek?djXH_IIG}Jw)W>*E|9u=ZxNA!} zw#c1<=#GMv%kC9quI@2Nwylu-b)tB6o|!T8Y|F@@Y`pMgIF#-&H}yAx z*Y2}`dWDltklz&~rz$|bVayj-Ro9!m&e8r^@SIE3O;E2Go2^QIetwDhHyrRXbpzDn zMOn0R(;O~3QBjI1cwUMM&kJ-uU)1Tp4eIU^_328P*w0?D|JA+oe_qsYfWLvhQlH(O zAenD=j2MIVgUk^y9@@RE?2+Lpy#i|bPU-uS-O<%E=G_COfRQO{WfgAYOj!$aj7;Av zv&y!rR^B>Qt;XY5bIftoNUoh?)su#+YA16x8T+dSE0jrhpl1xh5A$|%UN`2dqRjck zh&VR0n)SvB$9-r{AFj4b%o8wEM*2tZ}vtQn|vq{@yMJv%=7m zjO1&iCcYLbjeL8TGQg*E%2{Ehwv)LY8|Q1sxx-FZ6KCdJ0Zh{uTyu68bpTBO?xi&XoB&P(zXQ(WxIY1A@x1(&sALlJo8W(rc^EhV^a5AFI|zIV zoy(X}C2J4(*MWOPFP#F7m!K4Sc{zpG2ODJ=lrNy6+khBRxu59etH4E~3I@E+j{)ca zV6+`R13P^PI+=42QvaD z9MnD}@?xX6n}}Kg-r-RofF**Gkfn4C&mn?j*uxM6e-hb8z&YR(;1+NnuNQ*0R053v zf|T|FzX9M_x&s}UW$ru%l$!k-%(W;jGAelh%;8_W1tr=De2L0HS;l7h8gLhxjshPb zQ)K6aZY>7vK>>gb4-{tOqy&+yTJ1pk5XS;0M~Fi;$#NBHJop8*mh-4ta44PW?90 zssNy8&mlE9D@AyvNJ&PHc9g=7wY?jiVSfxJjM#TTp$qdMXg2^yG91|ZP^VeQP;?oN z%02|n0;pj*YFYjzI^-DYqX5vUK@c^lNzDP^0?-Sb1W>mc*spmXIDy)%L2YvA3?+(U zjsq7_#4{+M48(zlP(mQ?AQTZqZ7X<)xV9X;`_SJ390ah(^$~#mwHqO8hd%V`?t#9B zHRK*E09pNA;5^oqn6KbGdZ6rqvga8HRG|Ucc|O35l6kgcMurU?Knj3?hEX5}*-ZeM zHQd5s#*7>5oQ%yF57s$d^{23vsp(8A9Liwn#f}0!l*F=(41eQV#-15njcfB3Btu1N zQdjw3mumh?@eOZduyTGNS4{MN+1iw_gLcT&Oor8?2s+Q4mB7&oW zPG&Rw;}!RM1cPZiZyMJIwQxoq(jt0@D=;SpVch&{T@DMfosd~nJ-s^@(ff67pBy+= zB%#J~YIGo)N(@CKoK4Ck2ByMsTF~+oCX1R(>G6!3O^5n5+{=>VV49mlkw`Qa>Nk~@ zeL@*&O6s%Y_0UrbZunh1cM244hR;G0DQ6aI1h+`bx5gcCzUp?D;w z$5F$QJK*OnYQL62enNmZa{^2Yl*7qvct8v90x9$C7%~oJGWe4sWt*U*kwj99bNU7b zafAiusSLg%umw#o9P>y?(zMPm1@8=b z9D}G5H=Ev#W*7#C*eoB=nVCIFO+}OelQtRr0||6-q3X|dI^OPUkcqY)*cIwa;AJL4TW^x#qeoXaX2dOCl3Xm1rIPVbun{tw;Eg4d$tREJ%#(&hgXnm2MZ^>fp5gm zUbth>6IaNOCz@BD>+=qQzUZ!ke#sr<>iT(C4KFr+3Llc_UjA6&C!xawm>Vul-}SjI F{{yUm%D4ak delta 2758 zcmZXWduUtN9mmhTl4D7hGn1Lju_akA8{>JA8LQzeZ8Dmsax?o0@YsHdmxw525 z*N>X4a*Ht`gxT>Ktb|ZP38jqDnK*=OlwnFJA%s#w*g_a3e~dH@Y37B{Wg)TmIajh9 znBaTP`Mu8XdGFOq{&;$6_b%sx5Ml(h31RzM2(uebO|EEh)2|JD6LW7q zivKD;xo=MUH=0>_R&R7cJXD0xdNkq5u+Yy&m(AUs*_s7zGRVleYdmNX8 zi@onWp9I{lN|-8vAuEA_N`97;+ry`=3my)it?bIlvz55)eP{R*r$1GUhZg_8lxT>J zIoVhnFUNl&MBi84{&q*-?B<6Nhf3KsA736^42#h&cxNKED&>Rv{WjGAb*e&{yZYzS zZofY8jlJ4>WWTA%`sYUPKuv8^H=*)dR9e31_(9X=p)Gp!OQaTs-F11_@nE;BF}@tp zVgEF~%$l%pzlv8=`u%SWPzUa66jTR7IQCWYIIDH}}c= zo)x{NTfXl-qPMKb4exk^uR9zYS|rFRRb|hBobjb~&oO!1w_o?1mrbn?&|G!+U78-c zEE@yY^-zbr8;GiFe8Gc?IumS?ZwDK8dXAYI18eo#Vs|Q&E5R|f^@J{1mZ5&#KP#i* zCFSI^aF=2}3dh)1_qRRO^>(|Ab}W`(Vd~WHFk^Q}2>S`gBV9H(`LbO@E-UhSOe&4&1C&cGBv>* zxFm$*BH2+T=R668K|dHHNIO8^Ltq|seWwZV34vTBD=(L}egLk*6o5wV%V|TuXY6S$L#edz&-0u6+Rg5x4->pznZj&V%44jjRjOz!v}wsv{V8 zjwX2k&OIo3&H_^OI>5`E|Hxw3e zE=-#0`>Nhw{A@<1G(D5djAoRI*h6WB-7vB0OF zP|V~^W3rSOP0?UK%!+X$nM`LBqZMVJZYdMVOvWsk$xNQou2gi5Tz(`!F_Fk6vzeT_ zL;15=*;M)DM@ius#zFdg%qdgdc{Phggb`mygVCe?{q%pjE_>voGcjWOctSc%P-7Sv6v%l!Q0W@-J`cR z$yoPZ^=&A0?=H9XBC)zKrV>dRBl%o9GYXR~Fk@C6nOw$vK92KMzA8#KbF`Q!W>VCv zt&+#KX6Q0{{cSxcsTRSWH(v+Spf8Pm$QMHQZ@ zFiO)$C(}$ppG7lhW`2@cubZ*x!gv1U+CHE9fcblZ{VmlwP;JMUKR+z?t@$fW8^zQV z9HE_K!OMvGRv~3n-piI(i(!5GPWCkSJ9)4wogI5KaWr34Gw2zxOeYc<)kef!YB8qL z)~qR~yy}&rZfwOU0&8-;r~Qz1-B5M7j`Db^UdO97-KPxsxvE2ko;5^dWYtLNtDY!* m)z7MaZBk}`yb<)OvhefHvlK}1m_-T=evD&V@9N2D*!Dkazl>`D diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh index f71c6ef..99fed1c 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/build.sh @@ -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 diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c index a0ec0ed..778f021 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.c @@ -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); diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h index 3c796e9..feff2da 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/pistorm_dev.h @@ -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); diff --git a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c index 061dae1..eaf2903 100644 --- a/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c +++ b/platforms/amiga/pistorm-dev/pistorm_dev_amiga/simple_interact.c @@ -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; } diff --git a/platforms/amiga/rtg/rtg.h b/platforms/amiga/rtg/rtg.h index f8bdf11..dbf7815 100644 --- a/platforms/amiga/rtg/rtg.h +++ b/platforms/amiga/rtg/rtg.h @@ -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); -- 2.39.2