X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=platforms%2Famiga%2Fpistorm-dev%2Fpistorm-dev.c;h=95943ab93a33743a6ac098125ec92ce5d04342a9;hb=f76580474731e9a4f3d2ec2b61bb7072053e8aa6;hp=7a161745eea8cb22070508a366f997597ca601b1;hpb=852bfb6e64da97b3481c3e6f77799522f358e4a8;p=pistorm diff --git a/platforms/amiga/pistorm-dev/pistorm-dev.c b/platforms/amiga/pistorm-dev/pistorm-dev.c index 7a16174..95943ab 100644 --- a/platforms/amiga/pistorm-dev/pistorm-dev.c +++ b/platforms/amiga/pistorm-dev/pistorm-dev.c @@ -21,8 +21,6 @@ #ifdef DEBUG_PISTORM_DEVICE #define DEBUG printf -#define PIDEV_SWREV 0x0105 - static const char *op_type_names[4] = { "BYTE", "WORD", @@ -33,6 +31,8 @@ static const char *op_type_names[4] = { #define DEBUG(...) #endif +#define PIDEV_SWREV 0x0105 + extern uint32_t pistorm_dev_base; extern uint32_t do_reset; @@ -43,14 +43,14 @@ extern struct emulator_config *cfg; char cfg_filename[256] = "default.cfg"; char tmp_string[256]; -static uint8_t pi_byte[8]; -static uint16_t pi_word[4]; -static uint32_t pi_longword[4]; -static uint32_t pi_string[4]; -static uint32_t pi_ptr[4]; +static uint8_t pi_byte[32]; +static uint16_t pi_word[32]; +static uint32_t pi_longword[32]; +static uint32_t pi_string[32]; +static uint32_t pi_ptr[32]; -static uint32_t pi_dbg_val[4]; -static uint32_t pi_dbg_string[4]; +static uint32_t pi_dbg_val[32]; +static uint32_t pi_dbg_string[32]; static uint32_t pi_cmd_result = 0, shutdown_confirm = 0xFFFFFFFF; @@ -61,7 +61,7 @@ int32_t grab_amiga_string(uint32_t addr, uint8_t *dest, uint32_t str_max_len) { if (r == -1) { DEBUG("[GRAB_AMIGA_STRING] No mapped range found for address $%.8X. Grabbing string data over the bus.\n", addr); do { - dest[index] = read8(addr + index); + dest[index] = (unsigned char)m68k_read_memory_8(addr + index); index++; } while (dest[index - 1] != 0x00 && index < str_max_len); } @@ -98,7 +98,7 @@ int32_t amiga_transfer_file(uint32_t addr, char *filename) { for (uint32_t i = 0; i < filesize; i++) { tmp_read = (uint8_t)fgetc(in); - write8(addr + i, tmp_read); + m68k_write_memory_8(addr + i, tmp_read); } } else { uint8_t *dst = cfg->map_data[r] + (addr - cfg->map_offset[r]); @@ -141,11 +141,16 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { pi_byte[addr - PI_BYTE1] = (val & 0xFF); break; case PI_WORD1: case PI_WORD2: case PI_WORD3: case PI_WORD4: - DEBUG("[PISTORM-DEV] Set WORD %d to %d ($%.4X)\n", (addr - PI_WORD1) / 2, (val & 0xFFFF), (val & 0xFFFF)); + //DEBUG("[PISTORM-DEV] Set WORD %d to %d ($%.4X)\n", (addr - PI_WORD1) / 2, (val & 0xFFFF), (val & 0xFFFF)); pi_word[(addr - PI_WORD1) / 2] = (val & 0xFFFF); break; + case PI_WORD5: case PI_WORD6: case PI_WORD7: case PI_WORD8: + case PI_WORD9: case PI_WORD10: case PI_WORD11: case PI_WORD12: + //DEBUG("[PISTORM-DEV] Set WORD %d to %d ($%.4X)\n", (addr - PI_WORD5) / 2, (val & 0xFFFF), (val & 0xFFFF)); + pi_word[(addr - PI_WORD5) / 2] = (val & 0xFFFF); + break; case PI_LONGWORD1: case PI_LONGWORD2: case PI_LONGWORD3: case PI_LONGWORD4: - DEBUG("[PISTORM-DEV] Set LONGWORD %d to %d ($%.8X)\n", (addr - PI_LONGWORD1) / 4, val, val); + //DEBUG("[PISTORM-DEV] Set LONGWORD %d to %d ($%.8X)\n", (addr - PI_LONGWORD1) / 4, val, val); pi_longword[(addr - PI_LONGWORD1) / 4] = val; break; case PI_STR1: case PI_STR2: case PI_STR3: case PI_STR4: @@ -153,7 +158,7 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { pi_string[(addr - PI_STR1) / 4] = val; break; case PI_PTR1: case PI_PTR2: case PI_PTR3: case PI_PTR4: - DEBUG("[PISTORM-DEV] Set DATA POINTER %d to $%.8X\n", (addr - PI_PTR1) / 4, val); + //DEBUG("[PISTORM-DEV] Set DATA POINTER %d to $%.8X\n", (addr - PI_PTR1) / 4, val); pi_ptr[(addr - PI_PTR1) / 4] = val; break; @@ -175,11 +180,126 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { pi_string[0] = 0; pi_ptr[0] = 0; break; + case PI_CMD_MEMCPY: + //DEBUG("[PISTORM-DEV} Write to MEMCPY: %d (%.8X)\n", val, val); + if (pi_ptr[0] == 0 || pi_ptr[1] == 0) { + printf("[PISTORM-DEV] MEMCPY from/to null pointer not allowed. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else if (val == 0) { + printf("[PISTORM-DEV] MEMCPY called with size 0. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else { + int32_t src = get_mapped_item_by_address(cfg, pi_ptr[0]); + int32_t dst = get_mapped_item_by_address(cfg, pi_ptr[1]); + if (dst != -1 && src != -1) { + uint8_t *src_ptr = &cfg->map_data[src][(pi_ptr[0] - cfg->map_offset[src])]; + uint8_t *dst_ptr = &cfg->map_data[dst][(pi_ptr[1] - cfg->map_offset[dst])]; + memcpy(dst_ptr, src_ptr, val); + } else { + uint8_t tmp = 0; + uint16_t tmps = 0; + for (uint32_t i = 0; i < val; i++) { + while (i + 2 < val) { + if (src == -1) tmps = (uint16_t)m68k_read_memory_16(pi_ptr[0] + i); + else memcpy(&tmps, &cfg->map_data[src][pi_ptr[0] - cfg->map_offset[src] + i], 2); + + if (dst == -1) m68k_write_memory_16(pi_ptr[1] + i, tmps); + else memcpy(&cfg->map_data[dst][pi_ptr[1] - cfg->map_offset[dst] + i], &tmps, 2); + i += 2; + } + if (src == -1) tmp = (uint8_t)m68k_read_memory_8(pi_ptr[0] + i); + else tmp = cfg->map_data[src][pi_ptr[0] - cfg->map_offset[src] + i]; + + if (dst == -1) m68k_write_memory_8(pi_ptr[1] + i, tmp); + else cfg->map_data[dst][pi_ptr[1] - cfg->map_offset[dst] + i] = tmp; + } + } + //DEBUG("[PISTORM-DEV] Copied %d bytes from $%.8X to $%.8X\n", val, pi_ptr[0], pi_ptr[1]); + } + break; + case PI_CMD_MEMSET: + //DEBUG("[PISTORM-DEV} Write to MEMSET: %d (%.8X)\n", val, val); + if (pi_ptr[0] == 0) { + printf("[PISTORM-DEV] MEMSET with null pointer not allowed. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else if (val == 0) { + printf("[PISTORM-DEV] MEMSET called with size 0. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else { + int32_t dst = get_mapped_item_by_address(cfg, pi_ptr[0]); + if (dst != -1) { + uint8_t *dst_ptr = &cfg->map_data[dst][(pi_ptr[0] - cfg->map_offset[dst])]; + memset(dst_ptr, pi_byte[0], val); + } else { + for (uint32_t i = 0; i < val; i++) { + m68k_write_memory_8(pi_ptr[0] + i, pi_byte[0]); + } + } + } + break; + case PI_CMD_COPYRECT: + case PI_CMD_COPYRECT_EX: + if (pi_ptr[0] == 0 || pi_ptr[1] == 0) { + printf("[PISTORM-DEV] COPYRECT/EX from/to null pointer not allowed. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else if (pi_word[2] == 0 || pi_word[3] == 0) { + printf("[PISTORM-DEV] COPYRECT/EX called with a width/height of 0. Aborting.\n"); + pi_cmd_result = PI_RES_INVALIDVALUE; + } else { + int32_t src = get_mapped_item_by_address(cfg, pi_ptr[0]); + int32_t dst = get_mapped_item_by_address(cfg, pi_ptr[1]); + + if (addr != PI_CMD_COPYRECT_EX) { + // Clear out the src/dst coordinates in case something else set them previously. + pi_word[4] = pi_word[5] = pi_word[6] = pi_word[7] = 0; + } + + if (dst != -1 && src != -1) { + uint8_t *src_ptr = &cfg->map_data[src][(pi_ptr[0] - cfg->map_offset[src])]; + uint8_t *dst_ptr = &cfg->map_data[dst][(pi_ptr[1] - cfg->map_offset[dst])]; + if (addr == PI_CMD_COPYRECT_EX) { + // Adjust pointers in the case of available src/dst coordinates. + src_ptr += pi_word[4] + (pi_word[5] * pi_word[0]); + dst_ptr += pi_word[6] + (pi_word[7] * pi_word[1]); + } + + for (int i = 0; i < pi_word[3]; i++) { + memcpy(dst_ptr, src_ptr, pi_word[2]); + + src_ptr += pi_word[0]; + dst_ptr += pi_word[1]; + } + } else { + uint32_t src_offset = 0, dst_offset = 0; + uint8_t tmp = 0; + + if (addr == PI_CMD_COPYRECT_EX) { + src_offset += pi_word[4] + (pi_word[5] * pi_word[0]); + dst_offset += pi_word[6] + (pi_word[7] * pi_word[1]); + } + + for (uint32_t y = 0; y < pi_word[3]; y++) { + for (uint32_t x = 0; x < pi_word[2]; x++) { + if (src == -1) tmp = (unsigned char)m68k_read_memory_8(pi_ptr[0] + src_offset + x); + else tmp = cfg->map_data[src][(pi_ptr[0] + src_offset + x) - cfg->map_offset[src]]; + + if (dst == -1) m68k_write_memory_8(pi_ptr[1] + dst_offset + x, tmp); + else cfg->map_data[dst][(pi_ptr[1] + dst_offset + x) - cfg->map_offset[dst]] = tmp; + } + src_offset += pi_word[0]; + dst_offset += pi_word[1]; + } + } + } + break; + + case PI_CMD_SHOWFPS: rtg_show_fps((uint8_t)val); break; + case PI_CMD_PALETTEDEBUG: rtg_palette_debug((uint8_t)val); break; case PI_CMD_RTGSTATUS: DEBUG("[PISTORM-DEV] Write to RTGSTATUS: %d\n", val); if (val == 1 && !rtg_enabled) { - init_rtg_data(); + init_rtg_data(cfg); rtg_enabled = 1; pi_cmd_result = PI_RES_OK; } else if (val == 0 && rtg_enabled) { @@ -304,7 +424,7 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { 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"); + add_mapping(cfg, MAPTYPE_ROM, cfg->map_offset[index], cfg->map_size[index], 0, tmp_string, "kickstart", 0); pi_cmd_result = PI_RES_OK; do_reset = 1; } else { @@ -334,7 +454,7 @@ void handle_pistorm_dev_write(uint32_t addr_, uint32_t val, uint8_t type) { 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"); + add_mapping(cfg, MAPTYPE_ROM, cfg->map_offset[index], cfg->map_size[index], 0, tmp_string, "extended", 0); pi_cmd_result = PI_RES_OK; do_reset = 1; } else { @@ -463,6 +583,9 @@ uint32_t handle_pistorm_dev_read(uint32_t addr_, uint8_t type) { DEBUG("[PISTORM-DEV] %s Read from PISCSI_CTRL\n", op_type_names[type]); return piscsi_enabled; break; + case PI_CMD_GET_FB: + //DEBUG("[PISTORM-DEV] %s read from GET_FB: %.8X\n", op_type_names[type], rtg_get_fb()); + return rtg_get_fb(); case PI_DBG_VAL1: case PI_DBG_VAL2: case PI_DBG_VAL3: case PI_DBG_VAL4: case PI_DBG_VAL5: case PI_DBG_VAL6: case PI_DBG_VAL7: case PI_DBG_VAL8: @@ -479,13 +602,18 @@ uint32_t handle_pistorm_dev_read(uint32_t addr_, uint8_t type) { DEBUG("[PISTORM-DEV] Read WORD %d (%d / $%.4X)\n", (addr - PI_WORD1) / 2, pi_word[(addr - PI_WORD1) / 2], pi_word[(addr - PI_WORD1) / 2]); return pi_word[(addr - PI_WORD1) / 2]; break; + case PI_WORD5: case PI_WORD6: case PI_WORD7: case PI_WORD8: + case PI_WORD9: case PI_WORD10: case PI_WORD11: case PI_WORD12: + DEBUG("[PISTORM-DEV] Read WORD %d (%d / $%.4X)\n", (addr - PI_WORD5) / 2, pi_word[(addr - PI_WORD5) / 2], pi_word[(addr - PI_WORD5) / 2]); + return pi_word[(addr - PI_WORD5) / 2]; + break; case PI_LONGWORD1: case PI_LONGWORD2: case PI_LONGWORD3: case PI_LONGWORD4: DEBUG("[PISTORM-DEV] Read LONGWORD %d (%d / $%.8X)\n", (addr - PI_LONGWORD1) / 4, pi_longword[(addr - PI_LONGWORD1) / 4], pi_longword[(addr - PI_LONGWORD1) / 4]); return pi_longword[(addr - PI_LONGWORD1) / 4]; break; case PI_CMDRESULT: - DEBUG("[PISTORM-DEV] %s Read from CMDRESULT: %d\n", op_type_names[type], pi_cmd_result); + //DEBUG("[PISTORM-DEV] %s Read from CMDRESULT: %d\n", op_type_names[type], pi_cmd_result); return pi_cmd_result; break;