mirror of
https://github.com/holub/mame
synced 2025-04-24 17:30:55 +03:00
dogfgt.cpp: device_finder (nw)
This commit is contained in:
parent
47f1777f44
commit
15692247ef
@ -13,21 +13,9 @@ driver by Nicola Salmoria
|
||||
#include "includes/dogfgt.h"
|
||||
|
||||
#include "cpu/m6502/m6502.h"
|
||||
#include "sound/ay8910.h"
|
||||
#include "speaker.h"
|
||||
|
||||
|
||||
READ8_MEMBER(dogfgt_state::sharedram_r)
|
||||
{
|
||||
return m_sharedram[offset];
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::sharedram_w)
|
||||
{
|
||||
m_sharedram[offset] = data;
|
||||
}
|
||||
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::subirqtrigger_w)
|
||||
{
|
||||
/* bit 0 used but unknown */
|
||||
@ -40,20 +28,20 @@ WRITE8_MEMBER(dogfgt_state::sub_irqack_w)
|
||||
m_subcpu->set_input_line(0, CLEAR_LINE);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_soundlatch_w)
|
||||
WRITE8_MEMBER(dogfgt_state::soundlatch_w)
|
||||
{
|
||||
m_soundlatch = data;
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_soundcontrol_w)
|
||||
WRITE8_MEMBER(dogfgt_state::soundcontrol_w)
|
||||
{
|
||||
/* bit 5 goes to 8910 #0 BDIR pin */
|
||||
if ((m_last_snd_ctrl & 0x20) == 0x20 && (data & 0x20) == 0x00)
|
||||
machine().device<ay8910_device>("ay1")->data_address_w(space, m_last_snd_ctrl >> 4, m_soundlatch);
|
||||
m_ay[0]->data_address_w(space, m_last_snd_ctrl >> 4, m_soundlatch);
|
||||
|
||||
/* bit 7 goes to 8910 #1 BDIR pin */
|
||||
if ((m_last_snd_ctrl & 0x80) == 0x80 && (data & 0x80) == 0x00)
|
||||
machine().device<ay8910_device>("ay2")->data_address_w(space, m_last_snd_ctrl >> 6, m_soundlatch);
|
||||
m_ay[1]->data_address_w(space, m_last_snd_ctrl >> 6, m_soundlatch);
|
||||
|
||||
m_last_snd_ctrl = data;
|
||||
}
|
||||
@ -62,28 +50,28 @@ WRITE8_MEMBER(dogfgt_state::dogfgt_soundcontrol_w)
|
||||
|
||||
void dogfgt_state::main_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x07ff).rw(this, FUNC(dogfgt_state::sharedram_r), FUNC(dogfgt_state::sharedram_w)).share("sharedram");
|
||||
map(0x0000, 0x07ff).ram().share("sharedram");
|
||||
map(0x0f80, 0x0fdf).writeonly().share("spriteram");
|
||||
map(0x1000, 0x17ff).w(this, FUNC(dogfgt_state::dogfgt_bgvideoram_w)).share("bgvideoram");
|
||||
map(0x1000, 0x17ff).w(this, FUNC(dogfgt_state::bgvideoram_w)).share("bgvideoram");
|
||||
map(0x1800, 0x1800).portr("P1");
|
||||
map(0x1800, 0x1800).w(this, FUNC(dogfgt_state::dogfgt_1800_w)); /* text color, flip screen & coin counters */
|
||||
map(0x1800, 0x1800).w(this, FUNC(dogfgt_state::_1800_w)); /* text color, flip screen & coin counters */
|
||||
map(0x1810, 0x1810).portr("P2");
|
||||
map(0x1810, 0x1810).w(this, FUNC(dogfgt_state::subirqtrigger_w));
|
||||
map(0x1820, 0x1820).portr("DSW1");
|
||||
map(0x1820, 0x1823).w(this, FUNC(dogfgt_state::dogfgt_scroll_w));
|
||||
map(0x1824, 0x1824).w(this, FUNC(dogfgt_state::dogfgt_plane_select_w));
|
||||
map(0x1820, 0x1823).w(this, FUNC(dogfgt_state::scroll_w));
|
||||
map(0x1824, 0x1824).w(this, FUNC(dogfgt_state::plane_select_w));
|
||||
map(0x1830, 0x1830).portr("DSW2");
|
||||
map(0x1830, 0x1830).w(this, FUNC(dogfgt_state::dogfgt_soundlatch_w));
|
||||
map(0x1840, 0x1840).w(this, FUNC(dogfgt_state::dogfgt_soundcontrol_w));
|
||||
map(0x1830, 0x1830).w(this, FUNC(dogfgt_state::soundlatch_w));
|
||||
map(0x1840, 0x1840).w(this, FUNC(dogfgt_state::soundcontrol_w));
|
||||
map(0x1870, 0x187f).w(m_palette, FUNC(palette_device::write8)).share("palette");
|
||||
map(0x2000, 0x3fff).rw(this, FUNC(dogfgt_state::dogfgt_bitmapram_r), FUNC(dogfgt_state::dogfgt_bitmapram_w));
|
||||
map(0x2000, 0x3fff).rw(this, FUNC(dogfgt_state::bitmapram_r), FUNC(dogfgt_state::bitmapram_w));
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
|
||||
void dogfgt_state::sub_map(address_map &map)
|
||||
{
|
||||
map(0x0000, 0x07ff).ram();
|
||||
map(0x2000, 0x27ff).rw(this, FUNC(dogfgt_state::sharedram_r), FUNC(dogfgt_state::sharedram_w));
|
||||
map(0x2000, 0x27ff).ram().share("sharedram");
|
||||
map(0x4000, 0x4000).w(this, FUNC(dogfgt_state::sub_irqack_w));
|
||||
map(0x8000, 0xffff).rom();
|
||||
}
|
||||
@ -242,36 +230,36 @@ void dogfgt_state::machine_reset()
|
||||
MACHINE_CONFIG_START(dogfgt_state::dogfgt)
|
||||
|
||||
/* basic machine hardware */
|
||||
MCFG_DEVICE_ADD("maincpu", M6502, 1500000) /* 1.5 MHz ???? */
|
||||
MCFG_DEVICE_ADD(m_maincpu, M6502, 1500000) /* 1.5 MHz ???? */
|
||||
MCFG_DEVICE_PROGRAM_MAP(main_map)
|
||||
MCFG_DEVICE_PERIODIC_INT_DRIVER(dogfgt_state, irq0_line_hold, 16*60) /* ? controls music tempo */
|
||||
|
||||
MCFG_DEVICE_ADD("sub", M6502, 1500000) /* 1.5 MHz ???? */
|
||||
MCFG_DEVICE_ADD(m_subcpu, M6502, 1500000) /* 1.5 MHz ???? */
|
||||
MCFG_DEVICE_PROGRAM_MAP(sub_map)
|
||||
|
||||
MCFG_QUANTUM_TIME(attotime::from_hz(6000))
|
||||
|
||||
/* video hardware */
|
||||
MCFG_SCREEN_ADD("screen", RASTER)
|
||||
MCFG_SCREEN_ADD(m_screen, RASTER)
|
||||
MCFG_SCREEN_REFRESH_RATE(60)
|
||||
MCFG_SCREEN_VBLANK_TIME(ATTOSECONDS_IN_USEC(2500) /* not accurate */)
|
||||
MCFG_SCREEN_SIZE(32*8, 32*8)
|
||||
MCFG_SCREEN_VISIBLE_AREA(0*8, 32*8-1, 1*8, 31*8-1)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(dogfgt_state, screen_update_dogfgt)
|
||||
MCFG_SCREEN_UPDATE_DRIVER(dogfgt_state, screen_update)
|
||||
MCFG_SCREEN_PALETTE("palette")
|
||||
|
||||
MCFG_DEVICE_ADD("gfxdecode", GFXDECODE, "palette", gfx_dogfgt)
|
||||
MCFG_PALETTE_ADD("palette", 16+64)
|
||||
MCFG_DEVICE_ADD(m_gfxdecode, GFXDECODE, m_palette, gfx_dogfgt)
|
||||
MCFG_PALETTE_ADD(m_palette, 16+64)
|
||||
MCFG_PALETTE_FORMAT(BBGGGRRR)
|
||||
MCFG_PALETTE_INIT_OWNER(dogfgt_state, dogfgt)
|
||||
|
||||
/* sound hardware */
|
||||
SPEAKER(config, "mono").front_center();
|
||||
|
||||
MCFG_DEVICE_ADD("ay1", AY8910, 1500000)
|
||||
MCFG_DEVICE_ADD(m_ay[0], AY8910, 1500000)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
|
||||
|
||||
MCFG_DEVICE_ADD("ay2", AY8910, 1500000)
|
||||
MCFG_DEVICE_ADD(m_ay[1], AY8910, 1500000)
|
||||
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.30)
|
||||
MACHINE_CONFIG_END
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
// license:BSD-3-Clause
|
||||
// copyright-holders:Nicola Salmoria
|
||||
#include "sound/ay8910.h"
|
||||
#include "screen.h"
|
||||
|
||||
#define PIXMAP_COLOR_BASE (16 + 32)
|
||||
@ -18,13 +19,30 @@ public:
|
||||
m_maincpu(*this, "maincpu"),
|
||||
m_gfxdecode(*this, "gfxdecode"),
|
||||
m_screen(*this, "screen"),
|
||||
m_palette(*this, "palette") { }
|
||||
m_palette(*this, "palette"),
|
||||
m_ay(*this, "ay%u", 0U) { }
|
||||
|
||||
void dogfgt(machine_config &config);
|
||||
|
||||
protected:
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
|
||||
private:
|
||||
/* memory pointers */
|
||||
required_shared_ptr<uint8_t> m_bgvideoram;
|
||||
required_shared_ptr<uint8_t> m_spriteram;
|
||||
required_shared_ptr<uint8_t> m_sharedram;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_subcpu;
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
required_device_array<ay8910_device, 2> m_ay;
|
||||
|
||||
/* video-related */
|
||||
bitmap_ind16 m_pixbitmap;
|
||||
tilemap_t *m_bg_tilemap;
|
||||
@ -39,33 +57,24 @@ public:
|
||||
int m_soundlatch;
|
||||
int m_last_snd_ctrl;
|
||||
|
||||
/* devices */
|
||||
required_device<cpu_device> m_subcpu;
|
||||
DECLARE_READ8_MEMBER(sharedram_r);
|
||||
DECLARE_WRITE8_MEMBER(sharedram_w);
|
||||
DECLARE_WRITE8_MEMBER(subirqtrigger_w);
|
||||
DECLARE_WRITE8_MEMBER(sub_irqack_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_soundlatch_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_soundcontrol_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_plane_select_w);
|
||||
DECLARE_READ8_MEMBER(dogfgt_bitmapram_r);
|
||||
DECLARE_WRITE8_MEMBER(soundlatch_w);
|
||||
DECLARE_WRITE8_MEMBER(soundcontrol_w);
|
||||
DECLARE_WRITE8_MEMBER(plane_select_w);
|
||||
DECLARE_READ8_MEMBER(bitmapram_r);
|
||||
DECLARE_WRITE8_MEMBER(internal_bitmapram_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_bitmapram_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_bgvideoram_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_scroll_w);
|
||||
DECLARE_WRITE8_MEMBER(dogfgt_1800_w);
|
||||
DECLARE_WRITE8_MEMBER(bitmapram_w);
|
||||
DECLARE_WRITE8_MEMBER(bgvideoram_w);
|
||||
DECLARE_WRITE8_MEMBER(scroll_w);
|
||||
DECLARE_WRITE8_MEMBER(_1800_w);
|
||||
|
||||
|
||||
TILE_GET_INFO_MEMBER(get_tile_info);
|
||||
virtual void machine_start() override;
|
||||
virtual void machine_reset() override;
|
||||
virtual void video_start() override;
|
||||
DECLARE_PALETTE_INIT(dogfgt);
|
||||
uint32_t screen_update_dogfgt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
|
||||
void draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect );
|
||||
required_device<cpu_device> m_maincpu;
|
||||
required_device<gfxdecode_device> m_gfxdecode;
|
||||
required_device<screen_device> m_screen;
|
||||
required_device<palette_device> m_palette;
|
||||
void dogfgt(machine_config &config);
|
||||
|
||||
void main_map(address_map &map);
|
||||
void sub_map(address_map &map);
|
||||
};
|
||||
|
@ -16,10 +16,9 @@
|
||||
PALETTE_INIT_MEMBER(dogfgt_state, dogfgt)
|
||||
{
|
||||
const uint8_t *color_prom = memregion("proms")->base();
|
||||
int i;
|
||||
|
||||
/* first 16 colors are RAM */
|
||||
for (i = 0; i < 64; i++)
|
||||
for (int i = 0; i < 64; i++)
|
||||
{
|
||||
int bit0, bit1, bit2, r, g, b;
|
||||
|
||||
@ -84,12 +83,12 @@ void dogfgt_state::video_start()
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_plane_select_w)
|
||||
WRITE8_MEMBER(dogfgt_state::plane_select_w)
|
||||
{
|
||||
m_bm_plane = data;
|
||||
}
|
||||
|
||||
READ8_MEMBER(dogfgt_state::dogfgt_bitmapram_r)
|
||||
READ8_MEMBER(dogfgt_state::bitmapram_r)
|
||||
{
|
||||
if (m_bm_plane > 2)
|
||||
{
|
||||
@ -102,19 +101,17 @@ READ8_MEMBER(dogfgt_state::dogfgt_bitmapram_r)
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::internal_bitmapram_w)
|
||||
{
|
||||
int x, y, subx;
|
||||
|
||||
m_bitmapram[offset] = data;
|
||||
|
||||
offset &= (BITMAPRAM_SIZE / 3 - 1);
|
||||
x = 8 * (offset / 256);
|
||||
y = offset % 256;
|
||||
int x = 8 * (offset / 256);
|
||||
int y = offset % 256;
|
||||
|
||||
for (subx = 0; subx < 8; subx++)
|
||||
for (int subx = 0; subx < 8; subx++)
|
||||
{
|
||||
int i, color = 0;
|
||||
int color = 0;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
for (int i = 0; i < 3; i++)
|
||||
color |= ((m_bitmapram[offset + BITMAPRAM_SIZE / 3 * i] >> subx) & 1) << i;
|
||||
|
||||
if (flip_screen())
|
||||
@ -124,7 +121,7 @@ WRITE8_MEMBER(dogfgt_state::internal_bitmapram_w)
|
||||
}
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_bitmapram_w)
|
||||
WRITE8_MEMBER(dogfgt_state::bitmapram_w)
|
||||
{
|
||||
if (m_bm_plane > 2)
|
||||
{
|
||||
@ -135,20 +132,20 @@ WRITE8_MEMBER(dogfgt_state::dogfgt_bitmapram_w)
|
||||
internal_bitmapram_w(space, offset + BITMAPRAM_SIZE / 3 * m_bm_plane, data);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_bgvideoram_w)
|
||||
WRITE8_MEMBER(dogfgt_state::bgvideoram_w)
|
||||
{
|
||||
m_bgvideoram[offset] = data;
|
||||
m_bg_tilemap->mark_tile_dirty(offset & 0x3ff);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_scroll_w)
|
||||
WRITE8_MEMBER(dogfgt_state::scroll_w)
|
||||
{
|
||||
m_scroll[offset] = data;
|
||||
m_bg_tilemap->set_scrollx(0, m_scroll[0] + 256 * m_scroll[1] + 256);
|
||||
m_bg_tilemap->set_scrolly(0, m_scroll[2] + 256 * m_scroll[3]);
|
||||
}
|
||||
|
||||
WRITE8_MEMBER(dogfgt_state::dogfgt_1800_w)
|
||||
WRITE8_MEMBER(dogfgt_state::_1800_w)
|
||||
{
|
||||
/* bits 0 and 1 are probably text color (not verified because PROM is missing) */
|
||||
m_pixcolor = ((data & 0x01) << 1) | ((data & 0x02) >> 1);
|
||||
@ -173,18 +170,14 @@ WRITE8_MEMBER(dogfgt_state::dogfgt_1800_w)
|
||||
|
||||
void dogfgt_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect )
|
||||
{
|
||||
int offs;
|
||||
|
||||
for (offs = 0; offs < m_spriteram.bytes(); offs += 4)
|
||||
for (int offs = 0; offs < m_spriteram.bytes(); offs += 4)
|
||||
{
|
||||
if (m_spriteram[offs] & 0x01)
|
||||
{
|
||||
int sx, sy, flipx, flipy;
|
||||
|
||||
sx = m_spriteram[offs + 3];
|
||||
sy = (240 - m_spriteram[offs + 2]) & 0xff;
|
||||
flipx = m_spriteram[offs] & 0x04;
|
||||
flipy = m_spriteram[offs] & 0x02;
|
||||
int sx = m_spriteram[offs + 3];
|
||||
int sy = (240 - m_spriteram[offs + 2]) & 0xff;
|
||||
int flipx = m_spriteram[offs] & 0x04;
|
||||
int flipy = m_spriteram[offs] & 0x02;
|
||||
if (flip_screen())
|
||||
{
|
||||
sx = 240 - sx;
|
||||
@ -203,10 +196,8 @@ void dogfgt_state::draw_sprites( bitmap_ind16 &bitmap,const rectangle &cliprect
|
||||
}
|
||||
|
||||
|
||||
uint32_t dogfgt_state::screen_update_dogfgt(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
uint32_t dogfgt_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
|
||||
{
|
||||
int offs;
|
||||
|
||||
if (m_lastflip != flip_screen() || m_lastpixcolor != m_pixcolor)
|
||||
{
|
||||
address_space &space = m_maincpu->space(AS_PROGRAM);
|
||||
@ -214,7 +205,7 @@ uint32_t dogfgt_state::screen_update_dogfgt(screen_device &screen, bitmap_ind16
|
||||
m_lastflip = flip_screen();
|
||||
m_lastpixcolor = m_pixcolor;
|
||||
|
||||
for (offs = 0; offs < BITMAPRAM_SIZE; offs++)
|
||||
for (int offs = 0; offs < BITMAPRAM_SIZE; offs++)
|
||||
internal_bitmapram_w(space, offs, m_bitmapram[offs]);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user