1 // license:BSD-3-Clause
2 // copyright-holders:David Haywood
3 /* Bellfruit SWP (Skill With Prizes) Video hardware
4     aka Cobra 3
5 
6 */
7 
8 /* Radio Times readme #1
9 ---------------------------------------------
10 
11 Music TR9C1710 (Video RAMDAC)
12 
13 Part number :   STV8438CV
14  Manufacture :  ST Microelectronics
15 Specification(s)
16  Description :   8-Bit Triple DAC with Analog Switch
17  Package :   PQFP44
18 
19 MC68340 : Integrated Processor with DMA
20  The MC68340 is a high-performance 32-bit integrated processor with direct memory access (DMA), combining an enhanced M68000-compatible processor, 32-bit DMA, and other peripheral subsystems on a single integrated circuit. The MC68340 CPU32 delivers 32-bit CISC processor performance from a lower cost 16-bit memory system. The combination of peripherals offered in the MC68340 can be found in a diverse range of microprocessor-based systems. Systems requiring very high-speed block transfers of data can benefit from the MC68340.
21 
22 
23  Block Diagram
24 
25 
26 MC68340 Features
27 CPU32 Core
28 Two-Channel DMA Controller
29 DUART Compatible with 68681
30 Two 16-Bit Timer/Counters
31 Four Chip Selects
32 System Integration
33 32 Address Lines, 16 Data Lines
34 Low Power Management
35 4.8 MIPS @ 25 MHz
36 Available in 16 and 25 MHz
37 Available in 3.3 and 5V
38 
39 
40 l5380 -scsi controller
41 
42 ymz280b - in MAME - sound chip
43 
44 audio board
45 
46 75585116 - PALCE 16V8H
47 75585118 - PALCE 16V8H
48 
49 TI introduce the TMS320AV110 MPEG audio decoder based on TI's 16 bits
50 DSPs (about $14).
51 
52 roms
53 
54 game 95 400 009 type swp left ver. radt 1.1 - ST 27C4001
55 game 95 400 010 type swp right ver. radt 1.1 - ST 27C4001
56 95 004 056 sound left - ST 27C4001
57 95 004 057 sound right - AM 27C040
58 
59 cd
60 
61 version 95-100-302
62 */
63 
64 /* Radio Times readme #2
65 ---------------------------------------------
66 
67 Board
68 Difficult to make things out on this one, but the SCSI socket is clear to see - this is where the CDROM drive hooks in
69 
70 CPU
71 Again, a 68k processor
72 
73 DSP - Cobra 3
74 
75 Just a board to decode the audio from the CD video. no ROM's feed it.
76 
77 GLUE - No idea
78 
79 Just some logic to sync audio with video with realtime graphics? - Clearly something is needed, as three separate boards are used to process this.
80 
81 Music - video RAMDAC - have nothing extra to add, this clearly plays the video portion.
82 
83 SCSI controller - just like in any PC
84 
85 Sound
86 
87 All related to the Yamaha YMZ280B-F, a very good music/PCM chip, probably not used to full potential here.
88 
89 CD-ROM - I'm prepared to put money on Telly Addicts and TOTP being like this, with some minor alterations.
90 
91 Ordinary ISO standard CDROM with 2048 byte sectors. Can be read on a PC to give MPEG-1 video files (.mpg) at 352x288 pixel resolution, which would probably expand to full screen - some have their own soundtracks, others subtitles. The frame rate of the video is 25fps, and the audio (where available) is 44KHz Stereo, 128Kbps MPEG Layer II (Which is not supported by Sellenoff's Capcom sound driver). Some graphics are stored encoded as .gfx files, whereas clip list data is either stored as an .stl file (listing 'number of clips' and clip name) or in .clp files (same, but larger - different round?)
92 
93 Final.lis is a list of the questions asked in the end game, where players are asked to match the programme to the channel it is broadcasted on (Very easy to decode, listed in numerical order of channel as channel (space) programme name (not alphabetical, but accessed at random - end marker is blank line, Channel '5' is radio, since there was no Five TV in those days.) (Why am I telling you this - it's practically an emptier.)
94 
95 Questions are listed by clip, in .QQQ files, encrypted.
96 
97 .SEQ files are 'sequences' instructions to the video board, in the form of renamed .MPG files, again 352x288, MPEG-1.
98 
99 TEST.TXT - suggests the content of a prototype version, which was expanded to make this. If the volume name is to be believed I may be related to the person who compiled this (though it's a big clan, highly unlikely ;))
100 
101 */
102 
103 
104 #include "emu.h"
105 #include "machine/68340.h"
106 #include "sound/ymz280b.h"
107 #include "screen.h"
108 #include "speaker.h"
109 
110 class bfm_swp_state : public driver_device
111 {
112 public:
bfm_swp_state(const machine_config & mconfig,device_type type,const char * tag)113 	bfm_swp_state(const machine_config &mconfig, device_type type, const char *tag)
114 		: driver_device(mconfig, type, tag),
115 			m_maincpu(*this, "maincpu")
116 	{ }
117 
118 	uint32_t* m_cpuregion;
119 	std::unique_ptr<uint32_t[]> m_mainram;
120 
121 	uint32_t bfm_swp_mem_r(offs_t offset, uint32_t mem_mask = ~0);
122 	void bfm_swp_mem_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
123 
124 
screen_update(screen_device & screen,bitmap_rgb32 & bitmap,const rectangle & cliprect)125 	uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
126 	{
127 		return 0;
128 	}
129 
130 	void bfm_swp(machine_config &config);
131 	void bfm_swp_map(address_map &map);
132 protected:
133 
134 	// devices
135 	required_device<m68340_cpu_device> m_maincpu;
136 
137 	virtual void machine_start() override;
138 };
139 
bfm_swp_mem_r(offs_t offset,uint32_t mem_mask)140 uint32_t bfm_swp_state::bfm_swp_mem_r(offs_t offset, uint32_t mem_mask)
141 {
142 	int pc = m_maincpu->pc();
143 	int cs = m_maincpu->get_cs(offset * 4);
144 
145 	switch ( cs )
146 	{
147 		case 1:
148 			if (offset<0x100000/4) return m_cpuregion[offset];
149 
150 		case 2:
151 			offset&=0x3fff;
152 			return m_mainram[offset];
153 
154 		default:
155 			logerror("%08x maincpu read access offset %08x mem_mask %08x cs %d\n", pc, offset*4, mem_mask, cs);
156 
157 	}
158 
159 	return 0x0000;
160 }
161 
bfm_swp_mem_w(offs_t offset,uint32_t data,uint32_t mem_mask)162 void bfm_swp_state::bfm_swp_mem_w(offs_t offset, uint32_t data, uint32_t mem_mask)
163 {
164 	int pc = m_maincpu->pc();
165 	int cs = m_maincpu->get_cs(offset * 4);
166 
167 	switch ( cs )
168 	{
169 		default:
170 			logerror("%08x maincpu write access offset %08x data %08x mem_mask %08x cs %d\n", pc, offset*4, data, mem_mask, cs);
171 
172 		case 2:
173 			offset&=0x3fff;
174 			COMBINE_DATA(&m_mainram[offset]);
175 			break;
176 
177 
178 	}
179 
180 }
181 
182 
183 
184 
bfm_swp_map(address_map & map)185 void bfm_swp_state::bfm_swp_map(address_map &map)
186 {
187 	map(0x00000000, 0xffffffff).rw(FUNC(bfm_swp_state::bfm_swp_mem_r), FUNC(bfm_swp_state::bfm_swp_mem_w));
188 	map(0x00000000, 0x000fffff).rom();
189 }
190 
191 
INPUT_PORTS_START(bfm_swp)192 static INPUT_PORTS_START( bfm_swp )
193 INPUT_PORTS_END
194 
195 
196 void bfm_swp_state::machine_start()
197 {
198 	m_cpuregion = (uint32_t*)memregion( "maincpu" )->base();
199 	m_mainram = make_unique_clear<uint32_t[]>(0x10000);
200 
201 }
202 
203 
bfm_swp(machine_config & config)204 void bfm_swp_state::bfm_swp(machine_config &config)
205 {
206 	/* basic machine hardware */
207 	M68340(config, m_maincpu, 16000000);
208 	m_maincpu->set_addrmap(AS_PROGRAM, &bfm_swp_state::bfm_swp_map);
209 
210 
211 	screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
212 	screen.set_refresh_hz(60);
213 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
214 	screen.set_screen_update(FUNC(bfm_swp_state::screen_update));
215 	screen.set_size(64*8, 64*8);
216 	screen.set_visarea(0*8, 32*8-1, 0*8, 32*8-1);
217 
218 	SPEAKER(config, "mono").front_center();
219 
220 	YMZ280B(config, "ymz", 10000000).add_route(ALL_OUTPUTS, "mono", 1.0);
221 }
222 
223 ROM_START( c3_rtime )
224 	ROM_REGION( 0x100000, "maincpu", 0 )
225 	ROM_LOAD16_BYTE( "95400009.bin", 0x00001, 0x080000, CRC(a5e0a5ca) SHA1(e7063ddfb436152f15267fde2aa7695c8a262191) )
226 	ROM_LOAD16_BYTE( "95400010.bin", 0x00000, 0x080000, CRC(03fd5f72) SHA1(379cfc4ef5087f24989bc1f2246b6056e33fd472) )
227 
228 	ROM_REGION( 0x100000, "altrevs", 0 )
229 	ROM_LOAD16_BYTE( "95400063.lhs", 0x00001, 0x080000, CRC(eecb5f3b) SHA1(a1c6ad61a65c5361c38aaae2a064983a978c45ea) )
230 	ROM_LOAD16_BYTE( "95400064.rhs", 0x00000, 0x080000, CRC(251689f5) SHA1(4589a409c6b0f2869f99a08df8d76223e54d5b3c) )
231 	ROM_LOAD16_BYTE( "95401063.lhs", 0x00001, 0x080000, CRC(ea98c159) SHA1(6f665d80b71af57b31194fdc981707822e62053e) )
232 	ROM_LOAD16_BYTE( "95401064.rhs", 0x00000, 0x080000, CRC(bc125897) SHA1(a83fdb54349d3ea5d183754bf4b9fee1f0b73be3) )
233 	ROM_LOAD16_BYTE( "radtimes.lhs", 0x00001, 0x080000, CRC(c6574297) SHA1(bd9744c4b08f9ae35fe1523ebcd68c52a36a32e0) )
234 	ROM_LOAD16_BYTE( "radtimes.rhs", 0x00000, 0x080000, CRC(ed2c24f0) SHA1(5f06b2de7e2b2dccee7763ea0938849d67256ff2) )
235 	ROM_LOAD16_BYTE( "rt017.lhs", 0x00001, 0x080000, CRC(d2272c39) SHA1(f583fe39c153dca2e86e875ca39056a8756e0d2c) )
236 	ROM_LOAD16_BYTE( "rt018.rhs", 0x00000, 0x080000, CRC(52999d03) SHA1(21d1e9034a26f6f73109e9e83272dcff104993e5) )
237 	ROM_LOAD16_BYTE( "rtimesp1", 0x00001, 0x080000, CRC(f856d377) SHA1(a9fac7e2188bbd087f70c1c00cbf790bc52d573b) )
238 	ROM_LOAD16_BYTE( "rtimesp2", 0x00000, 0x080000, CRC(130d0864) SHA1(034d6c4fdec3acd4329d16315aeac43b1f1a5e91) )
239 
240 	ROM_REGION( 0x1000000, "ymz280b", 0 )
241 	ROM_LOAD( "95004056.bin", 0x000000, 0x080000, CRC(24e8f9fb) SHA1(0d484a8f368b0f2140f148a1dc84db85a100af38) )
242 	ROM_LOAD( "95004057.bin", 0x080000, 0x080000, CRC(f73c92d6) SHA1(08c7db2baccb703f99efb81f618719a7789ca564) )
243 
244 	DISK_REGION( "scsi" ) // CDROM
245 	DISK_IMAGE_READONLY( "rtimes", 0, SHA1(20accfe236a0c85108cd2a205399ed8959f1a638) )
246 ROM_END
247 
248 ROM_START( c3_telly )
249 	ROM_REGION( 0x100000, "maincpu", 0 )
250 	ROM_LOAD16_BYTE( "95401023.lhs", 0x00001, 0x080000, CRC(85b95b56) SHA1(106e617fc92f95a6b3769db1fd4e5ab47c752c08) )
251 	ROM_LOAD16_BYTE( "95401024.rhs", 0x00000, 0x080000, CRC(835d25fd) SHA1(6d780332f6016d6e1404922e0ac439a499211be3) )
252 
253 	ROM_REGION( 0x100000, "altrevs", 0 )
254 	ROM_LOAD16_BYTE( "95400021.p1",  0x00001, 0x080000, CRC(5c969746) SHA1(7458c613d7a3e7cf6a21e55f74dcdc052404f29c) )
255 	ROM_LOAD16_BYTE( "95400022.p2",  0x00000, 0x080000, CRC(fa1fdb7b) SHA1(eff87c197a62dba49d95810e8669026db2edb187) )
256 	ROM_LOAD16_BYTE( "95400023.lhs", 0x00001, 0x080000, CRC(b79279b8) SHA1(010edf0c299b0b01ab43f52dce540ff0847fb4c5) )
257 	ROM_LOAD16_BYTE( "95400024.rhs", 0x00000, 0x080000, CRC(835d25fd) SHA1(6d780332f6016d6e1404922e0ac439a499211be3) )
258 	ROM_LOAD16_BYTE( "95401021.p1",  0x00001, 0x080000, CRC(24a334d3) SHA1(672f16cbd2ddf627213de71024b6fbaa28f526a5) )
259 	ROM_LOAD16_BYTE( "95401022.p2",  0x00000, 0x080000, CRC(90af3767) SHA1(e529ad7eef5e6d2a6951d46e77aaad2087890445) )
260 	ROM_LOAD16_BYTE( "tadd13lh",     0x00001, 0x080000, CRC(2d6ed08c) SHA1(efa39b9ff5605c2e29971fb5e874c9a0c178b1f0) )
261 	ROM_LOAD16_BYTE( "tadd14rh",     0x00000, 0x080000, CRC(26dd6ed6) SHA1(553f29017494b6f7ecc98940d527f498316ea55e) )
262 	ROM_LOAD16_BYTE( "telad.tl",     0x00001, 0x080000, CRC(e6906027) SHA1(20ca64417ea3795dc26adfea717cb3d724019c34) )
263 	ROM_LOAD16_BYTE( "telad.tr",     0x00000, 0x080000, CRC(38dbee05) SHA1(ee33cdaa7f817beb49a3cff49a5493a50d8d4504) )
264 	ROM_LOAD16_BYTE( "tasndl",       0x00001, 0x080000, CRC(3f0b9d2b) SHA1(6db3451c26a3e673204c316403e0bb7127191a1f) )
265 	ROM_LOAD16_BYTE( "tasndr",       0x00000, 0x080000, CRC(2dd9ebcf) SHA1(4d118d37e18266f82fb2acb37f5fd106e0f25a1f) )
266 
267 	ROM_REGION( 0x1000000, "ymz280b", ROMREGION_ERASE00 )
268 	ROM_LOAD( "telsndl", 0x0000, 0x080000, CRC(74996fbd) SHA1(90e46130dccf47be1fcfaf549e548cdd4883e59d) )
269 
270 	DISK_REGION( "scsi" ) // HDD
271 	DISK_IMAGE_READONLY( "telly", 0, SHA1(6675b8ed6ea47bfb89fbd10a2740e1e0a3faec54) )
272 ROM_END
273 
274 ROM_START( c3_totp )
275 	ROM_REGION( 0x100000, "maincpu", 0 )
276 	ROM_LOAD16_BYTE( "95400101.lo", 0x00001, 0x080000, CRC(c95164c7) SHA1(7b2fada6a3208666219a53cba08f7acad015763d) )
277 	ROM_LOAD16_BYTE( "95400102.hi", 0x00000, 0x080000, CRC(5ebba159) SHA1(34bcf48140261cd87d81a32581e965d722f42f71) )
278 
279 	ROM_REGION( 0x100000, "altrevs", 0 )
280 	ROM_LOAD16_BYTE( "95401101.lo", 0x00001, 0x080000, CRC(97d2d90a) SHA1(d4a2afd3cc551986e76f107beb66e8c660a6ee1d) )
281 	ROM_LOAD16_BYTE( "95401102.hi", 0x00000, 0x080000, CRC(3599427f) SHA1(16d915553b2b490a047888c64ebcf952714b3168) )
282 
283 	ROM_REGION( 0x1000000, "ymz280b", ROMREGION_ERASE00 )
284 	ROM_LOAD( "totpsnd.lhs", 0x000000, 0x080000, CRC(56a73136) SHA1(10656ede18de9432a8a728cc59d000b5b1bf0150) )
285 	ROM_LOAD( "totpsnd.rhs", 0x080000, 0x080000, CRC(28d156ab) SHA1(ebf5c4e008015b9b56b3aa5228c05b8e298daa80) )
286 
287 	DISK_REGION( "scsi" ) // uses a CD, only one we've seen has been damaged to a point where not all data could be read tho
288 	DISK_IMAGE_READONLY( "cd", 0, NO_DUMP )
289 ROM_END
290 
291 ROM_START( c3_ppays )
292 	ROM_REGION( 0x100000, "maincpu", 0 )
293 	ROM_LOAD16_BYTE( "95400687.hi", 0x00000, 0x080000, CRC(56080e1c) SHA1(49391059b5a758690d4972abad04d7e7aef23423) )
294 	ROM_LOAD16_BYTE( "95400687.lo", 0x00001, 0x080000, CRC(8b2c9c3d) SHA1(921c900447870f6ae51a4f3baeb60ce94e732291) )
295 
296 	ROM_REGION( 0x1000000, "ymz280b", ROMREGION_ERASE00 )
297 	ROM_LOAD( "phrasesn.l", 0x0000, 0x080000, CRC(a436ccf8) SHA1(18c39aa2e68c32242e0de1347b25d4af44b84548) )
298 
299 	DISK_REGION( "scsi" ) // CD or HDD
300 	DISK_IMAGE_READONLY( "cd or hdd", 0, NO_DUMP )
301 ROM_END
302 
303 
304 
305 
306 GAME( 199?, c3_rtime, 0, bfm_swp, bfm_swp, bfm_swp_state, empty_init, ROT0, "BFM", "Radio Times (Bellfruit) (Cobra 3)", MACHINE_IS_SKELETON )
307 GAME( 199?, c3_telly, 0, bfm_swp, bfm_swp, bfm_swp_state, empty_init, ROT0, "BFM", "Telly Addicts (Bellfruit) (Cobra 3)", MACHINE_IS_SKELETON )
308 GAME( 199?, c3_totp,  0, bfm_swp, bfm_swp, bfm_swp_state, empty_init, ROT0, "BFM", "Top of the Pops (Bellfruit) (Cobra 3?)", MACHINE_IS_SKELETON )
309 GAME( 199?, c3_ppays, 0, bfm_swp, bfm_swp, bfm_swp_state, empty_init, ROT0, "BFM", "The Phrase That Pays (Bellfruit) (Cobra 3?)", MACHINE_IS_SKELETON )
310