From: beeanyew Date: Sun, 16 May 2021 05:03:19 +0000 (+0200) Subject: Theoretically working A314 emulation X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=9fd6ef0a7c2c7b86087545cc0eabb213e3261505;p=pistorm Theoretically working A314 emulation This most definitely requires a make clean and then make, due to all the header files edited. I can't seem to build a314.device, so it's not included yet. --- diff --git a/Makefile b/Makefile index 892730e..8ea8cb0 100644 --- a/Makefile +++ b/Makefile @@ -34,13 +34,14 @@ EXE = EXEPATH = ./ .CFILES = $(MAINFILES) $(MUSASHIFILES) $(MUSASHIGENCFILES) -.OFILES = $(.CFILES:%.c=%.o) +.OFILES = $(.CFILES:%.c=%.o) a314/a314.o CC = gcc +CXX = g++ WARNINGS = -Wall -Wextra -pedantic # Pi3 CFLAGS -CFLAGS = $(WARNINGS) -I. -I./raylib -I./raylib/external -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE +CFLAGS = $(WARNINGS) -I. -I./raylib -I./raylib/external -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -lstdc++ # Pi4 CFLAGS #CFLAGS = $(WARNINGS) -I. -I./raylib_pi4_test -I./raylib_pi4_test/external -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE @@ -48,7 +49,7 @@ CFLAGS = $(WARNINGS) -I. -I./raylib -I./raylib/external -march=armv8-a -mfloa #LFLAGS = $(WARNINGS) `sdl2-config --libs` # Pi3 standard raylib stuff -LFLAGS = $(WARNINGS) -L/opt/vc/lib -L./raylib -lraylib -lbrcmGLESv2 -lbrcmEGL -lbcm_host +LFLAGS = $(WARNINGS) -L/opt/vc/lib -L./raylib -lraylib -lbrcmGLESv2 -lbrcmEGL -lbcm_host -lstdc++ # Pi4 experimental crap # Graphics output on the Pi4 sort of REQUIRES X11 to be running, otherwise it is insanely slow and useless. #LFLAGS = $(WARNINGS) -L/usr/local/lib -L./raylib_pi4_test -lraylib -lGL -ldl -lrt -lX11 -DPLATFORM_DESKTOP @@ -65,7 +66,10 @@ clean: $(TARGET): $(MUSASHIGENHFILES) $(.OFILES) Makefile - $(CC) -o $@ $(.OFILES) -O3 -pthread $(LFLAGS) -lm + $(CC) -o $@ $(.OFILES) -O3 -pthread $(LFLAGS) -lm -lstdc++ + +a314/a314.o: a314/a314.cc a314/a314.h + $(CXX) -c -o a314/a314.o -O3 a314/a314.cc -march=armv8-a -mfloat-abi=hard -mfpu=neon-fp-armv8 -O3 -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -I. -I.. $(MUSASHIGENCFILES) $(MUSASHIGENHFILES): $(MUSASHIGENERATOR)$(EXE) $(EXEPATH)$(MUSASHIGENERATOR)$(EXE) diff --git a/a314/a314.cc b/a314/a314.cc index 70b45d5..c14e7c1 100644 --- a/a314/a314.cc +++ b/a314/a314.cc @@ -35,7 +35,11 @@ #include #include "a314.h" -#include "../m68k.h" +// Silence stupid warning +#undef _GNU_SOURCE +#include "config_file/config_file.h" + +extern "C" emulator_config *cfg; #define LOGGER_TRACE 1 #define LOGGER_DEBUG 2 @@ -105,8 +109,7 @@ static int server_socket = -1; static int epfd = -1; static int irq_fds[2]; -extern "C" unsigned char fast_ram_array[]; -extern "C" void write16(unsigned int address, unsigned int value); +extern "C" void ps_write_16(unsigned int address, unsigned int value); unsigned int a314_base; int a314_base_configured; @@ -216,6 +219,9 @@ struct OnDemandStart std::vector on_demand_services; +std::string a314_config_file = "/etc/opt/a314/a314d.conf"; +std::string home_env = "HOME=/home/pi"; + static void load_config_file(const char *filename) { FILE *f = fopen(filename, "rt"); @@ -412,7 +418,13 @@ static void handle_msg_read_mem_req(ClientConnection *cc) uint32_t address = *(uint32_t *)&(cc->payload[0]); uint32_t length = *(uint32_t *)&(cc->payload[4]); - create_and_send_msg(cc, MSG_READ_MEM_RES, 0, &fast_ram_array[address], length); + if (get_mapped_item_by_address(cfg, address) != -1) { + int32_t index = get_mapped_item_by_address(cfg, address); + uint8_t *map = &cfg->map_data[index][address - cfg->map_offset[index]]; + create_and_send_msg(cc, MSG_READ_MEM_RES, 0, map, length); + } + else // FIXME + printf("help.\n"); } static void handle_msg_write_mem_req(ClientConnection *cc) @@ -420,7 +432,14 @@ static void handle_msg_write_mem_req(ClientConnection *cc) uint32_t address = *(uint32_t *)&(cc->payload[0]); uint32_t length = cc->payload.size() - 4; - memcpy(&fast_ram_array[address], &(cc->payload[4]), length); + + if (get_mapped_item_by_address(cfg, address) != -1) { + int32_t index = get_mapped_item_by_address(cfg, address); + uint8_t *map = &cfg->map_data[index][address - cfg->map_offset[index]]; + memcpy(map, &(cc->payload[4]), length); + } + else // FIXME + printf("help 2.\n"); create_and_send_msg(cc, MSG_WRITE_MEM_RES, 0, nullptr, 0); } @@ -667,7 +686,7 @@ static void handle_pkt_connect(int channel_id, uint8_t *data, int plen) // FIXE: The user should be configurable. setgid(1000); setuid(1000); - putenv("HOME=/home/pi"); + putenv((char *)home_env.c_str()); std::vector args(on_demand.arguments); args.push_back("-ondemand"); @@ -1227,30 +1246,8 @@ static void main_loop() } } -static void sigterm_handler(int signo) -{ -} - -static void init_sigterm() -{ - /* - sigset_t ss; - sigemptyset(&ss); - sigaddset(&ss, SIGTERM); - sigprocmask(SIG_BLOCK, &ss, &original_sigset); - - struct sigaction sa; - sa.sa_handler = sigterm_handler; - sigemptyset(&sa.sa_mask); - sa.sa_flags = 0; - sigaction(SIGTERM, &sa, NULL); - */ -} - static int init_driver() { - init_sigterm(); - if (init_server_socket() != 0) return -1; @@ -1302,9 +1299,7 @@ static void write_r_events(uint8_t events) int a314_init() { - std::string conf_filename("/etc/opt/a314/a314d.conf"); - - load_config_file(conf_filename.c_str()); + load_config_file(a314_config_file.c_str()); int err = init_driver(); if (err < 0) @@ -1333,7 +1328,7 @@ void a314_process_events() { if (ca.a_events & ca.a_enable) { - write16(0xdff09c, 0x8008); + ps_write_16(0xdff09c, 0x8008); m68k_set_irq(2); } } @@ -1412,3 +1407,9 @@ void a314_write_memory_32(unsigned int address, unsigned int value) { // Not implemented. } + +void a314_set_config_file(char *filename) +{ + printf ("[A314] Set A314 config filename to %s.\n", filename); + a314_config_file = std::string(filename); +} diff --git a/a314/a314.h b/a314/a314.h index fa15430..a8c8756 100644 --- a/a314/a314.h +++ b/a314/a314.h @@ -17,6 +17,7 @@ extern int a314_base_configured; int a314_init(); void a314_set_mem_base_size(unsigned int base, unsigned int size); void a314_process_events(); +void a314_set_config_file(char *filename); unsigned int a314_read_memory_8(unsigned int address); unsigned int a314_read_memory_16(unsigned int address); diff --git a/config_file/config_file.h b/config_file/config_file.h index 629fdca..81d4755 100644 --- a/config_file/config_file.h +++ b/config_file/config_file.h @@ -94,6 +94,9 @@ struct platform_config { void (*setvar)(struct emulator_config *cfg, char *var, char *val); }; +#ifdef __cplusplus +extern "C" int get_mapped_item_by_address(struct emulator_config *cfg, uint32_t address); +#else unsigned int get_m68k_cpu_type(char *name); struct emulator_config *load_config_file(char *filename); void free_config_file(struct emulator_config *cfg); @@ -104,5 +107,6 @@ 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 #endif /* _CONFIG_FILE_H */ diff --git a/default.cfg b/default.cfg index 086f2d2..2505609 100644 --- a/default.cfg +++ b/default.cfg @@ -32,6 +32,7 @@ platform amiga #setvar enable_rtc_emulation 0 # Uncomment to enable RTG #setvar rtg + # Uncomment to enable CDTV mode (not working, requires Kickstart 1.3+CDTV extended ROM) #setvar cdtv # Uncomment this line to enable the PiSCSI interface @@ -42,6 +43,11 @@ platform amiga # Uncomment this line to enable the (currently non-working) Pi-Net interface. #setvar pi-net +# Uncomment and edit to set a custom config filename for the A314 emulation +#setvar a314_conf /etc/opt/a314/a314d.conf +# Uncomment to enable A314 emulation +#setvar a314 + # Forward keyboard events to host system, defaults to off unless toggle key is pressed, toggled off using F12. # Syntax: keyboard [grab key] [grab|nograb] [autoconnect|noautoconnect] # "grab" steals the keyboard from the Pi so Amiga/etc. input is not sent to the Pi diff --git a/platforms/amiga/amiga-autoconf.c b/platforms/amiga/amiga-autoconf.c index 83452a3..c6945ce 100644 --- a/platforms/amiga/amiga-autoconf.c +++ b/platforms/amiga/amiga-autoconf.c @@ -6,6 +6,7 @@ #include #include #include +#include "a314/a314.h" #define Z2_Z2 0xC #define Z2_FAST 0x2 @@ -44,7 +45,7 @@ unsigned char ac_pistorm_rom[] = { 0x4, 0x0, 0x0, 0x0, // Optional BOOT ROM vector }; -// A314 Emulation ROM (currently unused) +// A314 Emulation ROM static unsigned char ac_a314_rom[] = { 0xc, AC_MEM_SIZE_64KB, // 00/02, 64 kB 0xa, 0x3, // 04/06, product id @@ -55,6 +56,8 @@ static unsigned char ac_a314_rom[] = { 0x0, 0x0, 0x0, 0x0, // Optional BOOT ROM vector }; +extern unsigned int a314_base; + int ac_z2_current_pic = 0; int ac_z2_pic_count = 0; int ac_z2_done = 0; @@ -361,7 +364,7 @@ void autoconfig_write_memory_8(struct emulator_config *cfg, unsigned int address base = &ac_base[ac_z2_current_pic]; break; case ACTYPE_A314: - //base = &a314_base; + base = &a314_base; break; case ACTYPE_PISCSI: base = &piscsi_base; @@ -384,7 +387,7 @@ void autoconfig_write_memory_8(struct emulator_config *cfg, unsigned int address *base &= 0xff0fffff; *base |= (value & 0xf0) << (20 - 4); - if (ac_z2_type[ac_z2_current_pic] == ACTYPE_MAPFAST_Z2) { // fast ram + if (ac_z2_type[ac_z2_current_pic] == ACTYPE_A314) { //a314_set_mem_base_size(*base, cfg->map_size[ac_index[ac_z2_current_pic]]); } done = 1; @@ -407,10 +410,14 @@ void autoconfig_write_memory_8(struct emulator_config *cfg, unsigned int address printf("[AUTOCONF] PiSCSI Z2 device assigned to $%.8X\n", piscsi_base); //m68k_add_rom_range(piscsi_base + (16 * SIZE_KILO), piscsi_base + (32 * SIZE_KILO), piscsi_rom_ptr); break; + case ACTYPE_A314: + printf("[AUTOCONF] A314 emulation device assigned to $%.8X\n", a314_base); + break; case ACTYPE_PISTORM_DEV: - printf("[AUTOCONF] PiStorm Interaction Z2 Device assigned to $%.8X\n", pistorm_dev_base); + printf("[AUTOCONF] PiStorm Interaction Z2 device assigned to $%.8X\n", pistorm_dev_base); break; default: + printf("[!!!AUTOCONF] Some strange unknown Z2 device has been assigned to $%.8X?", *base); break; } ac_z2_current_pic++; diff --git a/platforms/amiga/amiga-platform.c b/platforms/amiga/amiga-platform.c index 266c122..819eda4 100644 --- a/platforms/amiga/amiga-platform.c +++ b/platforms/amiga/amiga-platform.c @@ -16,6 +16,7 @@ #include "platforms/platforms.h" #include "platforms/shared/rtc.h" #include "rtg/rtg.h" +#include "a314/a314.h" //#define DEBUG_AMIGA_PLATFORM @@ -50,11 +51,13 @@ extern const char *op_type_names[OP_TYPE_NUM]; extern uint8_t cdtv_mode; extern uint8_t rtc_type; extern unsigned char cdtv_sram[32 * SIZE_KILO]; +extern unsigned int a314_base; #define min(a, b) (a < b) ? a : b #define max(a, b) (a > b) ? a : b uint8_t rtg_enabled = 0, piscsi_enabled = 0, pinet_enabled = 0, kick13_mode = 0, pistorm_dev_enabled = 1; +uint8_t a314_emulation_enabled = 0; extern uint32_t piscsi_base, pistorm_dev_base; @@ -112,6 +115,26 @@ inline int custom_read_amiga(struct emulator_config *cfg, unsigned int addr, uns return 1; } + if (a314_emulation_enabled && addr >= a314_base && addr < a314_base + (64 * SIZE_KILO)) { + switch (type) { + case OP_TYPE_BYTE: + *val = a314_read_memory_8(addr); + return 1; + break; + case OP_TYPE_WORD: + *val = a314_read_memory_16(addr); + return 1; + break; + case OP_TYPE_LONGWORD: + *val = a314_read_memory_32(addr); + return 1; + break; + default: + break; + } + return 1; + } + return -1; } @@ -178,6 +201,27 @@ inline int custom_write_amiga(struct emulator_config *cfg, unsigned int addr, un return 1; } + if (a314_emulation_enabled && addr >= a314_base && addr < a314_base + (64 * SIZE_KILO)) { + switch (type) { + case OP_TYPE_BYTE: + a314_write_memory_8(addr, val); + return 1; + break; + case OP_TYPE_WORD: + // Not implemented in a314.cc + //a314_write_memory_16(addr, val); + return -1; + break; + case OP_TYPE_LONGWORD: + // Not implemented in a314.cc + // a314_write_memory_32(addr, val); + return -1; + break; + default: + break; + } + } + return -1; } @@ -351,11 +395,13 @@ int setup_platform_amiga(struct emulator_config *cfg) { return 0; } +#define CHKVAR(a) (strcmp(var, a) == 0) + void setvar_amiga(struct emulator_config *cfg, char *var, char *val) { if (!var) return; - if (strcmp(var, "enable_rtc_emulation") == 0) { + if CHKVAR("enable_rtc_emulation") { int8_t rtc_enabled = 0; if (!val || strlen(val) == 0) rtc_enabled = 1; @@ -366,19 +412,19 @@ void setvar_amiga(struct emulator_config *cfg, char *var, char *val) { configure_rtc_emulation_amiga(rtc_enabled); } } - if (strcmp(var, "hdd0") == 0) { + if CHKVAR("hdd0") { if (val && strlen(val) != 0) set_hard_drive_image_file_amiga(0, val); } - if (strcmp(var, "hdd1") == 0) { + if CHKVAR("hdd1") { if (val && strlen(val) != 0) set_hard_drive_image_file_amiga(1, val); } - if (strcmp(var, "cdtv") == 0) { + if CHKVAR("cdtv") { printf("[AMIGA] CDTV mode enabled.\n"); cdtv_mode = 1; } - if (strcmp(var, "rtg") == 0 && !rtg_enabled) { + if (CHKVAR("rtg") && !rtg_enabled) { if (init_rtg_data(cfg)) { printf("[AMIGA] RTG Enabled.\n"); rtg_enabled = 1; @@ -387,60 +433,73 @@ void setvar_amiga(struct emulator_config *cfg, char *var, char *val) { else printf("[AMIGA} Failed to enable RTG.\n"); } - if (strcmp(var, "kick13") == 0) { + if CHKVAR("kick13") { printf("[AMIGA] Kickstart 1.3 mode enabled, Z3 PICs will not be enumerated.\n"); kick13_mode = 1; } + if CHKVAR("a314") { + int32_t res = a314_init(); + if (res != 0) { + printf("[AMIGA] Failed to enable A314 emulation, error return code: %d.\n", res); + } else { + printf("[AMIGA] A314 emulation enabled.\n"); + add_z2_pic(ACTYPE_A314, 0); + a314_emulation_enabled = 1; + } + } + if CHKVAR("a314conf") { + if (val && strlen(val) != 0) { + a314_set_config_file(val); + } + } // PiSCSI stuff - if (strcmp(var, "piscsi") == 0 && !piscsi_enabled) { + if (CHKVAR("piscsi") && !piscsi_enabled) { printf("[AMIGA] PISCSI Interface Enabled.\n"); piscsi_enabled = 1; piscsi_init(); add_z2_pic(ACTYPE_PISCSI, 0); - //ac_z2_type[ac_z2_pic_count] = ACTYPE_PISCSI; - //ac_z2_pic_count++; adjust_ranges_amiga(cfg); } if (piscsi_enabled) { - if (strcmp(var, "piscsi0") == 0) { + if CHKVAR("piscsi0") { piscsi_map_drive(val, 0); } - if (strcmp(var, "piscsi1") == 0) { + if CHKVAR("piscsi1") { piscsi_map_drive(val, 1); } - if (strcmp(var, "piscsi2") == 0) { + if CHKVAR("piscsi2") { piscsi_map_drive(val, 2); } - if (strcmp(var, "piscsi3") == 0) { + if CHKVAR("piscsi3") { piscsi_map_drive(val, 3); } - if (strcmp(var, "piscsi4") == 0) { + if CHKVAR("piscsi4") { piscsi_map_drive(val, 4); } - if (strcmp(var, "piscsi5") == 0) { + if CHKVAR("piscsi5") { piscsi_map_drive(val, 5); } - if (strcmp(var, "piscsi6") == 0) { + if CHKVAR("piscsi6") { piscsi_map_drive(val, 6); } } // Pi-Net stuff - if (strcmp(var, "pi-net") == 0 && !pinet_enabled) { + if (CHKVAR("pi-net")&& !pinet_enabled) { printf("[AMIGA] PI-NET Interface Enabled.\n"); pinet_enabled = 1; pinet_init(val); adjust_ranges_amiga(cfg); } - if (strcmp(var, "no-pistorm-dev") == 0) { + if CHKVAR("no-pistorm-dev") { pistorm_dev_enabled = 0; printf("[AMIGA] Disabling PiStorm interaction device.\n"); } // RTC stuff - if (strcmp(var, "rtc_type") == 0) { + if CHKVAR("rtc_type") { if (val && strlen(val) != 0) { if (strcmp(val, "msm") == 0) { printf("[AMIGA] RTC type set to MSM.\n"); @@ -496,6 +555,9 @@ void shutdown_platform_amiga(struct emulator_config *cfg) { if (pinet_enabled) { pinet_enabled = 0; } + if (a314_emulation_enabled) { + a314_emulation_enabled = 0; + } cdtv_mode = 0;