1 // license:BSD-3-Clause
2 // copyright-holders:Pierpaolo Prazzoli
3 /*
4 
5 Trivia Quest
6 Sunn/Techstar 1984
7 
8 CPU: 6809
9 Three SY6522 - for flashing lighted buttons?
10 
11 Sound: Two AY-3-8910
12 
13 Forty eight! MK4027 4K Rams
14 
15 Six 6116 Rams with battery backup
16 
17 Two Crystals:
18 11.6688 Mhz
19 6 Mhz
20 
21 Two 8 position DIPS
22 
23 rom3 through rom7 - Main pcb PRG.
24 
25 roma through romi - Sub pcb Questions.
26 
27 The main pcb had empty sockets for
28 rom0, rom1 and rom2.
29 This pcb has been tested and works
30 as is.
31 
32  driver by Pierpaolo Prazzoli
33 
34 Notes:
35 - Hardware is similar to the one in gameplan.cpp
36 
37 */
38 
39 #include "emu.h"
40 #include "includes/gameplan.h"
41 
42 #include "cpu/m6809/m6809.h"
43 #include "machine/6522via.h"
44 #include "machine/nvram.h"
45 #include "sound/ay8910.h"
46 #include "speaker.h"
47 
48 
trvquest_question_r(offs_t offset)49 uint8_t gameplan_state::trvquest_question_r(offs_t offset)
50 {
51 	return memregion("questions")->base()[*m_trvquest_question * 0x2000 + offset];
52 }
53 
WRITE_LINE_MEMBER(gameplan_state::trvquest_coin_w)54 WRITE_LINE_MEMBER(gameplan_state::trvquest_coin_w)
55 {
56 	machine().bookkeeping().coin_counter_w(0, ~state & 1);
57 }
58 
WRITE_LINE_MEMBER(gameplan_state::trvquest_misc_w)59 WRITE_LINE_MEMBER(gameplan_state::trvquest_misc_w)
60 {
61 	// data & 1 -> led on/off ?
62 }
63 
cpu_map(address_map & map)64 void gameplan_state::cpu_map(address_map &map)
65 {
66 	map(0x0000, 0x1fff).ram().share("nvram"); // cmos ram
67 	map(0x2000, 0x27ff).ram(); // main ram
68 	map(0x3800, 0x380f).m(m_via_1, FUNC(via6522_device::map));
69 	map(0x3810, 0x381f).m(m_via_2, FUNC(via6522_device::map));
70 	map(0x3820, 0x382f).m(m_via_0, FUNC(via6522_device::map));
71 	map(0x3830, 0x3831).w("ay1", FUNC(ay8910_device::address_data_w));
72 	map(0x3840, 0x3841).w("ay2", FUNC(ay8910_device::address_data_w));
73 	map(0x3850, 0x3850).nopr(); //watchdog_reset_r ?
74 	map(0x8000, 0x9fff).r(FUNC(gameplan_state::trvquest_question_r));
75 	map(0xa000, 0xa000).writeonly().share("trvquest_q");
76 	map(0xa000, 0xa000).nopr(); // bogus read from the game code when reads question roms
77 	map(0xb000, 0xffff).rom();
78 }
79 
80 static INPUT_PORTS_START( trvquest )
81 	PORT_START("IN0")
82 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
83 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
84 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Reset")
85 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_IMPULSE(1)
86 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
87 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
88 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )
89 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_UNKNOWN )
90 
91 	PORT_START("IN1")
92 	PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_UNKNOWN )
93 	PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
94 	PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNKNOWN )
95 	PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNKNOWN )
96 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_BUTTON4 )
97 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_BUTTON3 )
98 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_BUTTON2 )
99 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_BUTTON1 )
100 
101 	PORT_START("UNK")
DEF_STR(Unknown)102 	PORT_DIPNAME( 0x01, 0x01, DEF_STR( Unknown ) )
103 	PORT_DIPSETTING(    0x01, DEF_STR( Off ) )
104 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
105 	PORT_DIPNAME( 0x02, 0x02, DEF_STR( Unknown ) )
106 	PORT_DIPSETTING(    0x02, DEF_STR( Off ) )
107 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
108 	PORT_DIPNAME( 0x04, 0x04, DEF_STR( Unknown ) )
109 	PORT_DIPSETTING(    0x04, DEF_STR( Off ) )
110 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
111 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
112 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
113 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
114 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
115 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
116 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
117 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
118 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
119 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
120 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
121 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
122 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
123 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
124 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
125 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
126 
127 	PORT_START("DSW")
128 	PORT_DIPNAME( 0x07, 0x01, DEF_STR( Coinage ) )
129 	PORT_DIPSETTING(    0x06, DEF_STR( 4C_1C ) )
130 	PORT_DIPSETTING(    0x05, DEF_STR( 3C_1C ) )
131 	PORT_DIPSETTING(    0x04, DEF_STR( 2C_1C ) )
132 	PORT_DIPSETTING(    0x01, DEF_STR( 1C_1C ) )
133 	PORT_DIPSETTING(    0x02, DEF_STR( 1C_2C ) )
134 	PORT_DIPSETTING(    0x03, DEF_STR( 1C_3C ) )
135 //  PORT_DIPSETTING(    0x07, DEF_STR( Free_Play ) )
136 	PORT_DIPSETTING(    0x00, DEF_STR( Free_Play ) )
137 	PORT_DIPNAME( 0x08, 0x08, DEF_STR( Unknown ) )
138 	PORT_DIPSETTING(    0x08, DEF_STR( Off ) )
139 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
140 	PORT_DIPNAME( 0x10, 0x10, DEF_STR( Unknown ) )
141 	PORT_DIPSETTING(    0x10, DEF_STR( Off ) )
142 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
143 	PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) )
144 	PORT_DIPSETTING(    0x20, DEF_STR( Off ) )
145 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
146 	PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) )
147 	PORT_DIPSETTING(    0x40, DEF_STR( Off ) )
148 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
149 	PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) )
150 	PORT_DIPSETTING(    0x80, DEF_STR( Off ) )
151 	PORT_DIPSETTING(    0x00, DEF_STR( On ) )
152 INPUT_PORTS_END
153 
154 
155 MACHINE_START_MEMBER(gameplan_state,trvquest)
156 {
157 	/* register for save states */
158 	save_item(NAME(m_video_x));
159 	save_item(NAME(m_video_y));
160 	save_item(NAME(m_video_command));
161 	save_item(NAME(m_video_data));
162 
163 	/* this is needed for trivia quest */
164 	m_via_0->write_pb5(1);
165 }
166 
MACHINE_RESET_MEMBER(gameplan_state,trvquest)167 MACHINE_RESET_MEMBER(gameplan_state,trvquest)
168 {
169 	m_video_x = 0;
170 	m_video_y = 0;
171 	m_video_command = 0;
172 	m_video_data = 0;
173 }
174 
trvquest(machine_config & config)175 void gameplan_state::trvquest(machine_config &config)
176 {
177 	M6809(config, m_maincpu, XTAL(6'000'000)/4);
178 	m_maincpu->set_addrmap(AS_PROGRAM, &gameplan_state::cpu_map);
179 
180 	NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1);
181 
182 	MCFG_MACHINE_START_OVERRIDE(gameplan_state,trvquest)
183 	MCFG_MACHINE_RESET_OVERRIDE(gameplan_state,trvquest)
184 
185 	/* video hardware */
186 	trvquest_video(config);
187 
188 	/* sound hardware */
189 	SPEAKER(config, "mono").front_center();
190 
191 	AY8910(config, "ay1", XTAL(6'000'000)/2).add_route(ALL_OUTPUTS, "mono", 0.25);
192 	AY8910(config, "ay2", XTAL(6'000'000)/2).add_route(ALL_OUTPUTS, "mono", 0.25);
193 
194 	/* via */
195 	VIA6522(config, m_via_0, XTAL(6'000'000)/4);
196 	m_via_0->writepa_handler().set(FUNC(gameplan_state::video_data_w));
197 	m_via_0->writepb_handler().set(FUNC(gameplan_state::gameplan_video_command_w));
198 	m_via_0->ca2_handler().set(FUNC(gameplan_state::video_command_trigger_w));
199 
200 	VIA6522(config, m_via_1, XTAL(6'000'000)/4);
201 	m_via_1->readpa_handler().set_ioport("IN0");
202 	m_via_1->readpb_handler().set_ioport("IN1");
203 	m_via_1->ca2_handler().set(FUNC(gameplan_state::trvquest_coin_w));
204 
205 	VIA6522(config, m_via_2, XTAL(6'000'000)/4);
206 	m_via_2->readpa_handler().set_ioport("UNK");
207 	m_via_2->readpb_handler().set_ioport("DSW");
208 	m_via_2->ca2_handler().set(FUNC(gameplan_state::trvquest_misc_w));
209 	m_via_2->irq_handler().set(FUNC(gameplan_state::via_irq));
210 }
211 
212 ROM_START( trvquest )
213 	ROM_REGION( 0x10000, "maincpu", 0 )
214 	ROM_LOAD( "rom3", 0xb000, 0x1000, CRC(2ff7f370) SHA1(66f40426ed02ee44235e17a49d9054ede42b83b9) )
215 	ROM_LOAD( "rom4", 0xc000, 0x1000, CRC(b1adebcb) SHA1(661cabc92b1defce5c2edb8e873a80d5032084d0) )
216 	ROM_LOAD( "rom5", 0xd000, 0x1000, CRC(2fc10a15) SHA1(8ecce32a5a167056c8fb48554a8907ae6299921e) )
217 	ROM_LOAD( "rom6", 0xe000, 0x1000, CRC(fabf4846) SHA1(862cac32de78f2ff4afef398b864d5533d302a4f) )
218 	ROM_LOAD( "rom7", 0xf000, 0x1000, CRC(a9f56551) SHA1(fb6fc3b17a6e66571a5ba837befbfac1ac26cc39) )
219 
220 	ROM_REGION( 0x18000, "questions", ROMREGION_ERASEFF ) /* Question roms */
221 	/* 0x00000 - 0x07fff empty */
222 	ROM_LOAD( "romi", 0x06000, 0x2000, CRC(c8368f69) SHA1(c1dfb701482c5ae922df0a93665a519995a2f4f1) )
223 	ROM_LOAD( "romh", 0x08000, 0x2000, CRC(f3aa8a08) SHA1(2bf8f878cc1df84806a6fb8e7be2656c422d61b9) )
224 	ROM_LOAD( "romg", 0x0a000, 0x2000, CRC(f85f8e48) SHA1(38c9142181a8ee5c0bc80cf2a06d4137fcb2a8b9) )
225 	ROM_LOAD( "romf", 0x0c000, 0x2000, CRC(2bffdcab) SHA1(96bd9aede5a76f9ddcf29e8df2c632075d21b8f6) )
226 	ROM_LOAD( "rome", 0x0e000, 0x2000, CRC(3ff66402) SHA1(da13fe6b99d7517ad2ecd0e42d0c306d4e49563a) )
227 	ROM_LOAD( "romd", 0x10000, 0x2000, CRC(4e21653f) SHA1(719a8dda9b81963a6b6d7d3e4966ecde676b9ecf) )
228 	ROM_LOAD( "romc", 0x12000, 0x2000, CRC(081a5322) SHA1(09e7ea5f1ee1dc35ec00bcea1550c6fe0bbdf60d) )
229 	ROM_LOAD( "romb", 0x14000, 0x2000, CRC(819ab451) SHA1(78c181eae63d55d1d0643bb7be07ca3cdbe14285) )
230 	ROM_LOAD( "roma", 0x16000, 0x2000, CRC(b4bcaf33) SHA1(c6b08fb8d55b2834d0c6c5baff9f544c795e4c15) )
231 ROM_END
232 
233 GAME( 1984, trvquest, 0, trvquest, trvquest, gameplan_state, empty_init, ROT90, "Sunn / Techstar", "Trivia Quest", MACHINE_SUPPORTS_SAVE )
234