summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/video/segaic16.h
blob: e563a354d2d2b3fa1aa72a4af9cc756157b2c2ba (plain) (tree)
1
2
3
4
5
6
7
8
9

                                




                                                                            

                             
 
            
 
                   

                    
                                                                                                                  
 
 

























                                                                                                 
 






                                                                                     

 
                                                
                                                                                             

       































































                                                                                                                                                                                     




                                                                                                                                                    
 
                                                                                                               
 
                        
                                                                                                                      
 



                                                  
 







                                                                                                                                                                       
                                                                                                                                                                                                                        
                                                                             
 
                                                         
                                                                                                                                                  
                                                          
 

                                                       
 


                                                                                       
 



                                            
 
                                                                                                                                            
 
                                                  
 



                                                          
 

                                                      


                                 

                                             


                         
                                                      

  
                                                       
 
                               
// license:BSD-3-Clause
// copyright-holders:Aaron Giles
/***************************************************************************

    Sega 16-bit common hardware

***************************************************************************/
#ifndef MAME_VIDEO_SEGAIC16_H
#define MAME_VIDEO_SEGAIC16_H

#pragma once

#include "emupal.h"
#include "tilemap.h"

typedef device_delegate<void (int, uint16_t*, uint16_t*, uint16_t*, uint16_t*)> segaic16_video_pagelatch_delegate;


//**************************************************************************
//  TYPE DEFINITIONS
//**************************************************************************


// ======================> sega_16bit_common_base

class sega_16bit_common_base : public driver_device
{
public:
	// palette helpers
	DECLARE_WRITE16_MEMBER( paletteram_w );
	DECLARE_WRITE16_MEMBER( hangon_paletteram_w );
	DECLARE_WRITE16_MEMBER( philko_paletteram_w );

protected:
	// construction/destruction
	sega_16bit_common_base(const machine_config &mconfig, device_type type, const char *tag);

	// internal helpers
	void palette_init();

public: // -- stupid system16.cpp
	// memory pointers
	required_shared_ptr<u16> m_paletteram;
protected:

	// internal state
	u32      m_palette_entries;          // number of palette entries
	u8       m_palette_normal[32];       // RGB translations for normal pixels
	u8       m_palette_shadow[32];       // RGB translations for shadowed pixels
	u8       m_palette_hilight[32];      // RGB translations for hilighted pixels
	required_device<palette_device> m_palette;
};


class segaic16_video_device :   public device_t,
								public device_video_interface
{
public:
	/* tilemap systems */
	static constexpr unsigned MAX_TILEMAPS       = 1;

	static constexpr unsigned TILEMAP_HANGON     = 0;
	static constexpr unsigned TILEMAP_16A        = 1;
	static constexpr unsigned TILEMAP_16B        = 2;
	static constexpr unsigned TILEMAP_16B_ALT    = 3;

	static constexpr unsigned TILEMAP_FOREGROUND = 0;
	static constexpr unsigned TILEMAP_BACKGROUND = 1;
	static constexpr unsigned TILEMAP_TEXT       = 2;



	/* rotation systems */
	static constexpr unsigned MAX_ROTATE         = 1;

	static constexpr unsigned ROTATE_YBOARD      = 0;



	struct tilemap_callback_info
	{
		uint16_t *        rambase;                        /* base of RAM for this tilemap page */
		const uint8_t *   bank;                           /* pointer to bank array */
		uint16_t          banksize;                       /* size of banks */
	};


	struct tilemap_info
	{
		uint8_t           index;                          /* index of this structure */
		uint8_t           type;                           /* type of tilemap (see segaic16.h for details) */
		uint8_t           numpages;                       /* number of allocated pages */
		uint8_t           flip;                           /* screen flip? */
		uint8_t           rowscroll, colscroll;           /* are rowscroll/colscroll enabled (if external enables are used) */
		uint8_t           bank[8];                        /* indexes of the tile banks */
		uint16_t          banksize;                       /* number of tiles per bank */
		uint16_t          latched_xscroll[4];             /* latched X scroll values */
		uint16_t          latched_yscroll[4];             /* latched Y scroll values */
		uint16_t          latched_pageselect[4];          /* latched page select values */
		int32_t           xoffs;                          /* X scroll offset */
		tilemap_t *     tilemaps[16];                   /* up to 16 tilemap pages */
		tilemap_t *     textmap;                        /* a single text tilemap */
		struct tilemap_callback_info tmap_info[16];     /* callback info for 16 tilemap pages */
		struct tilemap_callback_info textmap_info;      /* callback info for a single textmap page */
		void            (*reset)(screen_device &screen, struct tilemap_info *info);/* reset callback */
		void            (*draw_layer)(screen_device &screen, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int flags, int priority);
		uint16_t *        textram;                        /* pointer to textram pointer */
		uint16_t *        tileram;                        /* pointer to tileram pointer */
		emu_timer *     latch_timer;                    /* timer for latching 16b tilemap scroll values */
	};


	struct rotate_info
	{
		uint8_t           index;                          /* index of this structure */
		uint8_t           type;                           /* type of rotate system (see segaic16.h for details) */
		uint16_t          colorbase;                      /* base color index */
		int32_t           ramsize;                        /* size of rotate RAM */
		uint16_t *        rotateram;                      /* pointer to rotateram pointer */
		std::unique_ptr<uint16_t[]>        buffer;                         /* buffered data */
	};

	template <typename T> segaic16_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&decode_tag)
		: segaic16_video_device(mconfig, tag, owner, clock)
	{
		m_gfxdecode.set_tag(std::forward<T>(decode_tag));
	}

	segaic16_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);

	// configuration
	template <typename... T> void set_pagelatch_cb(T &&... args) { m_pagelatch_cb.set(std::forward<T>(args)...); }

	uint8_t m_display_enable;
	optional_shared_ptr<uint16_t> m_tileram;
	optional_shared_ptr<uint16_t> m_textram;
	optional_shared_ptr<uint16_t> m_rotateram;

	void tilemap_set_colscroll(int which, int enable);
	void tilemap_set_rowscroll(int which, int enable);
	void tilemap_set_flip(int which, int flip);
	void tilemap_set_bank(int which, int banknum, int offset);
	void tilemap_reset(screen_device &screen);
	void tilemap_draw(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int map, int priority, int priority_mark);
//  void tilemap_16b_draw_layer(screen_device &screen, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int flags, int priority);
//  void tilemap_16a_draw_layer(screen_device &screen, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, int which, int flags, int priority);
//  void draw_virtual_tilemap(screen_device &screen, struct tilemap_info *info, bitmap_ind16 &bitmap, const rectangle &cliprect, uint16_t pages, uint16_t xscroll, uint16_t yscroll, uint32_t flags, uint32_t priority);
//  void tilemap_16b_reset(screen_device &screen, struct tilemap_info *info);

	segaic16_video_pagelatch_delegate m_pagelatch_cb;
	void tilemap_16b_fill_latch(int i, uint16_t* latched_pageselect, uint16_t* latched_yscroll, uint16_t* latched_xscroll, uint16_t* textram);
	TIMER_CALLBACK_MEMBER( tilemap_16b_latch_values );

	struct rotate_info m_rotate[MAX_ROTATE];
	struct tilemap_info m_bg_tilemap[MAX_TILEMAPS];

	void set_display_enable(int enable);
	void tilemap_init(int which, int type, int colorbase, int xoffs, int numbanks);
	void rotate_init(int which, int type, int colorbase);

	DECLARE_READ16_MEMBER( tileram_r );
	DECLARE_READ16_MEMBER( textram_r );
	DECLARE_WRITE16_MEMBER( tileram_w );
	DECLARE_WRITE16_MEMBER( textram_w );

	void rotate_draw(int which, bitmap_ind16 &bitmap, const rectangle &cliprect, bitmap_ind8 &priority_bitmap, bitmap_ind16 &srcbitmap);

	DECLARE_READ16_MEMBER( rotate_control_r );

	TILE_GET_INFO_MEMBER( tilemap_16b_tile_info );
	TILE_GET_INFO_MEMBER( tilemap_16b_text_info );
	TILE_GET_INFO_MEMBER( tilemap_16b_alt_tile_info );
	TILE_GET_INFO_MEMBER( tilemap_16b_alt_text_info );

	TILE_GET_INFO_MEMBER( tilemap_16a_tile_info );
	TILE_GET_INFO_MEMBER( tilemap_16a_text_info );

protected:
	// device-level overrides
	virtual void device_start() override;
	virtual void device_reset() override;

private:
	// internal state
	required_device<gfxdecode_device> m_gfxdecode;
};

DECLARE_DEVICE_TYPE(SEGAIC16VID, segaic16_video_device)

#endif // MAME_VIDEO_SEGAIC16_H