diff --git a/src/debugger/gui/CartWF8Widget.cxx b/src/debugger/gui/CartWF8Widget.cxx new file mode 100644 index 000000000..97f3816c3 --- /dev/null +++ b/src/debugger/gui/CartWF8Widget.cxx @@ -0,0 +1,47 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2024 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#include "CartWF8.hxx" +#include "CartWF8Widget.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +CartridgeWF8Widget::CartridgeWF8Widget( + GuiObject* boss, const GUI::Font& lfont, const GUI::Font& nfont, + int x, int y, int w, int h, CartridgeWF8& cart) + : CartridgeEnhancedWidget(boss, lfont, nfont, x, y, w, h, cart) +{ + myHotspotDelta = 0; + initialize(); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +string CartridgeWF8Widget::description() +{ + ostringstream info; + size_t size = 0; + const ByteBuffer& image = myCart.getImage(size); + + info << "Coleco (white label) 8K cartridge, two 4K banks\n" + << "Banks selected by D3 of value written to " << hotspotStr() << "\n" + << "Startup bank = undetermined\n"; + + uInt16 start = (image[size - 3] << 8) | image[size - 4]; + start -= start % 0x1000; + info << "Bank RORG $" << Common::Base::HEX4 << start << "\n"; + + return info.str(); +} diff --git a/src/debugger/gui/CartWF8Widget.hxx b/src/debugger/gui/CartWF8Widget.hxx new file mode 100644 index 000000000..242abfc36 --- /dev/null +++ b/src/debugger/gui/CartWF8Widget.hxx @@ -0,0 +1,49 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2024 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#ifndef CARTRIDGEWF8_WIDGET_HXX +#define CARTRIDGEWF8_WIDGET_HXX + +class CartridgeWF8; +class PopUpWidget; + +#include "CartEnhancedWidget.hxx" + +class CartridgeWF8Widget : public CartridgeEnhancedWidget +{ +public: + CartridgeWF8Widget(GuiObject* boss, const GUI::Font& lfont, + const GUI::Font& nfont, + int x, int y, int w, int h, + CartridgeWF8& cart); + ~CartridgeWF8Widget() override = default; + +private: + string manufacturer() override { return "Coleco"; } + + string description() override; + +private: + // Following constructors and assignment operators not supported + CartridgeWF8Widget() = delete; + CartridgeWF8Widget(const CartridgeWF8Widget&) = delete; + CartridgeWF8Widget(CartridgeWF8Widget&&) = delete; + CartridgeWF8Widget& operator=(const CartridgeWF8Widget&) = delete; + CartridgeWF8Widget& operator=(CartridgeWF8Widget&&) = delete; +}; + +#endif diff --git a/src/emucore/CartWF8.cxx b/src/emucore/CartWF8.cxx new file mode 100644 index 000000000..b1c79ad88 --- /dev/null +++ b/src/emucore/CartWF8.cxx @@ -0,0 +1,39 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2024 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#include "CartWF8.hxx" + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +CartridgeWF8::CartridgeWF8(const ByteBuffer& image, size_t size, + string_view md5, const Settings& settings, + size_t bsSize) + : CartridgeEnhanced(image, size, md5, settings, bsSize) +{ +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +bool CartridgeWF8::checkSwitchBank(uInt16 address, uInt8 value) +{ + // Switch banks if necessary + // Note: addresses could be calculated from hotspot and bank count + if (address == 0x1FF8) + { + bank((value & 0b100) >> 2); + return true; + } + return false; +} diff --git a/src/emucore/CartWF8.hxx b/src/emucore/CartWF8.hxx new file mode 100644 index 000000000..848cbfd85 --- /dev/null +++ b/src/emucore/CartWF8.hxx @@ -0,0 +1,84 @@ +//============================================================================ +// +// SSSS tt lll lll +// SS SS tt ll ll +// SS tttttt eeee ll ll aaaa +// SSSS tt ee ee ll ll aa +// SS tt eeeeee ll ll aaaaa -- "An Atari 2600 VCS Emulator" +// SS SS tt ee ll ll aa aa +// SSSS ttt eeeee llll llll aaaaa +// +// Copyright (c) 1995-2024 by Bradford W. Mott, Stephen Anthony +// and the Stella Team +// +// See the file "License.txt" for information on usage and redistribution of +// this file, and for a DISCLAIMER OF ALL WARRANTIES. +//============================================================================ + +#ifndef CARTWF8_HXX +#define CARTWF8_HXX + +#include "CartEnhanced.hxx" +#ifdef DEBUGGER_SUPPORT +#include "CartWF8Widget.hxx" +#endif + +/** + Cartridge class used for certain Coleco 8K bankswitched games. There are two + 4K banks, banks are selected by D3 of the value written to $1FF8. + + @author Thomas Jentzsch +*/ +class CartridgeWF8 : public CartridgeEnhanced +{ + friend class CartridgeWF4Widget; + +public: + /** + Create a new cartridge using the specified image + + @param image Pointer to the ROM image + @param size The size of the ROM image + @param md5 The md5sum of the ROM image + @param settings A reference to the various settings (read-only) + @param bsSize The size specified by the bankswitching scheme + */ + CartridgeWF8(const ByteBuffer& image, size_t size, string_view md5, + const Settings& settings, size_t bsSize = 8_KB); + ~CartridgeWF8() override = default; + +public: + /** + Get a descriptor for the device name (used in error checking). + + @return The name of the object + */ + string name() const override { return "CartridgeWF8"; } + +#ifdef DEBUGGER_SUPPORT + /** + Get debugger widget responsible for accessing the inner workings + of the cart. + */ + CartDebugWidget* debugWidget(GuiObject* boss, const GUI::Font& lfont, + const GUI::Font& nfont, int x, int y, int w, int h) override + { + return new CartridgeWF8Widget(boss, lfont, nfont, x, y, w, h, *this); + } +#endif + +private: + bool checkSwitchBank(uInt16 address, uInt8 value) override; + + uInt16 hotspot() const override { return 0x1FF8; } + +private: + // Following constructors and assignment operators not supported + CartridgeWF8() = delete; + CartridgeWF8(const CartridgeWF8&) = delete; + CartridgeWF8(CartridgeWF8&&) = delete; + CartridgeWF8& operator=(const CartridgeWF8&) = delete; + CartridgeWF8& operator=(CartridgeWF8&&) = delete; +}; + +#endif