diff options
Diffstat (limited to 'src/mame/video/gp9001.h')
-rw-r--r-- | src/mame/video/gp9001.h | 78 |
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; }; |