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