// odlaczcart (wylacz demux, cart niewidzialny), 1 = odlaczony, 0 = wlaczony #define CARTENABLE (2 << 7) // wylaczcart (wylacz rom), 1 = wylaczony, 0 = wlaczony #define CARTEXROM (2 << 6) // chuj wie czy w oogel uzywane #define CARTCEROM (2 << 5) // UNUSED! #define CARTRESETSD2IEC (2 << 4) static BYTE regs[4]; static int currbank; /* some prototypes are needed */ static BYTE final_v3_io1_read(WORD addr); static void final_v3_io1_store(WORD addr, BYTE value); static BYTE final_v3_io2_read(WORD addr); static void final_v3_io2_store(WORD addr, BYTE value); static int final_v3_dump(void); static io_source_t final3_io1_device = { CARTRIDGE_NAME_FINAL_III, IO_DETACH_CART, NULL, 0xde00, 0xdeff, 0xff, 1, /* read is always valid */ final_v3_io1_store, final_v3_io1_read, final_v3_io1_read, final_v3_dump, CARTRIDGE_FINAL_III, 0, 0 }; static io_source_t final3_io2_device = { CARTRIDGE_NAME_FINAL_III, IO_DETACH_CART, NULL, 0xdf00, 0xdfff, 0xff, 1, /* read is always valid */ final_v3_io2_store, final_v3_io2_read, final_v3_io2_read, final_v3_dump, CARTRIDGE_FINAL_III, 0, 0 }; static io_source_list_t *final3_io1_list_item = NULL; static io_source_list_t *final3_io2_list_item = NULL; static const c64export_resource_t export_res_v3 = { CARTRIDGE_NAME_FINAL_III, 1, 0, &final3_io1_device, &final3_io2_device, CARTRIDG
E_FINAL_III }; /* ---------------------------------------------------------------------*/ BYTE final_v3_io1_read(WORD addr) { if (addr < 4 && (regs[0] & CARTENABLE)) return regs[addr]; return 0; } void final_v3_io1_store(WORD addr, BYTE value) { if (addr < 4) { if (addr == 0) { if (value & 2 << 3) { printf("8k!"); } if (value & CARTENABLE) return; // cart disabled if (value & CARTEXROM) cart_config_changed_slotmain(2, 2, CMODE_WRITE); // wylacz rom carta regs[0] = value; currbank = regs[0] & 0x0f; cart_romlbank_set_slotmain(currbank); cart_romhbank_set_slotmain(currbank); cart_config_changed_slotmain(1, 1, CMODE_WRITE); // banki pod $8000 i a000 return; } regs[addr] = value; } } BYTE final_v3_io2_read(WORD addr) { return 0; } void final_v3_io2_store(WORD addr, BYTE value) { } static int final_v3_dump(void) { mon_out("Bank: %d", currbank); return 0; } /* ---------------------------------------------------------------------*/ void final_v3_freeze(void) { } void final_v3_config_init(void) { currbank = 0; regs[0] = 0; regs[1] = 0; regs[2] = 0; regs[3] = 0; cart_romlbank_set_slotmain(0); cart_romhbank_set_slotmain(0); cart_config_changed_slotmain(1, 1, CMODE_READ); } void final_v3_config_setup(BYTE *rawcart) { //memcpy(&roml_banks[0x0000], &rawcart[0x0000], 0x2000); memcpy(&roml_banks[0x0000], &rawcart[0x0000], 0x2000); memcpy(&romh_banks[0x0000], &rawcart[0x2000], 0x2000); memcpy(&roml_banks[0x2000], &rawcart[0x4000], 0x2000); memcpy(&romh_banks[0x2000], &rawcart[0x6000], 0x2000); memcpy(&roml_banks[0x4000], &rawcart[0x8000], 0x2000); memcpy(&romh_banks[0x4000], &rawcart[0xa000], 0x2000); memcpy(&roml_banks[0x6000], &rawcart[0xc000], 0x2000); memcpy(&romh_banks[0x6000], &rawcart[0xe000], 0x2000); cart_config_changed_slotmain(1, 1, CMODE_READ); } /* ---------------------------------------------------------------------*/ static int final_v3_common_attach(void) { if (c64export_add(&export_res_v3) < 0) { return -1; } final3_io1_list_item = io_source_register(&final3_io1_device); final3_io2_list_item = io_source_register(&final3_io2_device); return 0; } int final_v3_bin_attach(const char *filename, BYTE *rawcart) { if (util_file_load(filename, rawcart, 0x20000, UTIL_FILE_LOAD_SKIP_ADDRESS) < 0)
{ return -1; } return final_v3_common_attach(); } int final_v3_crt_attach(FILE *fd, BYTE *rawcart) { return final_v3_common_attach(); } void final_v3_detach(void) { c64export_remove(&export_res_v3); io_source_unregister(final3_io1_list_item); io_source_unregister(final3_io2_list_item); final3_io1_list_item = NULL; final3_io2_list_item = NULL; } /* ---------------------------------------------------------------------*/ #define CART_DUMP_VER_MAJOR 0 #define CART_DUMP_VER_MINOR 0 #define SNAP_MODULE_NAME "CARTFC3" int final_v3_snapshot_write_module(snapshot_t *s) { return 0; } int final_v3_snapshot_read_module(snapshot_t *s) { return 0; }