summaryrefslogtreecommitdiffstatshomepage
path: root/hash/microvision.xml
blob: 314b2cc99d8fa9509df5ef165c8955071a230675 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
<?xml version="1.0"?>
<!DOCTYPE softwarelist SYSTEM "softwarelist.dtd">
<softwarelist name="microvision" description="Milton Bradley MicroVision cartridges">
<!--
The following board types are known to exist:
4952 REV-A - used for tms1100 games, 2 varations exist, one with and one without paddle circuitry
4952-79 REV-B - used for tms1100 games, 2 variations exists, one with and one without paddle circuitry
4971-REV-C - used for i8021 based game(s). Found in Connect Four
7924952D02 - used for shrink DIP version of the tms1100. Found in Super Blockbuster

The "pcb" feature is used to indicate the board type
The "paddle" feature is used to indicate whether there is paddle circuitry on the board
The "rc" feature is used to indicate the source of the clock signal
-->


	<software name="alienrdr">
		<description>Alien Raiders</description>
		<year>1981</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="M34009" />
		<part name="cart" interface="microvision_cart">
			<feature name="pla" value="1" />
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="yes" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="m34009-n1" size="2048" crc="b1632712" sha1="515040a3bf6386590c025e12a9512c98efdd7e1e" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="baseball">
		<description>Baseball</description>
		<year>1980</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3479" />
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="yes" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3479-n1nll_4063" size="2048" crc="40e3327a" sha1="c1b52a081c7fe6a51c5cfe41a4d446f1f8cfe24e" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="blckbstr">
		<description>Blockbuster</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3450A" />
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952 REV-A" />
			<feature name="paddle" value="yes" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3450a" size="2048" crc="fd18ea6d" sha1="30203278d7f2b0817e59bdf7e451be2d64a90f5a" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="bowling">
		<description>Bowling</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3475" />
		<part name="cart" interface="microvision_cart">
			<!-- also seen with 4952 REV-A -->
			<feature name="pla" value="1" />
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3475nll_4972" size="2048" crc="460ac30e" sha1="93ffb75b82d1f48f451e0e1158d5a8d1cd465fe5" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="connect4">
		<description>Connect Four (8021)</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3481" />
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4971-REV-C" />
			<feature name="paddle" value="yes" />
			<dataarea name="rom" size="1024">
				<!-- 8021 on cart has no label -->
				<rom name="connect4.bin" size="1024" crc="bdd8660b" sha1="971f9117dc809f7b9796134208b47ea34990ae71" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="connect4t" cloneof="connect4">
		<description>Connect Four (TMS1100)</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3481" />
		<part name="cart" interface="microvision_cart">
			<feature name="pla" value="1" />  <!-- correct? -->
			<feature name="pcb" value="4952-79 REV-B" />  <!-- correct? -->
			<feature name="paddle" value="yes" />
			<dataarea name="rom" size="2048">
				<rom name="connect4t.bin" size="2048" crc="6a4cf60b" sha1="e93d848784205ab49234ad26718e04d267b776ed" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="cosmichu">
		<description>Cosmic hunter</description>
		<year>1981</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="M34017" />
		<part name="cart" interface="microvision_cart">
			<feature name="pla" value="1" />
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="m34017-n1" size="2048" crc="d8ba1377" sha1="a8dabd296aefc46849db2b7d2d8e0de7c77b5b38" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="mindbstr">
		<description>Mindbuster</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3457" />
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952 REV-A" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/21.0K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3457nll_4976" size="2048" crc="d5dc1f7d" sha1="9e53bd7e9b718ced3bffbdd50cf9ea1547183ea3" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="phsrstrk">
		<description>Star Trek Phaser Strike</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3454" />
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/21.0K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3454" size="2048" crc="c7768d04" sha1="e477d49fc835649164cff5ed158ee31dcf244efc" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="pinball">
		<description>Pinball</description>
		<year>1980</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3455" />
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="yes" />
			<feature name="rc" value="100pf/21.0K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3455nll_4974" size="2048" crc="906544ea" sha1="7ba8460369e1bb0708b0ef076342774059fd03d2" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="seaduel">
		<description>Sea Duel</description>
		<year>1980</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3496" />
		<part name="cart" interface="microvision_cart">
			<feature name="pla" value="1" />
			<feature name="pcb" value="4952-79 REV-B" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/39.4K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3496-n1_4064" size="2048" crc="77a8f71b" sha1="1f95ecf3b1ec6a17db92e1ae903be269aa0b47d8" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="sprblock">
		<description>Super Blockbuster</description>
		<year>1982</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="M34047" />
		<part name="cart" interface="microvision_cart">
			<feature name="pla" value="1" />
			<feature name="pcb" value="7924952D02" />
			<feature name="paddle" value="yes" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="m34047-n2ll_4241" size="2048" crc="796660e3" sha1="1b758369849cc7dea3918774244f747895607377" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="vegasslt">
		<description>Vegas Slots</description>
		<year>1979</year>
		<publisher>Milton Bradley</publisher>
		<info name="serial" value="MP3474" />
		<part name="cart" interface="microvision_cart">
			<feature name="pla" value="1" />
			<feature name="pcb" value="4952 REV-A" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="mp3474nll_4975" size="2048" crc="4500c1d9" sha1="d49522dbe265e71b86488b5533d01bc9050811c9" offset="0" />
			</dataarea>
		</part>
	</software>

<!-- Homebrew -->

	<software name="bomber">
		<description>Bomber</description>
		<year>2014</year>
		<publisher>Paul Robson</publisher>
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952 REV-A" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="bomber.bin" size="2048" crc="badbd0f8" sha1="3c31c24b58b1d6ac1c7313b690ec796cc5010cb7" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="demo">
		<description>Demo</description>
		<year>2013</year>
		<publisher>Paul Robson</publisher>
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952 REV-A" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="demo.bin" size="2048" crc="54f1b288" sha1="9fcd930dff5f09979d3ed1278a928330b7000068" offset="0" />
			</dataarea>
		</part>
	</software>

	<software name="invaders">
		<description>Invaders</description>
		<year>2014</year>
		<publisher>Paul Robson</publisher>
		<part name="cart" interface="microvision_cart">
			<feature name="pcb" value="4952 REV-A" />
			<feature name="paddle" value="no" />
			<feature name="rc" value="100pf/23.2K" />
			<dataarea name="rom" size="2048">
				<rom name="invaders.bin" size="2048" crc="d520ff6e" sha1="c979d7004fc205ee050045f13e2d6f2c31e2083e" offset="0" />
			</dataarea>
		</part>
	</software>

</softwarelist>
>, 0); m_i2cmem->write_sda(m_i2c_mem); } } } // same as NBAJAMTE above... derived class? READ16_MEMBER(md_eeprom_cslam_device::read) { if (offset == 0x200000/2) { // m_i2c_mem = m_i2cmem->read_sda(); return m_i2cmem->read_sda(); } if (offset < 0x400000/2) return m_rom[MD_ADDR(offset)]; else return 0xffff; } WRITE16_MEMBER(md_eeprom_cslam_device::write) { if (offset == 0x200000/2) { if(ACCESSING_BITS_8_15) { m_i2c_clk = BIT(data, 8); m_i2cmem->write_scl(m_i2c_clk); } if(ACCESSING_BITS_0_7) { m_i2c_mem = BIT(data, 0); m_i2cmem->write_sda(m_i2c_mem); } } } // same as NBAJAMTE above... derived class? READ16_MEMBER(md_eeprom_nflqb_device::read) { if (offset == 0x200000/2) { // m_i2c_mem = i2cmem_sda_read(m_i2cmem); return m_i2cmem->read_sda(); } if (offset < 0x400000/2) return m_rom[MD_ADDR(offset)]; else return 0xffff; } WRITE16_MEMBER(md_eeprom_nflqb_device::write) { if (offset == 0x200000/2) { m_i2c_clk = BIT(data, 8); m_i2c_mem = BIT(data, 0); m_i2cmem->write_scl(m_i2c_clk); m_i2cmem->write_sda(m_i2c_mem); } } READ16_MEMBER(md_eeprom_nhlpa_device::read) { if (offset == 0x200000/2) { // m_i2c_mem = m_i2cmem->read_sda(); return (m_i2cmem->read_sda() & 1) << 7; } if (offset < 0x400000/2) return m_rom[MD_ADDR(offset)]; else return 0xffff; } WRITE16_MEMBER(md_eeprom_nhlpa_device::write) { if (offset == 0x200000/2) { m_i2c_clk = BIT(data, 6); m_i2c_mem = BIT(data, 7); m_i2cmem->write_scl(m_i2c_clk); m_i2cmem->write_sda(m_i2c_mem); } } READ16_MEMBER(md_eeprom_blara_device::read) { if (offset == 0x380000/2) { // m_i2c_mem = m_i2cmem->read_sda(); return (m_i2cmem->read_sda() & 1) << 7; } if (offset < 0x400000/2) return m_rom[MD_ADDR(offset)]; else return 0xffff; } WRITE16_MEMBER(md_eeprom_blara_device::write) { if (offset == 0x380000/2) { m_i2c_clk = BIT(data, 9); m_i2c_mem = BIT(data, 8); m_i2cmem->write_scl(m_i2c_clk); m_i2cmem->write_sda(m_i2c_mem); } } // TEMPORARY ADDITION UNTIL WE FIND OUT WHAT IS MISSING IN THE CORE X24C02 CODE // THIS IS A CUSTOM I2C EEPROM EMULATION THAT ALLOWS NBA JAM TO WORK const device_type MD_EEPROM_NBAJAM_ALT = &device_creator<md_eeprom_nbajam_device_alt>; md_eeprom_nbajam_device_alt::md_eeprom_nbajam_device_alt(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) : md_std_eeprom_device(mconfig, MD_EEPROM_NBAJAM_ALT, "MD NBA Jam (Alt)", tag, owner, clock, "md_eeprom_nbajama", __FILE__) { } void md_eeprom_nbajam_device_alt::device_start() { eeprom_i2c_init(); } void md_eeprom_nbajam_device_alt::eeprom_i2c_init() { m_eeprom_cnt = 0; m_eeprom_readwrite = 0; m_eeprom_slave_mask = 0; m_eeprom_word_address = 0; m_eeprom_devsel = 0; m_eeprom_byte = 0; m_eeprom_sda = m_eeprom_prev_sda = 1; m_eeprom_scl = m_eeprom_prev_scl = 1; m_eeprom_cur_state = STATE_I2C_IDLE; m_eeprom_mask = 0xff; m_eeprom_pagewrite_mask = 0x03; } // this is analogous to i2cmem.cpp implementation of write_sda void md_eeprom_nbajam_device_alt::idle_devsel_check() { if (m_eeprom_scl) { // All commands are preceded by the start condition, which is a HIGH to LOW // transition of SDA when SCL is HIGH if (m_eeprom_prev_sda && !m_eeprom_sda) { m_eeprom_cnt = 0; m_eeprom_slave_mask = 0; m_eeprom_cur_state = STATE_I2C_DEVSEL; } // All communications must be terminated by a stop condition, which is a LOW to HIGH // transition of SDA when SCL is HIGH else if (!m_eeprom_prev_sda && m_eeprom_sda) { m_eeprom_cur_state = STATE_I2C_IDLE; } } } void md_eeprom_nbajam_device_alt::eeprom_i2c_update(void) { switch (m_eeprom_cur_state) { case STATE_I2C_IDLE: idle_devsel_check(); break; case STATE_I2C_WAIT_STOP: if (!m_eeprom_prev_sda && m_eeprom_sda && m_eeprom_scl) m_eeprom_cur_state = STATE_I2C_IDLE; break; // device select: there can be up to 8 EEPROM in series, so that we start with writing 3 bits // to identify which device has to be accessed, followed by a Read/Write bit to specify the action case STATE_I2C_DEVSEL: idle_devsel_check(); // LOW to HIGH transition of SCL = prepare to transmit, by moving to cnt = 1 if (!m_eeprom_prev_scl && m_eeprom_scl) { if (m_eeprom_cnt <= 4) { // here we would transmit the Device Type Identifier which is 0101 for X24C02 // but apparently the game does not check it, so let's skip it } else if ((m_eeprom_cnt > 4) && (m_eeprom_cnt < 8)) { // here store the 3 bits of DEVICE ADDRESS m_eeprom_devsel = ((m_eeprom_devsel << 1) | m_eeprom_sda) & 0xff; } else if (m_eeprom_cnt == 8) m_eeprom_readwrite = m_eeprom_sda; } // HIGH to LOW transition of SCL = a new bit has been put on SDA line and we can read it // provided we already got the LOW to HIGH transition above if (m_eeprom_prev_scl && !m_eeprom_scl) { if (m_eeprom_cnt < 9) m_eeprom_cnt++; else { // ACK m_eeprom_cnt = 1; m_eeprom_cur_state = m_eeprom_readwrite ? STATE_I2C_READ_DATA : STATE_I2C_GET_WORD_ADDR; } } break; // read operation = count 8 operations and at 9th check whether ACK has been issued case STATE_I2C_READ_DATA: idle_devsel_check(); // HIGH to LOW transition of SCL if (m_eeprom_prev_scl && !m_eeprom_scl) { if (m_eeprom_cnt < 9) m_eeprom_cnt++; else m_eeprom_cnt = 1; } // LOW to HIGH transition of SCL if (!m_eeprom_prev_scl && m_eeprom_scl) { if (m_eeprom_cnt == 9) { // no ACK if (m_eeprom_sda) m_eeprom_cur_state = STATE_I2C_WAIT_STOP; } } break; // For a write operation, the x24c02 requires a second address field. This address field is the // word address, comprised of eight bits, providing access to any one of the 256 words of memory. case STATE_I2C_GET_WORD_ADDR: idle_devsel_check(); // HIGH to LOW transition of SCL if (m_eeprom_prev_scl && !m_eeprom_scl) { if (m_eeprom_cnt < 9) m_eeprom_cnt++; else { // ACK m_eeprom_cnt = 1; m_eeprom_cur_state = STATE_I2C_WRITE_DATA; m_eeprom_byte = 0; m_eeprom_word_address &= m_eeprom_mask; } } // LOW to HIGH transition of SCL if (!m_eeprom_prev_scl && m_eeprom_scl) { if (m_eeprom_cnt < 9) m_eeprom_word_address = ((m_eeprom_word_address << 1) | m_eeprom_sda) & 0xff; } break; // write operation case STATE_I2C_WRITE_DATA: idle_devsel_check(); // HIGH to LOW transition of SCL if (m_eeprom_prev_scl && !m_eeprom_scl) { if (m_eeprom_cnt < 9) m_eeprom_cnt++; else m_eeprom_cnt = 1; } // LOW to HIGH transition of SCL if (!m_eeprom_prev_scl && m_eeprom_scl) { if (m_eeprom_cnt < 9) m_eeprom_byte = ((m_eeprom_byte << 1) | m_eeprom_sda) & 0xff; else { UINT8 *nvram = (UINT8 *)&m_nvram[0]; UINT16 sram_address = m_eeprom_slave_mask | (m_eeprom_devsel * 0x100) | m_eeprom_word_address; nvram[sram_address & 0xffff] = m_eeprom_byte; m_eeprom_byte = 0; //printf("Write EEPROM : status %d addr %x data %x (count 8)\n", m_eeprom_cur_state, sram_address, nvram[sram_address]); // WORD ADDRESS++ m_eeprom_word_address = (m_eeprom_word_address & ~m_eeprom_pagewrite_mask) | ((m_eeprom_word_address + 1) & m_eeprom_pagewrite_mask); } } break; } m_eeprom_prev_scl = m_eeprom_scl; m_eeprom_prev_sda = m_eeprom_sda; //printf("Write line : status %d SDA %x SCL %x (count %d)\n", m_eeprom_cur_state, m_eeprom_sda, m_eeprom_scl, m_eeprom_cnt); } UINT8 md_eeprom_nbajam_device_alt::eeprom_i2c_out() { UINT8 res = m_eeprom_sda; switch (m_eeprom_cur_state) { case STATE_I2C_READ_DATA: if (m_eeprom_cnt < 9) { UINT8 *nvram = (UINT8 *)&m_nvram[0]; UINT16 sram_address = m_eeprom_slave_mask | (m_eeprom_devsel * 0x100) | m_eeprom_word_address; sram_address &= 0xffff; res = (nvram[sram_address] >> (8 - m_eeprom_cnt)) & 1; if (m_eeprom_cnt == 8) { //printf("Read EEPROM : status %d addr %x data %x (count 8)\n", m_eeprom_cur_state, sram_address, nvram[sram_address]); // WORD ADDRESS++ m_eeprom_word_address++; m_eeprom_word_address &= m_eeprom_mask; } } break; case STATE_I2C_DEVSEL: case STATE_I2C_GET_WORD_ADDR: case STATE_I2C_WRITE_DATA: if (m_eeprom_cnt == 9) res = 0; break; default: break; } //printf("Read line : status %d data %x (count %d)\n", m_eeprom_cur_state, res, m_eeprom_cnt); return res; } READ16_MEMBER(md_eeprom_nbajam_device_alt::read) { if (offset == 0x200000/2) { return eeprom_i2c_out() << 1; } if (offset < 0x400000/2) return m_rom[MD_ADDR(offset)]; else return 0xffff; } WRITE16_MEMBER(md_eeprom_nbajam_device_alt::write) { if (offset == 0x200000/2) { m_eeprom_sda = BIT(data, 0); m_eeprom_scl = BIT(data, 1); eeprom_i2c_update(); } }