summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/drivers/tutankhm.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/drivers/tutankhm.cpp')
-rw-r--r--src/mame/drivers/tutankhm.cpp133
1 files changed, 96 insertions, 37 deletions
diff --git a/src/mame/drivers/tutankhm.cpp b/src/mame/drivers/tutankhm.cpp
index 037f1e38ba8..f0cc24a3384 100644
--- a/src/mame/drivers/tutankhm.cpp
+++ b/src/mame/drivers/tutankhm.cpp
@@ -23,32 +23,65 @@
Custom Chip 084 (Starfield generation)
- * Inputs:
- *
- * NE555 ==> 10 (approx 1 HZ)
- * 401 ==> 1 (crystal clock, most likely around 6 MHz)
- * 109 ==> 2 (Video related)
- * 403 ==> 3 (Video related)
- * 403 ==> 4 (Video related)
- * 405 ==> 5 (Video related)
- * 406 ==> 6 (Video related)
- * 420 ==> 20 (Video related)
- * 421 ==> 21 (Video related)
- * 422 ==> 22 (Video related)
- * 423 ==> 23 (Video horizontal signal H1)
- *0x8206 HFF ==> 7 (Horizontal flip)
- *0x8204 407 ==> 8 (Enable ???)
- *
- *Outputs:
- * 13 Red
- * 14 Red
- * 15 Green
- * 16 Green
- * 17 Blue
- * 18 Blue
-
-
-***************************************************************************/
+
+ ----------------------
+ NE555 1Hz | 10 24 | VCC
+ | |
+ | |
+ 18Mhz 401 | 1 19 | 419 Reset Enable
+ 6MHz 109 | 2 |
+ 256H* 403 | 3 Custom 084 |
+ Vblank* 404 | 4 |
+ /SYNC* 405 | 5 18 | Blue
+ Aux. Enable 406 | 6 17 | Blue
+ Stars Enable 407 | 7 |
+ Horz.Flip HFF | 8 16 | Green
+ GND | 11 15 | Green
+ | |
+ H8Q 423 | 23 14 | Red
+ V1 422 | 22 13 | Red
+ V2 421 | 21 |
+ 0x8120 420 | 20 |
+ ----------------------
+
+ line 420 seems to be related to 419 which is connect to reset circuit -> watchdog
+
+ There are two star fields implemented here. The active one can be selected in
+ Machine Configuration.
+
+ a) Scramble Starfield
+
+ 1/3 star width like scramble/galaxian, starfield code same as scramble.
+ This one is similar to the Konami starfield video below.
+
+ b) Bootleg Starfield
+
+ Guru provided schematics of a daughter-board which on a Konami bootleg replaced
+ custom chip 084. This starfield matches the starfield (picture) of this bootleg.
+
+ None of the two alterntives reproduces the star field which can be observed in
+ the Stern videos below.
+
+ FIXME: For an exact emulation we need a 084 at some time.
+ FIXME: The Konami video below is different from tutankhm. Looks like we
+ are missing an early board dump
+
+
+ Starfield videos ....
+
+ Konami
+ https://www.youtube.com/watch?v=YwVjJtQK2n4
+
+ Stern
+ https://www.youtube.com/watch?v=g6nv6jHFP80
+ https://www.youtube.com/watch?v=D_hmvFi2ehw
+ https://www.youtube.com/watch?v=EZNqH-JPzPM
+ https://www.youtube.com/watch?v=1MPvSIEIpFU
+
+ */
+
+
+/***************************************************************************/
#include "emu.h"
#include "includes/tutankhm.h"
@@ -59,6 +92,7 @@
#include "machine/watchdog.h"
#include "screen.h"
#include "speaker.h"
+#include "schedule.h"
/*************************************
@@ -134,8 +168,16 @@ void tutankhm_state::main_map(address_map &map)
{
map(0x0000, 0x7fff).ram().share("videoram");
map(0x8000, 0x800f).mirror(0x00f0).ram().w(m_palette, FUNC(palette_device::write8)).share("palette");
+ //0x8100 -> Custom 089 D9 Pin 15
map(0x8100, 0x8100).mirror(0x000f).ram().share("scroll");
+
+ /* a read here produces a 1-0-1 write to line 420 (084).
+ * This most likely resets some sort of timer implemented by the 084 custom chip
+ * which would on line 419 trigger a reset.
+ */
+ //0x8720 -> Custom 084 F3 Pin 20
map(0x8120, 0x8120).mirror(0x000f).r("watchdog", FUNC(watchdog_timer_device::reset_r));
+ //0x8740 -> Custom 089 D9 Pin 11 - Unknown, not used
map(0x8160, 0x8160).mirror(0x000f).portr("DSW2"); /* DSW2 (inverted bits) */
map(0x8180, 0x8180).mirror(0x000f).portr("IN0"); /* IN0 I/O: Coin slots, service, 1P/2P buttons */
map(0x81a0, 0x81a0).mirror(0x000f).portr("IN1"); /* IN1: Player 1 I/O */
@@ -145,6 +187,7 @@ void tutankhm_state::main_map(address_map &map)
map(0x8300, 0x8300).mirror(0x00ff).w(FUNC(tutankhm_state::tutankhm_bankselect_w));
map(0x8600, 0x8600).mirror(0x00ff).w(FUNC(tutankhm_state::sound_on_w));
map(0x8700, 0x8700).mirror(0x00ff).w(m_timeplt_audio, FUNC(timeplt_audio_device::sound_data_w));
+
map(0x8800, 0x8fff).ram();
map(0x9000, 0x9fff).bankr("bank1");
map(0xa000, 0xffff).rom();
@@ -202,6 +245,12 @@ static INPUT_PORTS_START( tutankhm )
PORT_START("DSW1")
KONAMI_COINAGE_LOC(DEF_STR( Free_Play ), "No Coin B", SW1)
/* "No Coin B" = coins produce sound, but no effect on coin counter */
+
+ PORT_START("STARS")
+ PORT_CONFNAME( 0x01, 0x01, "Starfield selection" )
+ PORT_CONFSETTING( 0x00, "Konami HW bootleg (6MHz stars)" )
+ PORT_CONFSETTING( 0x01, "Scramble implementation" )
+
INPUT_PORTS_END
@@ -215,10 +264,17 @@ void tutankhm_state::machine_start()
{
membank("bank1")->configure_entries(0, 16, memregion("maincpu")->base() + 0x10000, 0x1000);
+ m_star_mode = 0;
+
save_item(NAME(m_irq_toggle));
save_item(NAME(m_irq_enable));
- save_item(NAME(m_flip_x));
- save_item(NAME(m_flip_y));
+ save_item(NAME(m_flipscreen_x));
+ save_item(NAME(m_flipscreen_y));
+ //rgb_t m_star_color[64];
+ //std::unique_ptr<uint8_t[]> m_stars;
+ save_item(NAME(m_stars_enabled));
+ save_item(NAME(m_stars_blink_state));
+ save_item(NAME(m_star_mode));
}
void tutankhm_state::machine_reset()
@@ -237,7 +293,7 @@ void tutankhm_state::tutankhm(machine_config &config)
mainlatch.q_out_cb<1>().set_nop(); // PAY OUT - not used
mainlatch.q_out_cb<2>().set(FUNC(tutankhm_state::coin_counter_2_w));
mainlatch.q_out_cb<3>().set(FUNC(tutankhm_state::coin_counter_1_w));
- mainlatch.q_out_cb<4>().set_nop(); // starfield?
+ mainlatch.q_out_cb<4>().set(FUNC(tutankhm_state::galaxian_stars_enable_w));
mainlatch.q_out_cb<5>().set("timeplt_audio", FUNC(timeplt_audio_device::mute_w));
mainlatch.q_out_cb<6>().set(FUNC(tutankhm_state::flip_screen_x_w));
mainlatch.q_out_cb<7>().set(FUNC(tutankhm_state::flip_screen_y_w));
@@ -245,18 +301,21 @@ void tutankhm_state::tutankhm(machine_config &config)
WATCHDOG_TIMER(config, "watchdog");
/* video hardware */
- screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
- screen.set_refresh_hz(60);
- screen.set_vblank_time(ATTOSECONDS_IN_USEC(0));
- screen.set_size(32*8, 32*8);
- screen.set_visarea(0*8, 32*8-1, 2*8, 30*8-1); /* not sure about the visible area */
- screen.set_screen_update(FUNC(tutankhm_state::screen_update_tutankhm));
- screen.screen_vblank().set(FUNC(tutankhm_state::vblank_irq));
+ //screen_device &screen(SCREEN(config, "screen", SCREEN_TYPE_RASTER));
+ SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
+ m_screen->set_raw(GALAXIAN_PIXEL_CLOCK, GALAXIAN_HTOTAL, GALAXIAN_HBEND, GALAXIAN_HBSTART, GALAXIAN_VTOTAL, GALAXIAN_VBEND, GALAXIAN_VBSTART);
+ PALETTE(config, m_palette).set_format(1, tutankhm_state::raw_to_rgb_func, 16);
+
+ m_screen->set_screen_update(FUNC(tutankhm_state::screen_update_tutankhm));
+ m_screen->screen_vblank().set(FUNC(tutankhm_state::vblank_irq));
- PALETTE(config, m_palette).set_format(palette_device::BGR_233, 16);
/* sound hardware */
TIMEPLT_AUDIO(config, "timeplt_audio");
+
+ /* blinking frequency is determined by 555 counter with Ra=100k, Rb=10k, C=10uF */
+ TIMER(config, "stars").configure_periodic(FUNC(tutankhm_state::scramble_stars_blink_timer), PERIOD_OF_555_ASTABLE(100000, 10000, 0.00001));
+
}