| Previous | 199869 Revisions | Next |
| r31767 Monday 25th August, 2014 at 11:15:32 UTC by Fabio Priuli |
|---|
| (MESS) a7800.c progress: [Fabio Priuli] - Rewritten cart emulation to use slot devices - Removed POKEY chip from the main unit since it was inside the carts (of course it gets enabled when you launch a game who contained it in its cart) - Added support for the High Score cart as a passthru cart: when you mount hiscore, a -cart2 switch will become available to mount the game you want to play - Properly implemented XBoarD and XM expansions as passthru carts as well, so that new syntax to run dkxm.a78 is "mess a7800 -cart xm -cart2 path\to\games\dkxm.a78" High Score support for XM shall work as well. - Big clean up of the driver, simplifying memory map, removing writes to ROM, etc. Out of whatsnew: In conclusion, a7800.c has been brought into the new millennium ;-) |
| [hash] | a7800.xml |
| [src/emu/bus] | bus.mak |
| [src/emu/bus/a7800] | a78_carts.h* a78_slot.c* a78_slot.h* hiscore.c* hiscore.h* rom.c* rom.h* xboard.c* xboard.h* |
| [src/mess] | mess.mak |
| [src/mess/drivers] | a7800.c |
| [src/mess/includes] | a7800.h |
| [src/mess/machine] | |
| [src/mess/video] | a7800.c |
| r31766 | r31767 | |
|---|---|---|
| 16 | 16 | |
| 17 | 17 | #------------------------------------------------- |
| 18 | 18 | # |
| 19 | #@src/emu/bus/a7800/a78_slot.h,BUSES += A7800 | |
| 20 | #------------------------------------------------- | |
| 21 | ||
| 22 | ifneq ($(filter A7800,$(BUSES)),) | |
| 23 | OBJDIRS += $(BUSOBJ)/a7800 | |
| 24 | BUSOBJS += $(BUSOBJ)/a7800/a78_slot.o | |
| 25 | BUSOBJS += $(BUSOBJ)/a7800/rom.o | |
| 26 | BUSOBJS += $(BUSOBJ)/a7800/hiscore.o | |
| 27 | BUSOBJS += $(BUSOBJ)/a7800/xboard.o | |
| 28 | endif | |
| 29 | ||
| 30 | ||
| 31 | #------------------------------------------------- | |
| 32 | # | |
| 19 | 33 | #@src/emu/bus/abcbus/abcbus.h,BUSES += ABCBUS |
| 20 | 34 | #------------------------------------------------- |
| 21 | 35 |
| r0 | r31767 | |
|---|---|---|
| 1 | #ifndef __A78_XBOARD_H | |
| 2 | #define __A78_XBOARD_H | |
| 3 | ||
| 4 | #include "a78_slot.h" | |
| 5 | #include "rom.h" | |
| 6 | #include "sound/pokey.h" | |
| 7 | ||
| 8 | ||
| 9 | // ======================> a78_xboard_device | |
| 10 | ||
| 11 | class a78_xboard_device : public a78_rom_device | |
| 12 | { | |
| 13 | public: | |
| 14 | // construction/destruction | |
| 15 | a78_xboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); | |
| 16 | a78_xboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 17 | ||
| 18 | // device-level overrides | |
| 19 | virtual void device_start(); | |
| 20 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 21 | virtual void device_reset(); | |
| 22 | ||
| 23 | // reading and writing | |
| 24 | virtual DECLARE_READ8_MEMBER(read_04xx); | |
| 25 | virtual DECLARE_WRITE8_MEMBER(write_04xx); | |
| 26 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 27 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 28 | ||
| 29 | protected: | |
| 30 | required_device<a78_cart_slot_device> m_xbslot; | |
| 31 | required_device<pokey_device> m_pokey; | |
| 32 | int m_reg, m_ram_bank; | |
| 33 | }; | |
| 34 | ||
| 35 | ||
| 36 | // ======================> a78_xm_device | |
| 37 | ||
| 38 | class a78_xm_device : public a78_xboard_device | |
| 39 | { | |
| 40 | public: | |
| 41 | // construction/destruction | |
| 42 | a78_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 43 | ||
| 44 | // reading and writing | |
| 45 | virtual DECLARE_READ8_MEMBER(read_10xx); | |
| 46 | virtual DECLARE_WRITE8_MEMBER(write_10xx); | |
| 47 | virtual DECLARE_READ8_MEMBER(read_30xx); | |
| 48 | }; | |
| 49 | ||
| 50 | ||
| 51 | ||
| 52 | // device type definition | |
| 53 | extern const device_type A78_XBOARD; | |
| 54 | extern const device_type A78_XM; | |
| 55 | ||
| 56 | ||
| 57 | #endif |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | #ifndef __A78_SLOT_H | |
| 2 | #define __A78_SLOT_H | |
| 3 | ||
| 4 | ||
| 5 | /*************************************************************************** | |
| 6 | TYPE DEFINITIONS | |
| 7 | ***************************************************************************/ | |
| 8 | ||
| 9 | ||
| 10 | /* PCB */ | |
| 11 | enum | |
| 12 | { | |
| 13 | A78_TYPE0 = 0, // standard 8K/16K/32K games, no bankswitch | |
| 14 | A78_TYPE1, // as TYPE0 + POKEY chip on the PCB | |
| 15 | A78_TYPE2, // Atari SuperGame pcb (8x16K banks with bankswitch) | |
| 16 | A78_TYPE3, // as TYPE1 + POKEY chip on the PCB | |
| 17 | A78_TYPE6, // as TYPE1 + RAM IC on the PCB | |
| 18 | A78_TYPEA, // Alien Brigade, Crossbow (9x16K banks with diff bankswitch) | |
| 19 | A78_ABSOLUTE, // F18 Hornet | |
| 20 | A78_ACTIVISION, // Double Dragon, Rampage | |
| 21 | A78_HSC, // Atari HighScore cart | |
| 22 | A78_BANKRAM, // SuperGame + 32K RAM banked (untested) | |
| 23 | A78_XB_BOARD, // A7800 Expansion Board (it shall more or less apply to the Expansion Module too, but this is not officially released yet) | |
| 24 | A78_XM_BOARD, // A7800 XM Expansion Module (theoretical specs only, since this is not officially released yet) | |
| 25 | A78_TYPEB // Cart exploiting the XB board, but possibly also compatible with non-expanded A7800 | |
| 26 | }; | |
| 27 | ||
| 28 | ||
| 29 | // ======================> device_a78_cart_interface | |
| 30 | ||
| 31 | class device_a78_cart_interface : public device_slot_card_interface | |
| 32 | { | |
| 33 | public: | |
| 34 | // construction/destruction | |
| 35 | device_a78_cart_interface(const machine_config &mconfig, device_t &device); | |
| 36 | virtual ~device_a78_cart_interface(); | |
| 37 | ||
| 38 | // memory accessor | |
| 39 | virtual DECLARE_READ8_MEMBER(read_04xx) { return 0xff; } | |
| 40 | virtual DECLARE_READ8_MEMBER(read_10xx) { return 0xff; } | |
| 41 | virtual DECLARE_READ8_MEMBER(read_30xx) { return 0xff; } | |
| 42 | virtual DECLARE_READ8_MEMBER(read_40xx) { return 0xff; } | |
| 43 | virtual DECLARE_WRITE8_MEMBER(write_04xx) {} | |
| 44 | virtual DECLARE_WRITE8_MEMBER(write_10xx) {} | |
| 45 | virtual DECLARE_WRITE8_MEMBER(write_30xx) {} | |
| 46 | virtual DECLARE_WRITE8_MEMBER(write_40xx) {} | |
| 47 | ||
| 48 | void rom_alloc(UINT32 size); | |
| 49 | void ram_alloc(UINT32 size); | |
| 50 | void nvram_alloc(UINT32 size); | |
| 51 | UINT8* get_rom_base() { return m_rom; } | |
| 52 | UINT8* get_ram_base() { return m_ram; } | |
| 53 | UINT8* get_nvram_base() { return m_nvram; } | |
| 54 | UINT32 get_rom_size() { return m_rom.bytes(); } | |
| 55 | UINT32 get_ram_size() { return m_ram.bytes(); } | |
| 56 | UINT32 get_nvram_size() { return m_nvram.bytes(); } | |
| 57 | ||
| 58 | protected: | |
| 59 | // internal state | |
| 60 | dynamic_buffer m_rom; | |
| 61 | dynamic_buffer m_ram; | |
| 62 | dynamic_buffer m_nvram; // HiScore cart can save scores! | |
| 63 | // helpers | |
| 64 | UINT32 m_base_rom; | |
| 65 | int m_bank_mask; | |
| 66 | }; | |
| 67 | ||
| 68 | ||
| 69 | void a78_partialhash(hash_collection &dest, const unsigned char *data, unsigned long length, const char *functions); | |
| 70 | ||
| 71 | ||
| 72 | // ======================> a78_cart_slot_device | |
| 73 | ||
| 74 | class a78_cart_slot_device : public device_t, | |
| 75 | public device_image_interface, | |
| 76 | public device_slot_interface | |
| 77 | { | |
| 78 | public: | |
| 79 | // construction/destruction | |
| 80 | a78_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 81 | virtual ~a78_cart_slot_device(); | |
| 82 | ||
| 83 | // device-level overrides | |
| 84 | virtual void device_start(); | |
| 85 | virtual void device_config_complete(); | |
| 86 | ||
| 87 | // image-level overrides | |
| 88 | virtual bool call_load(); | |
| 89 | virtual void call_unload(); | |
| 90 | virtual bool call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry); | |
| 91 | ||
| 92 | int get_cart_type() { return m_type; }; | |
| 93 | int identify_cart_type(UINT8 *ROM, UINT32 len); | |
| 94 | bool has_cart() { return m_cart != NULL; } | |
| 95 | ||
| 96 | virtual iodevice_t image_type() const { return IO_CARTSLOT; } | |
| 97 | virtual bool is_readable() const { return 1; } | |
| 98 | virtual bool is_writeable() const { return 0; } | |
| 99 | virtual bool is_creatable() const { return 0; } | |
| 100 | virtual bool must_be_loaded() const { return 0; } | |
| 101 | virtual bool is_reset_on_load() const { return 1; } | |
| 102 | virtual const option_guide *create_option_guide() const { return NULL; } | |
| 103 | virtual const char *image_interface() const { return "a7800_cart"; } | |
| 104 | virtual const char *file_extensions() const { return "bin,a78"; } | |
| 105 | virtual device_image_partialhash_func get_partial_hash() const { return &a78_partialhash; } | |
| 106 | ||
| 107 | // slot interface overrides | |
| 108 | virtual void get_default_card_software(astring &result); | |
| 109 | ||
| 110 | // reading and writing | |
| 111 | virtual DECLARE_READ8_MEMBER(read_04xx); | |
| 112 | virtual DECLARE_READ8_MEMBER(read_10xx); | |
| 113 | virtual DECLARE_READ8_MEMBER(read_30xx); | |
| 114 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 115 | virtual DECLARE_WRITE8_MEMBER(write_04xx); | |
| 116 | virtual DECLARE_WRITE8_MEMBER(write_10xx); | |
| 117 | virtual DECLARE_WRITE8_MEMBER(write_30xx); | |
| 118 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 119 | ||
| 120 | private: | |
| 121 | device_a78_cart_interface* m_cart; | |
| 122 | int m_type; | |
| 123 | int m_stick_type; | |
| 124 | ||
| 125 | int verify_header(char *header); | |
| 126 | }; | |
| 127 | ||
| 128 | ||
| 129 | // device type definition | |
| 130 | extern const device_type A78_CART_SLOT; | |
| 131 | ||
| 132 | ||
| 133 | /*************************************************************************** | |
| 134 | DEVICE CONFIGURATION MACROS | |
| 135 | ***************************************************************************/ | |
| 136 | ||
| 137 | #define MCFG_A78_CARTRIDGE_ADD(_tag,_slot_intf,_def_slot) \ | |
| 138 | MCFG_DEVICE_ADD(_tag, A78_CART_SLOT, 0) \ | |
| 139 | MCFG_DEVICE_SLOT_INTERFACE(_slot_intf, _def_slot, false) | |
| 140 | ||
| 141 | ||
| 142 | #endif |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | /*********************************************************************************************************** | |
| 2 | ||
| 3 | A7800 HighScore passthrough cart emulation | |
| 4 | ||
| 5 | ||
| 6 | ***********************************************************************************************************/ | |
| 7 | ||
| 8 | ||
| 9 | #include "emu.h" | |
| 10 | #include "hiscore.h" | |
| 11 | #include "a78_carts.h" | |
| 12 | ||
| 13 | ||
| 14 | //------------------------------------------------- | |
| 15 | // constructor | |
| 16 | //------------------------------------------------- | |
| 17 | ||
| 18 | const device_type A78_HISCORE = &device_creator<a78_hiscore_device>; | |
| 19 | ||
| 20 | ||
| 21 | a78_hiscore_device::a78_hiscore_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 22 | : a78_rom_device(mconfig, A78_HISCORE, "Atari 7800 High Score Cart", tag, owner, clock, "a78_highscore", __FILE__), | |
| 23 | m_hscslot(*this, "hsc_slot") | |
| 24 | { | |
| 25 | } | |
| 26 | ||
| 27 | ||
| 28 | static MACHINE_CONFIG_FRAGMENT( a78_highscore ) | |
| 29 | MCFG_A78_CARTRIDGE_ADD("hsc_slot", a7800_cart, NULL) | |
| 30 | MACHINE_CONFIG_END | |
| 31 | ||
| 32 | machine_config_constructor a78_hiscore_device::device_mconfig_additions() const | |
| 33 | { | |
| 34 | return MACHINE_CONFIG_NAME( a78_highscore ); | |
| 35 | } | |
| 36 | ||
| 37 | ||
| 38 | /*------------------------------------------------- | |
| 39 | mapper specific handlers | |
| 40 | -------------------------------------------------*/ | |
| 41 | ||
| 42 | READ8_MEMBER(a78_hiscore_device::read_10xx) | |
| 43 | { | |
| 44 | return m_nvram[offset]; | |
| 45 | } | |
| 46 | ||
| 47 | WRITE8_MEMBER(a78_hiscore_device::write_10xx) | |
| 48 | { | |
| 49 | m_nvram[offset] = data; | |
| 50 | } | |
| 51 | ||
| 52 | READ8_MEMBER(a78_hiscore_device::read_30xx) | |
| 53 | { | |
| 54 | return m_rom[offset]; | |
| 55 | } | |
| 56 | ||
| 57 | READ8_MEMBER(a78_hiscore_device::read_04xx) | |
| 58 | { | |
| 59 | return m_hscslot->read_04xx(space, offset); | |
| 60 | } | |
| 61 | ||
| 62 | WRITE8_MEMBER(a78_hiscore_device::write_04xx) | |
| 63 | { | |
| 64 | m_hscslot->write_04xx(space, offset, data); | |
| 65 | } | |
| 66 | ||
| 67 | READ8_MEMBER(a78_hiscore_device::read_40xx) | |
| 68 | { | |
| 69 | return m_hscslot->read_40xx(space, offset); | |
| 70 | } | |
| 71 | ||
| 72 | WRITE8_MEMBER(a78_hiscore_device::write_40xx) | |
| 73 | { | |
| 74 | m_hscslot->write_40xx(space, offset, data); | |
| 75 | } | |
| 76 |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | /*********************************************************************************************************** | |
| 2 | ||
| 3 | A7800 ROM cart emulation | |
| 4 | ||
| 5 | For the moment we use separate devices for each combination of hardware | |
| 6 | - bankswitch or not | |
| 7 | - pokey or not | |
| 8 | - 9 banks or not | |
| 9 | etc... | |
| 10 | But we might merge many of these if they become too many (e.g. could there be banked 32L RAM also | |
| 11 | in a 9banks cart or in a cart with no bankswitch?) | |
| 12 | ||
| 13 | ***********************************************************************************************************/ | |
| 14 | ||
| 15 | ||
| 16 | #include "emu.h" | |
| 17 | #include "rom.h" | |
| 18 | ||
| 19 | ||
| 20 | //------------------------------------------------- | |
| 21 | // constructor | |
| 22 | //------------------------------------------------- | |
| 23 | ||
| 24 | const device_type A78_ROM = &device_creator<a78_rom_device>; | |
| 25 | const device_type A78_ROM_SG = &device_creator<a78_rom_sg_device>; | |
| 26 | const device_type A78_ROM_POKEY = &device_creator<a78_rom_pokey_device>; | |
| 27 | const device_type A78_ROM_SG_POKEY = &device_creator<a78_rom_sg_pokey_device>; | |
| 28 | const device_type A78_ROM_SG_RAM = &device_creator<a78_rom_sg_ram_device>; | |
| 29 | const device_type A78_ROM_BANKRAM = &device_creator<a78_rom_bankram_device>; | |
| 30 | const device_type A78_ROM_SG_9BANKS = &device_creator<a78_rom_sg_9banks_device>; | |
| 31 | const device_type A78_ROM_XM = &device_creator<a78_rom_xm_device>; | |
| 32 | const device_type A78_ROM_ABSOLUTE = &device_creator<a78_rom_abs_device>; | |
| 33 | const device_type A78_ROM_ACTIVISION = &device_creator<a78_rom_act_device>; | |
| 34 | ||
| 35 | ||
| 36 | a78_rom_device::a78_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) | |
| 37 | : device_t(mconfig, type, name, tag, owner, clock, shortname, source), | |
| 38 | device_a78_cart_interface( mconfig, *this ) | |
| 39 | { | |
| 40 | } | |
| 41 | ||
| 42 | a78_rom_device::a78_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 43 | : device_t(mconfig, A78_ROM, "Atari 7800 ROM Carts w/no Bankswitch", tag, owner, clock, "a78_rom", __FILE__), | |
| 44 | device_a78_cart_interface( mconfig, *this ) | |
| 45 | { | |
| 46 | } | |
| 47 | ||
| 48 | a78_rom_pokey_device::a78_rom_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 49 | : a78_rom_device(mconfig, A78_ROM_POKEY, "Atari 7800 ROM Carts w/no Bankswitch + POKEY", tag, owner, clock, "a78_rom_pok", __FILE__), | |
| 50 | m_pokey(*this, "pokey") | |
| 51 | { | |
| 52 | } | |
| 53 | ||
| 54 | ||
| 55 | a78_rom_sg_device::a78_rom_sg_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) | |
| 56 | : a78_rom_device(mconfig, type, name, tag, owner, clock, shortname, source) | |
| 57 | { | |
| 58 | } | |
| 59 | ||
| 60 | a78_rom_sg_device::a78_rom_sg_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 61 | : a78_rom_device(mconfig, A78_ROM_SG, "Atari 7800 ROM Carts w/SuperGame Bankswitch", tag, owner, clock, "a78_rom_sg", __FILE__) | |
| 62 | { | |
| 63 | } | |
| 64 | ||
| 65 | a78_rom_sg_pokey_device::a78_rom_sg_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 66 | : a78_rom_sg_device(mconfig, A78_ROM_SG_POKEY, "Atari 7800 ROM Carts w/SuperGame Bankswitch + POKEY", tag, owner, clock, "a78_rom_sgp", __FILE__), | |
| 67 | m_pokey(*this, "pokey") | |
| 68 | { | |
| 69 | } | |
| 70 | ||
| 71 | ||
| 72 | a78_rom_sg_ram_device::a78_rom_sg_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 73 | : a78_rom_sg_device(mconfig, A78_ROM_SG_RAM, "Atari 7800 ROM Carts w/SuperGame Bankswitch + RAM", tag, owner, clock, "a78_rom_sgr", __FILE__) | |
| 74 | { | |
| 75 | } | |
| 76 | ||
| 77 | ||
| 78 | a78_rom_bankram_device::a78_rom_bankram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 79 | : a78_rom_sg_device(mconfig, A78_ROM_BANKRAM, "Atari 7800 ROM Carts w/SuperGame Bankswitch + Banked RAM", tag, owner, clock, "a78_rom_bankram", __FILE__) | |
| 80 | { | |
| 81 | } | |
| 82 | ||
| 83 | ||
| 84 | a78_rom_sg_9banks_device::a78_rom_sg_9banks_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) | |
| 85 | : a78_rom_sg_device(mconfig, type, name, tag, owner, clock, shortname, source) | |
| 86 | { | |
| 87 | } | |
| 88 | ||
| 89 | a78_rom_sg_9banks_device::a78_rom_sg_9banks_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 90 | : a78_rom_sg_device(mconfig, A78_ROM_SG_9BANKS, "Atari 7800 ROM Carts w/SuperGame 9Banks", tag, owner, clock, "a78_rom_sg9", __FILE__) | |
| 91 | { | |
| 92 | } | |
| 93 | ||
| 94 | ||
| 95 | a78_rom_xm_device::a78_rom_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 96 | : a78_rom_sg_9banks_device(mconfig, A78_ROM_XM, "Atari 7800 ROM Carts w/SuperGame 9Banks + POKEY (XM demo)", tag, owner, clock, "a78_rom_xm", __FILE__), | |
| 97 | m_pokey(*this, "pokey") | |
| 98 | { | |
| 99 | } | |
| 100 | ||
| 101 | ||
| 102 | a78_rom_abs_device::a78_rom_abs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 103 | : a78_rom_device(mconfig, A78_ROM_ABSOLUTE, "Atari 7800 ROM Carts w/Absolute Bankswitch", tag, owner, clock, "a78_rom_abs", __FILE__) | |
| 104 | { | |
| 105 | } | |
| 106 | ||
| 107 | ||
| 108 | a78_rom_act_device::a78_rom_act_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 109 | : a78_rom_device(mconfig, A78_ROM_ACTIVISION, "Atari 7800 ROM Carts w/Activision Bankswitch", tag, owner, clock, "a78_rom_act", __FILE__) | |
| 110 | { | |
| 111 | } | |
| 112 | ||
| 113 | ||
| 114 | ||
| 115 | void a78_rom_device::device_start() | |
| 116 | { | |
| 117 | } | |
| 118 | ||
| 119 | void a78_rom_device::device_reset() | |
| 120 | { | |
| 121 | } | |
| 122 | ||
| 123 | void a78_rom_sg_device::device_start() | |
| 124 | { | |
| 125 | save_item(NAME(m_bank)); | |
| 126 | } | |
| 127 | ||
| 128 | void a78_rom_sg_device::device_reset() | |
| 129 | { | |
| 130 | m_bank = 0; | |
| 131 | } | |
| 132 | ||
| 133 | void a78_rom_bankram_device::device_start() | |
| 134 | { | |
| 135 | save_item(NAME(m_bank)); | |
| 136 | save_item(NAME(m_ram_bank)); | |
| 137 | } | |
| 138 | ||
| 139 | void a78_rom_bankram_device::device_reset() | |
| 140 | { | |
| 141 | m_bank = 0; | |
| 142 | m_ram_bank = 0; | |
| 143 | } | |
| 144 | ||
| 145 | void a78_rom_abs_device::device_start() | |
| 146 | { | |
| 147 | save_item(NAME(m_bank)); | |
| 148 | } | |
| 149 | ||
| 150 | void a78_rom_abs_device::device_reset() | |
| 151 | { | |
| 152 | m_bank = 0; | |
| 153 | } | |
| 154 | ||
| 155 | void a78_rom_act_device::device_start() | |
| 156 | { | |
| 157 | save_item(NAME(m_bank)); | |
| 158 | } | |
| 159 | ||
| 160 | void a78_rom_act_device::device_reset() | |
| 161 | { | |
| 162 | m_bank = 0; | |
| 163 | } | |
| 164 | ||
| 165 | // TO DO: do we need a PAL variant?!? | |
| 166 | static MACHINE_CONFIG_FRAGMENT( a78_pokey ) | |
| 167 | MCFG_SPEAKER_STANDARD_MONO("addon") | |
| 168 | ||
| 169 | MCFG_SOUND_ADD("pokey", POKEY, XTAL_14_31818MHz/8) | |
| 170 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "addon", 1.00) | |
| 171 | MACHINE_CONFIG_END | |
| 172 | ||
| 173 | ||
| 174 | /*------------------------------------------------- | |
| 175 | mapper specific handlers | |
| 176 | -------------------------------------------------*/ | |
| 177 | ||
| 178 | /*------------------------------------------------- | |
| 179 | ||
| 180 | Carts with no bankswitch (8K to 48K) | |
| 181 | ||
| 182 | GAMES: | |
| 183 | ||
| 184 | -------------------------------------------------*/ | |
| 185 | ||
| 186 | READ8_MEMBER(a78_rom_device::read_40xx) | |
| 187 | { | |
| 188 | if (offset + 0x4000 < m_base_rom) | |
| 189 | return 0xff; | |
| 190 | else | |
| 191 | return m_rom[offset + 0x4000 - m_base_rom]; | |
| 192 | } | |
| 193 | ||
| 194 | /*------------------------------------------------- | |
| 195 | ||
| 196 | Carts with no bankswitch + POKEY chip | |
| 197 | The Pokey chips is accessed at 0x0450-0x045f or | |
| 198 | by writing at 0x4000-0x7fff in some games. | |
| 199 | ||
| 200 | GAMES: | |
| 201 | ||
| 202 | -------------------------------------------------*/ | |
| 203 | ||
| 204 | WRITE8_MEMBER(a78_rom_pokey_device::write_40xx) | |
| 205 | { | |
| 206 | if (offset < 0x4000) | |
| 207 | m_pokey->write(space, offset & 0x0f, data); | |
| 208 | } | |
| 209 | ||
| 210 | READ8_MEMBER(a78_rom_pokey_device::read_04xx) | |
| 211 | { | |
| 212 | if (offset >= 0x50 && offset < 0x60) | |
| 213 | return m_pokey->read(space, offset & 0x0f); | |
| 214 | else | |
| 215 | return 0xff; | |
| 216 | } | |
| 217 | ||
| 218 | WRITE8_MEMBER(a78_rom_pokey_device::write_04xx) | |
| 219 | { | |
| 220 | if (offset >= 0x50 && offset < 0x60) | |
| 221 | m_pokey->write(space, offset & 0x0f, data); | |
| 222 | } | |
| 223 | ||
| 224 | machine_config_constructor a78_rom_pokey_device::device_mconfig_additions() const | |
| 225 | { | |
| 226 | return MACHINE_CONFIG_NAME( a78_pokey ); | |
| 227 | } | |
| 228 | ||
| 229 | ||
| 230 | /*------------------------------------------------- | |
| 231 | ||
| 232 | Carts with SuperGame bankswitch: | |
| 233 | 8 x 16K banks mappable in 0x8000-0xbfff | |
| 234 | bank 7 is always mapped in 0xc000-0xffff | |
| 235 | range 0x4000-0x7fff is not clear: some games | |
| 236 | expect bank 6 to be mapped there, others | |
| 237 | have open bus (we assume the former until | |
| 238 | a game requires more precise behavior or | |
| 239 | some test is run) | |
| 240 | Note that the code is written so that also | |
| 241 | homebrew games with larger ROMs work! | |
| 242 | ||
| 243 | GAMES: | |
| 244 | ||
| 245 | -------------------------------------------------*/ | |
| 246 | ||
| 247 | READ8_MEMBER(a78_rom_sg_device::read_40xx) | |
| 248 | { | |
| 249 | if (offset < 0x4000) | |
| 250 | return m_rom[(offset & 0x3fff) + ((m_bank_mask - 1) * 0x4000)]; // second to last bank (is this always ok?!?) | |
| 251 | else if (offset < 0x8000) | |
| 252 | return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)]; | |
| 253 | else | |
| 254 | return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank | |
| 255 | } | |
| 256 | ||
| 257 | WRITE8_MEMBER(a78_rom_sg_device::write_40xx) | |
| 258 | { | |
| 259 | if (offset >= 0x4000 && offset < 0x8000) | |
| 260 | m_bank = data & m_bank_mask; | |
| 261 | } | |
| 262 | ||
| 263 | ||
| 264 | /*------------------------------------------------- | |
| 265 | ||
| 266 | Carts with SuperGame bankswitch + POKEY chip | |
| 267 | As above, the Pokey chips is accessed at | |
| 268 | ||
| 269 | GAMES: | |
| 270 | ||
| 271 | -------------------------------------------------*/ | |
| 272 | ||
| 273 | WRITE8_MEMBER(a78_rom_sg_pokey_device::write_40xx) | |
| 274 | { | |
| 275 | if (offset < 0x4000) | |
| 276 | m_pokey->write(space, offset & 0x0f, data); | |
| 277 | else if (offset < 0x8000) | |
| 278 | m_bank = data & m_bank_mask; | |
| 279 | } | |
| 280 | ||
| 281 | READ8_MEMBER(a78_rom_sg_pokey_device::read_04xx) | |
| 282 | { | |
| 283 | if (offset >= 0x50 && offset < 0x60) | |
| 284 | return m_pokey->read(space, offset & 0x0f); | |
| 285 | else | |
| 286 | return 0xff; | |
| 287 | } | |
| 288 | ||
| 289 | WRITE8_MEMBER(a78_rom_sg_pokey_device::write_04xx) | |
| 290 | { | |
| 291 | if (offset >= 0x50 && offset < 0x60) | |
| 292 | m_pokey->write(space, offset & 0x0f, data); | |
| 293 | } | |
| 294 | ||
| 295 | machine_config_constructor a78_rom_sg_pokey_device::device_mconfig_additions() const | |
| 296 | { | |
| 297 | return MACHINE_CONFIG_NAME( a78_pokey ); | |
| 298 | } | |
| 299 | ||
| 300 | ||
| 301 | /*------------------------------------------------- | |
| 302 | ||
| 303 | Carts with SuperGame bankswitch + 16K RAM | |
| 304 | FIXME: Some games contained only 8K of RAM, but | |
| 305 | for the moment we treat all as 16K of RAM even if | |
| 306 | from softlist we shall differentiate between them. | |
| 307 | ||
| 308 | GAMES: | |
| 309 | ||
| 310 | -------------------------------------------------*/ | |
| 311 | ||
| 312 | READ8_MEMBER(a78_rom_sg_ram_device::read_40xx) | |
| 313 | { | |
| 314 | if (offset < 0x4000) | |
| 315 | return m_ram[offset]; | |
| 316 | else if (offset < 0x8000) | |
| 317 | return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)]; | |
| 318 | else | |
| 319 | return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank | |
| 320 | } | |
| 321 | ||
| 322 | WRITE8_MEMBER(a78_rom_sg_ram_device::write_40xx) | |
| 323 | { | |
| 324 | if (offset < 0x4000) | |
| 325 | m_ram[offset] = data; | |
| 326 | else if (offset < 0x8000) | |
| 327 | m_bank = data & m_bank_mask; | |
| 328 | } | |
| 329 | ||
| 330 | ||
| 331 | /*------------------------------------------------- | |
| 332 | ||
| 333 | Carts with SuperGame bankswitch + 32K RAM: | |
| 334 | RAM bank is selected by writing with bit5 enabled | |
| 335 | in 0x4000-0x7fff range (bit0-bit4 give the ROM bank) | |
| 336 | ||
| 337 | GAMES: | |
| 338 | ||
| 339 | -------------------------------------------------*/ | |
| 340 | ||
| 341 | READ8_MEMBER(a78_rom_bankram_device::read_40xx) | |
| 342 | { | |
| 343 | if (offset < 0x4000) | |
| 344 | return m_ram[offset + (m_ram_bank * 0x4000)]; | |
| 345 | else if (offset < 0x8000) | |
| 346 | return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)]; | |
| 347 | else | |
| 348 | return m_rom[(offset & 0x3fff) + (m_bank_mask * 0x4000)]; // last bank | |
| 349 | } | |
| 350 | ||
| 351 | WRITE8_MEMBER(a78_rom_bankram_device::write_40xx) | |
| 352 | { | |
| 353 | if (offset < 0x4000) | |
| 354 | m_ram[offset] = data; | |
| 355 | else if (offset < 0x8000) | |
| 356 | { | |
| 357 | m_bank = data & m_bank_mask; | |
| 358 | m_ram_bank = BIT(data, 5); | |
| 359 | } | |
| 360 | } | |
| 361 | ||
| 362 | ||
| 363 | /*------------------------------------------------- | |
| 364 | ||
| 365 | Carts with SuperGame bankswitch 9banks: | |
| 366 | 9 x 16K banks mappable in 0x8000-0xbfff | |
| 367 | bank 7 is always mapped in 0xc000-0xffff | |
| 368 | ||
| 369 | GAMES: | |
| 370 | ||
| 371 | -------------------------------------------------*/ | |
| 372 | ||
| 373 | READ8_MEMBER(a78_rom_sg_9banks_device::read_40xx) | |
| 374 | { | |
| 375 | if (offset < 0x4000) | |
| 376 | return m_rom[(offset & 0x3fff)]; | |
| 377 | else if (offset < 0x8000) | |
| 378 | return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)]; | |
| 379 | else | |
| 380 | return m_rom[(offset & 0x3fff) + ((m_bank_mask + 1) * 0x4000)]; // last bank | |
| 381 | } | |
| 382 | ||
| 383 | WRITE8_MEMBER(a78_rom_sg_9banks_device::write_40xx) | |
| 384 | { | |
| 385 | if (offset >= 0x4000 && offset < 0x8000) | |
| 386 | m_bank = (data & m_bank_mask) + 1; | |
| 387 | } | |
| 388 | ||
| 389 | /*------------------------------------------------- | |
| 390 | ||
| 391 | Carts using XM expansion module or XBoarD expansion | |
| 392 | The only game using this (Donkey Kong XM demo) is | |
| 393 | 144K + POKEY, so that it's like the above with the | |
| 394 | addition of the POKEY. | |
| 395 | ||
| 396 | GAMES: Donkey Kong XM demo | |
| 397 | ||
| 398 | -------------------------------------------------*/ | |
| 399 | ||
| 400 | WRITE8_MEMBER(a78_rom_xm_device::write_40xx) | |
| 401 | { | |
| 402 | if (offset < 0x4000) | |
| 403 | m_pokey->write(space, offset & 0x0f, data); | |
| 404 | else if (offset < 0x8000) | |
| 405 | m_bank = (data & m_bank_mask) + 1; | |
| 406 | } | |
| 407 | ||
| 408 | READ8_MEMBER(a78_rom_xm_device::read_04xx) | |
| 409 | { | |
| 410 | if (offset >= 0x50 && offset < 0x60) | |
| 411 | return m_pokey->read(space, offset & 0x0f); | |
| 412 | else | |
| 413 | return 0xff; | |
| 414 | } | |
| 415 | ||
| 416 | WRITE8_MEMBER(a78_rom_xm_device::write_04xx) | |
| 417 | { | |
| 418 | if (offset >= 0x50 && offset < 0x60) | |
| 419 | m_pokey->write(space, offset & 0x0f, data); | |
| 420 | } | |
| 421 | ||
| 422 | machine_config_constructor a78_rom_xm_device::device_mconfig_additions() const | |
| 423 | { | |
| 424 | return MACHINE_CONFIG_NAME( a78_pokey ); | |
| 425 | } | |
| 426 | ||
| 427 | ||
| 428 | /*------------------------------------------------- | |
| 429 | ||
| 430 | Carts with Absolute bankswitch: | |
| 431 | 64K games. Lower 32K are 2 banks of 16K to be mapped | |
| 432 | in 0x4000-0x7fff, depending on the value written | |
| 433 | at 0x8000. Higher 32K are fixed in 0x8000-0xffff | |
| 434 | ||
| 435 | GAMES: F-18 Hornet | |
| 436 | ||
| 437 | -------------------------------------------------*/ | |
| 438 | ||
| 439 | READ8_MEMBER(a78_rom_abs_device::read_40xx) | |
| 440 | { | |
| 441 | if (offset < 0x4000) | |
| 442 | return m_rom[(offset & 0x3fff) + (m_bank * 0x4000)]; | |
| 443 | else | |
| 444 | { | |
| 445 | offset -= 0x4000; | |
| 446 | return m_rom[offset + 0x8000]; | |
| 447 | } | |
| 448 | } | |
| 449 | ||
| 450 | WRITE8_MEMBER(a78_rom_abs_device::write_40xx) | |
| 451 | { | |
| 452 | if (offset == 0x4000) | |
| 453 | { | |
| 454 | if (data & 1) | |
| 455 | m_bank = 0; | |
| 456 | else if (data & 2) | |
| 457 | m_bank = 1; | |
| 458 | } | |
| 459 | } | |
| 460 | ||
| 461 | /*------------------------------------------------- | |
| 462 | ||
| 463 | Carts with Activision bankswitch: | |
| 464 | 128K games. 8 x 16K banks (0-7) to be mapped at | |
| 465 | 0xa000-0xdfff. Bank is selected depending on the | |
| 466 | address written in 0xff80-0xff87. | |
| 467 | The rest of the memory is as follows: | |
| 468 | 0x4000-0x5fff second 8kb of bank 6 | |
| 469 | 0x6000-0x7fff first 8kb of bank 6 | |
| 470 | 0x8000-0x9fff second 8kb of bank 7 | |
| 471 | 0xe000-0xffff first 8kb of bank 7 | |
| 472 | ||
| 473 | GAMES: Double Dragon, Rampage. | |
| 474 | ||
| 475 | -------------------------------------------------*/ | |
| 476 | ||
| 477 | READ8_MEMBER(a78_rom_act_device::read_40xx) | |
| 478 | { | |
| 479 | UINT8 data = 0xff; | |
| 480 | UINT16 addr = offset & 0x1fff; | |
| 481 | ||
| 482 | // offset goes from 0 to 0xc000 | |
| 483 | switch (offset & 0xe000) | |
| 484 | { | |
| 485 | case 0x0000: | |
| 486 | data = m_rom[addr + 0x1a000]; | |
| 487 | break; | |
| 488 | case 0x2000: | |
| 489 | data = m_rom[addr + 0x18000]; | |
| 490 | break; | |
| 491 | case 0x4000: | |
| 492 | data = m_rom[addr + 0x1e000]; | |
| 493 | break; | |
| 494 | case 0x6000: | |
| 495 | data = m_rom[addr + (m_bank * 0x4000)]; | |
| 496 | break; | |
| 497 | case 0x8000: | |
| 498 | data = m_rom[addr + (m_bank * 0x4000) + 0x2000]; | |
| 499 | break; | |
| 500 | case 0xa000: | |
| 501 | data = m_rom[addr + 0x1c000]; | |
| 502 | break; | |
| 503 | } | |
| 504 | ||
| 505 | return data; | |
| 506 | } | |
| 507 | ||
| 508 | WRITE8_MEMBER(a78_rom_act_device::write_40xx) | |
| 509 | { | |
| 510 | if (offset >= 0xbf80 && offset <= 0xbf87) | |
| 511 | m_bank = offset & 7; | |
| 512 | } |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | /*********************************************************************************************************** | |
| 2 | ||
| 3 | A7800 XBoarD & XM expansions emulation | |
| 4 | ||
| 5 | The XBoarD should be socketed in the A7800 pcb in place of the Maria chip. | |
| 6 | It adds to the system additional 128K of RAM and an onboard pokey. | |
| 7 | The XM seems to work the same as XBoarD, but it also features HighScore savings | |
| 8 | (using the same ROM as Atari HighScore cart) | |
| 9 | ||
| 10 | ||
| 11 | Currently, we emulate both of these as a passthru cart, even if not 100% accurate for the XBoarD | |
| 12 | ||
| 13 | ||
| 14 | Memory map: | |
| 15 | ||
| 16 | POKEY1 $0450 $045F 16 bytes | |
| 17 | POKEY2* $0460 $046F 16 bytes | |
| 18 | XCTRL $0470 $047F 1 byte | |
| 19 | RAM $4000 $7FFF 16384 bytes | |
| 20 | ||
| 21 | XCTRL Bit Description | |
| 22 | ||
| 23 | +-------------------------------+ | |
| 24 | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | |
| 25 | +-------------------------------+ | |
| 26 | | | | | | | | | | |
| 27 | | | | | | | | +-- Bank select bit 0 \ | |
| 28 | | | | | | | +------ Bank select bit 1 | Totally 128 KByte in 16 KByte banks | |
| 29 | | | | | | +---------- Bank select bit 2 / | |
| 30 | | | | | +-------------- Enable memory bit** (1 = Memory enabled, 0 after power on) | |
| 31 | | | | +------------------ Enable POKEY bit (1 = POKEY enabled, 0 after power on) | |
| 32 | | | | | |
| 33 | NA NA NA = Not Available or Not Used | |
| 34 | ||
| 35 | * = Can be mounted piggy back on the first POKEY. Description how to do this will come when i have tried it out. | |
| 36 | ** This bit controls both POKEY chip select signals. | |
| 37 | ||
| 38 | TODO: | |
| 39 | - verify what happens when 2 POKEYs are present | |
| 40 | - verify whether high score works fine with XM | |
| 41 | ||
| 42 | ***********************************************************************************************************/ | |
| 43 | ||
| 44 | ||
| 45 | #include "emu.h" | |
| 46 | #include "xboard.h" | |
| 47 | #include "a78_carts.h" | |
| 48 | ||
| 49 | ||
| 50 | //------------------------------------------------- | |
| 51 | // constructor | |
| 52 | //------------------------------------------------- | |
| 53 | ||
| 54 | const device_type A78_XBOARD = &device_creator<a78_xboard_device>; | |
| 55 | const device_type A78_XM = &device_creator<a78_xm_device>; | |
| 56 | ||
| 57 | ||
| 58 | a78_xboard_device::a78_xboard_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source) | |
| 59 | : a78_rom_device(mconfig, type, name, tag, owner, clock, shortname, source), | |
| 60 | m_xbslot(*this, "xb_slot"), | |
| 61 | m_pokey(*this, "xb_pokey") | |
| 62 | { | |
| 63 | } | |
| 64 | ||
| 65 | ||
| 66 | a78_xboard_device::a78_xboard_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 67 | : a78_rom_device(mconfig, A78_XBOARD, "Atari 7800 XBoarD expansion", tag, owner, clock, "a78_xboard", __FILE__), | |
| 68 | m_xbslot(*this, "xb_slot"), | |
| 69 | m_pokey(*this, "xb_pokey") | |
| 70 | { | |
| 71 | } | |
| 72 | ||
| 73 | ||
| 74 | a78_xm_device::a78_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) | |
| 75 | : a78_xboard_device(mconfig, A78_XM, "Atari 7800 XM expansion module", tag, owner, clock, "a78_xm", __FILE__) | |
| 76 | { | |
| 77 | } | |
| 78 | ||
| 79 | ||
| 80 | void a78_xboard_device::device_start() | |
| 81 | { | |
| 82 | save_item(NAME(m_reg)); | |
| 83 | save_item(NAME(m_ram_bank)); | |
| 84 | } | |
| 85 | ||
| 86 | void a78_xboard_device::device_reset() | |
| 87 | { | |
| 88 | m_reg = 0; | |
| 89 | m_ram_bank = 0; | |
| 90 | } | |
| 91 | ||
| 92 | ||
| 93 | static MACHINE_CONFIG_FRAGMENT( a78_xb ) | |
| 94 | MCFG_A78_CARTRIDGE_ADD("xb_slot", a7800_cart, NULL) | |
| 95 | ||
| 96 | MCFG_SPEAKER_STANDARD_MONO("xb_speaker") | |
| 97 | ||
| 98 | MCFG_SOUND_ADD("xb_pokey", POKEY, XTAL_14_31818MHz/8) | |
| 99 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "xb_speaker", 1.00) | |
| 100 | MACHINE_CONFIG_END | |
| 101 | ||
| 102 | machine_config_constructor a78_xboard_device::device_mconfig_additions() const | |
| 103 | { | |
| 104 | return MACHINE_CONFIG_NAME( a78_xb ); | |
| 105 | } | |
| 106 | ||
| 107 | ||
| 108 | /*------------------------------------------------- | |
| 109 | mapper specific handlers | |
| 110 | -------------------------------------------------*/ | |
| 111 | ||
| 112 | /*------------------------------------------------- | |
| 113 | ||
| 114 | XBoarD: passthru + 128K RAM + POKEY | |
| 115 | ||
| 116 | -------------------------------------------------*/ | |
| 117 | ||
| 118 | READ8_MEMBER(a78_xboard_device::read_40xx) | |
| 119 | { | |
| 120 | if (BIT(m_reg, 3) && offset < 0x4000) | |
| 121 | return m_ram[offset + (m_ram_bank * 0x4000)]; | |
| 122 | else | |
| 123 | return m_xbslot->read_40xx(space, offset); | |
| 124 | } | |
| 125 | ||
| 126 | WRITE8_MEMBER(a78_xboard_device::write_40xx) | |
| 127 | { | |
| 128 | if (BIT(m_reg, 3) && offset < 0x4000) | |
| 129 | m_ram[offset + (m_ram_bank * 0x4000)] = data; | |
| 130 | else | |
| 131 | m_xbslot->write_40xx(space, offset, data); | |
| 132 | } | |
| 133 | ||
| 134 | READ8_MEMBER(a78_xboard_device::read_04xx) | |
| 135 | { | |
| 136 | if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60) | |
| 137 | return m_pokey->read(space, offset & 0x0f); | |
| 138 | else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70) | |
| 139 | return m_xbslot->read_04xx(space, offset - 0x10); // access second POKEY | |
| 140 | else | |
| 141 | return 0xff; | |
| 142 | } | |
| 143 | ||
| 144 | WRITE8_MEMBER(a78_xboard_device::write_04xx) | |
| 145 | { | |
| 146 | if (BIT(m_reg, 4) && offset >= 0x50 && offset < 0x60) | |
| 147 | m_pokey->write(space, offset & 0x0f, data); | |
| 148 | else if (BIT(m_reg, 4) && offset >= 0x60 && offset < 0x70) | |
| 149 | m_xbslot->write_04xx(space, offset - 0x10, data); // access second POKEY | |
| 150 | else if (offset >= 0x70 && offset < 0x80) | |
| 151 | { | |
| 152 | m_reg = data; | |
| 153 | m_ram_bank = m_reg & 7; | |
| 154 | } | |
| 155 | } | |
| 156 | ||
| 157 | ||
| 158 | /*------------------------------------------------- | |
| 159 | ||
| 160 | XM: Same as above but also featuring High Score savings | |
| 161 | ||
| 162 | -------------------------------------------------*/ | |
| 163 | ||
| 164 | READ8_MEMBER(a78_xm_device::read_10xx) | |
| 165 | { | |
| 166 | return m_nvram[offset]; | |
| 167 | } | |
| 168 | ||
| 169 | WRITE8_MEMBER(a78_xm_device::write_10xx) | |
| 170 | { | |
| 171 | m_nvram[offset] = data; | |
| 172 | } | |
| 173 | ||
| 174 | READ8_MEMBER(a78_xm_device::read_30xx) | |
| 175 | { | |
| 176 | return m_rom[offset]; | |
| 177 | } | |
| 178 |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | #ifndef __A78_CARTS_H | |
| 2 | #define __A78_CARTS_H | |
| 3 | ||
| 4 | ||
| 5 | #include "emu.h" | |
| 6 | ||
| 7 | #include "rom.h" | |
| 8 | #include "xboard.h" | |
| 9 | #include "hiscore.h" | |
| 10 | ||
| 11 | static SLOT_INTERFACE_START(a7800_cart) | |
| 12 | SLOT_INTERFACE_INTERNAL("a78_rom", A78_ROM) | |
| 13 | SLOT_INTERFACE_INTERNAL("a78_pokey", A78_ROM_POKEY) | |
| 14 | SLOT_INTERFACE_INTERNAL("a78_sg", A78_ROM_SG) | |
| 15 | SLOT_INTERFACE_INTERNAL("a78_sg_pokey", A78_ROM_SG_POKEY) | |
| 16 | SLOT_INTERFACE_INTERNAL("a78_sg_ram", A78_ROM_SG_RAM) | |
| 17 | // not sure which dev cart support banked ram, nor whether there shall be a 9banks or a non-sg version of this... | |
| 18 | SLOT_INTERFACE_INTERNAL("a78_bankram", A78_ROM_BANKRAM) | |
| 19 | SLOT_INTERFACE_INTERNAL("a78_sg9", A78_ROM_SG_9BANKS) | |
| 20 | SLOT_INTERFACE_INTERNAL("a78_xmc", A78_ROM_XM) // carts compatible with the expansions below (basically a 9Banks+POKEY) | |
| 21 | SLOT_INTERFACE_INTERNAL("a78_abs", A78_ROM_ABSOLUTE) | |
| 22 | SLOT_INTERFACE_INTERNAL("a78_act", A78_ROM_ACTIVISION) | |
| 23 | SLOT_INTERFACE_INTERNAL("a78_hsc", A78_HISCORE) | |
| 24 | SLOT_INTERFACE_INTERNAL("a78_xboard", A78_XBOARD) // the actual XBoarD expansion (as passthru) | |
| 25 | SLOT_INTERFACE_INTERNAL("a78_xm", A78_XM) // the actual XM expansion (as passthru) | |
| 26 | SLOT_INTERFACE_END | |
| 27 | ||
| 28 | ||
| 29 | // supported devices | |
| 30 | SLOT_INTERFACE_EXTERN(a78_cart); | |
| 31 | ||
| 32 | #endif |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | /*********************************************************************************************************** | |
| 2 | ||
| 3 | ||
| 4 | Atari 7800 cart emulation | |
| 5 | (through slot devices) | |
| 6 | ||
| 7 | Emulation of the cartslot for Atari 7800 | |
| 8 | ||
| 9 | Quoting "ATARI 7800 BANKSWITCHING GUIDE" (by Eckhard Stolberg): | |
| 10 | 7800 games can use the memory from $0400 to $047f, from $0500 | |
| 11 | to $17ff and from $2800 to $ffff, but only the High-Score cart | |
| 12 | uses anything below $4000. It has 4KB of ROM at $3000-$3fff | |
| 13 | and 2KB of battery-backed RAM at $1000-$17ff. | |
| 14 | ||
| 15 | Accordingly, we use the following handlers: | |
| 16 | - read_04xx/write_04xx for accesses in the $0400 to $047f range | |
| 17 | - read_10xx/write_10xx for accesses in the $1000 to $17ff range | |
| 18 | - read_30xx/write_30xx for accesses in the $3000 to $3fff range | |
| 19 | - read_40xx/write_40xx for accesses in the $4000 to $ffff range | |
| 20 | even if not all carts use all of them (in particular no cart type | |
| 21 | seems to use access to the ranges $0500 to $0fff and $2800 to $2fff) | |
| 22 | ||
| 23 | ||
| 24 | ***********************************************************************************************************/ | |
| 25 | ||
| 26 | ||
| 27 | #include "emu.h" | |
| 28 | #include "a78_slot.h" | |
| 29 | ||
| 30 | //************************************************************************** | |
| 31 | // GLOBAL VARIABLES | |
| 32 | //************************************************************************** | |
| 33 | ||
| 34 | const device_type A78_CART_SLOT = &device_creator<a78_cart_slot_device>; | |
| 35 | ||
| 36 | ||
| 37 | //------------------------------------------------- | |
| 38 | // device_vcs_cart_interface - constructor | |
| 39 | //------------------------------------------------- | |
| 40 | ||
| 41 | device_a78_cart_interface::device_a78_cart_interface (const machine_config &mconfig, device_t &device) | |
| 42 | : device_slot_card_interface(mconfig, device) | |
| 43 | { | |
| 44 | } | |
| 45 | ||
| 46 | ||
| 47 | //------------------------------------------------- | |
| 48 | // ~device_a78_cart_interface - destructor | |
| 49 | //------------------------------------------------- | |
| 50 | ||
| 51 | device_a78_cart_interface::~device_a78_cart_interface () | |
| 52 | { | |
| 53 | } | |
| 54 | ||
| 55 | //------------------------------------------------- | |
| 56 | // rom_alloc - alloc the space for the cart | |
| 57 | //------------------------------------------------- | |
| 58 | ||
| 59 | void device_a78_cart_interface::rom_alloc(UINT32 size) | |
| 60 | { | |
| 61 | if (m_rom == NULL) | |
| 62 | { | |
| 63 | // allocate rom | |
| 64 | m_rom.resize(size); | |
| 65 | ||
| 66 | // setup other helpers | |
| 67 | if ((size / 0x4000) & 1) // compensate for SuperGame carts with 9 x 16K banks (to my knowledge no other cart has m_bank_mask != power of 2) | |
| 68 | m_bank_mask = (size / 0x4000) - 2; | |
| 69 | else | |
| 70 | m_bank_mask = (size / 0x4000) - 1; | |
| 71 | ||
| 72 | // the rom is mapped to the top of the memory area | |
| 73 | // so we store the starting point of data to simplify | |
| 74 | // the access handling | |
| 75 | m_base_rom = 0x10000 - size; | |
| 76 | } | |
| 77 | } | |
| 78 | ||
| 79 | //------------------------------------------------- | |
| 80 | // ram_alloc - alloc the space for the on-cart RAM | |
| 81 | //------------------------------------------------- | |
| 82 | ||
| 83 | void device_a78_cart_interface::ram_alloc(UINT32 size) | |
| 84 | { | |
| 85 | if (m_ram == NULL) | |
| 86 | { | |
| 87 | m_ram.resize(size); | |
| 88 | device().save_item(NAME(m_ram)); | |
| 89 | } | |
| 90 | } | |
| 91 | ||
| 92 | ||
| 93 | //------------------------------------------------- | |
| 94 | // ram_alloc - alloc the space for the on-cart RAM | |
| 95 | //------------------------------------------------- | |
| 96 | ||
| 97 | void device_a78_cart_interface::nvram_alloc(UINT32 size) | |
| 98 | { | |
| 99 | if (m_nvram == NULL) | |
| 100 | { | |
| 101 | m_nvram.resize(size); | |
| 102 | device().save_item(NAME(m_nvram)); | |
| 103 | } | |
| 104 | } | |
| 105 | ||
| 106 | ||
| 107 | ||
| 108 | //************************************************************************** | |
| 109 | // LIVE DEVICE | |
| 110 | //************************************************************************** | |
| 111 | ||
| 112 | //------------------------------------------------- | |
| 113 | // a78_cart_slot_device - constructor | |
| 114 | //------------------------------------------------- | |
| 115 | a78_cart_slot_device::a78_cart_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : | |
| 116 | device_t(mconfig, A78_CART_SLOT, "Atari 7800 Cartridge Slot", tag, owner, clock, "a78_cart_slot", __FILE__), | |
| 117 | device_image_interface(mconfig, *this), | |
| 118 | device_slot_interface(mconfig, *this) | |
| 119 | { | |
| 120 | } | |
| 121 | ||
| 122 | ||
| 123 | //------------------------------------------------- | |
| 124 | // a78_cart_slot_device - destructor | |
| 125 | //------------------------------------------------- | |
| 126 | ||
| 127 | a78_cart_slot_device::~a78_cart_slot_device() | |
| 128 | { | |
| 129 | } | |
| 130 | ||
| 131 | //------------------------------------------------- | |
| 132 | // device_start - device-specific startup | |
| 133 | //------------------------------------------------- | |
| 134 | ||
| 135 | void a78_cart_slot_device::device_start() | |
| 136 | { | |
| 137 | m_cart = dynamic_cast<device_a78_cart_interface *>(get_card_device()); | |
| 138 | } | |
| 139 | ||
| 140 | //------------------------------------------------- | |
| 141 | // device_config_complete - perform any | |
| 142 | // operations now that the configuration is | |
| 143 | // complete | |
| 144 | //------------------------------------------------- | |
| 145 | ||
| 146 | void a78_cart_slot_device::device_config_complete() | |
| 147 | { | |
| 148 | // set brief and instance name | |
| 149 | update_names(); | |
| 150 | } | |
| 151 | ||
| 152 | ||
| 153 | ||
| 154 | /*------------------------------------------------- | |
| 155 | call load | |
| 156 | -------------------------------------------------*/ | |
| 157 | ||
| 158 | //------------------------------------------------- | |
| 159 | // A78 PCBs | |
| 160 | //------------------------------------------------- | |
| 161 | ||
| 162 | struct a78_slot | |
| 163 | { | |
| 164 | int pcb_id; | |
| 165 | const char *slot_option; | |
| 166 | }; | |
| 167 | ||
| 168 | // Here, we take the feature attribute from .xml (i.e. the PCB name) and we assign a unique ID to it | |
| 169 | static const a78_slot slot_list[] = | |
| 170 | { | |
| 171 | { A78_TYPE0, "a78_rom" }, | |
| 172 | { A78_TYPE1, "a78_pokey" }, | |
| 173 | { A78_TYPE2, "a78_sg" }, | |
| 174 | { A78_TYPE3, "a78_sg_pokey" }, | |
| 175 | { A78_TYPE6, "a78_sg_ram" }, | |
| 176 | { A78_TYPEA, "a78_sg9" }, | |
| 177 | { A78_TYPEB, "a78_xmc" }, | |
| 178 | { A78_ABSOLUTE, "a78_abs" }, | |
| 179 | { A78_ACTIVISION, "a78_act" }, | |
| 180 | { A78_HSC, "a78_hsc" }, | |
| 181 | { A78_BANKRAM, "a78_bankram" }, | |
| 182 | { A78_XB_BOARD, "a78_xboard" }, | |
| 183 | { A78_XM_BOARD, "a78_xm" }, | |
| 184 | }; | |
| 185 | ||
| 186 | static int a78_get_pcb_id(const char *slot) | |
| 187 | { | |
| 188 | for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) | |
| 189 | { | |
| 190 | if (!core_stricmp(slot_list[i].slot_option, slot)) | |
| 191 | return slot_list[i].pcb_id; | |
| 192 | } | |
| 193 | ||
| 194 | return 0; | |
| 195 | } | |
| 196 | ||
| 197 | static const char *a78_get_slot(int type) | |
| 198 | { | |
| 199 | for (int i = 0; i < ARRAY_LENGTH(slot_list); i++) | |
| 200 | { | |
| 201 | if (slot_list[i].pcb_id == type) | |
| 202 | return slot_list[i].slot_option; | |
| 203 | } | |
| 204 | ||
| 205 | return "a78_rom"; | |
| 206 | } | |
| 207 | ||
| 208 | bool a78_cart_slot_device::call_load() | |
| 209 | { | |
| 210 | UINT8 *ROM; | |
| 211 | UINT32 len; | |
| 212 | ||
| 213 | if (software_entry() != NULL) | |
| 214 | { | |
| 215 | const char *pcb_name; | |
| 216 | len = get_software_region_length("rom"); | |
| 217 | ||
| 218 | m_cart->rom_alloc(len); | |
| 219 | ROM = m_cart->get_rom_base(); | |
| 220 | memcpy(ROM, get_software_region("rom"), len); | |
| 221 | ||
| 222 | if ((pcb_name = get_feature("slot")) != NULL) | |
| 223 | m_type = a78_get_pcb_id(pcb_name); | |
| 224 | else | |
| 225 | m_type = A78_TYPE0; | |
| 226 | } | |
| 227 | else | |
| 228 | { | |
| 229 | // Load and check the header | |
| 230 | char head[128]; | |
| 231 | fread(head, 128); | |
| 232 | ||
| 233 | if (verify_header((char *)head) == IMAGE_VERIFY_FAIL) | |
| 234 | return IMAGE_INIT_FAIL; | |
| 235 | ||
| 236 | len = (head[49] << 24) |(head[50] << 16) |(head[51] << 8) | head[52]; | |
| 237 | if (len + 128 > length()) | |
| 238 | { | |
| 239 | logerror("Invalid length in the header. The game might be corrupted.\n"); | |
| 240 | len = length() - 128; | |
| 241 | } | |
| 242 | ||
| 243 | switch ((head[53] << 8) | head[54]) | |
| 244 | { | |
| 245 | case 0x0000: | |
| 246 | m_type = A78_TYPE0; | |
| 247 | break; | |
| 248 | case 0x0001: | |
| 249 | m_type = A78_TYPE1; | |
| 250 | break; | |
| 251 | case 0x0002: | |
| 252 | m_type = A78_TYPE2; | |
| 253 | break; | |
| 254 | case 0x0003: | |
| 255 | m_type = A78_TYPE3; | |
| 256 | break; | |
| 257 | case 0x0006: | |
| 258 | m_type = A78_TYPE6; | |
| 259 | break; | |
| 260 | case 0x000a: | |
| 261 | m_type = A78_TYPEA; | |
| 262 | break; | |
| 263 | case 0x000b: | |
| 264 | m_type = A78_TYPEB; | |
| 265 | break; | |
| 266 | case 0x0020: | |
| 267 | m_type = A78_BANKRAM; | |
| 268 | break; | |
| 269 | case 0x0100: | |
| 270 | m_type = A78_ABSOLUTE; | |
| 271 | break; | |
| 272 | case 0x0200: | |
| 273 | m_type = A78_ACTIVISION; | |
| 274 | break; | |
| 275 | } | |
| 276 | logerror("Cart type: %x\n", m_type); | |
| 277 | ||
| 278 | // This field is currently only used for logging | |
| 279 | m_stick_type = head[55]; | |
| 280 | ||
| 281 | m_cart->rom_alloc(len); | |
| 282 | ROM = m_cart->get_rom_base(); | |
| 283 | fread(ROM, len); | |
| 284 | } | |
| 285 | ||
| 286 | //printf("Type: %s\n", a78_get_slot(m_type)); | |
| 287 | ||
| 288 | if (m_type == A78_TYPE6) | |
| 289 | m_cart->ram_alloc(0x4000); | |
| 290 | if (m_type == A78_BANKRAM) | |
| 291 | m_cart->ram_alloc(0x8000); | |
| 292 | if (m_type == A78_XB_BOARD || m_type == A78_XM_BOARD) | |
| 293 | m_cart->ram_alloc(0x20000); | |
| 294 | if (m_type == A78_HSC || m_type == A78_XM_BOARD) | |
| 295 | { | |
| 296 | m_cart->nvram_alloc(0x800); | |
| 297 | battery_load(m_cart->get_nvram_base(), 0x800, 0xff); | |
| 298 | } | |
| 299 | ||
| 300 | return IMAGE_INIT_PASS; | |
| 301 | } | |
| 302 | ||
| 303 | ||
| 304 | void a78_partialhash(hash_collection &dest, const unsigned char *data, | |
| 305 | unsigned long length, const char *functions) | |
| 306 | { | |
| 307 | if (length <= 128) | |
| 308 | return; | |
| 309 | dest.compute(&data[128], length - 128, functions); | |
| 310 | } | |
| 311 | ||
| 312 | ||
| 313 | /*------------------------------------------------- | |
| 314 | call_unload | |
| 315 | -------------------------------------------------*/ | |
| 316 | ||
| 317 | void a78_cart_slot_device::call_unload() | |
| 318 | { | |
| 319 | if (m_cart && m_cart->get_nvram_size()) | |
| 320 | battery_save(m_cart->get_nvram_base(), 0x800); | |
| 321 | } | |
| 322 | ||
| 323 | ||
| 324 | ||
| 325 | /*------------------------------------------------- | |
| 326 | call softlist load | |
| 327 | -------------------------------------------------*/ | |
| 328 | ||
| 329 | bool a78_cart_slot_device::call_softlist_load(software_list_device &swlist, const char *swname, const rom_entry *start_entry) | |
| 330 | { | |
| 331 | load_software_part_region(*this, swlist, swname, start_entry ); | |
| 332 | return TRUE; | |
| 333 | } | |
| 334 | ||
| 335 | /*------------------------------------------------- | |
| 336 | identify_cart_type - code to detect cart type from | |
| 337 | fullpath | |
| 338 | -------------------------------------------------*/ | |
| 339 | ||
| 340 | int a78_cart_slot_device::verify_header(char *header) | |
| 341 | { | |
| 342 | const char *magic = "ATARI7800"; | |
| 343 | ||
| 344 | if (strncmp(magic, header + 1, 9)) | |
| 345 | { | |
| 346 | logerror("Not a valid A7800 image\n"); | |
| 347 | return IMAGE_VERIFY_FAIL; | |
| 348 | } | |
| 349 | ||
| 350 | logerror("returning ID_OK\n"); | |
| 351 | return IMAGE_VERIFY_PASS; | |
| 352 | } | |
| 353 | ||
| 354 | ||
| 355 | /*------------------------------------------------- | |
| 356 | get default card software | |
| 357 | -------------------------------------------------*/ | |
| 358 | ||
| 359 | void a78_cart_slot_device::get_default_card_software(astring &result) | |
| 360 | { | |
| 361 | if (open_image_file(mconfig().options())) | |
| 362 | { | |
| 363 | const char *slot_string = "a78_rom"; | |
| 364 | dynamic_buffer head(128); | |
| 365 | int type = A78_TYPE0; | |
| 366 | ||
| 367 | // Load and check the header | |
| 368 | core_fread(m_file, head, 128); | |
| 369 | switch ((head[53] << 8) | head[54]) | |
| 370 | { | |
| 371 | case 0x0000: | |
| 372 | type = A78_TYPE0; | |
| 373 | break; | |
| 374 | case 0x0001: | |
| 375 | type = A78_TYPE1; | |
| 376 | break; | |
| 377 | case 0x0002: | |
| 378 | type = A78_TYPE2; | |
| 379 | break; | |
| 380 | case 0x0003: | |
| 381 | type = A78_TYPE3; | |
| 382 | break; | |
| 383 | case 0x0004: | |
| 384 | type = A78_TYPE6; | |
| 385 | break; | |
| 386 | case 0x000a: | |
| 387 | type = A78_TYPEA; | |
| 388 | break; | |
| 389 | case 0x000b: | |
| 390 | type = A78_TYPEB; | |
| 391 | break; | |
| 392 | case 0x0020: | |
| 393 | m_type = A78_BANKRAM; | |
| 394 | break; | |
| 395 | case 0x0100: | |
| 396 | type = A78_ABSOLUTE; | |
| 397 | break; | |
| 398 | case 0x0200: | |
| 399 | type = A78_ACTIVISION; | |
| 400 | break; | |
| 401 | } | |
| 402 | logerror("Cart type: %x\n", type); | |
| 403 | slot_string = a78_get_slot(type); | |
| 404 | ||
| 405 | clear(); | |
| 406 | ||
| 407 | result.cpy(slot_string); | |
| 408 | } | |
| 409 | else | |
| 410 | software_get_default_slot(result, "a78_rom"); | |
| 411 | } | |
| 412 | ||
| 413 | ||
| 414 | /*------------------------------------------------- | |
| 415 | read | |
| 416 | -------------------------------------------------*/ | |
| 417 | ||
| 418 | READ8_MEMBER(a78_cart_slot_device::read_04xx) | |
| 419 | { | |
| 420 | if (m_cart) | |
| 421 | return m_cart->read_04xx(space, offset, mem_mask); | |
| 422 | else | |
| 423 | return 0xff; | |
| 424 | } | |
| 425 | ||
| 426 | READ8_MEMBER(a78_cart_slot_device::read_10xx) | |
| 427 | { | |
| 428 | if (m_cart) | |
| 429 | return m_cart->read_10xx(space, offset, mem_mask); | |
| 430 | else | |
| 431 | return 0xff; | |
| 432 | } | |
| 433 | ||
| 434 | READ8_MEMBER(a78_cart_slot_device::read_30xx) | |
| 435 | { | |
| 436 | if (m_cart) | |
| 437 | return m_cart->read_30xx(space, offset, mem_mask); | |
| 438 | else | |
| 439 | return 0xff; | |
| 440 | } | |
| 441 | ||
| 442 | READ8_MEMBER(a78_cart_slot_device::read_40xx) | |
| 443 | { | |
| 444 | if (m_cart) | |
| 445 | return m_cart->read_40xx(space, offset, mem_mask); | |
| 446 | else | |
| 447 | return 0xff; | |
| 448 | } | |
| 449 | ||
| 450 | ||
| 451 | /*------------------------------------------------- | |
| 452 | write | |
| 453 | -------------------------------------------------*/ | |
| 454 | ||
| 455 | WRITE8_MEMBER(a78_cart_slot_device::write_04xx) | |
| 456 | { | |
| 457 | if (m_cart) | |
| 458 | m_cart->write_04xx(space, offset, data, mem_mask); | |
| 459 | } | |
| 460 | ||
| 461 | WRITE8_MEMBER(a78_cart_slot_device::write_10xx) | |
| 462 | { | |
| 463 | if (m_cart) | |
| 464 | m_cart->write_10xx(space, offset, data, mem_mask); | |
| 465 | } | |
| 466 | ||
| 467 | WRITE8_MEMBER(a78_cart_slot_device::write_30xx) | |
| 468 | { | |
| 469 | if (m_cart) | |
| 470 | m_cart->write_30xx(space, offset, data, mem_mask); | |
| 471 | } | |
| 472 | ||
| 473 | WRITE8_MEMBER(a78_cart_slot_device::write_40xx) | |
| 474 | { | |
| 475 | if (m_cart) | |
| 476 | m_cart->write_40xx(space, offset, data, mem_mask); | |
| 477 | } | |
| 478 | ||
| 479 | ||
| 480 | /* Header format | |
| 481 | 0 Header version - 1 byte | |
| 482 | 1..16 "ATARI7800 " - 16 bytes | |
| 483 | 17..48 Cart title - 32 bytes | |
| 484 | 49..52 data length - 4 bytes | |
| 485 | 53..54 cart type - 2 bytes | |
| 486 | bit 0 0x01 - pokey cart | |
| 487 | bit 1 0x02 - supercart bank switched | |
| 488 | bit 2 0x04 - supercart RAM at $4000 | |
| 489 | bit 3 0x08 - additional ROM at $4000 | |
| 490 | bit 4 0x10 - bank 6 at $4000 | |
| 491 | bit 5 0x20 - supercart banked RAM | |
| 492 | ||
| 493 | bit 8-15 - Special | |
| 494 | 0 = Normal cart | |
| 495 | 1 = Absolute (F18 Hornet) | |
| 496 | 2 = Activision | |
| 497 | ||
| 498 | 55 controller 1 type - 1 byte | |
| 499 | 56 controller 2 type - 1 byte | |
| 500 | 0 = None | |
| 501 | 1 = Joystick | |
| 502 | 2 = Light Gun | |
| 503 | 57 0 = NTSC/1 = PAL | |
| 504 | ||
| 505 | 100..127 "ACTUAL CART DATA STARTS HERE" - 28 bytes | |
| 506 | ||
| 507 | Versions: | |
| 508 | Version 0: Initial release | |
| 509 | Version 1: Added PAL/NTSC bit. Added Special cart byte. | |
| 510 | Changed 53 bit 2, added bit 3 | |
| 511 | ||
| 512 | */ | |
| 513 | ||
| 514 | // TODO: log all properties from the header | |
| No newline at end of file |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | #ifndef __A78_HISCORE_H | |
| 2 | #define __A78_HISCORE_H | |
| 3 | ||
| 4 | #include "a78_slot.h" | |
| 5 | #include "rom.h" | |
| 6 | ||
| 7 | ||
| 8 | // ======================> a78_hiscore_device | |
| 9 | ||
| 10 | class a78_hiscore_device : public a78_rom_device | |
| 11 | { | |
| 12 | public: | |
| 13 | // construction/destruction | |
| 14 | a78_hiscore_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 15 | ||
| 16 | // device-level overrides | |
| 17 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 18 | ||
| 19 | // reading and writing | |
| 20 | virtual DECLARE_READ8_MEMBER(read_04xx); | |
| 21 | virtual DECLARE_WRITE8_MEMBER(write_04xx); | |
| 22 | virtual DECLARE_READ8_MEMBER(read_10xx); | |
| 23 | virtual DECLARE_WRITE8_MEMBER(write_10xx); | |
| 24 | virtual DECLARE_READ8_MEMBER(read_30xx); | |
| 25 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 26 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 27 | ||
| 28 | protected: | |
| 29 | required_device<a78_cart_slot_device> m_hscslot; | |
| 30 | }; | |
| 31 | ||
| 32 | ||
| 33 | ||
| 34 | // device type definition | |
| 35 | extern const device_type A78_HISCORE; | |
| 36 | ||
| 37 | ||
| 38 | #endif |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r0 | r31767 | |
|---|---|---|
| 1 | #ifndef __A78_ROM_H | |
| 2 | #define __A78_ROM_H | |
| 3 | ||
| 4 | #include "a78_slot.h" | |
| 5 | #include "sound/pokey.h" | |
| 6 | ||
| 7 | ||
| 8 | // ======================> a78_rom_device | |
| 9 | ||
| 10 | class a78_rom_device : public device_t, | |
| 11 | public device_a78_cart_interface | |
| 12 | { | |
| 13 | public: | |
| 14 | // construction/destruction | |
| 15 | a78_rom_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); | |
| 16 | a78_rom_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 17 | ||
| 18 | // device-level overrides | |
| 19 | virtual void device_start(); | |
| 20 | virtual void device_reset(); | |
| 21 | ||
| 22 | // reading and writing | |
| 23 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 24 | }; | |
| 25 | ||
| 26 | ||
| 27 | // ======================> a78_rom_pokey_device | |
| 28 | ||
| 29 | class a78_rom_pokey_device : public a78_rom_device | |
| 30 | { | |
| 31 | public: | |
| 32 | // construction/destruction | |
| 33 | a78_rom_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 34 | ||
| 35 | // device-level overrides | |
| 36 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 37 | ||
| 38 | // reading and writing | |
| 39 | virtual DECLARE_READ8_MEMBER(read_04xx); | |
| 40 | virtual DECLARE_WRITE8_MEMBER(write_04xx); | |
| 41 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 42 | ||
| 43 | protected: | |
| 44 | required_device<pokey_device> m_pokey; | |
| 45 | }; | |
| 46 | ||
| 47 | ||
| 48 | // ======================> a78_rom_sg_device | |
| 49 | ||
| 50 | class a78_rom_sg_device : public a78_rom_device | |
| 51 | { | |
| 52 | public: | |
| 53 | // construction/destruction | |
| 54 | a78_rom_sg_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); | |
| 55 | a78_rom_sg_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 56 | ||
| 57 | // device-level overrides | |
| 58 | virtual void device_start(); | |
| 59 | virtual void device_reset(); | |
| 60 | ||
| 61 | // reading and writing | |
| 62 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 63 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 64 | ||
| 65 | protected: | |
| 66 | int m_bank; | |
| 67 | }; | |
| 68 | ||
| 69 | ||
| 70 | // ======================> a78_rom_sg_pokey_device | |
| 71 | ||
| 72 | class a78_rom_sg_pokey_device : public a78_rom_sg_device | |
| 73 | { | |
| 74 | public: | |
| 75 | // construction/destruction | |
| 76 | a78_rom_sg_pokey_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 77 | ||
| 78 | // device-level overrides | |
| 79 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 80 | ||
| 81 | // reading and writing | |
| 82 | virtual DECLARE_READ8_MEMBER(read_04xx); | |
| 83 | virtual DECLARE_WRITE8_MEMBER(write_04xx); | |
| 84 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 85 | ||
| 86 | protected: | |
| 87 | required_device<pokey_device> m_pokey; | |
| 88 | }; | |
| 89 | ||
| 90 | ||
| 91 | // ======================> a78_rom_sg_ram_device | |
| 92 | ||
| 93 | class a78_rom_sg_ram_device : public a78_rom_sg_device | |
| 94 | { | |
| 95 | public: | |
| 96 | // construction/destruction | |
| 97 | a78_rom_sg_ram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 98 | ||
| 99 | // reading and writing | |
| 100 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 101 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 102 | }; | |
| 103 | ||
| 104 | ||
| 105 | // ======================> a78_rom_bankram_device | |
| 106 | ||
| 107 | class a78_rom_bankram_device : public a78_rom_sg_device | |
| 108 | { | |
| 109 | public: | |
| 110 | // construction/destruction | |
| 111 | a78_rom_bankram_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 112 | ||
| 113 | // device-level overrides | |
| 114 | virtual void device_start(); | |
| 115 | virtual void device_reset(); | |
| 116 | ||
| 117 | // reading and writing | |
| 118 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 119 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 120 | ||
| 121 | protected: | |
| 122 | int m_ram_bank; | |
| 123 | }; | |
| 124 | ||
| 125 | ||
| 126 | // ======================> a78_rom_sg_9banks_device | |
| 127 | ||
| 128 | class a78_rom_sg_9banks_device : public a78_rom_sg_device | |
| 129 | { | |
| 130 | public: | |
| 131 | // construction/destruction | |
| 132 | a78_rom_sg_9banks_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source); | |
| 133 | a78_rom_sg_9banks_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 134 | ||
| 135 | // reading and writing | |
| 136 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 137 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 138 | }; | |
| 139 | ||
| 140 | ||
| 141 | // ======================> a78_rom_xm_device | |
| 142 | ||
| 143 | class a78_rom_xm_device : public a78_rom_sg_9banks_device | |
| 144 | { | |
| 145 | public: | |
| 146 | // construction/destruction | |
| 147 | a78_rom_xm_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 148 | ||
| 149 | // device-level overrides | |
| 150 | virtual machine_config_constructor device_mconfig_additions() const; | |
| 151 | ||
| 152 | // reading and writing | |
| 153 | virtual DECLARE_READ8_MEMBER(read_04xx); | |
| 154 | virtual DECLARE_WRITE8_MEMBER(write_04xx); | |
| 155 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 156 | ||
| 157 | protected: | |
| 158 | required_device<pokey_device> m_pokey; | |
| 159 | }; | |
| 160 | ||
| 161 | ||
| 162 | // ======================> a78_rom_abs_device | |
| 163 | ||
| 164 | class a78_rom_abs_device : public a78_rom_device | |
| 165 | { | |
| 166 | public: | |
| 167 | // construction/destruction | |
| 168 | a78_rom_abs_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 169 | ||
| 170 | // device-level overrides | |
| 171 | virtual void device_start(); | |
| 172 | virtual void device_reset(); | |
| 173 | ||
| 174 | // reading and writing | |
| 175 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 176 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 177 | ||
| 178 | protected: | |
| 179 | int m_bank; | |
| 180 | }; | |
| 181 | ||
| 182 | ||
| 183 | // ======================> a78_rom_act_device | |
| 184 | ||
| 185 | class a78_rom_act_device : public a78_rom_device | |
| 186 | { | |
| 187 | public: | |
| 188 | // construction/destruction | |
| 189 | a78_rom_act_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); | |
| 190 | ||
| 191 | // device-level overrides | |
| 192 | virtual void device_start(); | |
| 193 | virtual void device_reset(); | |
| 194 | ||
| 195 | // reading and writing | |
| 196 | virtual DECLARE_READ8_MEMBER(read_40xx); | |
| 197 | virtual DECLARE_WRITE8_MEMBER(write_40xx); | |
| 198 | ||
| 199 | protected: | |
| 200 | int m_bank; | |
| 201 | }; | |
| 202 | ||
| 203 | ||
| 204 | // device type definition | |
| 205 | extern const device_type A78_ROM; | |
| 206 | extern const device_type A78_ROM_SG; | |
| 207 | extern const device_type A78_ROM_POKEY; | |
| 208 | extern const device_type A78_ROM_SG_POKEY; | |
| 209 | extern const device_type A78_ROM_SG_RAM; | |
| 210 | extern const device_type A78_ROM_BANKRAM; | |
| 211 | extern const device_type A78_ROM_SG_9BANKS; | |
| 212 | extern const device_type A78_ROM_XM; | |
| 213 | extern const device_type A78_ROM_ABSOLUTE; | |
| 214 | extern const device_type A78_ROM_ACTIVISION; | |
| 215 | ||
| 216 | ||
| 217 | #endif |
| Added: svn:mime-type + text/plain Added: svn:eol-style + native |
| r31766 | r31767 | |
|---|---|---|
| 7 | 7 | Dan Boris |
| 8 | 8 | |
| 9 | 9 | 2002/05/13 kubecj added more banks for bankswitching |
| 10 | added PAL machine description | |
| 11 | changed clock to be precise | |
| 10 | added PAL machine description | |
| 11 | changed clock to be precise | |
| 12 | improved cart emulation (in machine/) | |
| 12 | 13 | |
| 13 | 14 | 2012/10/25 Robert Tuccitto NTSC Color Generator utilized for |
| 14 | 15 | color palette with hue shift/start |
| r31766 | r31767 | |
| 83 | 84 | |
| 84 | 85 | 2014/03/25 Mike Saarna Fixed Riot Timer |
| 85 | 86 | |
| 87 | 2014/04/04 Mike Saarna Fix to controller button RIOT behavior | |
| 88 | ||
| 86 | 89 | 2014/05/06 Mike Saarna/Robert Tuccitto Brought initial Maria cycle counts |
| 87 | + inline from measurements taken with logic analyzer and tests. | |
| 90 | inline from measurements taken with logic analyzer and tests. | |
| 91 | ||
| 92 | 2014/08/25 Fabio Priuli Converted carts to be slot devices and cleaned | |
| 93 | up the driver (removed the pokey, cleaned up rom regions, etc.) | |
| 94 | ||
| 88 | 95 | ***************************************************************************/ |
| 89 | 96 | |
| 90 | 97 | #include "emu.h" |
| 91 | 98 | #include "cpu/m6502/m6502.h" |
| 92 | #include "sound/pokey.h" | |
| 93 | 99 | #include "sound/tiaintf.h" |
| 94 | #include " | |
| 100 | #include "bus/a7800/a78_carts.h" | |
| 95 | 101 | #include "machine/6532riot.h" |
| 96 | 102 | #include "includes/a7800.h" |
| 97 | 103 | |
| r31766 | r31767 | |
| 101 | 107 | |
| 102 | 108 | |
| 103 | 109 | /*************************************************************************** |
| 110 | MEMORY HANDLERS | |
| 111 | ***************************************************************************/ | |
| 112 | ||
| 113 | // RIOT | |
| 114 | READ8_MEMBER(a7800_state::riot_joystick_r) | |
| 115 | { | |
| 116 | return m_io_joysticks->read(); | |
| 117 | } | |
| 118 | ||
| 119 | READ8_MEMBER(a7800_state::riot_console_button_r) | |
| 120 | { | |
| 121 | return m_io_console_buttons->read(); | |
| 122 | } | |
| 123 | ||
| 124 | WRITE8_MEMBER(a7800_state::riot_button_pullup_w) | |
| 125 | { | |
| 126 | if(m_maincpu->space(AS_PROGRAM).read_byte(0x283) & 0x04) | |
| 127 | m_p1_one_button = data & 0x04; // pin 6 of the controller port is held high by the riot chip when reading two-button controllers (from schematic) | |
| 128 | if(m_maincpu->space(AS_PROGRAM).read_byte(0x283) & 0x10) | |
| 129 | m_p2_one_button = data & 0x10; | |
| 130 | } | |
| 131 | ||
| 132 | READ8_MEMBER(a7800_state::tia_r) | |
| 133 | { | |
| 134 | switch (offset & 0x0f) | |
| 135 | { | |
| 136 | case 0x00: | |
| 137 | case 0x01: | |
| 138 | case 0x02: | |
| 139 | case 0x03: | |
| 140 | case 0x04: | |
| 141 | case 0x05: | |
| 142 | case 0x06: | |
| 143 | case 0x07: | |
| 144 | /* Even though the 7800 doesn't use the TIA graphics the collision registers should | |
| 145 | still return a reasonable value */ | |
| 146 | return 0x00; | |
| 147 | case 0x08: | |
| 148 | return ((m_io_buttons->read() & 0x02) << 6); | |
| 149 | case 0x09: | |
| 150 | return ((m_io_buttons->read() & 0x08) << 4); | |
| 151 | case 0x0a: | |
| 152 | return ((m_io_buttons->read() & 0x01) << 7); | |
| 153 | case 0x0b: | |
| 154 | return ((m_io_buttons->read() & 0x04) << 5); | |
| 155 | case 0x0c: | |
| 156 | if (((m_io_buttons->read() & 0x08) ||(m_io_buttons->read() & 0x02)) && m_p1_one_button) | |
| 157 | return 0x00; | |
| 158 | else | |
| 159 | return 0x80; | |
| 160 | case 0x0d: | |
| 161 | if (((m_io_buttons->read() & 0x01) ||(m_io_buttons->read() & 0x04)) && m_p2_one_button) | |
| 162 | return 0x00; | |
| 163 | else | |
| 164 | return 0x80; | |
| 165 | default: | |
| 166 | logerror("undefined TIA read %x\n",offset); | |
| 167 | ||
| 168 | } | |
| 169 | return 0xff; | |
| 170 | } | |
| 171 | ||
| 172 | // TIA | |
| 173 | WRITE8_MEMBER(a7800_state::tia_w) | |
| 174 | { | |
| 175 | if (offset < 0x20) | |
| 176 | { //INPTCTRL covers TIA registers 0x00-0x1F until locked | |
| 177 | if (data & 0x01) | |
| 178 | { | |
| 179 | if (m_ctrl_lock && offset == 0x01) | |
| 180 | m_maria_flag = 1; | |
| 181 | else if (!m_ctrl_lock) | |
| 182 | m_maria_flag = 1; | |
| 183 | } | |
| 184 | if (!m_ctrl_lock) | |
| 185 | { | |
| 186 | m_ctrl_lock = data & 0x01; | |
| 187 | m_ctrl_reg = data; | |
| 188 | } | |
| 189 | } | |
| 190 | m_tia->tia_sound_w(space, offset, data); | |
| 191 | } | |
| 192 | ||
| 193 | ||
| 194 | // ROM | |
| 195 | READ8_MEMBER(a7800_state::bios_or_cart_r) | |
| 196 | { | |
| 197 | if (!(m_ctrl_reg & 0x04)) | |
| 198 | return m_bios[offset]; | |
| 199 | else | |
| 200 | return m_cartslot->read_40xx(space, offset + 0x8000); | |
| 201 | } | |
| 202 | ||
| 203 | /*************************************************************************** | |
| 104 | 204 | ADDRESS MAPS |
| 105 | 205 | ***************************************************************************/ |
| 106 | 206 | |
| 107 | 207 | static ADDRESS_MAP_START( a7800_mem, AS_PROGRAM, 8, a7800_state ) |
| 108 | AM_RANGE(0x0000, 0x001f) AM_MIRROR(0x300) AM_READWRITE(a7800_TIA_r, a7800_TIA_w) | |
| 109 | AM_RANGE(0x0020, 0x003f) AM_MIRROR(0x300) AM_READWRITE(a7800_MARIA_r, a7800_MARIA_w) | |
| 110 | AM_RANGE(0x0040, 0x00ff) AM_READ_BANK("bank5") AM_WRITE(a7800_RAM0_w) /* RAM (6116 block 0) */ | |
| 111 | AM_RANGE(0x0140, 0x01ff) AM_RAMBANK("bank6") /* RAM (6116 block 1) */ | |
| 208 | AM_RANGE(0x0000, 0x001f) AM_MIRROR(0x300) AM_READWRITE(tia_r, tia_w) | |
| 209 | AM_RANGE(0x0020, 0x003f) AM_MIRROR(0x300) AM_READWRITE(maria_r, maria_w) | |
| 210 | AM_RANGE(0x0040, 0x00ff) AM_RAMBANK("ram0") // RAM (6116 block 0) | |
| 211 | AM_RANGE(0x0140, 0x01ff) AM_RAMBANK("ram1") // RAM (6116 block 1) | |
| 112 | 212 | AM_RANGE(0x0280, 0x02ff) AM_DEVREADWRITE("riot", riot6532_device, read, write) |
| 113 | AM_RANGE(0x0450, 0x045f) /* XBOARD POKEY1 */ | |
| 114 | AM_RANGE(0x0460, 0x046f) /* XBOARD POKEY2 */ | |
| 115 | AM_RANGE(0x0470, 0x047f) /* XBOARD CTRL */ | |
| 116 | AM_RANGE(0x0480, 0x04ff) AM_MIRROR(0x100) AM_RAM /* RIOT RAM */ | |
| 117 | AM_RANGE(0x1000, 0x17ff) AM_RAM /* hs SRAM */ | |
| 118 | AM_RANGE(0x1800, 0x27ff) AM_RAM | |
| 119 | AM_RANGE(0x2800, 0x2fff) AM_RAMBANK("bank7") /* MAINRAM */ | |
| 120 | AM_RANGE(0x3000, 0x37ff) AM_RAMBANK("bank7") /* MAINRAM */ | |
| 121 | AM_RANGE(0x3800, 0x3fff) AM_RAMBANK("bank7") /* MAINRAM */ | |
| 122 | AM_RANGE(0x3000, 0x3fff) AM_ROM /* hs ROM space */ | |
| 123 | AM_RANGE(0x4000, 0x7fff) AM_ROMBANK("bank1") /* f18 hornet */ | |
| 124 | AM_RANGE(0x4000, 0xffff) AM_WRITE(a7800_cart_w) /* XBOARD SRAM */ | |
| 125 | AM_RANGE(0x8000, 0x9fff) AM_ROMBANK("bank2") /* sc */ | |
| 126 | AM_RANGE(0xa000, 0xbfff) AM_ROMBANK("bank3") /* sc + ac */ | |
| 127 | AM_RANGE(0xc000, 0xdfff) AM_ROMBANK("bank4") /* ac */ | |
| 128 | AM_RANGE(0xe000, 0xffff) AM_ROM | |
| 213 | AM_RANGE(0x0480, 0x04ff) AM_MIRROR(0x100) AM_RAMBANK("riot_ram") | |
| 214 | AM_RANGE(0x1800, 0x27ff) AM_RAMBANK("main_ram") | |
| 215 | ||
| 216 | AM_RANGE(0x2040, 0x20ff) AM_RAMBANK("ram0") // mirror (6116 block 0) | |
| 217 | AM_RANGE(0x2140, 0x21ff) AM_RAMBANK("ram1") // mirror (6116 block 1) | |
| 218 | ||
| 219 | AM_RANGE(0x2800, 0x2fff) AM_RAMBANK("mirror") // these should mirror "main_ram" (according to docs) | |
| 220 | AM_RANGE(0x3000, 0x37ff) AM_RAMBANK("mirror") // but system have issues in such case... | |
| 221 | AM_RANGE(0x3800, 0x3fff) AM_RAMBANK("mirror") | |
| 222 | AM_RANGE(0x4000, 0xffff) AM_DEVWRITE("cartslot", a78_cart_slot_device, write_40xx) | |
| 223 | AM_RANGE(0x4000, 0xbfff) AM_DEVREAD("cartslot", a78_cart_slot_device, read_40xx) | |
| 224 | AM_RANGE(0xc000, 0xffff) AM_READ(bios_or_cart_r) // here also the BIOS can be accessed | |
| 129 | 225 | ADDRESS_MAP_END |
| 130 | 226 | |
| 131 | 227 | |
| r31766 | r31767 | |
| 134 | 230 | ***************************************************************************/ |
| 135 | 231 | |
| 136 | 232 | static INPUT_PORTS_START( a7800 ) |
| 137 | PORT_START("joysticks") | |
| 233 | PORT_START("joysticks") | |
| 138 | 234 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_JOYSTICK_UP) PORT_PLAYER(2) PORT_8WAY |
| 139 | 235 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN) PORT_PLAYER(2) PORT_8WAY |
| 140 | 236 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(2) PORT_8WAY |
| r31766 | r31767 | |
| 144 | 240 | PORT_BIT(0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT) PORT_PLAYER(1) PORT_8WAY |
| 145 | 241 | PORT_BIT(0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT) PORT_PLAYER(1) PORT_8WAY |
| 146 | 242 | |
| 147 | PORT_START("buttons") | |
| 243 | PORT_START("buttons") | |
| 148 | 244 | PORT_BIT(0x01, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(2) |
| 149 | 245 | PORT_BIT(0x02, IP_ACTIVE_HIGH, IPT_BUTTON2) PORT_PLAYER(1) |
| 150 | 246 | PORT_BIT(0x04, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(2) |
| 151 | 247 | PORT_BIT(0x08, IP_ACTIVE_HIGH, IPT_BUTTON1) PORT_PLAYER(1) |
| 152 | 248 | PORT_BIT(0xF0, IP_ACTIVE_LOW, IPT_UNUSED) |
| 153 | 249 | |
| 154 | PORT_START("vblank") | |
| 250 | PORT_START("vblank") | |
| 155 | 251 | PORT_BIT(0x7F, IP_ACTIVE_LOW, IPT_UNUSED) |
| 156 | 252 | PORT_BIT(0x80, IP_ACTIVE_HIGH, IPT_CUSTOM) PORT_VBLANK("screen") |
| 157 | 253 | |
| 158 | PORT_START("console_buttons") | |
| 254 | PORT_START("console_buttons") | |
| 159 | 255 | PORT_BIT(0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Reset") PORT_CODE(KEYCODE_R) |
| 160 | 256 | PORT_BIT(0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Select") PORT_CODE(KEYCODE_S) |
| 161 | 257 | PORT_BIT(0x04, IP_ACTIVE_LOW, IPT_UNUSED) |
| r31766 | r31767 | |
| 1133 | 1229 | MACHINE DRIVERS |
| 1134 | 1230 | ***************************************************************************/ |
| 1135 | 1231 | |
| 1232 | void a7800_state::machine_start() | |
| 1233 | { | |
| 1234 | m_bios = machine().root_device().memregion("maincpu")->base() + 0xc000; | |
| 1235 | save_item(NAME(m_p1_one_button)); | |
| 1236 | save_item(NAME(m_p2_one_button)); | |
| 1237 | save_item(NAME(m_bios_enabled)); | |
| 1238 | save_item(NAME(m_ctrl_lock)); | |
| 1239 | save_item(NAME(m_ctrl_reg)); | |
| 1240 | save_item(NAME(m_maria_flag)); | |
| 1241 | ||
| 1242 | // install additional POKEY handlers | |
| 1243 | switch (m_cartslot->get_cart_type()) | |
| 1244 | { | |
| 1245 | case A78_TYPE1: | |
| 1246 | case A78_TYPE3: | |
| 1247 | case A78_TYPEB: | |
| 1248 | case A78_XB_BOARD: | |
| 1249 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0400, 0x047f, read8_delegate(FUNC(a78_cart_slot_device::read_04xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_04xx),(a78_cart_slot_device*)m_cartslot)); | |
| 1250 | break; | |
| 1251 | case A78_HSC: | |
| 1252 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x17ff, read8_delegate(FUNC(a78_cart_slot_device::read_10xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_10xx),(a78_cart_slot_device*)m_cartslot)); | |
| 1253 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x3000, 0x3fff, read8_delegate(FUNC(a78_cart_slot_device::read_30xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_30xx),(a78_cart_slot_device*)m_cartslot)); | |
| 1254 | break; | |
| 1255 | case A78_XM_BOARD: | |
| 1256 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x0400, 0x047f, read8_delegate(FUNC(a78_cart_slot_device::read_04xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_04xx),(a78_cart_slot_device*)m_cartslot)); | |
| 1257 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x1000, 0x17ff, read8_delegate(FUNC(a78_cart_slot_device::read_10xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_10xx),(a78_cart_slot_device*)m_cartslot)); | |
| 1258 | m_maincpu->space(AS_PROGRAM).install_readwrite_handler(0x3000, 0x3fff, read8_delegate(FUNC(a78_cart_slot_device::read_30xx),(a78_cart_slot_device*)m_cartslot), write8_delegate(FUNC(a78_cart_slot_device::write_30xx),(a78_cart_slot_device*)m_cartslot)); | |
| 1259 | break; | |
| 1260 | } | |
| 1261 | } | |
| 1262 | ||
| 1263 | void a7800_state::machine_reset() | |
| 1264 | { | |
| 1265 | m_ctrl_lock = 0; | |
| 1266 | m_ctrl_reg = 0; | |
| 1267 | m_maria_flag = 0; | |
| 1268 | m_bios_enabled = 0; | |
| 1269 | } | |
| 1270 | ||
| 1136 | 1271 | static MACHINE_CONFIG_START( a7800_ntsc, a7800_state ) |
| 1137 | 1272 | /* basic machine hardware */ |
| 1138 | 1273 | MCFG_CPU_ADD("maincpu", M6502, A7800_NTSC_Y1/8) /* 1.79 MHz (switches to 1.19 MHz on TIA or RIOT access) */ |
| 1139 | 1274 | MCFG_CPU_PROGRAM_MAP(a7800_mem) |
| 1140 | 1275 | MCFG_TIMER_DRIVER_ADD_SCANLINE("scantimer", a7800_state, a7800_interrupt, "screen", 0, 1) |
| 1141 | 1276 | |
| 1142 | ||
| 1143 | 1277 | /* video hardware */ |
| 1144 | 1278 | MCFG_SCREEN_ADD("screen", RASTER) |
| 1145 | 1279 | MCFG_SCREEN_RAW_PARAMS( 7159090, 454, 0, 320, 263, 27, 27 + 192 + 32 ) |
| r31766 | r31767 | |
| 1149 | 1283 | MCFG_PALETTE_ADD("palette", ARRAY_LENGTH(a7800_palette) / 3) |
| 1150 | 1284 | MCFG_PALETTE_INIT_OWNER(a7800_state, a7800) |
| 1151 | 1285 | |
| 1152 | ||
| 1153 | 1286 | /* sound hardware */ |
| 1154 | 1287 | MCFG_SPEAKER_STANDARD_MONO("mono") |
| 1155 | 1288 | MCFG_SOUND_TIA_ADD("tia", 31400) |
| 1156 | 1289 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) |
| 1157 | MCFG_SOUND_ADD("pokey", POKEY, A7800_NTSC_Y1/8) | |
| 1158 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) | |
| 1159 | 1290 | |
| 1160 | 1291 | /* devices */ |
| 1161 | 1292 | MCFG_DEVICE_ADD("riot", RIOT6532, A7800_NTSC_Y1/8) |
| r31766 | r31767 | |
| 1163 | 1294 | MCFG_RIOT6532_IN_PB_CB(READ8(a7800_state, riot_console_button_r)) |
| 1164 | 1295 | MCFG_RIOT6532_OUT_PB_CB(WRITE8(a7800_state, riot_button_pullup_w)) |
| 1165 | 1296 | |
| 1166 | MCFG_CARTSLOT_ADD("cart") | |
| 1167 | MCFG_CARTSLOT_EXTENSION_LIST("bin,a78") | |
| 1168 | MCFG_CARTSLOT_NOT_MANDATORY | |
| 1169 | MCFG_CARTSLOT_LOAD(a7800_state,a7800_cart) | |
| 1170 | MCFG_CARTSLOT_PARTIALHASH(a7800_partialhash) | |
| 1171 | MCFG_CARTSLOT_INTERFACE("a7800_cart") | |
| 1297 | MCFG_A78_CARTRIDGE_ADD("cartslot", a7800_cart, NULL) | |
| 1172 | 1298 | |
| 1173 | 1299 | /* software lists */ |
| 1174 | 1300 | MCFG_SOFTWARE_LIST_ADD("cart_list","a7800") |
| r31766 | r31767 | |
| 1177 | 1303 | |
| 1178 | 1304 | |
| 1179 | 1305 | static MACHINE_CONFIG_DERIVED( a7800_pal, a7800_ntsc ) |
| 1180 | ||
| 1181 | 1306 | /* basic machine hardware */ |
| 1182 | 1307 | MCFG_CPU_MODIFY("maincpu") |
| 1183 | 1308 | MCFG_CPU_CLOCK(CLK_PAL) |
| r31766 | r31767 | |
| 1189 | 1314 | MCFG_PALETTE_MODIFY("palette") |
| 1190 | 1315 | MCFG_PALETTE_INIT_OWNER(a7800_state, a7800p ) |
| 1191 | 1316 | |
| 1192 | /* sound hardware */ | |
| 1193 | MCFG_SOUND_MODIFY("pokey") | |
| 1194 | MCFG_SOUND_CLOCK(CLK_PAL) | |
| 1195 | MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) | |
| 1196 | ||
| 1197 | 1317 | /* devices */ |
| 1198 | 1318 | MCFG_DEVICE_REMOVE("riot") |
| 1199 | 1319 | MCFG_DEVICE_ADD("riot", RIOT6532, CLK_PAL) |
| r31766 | r31767 | |
| 1213 | 1333 | ***************************************************************************/ |
| 1214 | 1334 | |
| 1215 | 1335 | ROM_START( a7800 ) |
| 1216 | ROM_REGION(0x100000, "maincpu", 0) | |
| 1217 | ROM_FILL(0x0000, 0x100000, 0xff) | |
| 1336 | ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) | |
| 1218 | 1337 | ROM_SYSTEM_BIOS( 0, "a7800", "Atari 7800" ) |
| 1219 | 1338 | ROMX_LOAD("7800.u7", 0xf000, 0x1000, CRC(5d13730c) SHA1(d9d134bb6b36907c615a594cc7688f7bfcef5b43), ROM_BIOS(1)) |
| 1220 | 1339 | ROM_SYSTEM_BIOS( 1, "a7800pr", "Atari 7800 (prototype with Asteroids)" ) |
| r31766 | r31767 | |
| 1222 | 1341 | ROM_END |
| 1223 | 1342 | |
| 1224 | 1343 | ROM_START( a7800p ) |
| 1225 | ROM_REGION(0x100000, "maincpu", 0) | |
| 1226 | ROM_FILL(0x0000, 0x100000, 0xff) | |
| 1344 | ROM_REGION(0x10000, "maincpu", ROMREGION_ERASEFF) | |
| 1227 | 1345 | ROM_LOAD("7800pal.rom", 0xc000, 0x4000, CRC(d5b61170) SHA1(5a140136a16d1d83e4ff32a19409ca376a8df874)) |
| 1228 | 1346 | ROM_END |
| 1229 | 1347 | |
| 1230 | 1348 | |
| 1231 | 1349 | /*************************************************************************** |
| 1350 | DRIVER INIT | |
| 1351 | ***************************************************************************/ | |
| 1352 | ||
| 1353 | DRIVER_INIT_MEMBER(a7800_state,a7800_ntsc) | |
| 1354 | { | |
| 1355 | m_ispal = FALSE; | |
| 1356 | m_lines = 263; | |
| 1357 | m_p1_one_button = 1; | |
| 1358 | m_p2_one_button = 1; | |
| 1359 | } | |
| 1360 | ||
| 1361 | ||
| 1362 | DRIVER_INIT_MEMBER(a7800_state,a7800_pal) | |
| 1363 | { | |
| 1364 | m_ispal = TRUE; | |
| 1365 | m_lines = 313; | |
| 1366 | m_p1_one_button = 1; | |
| 1367 | m_p2_one_button = 1; | |
| 1368 | } | |
| 1369 | ||
| 1370 | ||
| 1371 | /*************************************************************************** | |
| 1232 | 1372 | GAME DRIVERS |
| 1233 | 1373 | ***************************************************************************/ |
| 1234 | 1374 |
| r31766 | r31767 | |
|---|---|---|
| 560 | 560 | |
| 561 | 561 | BUSES += A1BUS |
| 562 | 562 | BUSES += A2BUS |
| 563 | BUSES += A7800 | |
| 563 | 564 | BUSES += ABCBUS |
| 564 | 565 | BUSES += ABCKB |
| 565 | 566 | BUSES += ADAM |
| r31766 | r31767 | |
| 1023 | 1024 | $(MESSOBJ)/atari.a: \ |
| 1024 | 1025 | $(MESS_MACHINE)/atarifdc.o \ |
| 1025 | 1026 | $(MESS_DRIVERS)/atari400.o \ |
| 1026 | $(MESS_MACHINE)/a7800.o \ | |
| 1027 | 1027 | $(MESS_DRIVERS)/a7800.o \ |
| 1028 | 1028 | $(MESS_VIDEO)/a7800.o \ |
| 1029 | 1029 | $(MESS_DRIVERS)/a2600.o \ |
| r31766 | r31767 | |
|---|---|---|
| 1 | /*************************************************************************** | |
| 2 | ||
| 3 | a7800.c | |
| 4 | ||
| 5 | Machine file to handle emulation of the Atari 7800. | |
| 6 | ||
| 7 | 5-Nov-2003 npwoods Cleanups | |
| 8 | ||
| 9 | 14-May-2002 kubecj Fixed Fatal Run - adding simple riot timer helped. | |
| 10 | maybe someone with knowledge should add full fledged | |
| 11 | riot emulation? | |
| 12 | ||
| 13 | 13-May-2002 kubecj Fixed a7800_cart_type not to be too short ;-D | |
| 14 | fixed for loading of bank6 cart (uh, I hope) | |
| 15 | fixed for loading 64k supercarts | |
| 16 | fixed for using PAL bios | |
| 17 | cart not needed when in PAL mode | |
| 18 | added F18 Hornet bank select type | |
| 19 | added Activision bank select type | |
| 20 | 19-Feb-2010 DanB Added return values for TIA collision registers | |
| 21 | ||
| 22 | 04-Apr-2014 Mike Saarna Fix to controller button RIOT behavior and | |
| 23 | expanded cart handling (bit 05). | |
| 24 | ***************************************************************************/ | |
| 25 | ||
| 26 | #include "emu.h" | |
| 27 | #include "includes/a7800.h" | |
| 28 | #include "cpu/m6502/m6502.h" | |
| 29 | ||
| 30 | ||
| 31 | ||
| 32 | /* local */ | |
| 33 | ||
| 34 | ||
| 35 | ||
| 36 | /*************************************************************************** | |
| 37 | 6532 RIOT | |
| 38 | ***************************************************************************/ | |
| 39 | ||
| 40 | READ8_MEMBER(a7800_state::riot_joystick_r) | |
| 41 | { | |
| 42 | return m_io_joysticks->read(); | |
| 43 | } | |
| 44 | ||
| 45 | READ8_MEMBER(a7800_state::riot_console_button_r) | |
| 46 | { | |
| 47 | return m_io_console_buttons->read(); | |
| 48 | } | |
| 49 | ||
| 50 | WRITE8_MEMBER(a7800_state::riot_button_pullup_w) | |
| 51 | { | |
| 52 | if(m_maincpu->space(AS_PROGRAM).read_byte(0x283) & 0x04) | |
| 53 | m_p1_one_button = data & 0x04; // pin 6 of the controller port is held high by the riot chip when reading two-button controllers (from schematic) | |
| 54 | if(m_maincpu->space(AS_PROGRAM).read_byte(0x283) & 0x10) | |
| 55 | m_p2_one_button = data & 0x10; | |
| 56 | } | |
| 57 | ||
| 58 | /*************************************************************************** | |
| 59 | DRIVER INIT | |
| 60 | ***************************************************************************/ | |
| 61 | ||
| 62 | void a7800_state::a7800_driver_init(int ispal, int lines) | |
| 63 | { | |
| 64 | address_space& space = m_maincpu->space(AS_PROGRAM); | |
| 65 | m_ROM = m_region_maincpu->base(); | |
| 66 | m_ispal = ispal; | |
| 67 | m_lines = lines; | |
| 68 | m_p1_one_button = 1; | |
| 69 | m_p2_one_button = 1; | |
| 70 | ||
| 71 | /* standard banks */ | |
| 72 | m_bank5->set_base(&m_ROM[0x2040]); /* RAM0 */ | |
| 73 | m_bank6->set_base(&m_ROM[0x2140]); /* RAM1 */ | |
| 74 | m_bank7->set_base(&m_ROM[0x2000]); /* MAINRAM */ | |
| 75 | ||
| 76 | /* Brutal hack put in as a consequence of new memory system; fix this */ | |
| 77 | space.install_readwrite_bank(0x0480, 0x04FF,"bank10"); | |
| 78 | m_bank10 = membank("bank10"); | |
| 79 | m_bank10->set_base(m_ROM + 0x0480); | |
| 80 | space.install_readwrite_bank(0x1800, 0x27FF, "bank11"); | |
| 81 | m_bank11 = membank("bank11"); | |
| 82 | m_bank11->set_base(m_ROM + 0x1800); | |
| 83 | ||
| 84 | m_bios_bkup = NULL; | |
| 85 | m_cart_bkup = NULL; | |
| 86 | ||
| 87 | /* Allocate memory for BIOS bank switching */ | |
| 88 | m_bios_bkup = auto_alloc_array_clear(machine(), UINT8, 0x4000); | |
| 89 | m_cart_bkup = auto_alloc_array(machine(), UINT8, 0x4000); | |
| 90 | ||
| 91 | /* save the BIOS so we can switch it in and out */ | |
| 92 | memcpy( m_bios_bkup, m_ROM + 0xC000, 0x4000 ); | |
| 93 | ||
| 94 | /* Initialize cart area to "no data" */ | |
| 95 | memset( m_cart_bkup, 0xFF, 0x4000 ); | |
| 96 | ||
| 97 | /* defaults for PAL bios without cart */ | |
| 98 | m_cart_type = 0; | |
| 99 | m_stick_type = 1; | |
| 100 | } | |
| 101 | ||
| 102 | ||
| 103 | DRIVER_INIT_MEMBER(a7800_state,a7800_ntsc) | |
| 104 | { | |
| 105 | a7800_driver_init(FALSE, 263); | |
| 106 | } | |
| 107 | ||
| 108 | ||
| 109 | DRIVER_INIT_MEMBER(a7800_state,a7800_pal) | |
| 110 | { | |
| 111 | a7800_driver_init(TRUE, 313); | |
| 112 | } | |
| 113 | ||
| 114 | ||
| 115 | void a7800_state::machine_reset() | |
| 116 | { | |
| 117 | UINT8 *memory; | |
| 118 | address_space& space = m_maincpu->space(AS_PROGRAM); | |
| 119 | ||
| 120 | m_ctrl_lock = 0; | |
| 121 | m_ctrl_reg = 0; | |
| 122 | m_maria_flag = 0; | |
| 123 | ||
| 124 | /* set banks to default states */ | |
| 125 | memory = m_region_maincpu->base(); | |
| 126 | if(m_cart_type & 0x20) //supercart bankram | |
| 127 | m_bank1->set_base(memory + 0xf0000 ); | |
| 128 | else | |
| 129 | m_bank1->set_base(memory + 0x4000 ); | |
| 130 | m_bank2->set_base(memory + 0x8000 ); | |
| 131 | m_bank3->set_base(memory + 0xA000 ); | |
| 132 | m_bank4->set_base(memory + 0xC000 ); | |
| 133 | ||
| 134 | /* pokey cartridge */ | |
| 135 | if (m_cart_type & 0x01) | |
| 136 | { | |
| 137 | space.install_readwrite_handler(0x0450, 0x045F, read8_delegate(FUNC(pokey_device::read),(pokey_device*)m_pokey), write8_delegate(FUNC(pokey_device::write),(pokey_device*)m_pokey)); | |
| 138 | } | |
| 139 | } | |
| 140 | ||
| 141 | ||
| 142 | /*************************************************************************** | |
| 143 | CARTRIDGE HANDLING | |
| 144 | ***************************************************************************/ | |
| 145 | ||
| 146 | #define MBANK_TYPE_ATARI 0x0000 | |
| 147 | #define MBANK_TYPE_ACTIVISION 0x0100 | |
| 148 | #define MBANK_TYPE_ABSOLUTE 0x0200 | |
| 149 | ||
| 150 | /* Header format | |
| 151 | 0 Header version - 1 byte | |
| 152 | 1..16 "ATARI7800 " - 16 bytes | |
| 153 | 17..48 Cart title - 32 bytes | |
| 154 | 49..52 data length - 4 bytes | |
| 155 | 53..54 cart type - 2 bytes | |
| 156 | bit 0 0x01 - pokey cart | |
| 157 | bit 1 0x02 - supercart bank switched | |
| 158 | bit 2 0x04 - supercart RAM at $4000 | |
| 159 | bit 3 0x08 - additional state->m_ROM at $4000 | |
| 160 | bit 4 0x10 - bank 6 at $4000 | |
| 161 | bit 5 0x20 - supercart banked RAM | |
| 162 | ||
| 163 | bit 8-15 - Special | |
| 164 | 0 = Normal cart | |
| 165 | 1 = Absolute (F18 Hornet) | |
| 166 | 2 = Activision | |
| 167 | ||
| 168 | 55 controller 1 type - 1 byte | |
| 169 | 56 controller 2 type - 1 byte | |
| 170 | 0 = None | |
| 171 | 1 = Joystick | |
| 172 | 2 = Light Gun | |
| 173 | 57 0 = NTSC/1 = PAL | |
| 174 | ||
| 175 | 100..127 "ACTUAL CART DATA STARTS HERE" - 28 bytes | |
| 176 | ||
| 177 | Versions: | |
| 178 | Version 0: Initial release | |
| 179 | Version 1: Added PAL/NTSC bit. Added Special cart byte. | |
| 180 | Changed 53 bit 2, added bit 3 | |
| 181 | ||
| 182 | */ | |
| 183 | void a7800_partialhash(hash_collection &dest, const unsigned char *data, | |
| 184 | unsigned long length, const char *functions) | |
| 185 | { | |
| 186 | if (length <= 128) | |
| 187 | return; | |
| 188 | dest.compute(&data[128], length - 128, functions); | |
| 189 | } | |
| 190 | ||
| 191 | ||
| 192 | int a7800_state::a7800_verify_cart(char header[128]) | |
| 193 | { | |
| 194 | const char* tag = "ATARI7800"; | |
| 195 | ||
| 196 | if( strncmp( tag, header + 1, 9 ) ) | |
| 197 | { | |
| 198 | logerror("Not a valid A7800 image\n"); | |
| 199 | return IMAGE_VERIFY_FAIL; | |
| 200 | } | |
| 201 | ||
| 202 | logerror("returning ID_OK\n"); | |
| 203 | return IMAGE_VERIFY_PASS; | |
| 204 | } | |
| 205 | ||
| 206 | ||
| 207 | struct a7800_pcb | |
| 208 | { | |
| 209 | const char *pcb_name; | |
| 210 | UINT16 type; | |
| 211 | }; | |
| 212 | ||
| 213 | // sketchy support for a7800 cart types | |
| 214 | // TODO: proper emulation of the banking based on xml | |
| 215 | // (and on the real cart layout!) | |
| 216 | static const a7800_pcb pcb_list[] = | |
| 217 | { | |
| 218 | { "ABSOLUTE", MBANK_TYPE_ABSOLUTE }, | |
| 219 | { "ACTIVISION", MBANK_TYPE_ACTIVISION }, | |
| 220 | { "TYPE-0", 0x0 }, | |
| 221 | { "TYPE-1", 0x1 }, | |
| 222 | { "TYPE-2", 0x2 }, | |
| 223 | { "TYPE-3", 0x3 }, | |
| 224 | { "TYPE-6", 0x6 }, | |
| 225 | { "TYPE-A", 0xa }, | |
| 226 | { "TYPE-XM", 0xb }, /* XM cart? (dkongxm) */ | |
| 227 | { 0 } | |
| 228 | }; | |
| 229 | ||
| 230 | UINT16 a7800_state::a7800_get_pcb_id(const char *pcb) | |
| 231 | { | |
| 232 | int i; | |
| 233 | ||
| 234 | for (i = 0; i < ARRAY_LENGTH(pcb_list); i++) | |
| 235 | { | |
| 236 | if (!core_stricmp(pcb_list[i].pcb_name, pcb)) | |
| 237 | return pcb_list[i].type; | |
| 238 | } | |
| 239 | ||
| 240 | return 0; | |
| 241 | } | |
| 242 | ||
| 243 | DEVICE_IMAGE_LOAD_MEMBER( a7800_state, a7800_cart ) | |
| 244 | { | |
| 245 | UINT32 len = 0, start = 0; | |
| 246 | unsigned char header[128]; | |
| 247 | UINT8 *memory = m_region_maincpu->base(); | |
| 248 | const char *pcb_name; | |
| 249 | ||
| 250 | // detect cart type either from xml or from header | |
| 251 | if (image.software_entry() == NULL) | |
| 252 | { | |
| 253 | /* Load and decode the header */ | |
| 254 | image.fread(header, 128); | |
| 255 | ||
| 256 | /* Check the cart */ | |
| 257 | if( a7800_verify_cart((char *)header) == IMAGE_VERIFY_FAIL) | |
| 258 | return IMAGE_INIT_FAIL; | |
| 259 | ||
| 260 | len =(header[49] << 24) |(header[50] << 16) |(header[51] << 8) | header[52]; | |
| 261 | m_cart_size = len; | |
| 262 | ||
| 263 | m_cart_type =(header[53] << 8) | header[54]; | |
| 264 | m_stick_type = header[55]; | |
| 265 | logerror("Cart type: %x\n", m_cart_type); | |
| 266 | ||
| 267 | /* For now, if game support stick and gun, set it to stick */ | |
| 268 | if (m_stick_type == 3) | |
| 269 | m_stick_type = 1; | |
| 270 | } | |
| 271 | else | |
| 272 | { | |
| 273 | len = image.get_software_region_length("rom"); | |
| 274 | m_cart_size = len; | |
| 275 | // TODO: add stick/gun support to xml! | |
| 276 | m_stick_type = 1; | |
| 277 | if ((pcb_name = image.get_feature("pcb_type")) == NULL) | |
| 278 | m_cart_type = 0; | |
| 279 | else | |
| 280 | m_cart_type = a7800_get_pcb_id(pcb_name); | |
| 281 | } | |
| 282 | ||
| 283 | if (m_cart_type == 0 || m_cart_type == 1) | |
| 284 | { | |
| 285 | /* Normal Cart */ | |
| 286 | start = 0x10000 - len; | |
| 287 | m_cartridge_rom = memory + start; | |
| 288 | if (image.software_entry() == NULL) | |
| 289 | image.fread(m_cartridge_rom, len); | |
| 290 | else | |
| 291 | memcpy(m_cartridge_rom, image.get_software_region("rom"), len); | |
| 292 | } | |
| 293 | else if (m_cart_type & 0x02) | |
| 294 | { | |
| 295 | /* Super Cart */ | |
| 296 | /* Extra ROM at $4000 */ | |
| 297 | if (m_cart_type & 0x08) | |
| 298 | { | |
| 299 | if (image.software_entry() == NULL) | |
| 300 | image.fread(memory + 0x4000, 0x4000); | |
| 301 | else | |
| 302 | memcpy(memory + 0x4000, image.get_software_region("rom"), 0x4000); | |
| 303 | len -= 0x4000; | |
| 304 | start = 0x4000; | |
| 305 | } | |
| 306 | ||
| 307 | m_cartridge_rom = memory + 0x10000; | |
| 308 | if (image.software_entry() == NULL) | |
| 309 | image.fread(m_cartridge_rom, len); | |
| 310 | else | |
| 311 | memcpy(m_cartridge_rom, image.get_software_region("rom") + start, len); | |
| 312 | ||
| 313 | /* bank 0 */ | |
| 314 | memcpy(memory + 0x8000, memory + 0x10000, 0x4000); | |
| 315 | ||
| 316 | /* last bank */ | |
| 317 | memcpy(memory + 0xC000, memory + 0x10000 + len - 0x4000, 0x4000); | |
| 318 | ||
| 319 | /* fixed 2002/05/13 kubecj | |
| 320 | there was 0x08, I added also two other cases. | |
| 321 | Now, it loads bank n-2 to $4000 if it's empty. | |
| 322 | */ | |
| 323 | ||
| 324 | /* bank n-2 */ | |
| 325 | if (!(m_cart_type & 0x0d)) | |
| 326 | { | |
| 327 | memcpy(memory + 0x4000, memory + 0x10000 + len - 0x8000, 0x4000); | |
| 328 | } | |
| 329 | } | |
| 330 | else if (m_cart_type == MBANK_TYPE_ABSOLUTE) | |
| 331 | { | |
| 332 | /* F18 Hornet */ | |
| 333 | ||
| 334 | logerror("Cart type: %x Absolute\n",m_cart_type); | |
| 335 | ||
| 336 | m_cartridge_rom = memory + 0x10000; | |
| 337 | if (image.software_entry() == NULL) | |
| 338 | image.fread(m_cartridge_rom, len); | |
| 339 | else | |
| 340 | memcpy(m_cartridge_rom, image.get_software_region("rom") + start, len); | |
| 341 | ||
| 342 | /* bank 0 */ | |
| 343 | memcpy(memory + 0x4000, memory + 0x10000, 0x4000); | |
| 344 | ||
| 345 | /* last bank */ | |
| 346 | memcpy(memory + 0x8000, memory + 0x18000, 0x8000); | |
| 347 | } | |
| 348 | else if (m_cart_type == MBANK_TYPE_ACTIVISION) | |
| 349 | { | |
| 350 | /* Activision */ | |
| 351 | ||
| 352 | logerror("Cart type: %x Activision\n",m_cart_type); | |
| 353 | ||
| 354 | m_cartridge_rom = memory + 0x10000; | |
| 355 | if (image.software_entry() == NULL) | |
| 356 | image.fread(m_cartridge_rom, len); | |
| 357 | else | |
| 358 | memcpy(m_cartridge_rom, image.get_software_region("rom") + start, len); | |
| 359 | ||
| 360 | /* bank 0 */ | |
| 361 | memcpy(memory + 0xa000, memory + 0x10000, 0x4000); | |
| 362 | ||
| 363 | /* bank6 hi */ | |
| 364 | memcpy(memory + 0x4000, memory + 0x2a000, 0x2000); | |
| 365 | ||
| 366 | /* bank6 lo */ | |
| 367 | memcpy(memory + 0x6000, memory + 0x28000, 0x2000); | |
| 368 | ||
| 369 | /* bank7 hi */ | |
| 370 | memcpy(memory + 0x8000, memory + 0x2e000, 0x2000); | |
| 371 | ||
| 372 | /* bank7 lo */ | |
| 373 | memcpy(memory + 0xe000, memory + 0x2c000, 0x2000); | |
| 374 | ||
| 375 | } | |
| 376 | ||
| 377 | memcpy(m_cart_bkup, memory + 0xc000, 0x4000); | |
| 378 | memcpy(memory + 0xc000, m_bios_bkup, 0x4000); | |
| 379 | return IMAGE_INIT_PASS; | |
| 380 | } | |
| 381 | ||
| 382 | ||
| 383 | WRITE8_MEMBER(a7800_state::a7800_RAM0_w) | |
| 384 | { | |
| 385 | m_ROM[0x2040 + offset] = data; | |
| 386 | m_ROM[0x40 + offset] = data; | |
| 387 | } | |
| 388 | ||
| 389 | ||
| 390 | WRITE8_MEMBER(a7800_state::a7800_cart_w) | |
| 391 | { | |
| 392 | UINT8 *memory = m_region_maincpu->base(); | |
| 393 | ||
| 394 | if(offset < 0x4000) | |
| 395 | { | |
| 396 | if(m_cart_type & 0x04) | |
| 397 | { | |
| 398 | //adjust write location if supercart bankram is in use | |
| 399 | if(m_cart_type & 0x20) | |
| 400 | { | |
| 401 | UINT8 *currentbank1 = (UINT8 *)m_bank1->base(); | |
| 402 | currentbank1[offset] = data; | |
| 403 | } | |
| 404 | else | |
| 405 | m_ROM[0x4000 + offset] = data; | |
| 406 | } | |
| 407 | else if(m_cart_type & 0x01) | |
| 408 | { | |
| 409 | m_pokey->write(space, offset, data); | |
| 410 | } | |
| 411 | else | |
| 412 | { | |
| 413 | logerror("Undefined write A: %x",offset + 0x4000); | |
| 414 | } | |
| 415 | } | |
| 416 | ||
| 417 | if(( m_cart_type & 0x02 ) &&( offset >= 0x4000 ) ) | |
| 418 | { | |
| 419 | /* check if bankram is used */ | |
| 420 | if( m_cart_type & 0x20 ) | |
| 421 | { | |
| 422 | m_bank1->set_base(memory + 0xf0000+((data & 0x20)<<9)); | |
| 423 | } | |
| 424 | /* fix for 64kb supercart */ | |
| 425 | if( m_cart_size == 0x10000 ) | |
| 426 | { | |
| 427 | data &= 0x03; | |
| 428 | } | |
| 429 | else if( m_cart_size == 0x40000 ) | |
| 430 | { | |
| 431 | data &= 0x0f; | |
| 432 | } | |
| 433 | else if( m_cart_size == 0x80000 ) | |
| 434 | { | |
| 435 | data &= 0x1f; | |
| 436 | } | |
| 437 | else | |
| 438 | { | |
| 439 | data &= 0x07; | |
| 440 | } | |
| 441 | m_bank2->set_base(memory + 0x10000 + (data << 14)); | |
| 442 | m_bank3->set_base(memory + 0x12000 + (data << 14)); | |
| 443 | /* logerror("BANK SEL: %d\n",data); */ | |
| 444 | } | |
| 445 | else if(( m_cart_type == MBANK_TYPE_ABSOLUTE ) &&( offset == 0x4000 ) ) | |
| 446 | { | |
| 447 | /* F18 Hornet */ | |
| 448 | /*logerror( "F18 BANK SEL: %d\n", data );*/ | |
| 449 | if( data & 1 ) | |
| 450 | { | |
| 451 | m_bank1->set_base(memory + 0x10000 ); | |
| 452 | } | |
| 453 | else if( data & 2 ) | |
| 454 | { | |
| 455 | m_bank1->set_base(memory + 0x14000 ); | |
| 456 | } | |
| 457 | } | |
| 458 | else if(( m_cart_type == MBANK_TYPE_ACTIVISION ) &&( offset >= 0xBF80 ) ) | |
| 459 | { | |
| 460 | /* Activision */ | |
| 461 | data = offset & 7; | |
| 462 | ||
| 463 | /*logerror( "Activision BANK SEL: %d\n", data );*/ | |
| 464 | ||
| 465 | m_bank3->set_base(memory + 0x10000 + ( data << 14 ) ); | |
| 466 | m_bank4->set_base(memory + 0x12000 + ( data << 14 ) ); | |
| 467 | } | |
| 468 | } | |
| 469 | ||
| 470 | ||
| 471 | /*************************************************************************** | |
| 472 | TIA | |
| 473 | ***************************************************************************/ | |
| 474 | ||
| 475 | READ8_MEMBER(a7800_state::a7800_TIA_r) | |
| 476 | { | |
| 477 | switch(offset & 0x0f) | |
| 478 | { | |
| 479 | case 0x00: | |
| 480 | case 0x01: | |
| 481 | case 0x02: | |
| 482 | case 0x03: | |
| 483 | case 0x04: | |
| 484 | case 0x05: | |
| 485 | case 0x06: | |
| 486 | case 0x07: | |
| 487 | /* Even though the 7800 doesn't use the TIA graphics the collision registers should | |
| 488 | still return a reasonable value */ | |
| 489 | return 0x00; | |
| 490 | case 0x08: | |
| 491 | return((m_io_buttons->read() & 0x02) << 6); | |
| 492 | case 0x09: | |
| 493 | return((m_io_buttons->read() & 0x08) << 4); | |
| 494 | case 0x0A: | |
| 495 | return((m_io_buttons->read() & 0x01) << 7); | |
| 496 | case 0x0B: | |
| 497 | return((m_io_buttons->read() & 0x04) << 5); | |
| 498 | case 0x0c: | |
| 499 | if(((m_io_buttons->read() & 0x08) ||(m_io_buttons->read() & 0x02)) && m_p1_one_button) | |
| 500 | return 0x00; | |
| 501 | else | |
| 502 | return 0x80; | |
| 503 | case 0x0d: | |
| 504 | if(((m_io_buttons->read() & 0x01) ||(m_io_buttons->read() & 0x04)) && m_p2_one_button) | |
| 505 | return 0x00; | |
| 506 | else | |
| 507 | return 0x80; | |
| 508 | default: | |
| 509 | logerror("undefined TIA read %x\n",offset); | |
| 510 | ||
| 511 | } | |
| 512 | return 0xFF; | |
| 513 | } | |
| 514 | ||
| 515 | ||
| 516 | WRITE8_MEMBER(a7800_state::a7800_TIA_w) | |
| 517 | { | |
| 518 | if (offset<0x20) { //INPTCTRL covers TIA registers 0x00-0x1F until locked | |
| 519 | if(data & 0x01) | |
| 520 | { | |
| 521 | if ((m_ctrl_lock)&&(offset==0x01)) | |
| 522 | m_maria_flag=1; | |
| 523 | else if (!m_ctrl_lock) | |
| 524 | m_maria_flag=1; | |
| 525 | } | |
| 526 | if(!m_ctrl_lock) | |
| 527 | { | |
| 528 | m_ctrl_lock = data & 0x01; | |
| 529 | m_ctrl_reg = data; | |
| 530 | ||
| 531 | if (data & 0x04) | |
| 532 | memcpy( m_ROM + 0xC000, m_cart_bkup, 0x4000 ); | |
| 533 | else | |
| 534 | memcpy( m_ROM + 0xC000, m_bios_bkup, 0x4000 ); | |
| 535 | } | |
| 536 | } | |
| 537 | m_tia->tia_sound_w(space, offset, data); | |
| 538 | m_ROM[offset] = data; | |
| 539 | } |
| r31766 | r31767 | |
|---|---|---|
| 8 | 8 | #define A7800_H_ |
| 9 | 9 | |
| 10 | 10 | #include "machine/6532riot.h" |
| 11 | #include "sound/pokey.h" | |
| 12 | 11 | #include "sound/tiasound.h" |
| 13 | 12 | #include "sound/tiaintf.h" |
| 13 | #include "bus/a7800/a78_slot.h" | |
| 14 | 14 | |
| 15 | 15 | |
| 16 | 16 | class a7800_state : public driver_device |
| r31766 | r31767 | |
| 19 | 19 | a7800_state(const machine_config &mconfig, device_type type, const char *tag) |
| 20 | 20 | : driver_device(mconfig, type, tag), |
| 21 | 21 | m_maincpu(*this, "maincpu"), |
| 22 | m_pokey(*this, "pokey"), | |
| 23 | 22 | m_tia(*this, "tia"), |
| 24 | m_region_maincpu(*this, "maincpu"), | |
| 25 | m_bank1(*this, "bank1"), | |
| 26 | m_bank2(*this, "bank2"), | |
| 27 | m_bank3(*this, "bank3"), | |
| 28 | m_bank4(*this, "bank4"), | |
| 29 | m_bank5(*this, "bank5"), | |
| 30 | m_bank6(*this, "bank6"), | |
| 31 | m_bank7(*this, "bank7"), | |
| 32 | 23 | m_io_joysticks(*this, "joysticks"), |
| 33 | 24 | m_io_buttons(*this, "buttons"), |
| 34 | 25 | m_io_vblank(*this, "vblank"), |
| 35 | 26 | m_io_console_buttons(*this, "console_buttons"), |
| 36 | m_bank10(NULL), | |
| 37 | m_bank11(NULL), | |
| 27 | m_cartslot(*this, "cartslot"), | |
| 38 | 28 | m_screen(*this, "screen") { } |
| 39 | 29 | |
| 40 | 30 | int m_lines; |
| 41 | 31 | int m_ispal; |
| 42 | unsigned char *m_cart_bkup; | |
| 43 | unsigned char *m_bios_bkup; | |
| 32 | ||
| 44 | 33 | int m_ctrl_lock; |
| 45 | 34 | int m_ctrl_reg; |
| 46 | 35 | int m_maria_flag; |
| 47 | unsigned char *m_cartridge_rom; | |
| 48 | UINT16 m_cart_type; | |
| 49 | UINT32 m_cart_size; | |
| 50 | unsigned char m_stick_type; | |
| 51 | UINT8 *m_ROM; | |
| 36 | int m_p1_one_button; | |
| 37 | int m_p2_one_button; | |
| 38 | int m_bios_enabled; | |
| 39 | ||
| 40 | UINT8 *m_bios; | |
| 41 | ||
| 52 | 42 | int m_maria_palette[32]; |
| 53 | 43 | int m_line_ram[2][160]; |
| 54 | 44 | int m_active_buffer; |
| r31766 | r31767 | |
| 71 | 61 | int m_maria_nmi; |
| 72 | 62 | unsigned int m_maria_charbase; |
| 73 | 63 | bitmap_ind16 m_bitmap; |
| 74 | int m_p1_one_button; | |
| 75 | int m_p2_one_button; | |
| 76 | 64 | |
| 77 | DECLARE_WRITE8_MEMBER(a7800_RAM0_w); | |
| 78 | DECLARE_WRITE8_MEMBER(a7800_cart_w); | |
| 79 | DECLARE_READ8_MEMBER(a7800_TIA_r); | |
| 80 | DECLARE_WRITE8_MEMBER(a7800_TIA_w); | |
| 81 | DECLARE_READ8_MEMBER(a7800_MARIA_r); | |
| 82 | DECLARE_WRITE8_MEMBER(a7800_MARIA_w); | |
| 83 | void a7800_driver_init(int ispal, int lines); | |
| 65 | DECLARE_READ8_MEMBER(bios_or_cart_r); | |
| 66 | DECLARE_WRITE8_MEMBER(ram0_w); | |
| 67 | DECLARE_READ8_MEMBER(tia_r); | |
| 68 | DECLARE_WRITE8_MEMBER(tia_w); | |
| 69 | DECLARE_READ8_MEMBER(maria_r); | |
| 70 | DECLARE_WRITE8_MEMBER(maria_w); | |
| 84 | 71 | DECLARE_DRIVER_INIT(a7800_pal); |
| 85 | 72 | DECLARE_DRIVER_INIT(a7800_ntsc); |
| 73 | virtual void machine_start(); | |
| 86 | 74 | virtual void machine_reset(); |
| 87 | 75 | virtual void video_start(); |
| 88 | 76 | DECLARE_PALETTE_INIT(a7800); |
| r31766 | r31767 | |
| 94 | 82 | DECLARE_READ8_MEMBER(riot_console_button_r); |
| 95 | 83 | DECLARE_WRITE8_MEMBER(riot_button_pullup_w); |
| 96 | 84 | |
| 97 | DECLARE_DEVICE_IMAGE_LOAD_MEMBER( a7800_cart ); | |
| 98 | ||
| 99 | 85 | protected: |
| 100 | 86 | required_device<cpu_device> m_maincpu; |
| 101 | required_device<pokey_device> m_pokey; | |
| 102 | 87 | required_device<tia_device> m_tia; |
| 103 | required_memory_region m_region_maincpu; | |
| 104 | required_memory_bank m_bank1; | |
| 105 | required_memory_bank m_bank2; | |
| 106 | required_memory_bank m_bank3; | |
| 107 | required_memory_bank m_bank4; | |
| 108 | required_memory_bank m_bank5; | |
| 109 | required_memory_bank m_bank6; | |
| 110 | required_memory_bank m_bank7; | |
| 111 | 88 | required_ioport m_io_joysticks; |
| 112 | 89 | required_ioport m_io_buttons; |
| 113 | 90 | required_ioport m_io_vblank; |
| 114 | 91 | required_ioport m_io_console_buttons; |
| 115 | memory_bank *m_bank10; | |
| 116 | memory_bank *m_bank11; | |
| 92 | required_device<a78_cart_slot_device> m_cartslot; | |
| 117 | 93 | required_device<screen_device> m_screen; |
| 118 | 94 | |
| 119 | 95 | void maria_draw_scanline(); |
| 120 | 96 | int is_holey(unsigned int addr); |
| 121 | 97 | int write_line_ram(int addr, UINT8 offset, int pal); |
| 122 | int a7800_verify_cart(char header[128]); | |
| 123 | UINT16 a7800_get_pcb_id(const char *pcb); | |
| 124 | 98 | }; |
| 125 | 99 | |
| 126 | /*----------- defined in machine/a7800.c -----------*/ | |
| 127 | ||
| 128 | void a7800_partialhash(hash_collection &dest, const unsigned char *data, unsigned long length, const char *functions); | |
| 129 | ||
| 130 | #endif /* A7800_H_ */ | |
| 100 | #endif |
| r31766 | r31767 | |
|---|---|---|
| 28 | 28 | |
| 29 | 29 | #include "emu.h" |
| 30 | 30 | #include "cpu/m6502/m6502.h" |
| 31 | ||
| 32 | 31 | #include "includes/a7800.h" |
| 33 | 32 | |
| 34 | 33 | |
| r31766 | r31767 | |
| 345 | 344 | |
| 346 | 345 | /****** MARIA ***************************************/ |
| 347 | 346 | |
| 348 | READ8_MEMBER(a7800_state::a | |
| 347 | READ8_MEMBER(a7800_state::maria_r) | |
| 349 | 348 | { |
| 350 | 349 | switch (offset) |
| 351 | 350 | { |
| r31766 | r31767 | |
| 358 | 357 | } |
| 359 | 358 | } |
| 360 | 359 | |
| 361 | WRITE8_MEMBER(a7800_state::a | |
| 360 | WRITE8_MEMBER(a7800_state::maria_w) | |
| 362 | 361 | { |
| 363 | 362 | int i; |
| 364 | 363 |
| r31766 | r31767 | |
|---|---|---|
| 194 | 194 | <info name="serial" value="C300358"/> |
| 195 | 195 | <part name="cart" interface="a7800_cart"> |
| 196 | 196 | <feature name="pcb_type" value="TYPE-1" /> |
| 197 | <feature name="slot" value="a78_pokey" /> | |
| 197 | 198 | <dataarea name="rom" size="16384"> |
| 198 | 199 | <rom name="devcard.bin" size="16384" crc="3fbe74ce" sha1="4df3657f57e3086bee26fb5c6ea946c509d08553" offset="0" /> |
| 199 | 200 | </dataarea> |
| 200 | 201 | </part> |
| 201 | 202 | </software> |
| 202 | 203 | |
| 203 | <software name="diagtest" | |
| 204 | <software name="diagtest"> | |
| 204 | 205 | <description>7800 Pro System Diagnostic Test (v1.0)</description> |
| 205 | 206 | <year>198?</year> |
| 206 | 207 | <publisher>Atari</publisher> |
| 207 | 208 | <info name="serial" value="CB101195"/> |
| 208 | 209 | <part name="cart" interface="a7800_cart"> |
| 210 | <feature name="slot" value="a78_rom" /> | |
| 209 | 211 | <dataarea name="rom" size="32768"> |
| 210 | 212 | <rom name="diagtest.bin" size="32768" crc="a1eaa7c1" sha1="76ec76c423d88bdf739e673c051c5b9c174881c6" offset="0" /> |
| 211 | 213 | </dataarea> |
| r31766 | r31767 | |
| 220 | 222 | <sharedfeat name="compatibility" value="NTSC"/> |
| 221 | 223 | <part name="cart" interface="a7800_cart"> |
| 222 | 224 | <feature name="pcb_type" value="TYPE-2" /> |
| 225 | <feature name="slot" value="a78_sg" /> | |
| 223 | 226 | <dataarea name="rom" size="131072"> |
| 224 | 227 | <rom name="aceoface.bin" size="131072" crc="05a2b94c" sha1="efd20bd321a81d67fb6430d9ba93d23fb90d8029" offset="0" /> |
| 225 | 228 | </dataarea> |
| r31766 | r31767 | |
| 234 | 237 | <sharedfeat name="compatibility" value="PAL"/> |
| 235 | 238 | <part name="cart" interface="a7800_cart"> |
| 236 | 239 | <feature name="pcb_type" value="TYPE-2" /> |
| 240 | <feature name="slot" value="a78_sg" /> | |
| 237 | 241 | <dataarea name="rom" size="131072"> |
| 238 | 242 | <rom name="aceofaeu.bin" size="131072" crc="20c5db80" sha1="c43249ba2d38441461e5ffe07ad2e0b46ab1c6df" offset="0" /> |
| 239 | 243 | </dataarea> |
| r31766 | r31767 | |
| 248 | 252 | <sharedfeat name="compatibility" value="NTSC"/> |
| 249 | 253 | <part name="cart" interface="a7800_cart"> |
| 250 | 254 | <feature name="pcb_type" value="TYPE-A" /> |
| 255 | <feature name="slot" value="a78_sg9" /> | |
| 251 | 256 | <feature name="peripheral" value="lightgun" /> <!-- Works with Lightgun --> |
| 252 | 257 | <dataarea name="rom" size="147456"> |
| 253 | 258 | <rom name="alienbrg.bin" size="147456" crc="c8849d36" sha1="a8629fac962cc20b263a60bb2d2386d605713387" offset="0" /> |
| r31766 | r31767 | |
| 263 | 268 | <sharedfeat name="compatibility" value="PAL"/> |
| 264 | 269 | <part name="cart" interface="a7800_cart"> |
| 265 | 270 | <feature name="pcb_type" value="TYPE-A" /> |
| 271 | <feature name="slot" value="a78_sg9" /> | |
| 266 | 272 | <dataarea name="rom" size="147456"> |
| 267 | 273 | <rom name="alienbeu.bin" size="147456" crc="6a19f0fe" sha1="990711ae451d901a960af8ad9ae70813f16257b1" offset="0" /> |
| 268 | 274 | </dataarea> |
| r31766 | r31767 | |
| 280 | 286 | <sharedfeat name="compatibility" value="NTSC"/> |
| 281 | 287 | <part name="cart" interface="a7800_cart"> |
| 282 | 288 | <feature name="pcb_type" value="TYPE-0" /> |
| 289 | <feature name="slot" value="a78_rom" /> | |
| 283 | 290 | <dataarea name="rom" size="16384"> |
| 284 | 291 | <rom name="astroids.bin" size="16384" crc="dfb93f40" sha1="d96ec4e043fcdacab367d8a69d29904b3b2896f1" offset="0" /> |
| 285 | 292 | </dataarea> |
| r31766 | r31767 | |
| 294 | 301 | <sharedfeat name="compatibility" value="NTSC"/> |
| 295 | 302 | <part name="cart" interface="a7800_cart"> |
| 296 | 303 | <feature name="pcb_type" value="TYPE-0" /> |
| 304 | <feature name="slot" value="a78_rom" /> | |
| 297 | 305 | <dataarea name="rom" size="32768"> |
| 298 | 306 | <rom name="asteroids deluxe (ntsc).bin" size="32768" crc="56239d62" sha1="514fb53dcd8c47251fcbe5047bb2d9d13ccf6aef" offset="0" /> |
| 299 | 307 | </dataarea> |
| r31766 | r31767 | |
| 308 | 316 | <sharedfeat name="compatibility" value="PAL"/> |
| 309 | 317 | <part name="cart" interface="a7800_cart"> |
| 310 | 318 | <feature name="pcb_type" value="TYPE-0" /> |
| 319 | <feature name="slot" value="a78_rom" /> | |
| 311 | 320 | <dataarea name="rom" size="32768"> |
| 312 | 321 | <rom name="asteroids deluxe (pal).bin" size="32768" crc="ab72ea89" sha1="341c7be2823e69e95a61567cb79042c140278c4c" offset="0" /> |
| 313 | 322 | </dataarea> |
| r31766 | r31767 | |
| 322 | 331 | <sharedfeat name="compatibility" value="NTSC"/> |
| 323 | 332 | <part name="cart" interface="a7800_cart"> |
| 324 | 333 | <feature name="pcb_type" value="TYPE-1" /> |
| 334 | <feature name="slot" value="a78_pokey" /> | |
| 325 | 335 | <dataarea name="rom" size="32768"> |
| 326 | 336 | <rom name="ballblzr.bin" size="32768" crc="a4c4808b" sha1="4eb5424360691a38b199d91a0e2c9095d0862dbe" offset="0" /> |
| 327 | 337 | </dataarea> |
| r31766 | r31767 | |
| 336 | 346 | <sharedfeat name="compatibility" value="PAL"/> |
| 337 | 347 | <part name="cart" interface="a7800_cart"> |
| 338 | 348 | <feature name="pcb_type" value="TYPE-1" /> |
| 349 | <feature name="slot" value="a78_pokey" /> | |
| 339 | 350 | <dataarea name="rom" size="32768"> |
| 340 | 351 | <rom name="ballbleu.bin" size="32768" crc="aff85565" sha1="1aa1a508ada1521ae1d373a6860681093e3f851c" offset="0" /> |
| 341 | 352 | </dataarea> |
| r31766 | r31767 | |
| 370 | 381 | <sharedfeat name="compatibility" value="PAL"/> |
| 371 | 382 | <part name="cart" interface="a7800_cart"> |
| 372 | 383 | <feature name="pcb_type" value="TYPE-2" /> |
| 384 | <feature name="slot" value="a78_sg" /> | |
| 373 | 385 | <dataarea name="rom" size="131072"> |
| 374 | 386 | <rom name="barnyaeu.bin" size="131072" crc="02764a86" sha1="a5797cf7e747bbd755c99fde6936caa15fbba6b1" offset="0" /> |
| 375 | 387 | </dataarea> |
| r31766 | r31767 | |
| 385 | 397 | <sharedfeat name="compatibility" value="PAL"/> |
| 386 | 398 | <part name="cart" interface="a7800_cart"> |
| 387 | 399 | <feature name="pcb_type" value="TYPE-0" /> |
| 400 | <feature name="slot" value="a78_rom" /> | |
| 388 | 401 | <dataarea name="rom" size="32768"> |
| 389 | 402 | <rom name="bseblleu.bin" size="32768" crc="68d48fdc" sha1="c44fe244206590abc26fbbd520a5726353899e35" offset="0" /> |
| 390 | 403 | </dataarea> |
| r31766 | r31767 | |
| 399 | 412 | <sharedfeat name="compatibility" value="NTSC"/> |
| 400 | 413 | <part name="cart" interface="a7800_cart"> |
| 401 | 414 | <feature name="pcb_type" value="TYPE-1" /> |
| 415 | <feature name="slot" value="a78_pokey" /> | |
| 402 | 416 | <dataarea name="rom" size="32768"> |
| 403 | 417 | <rom name="bd7800demo.bin" size="32768" crc="7873b949" sha1="a3eaff991cec95040aff53e0c26a862c3dfcc05e" offset="0" /> |
| 404 | 418 | </dataarea> |
| r31766 | r31767 | |
| 413 | 427 | <sharedfeat name="compatibility" value="NTSC"/> |
| 414 | 428 | <part name="cart" interface="a7800_cart"> |
| 415 | 429 | <feature name="pcb_type" value="TYPE-0" /> |
| 430 | <feature name="slot" value="a78_rom" /> | |
| 416 | 431 | <dataarea name="rom" size="49152"> |
| 417 | 432 | <rom name="bonq.bin" size="49152" crc="3124b41c" sha1="379ae22a8c8a1c518ba5eb29ad0826dd2daca954" offset="0" /> |
| 418 | 433 | </dataarea> |
| r31766 | r31767 | |
| 427 | 442 | <sharedfeat name="compatibility" value="NTSC"/> |
| 428 | 443 | <part name="cart" interface="a7800_cart"> |
| 429 | 444 | <feature name="pcb_type" value="TYPE-2" /> |
| 445 | <feature name="slot" value="a78_sg" /> | |
| 430 | 446 | <dataarea name="rom" size="131072"> |
| 431 | 447 | <rom name="bsktbrwl.bin" size="131072" crc="c8b9d7b5" sha1="39877a4c88498bf6656451e3d1acaf7e8638bdfd" offset="0" /> |
| 432 | 448 | </dataarea> |
| r31766 | r31767 | |
| 441 | 457 | <sharedfeat name="compatibility" value="PAL"/> |
| 442 | 458 | <part name="cart" interface="a7800_cart"> |
| 443 | 459 | <feature name="pcb_type" value="TYPE-2" /> |
| 460 | <feature name="slot" value="a78_sg" /> | |
| 444 | 461 | <dataarea name="rom" size="131072"> |
| 445 | 462 | <rom name="bsktbreu.bin" size="131072" crc="a4265d4b" sha1="e7ef6b11bb6836ff7d11a25f8d4e2c9361fa69b3" offset="0" /> |
| 446 | 463 | </dataarea> |
| r31766 | r31767 | |
| 455 | 472 | <sharedfeat name="compatibility" value="NTSC"/> |
| 456 | 473 | <part name="cart" interface="a7800_cart"> |
| 457 | 474 | <feature name="pcb_type" value="TYPE-0" /> |
| 475 | <feature name="slot" value="a78_rom" /> | |
| 458 | 476 | <dataarea name="rom" size="16384"> |
| 459 | 477 | <rom name="centpede.bin" size="16384" crc="020efe25" sha1="c8377ad7fb6afec5c88c14a23a68e2ecebba4e5a" offset="0" /> |
| 460 | 478 | </dataarea> |
| r31766 | r31767 | |
| 469 | 487 | <sharedfeat name="compatibility" value="PAL"/> |
| 470 | 488 | <part name="cart" interface="a7800_cart"> |
| 471 | 489 | <feature name="pcb_type" value="TYPE-0" /> |
| 490 | <feature name="slot" value="a78_rom" /> | |
| 472 | 491 | <dataarea name="rom" size="16384"> |
| 473 | 492 | <rom name="centpeeu.bin" size="16384" crc="33f8a8f6" sha1="323f9fc4fde9aa6fcbaac8ae300aaa06bafa745a" offset="0" /> |
| 474 | 493 | </dataarea> |
| r31766 | r31767 | |
| 483 | 502 | <sharedfeat name="compatibility" value="NTSC"/> |
| 484 | 503 | <part name="cart" interface="a7800_cart"> |
| 485 | 504 | <feature name="pcb_type" value="TYPE-0" /> |
| 505 | <feature name="slot" value="a78_rom" /> | |
| 486 | 506 | <dataarea name="rom" size="32768"> |
| 487 | 507 | <rom name="choplift.bin" size="32768" crc="419bff61" sha1="6df15e73494d0a498dd044753a27544214210b14" offset="0" /> |
| 488 | 508 | </dataarea> |
| r31766 | r31767 | |
| 497 | 517 | <sharedfeat name="compatibility" value="PAL"/> |
| 498 | 518 | <part name="cart" interface="a7800_cart"> |
| 499 | 519 | <feature name="pcb_type" value="TYPE-0" /> |
| 520 | <feature name="slot" value="a78_rom" /> | |
| 500 | 521 | <dataarea name="rom" size="49152"> |
| 501 | 522 | <rom name="choplieu.bin" size="49152" crc="12efeb07" sha1="f2fe1c82e5b333f4c59f76a28a9d379228596d89" offset="0" /> |
| 502 | 523 | </dataarea> |
| r31766 | r31767 | |
| 511 | 532 | <sharedfeat name="compatibility" value="NTSC"/> |
| 512 | 533 | <part name="cart" interface="a7800_cart"> |
| 513 | 534 | <feature name="pcb_type" value="TYPE-3" /> |
| 535 | <feature name="slot" value="a78_sg_pokey" /> | |
| 514 | 536 | <dataarea name="rom" size="131072"> |
| 515 | 537 | <rom name="commando.bin" size="131072" crc="cd1a98c5" sha1="f8ae7da650ad38675b81675b77096794a9cd52e8" offset="0" /> |
| 516 | 538 | </dataarea> |
| r31766 | r31767 | |
| 525 | 547 | <sharedfeat name="compatibility" value="PAL"/> |
| 526 | 548 | <part name="cart" interface="a7800_cart"> |
| 527 | 549 | <feature name="pcb_type" value="TYPE-3" /> |
| 550 | <feature name="slot" value="a78_sg_pokey" /> | |
| 528 | 551 | <dataarea name="rom" size="131072"> |
| 529 | 552 | <rom name="commaneu.bin" size="131072" crc="7c211612" sha1="2bdad24967fe4f5492ae294b1ccf8f148930a419" offset="0" /> |
| 530 | 553 | </dataarea> |
| r31766 | r31767 | |
| 539 | 562 | <sharedfeat name="compatibility" value="NTSC"/> |
| 540 | 563 | <part name="cart" interface="a7800_cart"> |
| 541 | 564 | <feature name="pcb_type" value="TYPE-2" /> |
| 565 | <feature name="slot" value="a78_sg" /> | |
| 542 | 566 | <dataarea name="rom" size="131072"> |
| 543 | 567 | <rom name="cracked.bin" size="131072" crc="e645fd1f" sha1="664d267d1245d5698cbf6ff0622ee0d629da3a11" offset="0" /> |
| 544 | 568 | </dataarea> |
| r31766 | r31767 | |
| 553 | 577 | <sharedfeat name="compatibility" value="PAL"/> |
| 554 | 578 | <part name="cart" interface="a7800_cart"> |
| 555 | 579 | <feature name="pcb_type" value="TYPE-2" /> |
| 580 | <feature name="slot" value="a78_sg" /> | |
| 556 | 581 | <dataarea name="rom" size="131072"> |
| 557 | 582 | <rom name="crackeu.bin" size="131072" crc="50fd19cb" sha1="0c1a7806e431efbf0c826a11b92d74eb45e08661" offset="0" /> |
| 558 | 583 | </dataarea> |
| r31766 | r31767 | |
| 567 | 592 | <sharedfeat name="compatibility" value="NTSC"/> |
| 568 | 593 | <part name="cart" interface="a7800_cart"> |
| 569 | 594 | <feature name="pcb_type" value="TYPE-A" /> |
| 595 | <feature name="slot" value="a78_sg9" /> | |
| 570 | 596 | <feature name="peripheral" value="lightgun" /> <!-- Works with Lightgun --> |
| 571 | 597 | <dataarea name="rom" size="147456"> |
| 572 | 598 | <rom name="crossbow.bin" size="147456" crc="d2ea5686" sha1="d5e47da88e232cd9ea059e133e7c0f13d921a04c" offset="0" /> |
| r31766 | r31767 | |
| 582 | 608 | <sharedfeat name="compatibility" value="PAL"/> |
| 583 | 609 | <part name="cart" interface="a7800_cart"> |
| 584 | 610 | <feature name="pcb_type" value="TYPE-A" /> |
| 611 | <feature name="slot" value="a78_sg9" /> | |
| 585 | 612 | <feature name="peripheral" value="lightgun" /> <!-- Works with Lightgun --> |
| 586 | 613 | <dataarea name="rom" size="147456"> |
| 587 | 614 | <rom name="crossbeu.bin" size="147456" crc="e93d8894" sha1="f26d292210a91a714b4b87712ff53b8e49da611e" offset="0" /> |
| r31766 | r31767 | |
| 597 | 624 | <sharedfeat name="compatibility" value="NTSC"/> |
| 598 | 625 | <part name="cart" interface="a7800_cart"> |
| 599 | 626 | <feature name="pcb_type" value="TYPE-2" /> |
| 627 | <feature name="slot" value="a78_sg" /> | |
| 600 | 628 | <dataarea name="rom" size="131072"> |
| 601 | 629 | <rom name="darkchmb.bin" size="131072" crc="366777f1" sha1="848077f15114fec31f8290be2583566f4486fe65" offset="0" /> |
| 602 | 630 | </dataarea> |
| r31766 | r31767 | |
| 611 | 639 | <sharedfeat name="compatibility" value="PAL"/> |
| 612 | 640 | <part name="cart" interface="a7800_cart"> |
| 613 | 641 | <feature name="pcb_type" value="TYPE-2" /> |
| 642 | <feature name="slot" value="a78_sg" /> | |
| 614 | 643 | <dataarea name="rom" size="131072"> |
| 615 | 644 | <rom name="darkcheu.bin" size="131072" crc="c93a563e" sha1="2b888c95b31109ffd0441f586ba18f21a3a4f22e" offset="0" /> |
| 616 | 645 | </dataarea> |
| r31766 | r31767 | |
| 629 | 658 | <sharedfeat name="compatibility" value="NTSC"/> |
| 630 | 659 | <part name="cart" interface="a7800_cart"> |
| 631 | 660 | <feature name="pcb_type" value="TYPE-0" /> |
| 661 | <feature name="slot" value="a78_rom" /> | |
| 632 | 662 | <dataarea name="rom" size="49152"> |
| 633 | 663 | <rom name="dsrtflcn.bin" size="49152" crc="a1dc0899" sha1="725f893f9a98926c627ef37eacc3f241620c3ffc" offset="0" /> |
| 634 | 664 | </dataarea> |
| r31766 | r31767 | |
| 643 | 673 | <sharedfeat name="compatibility" value="NTSC"/> |
| 644 | 674 | <part name="cart" interface="a7800_cart"> |
| 645 | 675 | <feature name="pcb_type" value="TYPE-0" /> |
| 676 | <feature name="slot" value="a78_rom" /> | |
| 646 | 677 | <dataarea name="rom" size="49152"> |
| 647 | 678 | <rom name="dsrtflcp.bin" size="49152" crc="53e277f6" sha1="bbb8aa88879f2ec6039673ccdbbebebc565346bc" offset="0" /> |
| 648 | 679 | </dataarea> |
| r31766 | r31767 | |
| 657 | 688 | <sharedfeat name="compatibility" value="PAL"/> |
| 658 | 689 | <part name="cart" interface="a7800_cart"> |
| 659 | 690 | <feature name="pcb_type" value="TYPE-0" /> |
| 691 | <feature name="slot" value="a78_rom" /> | |
| 660 | 692 | <dataarea name="rom" size="49152"> |
| 661 | 693 | <rom name="dsrtfleu.bin" size="49152" crc="33991ee8" sha1="185d104614e23699e074e850d5ab8c36a159071c" offset="0" /> |
| 662 | 694 | </dataarea> |
| r31766 | r31767 | |
| 674 | 706 | <sharedfeat name="compatibility" value="NTSC"/> |
| 675 | 707 | <part name="cart" interface="a7800_cart"> |
| 676 | 708 | <feature name="pcb_type" value="TYPE-0" /> |
| 709 | <feature name="slot" value="a78_rom" /> | |
| 677 | 710 | <dataarea name="rom" size="16384"> |
| 678 | 711 | <rom name="digdugp.bin" size="16384" crc="50cb13f3" sha1="19cee8dc40fabd7022bedc27e4896c09e3cadfdd" offset="0" /> |
| 679 | 712 | </dataarea> |
| r31766 | r31767 | |
| 688 | 721 | <sharedfeat name="compatibility" value="PAL"/> |
| 689 | 722 | <part name="cart" interface="a7800_cart"> |
| 690 | 723 | <feature name="pcb_type" value="TYPE-0" /> |
| 724 | <feature name="slot" value="a78_rom" /> | |
| 691 | 725 | <dataarea name="rom" size="32768"> |
| 692 | 726 | <rom name="digdugeu.bin" size="32768" crc="efab7077" sha1="ce05d3270b0e0d36d80a4f0731d0173cb5921bce" offset="0" /> |
| 693 | 727 | </dataarea> |
| r31766 | r31767 | |
| 702 | 736 | <sharedfeat name="compatibility" value="NTSC"/> |
| 703 | 737 | <part name="cart" interface="a7800_cart"> |
| 704 | 738 | <feature name="pcb_type" value="TYPE-0" /> |
| 739 | <feature name="slot" value="a78_rom" /> | |
| 705 | 740 | <dataarea name="rom" size="49152"> |
| 706 | 741 | <rom name="dnkykong.bin" size="49152" crc="065e063f" sha1="820c852caa7957179bf7d6faf2e6922dde5a1a8e" offset="0" /> |
| 707 | 742 | </dataarea> |
| r31766 | r31767 | |
| 716 | 751 | <sharedfeat name="compatibility" value="PAL"/> |
| 717 | 752 | <part name="cart" interface="a7800_cart"> |
| 718 | 753 | <feature name="pcb_type" value="TYPE-0" /> |
| 754 | <feature name="slot" value="a78_rom" /> | |
| 719 | 755 | <dataarea name="rom" size="49152"> |
| 720 | 756 | <rom name="dnkykoeu.bin" size="49152" crc="0a43d1c5" sha1="dc69fa8fdf3fcba8557195358b8d206463652e0f" offset="0" /> |
| 721 | 757 | </dataarea> |
| r31766 | r31767 | |
| 730 | 766 | <sharedfeat name="compatibility" value="NTSC"/> |
| 731 | 767 | <part name="cart" interface="a7800_cart"> |
| 732 | 768 | <feature name="pcb_type" value="TYPE-0" /> |
| 769 | <feature name="slot" value="a78_rom" /> | |
| 733 | 770 | <dataarea name="rom" size="49152"> |
| 734 | 771 | <rom name="dnkykgjr.bin" size="49152" crc="1c5a1082" sha1="e9392259fff682fcc3476009771a3cfd7d5bdb6d" offset="0" /> |
| 735 | 772 | </dataarea> |
| r31766 | r31767 | |
| 744 | 781 | <sharedfeat name="compatibility" value="PAL"/> |
| 745 | 782 | <part name="cart" interface="a7800_cart"> |
| 746 | 783 | <feature name="pcb_type" value="TYPE-0" /> |
| 784 | <feature name="slot" value="a78_rom" /> | |
| 747 | 785 | <dataarea name="rom" size="49152"> |
| 748 | 786 | <rom name="dnkykjeu.bin" size="49152" crc="c784dbac" sha1="2626a9cd3326b8ce0ee0e834e17a0eedae005669" offset="0" /> |
| 749 | 787 | </dataarea> |
| r31766 | r31767 | |
| 758 | 796 | <sharedfeat name="compatibility" value="NTSC"/> |
| 759 | 797 | <part name="cart" interface="a7800_cart"> |
| 760 | 798 | <feature name="pcb_type" value="ACTIVISION" /> |
| 799 | <feature name="slot" value="a78_act" /> | |
| 761 | 800 | <dataarea name="rom" size="131072"> |
| 762 | 801 | <rom name="dbledrgn.bin" size="131072" crc="aa265865" sha1="c3fb140836a4ed84cda7a999832703e8b72c0d21" offset="0" /> |
| 763 | 802 | </dataarea> |
| r31766 | r31767 | |
| 772 | 811 | <sharedfeat name="compatibility" value="PAL"/> |
| 773 | 812 | <part name="cart" interface="a7800_cart"> |
| 774 | 813 | <feature name="pcb_type" value="ACTIVISION" /> |
| 814 | <feature name="slot" value="a78_act" /> | |
| 775 | 815 | <dataarea name="rom" size="131072"> |
| 776 | 816 | <rom name="dbledreu.bin" size="131072" crc="f29abdb2" sha1="210f3ac989549e89425e7677127715aee713af32" offset="0" /> |
| 777 | 817 | </dataarea> |
| r31766 | r31767 | |
| 786 | 826 | <sharedfeat name="compatibility" value="NTSC"/> |
| 787 | 827 | <part name="cart" interface="a7800_cart"> |
| 788 | 828 | <feature name="pcb_type" value="ABSOLUTE" /> |
| 829 | <feature name="slot" value="a78_abs" /> | |
| 789 | 830 | <dataarea name="rom" size="65536"> |
| 790 | 831 | <rom name="f18hornt.bin" size="65536" crc="63d1c7c1" sha1="13a18a6b85db6222b01d37800e5e57db616a85a6" offset="0" /> |
| 791 | 832 | </dataarea> |
| r31766 | r31767 | |
| 800 | 841 | <sharedfeat name="compatibility" value="PAL"/> |
| 801 | 842 | <part name="cart" interface="a7800_cart"> |
| 802 | 843 | <feature name="pcb_type" value="ABSOLUTE" /> |
| 844 | <feature name="slot" value="a78_abs" /> | |
| 803 | 845 | <dataarea name="rom" size="65536"> |
| 804 | 846 | <rom name="f18horeu.bin" size="65536" crc="e5d714b0" sha1="673d912b2f9ab7a43f95e0e90bd80249b360fe0d" offset="0" /> |
| 805 | 847 | </dataarea> |
| r31766 | r31767 | |
| 814 | 856 | <sharedfeat name="compatibility" value="NTSC"/> |
| 815 | 857 | <part name="cart" interface="a7800_cart"> |
| 816 | 858 | <feature name="pcb_type" value="TYPE-2" /> |
| 859 | <feature name="slot" value="a78_sg" /> | |
| 817 | 860 | <dataarea name="rom" size="131072"> |
| 818 | 861 | <rom name="fatalrun.bin" size="131072" crc="a44df354" sha1="69aab1e6ef332c6844c693ac41965e4c33ff822a" offset="0" /> |
| 819 | 862 | </dataarea> |
| r31766 | r31767 | |
| 828 | 871 | <sharedfeat name="compatibility" value="PAL"/> |
| 829 | 872 | <part name="cart" interface="a7800_cart"> |
| 830 | 873 | <feature name="pcb_type" value="TYPE-2" /> |
| 874 | <feature name="slot" value="a78_sg" /> | |
| 831 | 875 | <dataarea name="rom" size="131072"> |
| 832 | 876 | <rom name="fatalreu.bin" size="131072" crc="2a0a93be" sha1="f23173d2e42bca0767f3d8ecb6bb1c0d23dde996" offset="0" /> |
| 833 | 877 | </dataarea> |
| r31766 | r31767 | |
| 842 | 886 | <sharedfeat name="compatibility" value="NTSC"/> |
| 843 | 887 | <part name="cart" interface="a7800_cart"> |
| 844 | 888 | <feature name="pcb_type" value="TYPE-2" /> |
| 889 | <feature name="slot" value="a78_sg" /> | |
| 845 | 890 | <dataarea name="rom" size="131072"> |
| 846 | 891 | <rom name="fghtnght.bin" size="131072" crc="720ebc74" sha1="1e8a8704a77b15e70cbc72b0ae9bc25fb91d7c21" offset="0" /> |
| 847 | 892 | </dataarea> |
| r31766 | r31767 | |
| 856 | 901 | <sharedfeat name="compatibility" value="PAL"/> |
| 857 | 902 | <part name="cart" interface="a7800_cart"> |
| 858 | 903 | <feature name="pcb_type" value="TYPE-2" /> |
| 904 | <feature name="slot" value="a78_sg" /> | |
| 859 | 905 | <dataarea name="rom" size="131072"> |
| 860 | 906 | <rom name="fghtngeu.bin" size="131072" crc="64d9c4be" sha1="ded89f3a4ac0d95aa158c98302b7939e5b89e4c6" offset="0" /> |
| 861 | 907 | </dataarea> |
| r31766 | r31767 | |
| 870 | 916 | <sharedfeat name="compatibility" value="NTSC"/> |
| 871 | 917 | <part name="cart" interface="a7800_cart"> |
| 872 | 918 | <feature name="pcb_type" value="TYPE-0" /> |
| 919 | <feature name="slot" value="a78_rom" /> | |
| 873 | 920 | <dataarea name="rom" size="32768"> |
| 874 | 921 | <rom name="foodfght.bin" size="32768" crc="e64a5cde" sha1="3f5f42d5aaf6ccd4979658a1387aac5933549357" offset="0" /> |
| 875 | 922 | </dataarea> |
| r31766 | r31767 | |
| 884 | 931 | <sharedfeat name="compatibility" value="PAL"/> |
| 885 | 932 | <part name="cart" interface="a7800_cart"> |
| 886 | 933 | <feature name="pcb_type" value="TYPE-0" /> |
| 934 | <feature name="slot" value="a78_rom" /> | |
| 887 | 935 | <dataarea name="rom" size="49152"> |
| 888 | 936 | <rom name="foodfgeu.bin" size="49152" crc="c64549ec" sha1="40b8e5eeb9e9ad7239963ed79dc085092ccbec4c" offset="0" /> |
| 889 | 937 | </dataarea> |
| r31766 | r31767 | |
| 898 | 946 | <sharedfeat name="compatibility" value="NTSC"/> |
| 899 | 947 | <part name="cart" interface="a7800_cart"> |
| 900 | 948 | <feature name="pcb_type" value="TYPE-0" /> |
| 949 | <feature name="slot" value="a78_rom" /> | |
| 901 | 950 | <dataarea name="rom" size="32768"> |
| 902 | 951 | <rom name="galagap.bin" size="32768" crc="1a0a3eb3" sha1="33178d682564d70955e13d0633359e87b512253b" offset="0" /> |
| 903 | 952 | </dataarea> |
| r31766 | r31767 | |
| 912 | 961 | <sharedfeat name="compatibility" value="PAL"/> |
| 913 | 962 | <part name="cart" interface="a7800_cart"> |
| 914 | 963 | <feature name="pcb_type" value="TYPE-0" /> |
| 964 | <feature name="slot" value="a78_rom" /> | |
| 915 | 965 | <dataarea name="rom" size="49152"> |
| 916 | 966 | <rom name="galagaeu.bin" size="49152" crc="5990a9f8" sha1="f1ae5df03cf90041380d77c1b49c94611443330b" offset="0" /> |
| 917 | 967 | </dataarea> |
| r31766 | r31767 | |
| 926 | 976 | <sharedfeat name="compatibility" value="NTSC"/> |
| 927 | 977 | <part name="cart" interface="a7800_cart"> |
| 928 | 978 | <feature name="pcb_type" value="TYPE-0" /> |
| 979 | <feature name="slot" value="a78_rom" /> | |
| 929 | 980 | <dataarea name="rom" size="49152"> |
| 930 | 981 | <rom name="gatop1.bin" size="49152" crc="715e1a2f" sha1="e153927b3463148d3fbeef2d28980c281562cc09" offset="0" /> |
| 931 | 982 | </dataarea> |
| r31766 | r31767 | |
| 940 | 991 | <sharedfeat name="compatibility" value="NTSC"/> |
| 941 | 992 | <part name="cart" interface="a7800_cart"> |
| 942 | 993 | <feature name="pcb_type" value="TYPE-0" /> |
| 994 | <feature name="slot" value="a78_rom" /> | |
| 943 | 995 | <dataarea name="rom" size="49152"> |
| 944 | 996 | <rom name="gatop2.bin" size="49152" crc="0f2f66f8" sha1="5784f40216dbc487e80dabd532ae89b2de4bdcc4" offset="0" /> |
| 945 | 997 | </dataarea> |
| r31766 | r31767 | |
| 954 | 1006 | <sharedfeat name="compatibility" value="NTSC"/> |
| 955 | 1007 | <part name="cart" interface="a7800_cart"> |
| 956 | 1008 | <feature name="pcb_type" value="TYPE-0" /> |
| 1009 | <feature name="slot" value="a78_rom" /> | |
| 957 | 1010 | <dataarea name="rom" size="49152"> |
| 958 | 1011 | <rom name="gatop3.bin" size="49152" crc="3796705f" sha1="b365d2bf0a5b238eff5f1a4cdc9b7ece2cace38d" offset="0" /> |
| 959 | 1012 | </dataarea> |
| r31766 | r31767 | |
| 968 | 1021 | <sharedfeat name="compatibility" value="NTSC"/> |
| 969 | 1022 | <part name="cart" interface="a7800_cart"> |
| 970 | 1023 | <feature name="pcb_type" value="TYPE-0" /> |
| 1024 | <feature name="slot" value="a78_rom" /> | |
| 971 | 1025 | <dataarea name="rom" size="49152"> |
| 972 | 1026 | <rom name="gatop4.bin" size="49152" crc="15de2327" sha1="c5793c362a69c7e82191caffa0a830e67fe21dc5" offset="0" /> |
| 973 | 1027 | </dataarea> |
| r31766 | r31767 | |
| 982 | 1036 | <sharedfeat name="compatibility" value="NTSC"/> |
| 983 | 1037 | <part name="cart" interface="a7800_cart"> |
| 984 | 1038 | <feature name="pcb_type" value="TYPE-0" /> |
| 1039 | <feature name="slot" value="a78_rom" /> | |
| 985 | 1040 | <dataarea name="rom" size="49152"> |
| 986 | 1041 | <rom name="gatop5.bin" size="49152" crc="9fa0fbda" sha1="1c536bb5870f315eecbdea6660beb7de9371f0f8" offset="0" /> |
| 987 | 1042 | </dataarea> |
| r31766 | r31767 | |
| 996 | 1051 | <sharedfeat name="compatibility" value="NTSC"/> |
| 997 | 1052 | <part name="cart" interface="a7800_cart"> |
| 998 | 1053 | <feature name="pcb_type" value="TYPE-0" /> |
| 1054 | <feature name="slot" value="a78_rom" /> | |
| 999 | 1055 | <dataarea name="rom" size="49152"> |
| 1000 | 1056 | <rom name="gatop6.bin" size="49152" crc="40b629a1" sha1="f644c5d071c49d75e1487cd06b91da778697ff23" offset="0" /> |
| 1001 | 1057 | </dataarea> |
| r31766 | r31767 | |
| 1011 | 1067 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1012 | 1068 | <part name="cart" interface="a7800_cart"> |
| 1013 | 1069 | <feature name="pcb_type" value="TYPE-0" /> |
| 1070 | <feature name="slot" value="a78_rom" /> | |
| 1014 | 1071 | <dataarea name="rom" size="49152"> |
| 1015 | 1072 | <rom name="gatop7.bin" size="49152" crc="b05cf8d2" sha1="78eaa5c8e89129596f2f9a7a4517e51eefbd857f" offset="0" /> |
| 1016 | 1073 | </dataarea> |
| r31766 | r31767 | |
| 1025 | 1082 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1026 | 1083 | <part name="cart" interface="a7800_cart"> |
| 1027 | 1084 | <feature name="pcb_type" value="TYPE-0" /> |
| 1085 | <feature name="slot" value="a78_rom" /> | |
| 1028 | 1086 | <dataarea name="rom" size="49152"> |
| 1029 | 1087 | <rom name="gatop8.bin" size="49152" crc="e51eb3bc" sha1="e8d29920fe466ea8bfe292e0f135c0e24a48aaad" offset="0" /> |
| 1030 | 1088 | </dataarea> |
| r31766 | r31767 | |
| 1038 | 1096 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1039 | 1097 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1040 | 1098 | <part name="cart" interface="a7800_cart"> |
| 1099 | <feature name="slot" value="a78_rom" /> | |
| 1041 | 1100 | <dataarea name="rom" size="16384"> |
| 1042 | 1101 | <rom name="hangly-man.bin" size="16384" crc="8560a801" sha1="f8654387ff648abbe1e6d8f49b8f8b33f803b917" offset="0" /> |
| 1043 | 1102 | </dataarea> |
| r31766 | r31767 | |
| 1056 | 1115 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1057 | 1116 | <part name="cart" interface="a7800_cart"> |
| 1058 | 1117 | <feature name="pcb_type" value="TYPE-0" /> |
| 1118 | <feature name="slot" value="a78_rom" /> | |
| 1059 | 1119 | <dataarea name="rom" size="49152"> |
| 1060 | 1120 | <rom name="hattrick.bin" size="49152" crc="cf6f4a6c" sha1="14c0cfd01df1c725f399c23810e4854a639fce52" offset="0" /> |
| 1061 | 1121 | </dataarea> |
| r31766 | r31767 | |
| 1070 | 1130 | <sharedfeat name="compatibility" value="PAL"/> |
| 1071 | 1131 | <part name="cart" interface="a7800_cart"> |
| 1072 | 1132 | <feature name="pcb_type" value="TYPE-0" /> |
| 1133 | <feature name="slot" value="a78_rom" /> | |
| 1073 | 1134 | <dataarea name="rom" size="49152"> |
| 1074 | 1135 | <rom name="hattrieu.bin" size="49152" crc="057d9c3c" sha1="0e9fa678bb4aedc7bb7cf5d38fe27556c4c2bbbd" offset="0" /> |
| 1075 | 1136 | </dataarea> |
| 1076 | 1137 | </part> |
| 1077 | 1138 | </software> |
| 1078 | 1139 | |
| 1079 | <software name="hiscore" supported="no"> | |
| 1080 | <description>High Score Cartridge</description> | |
| 1081 | <year>198?</year> | |
| 1082 | <publisher>Atari</publisher> | |
| 1083 | <info name="serial" value="CX78HSC"/> | |
| 1084 | <part name="cart" interface="a7800_cart"> | |
| 1085 | <dataarea name="rom" size="4096"> | |
| 1086 | <rom name="highscre.bin" size="4096" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164" offset="0" /> | |
| 1087 | </dataarea> | |
| 1088 | </part> | |
| 1089 | </software> | |
| 1090 | ||
| 1091 | 1140 | <software name="ikariu" cloneof="ikari"> |
| 1092 | 1141 | <description>Ikari Warriors (NTSC)</description> |
| 1093 | 1142 | <year>1990</year> |
| r31766 | r31767 | |
| 1096 | 1145 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1097 | 1146 | <part name="cart" interface="a7800_cart"> |
| 1098 | 1147 | <feature name="pcb_type" value="TYPE-2" /> |
| 1148 | <feature name="slot" value="a78_sg" /> | |
| 1099 | 1149 | <dataarea name="rom" size="131072"> |
| 1100 | 1150 | <rom name="ikariwar.bin" size="131072" crc="8a6c1f15" sha1="e368c6c7ffca5ffac314dec1effea4e2c809519a" offset="0" /> |
| 1101 | 1151 | </dataarea> |
| r31766 | r31767 | |
| 1110 | 1160 | <sharedfeat name="compatibility" value="PAL"/> |
| 1111 | 1161 | <part name="cart" interface="a7800_cart"> |
| 1112 | 1162 | <feature name="pcb_type" value="TYPE-2" /> |
| 1163 | <feature name="slot" value="a78_sg" /> | |
| 1113 | 1164 | <dataarea name="rom" size="131072"> |
| 1114 | 1165 | <rom name="ikariweu.bin" size="131072" crc="cb621cdc" sha1="275cae6c693d9bd1906fdc684460ec596869bbad" offset="0" /> |
| 1115 | 1166 | </dataarea> |
| r31766 | r31767 | |
| 1124 | 1175 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1125 | 1176 | <part name="cart" interface="a7800_cart"> |
| 1126 | 1177 | <feature name="pcb_type" value="TYPE-6" /> |
| 1178 | <feature name="slot" value="a78_sg_ram" /> | |
| 1127 | 1179 | <dataarea name="rom" size="131072"> |
| 1128 | 1180 | <rom name="impssble.bin" size="131072" crc="3b1f2f47" sha1="5437c0efb63a349953ec047efe6ec24144ed6914" offset="0" /> |
| 1129 | 1181 | </dataarea> |
| r31766 | r31767 | |
| 1138 | 1190 | <sharedfeat name="compatibility" value="PAL"/> |
| 1139 | 1191 | <part name="cart" interface="a7800_cart"> |
| 1140 | 1192 | <feature name="pcb_type" value="TYPE-6" /> |
| 1193 | <feature name="slot" value="a78_sg_ram" /> | |
| 1141 | 1194 | <dataarea name="rom" size="131072"> |
| 1142 | 1195 | <rom name="impssbeu.bin" size="131072" crc="994af6e0" sha1="9770b61472510aba1cf3ea35ceca1859c3493676" offset="0" /> |
| 1143 | 1196 | </dataarea> |
| r31766 | r31767 | |
| 1152 | 1205 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1153 | 1206 | <part name="cart" interface="a7800_cart"> |
| 1154 | 1207 | <feature name="pcb_type" value="TYPE-6" /> |
| 1208 | <feature name="slot" value="a78_sg_ram" /> | |
| 1155 | 1209 | <dataarea name="rom" size="131072"> |
| 1156 | 1210 | <rom name="jinks.bin" size="131072" crc="0818d8cd" sha1="472bc12c437b015a9e317bac092529f3295033b8" offset="0" /> |
| 1157 | 1211 | </dataarea> |
| r31766 | r31767 | |
| 1166 | 1220 | <sharedfeat name="compatibility" value="PAL"/> |
| 1167 | 1221 | <part name="cart" interface="a7800_cart"> |
| 1168 | 1222 | <feature name="pcb_type" value="TYPE-6" /> |
| 1223 | <feature name="slot" value="a78_sg_ram" /> | |
| 1169 | 1224 | <dataarea name="rom" size="131072"> |
| 1170 | 1225 | <rom name="jinkseu.bin" size="131072" crc="9207ed3b" sha1="eb16de0c3d5c4e769ae2314ba21c4dd3bca33c88" offset="0" /> |
| 1171 | 1226 | </dataarea> |
| r31766 | r31767 | |
| 1179 | 1234 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1180 | 1235 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1181 | 1236 | <part name="cart" interface="a7800_cart"> |
| 1237 | <feature name="slot" value="a78_rom" /> | |
| 1182 | 1238 | <dataarea name="rom" size="32768"> |
| 1183 | 1239 | <rom name="jr pac-man (ntsc).bin" size="32768" crc="0198aed4" sha1="f6d51d9c0eaf03c47e1e2d3774fd16c3ba3a59e3" offset="0" /> |
| 1184 | 1240 | </dataarea> |
| r31766 | r31767 | |
| 1193 | 1249 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1194 | 1250 | <part name="cart" interface="a7800_cart"> |
| 1195 | 1251 | <feature name="pcb_type" value="TYPE-0" /> |
| 1252 | <feature name="slot" value="a78_rom" /> | |
| 1196 | 1253 | <dataarea name="rom" size="32768"> |
| 1197 | 1254 | <rom name="joust.bin" size="32768" crc="2c430bce" sha1="1ccd7c232bcfd5a65d26b9decfe4eceadcbe314c" offset="0" /> |
| 1198 | 1255 | </dataarea> |
| r31766 | r31767 | |
| 1207 | 1264 | <sharedfeat name="compatibility" value="PAL"/> |
| 1208 | 1265 | <part name="cart" interface="a7800_cart"> |
| 1209 | 1266 | <feature name="pcb_type" value="TYPE-0" /> |
| 1267 | <feature name="slot" value="a78_rom" /> | |
| 1210 | 1268 | <dataarea name="rom" size="49152"> |
| 1211 | 1269 | <rom name="jousteu.bin" size="49152" crc="9b3be616" sha1="aae5b9ee00c39d577858aba9d1fd791194be2c0c" offset="0" /> |
| 1212 | 1270 | </dataarea> |
| r31766 | r31767 | |
| 1228 | 1286 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1229 | 1287 | <part name="cart" interface="a7800_cart"> |
| 1230 | 1288 | <feature name="pcb_type" value="TYPE-0" /> |
| 1289 | <feature name="slot" value="a78_rom" /> | |
| 1231 | 1290 | <dataarea name="rom" size="49152"> |
| 1232 | 1291 | <rom name="karateka.bin" size="49152" crc="fec21472" sha1="9fb97bbc7dcc610251cee1695c48b82a087f32d2" offset="0" /> |
| 1233 | 1292 | </dataarea> |
| r31766 | r31767 | |
| 1242 | 1301 | <sharedfeat name="compatibility" value="PAL"/> |
| 1243 | 1302 | <part name="cart" interface="a7800_cart"> |
| 1244 | 1303 | <feature name="pcb_type" value="TYPE-2" /> |
| 1304 | <feature name="slot" value="a78_sg" /> | |
| 1245 | 1305 | <dataarea name="rom" size="65536"> |
| 1246 | 1306 | <rom name="karateeu.bin" size="65536" crc="6c8d9e68" sha1="c5f25c88eefe0c7b3571ab3c3ec5185e537eb151" offset="0" /> |
| 1247 | 1307 | </dataarea> |
| r31766 | r31767 | |
| 1256 | 1316 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1257 | 1317 | <part name="cart" interface="a7800_cart"> |
| 1258 | 1318 | <feature name="pcb_type" value="TYPE-2" /> |
| 1319 | <feature name="slot" value="a78_sg" /> | |
| 1259 | 1320 | <dataarea name="rom" size="131072"> |
| 1260 | 1321 | <rom name="klax.bin" size="131072" crc="f26621e3" sha1="0ea6a04b8f9713040ce57b6f23a6589f98409d46" offset="0" /> |
| 1261 | 1322 | </dataarea> |
| r31766 | r31767 | |
| 1270 | 1331 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1271 | 1332 | <part name="cart" interface="a7800_cart"> |
| 1272 | 1333 | <feature name="pcb_type" value="TYPE-0" /> |
| 1334 | <feature name="slot" value="a78_rom" /> | |
| 1273 | 1335 | <dataarea name="rom" size="32768"> |
| 1274 | 1336 | <rom name="kungfums.bin" size="32768" crc="297899bb" sha1="8824bffdf4f30a8191e581752a75259a663092ca" offset="0" /> |
| 1275 | 1337 | </dataarea> |
| r31766 | r31767 | |
| 1284 | 1346 | <sharedfeat name="compatibility" value="PAL"/> |
| 1285 | 1347 | <part name="cart" interface="a7800_cart"> |
| 1286 | 1348 | <feature name="pcb_type" value="TYPE-0" /> |
| 1349 | <feature name="slot" value="a78_rom" /> | |
| 1287 | 1350 | <dataarea name="rom" size="32768"> |
| 1288 | 1351 | <rom name="kungfueu.bin" size="32768" crc="c1531fc4" sha1="0f0e24246d9e684b7f900a362fb08878b232580c" offset="0" /> |
| 1289 | 1352 | </dataarea> |
| r31766 | r31767 | |
| 1298 | 1361 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1299 | 1362 | <part name="cart" interface="a7800_cart"> |
| 1300 | 1363 | <feature name="pcb_type" value="TYPE-0" /> |
| 1364 | <feature name="slot" value="a78_rom" /> | |
| 1301 | 1365 | <dataarea name="rom" size="49152"> |
| 1302 | 1366 | <rom name="mariobro.bin" size="49152" crc="8021a13b" sha1="12e04b67094af622641c536379c69ecad2ee98ed" offset="0" /> |
| 1303 | 1367 | </dataarea> |
| r31766 | r31767 | |
| 1312 | 1376 | <sharedfeat name="compatibility" value="PAL"/> |
| 1313 | 1377 | <part name="cart" interface="a7800_cart"> |
| 1314 | 1378 | <feature name="pcb_type" value="TYPE-0" /> |
| 1379 | <feature name="slot" value="a78_rom" /> | |
| 1315 | 1380 | <dataarea name="rom" size="49152"> |
| 1316 | 1381 | <rom name="mariobeu.bin" size="49152" crc="efad3d9d" sha1="881beff5103713e655fed80b32e0bbd774e78ee8" offset="0" /> |
| 1317 | 1382 | </dataarea> |
| r31766 | r31767 | |
| 1326 | 1391 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1327 | 1392 | <part name="cart" interface="a7800_cart"> |
| 1328 | 1393 | <feature name="pcb_type" value="TYPE-2" /> |
| 1394 | <feature name="slot" value="a78_sg" /> | |
| 1329 | 1395 | <dataarea name="rom" size="131072"> |
| 1330 | 1396 | <rom name="matmania.bin" size="131072" crc="aba91829" sha1="bb849b603cf1091e4f032936b209ff33fc3b714e" offset="0" /> |
| 1331 | 1397 | </dataarea> |
| r31766 | r31767 | |
| 1340 | 1406 | <sharedfeat name="compatibility" value="PAL"/> |
| 1341 | 1407 | <part name="cart" interface="a7800_cart"> |
| 1342 | 1408 | <feature name="pcb_type" value="TYPE-2" /> |
| 1409 | <feature name="slot" value="a78_sg" /> | |
| 1343 | 1410 | <dataarea name="rom" size="131072"> |
| 1344 | 1411 | <rom name="matmaneu.bin" size="131072" crc="065f3873" sha1="119bb784f1a0638cc6778841131ca1766e94a112" offset="0" /> |
| 1345 | 1412 | </dataarea> |
| r31766 | r31767 | |
| 1354 | 1421 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1355 | 1422 | <part name="cart" interface="a7800_cart"> |
| 1356 | 1423 | <feature name="pcb_type" value="TYPE-2" /> |
| 1424 | <feature name="slot" value="a78_sg" /> | |
| 1357 | 1425 | <dataarea name="rom" size="131072"> |
| 1358 | 1426 | <rom name="mean18.bin" size="131072" crc="cf21d9ac" sha1="a3e50c0e56c9675ffb1b6439f40789bc64c606b2" offset="0" /> |
| 1359 | 1427 | </dataarea> |
| r31766 | r31767 | |
| 1368 | 1436 | <sharedfeat name="compatibility" value="PAL"/> |
| 1369 | 1437 | <part name="cart" interface="a7800_cart"> |
| 1370 | 1438 | <feature name="pcb_type" value="TYPE-2" /> |
| 1439 | <feature name="slot" value="a78_sg" /> | |
| 1371 | 1440 | <dataarea name="rom" size="131072"> |
| 1372 | 1441 | <rom name="mean18eu.bin" size="131072" crc="3cec4be8" sha1="47702ee71c64af4ada09cd41122c779c7d8d94f1" offset="0" /> |
| 1373 | 1442 | </dataarea> |
| r31766 | r31767 | |
| 1412 | 1481 | <info name="serial" value="CX7890"/> |
| 1413 | 1482 | <part name="cart" interface="a7800_cart"> |
| 1414 | 1483 | <feature name="pcb_type" value="TYPE-2" /> |
| 1484 | <feature name="slot" value="a78_sg" /> | |
| 1415 | 1485 | <dataarea name="rom" size="147456"> |
| 1416 | 1486 | <rom name="miaproto.bin" size="147456" crc="ff7a4c60" sha1="26b0b187a43bf9a9397cb5e8b0033e8833f48f88" offset="0" /> |
| 1417 | 1487 | </dataarea> |
| r31766 | r31767 | |
| 1426 | 1496 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1427 | 1497 | <part name="cart" interface="a7800_cart"> |
| 1428 | 1498 | <feature name="pcb_type" value="TYPE-2" /> |
| 1499 | <feature name="slot" value="a78_sg" /> | |
| 1429 | 1500 | <dataarea name="rom" size="131072"> |
| 1430 | 1501 | <rom name="midmutnt.bin" size="131072" crc="187ec84e" sha1="db5ea4c1456f3b403f6b8978432ecbcdac89d432" offset="0" /> |
| 1431 | 1502 | </dataarea> |
| r31766 | r31767 | |
| 1440 | 1511 | <sharedfeat name="compatibility" value="PAL"/> |
| 1441 | 1512 | <part name="cart" interface="a7800_cart"> |
| 1442 | 1513 | <feature name="pcb_type" value="TYPE-2" /> |
| 1514 | <feature name="slot" value="a78_sg" /> | |
| 1443 | 1515 | <dataarea name="rom" size="131072"> |
| 1444 | 1516 | <rom name="midmuteu.bin" size="131072" crc="7ca6d521" sha1="85f0e0556df65c0732f71ab3f2bbde3615355f72" offset="0" /> |
| 1445 | 1517 | </dataarea> |
| r31766 | r31767 | |
| 1463 | 1535 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1464 | 1536 | <part name="cart" interface="a7800_cart"> |
| 1465 | 1537 | <feature name="pcb_type" value="TYPE-2" /> |
| 1538 | <feature name="slot" value="a78_sg" /> | |
| 1466 | 1539 | <dataarea name="rom" size="131072"> |
| 1467 | 1540 | <rom name="mtrpsych.bin" size="131072" crc="1e219482" sha1="b9381f4d0413b6c48e27f26ed94c7a9eb1a49624" offset="0" /> |
| 1468 | 1541 | </dataarea> |
| r31766 | r31767 | |
| 1477 | 1550 | <sharedfeat name="compatibility" value="PAL"/> |
| 1478 | 1551 | <part name="cart" interface="a7800_cart"> |
| 1479 | 1552 | <feature name="pcb_type" value="TYPE-2" /> |
| 1553 | <feature name="slot" value="a78_sg" /> | |
| 1480 | 1554 | <dataarea name="rom" size="131072"> |
| 1481 | 1555 | <rom name="mtrpsyeu.bin" size="131072" crc="38bb45ba" sha1="3b72d6b3e28ca9182f1f25dc57115d2ec33aa63e" offset="0" /> |
| 1482 | 1556 | </dataarea> |
| r31766 | r31767 | |
| 1490 | 1564 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1491 | 1565 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1492 | 1566 | <part name="cart" interface="a7800_cart"> |
| 1567 | <feature name="slot" value="a78_rom" /> | |
| 1493 | 1568 | <dataarea name="rom" size="16384"> |
| 1494 | 1569 | <rom name="miss pac-attack.bin" size="16384" crc="b4557dd7" sha1="446660edd243da39602d1b673ff13a84239b66d4" offset="0" /> |
| 1495 | 1570 | </dataarea> |
| r31766 | r31767 | |
| 1504 | 1579 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1505 | 1580 | <part name="cart" interface="a7800_cart"> |
| 1506 | 1581 | <feature name="pcb_type" value="TYPE-0" /> |
| 1582 | <feature name="slot" value="a78_rom" /> | |
| 1507 | 1583 | <dataarea name="rom" size="16384"> |
| 1508 | 1584 | <rom name="mspacman.bin" size="16384" crc="e42fc700" sha1="ff22e21fc953a288453c40eb6fc5378d42b871f6" offset="0" /> |
| 1509 | 1585 | </dataarea> |
| r31766 | r31767 | |
| 1518 | 1594 | <sharedfeat name="compatibility" value="PAL"/> |
| 1519 | 1595 | <part name="cart" interface="a7800_cart"> |
| 1520 | 1596 | <feature name="pcb_type" value="TYPE-0" /> |
| 1597 | <feature name="slot" value="a78_rom" /> | |
| 1521 | 1598 | <dataarea name="rom" size="32768"> |
| 1522 | 1599 | <rom name="mspacmeu.bin" size="32768" crc="8421033a" sha1="a5b0826a130acf8b8dbc59ef980d40b802c22b30" offset="0" /> |
| 1523 | 1600 | </dataarea> |
| r31766 | r31767 | |
| 1532 | 1609 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1533 | 1610 | <part name="cart" interface="a7800_cart"> |
| 1534 | 1611 | <feature name="pcb_type" value="TYPE-2" /> |
| 1612 | <feature name="slot" value="a78_sg" /> | |
| 1535 | 1613 | <dataarea name="rom" size="131072"> |
| 1536 | 1614 | <rom name="ninjaglf.bin" size="131072" crc="cb48e8dc" sha1="96d0e59e703770eea8d8d9c2c4e5a87ce6f2de76" offset="0" /> |
| 1537 | 1615 | </dataarea> |
| r31766 | r31767 | |
| 1546 | 1624 | <sharedfeat name="compatibility" value="PAL"/> |
| 1547 | 1625 | <part name="cart" interface="a7800_cart"> |
| 1548 | 1626 | <feature name="pcb_type" value="TYPE-2" /> |
| 1627 | <feature name="slot" value="a78_sg" /> | |
| 1549 | 1628 | <dataarea name="rom" size="131072"> |
| 1550 | 1629 | <rom name="ninjageu.bin" size="131072" crc="2b5382b7" sha1="99ce5711e38ff7ef3311216f954cf0ab70e289cf" offset="0" /> |
| 1551 | 1630 | </dataarea> |
| r31766 | r31767 | |
| 1561 | 1640 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1562 | 1641 | <part name="cart" interface="a7800_cart"> |
| 1563 | 1642 | <feature name="pcb_type" value="TYPE-0" /> |
| 1643 | <feature name="slot" value="a78_rom" /> | |
| 1564 | 1644 | <dataarea name="rom" size="49152"> |
| 1565 | 1645 | <rom name="oneonone.bin" size="49152" crc="7d9370fb" sha1="5173f892a8d70aeca6c324c138c56208e0db2b98" offset="0" /> |
| 1566 | 1646 | </dataarea> |
| r31766 | r31767 | |
| 1576 | 1656 | <sharedfeat name="compatibility" value="PAL"/> |
| 1577 | 1657 | <part name="cart" interface="a7800_cart"> |
| 1578 | 1658 | <feature name="pcb_type" value="TYPE-0" /> |
| 1659 | <feature name="slot" value="a78_rom" /> | |
| 1579 | 1660 | <dataarea name="rom" size="49152"> |
| 1580 | 1661 | <rom name="oneonoeu.bin" size="49152" crc="7a628295" sha1="01dfc5e4e615cf20ee4f07245285f85684ee445d" offset="0" /> |
| 1581 | 1662 | </dataarea> |
| r31766 | r31767 | |
| 1590 | 1671 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1591 | 1672 | <part name="cart" interface="a7800_cart"> |
| 1592 | 1673 | <feature name="pcb_type" value="TYPE-0" /> |
| 1674 | <feature name="slot" value="a78_rom" /> | |
| 1593 | 1675 | <dataarea name="rom" size="32768"> |
| 1594 | 1676 | <rom name="peterose.bin" size="32768" crc="f33d4dfa" sha1="ffb4fbed8d8f28ea71668542b7ebd019955c5a11" offset="0" /> |
| 1595 | 1677 | </dataarea> |
| r31766 | r31767 | |
| 1603 | 1685 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1604 | 1686 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1605 | 1687 | <part name="cart" interface="a7800_cart"> |
| 1688 | <feature name="slot" value="a78_rom" /> | |
| 1606 | 1689 | <dataarea name="rom" size="16384"> |
| 1607 | 1690 | <rom name="pacman.bin" size="16384" crc="d5d08d7e" sha1="f427806eae13e3c4ab8afdbe366ab1ec219d0047" offset="0" /> |
| 1608 | 1691 | </dataarea> |
| r31766 | r31767 | |
| 1616 | 1699 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1617 | 1700 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1618 | 1701 | <part name="cart" interface="a7800_cart"> |
| 1702 | <feature name="slot" value="a78_rom" /> | |
| 1619 | 1703 | <dataarea name="rom" size="32768"> |
| 1620 | 1704 | <rom name="ultra pac-man.bin" size="32768" crc="4baeac35" sha1="63a98f74ada1ce08ee0137e437395cc17b67a4d9" offset="0" /> |
| 1621 | 1705 | </dataarea> |
| r31766 | r31767 | |
| 1629 | 1713 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1630 | 1714 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1631 | 1715 | <part name="cart" interface="a7800_cart"> |
| 1716 | <feature name="slot" value="a78_rom" /> | |
| 1632 | 1717 | <dataarea name="rom" size="32768"> |
| 1633 | 1718 | <rom name="pac-man collection (ntsc).bin" size="32768" crc="553ea894" sha1="3b579d8827898a94b16225632a9870d22224b6bc" offset="0" /> |
| 1634 | 1719 | </dataarea> |
| r31766 | r31767 | |
| 1642 | 1727 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1643 | 1728 | <sharedfeat name="compatibility" value="PAL"/> |
| 1644 | 1729 | <part name="cart" interface="a7800_cart"> |
| 1730 | <feature name="slot" value="a78_rom" /> | |
| 1645 | 1731 | <dataarea name="rom" size="32768"> |
| 1646 | 1732 | <rom name="pac-man collection (pal).bin" size="32768" crc="74517c71" sha1="ed0414e4b7c5ac10b0d7a5e19ee9c8e9ee61442f" offset="0" /> |
| 1647 | 1733 | </dataarea> |
| r31766 | r31767 | |
| 1655 | 1741 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1656 | 1742 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1657 | 1743 | <part name="cart" interface="a7800_cart"> |
| 1744 | <feature name="slot" value="a78_rom" /> | |
| 1658 | 1745 | <dataarea name="rom" size="16384"> |
| 1659 | 1746 | <rom name="pac-man plus.bin" size="16384" crc="e2dc056e" sha1="7dd18c8c7e82c813531f80ef2fe981c340f41c20" offset="0" /> |
| 1660 | 1747 | </dataarea> |
| r31766 | r31767 | |
| 1668 | 1755 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1669 | 1756 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1670 | 1757 | <part name="cart" interface="a7800_cart"> |
| 1758 | <feature name="slot" value="a78_rom" /> | |
| 1671 | 1759 | <dataarea name="rom" size="16384"> |
| 1672 | 1760 | <rom name="pac-pollux.bin" size="16384" crc="1b3dd167" sha1="2f079cd0fb6d92fd5261fe567ae0a6407a722f44" offset="0" /> |
| 1673 | 1761 | </dataarea> |
| r31766 | r31767 | |
| 1681 | 1769 | <info name="serial" value="CX7891"/> |
| 1682 | 1770 | <part name="cart" interface="a7800_cart"> |
| 1683 | 1771 | <feature name="pcb_type" value="TYPE-2" /> |
| 1772 | <feature name="slot" value="a78_sg" /> | |
| 1684 | 1773 | <dataarea name="rom" size="65536"> |
| 1685 | 1774 | <rom name="pitfghtr.bin" size="65536" crc="a5e75537" sha1="378addef67aca55500f0f5f9f0075dcb177406b5" offset="0" /> |
| 1686 | 1775 | </dataarea> |
| r31766 | r31767 | |
| 1695 | 1784 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1696 | 1785 | <part name="cart" interface="a7800_cart"> |
| 1697 | 1786 | <feature name="pcb_type" value="TYPE-2" /> |
| 1787 | <feature name="slot" value="a78_sg" /> | |
| 1698 | 1788 | <dataarea name="rom" size="131072"> |
| 1699 | 1789 | <rom name="planetsm.bin" size="131072" crc="4e3b9e64" sha1="503b975fc1f8edc16110ac2c5b884c4e8b2b6efb" offset="0" /> |
| 1700 | 1790 | </dataarea> |
| r31766 | r31767 | |
| 1709 | 1799 | <sharedfeat name="compatibility" value="PAL"/> |
| 1710 | 1800 | <part name="cart" interface="a7800_cart"> |
| 1711 | 1801 | <feature name="pcb_type" value="TYPE-2" /> |
| 1802 | <feature name="slot" value="a78_sg" /> | |
| 1712 | 1803 | <dataarea name="rom" size="131072"> |
| 1713 | 1804 | <rom name="planeteu.bin" size="131072" crc="95dc7e96" sha1="f12cbb576607ec38d6111f4346412ccc5bfbcf42" offset="0" /> |
| 1714 | 1805 | </dataarea> |
| r31766 | r31767 | |
| 1721 | 1812 | <publisher>Tynesoft</publisher> |
| 1722 | 1813 | <part name="cart" interface="a7800_cart"> |
| 1723 | 1814 | <feature name="pcb_type" value="TYPE-6" /> |
| 1815 | <feature name="slot" value="a78_sg_ram" /> | |
| 1724 | 1816 | <dataarea name="rom" size="131072"> |
| 1725 | 1817 | <rom name="plutos.bin" size="131072" crc="2f211f7f" sha1="fa55d6a366b237917f18487fc51817394839a3bc" offset="0" /> |
| 1726 | 1818 | </dataarea> |
| r31766 | r31767 | |
| 1735 | 1827 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1736 | 1828 | <part name="cart" interface="a7800_cart"> |
| 1737 | 1829 | <feature name="pcb_type" value="TYPE-0" /> |
| 1830 | <feature name="slot" value="a78_rom" /> | |
| 1738 | 1831 | <dataarea name="rom" size="32768"> |
| 1739 | 1832 | <rom name="polepos2.bin" size="32768" crc="a85fb962" sha1="ccfa6f3f83ddbed2a2fb32735fea316a718fbaaa" offset="0" /> |
| 1740 | 1833 | </dataarea> |
| r31766 | r31767 | |
| 1749 | 1842 | <sharedfeat name="compatibility" value="PAL"/> |
| 1750 | 1843 | <part name="cart" interface="a7800_cart"> |
| 1751 | 1844 | <feature name="pcb_type" value="TYPE-0" /> |
| 1845 | <feature name="slot" value="a78_rom" /> | |
| 1752 | 1846 | <dataarea name="rom" size="32768"> |
| 1753 | 1847 | <rom name="pleps2eu.bin" size="32768" crc="d751c7a6" sha1="268e53b5b2117bf853e0aae6adb0b2d3aad8ad5c" offset="0" /> |
| 1754 | 1848 | </dataarea> |
| r31766 | r31767 | |
| 1763 | 1857 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1764 | 1858 | <part name="cart" interface="a7800_cart"> |
| 1765 | 1859 | <feature name="pcb_type" value="ACTIVISION" /> |
| 1860 | <feature name="slot" value="a78_act" /> | |
| 1766 | 1861 | <dataarea name="rom" size="131072"> |
| 1767 | 1862 | <rom name="rampage.bin" size="131072" crc="39a316aa" sha1="13745b5eaaab7e2c992f3312285e112cdeb424f6" offset="0" /> |
| 1768 | 1863 | </dataarea> |
| r31766 | r31767 | |
| 1777 | 1872 | <info name="serial" value="CX7892"/> |
| 1778 | 1873 | <part name="cart" interface="a7800_cart"> |
| 1779 | 1874 | <feature name="pcb_type" value="TYPE-2" /> |
| 1875 | <feature name="slot" value="a78_sg" /> | |
| 1780 | 1876 | <dataarea name="rom" size="131072"> |
| 1781 | 1877 | <rom name="rampart.bin" size="131072" crc="e8c2a662" sha1="53516794cb442208af5d54760324c006510553b3" offset="0" /> |
| 1782 | 1878 | </dataarea> |
| r31766 | r31767 | |
| 1792 | 1888 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1793 | 1889 | <part name="cart" interface="a7800_cart"> |
| 1794 | 1890 | <feature name="pcb_type" value="TYPE-6" /> |
| 1891 | <feature name="slot" value="a78_sg_ram" /> | |
| 1795 | 1892 | <dataarea name="rom" size="32768"> |
| 1796 | 1893 | <rom name="rescuefr.bin" size="32768" crc="9a74fbf2" sha1="6653022f38e553d475896a918850158eaf8f77ff" offset="0" /> |
| 1797 | 1894 | </dataarea> |
| r31766 | r31767 | |
| 1806 | 1903 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1807 | 1904 | <part name="cart" interface="a7800_cart"> |
| 1808 | 1905 | <feature name="pcb_type" value="TYPE-0" /> |
| 1906 | <feature name="slot" value="a78_rom" /> | |
| 1809 | 1907 | <dataarea name="rom" size="32768"> |
| 1810 | 1908 | <rom name="robotron.bin" size="32768" crc="cb22305d" sha1="ccc9753cdcbd2a2f8cb7966b8227801ba0bfd41d" offset="0" /> |
| 1811 | 1909 | </dataarea> |
| r31766 | r31767 | |
| 1820 | 1918 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1821 | 1919 | <part name="cart" interface="a7800_cart"> |
| 1822 | 1920 | <feature name="pcb_type" value="TYPE-2" /> |
| 1921 | <feature name="slot" value="a78_sg" /> | |
| 1823 | 1922 | <dataarea name="rom" size="65536"> |
| 1824 | 1923 | <rom name="rsbsebll.bin" size="65536" crc="b1508030" sha1="9a9f60251d049630099f56d2d3efb013828b8a2c" offset="0" /> |
| 1825 | 1924 | </dataarea> |
| r31766 | r31767 | |
| 1833 | 1932 | <info name="developer" value="Matthias Luedtke" /> |
| 1834 | 1933 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1835 | 1934 | <part name="cart" interface="a7800_cart"> |
| 1935 | <feature name="slot" value="a78_rom" /> | |
| 1836 | 1936 | <dataarea name="rom" size="49152"> |
| 1837 | 1937 | <rom name="santa simon.bin" size="49152" crc="30d641ff" sha1="610e08f226c66b15ff699b02c736ce5ce7a8a862" offset="0" /> |
| 1838 | 1938 | </dataarea> |
| r31766 | r31767 | |
| 1847 | 1947 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1848 | 1948 | <part name="cart" interface="a7800_cart"> |
| 1849 | 1949 | <feature name="pcb_type" value="TYPE-2" /> |
| 1950 | <feature name="slot" value="a78_sg" /> | |
| 1850 | 1951 | <dataarea name="rom" size="131072"> |
| 1851 | 1952 | <rom name="scrpyard.bin" size="131072" crc="5cc8c34f" sha1="f2249321d0cc296b9f9e516bbc5ecc9aab56ca22" offset="0" /> |
| 1852 | 1953 | </dataarea> |
| r31766 | r31767 | |
| 1861 | 1962 | <sharedfeat name="compatibility" value="PAL"/> |
| 1862 | 1963 | <part name="cart" interface="a7800_cart"> |
| 1863 | 1964 | <feature name="pcb_type" value="TYPE-2" /> |
| 1965 | <feature name="slot" value="a78_sg" /> | |
| 1864 | 1966 | <dataarea name="rom" size="131072"> |
| 1865 | 1967 | <rom name="scrpyrde.bin" size="131072" crc="46dd9662" sha1="ebfed67cfeebc6a558dbb087e4784e5e5258c2e1" offset="0" /> |
| 1866 | 1968 | </dataarea> |
| r31766 | r31767 | |
| 1903 | 2005 | <publisher>Tynesoft</publisher> |
| 1904 | 2006 | <part name="cart" interface="a7800_cart"> |
| 1905 | 2007 | <feature name="pcb_type" value="TYPE-6" /> |
| 2008 | <feature name="slot" value="a78_sg_ram" /> | |
| 1906 | 2009 | <dataarea name="rom" size="131072"> |
| 1907 | 2010 | <rom name="sirius.bin" size="131072" crc="65ae616e" sha1="cd9f6dea96f102262065d7472e73121b67f9e244" offset="0" /> |
| 1908 | 2011 | </dataarea> |
| r31766 | r31767 | |
| 1915 | 2018 | <publisher>Atari Interactive</publisher> |
| 1916 | 2019 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1917 | 2020 | <part name="cart" interface="a7800_cart"> |
| 2021 | <feature name="slot" value="a78_rom" /> | |
| 1918 | 2022 | <dataarea name="rom" size="32768"> |
| 1919 | 2023 | <rom name="space duel (ntsc).bin" size="32768" crc="ef2d2560" sha1="199d06cf7f54bb0a1fa328d3cff955f4bcf90450" offset="0" /> |
| 1920 | 2024 | </dataarea> |
| r31766 | r31767 | |
| 1928 | 2032 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1929 | 2033 | <sharedfeat name="compatibility" value="PAL"/> |
| 1930 | 2034 | <part name="cart" interface="a7800_cart"> |
| 2035 | <feature name="slot" value="a78_rom" /> | |
| 1931 | 2036 | <dataarea name="rom" size="32768"> |
| 1932 | 2037 | <rom name="space duel (pal).bin" size="32768" crc="0e6a8443" sha1="03d3c7e6255fc6f1b8bbf6dc3ccdbaf51b7eabf7" offset="0" /> |
| 1933 | 2038 | </dataarea> |
| r31766 | r31767 | |
| 1941 | 2046 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1942 | 2047 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1943 | 2048 | <part name="cart" interface="a7800_cart"> |
| 2049 | <feature name="slot" value="a78_rom" /> | |
| 1944 | 2050 | <dataarea name="rom" size="16384"> |
| 1945 | 2051 | <rom name="spaceinvaders (ntsc).bin" size="16384" crc="9c3086eb" sha1="167c06a5d9364f3359bb531d5533f4ff49283d47" offset="0" /> |
| 1946 | 2052 | </dataarea> |
| r31766 | r31767 | |
| 1954 | 2060 | <info name="developer" value="Bob DeCrescenzo" /> |
| 1955 | 2061 | <sharedfeat name="compatibility" value="PAL"/> |
| 1956 | 2062 | <part name="cart" interface="a7800_cart"> |
| 2063 | <feature name="slot" value="a78_rom" /> | |
| 1957 | 2064 | <dataarea name="rom" size="16384"> |
| 1958 | 2065 | <rom name="spaceinvaders (pal).bin" size="16384" crc="90d7aad3" sha1="0b17368b9f3328f41d29ca4f0d04ab25e1aad55e" offset="0" /> |
| 1959 | 2066 | </dataarea> |
| r31766 | r31767 | |
| 1967 | 2074 | <info name="developer" value="Gambler172" /> |
| 1968 | 2075 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1969 | 2076 | <part name="cart" interface="a7800_cart"> |
| 2077 | <feature name="slot" value="a78_rom" /> | |
| 1970 | 2078 | <dataarea name="rom" size="32768"> |
| 1971 | 2079 | <rom name="xev78_signed.bin" size="32768" crc="67c8af57" sha1="f76f2a212747e06ac452da8dbeb0ad093b24d793" offset="0" /> |
| 1972 | 2080 | </dataarea> |
| r31766 | r31767 | |
| 1980 | 2088 | <info name="developer" value="Gambler172" /> |
| 1981 | 2089 | <sharedfeat name="compatibility" value="PAL"/> |
| 1982 | 2090 | <part name="cart" interface="a7800_cart"> |
| 2091 | <feature name="slot" value="a78_rom" /> | |
| 1983 | 2092 | <dataarea name="rom" size="32768"> |
| 1984 | 2093 | <rom name="star wars 7800.bin" size="32768" crc="8678f1c0" sha1="9ac24aa0563be93d72bcf83c52a8acdbbfc63729" offset="0" /> |
| 1985 | 2094 | </dataarea> |
| r31766 | r31767 | |
| 1994 | 2103 | <sharedfeat name="compatibility" value="NTSC"/> |
| 1995 | 2104 | <part name="cart" interface="a7800_cart"> |
| 1996 | 2105 | <feature name="pcb_type" value="TYPE-6" /> |
| 2106 | <feature name="slot" value="a78_sg_ram" /> | |
| 1997 | 2107 | <dataarea name="rom" size="131072"> |
| 1998 | 2108 | <rom name="smmrgame.bin" size="131072" crc="65c6df3f" sha1="31d46b32a2aa8d5bd6028cff1f41037426b22409" offset="0" /> |
| 1999 | 2109 | </dataarea> |
| r31766 | r31767 | |
| 2008 | 2118 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2009 | 2119 | <part name="cart" interface="a7800_cart"> |
| 2010 | 2120 | <feature name="pcb_type" value="TYPE-0" /> |
| 2121 | <feature name="slot" value="a78_rom" /> | |
| 2011 | 2122 | <dataarea name="rom" size="49152"> |
| 2012 | 2123 | <rom name="suprhuey.bin" size="49152" crc="71846500" sha1="29aea9e90c446942001fd08d3c4c929f4ce048d7" offset="0" /> |
| 2013 | 2124 | </dataarea> |
| r31766 | r31767 | |
| 2022 | 2133 | <sharedfeat name="compatibility" value="PAL"/> |
| 2023 | 2134 | <part name="cart" interface="a7800_cart"> |
| 2024 | 2135 | <feature name="pcb_type" value="TYPE-0" /> |
| 2136 | <feature name="slot" value="a78_rom" /> | |
| 2025 | 2137 | <dataarea name="rom" size="49152"> |
| 2026 | 2138 | <rom name="suprhueu.bin" size="49152" crc="6b27ea2c" sha1="469e03ee1e22ef0978c8095a38d662d34a413723" offset="0" /> |
| 2027 | 2139 | </dataarea> |
| r31766 | r31767 | |
| 2036 | 2148 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2037 | 2149 | <part name="cart" interface="a7800_cart"> |
| 2038 | 2150 | <feature name="pcb_type" value="TYPE-0" /> |
| 2151 | <feature name="slot" value="a78_rom" /> | |
| 2039 | 2152 | <dataarea name="rom" size="32768"> |
| 2040 | 2153 | <rom name="sprskate.bin" size="32768" crc="13b68650" sha1="666d9383c112b66026898e6002b803801e269c51" offset="0" /> |
| 2041 | 2154 | </dataarea> |
| r31766 | r31767 | |
| 2050 | 2163 | <sharedfeat name="compatibility" value="PAL"/> |
| 2051 | 2164 | <part name="cart" interface="a7800_cart"> |
| 2052 | 2165 | <feature name="pcb_type" value="TYPE-0" /> |
| 2166 | <feature name="slot" value="a78_rom" /> | |
| 2053 | 2167 | <dataarea name="rom" size="32768"> |
| 2054 | 2168 | <rom name="sprskaeu.bin" size="32768" crc="8f167ba9" sha1="fab349584af7b6b3f9b034af3034f43257e2c25f" offset="0" /> |
| 2055 | 2169 | </dataarea> |
| r31766 | r31767 | |
| 2064 | 2178 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2065 | 2179 | <part name="cart" interface="a7800_cart"> |
| 2066 | 2180 | <feature name="pcb_type" value="TYPE-2" /> |
| 2181 | <feature name="slot" value="a78_sg" /> | |
| 2067 | 2182 | <dataarea name="rom" size="65536"> |
| 2068 | 2183 | <rom name="tankcmnd.bin" size="65536" crc="db91b181" sha1="1d2975d754806416a25a821db6a9fe389bf5d946" offset="0" /> |
| 2069 | 2184 | </dataarea> |
| r31766 | r31767 | |
| 2078 | 2193 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2079 | 2194 | <part name="cart" interface="a7800_cart"> |
| 2080 | 2195 | <feature name="pcb_type" value="TYPE-0" /> |
| 2196 | <feature name="slot" value="a78_rom" /> | |
| 2081 | 2197 | <dataarea name="rom" size="32768"> |
| 2082 | 2198 | <rom name="titlemat.bin" size="32768" crc="bc23c57b" sha1="80d11bcbb953ccd8bf3c3e64162711e7edb95090" offset="0" /> |
| 2083 | 2199 | </dataarea> |
| r31766 | r31767 | |
| 2092 | 2208 | <sharedfeat name="compatibility" value="PAL"/> |
| 2093 | 2209 | <part name="cart" interface="a7800_cart"> |
| 2094 | 2210 | <feature name="pcb_type" value="TYPE-0" /> |
| 2211 | <feature name="slot" value="a78_rom" /> | |
| 2095 | 2212 | <dataarea name="rom" size="32768"> |
| 2096 | 2213 | <rom name="titlemeu.bin" size="32768" crc="16b54d5b" sha1="7ab281c9b69692823b3b6b594856172363c507b5" offset="0" /> |
| 2097 | 2214 | </dataarea> |
| r31766 | r31767 | |
| 2106 | 2223 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2107 | 2224 | <part name="cart" interface="a7800_cart"> |
| 2108 | 2225 | <feature name="pcb_type" value="TYPE-0" /> |
| 2226 | <feature name="slot" value="a78_rom" /> | |
| 2109 | 2227 | <dataarea name="rom" size="32768"> |
| 2110 | 2228 | <rom name="tomcat.bin" size="32768" crc="513cb9ee" sha1="80c615fb60d0004c1accde25e42759572e030928" offset="0" /> |
| 2111 | 2229 | </dataarea> |
| r31766 | r31767 | |
| 2120 | 2238 | <sharedfeat name="compatibility" value="PAL"/> |
| 2121 | 2239 | <part name="cart" interface="a7800_cart"> |
| 2122 | 2240 | <feature name="pcb_type" value="TYPE-0" /> |
| 2241 | <feature name="slot" value="a78_rom" /> | |
| 2123 | 2242 | <dataarea name="rom" size="32768"> |
| 2124 | 2243 | <rom name="tomcateu.bin" size="32768" crc="b01205bf" sha1="825381773593365b5ca7eeca968cca00879eee71" offset="0" /> |
| 2125 | 2244 | </dataarea> |
| r31766 | r31767 | |
| 2133 | 2252 | <info name="serial" value="CX7823"/> |
| 2134 | 2253 | <part name="cart" interface="a7800_cart"> |
| 2135 | 2254 | <feature name="pcb_type" value="TYPE-2" /> |
| 2255 | <feature name="slot" value="a78_sg" /> | |
| 2136 | 2256 | <dataarea name="rom" size="131072"> |
| 2137 | 2257 | <rom name="tchdown.bin" size="131072" crc="aae12695" sha1="364bf0fef8a67f7e66761c76a3a6a0dd186f04aa" offset="0" /> |
| 2138 | 2258 | </dataarea> |
| r31766 | r31767 | |
| 2147 | 2267 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2148 | 2268 | <part name="cart" interface="a7800_cart"> |
| 2149 | 2269 | <feature name="pcb_type" value="TYPE-6" /> |
| 2270 | <feature name="slot" value="a78_sg_ram" /> | |
| 2150 | 2271 | <dataarea name="rom" size="65536"> |
| 2151 | 2272 | <rom name="twrtpllr.bin" size="65536" crc="4407ba04" sha1="53976013986e0ad3694ab9c021420b8172465de7" offset="0" /> |
| 2152 | 2273 | </dataarea> |
| r31766 | r31767 | |
| 2161 | 2282 | <sharedfeat name="compatibility" value="PAL"/> |
| 2162 | 2283 | <part name="cart" interface="a7800_cart"> |
| 2163 | 2284 | <feature name="pcb_type" value="TYPE-6" /> |
| 2285 | <feature name="slot" value="a78_sg_ram" /> | |
| 2164 | 2286 | <dataarea name="rom" size="65536"> |
| 2165 | 2287 | <rom name="twrtpleu.bin" size="65536" crc="0f87fd7b" sha1="56e1b795e80382edb376e4536d1dee539d4ac548" offset="0" /> |
| 2166 | 2288 | </dataarea> |
| r31766 | r31767 | |
| 2174 | 2296 | <info name="developer" value="Mark Ball" /> |
| 2175 | 2297 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2176 | 2298 | <part name="cart" interface="a7800_cart"> |
| 2299 | <feature name="slot" value="a78_rom" /> | |
| 2177 | 2300 | <dataarea name="rom" size="32768"> |
| 2178 | 2301 | <rom name="wasp v1.05.bin" size="32768" crc="ae1117dd" sha1="be65bdc225aca4a8bb9a18653da7de78aaac3f80" offset="0" /> |
| 2179 | 2302 | </dataarea> |
| r31766 | r31767 | |
| 2188 | 2311 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2189 | 2312 | <part name="cart" interface="a7800_cart"> |
| 2190 | 2313 | <feature name="pcb_type" value="TYPE-2" /> |
| 2314 | <feature name="slot" value="a78_sg" /> | |
| 2191 | 2315 | <dataarea name="rom" size="65536"> |
| 2192 | 2316 | <rom name="waterski.bin" size="65536" crc="930b30df" sha1="621c67c2228843405445222743ba3d7c1f04a3c4" offset="0" /> |
| 2193 | 2317 | </dataarea> |
| r31766 | r31767 | |
| 2202 | 2326 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2203 | 2327 | <part name="cart" interface="a7800_cart"> |
| 2204 | 2328 | <feature name="pcb_type" value="TYPE-6" /> |
| 2329 | <feature name="slot" value="a78_sg_ram" /> | |
| 2205 | 2330 | <dataarea name="rom" size="131072"> |
| 2206 | 2331 | <rom name="wntrgame.bin" size="131072" crc="8981b531" sha1="b3725d6f0834c68ac62ce13eb9eb0d01d1124e5e" offset="0" /> |
| 2207 | 2332 | </dataarea> |
| r31766 | r31767 | |
| 2216 | 2341 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2217 | 2342 | <part name="cart" interface="a7800_cart"> |
| 2218 | 2343 | <feature name="pcb_type" value="TYPE-2" /> |
| 2344 | <feature name="slot" value="a78_sg" /> | |
| 2219 | 2345 | <dataarea name="rom" size="131072"> |
| 2220 | 2346 | <rom name="xnophobe.bin" size="131072" crc="5fd9a141" sha1="867adbfd7539ff81e68726ed6f5ff7326409539f" offset="0" /> |
| 2221 | 2347 | </dataarea> |
| r31766 | r31767 | |
| 2230 | 2356 | <sharedfeat name="compatibility" value="PAL"/> |
| 2231 | 2357 | <part name="cart" interface="a7800_cart"> |
| 2232 | 2358 | <feature name="pcb_type" value="TYPE-2" /> |
| 2359 | <feature name="slot" value="a78_sg" /> | |
| 2233 | 2360 | <dataarea name="rom" size="131072"> |
| 2234 | 2361 | <rom name="xnophoeu.bin" size="131072" crc="cf0e44f1" sha1="b2cf7d6164d6e5acd47e9f6d7cf60bb0f775b4a3" offset="0" /> |
| 2235 | 2362 | </dataarea> |
| r31766 | r31767 | |
| 2244 | 2371 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2245 | 2372 | <part name="cart" interface="a7800_cart"> |
| 2246 | 2373 | <feature name="pcb_type" value="TYPE-0" /> |
| 2374 | <feature name="slot" value="a78_rom" /> | |
| 2247 | 2375 | <dataarea name="rom" size="32768"> |
| 2248 | 2376 | <rom name="xevious.bin" size="32768" crc="75fc124f" sha1="1d4f0335b152239553534fcbbacdca273802e3bd" offset="0" /> |
| 2249 | 2377 | </dataarea> |
| r31766 | r31767 | |
| 2258 | 2386 | <sharedfeat name="compatibility" value="PAL"/> |
| 2259 | 2387 | <part name="cart" interface="a7800_cart"> |
| 2260 | 2388 | <feature name="pcb_type" value="TYPE-0" /> |
| 2389 | <feature name="slot" value="a78_rom" /> | |
| 2261 | 2390 | <dataarea name="rom" size="49152"> |
| 2262 | 2391 | <rom name="xevioeu.bin" size="49152" crc="d5ac738b" sha1="81647c8ce432f891328631b57dd3268dd315f8e8" offset="0" /> |
| 2263 | 2392 | </dataarea> |
| 2264 | 2393 | </part> |
| 2265 | 2394 | </software> |
| 2266 | 2395 | |
| 2396 | <!-- Passthrough carts --> | |
| 2397 | ||
| 2398 | <software name="hiscore"> | |
| 2399 | <description>High Score Cartridge</description> | |
| 2400 | <year>198?</year> | |
| 2401 | <publisher>Atari</publisher> | |
| 2402 | <info name="serial" value="CX78HSC"/> | |
| 2403 | <part name="cart" interface="a7800_cart"> | |
| 2404 | <feature name="slot" value="a78_hsc" /> | |
| 2405 | <dataarea name="rom" size="4096"> | |
| 2406 | <rom name="highscre.bin" size="4096" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164" offset="0" /> | |
| 2407 | </dataarea> | |
| 2408 | </part> | |
| 2409 | </software> | |
| 2410 | ||
| 2411 | <!-- Chip adding 128K of RAM + POKEY onboard --> | |
| 2412 | <software name="xboard"> | |
| 2413 | <description>XBoarD Expansion</description> | |
| 2414 | <year>2005</year> | |
| 2415 | <publisher><homebrew></publisher> | |
| 2416 | <part name="cart" interface="a7800_cart"> | |
| 2417 | <feature name="slot" value="a78_xboard" /> | |
| 2418 | <dataarea name="rom" size="1"> | |
| 2419 | <!-- this entry behaves just as passthrough, even if in fact the chips shall be socketed on the PCB! --> | |
| 2420 | </dataarea> | |
| 2421 | </part> | |
| 2422 | </software> | |
| 2423 | ||
| 2424 | <!-- Chip adding 128K of RAM + POKEY+HighScore onboard --> | |
| 2425 | <software name="xm"> | |
| 2426 | <description>XM Expansion Module</description> | |
| 2427 | <year>2015?</year> | |
| 2428 | <publisher><homebrew></publisher> | |
| 2429 | <part name="cart" interface="a7800_cart"> | |
| 2430 | <feature name="slot" value="a78_xm" /> | |
| 2431 | <dataarea name="rom" size="4096"> | |
| 2432 | <rom name="highscre.bin" size="4096" crc="9be408d3" sha1="a3af676991391a6dd716c79022d4947206b78164" offset="0" /> | |
| 2433 | </dataarea> | |
| 2434 | </part> | |
| 2435 | </software> | |
| 2436 | ||
| 2267 | 2437 | <!-- XM board enhanced --> |
| 2268 | 2438 | |
| 2269 | 2439 | <!-- these should require an XM board? but the emulation seems to be built into the base driver?--> |
| r31766 | r31767 | |
| 2272 | 2442 | <software name="dkongxm"> |
| 2273 | 2443 | <description>Donkey Kong (homebrew, XM enhanced, HSC support) (Demo)</description> |
| 2274 | 2444 | <year>2012</year> |
| 2275 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2445 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2276 | 2446 | <sharedfeat name="compatibility" value="PAL"/> |
| 2277 | 2447 | <part name="cart" interface="a7800_cart"> |
| 2278 | 2448 | <feature name="pcb_type" value="TYPE-XM" /> |
| 2449 | <feature name="slot" value="a78_xmc" /> | |
| 2279 | 2450 | <dataarea name="rom" size="0x24000"> |
| 2280 | 2451 | <rom name="dkxm_final_demo_pal_hsc.a78" size="0x24000" crc="6510b674" sha1="65b723b470d287af51e9888813149c43fb11ac26" offset="0" /> |
| 2281 | 2452 | </dataarea> |
| r31766 | r31767 | |
| 2285 | 2456 | <software name="dkongxmu" cloneof="dkongxm" > |
| 2286 | 2457 | <description>Donkey Kong (homebrew, XM enhanced, HSC support) (Demo) (NTSC)</description> |
| 2287 | 2458 | <year>2012</year> |
| 2288 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2459 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2289 | 2460 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2290 | 2461 | <part name="cart" interface="a7800_cart"> |
| 2291 | 2462 | <feature name="pcb_type" value="TYPE-XM" /> |
| 2463 | <feature name="slot" value="a78_xmc" /> | |
| 2292 | 2464 | <dataarea name="rom" size="0x24000"> |
| 2293 | 2465 | <rom name="dkxm_final_demo_ntsc_hsc.a78" size="0x24000" crc="2c67fea7" sha1="7825c1946e3c7492fa9bbfae33029cd68c0d1135" offset="0" /> |
| 2294 | 2466 | </dataarea> |
| r31766 | r31767 | |
| 2298 | 2470 | <software name="dkongxmn" cloneof="dkongxm"> |
| 2299 | 2471 | <description>Donkey Kong (homebrew, XM enhanced) (Demo)</description> |
| 2300 | 2472 | <year>2012</year> |
| 2301 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2473 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2302 | 2474 | <sharedfeat name="compatibility" value="PAL"/> |
| 2303 | 2475 | <part name="cart" interface="a7800_cart"> |
| 2304 | 2476 | <feature name="pcb_type" value="TYPE-XM" /> |
| 2477 | <feature name="slot" value="a78_xmc" /> | |
| 2305 | 2478 | <dataarea name="rom" size="0x24000"> |
| 2306 | 2479 | <rom name="dkxm_final_demo_pal.a78" size="0x24000" crc="d362712e" sha1="118c462d6698bd23c378785f80062fdd7d65ca00" offset="0" /> |
| 2307 | 2480 | </dataarea> |
| r31766 | r31767 | |
| 2311 | 2484 | <software name="dkongxmnu" cloneof="dkongxm" > |
| 2312 | 2485 | <description>Donkey Kong (homebrew, XM enhanced) (Demo) (NTSC)</description> |
| 2313 | 2486 | <year>2012</year> |
| 2314 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2487 | <publisher><homebrew></publisher> <!-- TEP392 --> | |
| 2315 | 2488 | <sharedfeat name="compatibility" value="NTSC"/> |
| 2316 | 2489 | <part name="cart" interface="a7800_cart"> |
| 2317 | 2490 | <feature name="pcb_type" value="TYPE-XM" /> |
| 2491 | <feature name="slot" value="a78_xmc" /> | |
| 2318 | 2492 | <dataarea name="rom" size="0x24000"> |
| 2319 | 2493 | <rom name="dkxm_final_demo_ntsc.a78" size="0x24000" crc="6e170055" sha1="f4da231312da06ff9e8af5681b5013b14886b455" offset="0" /> |
| 2320 | 2494 | </dataarea> |
| Previous | 199869 Revisions | Next |