1 // license:BSD-3-Clause
2 // copyright-holders:Dan Boris
3 /*************************************************************************
4 
5     Driver for the Entex Adventure Vision
6 
7 **************************************************************************/
8 
9 /*
10 
11     TODO:
12 
13     - convert to discrete sound
14     - screen pincushion distortion
15 
16 */
17 
18 #include "emu.h"
19 #include "includes/advision.h"
20 
21 #include "screen.h"
22 #include "softlist.h"
23 #include "speaker.h"
24 
25 
26 /* Memory Maps */
27 
rom_r(offs_t offset)28 uint8_t advision_state::rom_r(offs_t offset)
29 {
30 	offset += 0x400;
31 	return m_cart->read_rom(offset & 0xfff);
32 }
33 
program_map(address_map & map)34 void advision_state::program_map(address_map &map)
35 {
36 	map(0x0000, 0x03ff).bankr("bank1");
37 	map(0x0400, 0x0fff).r(FUNC(advision_state::rom_r));
38 }
39 
io_map(address_map & map)40 void advision_state::io_map(address_map &map)
41 {
42 	map(0x00, 0xff).rw(FUNC(advision_state::ext_ram_r), FUNC(advision_state::ext_ram_w));
43 }
44 
45 /* Input Ports */
46 
47 static INPUT_PORTS_START( advision )
48 	PORT_START("joystick")
49 	PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_BUTTON4 )       PORT_PLAYER(1)
50 	PORT_BIT( 0x02, IP_ACTIVE_HIGH, IPT_BUTTON3 )       PORT_PLAYER(1)
51 	PORT_BIT( 0x04, IP_ACTIVE_HIGH, IPT_BUTTON2 )       PORT_PLAYER(1)
52 	PORT_BIT( 0x08, IP_ACTIVE_HIGH, IPT_BUTTON1 )       PORT_PLAYER(1)
53 	PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_JOYSTICK_DOWN )  PORT_PLAYER(1) PORT_8WAY
54 	PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_JOYSTICK_UP )    PORT_PLAYER(1) PORT_8WAY
55 	PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_JOYSTICK_RIGHT ) PORT_PLAYER(1) PORT_8WAY
56 	PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_JOYSTICK_LEFT )  PORT_PLAYER(1) PORT_8WAY
57 INPUT_PORTS_END
58 
59 /* Machine Driver */
60 
advision(machine_config & config)61 void advision_state::advision(machine_config &config)
62 {
63 	/* basic machine hardware */
64 	I8048(config, m_maincpu, XTAL(11'000'000));
65 	m_maincpu->set_addrmap(AS_PROGRAM, &advision_state::program_map);
66 	m_maincpu->set_addrmap(AS_IO, &advision_state::io_map);
67 	m_maincpu->p1_in_cb().set(FUNC(advision_state::controller_r));
68 	m_maincpu->p1_out_cb().set(FUNC(advision_state::bankswitch_w));
69 	m_maincpu->p2_out_cb().set(FUNC(advision_state::av_control_w));
70 	m_maincpu->t1_in_cb().set(FUNC(advision_state::vsync_r));
71 
72 	COP411(config, m_soundcpu, 52631*4); // COP411L-KCN/N, R11=82k, C8=56pF
73 	m_soundcpu->set_config(COP400_CKI_DIVISOR_4, COP400_CKO_RAM_POWER_SUPPLY, false);
74 	m_soundcpu->read_l().set(FUNC(advision_state::sound_cmd_r));
75 	m_soundcpu->write_g().set(FUNC(advision_state::sound_g_w));
76 	m_soundcpu->write_d().set(FUNC(advision_state::sound_d_w));
77 
78 	/* video hardware */
79 	screen_device &screen(SCREEN(config, SCREEN_TAG, SCREEN_TYPE_RASTER));
80 	screen.set_refresh_hz(4*15);
81 	screen.set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
82 	screen.set_screen_update(FUNC(advision_state::screen_update));
83 	screen.set_size(320, 200);
84 	screen.set_visarea(84, 235, 60, 142);
85 	screen.set_palette(m_palette);
86 
87 	PALETTE(config, m_palette, FUNC(advision_state::advision_palette), 8);
88 
89 	/* sound hardware */
90 	SPEAKER(config, "speaker").front_center();
91 	DAC_2BIT_BINARY_WEIGHTED(config, m_dac, 0).add_route(ALL_OUTPUTS, "speaker", 0.25); // unknown DAC
92 
93 	/* cartridge */
94 	GENERIC_CARTSLOT(config, m_cart, generic_plain_slot, "advision_cart");
95 
96 	/* Software lists */
97 	SOFTWARE_LIST(config, "cart_list").set_original("advision");
98 }
99 
100 /* ROMs */
101 
102 ROM_START( advision )
103 	ROM_REGION( 0x1000, I8048_TAG, ROMREGION_ERASE00 )
104 	ROM_LOAD( "b225__ins8048-11kdp_n.u5", 0x000, 0x400, CRC(279e33d1) SHA1(bf7b0663e9125c9bfb950232eab627d9dbda8460) ) // "<natsemi logo> /B225 \\ INS8048-11KDP/N"
105 
106 	ROM_REGION( 0x200, COP411_TAG, 0 )
107 	ROM_LOAD( "b8223__cop411l-kcn_n.u8", 0x000, 0x200, CRC(81e95975) SHA1(8b6f8c30dd3e9d8e43f1ea20fba2361b383790eb) ) // "<natsemi logo> /B8223 \\ COP411L-KCN/N"
108 ROM_END
109 
110 /* Game Driver */
111 
112 /*    YEAR  NAME      PARENT  COMPAT  MACHINE   INPUT     CLASS           INIT        COMPANY  FULLNAME            FLAGS */
113 CONS( 1982, advision, 0,      0,      advision, advision, advision_state, empty_init, "Entex", "Adventure Vision", MACHINE_IMPERFECT_GRAPHICS | MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
114