diff options
Diffstat (limited to 'src/mame/vsystem/gstriker.cpp')
-rw-r--r-- | src/mame/vsystem/gstriker.cpp | 65 |
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) |