Skip to content

Commit 1c5e5b9

Browse files
committed
coleco/cartridge: Add support for 'Activision' type cartridges
Software list items promoted to working (coleco_homebrew.xml) ------------------------------------------------------------- The Black Onyx Boxxle Space Shuttle: A Journey Into Space (64k)
1 parent 54b0519 commit 1c5e5b9

File tree

16 files changed

+269
-34
lines changed

16 files changed

+269
-34
lines changed

Diff for: hash/coleco_homebrew.xml

+6-6
Original file line numberDiff line numberDiff line change
@@ -136,12 +136,12 @@ Unoffical software releases for the Coleco Colecovision
136136
</part>
137137
</software>
138138

139-
<!-- Needs 'Activison PCB' emulation with EEPROM -->
140-
<software name="blackonx" supported="no">
139+
<software name="blackonx">
141140
<description>The Black Onyx</description>
142141
<year>2013</year>
143142
<publisher>Team Pixelboy</publisher>
144143
<part name="cart" interface="coleco_cart">
144+
<feature name="slot" value="activision_256b" />
145145
<dataarea name="rom" size="65536">
146146
<rom name="black-onyx-the-2013.rom" size="65536" crc="dddd1396" sha1="9bc148c38bd94ba52efa335a08f5c2660b5dbf32" />
147147
</dataarea>
@@ -171,12 +171,12 @@ Unoffical software releases for the Coleco Colecovision
171171
</part>
172172
</software>
173173

174-
<!-- Needs 'Activison PCB' emulation with EEPROM -->
175-
<software name="boxxle" supported="no">
174+
<software name="boxxle">
176175
<description>Boxxle</description>
177176
<year>2015</year>
178177
<publisher>Team Pixelboy</publisher>
179178
<part name="cart" interface="coleco_cart">
179+
<feature name="slot" value="activision_32k" />
180180
<dataarea name="rom" size="65536">
181181
<rom name="boxxle-2015.rom" size="65536" crc="62dacf07" sha1="98dc774cb4e954a026a298d2cb91d662f0f484cd" />
182182
</dataarea>
@@ -1362,13 +1362,13 @@ Unoffical software releases for the Coleco Colecovision
13621362
</part>
13631363
</software>
13641364

1365-
<software name="spacesha" supported="no">
1365+
<software name="spacesha">
13661366
<description>Space Shuttle: A Journey Into Space (64k)</description>
13671367
<year>2022</year>
13681368
<publisher>Team Pixelboy</publisher>
13691369
<info name="usage" value="req. Super Game Module" />
13701370
<part name="cart" interface="coleco_cart">
1371-
<feature name="slot" value="megacart" />
1371+
<feature name="slot" value="activision" />
13721372
<dataarea name="rom" size="65536">
13731373
<rom name="space-shuttle-a-journey-into-space-2022.rom" size="65536" crc="bb0f6678" sha1="6365c5f36052202954161007932d328db2d4bb8b" />
13741374
</dataarea>

Diff for: scripts/src/bus.lua

+2
Original file line numberDiff line numberDiff line change
@@ -1180,6 +1180,8 @@ if (BUSES["COLECO_CART"]~=null) then
11801180
files {
11811181
MAME_DIR .. "src/devices/bus/coleco/cartridge/exp.cpp",
11821182
MAME_DIR .. "src/devices/bus/coleco/cartridge/exp.h",
1183+
MAME_DIR .. "src/devices/bus/coleco/cartridge/activision.cpp",
1184+
MAME_DIR .. "src/devices/bus/coleco/cartridge/activision.h",
11831185
MAME_DIR .. "src/devices/bus/coleco/cartridge/megacart.cpp",
11841186
MAME_DIR .. "src/devices/bus/coleco/cartridge/megacart.h",
11851187
MAME_DIR .. "src/devices/bus/coleco/cartridge/std.cpp",

Diff for: src/devices/bus/coleco/cartridge/activision.cpp

+132
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
// license: BSD-3-Clause
2+
// copyright-holders: Dirk Best
3+
/**********************************************************************
4+
5+
ColecoVision 'Activision' cartridge emulation
6+
7+
**********************************************************************/
8+
9+
#include "emu.h"
10+
#include "activision.h"
11+
12+
13+
//**************************************************************************
14+
// TYPE DEFINITIONS
15+
//**************************************************************************
16+
17+
DEFINE_DEVICE_TYPE(COLECOVISION_ACTIVISION, colecovision_activision_cartridge_device, "coleco_activision", "ColecoVision Activision Cartridge")
18+
DEFINE_DEVICE_TYPE(COLECOVISION_ACTIVISION_256B, colecovision_activision_256b_cartridge_device, "coleco_activision_256b", "ColecoVision Activision Cartridge (256B EEPROM)")
19+
DEFINE_DEVICE_TYPE(COLECOVISION_ACTIVISION_32K, colecovision_activision_32k_cartridge_device, "coleco_activision_32k", "ColecoVision Activision Cartridge (32K EEPROM)")
20+
21+
colecovision_activision_cartridge_device::colecovision_activision_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
22+
device_t(mconfig, COLECOVISION_ACTIVISION, tag, owner, clock),
23+
device_colecovision_cartridge_interface(mconfig, *this),
24+
m_eeprom(*this, "eeprom"),
25+
m_active_bank(0)
26+
{
27+
}
28+
29+
colecovision_activision_cartridge_device::colecovision_activision_cartridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
30+
device_t(mconfig, type, tag, owner, clock),
31+
device_colecovision_cartridge_interface(mconfig, *this),
32+
m_eeprom(*this, "eeprom"),
33+
m_active_bank(0)
34+
{
35+
}
36+
37+
colecovision_activision_256b_cartridge_device::colecovision_activision_256b_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
38+
colecovision_activision_cartridge_device(mconfig, COLECOVISION_ACTIVISION_256B, tag, owner, clock)
39+
{
40+
}
41+
42+
colecovision_activision_32k_cartridge_device::colecovision_activision_32k_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
43+
colecovision_activision_cartridge_device(mconfig, COLECOVISION_ACTIVISION_32K, tag, owner, clock)
44+
{
45+
}
46+
47+
48+
//**************************************************************************
49+
// MACHINE DEFINITIONS
50+
//**************************************************************************
51+
52+
void colecovision_activision_256b_cartridge_device::device_add_mconfig(machine_config &config)
53+
{
54+
I2C_24C02(config, m_eeprom, 0);
55+
}
56+
57+
void colecovision_activision_32k_cartridge_device::device_add_mconfig(machine_config &config)
58+
{
59+
I2C_24C256(config, m_eeprom, 0);
60+
}
61+
62+
63+
//**************************************************************************
64+
// MACHINE EMULATION
65+
//**************************************************************************
66+
67+
void colecovision_activision_cartridge_device::device_start()
68+
{
69+
// register for save states
70+
save_item(NAME(m_active_bank));
71+
}
72+
73+
uint8_t colecovision_activision_cartridge_device::read(offs_t offset, int _8000, int _a000, int _c000, int _e000)
74+
{
75+
uint8_t data = 0xff;
76+
77+
if (!_8000 || !_a000 || !_c000 || !_e000)
78+
{
79+
if (offset < 0x4000)
80+
{
81+
// fixed first rom bank
82+
data = m_rom[offset];
83+
}
84+
else if (offset == 0x7f80)
85+
{
86+
// eeprom data
87+
if (m_eeprom.found())
88+
data = m_eeprom->read_sda();
89+
else
90+
data = 0xff;
91+
}
92+
else if (offset > 0x7f80)
93+
{
94+
// "dead" area
95+
data = 0xff;
96+
}
97+
else
98+
{
99+
// bankswitched rom
100+
data = m_rom[(m_active_bank << 14) | (offset & 0x3fff)];
101+
}
102+
}
103+
104+
return data;
105+
}
106+
107+
void colecovision_activision_cartridge_device::write(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
108+
{
109+
switch (offset)
110+
{
111+
// bankswitch
112+
case 0x7f90:
113+
case 0x7fa0:
114+
case 0x7fb0:
115+
m_active_bank = (offset >> 4) & 0x03;
116+
break;
117+
118+
// eeprom scl
119+
case 0x7fc0:
120+
case 0x7fd0:
121+
if (m_eeprom.found())
122+
m_eeprom->write_scl(BIT(offset, 4));
123+
break;
124+
125+
// eeprom sda
126+
case 0x7fe0:
127+
case 0x7ff0:
128+
if (m_eeprom.found())
129+
m_eeprom->write_sda(BIT(offset, 4));
130+
break;
131+
}
132+
}

Diff for: src/devices/bus/coleco/cartridge/activision.h

+65
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
// license: BSD-3-Clause
2+
// copyright-holders: Dirk Best
3+
/**********************************************************************
4+
5+
ColecoVision 'Activision' cartridge emulation
6+
7+
**********************************************************************/
8+
9+
#ifndef MAME_BUS_COLECO_CARTRIDGE_ACTIVISION_H
10+
#define MAME_BUS_COLECO_CARTRIDGE_ACTIVISION_H
11+
12+
#pragma once
13+
14+
#include "exp.h"
15+
#include "machine/i2cmem.h"
16+
17+
18+
//**************************************************************************
19+
// TYPE DEFINITIONS
20+
//**************************************************************************
21+
22+
class colecovision_activision_cartridge_device : public device_t, public device_colecovision_cartridge_interface
23+
{
24+
public:
25+
colecovision_activision_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
26+
27+
protected:
28+
colecovision_activision_cartridge_device(const machine_config &mconfig, device_type type, const char* tag, device_t* owner, uint32_t clock);
29+
30+
optional_device<i2cmem_device> m_eeprom;
31+
32+
virtual void device_start() override;
33+
34+
// cartridge interface
35+
virtual uint8_t read(offs_t offset, int _8000, int _a000, int _c000, int _e000) override;
36+
virtual void write(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
37+
38+
private:
39+
uint8_t m_active_bank;
40+
};
41+
42+
class colecovision_activision_256b_cartridge_device : public colecovision_activision_cartridge_device
43+
{
44+
public:
45+
colecovision_activision_256b_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
46+
47+
protected:
48+
virtual void device_add_mconfig(machine_config &config) override;
49+
};
50+
51+
class colecovision_activision_32k_cartridge_device : public colecovision_activision_cartridge_device
52+
{
53+
public:
54+
colecovision_activision_32k_cartridge_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
55+
56+
protected:
57+
virtual void device_add_mconfig(machine_config &config) override;
58+
};
59+
60+
// device type declaration
61+
DECLARE_DEVICE_TYPE(COLECOVISION_ACTIVISION, colecovision_activision_cartridge_device)
62+
DECLARE_DEVICE_TYPE(COLECOVISION_ACTIVISION_256B, colecovision_activision_256b_cartridge_device)
63+
DECLARE_DEVICE_TYPE(COLECOVISION_ACTIVISION_32K, colecovision_activision_32k_cartridge_device)
64+
65+
#endif // MAME_BUS_COLECO_CARTRIDGE_ACTIVISION_H

Diff for: src/devices/bus/coleco/cartridge/exp.cpp

+20-4
Original file line numberDiff line numberDiff line change
@@ -121,30 +121,46 @@ std::string colecovision_cartridge_slot_device::get_default_card_software(get_de
121121

122122

123123
//-------------------------------------------------
124-
// bd_r - cartridge data read
124+
// read - cartridge data read
125125
//-------------------------------------------------
126126

127-
128-
uint8_t colecovision_cartridge_slot_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
127+
uint8_t colecovision_cartridge_slot_device::read(offs_t offset, int _8000, int _a000, int _c000, int _e000)
129128
{
129+
uint8_t data = 0xff;
130+
130131
if (m_card)
131-
data = m_card->bd_r(offset , data, _8000, _a000, _c000, _e000);
132+
data = m_card->read(offset, _8000, _a000, _c000, _e000);
132133

133134
return data;
134135
}
135136

136137

138+
//-------------------------------------------------
139+
// write - cartridge data write
140+
//-------------------------------------------------
141+
142+
void colecovision_cartridge_slot_device::write(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
143+
{
144+
if (m_card)
145+
m_card->write(offset, data, _8000, _a000, _c000, _e000);
146+
}
147+
148+
137149
//-------------------------------------------------
138150
// SLOT_INTERFACE( colecovision_cartridges )
139151
//-------------------------------------------------
140152

153+
#include "activision.h"
141154
#include "megacart.h"
142155
#include "std.h"
143156
#include "xin1.h"
144157

145158
void colecovision_cartridges(device_slot_interface &device)
146159
{
147160
// the following need ROMs from the software list
161+
device.option_add_internal("activision", COLECOVISION_ACTIVISION);
162+
device.option_add_internal("activision_256b", COLECOVISION_ACTIVISION_256B);
163+
device.option_add_internal("activision_32k", COLECOVISION_ACTIVISION_32K);
148164
device.option_add_internal("megacart", COLECOVISION_MEGACART);
149165
device.option_add_internal("standard", COLECOVISION_STANDARD);
150166
device.option_add_internal("xin1", COLECOVISION_XIN1);

Diff for: src/devices/bus/coleco/cartridge/exp.h

+4-2
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,8 @@ class colecovision_cartridge_slot_device : public device_t,
6565
colecovision_cartridge_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
6666

6767
// computer interface
68-
uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000);
68+
uint8_t read(offs_t offset, int _8000, int _a000, int _c000, int _e000);
69+
void write(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000);
6970

7071
protected:
7172
// device_t implementation
@@ -92,7 +93,8 @@ class device_colecovision_cartridge_interface : public device_interface
9293
friend class colecovision_cartridge_slot_device;
9394

9495
public:
95-
virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) { return 0xff; }
96+
virtual uint8_t read(offs_t offset, int _8000, int _a000, int _c000, int _e000) { return 0xff; }
97+
virtual void write(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) { }
9698

9799
void rom_alloc(size_t size);
98100

Diff for: src/devices/bus/coleco/cartridge/megacart.cpp

+4-2
Original file line numberDiff line numberDiff line change
@@ -62,15 +62,17 @@ void colecovision_megacart_cartridge_device::device_reset()
6262
// read - cartridge data read
6363
//-------------------------------------------------
6464

65-
uint8_t colecovision_megacart_cartridge_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
65+
uint8_t colecovision_megacart_cartridge_device::read(offs_t offset, int _8000, int _a000, int _c000, int _e000)
6666
{
67+
uint8_t data = 0xff;
68+
6769
if (!_8000 || !_a000 || !_c000 || !_e000)
6870
{
6971
if (m_bankcount > 2)
7072
{
7173
// offset as passed to us is a delta from address 0x8000.
7274

73-
if (offset >= 0x7FC0)
75+
if (offset >= 0x7fc0)
7476
{
7577
// Reads within the final 64 bytes select which megacart bank is active.
7678
m_activebank = offset & (m_bankcount - 1);

Diff for: src/devices/bus/coleco/cartridge/megacart.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class colecovision_megacart_cartridge_device : public device_t,
3434
virtual void device_reset() override;
3535

3636
// device_colecovision_cartridge_interface overrides
37-
virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
37+
virtual uint8_t read(offs_t offset, int _8000, int _a000, int _c000, int _e000) override;
3838

3939
private:
4040
uint32_t m_bankcount;

Diff for: src/devices/bus/coleco/cartridge/std.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@ void colecovision_standard_cartridge_device::device_start()
4747
// read - cartridge data read
4848
//-------------------------------------------------
4949

50-
uint8_t colecovision_standard_cartridge_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
50+
uint8_t colecovision_standard_cartridge_device::read(offs_t offset, int _8000, int _a000, int _c000, int _e000)
5151
{
52+
uint8_t data = 0xff;
53+
5254
if (!_8000 || !_a000 || !_c000 || !_e000)
5355
{
5456
if (offset < m_rom_size)
5557
data = m_rom[offset];
56-
else
57-
data = 0xff;
5858
}
5959

6060
return data;

Diff for: src/devices/bus/coleco/cartridge/std.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class colecovision_standard_cartridge_device : public device_t,
3333
virtual void device_start() override;
3434

3535
// device_colecovision_expansion_card_interface overrides
36-
virtual uint8_t bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000) override;
36+
virtual uint8_t read(offs_t offset, int _8000, int _a000, int _c000, int _e000) override;
3737
};
3838

3939

Diff for: src/devices/bus/coleco/cartridge/xin1.cpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,10 @@ void colecovision_xin1_cartridge_device::device_reset()
5959
// read - cartridge data read
6060
//-------------------------------------------------
6161

62-
uint8_t colecovision_xin1_cartridge_device::bd_r(offs_t offset, uint8_t data, int _8000, int _a000, int _c000, int _e000)
62+
uint8_t colecovision_xin1_cartridge_device::read(offs_t offset, int _8000, int _a000, int _c000, int _e000)
6363
{
64+
uint8_t data = 0xff;
65+
6466
if (!_8000 || !_a000 || !_c000 || !_e000)
6567
{
6668
data = m_rom[m_current_offset + offset];

0 commit comments

Comments
 (0)