summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/gb_lcd.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/video/gb_lcd.h')
-rw-r--r--src/mame/video/gb_lcd.h215
1 files changed, 215 insertions, 0 deletions
diff --git a/src/mame/video/gb_lcd.h b/src/mame/video/gb_lcd.h
new file mode 100644
index 00000000000..31bd0c30403
--- /dev/null
+++ b/src/mame/video/gb_lcd.h
@@ -0,0 +1,215 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol
+/*****************************************************************************
+ *
+ * video/gb_lcd.h
+ *
+ ****************************************************************************/
+
+#ifndef __GB_LCD_H__
+#define __GB_LCD_H__
+
+#include "emu.h"
+
+
+#define _NR_GB_VID_REGS 0x40
+
+
+struct layer_struct {
+ UINT8 enabled;
+ UINT8 *bg_tiles;
+ UINT8 *bg_map;
+ UINT8 xindex;
+ UINT8 xshift;
+ UINT8 xstart;
+ UINT8 xend;
+ /* GBC specific */
+ UINT8 *gbc_map;
+ INT16 bgline;
+};
+
+
+class gb_lcd_device : public device_t,
+ public device_video_interface
+{
+public:
+ gb_lcd_device(const machine_config &mconfig, device_type type, const char *name, const char *tag, device_t *owner, UINT32 clock, const char *shortname, const char *source);
+ gb_lcd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+
+ UINT32 screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
+
+ DECLARE_READ8_MEMBER(vram_r);
+ DECLARE_WRITE8_MEMBER(vram_w);
+ DECLARE_READ8_MEMBER(oam_r);
+ DECLARE_WRITE8_MEMBER(oam_w);
+ virtual DECLARE_READ8_MEMBER(video_r);
+ virtual DECLARE_WRITE8_MEMBER(video_w);
+
+ // FIXME: remove it when proper sgb support is added
+ void set_sgb_hack(bool val) { m_sgb_border_hack = val ? 1 : 0; }
+
+protected:
+ inline void plot_pixel(bitmap_ind16 &bitmap, int x, int y, UINT32 color);
+
+ void select_sprites();
+ virtual void update_sprites();
+ virtual void update_scanline();
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+ void common_start();
+ void common_reset();
+
+ // pointer to the main system
+ cpu_device *m_maincpu;
+
+ // state variables
+ bitmap_ind16 m_bitmap;
+
+ UINT8 m_sgb_atf_data[4050]; /* (SGB) Attributes files */
+ UINT32 m_sgb_atf;
+ UINT16 m_sgb_pal_data[4096];
+ UINT8 m_sgb_pal_map[20][18];
+ UINT16 m_sgb_pal[128];
+ UINT8 *m_sgb_tile_data;
+ UINT8 m_sgb_tile_map[2048];
+ UINT8 m_sgb_window_mask;
+
+ // this is temporarily needed for a bunch of games which draw the border differently...
+ int m_sgb_border_hack;
+
+ int m_window_lines_drawn;
+
+ UINT8 m_vid_regs[_NR_GB_VID_REGS];
+ UINT8 m_bg_zbuf[160];
+
+ UINT16 m_cgb_bpal[32]; /* CGB current background palette table */
+ UINT16 m_cgb_spal[32]; /* CGB current sprite palette table */
+
+ UINT8 m_gb_bpal[4]; /* Background palette */
+ UINT8 m_gb_spal0[4]; /* Sprite 0 palette */
+ UINT8 m_gb_spal1[4]; /* Sprite 1 palette */
+
+ /* Things used to render current line */
+ int m_current_line; /* Current line */
+ int m_cmp_line; /* Compare line */
+ int m_sprCount; /* Number of sprites on current line */
+ int m_sprite[10]; /* References to sprites to draw on current line */
+ int m_previous_line; /* Previous line we've drawn in */
+ int m_start_x; /* Pixel to start drawing from (inclusive) */
+ int m_end_x; /* Pixel to end drawing (exclusive) */
+ int m_mode; /* Keep track of internal STAT mode */
+ int m_state; /* Current state of the video state machine */
+ int m_lcd_irq_line;
+ int m_triggering_line_irq;
+ int m_line_irq;
+ int m_triggering_mode_irq;
+ int m_mode_irq;
+ int m_delayed_line_irq;
+ int m_sprite_cycles;
+ int m_scrollx_adjust;
+ int m_oam_locked;
+ int m_vram_locked;
+ int m_pal_locked;
+ int m_hdma_enabled;
+ int m_hdma_possible;
+ struct layer_struct m_layer[2];
+ emu_timer *m_lcd_timer;
+ int m_gbc_mode;
+
+ UINT8 *m_vram; // Pointer to VRAM
+ UINT8 *m_oam; // Pointer to OAM memory
+ UINT8 m_gb_tile_no_mod;
+ UINT32 m_gb_chrgen_offs; // GB Character generator
+ UINT32 m_gb_bgdtab_offs; // GB Background character table
+ UINT32 m_gb_wndtab_offs; // GB Window character table
+ UINT32 m_gbc_chrgen_offs; // CGB Character generator
+ UINT32 m_gbc_bgdtab_offs; // CGB Background character table
+ UINT32 m_gbc_wndtab_offs; // CGB Window character table
+ int m_vram_bank;
+
+ TIMER_CALLBACK_MEMBER(video_init_vbl);
+ virtual TIMER_CALLBACK_MEMBER(lcd_timer_proc);
+ virtual void videoptr_restore();
+ void save_gb_video();
+ void increment_scanline();
+ void lcd_switch_on();
+};
+
+
+class mgb_lcd_device : public gb_lcd_device
+{
+public:
+ mgb_lcd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+protected:
+
+ // device-level overrides
+ virtual void device_start();
+};
+
+
+class sgb_lcd_device : public gb_lcd_device
+{
+public:
+ sgb_lcd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ void sgb_io_write_pal(int offs, UINT8 *data);
+
+protected:
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ virtual void update_sprites();
+ virtual void update_scanline();
+ void refresh_border();
+};
+
+
+class cgb_lcd_device : public gb_lcd_device
+{
+public:
+ cgb_lcd_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);
+
+ virtual DECLARE_READ8_MEMBER(video_r);
+ virtual DECLARE_WRITE8_MEMBER(video_w);
+
+protected:
+
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ virtual void update_sprites();
+ virtual void update_scanline();
+
+ virtual TIMER_CALLBACK_MEMBER(lcd_timer_proc);
+ virtual void videoptr_restore();
+ void hdma_trans(UINT16 length);
+};
+
+
+extern const device_type GB_LCD_DMG;
+extern const device_type GB_LCD_MGB;
+extern const device_type GB_LCD_SGB;
+extern const device_type GB_LCD_CGB;
+
+
+#define MCFG_GB_LCD_DMG_ADD(_tag ) \
+ MCFG_DEVICE_ADD( _tag, GB_LCD_DMG, 0 )
+
+#define MCFG_GB_LCD_MGB_ADD(_tag ) \
+ MCFG_DEVICE_ADD( _tag, GB_LCD_MGB, 0 )
+
+#define MCFG_GB_LCD_SGB_ADD(_tag ) \
+ MCFG_DEVICE_ADD( _tag, GB_LCD_SGB, 0 )
+
+#define MCFG_GB_LCD_CGB_ADD(_tag ) \
+ MCFG_DEVICE_ADD( _tag, GB_LCD_CGB, 0 )
+
+
+#endif /* GB_LCD_H_ */