Skip to content

Commit

Permalink
added support for 'BMP Data Turbo 2000' cartridge
Browse files Browse the repository at this point in the history
git-svn-id: https://svn.code.sf.net/p/vice-emu/code/trunk@45377 379a1393-f5fb-40a0-bcee-ef074d9b53f7
  • Loading branch information
mrdudz committed Nov 25, 2024
1 parent aab2855 commit e54cb4d
Show file tree
Hide file tree
Showing 9 changed files with 407 additions and 3 deletions.
1 change: 1 addition & 0 deletions vice/NEWS
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
31 changes: 31 additions & 0 deletions vice/doc/vice.texi
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions vice/src/c64/cart/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@ libc64cart_a_SOURCES = \
blackbox8.h \
blackbox9.c \
blackbox9.h \
bmpdataturbo.c \
bmpdataturbo.h \
bisplus.c \
bisplus.h \
c64-generic.c \
Expand Down
287 changes: 287 additions & 0 deletions vice/src/c64/cart/bmpdataturbo.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,287 @@
/*
* bmpdataturbo.c - Cartridge handling, BMP Data Turbo 2000 cart.
*
* Written by
* groepaz <groepaz@gmx.net>
*
* 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 <stdio.h>
#include <stdlib.h>
#include <string.h>

#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;
}
46 changes: 46 additions & 0 deletions vice/src/c64/cart/bmpdataturbo.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
/*
* bmpdataturbo.h - Cartridge handling, BMP Data Turbo 2000 cart.
*
* Written by
* groepaz <groepaz@gmx.net>
*
* 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 <stdio.h>

#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
Loading

0 comments on commit e54cb4d

Please sign in to comment.