X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=a314%2Fa314.cc;h=38f312a22ffe3cc5971eb0b3ce25edc619493770;hb=8ab5448a7536b9c1f2a6ae26fa1f8887a67a7b64;hp=4d5dfe6942c511faca4eee6325af6ad480919f48;hpb=96f185f30ddf1c87af791b5a4bc67fad40b77e33;p=pistorm diff --git a/a314/a314.cc b/a314/a314.cc index 4d5dfe6..38f312a 100644 --- a/a314/a314.cc +++ b/a314/a314.cc @@ -1,5 +1,5 @@ /* - * Copyright 2020 Niklas Ekström + * Copyright 2020-2021 Niklas Ekström * Based on a314d daemon for A314. */ @@ -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,10 +109,13 @@ 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" unsigned int ps_read_8(unsigned int address); +extern "C" void ps_write_8(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; -// Register bank in 0xE90000 memory. struct ComArea { uint8_t a_events; @@ -116,6 +123,9 @@ struct ComArea uint8_t r_events; uint8_t r_enable; // Unused. + uint32_t mem_base; + uint32_t mem_size; + uint8_t a2r_tail; uint8_t r2a_head; uint8_t r2a_tail; @@ -211,11 +221,15 @@ struct OnDemandStart std::vector on_demand_services; +std::string a314_config_file = "./a314/files_pi/a314d.conf"; +std::string home_env = "HOME=./"; + static void load_config_file(const char *filename) { FILE *f = fopen(filename, "rt"); - if (f == nullptr) + if (f == nullptr) { return; + } char line[256]; std::vector parts; @@ -402,12 +416,25 @@ static void handle_msg_deregister_req(ClientConnection *cc) create_and_send_msg(cc, MSG_DEREGISTER_RES, 0, &result, 1); } +uint8_t manual_read_buf[64 * SIZE_KILO]; + 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 { + // No idea if this actually works. + for (int i = 0; i < length; i++) { + manual_read_buf[i] = (unsigned char)ps_read_8(address + i); + } + create_and_send_msg(cc, MSG_READ_MEM_RES, 0, manual_read_buf, length); + } + } static void handle_msg_write_mem_req(ClientConnection *cc) @@ -415,7 +442,16 @@ 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 { + // No idea if this actually works. + for (int i = 0; i < length; i++) { + ps_write_8(address + i, cc->payload[4 + i]); + } + } create_and_send_msg(cc, MSG_WRITE_MEM_RES, 0, nullptr, 0); } @@ -662,7 +698,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"); @@ -1222,30 +1258,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; @@ -1295,15 +1309,9 @@ static void write_r_events(uint8_t events) logger_error("Write to interrupt socket pair did not return 1\n"); } -#ifdef __cplusplus -extern "C" { -#endif - 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) @@ -1322,11 +1330,17 @@ int a314_init() return 0; } +void a314_set_mem_base_size(unsigned int base, unsigned int size) +{ + ca.mem_base = htobe32(base); + ca.mem_size = htobe32(size); +} + void a314_process_events() { if (ca.a_events & ca.a_enable) { - write16(0xdff09c, 0x8008); + ps_write_16(0xdff09c, 0x8008); m68k_set_irq(2); } } @@ -1355,14 +1369,20 @@ unsigned int a314_read_memory_8(unsigned int address) unsigned int a314_read_memory_16(unsigned int address) { - // Not implemented. - return 0; + if (address >= sizeof(ca)) + return 0; + + uint16_t *p = (uint16_t *)&ca; + return be16toh(p[address >> 1]); } unsigned int a314_read_memory_32(unsigned int address) { - // Not implemented. - return 0; + if (address >= sizeof(ca)) + return 0; + + uint32_t *p = (uint32_t *)&ca; + return be32toh(p[address >> 2]); } void a314_write_memory_8(unsigned int address, unsigned int value) @@ -1400,6 +1420,8 @@ void a314_write_memory_32(unsigned int address, unsigned int value) // Not implemented. } -#ifdef __cplusplus +void a314_set_config_file(char *filename) +{ + printf ("[A314] Set A314 config filename to %s.\n", filename); + a314_config_file = std::string(filename); } -#endif