summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/gp9001.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/gp9001.h')
-rw-r--r--src/mame/video/gp9001.h78
1 files changed, 31 insertions, 47 deletions
diff --git a/src/mame/video/gp9001.h b/src/mame/video/gp9001.h
index 230ad307253..13704fd8e07 100644
--- a/src/mame/video/gp9001.h
+++ b/src/mame/video/gp9001.h
@@ -19,12 +19,15 @@ class gp9001vdp_device : public device_t,
};
public:
- gp9001vdp_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+ gp9001vdp_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
+
+ typedef device_delegate<void (u8 layer, u32 &code)> gp9001_cb_delegate;
+ void set_tile_callback(gp9001_cb_delegate cb) { m_gp9001_cb = cb; }
auto vint_out_cb() { return m_vint_out_cb.bind(); }
- void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const uint8_t* primap);
- void draw_custom_tilemap(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, const uint8_t* priremap, const uint8_t* pri_enable);
+ void draw_sprites(bitmap_ind16 &bitmap, const rectangle &cliprect, const u8* primap);
+ void draw_custom_tilemap(bitmap_ind16 &bitmap, const rectangle &cliprect, int layer, const u8* priremap, const u8* pri_enable);
void render_vdp(bitmap_ind16 &bitmap, const rectangle &cliprect);
void screen_eof();
void create_tilemaps();
@@ -40,30 +43,22 @@ public:
void set_sp_extra_offsets(int xn, int yn, int xf, int yf) { m_sp.set_extra_offsets(xn, yn, xf, yf); }
// ROM banking control
- void set_gfxrom_banked() { m_gfxrom_is_banked = true; }
- void set_gfxrom_bank(unsigned index, uint16_t value)
- {
- if (m_gfxrom_bank[index] != value)
- {
- m_gfxrom_bank[index] = value;
- m_gfxrom_bank_dirty = true;
- }
- }
+ void set_dirty() { m_gfxrom_bank_dirty = true; }
// access to VDP
- uint16_t read(offs_t offset, u16 mem_mask);
- void write(offs_t offset, u16 data, u16 mem_mask);
+ u16 read(offs_t offset, u16 mem_mask = ~0);
+ void write(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_READ_LINE_MEMBER(hsync_r);
DECLARE_READ_LINE_MEMBER(vsync_r);
DECLARE_READ_LINE_MEMBER(fblank_r);
// this bootleg has strange access
- DECLARE_READ16_MEMBER(pipibibi_bootleg_videoram16_r);
- DECLARE_WRITE16_MEMBER(pipibibi_bootleg_videoram16_w);
- DECLARE_READ16_MEMBER(pipibibi_bootleg_spriteram16_r);
- DECLARE_WRITE16_MEMBER(pipibibi_bootleg_spriteram16_w);
- DECLARE_WRITE16_MEMBER(pipibibi_bootleg_scroll_w);
+ u16 pipibibi_bootleg_videoram16_r(offs_t offset);
+ void pipibibi_bootleg_videoram16_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ u16 pipibibi_bootleg_spriteram16_r(offs_t offset);
+ void pipibibi_bootleg_spriteram16_w(offs_t offset, u16 data, u16 mem_mask = ~0);
+ void pipibibi_bootleg_scroll_w(offs_t offset, u16 data, u16 mem_mask = ~0);
protected:
virtual void device_add_mconfig(machine_config &config) override;
@@ -79,7 +74,7 @@ protected:
private:
// internal handlers
- template<int Layer> DECLARE_WRITE16_MEMBER(tmap_w);
+ template<int Layer> void tmap_w(offs_t offset, u16 data, u16 mem_mask = ~0);
static constexpr unsigned BG_VRAM_SIZE = 0x1000; /* Background RAM size */
static constexpr unsigned FG_VRAM_SIZE = 0x1000; /* Foreground RAM size */
@@ -104,9 +99,9 @@ private:
extra_yoffset.flipped = yf;
}
- uint16_t flip;
- uint16_t scrollx;
- uint16_t scrolly;
+ u16 flip;
+ u16 scrollx;
+ u16 scrolly;
gp9001layeroffsets extra_xoffset;
gp9001layeroffsets extra_yoffset;
@@ -114,41 +109,31 @@ private:
struct tilemaplayer : gp9001layer
{
- void set_scrollx_and_flip_reg(uint16_t data, uint16_t mem_mask, bool f);
- void set_scrolly_and_flip_reg(uint16_t data, uint16_t mem_mask, bool f);
+ void set_scrollx_and_flip_reg(u16 data, u16 mem_mask, bool f);
+ void set_scrolly_and_flip_reg(u16 data, u16 mem_mask, bool f);
tilemap_t *tmap;
};
struct spritelayer : gp9001layer
{
- void set_scrollx_and_flip_reg(uint16_t data, uint16_t mem_mask, bool f);
- void set_scrolly_and_flip_reg(uint16_t data, uint16_t mem_mask, bool f);
+ void set_scrollx_and_flip_reg(u16 data, u16 mem_mask, bool f);
+ void set_scrolly_and_flip_reg(u16 data, u16 mem_mask, bool f);
bool use_sprite_buffer;
};
- int get_tile_number(int layer, int index)
- {
- uint16_t const value = m_vram[layer][(index << 1) | 1];
- if (m_gfxrom_is_banked)
- return (m_gfxrom_bank[(value >> 13) & 7] << 13) | (value & 0x1fff);
- else
- return value;
- }
-
- static const gfx_layout tilelayout, spritelayout;
DECLARE_GFXDECODE_MEMBER(gfxinfo);
- void voffs_w(uint16_t data, uint16_t mem_mask);
+ void voffs_w(u16 data, u16 mem_mask = ~0);
int videoram16_r(void);
- void videoram16_w(uint16_t data, uint16_t mem_mask);
- uint16_t vdpstatus_r(void);
- void scroll_reg_select_w(uint16_t data, uint16_t mem_mask);
- void scroll_reg_data_w(uint16_t data, uint16_t mem_mask);
+ void videoram16_w(u16 data, u16 mem_mask = ~0);
+ u16 vdpstatus_r(void);
+ void scroll_reg_select_w(u16 data, u16 mem_mask = ~0);
+ void scroll_reg_data_w(u16 data, u16 mem_mask = ~0);
- uint16_t m_voffs;
- uint16_t m_scroll_reg;
+ u16 m_voffs;
+ u16 m_scroll_reg;
tilemaplayer m_tm[3];
spritelayer m_sp;
@@ -156,13 +141,12 @@ private:
// technically this is just rom banking, allowing the chip to see more graphic ROM, however it's easier to handle it
// in the chip implementation than externally for now (which would require dynamic decoding of the entire charsets every
// time the bank was changed)
- bool m_gfxrom_is_banked;
bool m_gfxrom_bank_dirty; /* dirty flag of object bank (for Batrider) */
- uint16_t m_gfxrom_bank[8]; /* Batrider object bank */
- required_shared_ptr_array<uint16_t, 3> m_vram;
+ required_shared_ptr_array<u16, 3> m_vram;
required_device<buffered_spriteram16_device> m_spriteram;
+ gp9001_cb_delegate m_gp9001_cb;
devcb_write_line m_vint_out_cb;
emu_timer *m_raise_irq_timer;
};