diff --git a/vice/NEWS b/vice/NEWS index 05a177456d..60068325d2 100644 --- a/vice/NEWS +++ b/vice/NEWS @@ -136,6 +136,7 @@ in the UI). - extended DQBB support, support 16-256k RAM, support C128 mode. - added support for UC1/UC15/UC2 cartridges +- added support for BMP Data Turbo 2000 cartridge - correctly assign rr revision when mounting crt file - various WiC64 related fixes - Make possible to enable the CP/M cartridge again diff --git a/vice/doc/vice.texi b/vice/doc/vice.texi index 1c04fc6f5d..777c35b609 100644 --- a/vice/doc/vice.texi +++ b/vice/doc/vice.texi @@ -22946,6 +22946,8 @@ Blackbox V4 .crt file Blackbox V8 .crt file @item bb9 Blackbox V9 .crt file +@item bdt +BMP Data Turbo 2000 .crt file @item cap Capture .crt file @item comal @@ -34047,6 +34049,35 @@ E0C0: 2C CA 91 AD 0A 03 AE 0B 03 8D B8 02 8E B9 02 A9 ,............... Basic CRT files (8K, 16K, UltiMax) can be loaded into UC2 SRAM from ROM or Disk and ececuted by a Reset. +@c @node FIXME +@subsubsection 83 - BMP Data Turbo 2000 + +@multitable @columnfractions .3 .7 +@item Size +@tab 16KiB +@item EXROM +@tab active (lo) (0) +@item GAME +@tab active (lo) (0) +@item Load address +@tab $8000-BFFF +@end multitable + +@example + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ASCII + ----------------------------------------------- ---------------- +0000: 43 36 34 20 43 41 52 54 52 49 44 47 45 20 20 20 C64 CARTRIDGE +0010: 00 00 00 40 01 00 00 53 00 00 00 00 00 00 00 00 ...@...S........ +0020: 42 4d 50 20 44 61 74 61 20 54 75 72 62 6f 20 32 BMP Data Turbo 2 +0030: 30 30 30 00 00 00 00 00 00 00 00 00 00 00 00 00 000............. +0040: 43 48 49 50 00 00 40 10 00 00 00 00 80 00 40 00 CHIP..@.......@. +0050: 09 80 00 08 c3 c2 cd 38 30 a2 0b 8e 11 d0 20 a3 .......80....... + +@end example + + After RESET or POWER ON, 16KiB of cartridge ROM is visible at + $8000-$BFFF. ROM at $8000-$BFFF is disabled by writing into the I/O-2 + area (typically $DF00) and may be re-enabled by writing into I/O-1 ($DE00). @c @node FIXME @subsection C128 Cartridge Specifics diff --git a/vice/src/c64/cart/Makefile.am b/vice/src/c64/cart/Makefile.am index 47275038c3..ed7742c73b 100644 --- a/vice/src/c64/cart/Makefile.am +++ b/vice/src/c64/cart/Makefile.am @@ -50,6 +50,8 @@ libc64cart_a_SOURCES = \ blackbox8.h \ blackbox9.c \ blackbox9.h \ + bmpdataturbo.c \ + bmpdataturbo.h \ bisplus.c \ bisplus.h \ c64-generic.c \ diff --git a/vice/src/c64/cart/bmpdataturbo.c b/vice/src/c64/cart/bmpdataturbo.c new file mode 100644 index 0000000000..de361ee806 --- /dev/null +++ b/vice/src/c64/cart/bmpdataturbo.c @@ -0,0 +1,287 @@ +/* + * bmpdataturbo.c - Cartridge handling, BMP Data Turbo 2000 cart. + * + * Written by + * groepaz + * + * This file is part of VICE, the Versatile Commodore Emulator. + * See README for copyright notice. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. + * + */ + +#define DEBUG_BMPDATATURBO + +#include "vice.h" + +#include +#include +#include + +#define CARTRIDGE_INCLUDE_SLOTMAIN_API +#include "c64cartsystem.h" +#undef CARTRIDGE_INCLUDE_SLOTMAIN_API +#include "c64mem.h" +#include "cartio.h" +#include "cartridge.h" +#include "export.h" +#include "monitor.h" +#include "snapshot.h" +#include "types.h" +#include "util.h" +#include "bmpdataturbo.h" +#include "crt.h" +#include "log.h" + +#ifdef DEBUG_BMPDATATURBO +#define DBG(x) log_printf x +#else +#define DBG(x) +#endif + +/* + BMP Data Turbo 2000 + + - 16k ROM + - uses full io1/io2 + + io1 + - write: enable rom at 8000 + + io2 + - write: disable rom at 8000 + +*/ + +/* some prototypes are needed */ +static void bmpdataturbo_io1_store(uint16_t addr, uint8_t value); +static void bmpdataturbo_io2_store(uint16_t addr, uint8_t value); +static int bmpdataturbo_dump(void); + +static io_source_t bmpdataturbo_io1_device = { + CARTRIDGE_NAME_BMPDATATURBO, /* name of the device */ + IO_DETACH_CART, /* use cartridge ID to detach the device when involved in a read-collision */ + IO_DETACH_NO_RESOURCE, /* does not use a resource for detach */ + 0xde00, 0xdeff, 0xff, /* range for the device, regs:$de00-$deff */ + 0, /* read is never valid */ + bmpdataturbo_io1_store, /* store function */ + NULL, /* NO poke function */ + NULL, /* NO read function */ + NULL, /* NO peek function */ + bmpdataturbo_dump, /* device state information dump function */ + CARTRIDGE_BMPDATATURBO, /* cartridge ID */ + IO_PRIO_NORMAL, /* normal priority, device read needs to be checked for collisions */ + 0, /* insertion order, gets filled in by the registration function */ + IO_MIRROR_NONE /* NO mirroring */ +}; + +static io_source_t bmpdataturbo_io2_device = { + CARTRIDGE_NAME_BMPDATATURBO, /* name of the device */ + IO_DETACH_CART, /* use cartridge ID to detach the device when involved in a read-collision */ + IO_DETACH_NO_RESOURCE, /* does not use a resource for detach */ + 0xdf00, 0xdfff, 0xff, /* range for the device, regs:$df00-$dfff */ + 0, /* read is never valid */ + bmpdataturbo_io2_store, /* store function */ + NULL, /* NO poke function */ + NULL, /* NO read function */ + NULL, /* NO peek function */ + bmpdataturbo_dump, /* device state information dump function */ + CARTRIDGE_BMPDATATURBO, /* cartridge ID */ + IO_PRIO_NORMAL, /* normal priority, device read needs to be checked for collisions */ + 0, /* insertion order, gets filled in by the registration function */ + IO_MIRROR_NONE /* NO mirroring */ +}; + +static io_source_list_t *bmpdataturbo_io1_list_item = NULL; +static io_source_list_t *bmpdataturbo_io2_list_item = NULL; + +/* ---------------------------------------------------------------------*/ + +static int bmpdataturbo_enabled = 0; + +static void bmpdataturbo_io1_store(uint16_t addr, uint8_t value) +{ + bmpdataturbo_enabled = 1; + cart_config_changed_slotmain(CMODE_16KGAME, CMODE_16KGAME, CMODE_READ); + DBG(("bmpdataturbo_io1_store de%02x %02x (%s)", + addr, value, bmpdataturbo_enabled ? "enabled" : "disabled")); +} + +static void bmpdataturbo_io2_store(uint16_t addr, uint8_t value) +{ + bmpdataturbo_enabled = 0; + cart_config_changed_slotmain(CMODE_RAM, CMODE_RAM, CMODE_RAM); + DBG(("bmpdataturbo_io2_store df%02x %02x (%s)", + addr, value, bmpdataturbo_enabled ? "enabled" : "disabled")); +} + +static int bmpdataturbo_dump(void) +{ + mon_out("$8000-$9FFF ROM: %s\n", (bmpdataturbo_enabled) ? "enabled" : "disabled"); + + return 0; +} + +/* ---------------------------------------------------------------------*/ + +static const export_resource_t export_res_bmpdataturbo = { + CARTRIDGE_NAME_BMPDATATURBO, 1, 1, &bmpdataturbo_io1_device, &bmpdataturbo_io2_device, CARTRIDGE_BMPDATATURBO +}; + +/* ---------------------------------------------------------------------*/ +void bmpdataturbo_reset(void) +{ + cart_config_changed_slotmain(CMODE_16KGAME, CMODE_16KGAME, CMODE_READ); + bmpdataturbo_enabled = 1; +} + +void bmpdataturbo_config_init(void) +{ + bmpdataturbo_reset(); +} + +void bmpdataturbo_config_setup(uint8_t *rawcart) +{ + memcpy(roml_banks, rawcart, 0x2000); + memcpy(romh_banks, &rawcart[0x2000], 0x2000); + bmpdataturbo_reset(); +} + +static int bmpdataturbo_common_attach(void) +{ + if (export_add(&export_res_bmpdataturbo) < 0) { + return -1; + } + + bmpdataturbo_io1_list_item = io_source_register(&bmpdataturbo_io1_device); + bmpdataturbo_io2_list_item = io_source_register(&bmpdataturbo_io2_device); + + return 0; +} + +int bmpdataturbo_bin_attach(const char *filename, uint8_t *rawcart) +{ + if (util_file_load(filename, rawcart, 0x4000, UTIL_FILE_LOAD_SKIP_ADDRESS) < 0) { + return -1; + } + return bmpdataturbo_common_attach(); +} + +int bmpdataturbo_crt_attach(FILE *fd, uint8_t *rawcart) +{ + crt_chip_header_t chip; + + if (crt_read_chip_header(&chip, fd)) { + return -1; + } + + if (chip.start != 0x8000 || chip.size != 0x4000) { + return -1; + } + + if (crt_read_chip(rawcart, 0, &chip, fd)) { + return -1; + } + + return bmpdataturbo_common_attach(); +} + +void bmpdataturbo_detach(void) +{ + export_remove(&export_res_bmpdataturbo); + io_source_unregister(bmpdataturbo_io1_list_item); + io_source_unregister(bmpdataturbo_io2_list_item); + bmpdataturbo_io1_list_item = NULL; + bmpdataturbo_io2_list_item = NULL; +} + +/* ---------------------------------------------------------------------*/ + +/* CARTWARP snapshot module format: + + type | name | version | description + ---------------------------------------- + BYTE | ROM 8000 | 0.1 | ROM at $8000 flag + ARRAY | ROML | 0.0+ | 8192 BYTES of ROML data + ARRAY | ROMH | 0.0+ | 8192 BYTES of ROMH data + */ + +static const char snap_module_name[] = "CARTBMPDATATURBO"; +#define SNAP_MAJOR 0 +#define SNAP_MINOR 1 + +int bmpdataturbo_snapshot_write_module(snapshot_t *s) +{ + snapshot_module_t *m; + + m = snapshot_module_create(s, snap_module_name, SNAP_MAJOR, SNAP_MINOR); + + if (m == NULL) { + return -1; + } + + if (0 + || SMW_B(m, (uint8_t)bmpdataturbo_enabled) < 0 + || SMW_BA(m, roml_banks, 0x2000) < 0 + || SMW_BA(m, romh_banks, 0x2000) < 0) { + snapshot_module_close(m); + return -1; + } + + return snapshot_module_close(m); +} + +int bmpdataturbo_snapshot_read_module(snapshot_t *s) +{ + uint8_t vmajor, vminor; + snapshot_module_t *m; + + m = snapshot_module_open(s, snap_module_name, &vmajor, &vminor); + + if (m == NULL) { + return -1; + } + + /* Do not accept versions higher than current */ + if (snapshot_version_is_bigger(vmajor, vminor, SNAP_MAJOR, SNAP_MINOR)) { + snapshot_set_error(SNAPSHOT_MODULE_HIGHER_VERSION); + goto fail; + } + + /* new in 0.1 */ + if (!snapshot_version_is_smaller(vmajor, vminor, 0, 1)) { + if (SMR_B_INT(m, &bmpdataturbo_enabled) < 0) { + goto fail; + } + } else { + bmpdataturbo_enabled = 0; + } + + if (0 + || SMR_BA(m, roml_banks, 0x2000) < 0 + || SMR_BA(m, romh_banks, 0x2000) < 0) { + goto fail; + } + + snapshot_module_close(m); + + return bmpdataturbo_common_attach(); + +fail: + snapshot_module_close(m); + return -1; +} diff --git a/vice/src/c64/cart/bmpdataturbo.h b/vice/src/c64/cart/bmpdataturbo.h new file mode 100644 index 0000000000..d2bcaebbcb --- /dev/null +++ b/vice/src/c64/cart/bmpdataturbo.h @@ -0,0 +1,46 @@ +/* + * bmpdataturbo.h - Cartridge handling, BMP Data Turbo 2000 cart. + * + * Written by + * groepaz + * + * This file is part of VICE, the Versatile Commodore Emulator. + * See README for copyright notice. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + * 02111-1307 USA. + * + */ + +#ifndef VICE_BMPDATATURBO_H +#define VICE_BMPDATATURBO_H + +#include + +#include "types.h" + +void bmpdataturbo_config_setup(uint8_t *rawcart); +int bmpdataturbo_bin_attach(const char *filename, uint8_t *rawcart); +int bmpdataturbo_crt_attach(FILE *fd, uint8_t *rawcart); +void bmpdataturbo_detach(void); +void bmpdataturbo_config_init(void); +void bmpdataturbo_reset(void); + +struct snapshot_s; + +int bmpdataturbo_snapshot_write_module(struct snapshot_s *s); +int bmpdataturbo_snapshot_read_module(struct snapshot_s *s); + +#endif diff --git a/vice/src/c64/cart/c64cart.c b/vice/src/c64/cart/c64cart.c index 5a1501db21..6319137faf 100644 --- a/vice/src/c64/cart/c64cart.c +++ b/vice/src/c64/cart/c64cart.c @@ -67,6 +67,7 @@ #include "blackbox4.h" #include "blackbox8.h" #include "blackbox9.h" +#include "bmpdataturbo.h" #include "c64-generic.h" #include "c64tpi.h" #include "comal80.h" @@ -253,6 +254,7 @@ static cartridge_info_t cartlist[] = { { CARTRIDGE_NAME_BLACKBOX4, CARTRIDGE_BLACKBOX4, CARTRIDGE_GROUP_UTIL }, { CARTRIDGE_NAME_BLACKBOX8, CARTRIDGE_BLACKBOX8, CARTRIDGE_GROUP_UTIL }, { CARTRIDGE_NAME_BLACKBOX9, CARTRIDGE_BLACKBOX9, CARTRIDGE_GROUP_UTIL }, + { CARTRIDGE_NAME_BMPDATATURBO, CARTRIDGE_BMPDATATURBO, CARTRIDGE_GROUP_UTIL }, { CARTRIDGE_NAME_CAPTURE, CARTRIDGE_CAPTURE, CARTRIDGE_GROUP_FREEZER }, { CARTRIDGE_NAME_COMAL80, CARTRIDGE_COMAL80, CARTRIDGE_GROUP_UTIL }, { CARTRIDGE_NAME_DELA_EP256, CARTRIDGE_DELA_EP256, CARTRIDGE_GROUP_UTIL }, @@ -432,6 +434,7 @@ static int set_cartridge_type(int val, void *param) case CARTRIDGE_BLACKBOX4: case CARTRIDGE_BLACKBOX8: case CARTRIDGE_BLACKBOX9: + case CARTRIDGE_BMPDATATURBO: case CARTRIDGE_CAPTURE: case CARTRIDGE_COMAL80: case CARTRIDGE_DELA_EP64: @@ -788,6 +791,9 @@ static int crt_attach(const char *filename, uint8_t *rawcart) case CARTRIDGE_BLACKBOX9: rc = blackbox9_crt_attach(fd, rawcart); break; + case CARTRIDGE_BMPDATATURBO: + rc = bmpdataturbo_crt_attach(fd, rawcart); + break; case CARTRIDGE_CAPTURE: rc = capture_crt_attach(fd, rawcart); break; diff --git a/vice/src/c64/cart/c64carthooks.c b/vice/src/c64/cart/c64carthooks.c index aa97651383..5f182f9ba1 100644 --- a/vice/src/c64/cart/c64carthooks.c +++ b/vice/src/c64/cart/c64carthooks.c @@ -68,6 +68,7 @@ #include "blackbox4.h" #include "blackbox8.h" #include "blackbox9.h" +#include "bmpdataturbo.h" #include "c64acia.h" #include "c64-generic.h" #include "c64-midi.h" @@ -249,6 +250,9 @@ static const cmdline_option_t cmdline_options[] = { "-cartbb9", CALL_FUNCTION, CMDLINE_ATTRIB_NEED_ARGS, cart_attach_cmdline, (void *)CARTRIDGE_BLACKBOX9, NULL, NULL, "", "Attach raw 32KiB " CARTRIDGE_NAME_BLACKBOX9 " cartridge image" }, + { "-cartbdt", CALL_FUNCTION, CMDLINE_ATTRIB_NEED_ARGS, + cart_attach_cmdline, (void *)CARTRIDGE_BMPDATATURBO, NULL, NULL, + "", "Attach raw 16KiB " CARTRIDGE_NAME_BMPDATATURBO " cartridge image" }, { "-cartbis", CALL_FUNCTION, CMDLINE_ATTRIB_NEED_ARGS, cart_attach_cmdline, (void *)CARTRIDGE_BISPLUS, NULL, NULL, "", "Attach raw 2/4/8KiB " CARTRIDGE_NAME_BISPLUS " cartridge image" }, @@ -933,6 +937,8 @@ int cart_bin_attach(int type, const char *filename, uint8_t *rawcart) return blackbox8_bin_attach(filename, rawcart); case CARTRIDGE_BLACKBOX9: return blackbox9_bin_attach(filename, rawcart); + case CARTRIDGE_BMPDATATURBO: + return bmpdataturbo_bin_attach(filename, rawcart); case CARTRIDGE_CAPTURE: return capture_bin_attach(filename, rawcart); case CARTRIDGE_COMAL80: @@ -1162,6 +1168,9 @@ void cart_attach(int type, uint8_t *rawcart) case CARTRIDGE_BLACKBOX9: blackbox9_config_setup(rawcart); break; + case CARTRIDGE_BMPDATATURBO: + bmpdataturbo_config_setup(rawcart); + break; case CARTRIDGE_CAPTURE: capture_config_setup(rawcart); break; @@ -1768,6 +1777,9 @@ void cart_detach(int type) case CARTRIDGE_BLACKBOX9: blackbox9_detach(); break; + case CARTRIDGE_BMPDATATURBO: + bmpdataturbo_detach(); + break; case CARTRIDGE_CAPTURE: capture_detach(); break; @@ -2070,6 +2082,9 @@ void cartridge_init_config(void) case CARTRIDGE_BLACKBOX9: blackbox9_config_init(); break; + case CARTRIDGE_BMPDATATURBO: + bmpdataturbo_config_init(); + break; case CARTRIDGE_CAPTURE: capture_config_init(); break; @@ -2378,6 +2393,9 @@ void cartridge_reset(void) case CARTRIDGE_ATOMIC_POWER: atomicpower_reset(); break; + case CARTRIDGE_BMPDATATURBO: + bmpdataturbo_reset(); + break; case CARTRIDGE_CAPTURE: capture_reset(); break; @@ -2439,10 +2457,10 @@ void cartridge_reset(void) se5_reset(); break; case CARTRIDGE_WARPSPEED: - zippcode48_reset(); + warpspeed_reset(); break; case CARTRIDGE_ZIPPCODE48: - warpspeed_reset(); + zippcode48_reset(); break; } /* "Slot 1" */ @@ -3402,6 +3420,11 @@ int cartridge_snapshot_write_modules(struct snapshot_s *s) return -1; } break; + case CARTRIDGE_BMPDATATURBO: + if (bmpdataturbo_snapshot_write_module(s) < 0) { + return -1; + } + break; case CARTRIDGE_CAPTURE: if (capture_snapshot_write_module(s) < 0) { return -1; @@ -4007,6 +4030,11 @@ int cartridge_snapshot_read_modules(struct snapshot_s *s) goto fail2; } break; + case CARTRIDGE_BMPDATATURBO: + if (bmpdataturbo_snapshot_read_module(s) < 0) { + goto fail2; + } + break; case CARTRIDGE_CAPTURE: if (capture_snapshot_read_module(s) < 0) { goto fail2; diff --git a/vice/src/cartridge.h b/vice/src/cartridge.h index aba4fd1083..589d65a789 100644 --- a/vice/src/cartridge.h +++ b/vice/src/cartridge.h @@ -265,7 +265,8 @@ void cartridge_sound_chip_init(void); #define CARTRIDGE_UC1 80 /* uc1.c */ #define CARTRIDGE_UC15 81 /* uc2.c */ #define CARTRIDGE_UC2 82 /* uc2.c */ -#define CARTRIDGE_LAST 82 /* cartconv: last cartridge in list */ +#define CARTRIDGE_BMPDATATURBO 83 /* bmpdataturbo.c */ +#define CARTRIDGE_LAST 83 /* cartconv: last cartridge in list */ /* list of canonical names for the c64 cartridges: note: often it is hard to determine "the" official name, let alone the way it @@ -292,6 +293,7 @@ void cartridge_sound_chip_init(void); #define CARTRIDGE_NAME_BLACKBOX4 "Blackbox V4" #define CARTRIDGE_NAME_BLACKBOX8 "Blackbox V8" #define CARTRIDGE_NAME_BLACKBOX9 "Blackbox V9" +#define CARTRIDGE_NAME_BMPDATATURBO "BMP Data Turbo 2000" #define CARTRIDGE_NAME_GS "C64 Games System" /* http://retro.lonningdal.net/home.php?page=Computers&select=c64gs&image=c64gs4.jpg */ #define CARTRIDGE_NAME_CAPTURE "Capture" /* see manual http://rr.pokefinder.org/wiki/Capture */ #define CARTRIDGE_NAME_COMAL80 "Comal 80" /* http://www.retroport.de/C64_C128_Hardware.html */ diff --git a/vice/src/tools/cartconv/c64-cartridges.c b/vice/src/tools/cartconv/c64-cartridges.c index 43280bf12e..a082c96bbf 100644 --- a/vice/src/tools/cartconv/c64-cartridges.c +++ b/vice/src/tools/cartconv/c64-cartridges.c @@ -150,6 +150,7 @@ const cart_t cart_info[] = { {0, 0, CARTRIDGE_SIZE_128KB | CARTRIDGE_SIZE_256KB | CARTRIDGE_SIZE_512KB, 0x4000, 0x8000, 0, 2, CARTRIDGE_NAME_UC2, "uc2", save_regular_crt}, + {0, 0, CARTRIDGE_SIZE_16KB, 0x4000, 0x8000, 1, 0, CARTRIDGE_NAME_BMPDATATURBO, "bdt", save_regular_crt}, {0, 0, 0, 0, 0, 0, 0, NULL, NULL, NULL} };