summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/vsystem/gstriker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/vsystem/gstriker.cpp')
-rw-r--r--src/mame/vsystem/gstriker.cpp65
1 files changed, 36 insertions, 29 deletions
diff --git a/src/mame/vsystem/gstriker.cpp b/src/mame/vsystem/gstriker.cpp
index 81c17e0a3ce..7c2d8fe5d8a 100644
--- a/src/mame/vsystem/gstriker.cpp
+++ b/src/mame/vsystem/gstriker.cpp
@@ -184,6 +184,7 @@ Frequencies: 68k is XTAL_32MHZ/2
#include "cpu/m68000/m68000.h"
#include "cpu/z80/z80.h"
#include "machine/6850acia.h"
+#include "machine/clock.h"
#include "machine/gen_latch.h"
#include "machine/mb3773.h"
#include "sound/ymopn.h"
@@ -240,8 +241,8 @@ public:
void init_twcup94b();
protected:
- virtual void machine_start() override;
- virtual void video_start() override;
+ virtual void machine_start() override ATTR_COLD;
+ virtual void video_start() override ATTR_COLD;
private:
required_device<cpu_device> m_maincpu;
@@ -282,19 +283,18 @@ private:
uint16_t vbl_toggle_r();
void vbl_toggle_w(uint16_t data);
+ uint32_t pri_callback(uint32_t color);
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_vblank(int state);
void mcu_init();
- void gstriker_map(address_map &map);
- void sound_io_map(address_map &map);
- void sound_map(address_map &map);
- void twcup94_map(address_map &map);
+ void gstriker_map(address_map &map) ATTR_COLD;
+ void sound_io_map(address_map &map) ATTR_COLD;
+ void sound_map(address_map &map) ATTR_COLD;
+ void twcup94_map(address_map &map) ATTR_COLD;
};
-// video
-
/*** VIDEO UPDATE/START **********************************************/
void gstriker_state::video_start()
@@ -306,14 +306,19 @@ void gstriker_state::video_start()
m_bg->set_transparent_pen(0xf);
}
+uint32_t gstriker_state::pri_callback(uint32_t color)
+{
+ return BIT(color, 5) ? 0 : GFX_PMASK_2;
+}
+
void gstriker_state::screen_vblank(int state)
{
// sprites are two frames ahead
// TODO: probably all Video System games are (Aero Fighters definitely desyncs wrt background)
if(state)
{
- memcpy(m_buffered_spriteram[0], m_cg10103_vram, 0x2000);
memcpy(m_buffered_spriteram[1], m_buffered_spriteram[0], 0x2000);
+ memcpy(m_buffered_spriteram[0], m_cg10103_vram, 0x2000);
}
}
@@ -321,6 +326,7 @@ void gstriker_state::screen_vblank(int state)
uint32_t gstriker_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
{
bitmap.fill(m_mixerregs[8] & 0x07ff, cliprect); // complete guess, causes green behind test grid in twc94 and blue behind title screen on gstriker
+ screen.priority().fill(0, cliprect);
/*
[4] AAAA BBBB ---- ---- sprite priority number A/B?
@@ -333,22 +339,16 @@ uint32_t gstriker_state::screen_update(screen_device &screen, bitmap_ind16 &bitm
m_bg->set_pal_base((m_mixerregs[1] & 0xf000) >> 8);
m_tx->set_pal_base((m_mixerregs[2] & 0xf000) >> 8);
-
// Sandwiched screen/sprite0/score/sprite1. Surely wrong, probably needs sprite orthogonality
- m_bg->draw(screen, bitmap, cliprect, 0);
-
- m_spr->draw_sprites(m_buffered_spriteram[1], 0x2000, screen, bitmap, cliprect, 0x2, 0x0);
-
- m_tx->draw(screen, bitmap, cliprect, 0);
+ m_bg->draw(screen, bitmap, cliprect, 1);
+ m_tx->draw(screen, bitmap, cliprect, 2);
- m_spr->draw_sprites(m_buffered_spriteram[1], 0x2000, screen, bitmap, cliprect, 0x2, 0x2);
+ m_spr->draw_sprites(m_buffered_spriteram[1], 0x2000, screen, bitmap, cliprect);
return 0;
}
-// machine
-
void gstriker_state::machine_start()
{
m_soundbank->configure_entries(0, 8, memregion("audiocpu")->base(), 0x8000);
@@ -373,6 +373,9 @@ void gstriker_state::sh_bankswitch_w(uint8_t data)
static GFXDECODE_START( gfx_gstriker )
GFXDECODE_ENTRY( "fix_tiles", 0, gfx_8x8x4_packed_lsb, 0, 256 )
GFXDECODE_ENTRY( "scroll_tiles", 0, gfx_16x16x4_packed_msb, 0, 256 )
+GFXDECODE_END
+
+static GFXDECODE_START( gfx_gstriker_spr )
GFXDECODE_ENTRY( "sprites", 0, gfx_16x16x4_packed_msb, 0, 256 )
GFXDECODE_END
@@ -659,14 +662,12 @@ void gstriker_state::base(machine_config &config)
m_tx->set_gfxdecode_tag(m_gfxdecode);
m_tx->set_gfx_region(0);
- VSYSTEM_SPR(config, m_spr, 0);
- m_spr->set_gfx_region(2);
+ VSYSTEM_SPR(config, m_spr, 0, m_palette, gfx_gstriker_spr);
+ m_spr->set_pri_cb(FUNC(gstriker_state::pri_callback));
m_spr->set_pal_mask(0x1f);
m_spr->set_transpen(0);
- m_spr->set_gfxdecode_tag(m_gfxdecode);
- SPEAKER(config, "lspeaker").front_left();
- SPEAKER(config, "rspeaker").front_right();
+ SPEAKER(config, "speaker", 2).front();
generic_latch_8_device &soundlatch(GENERIC_LATCH_8(config, "soundlatch"));
soundlatch.data_pending_callback().set_inputline(m_audiocpu, INPUT_LINE_NMI);
@@ -674,10 +675,10 @@ void gstriker_state::base(machine_config &config)
ym2610_device &ymsnd(YM2610(config, "ymsnd", 8_MHz_XTAL));
ymsnd.irq_handler().set_inputline(m_audiocpu, 0);
- ymsnd.add_route(0, "lspeaker", 0.25);
- ymsnd.add_route(0, "rspeaker", 0.25);
- ymsnd.add_route(1, "lspeaker", 1.0);
- ymsnd.add_route(2, "rspeaker", 1.0);
+ ymsnd.add_route(0, "speaker", 0.75, 0);
+ ymsnd.add_route(0, "speaker", 0.75, 1);
+ ymsnd.add_route(1, "speaker", 1.0, 0);
+ ymsnd.add_route(2, "speaker", 1.0, 1);
}
void gstriker_state::gstriker(machine_config &config)
@@ -690,8 +691,14 @@ void gstriker_state::gstriker(machine_config &config)
ACIA6850(config, m_acia, 0);
m_acia->irq_handler().set_inputline(m_maincpu, M68K_IRQ_2);
- //m_acia->txd_handler().set("link", FUNC(rs232_port_device::write_txd));
- //m_acia->rts_handler().set("link", FUNC(rs232_port_device::write_rts));
+ m_acia->txd_handler().set(m_acia, FUNC(acia6850_device::write_rxd)); // loopback for now
+
+ // DE-9 port
+ // slave sends 0xca, master receives it and sends a 0x0d ACK back.
+ // writing latter to $200063 while in slave mode will pass the serial check
+ clock_device &acia_clock(CLOCK(config, "acia_clock", 20_MHz_XTAL / 64)); // assume ~19200 baud
+ acia_clock.signal_handler().set(m_acia, FUNC(acia6850_device::write_txc));
+ acia_clock.signal_handler().append(m_acia, FUNC(acia6850_device::write_rxc));
}
void gstriker_state::twc94(machine_config &config)