summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/video/gp9001.h
blob: d633ab828a8c4bf2be9b285582fe63d7736e08fd (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
/* GP9001 Video Controller */

struct gp9001layeroffsets
{
	int normal;
	int flipped;
};

struct gp9001layer
{
	UINT16 flip;
	UINT16 scrollx;
	UINT16 scrolly;

	gp9001layeroffsets extra_xoffset;
	gp9001layeroffsets extra_yoffset;

	UINT16* vram16; // vram for this layer
};

struct gp9001tilemaplayer : gp9001layer
{
	tilemap_t *tmap;
};

struct gp9001spritelayer : gp9001layer
{
	bool use_sprite_buffer;
	UINT16 *vram16_buffer; // vram buffer for this layer
};


class gp9001vdp_device : public device_t,
						  public device_memory_interface
{
public:
	gp9001vdp_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock);

	static void static_set_gfx_region(device_t &device, int gfxregion);

	UINT16 gp9001_voffs;
	UINT16 gp9001_scroll_reg;

	gp9001tilemaplayer bg, top, fg;
	gp9001spritelayer sp;

	int	   tile_region; // we also use this to figure out which vdp we're using in some debug logging features

	// 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)
	int gp9001_gfxrom_is_banked;
	int gp9001_gfxrom_bank_dirty;		/* dirty flag of object bank (for Batrider) */
	UINT16 gp9001_gfxrom_bank[8];		/* Batrider object bank */


	void draw_sprites( running_machine &machine, bitmap_t *bitmap, const rectangle *cliprect, const UINT8* primap );
	void gp9001_draw_custom_tilemap(running_machine& machine, bitmap_t* bitmap, tilemap_t* tilemap, const UINT8* priremap, const UINT8* pri_enable );
	void gp9001_render_vdp(running_machine& machine, bitmap_t* bitmap, const rectangle* cliprect);
	void gp9001_screen_eof(void);
	void create_tilemaps(int region);
	void init_scroll_regs(void);

	bitmap_t *custom_priority_bitmap;

protected:
	virtual bool device_validity_check(emu_options &options, const game_driver &driver) const;
	virtual void device_start();
	virtual void device_reset();

	virtual const address_space_config *memory_space_config(address_spacenum spacenum = AS_0) const;

	address_space_config		m_space_config;
	UINT8						m_gfxregion;
};

extern const device_type GP9001_VDP;

#define GP9001_BG_VRAM_SIZE   0x1000	/* Background RAM size */
#define GP9001_FG_VRAM_SIZE   0x1000	/* Foreground RAM size */
#define GP9001_TOP_VRAM_SIZE  0x1000	/* Top Layer  RAM size */
#define GP9001_SPRITERAM_SIZE 0x800	/* Sprite     RAM size */
#define GP9001_SPRITE_FLIPX 0x1000	/* Sprite flip flags */
#define GP9001_SPRITE_FLIPY 0x2000



/* vdp map 0, gfx region 0 */
#define MCFG_DEVICE_ADD_VDP0 \
	MCFG_DEVICE_ADD("gp9001vdp0", GP9001_VDP, 0) \
	gp9001vdp_device::static_set_gfx_region(*device, 0); \

/* vdp map 1, gfx region 2 */
#define MCFG_DEVICE_ADD_VDP1 \
	MCFG_DEVICE_ADD("gp9001vdp1", GP9001_VDP, 0) \
	gp9001vdp_device::static_set_gfx_region(*device, 2); \


// access to VDP
READ16_DEVICE_HANDLER( gp9001_vdp_r );
WRITE16_DEVICE_HANDLER( gp9001_vdp_w );
READ16_DEVICE_HANDLER( gp9001_vdp_alt_r );
WRITE16_DEVICE_HANDLER( gp9001_vdp_alt_w );
// this bootleg has strange access
READ16_DEVICE_HANDLER ( pipibibi_bootleg_videoram16_r );
WRITE16_DEVICE_HANDLER( pipibibi_bootleg_videoram16_w  );
READ16_DEVICE_HANDLER ( pipibibi_bootleg_spriteram16_r );
WRITE16_DEVICE_HANDLER( pipibibi_bootleg_spriteram16_w );
WRITE16_DEVICE_HANDLER( pipibibi_bootleg_scroll_w );