// license:GPL-2.0+
// copyright-holders:Juergen Buchmueller
/***************************************************************************
Atari 400/800
GTIA graphics television interface adapter
Juergen Buchmueller, June 1998
***************************************************************************/
#ifndef MAME_VIDEO_GTIA_H
#define MAME_VIDEO_GTIA_H
#pragma once
// ======================> gtia_device
enum gtia_region : unsigned
{
GTIA_NTSC,
GTIA_PAL
};
class gtia_device : public device_t
{
public:
// construction/destruction
gtia_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
void set_region(gtia_region region) { m_region = region; }
auto read_callback() { return m_read_cb.bind(); }
auto write_callback() { return m_write_cb.bind(); }
DECLARE_READ8_MEMBER( read );
DECLARE_WRITE8_MEMBER( write );
uint16_t *get_color_lookup() { return m_color_lookup; }
void set_color_lookup(int i, uint16_t data) { m_color_lookup[i] = data; }
uint8_t get_w_colbk() { return m_w.colbk; }
uint8_t get_w_colpf1() { return m_w.colpf1; }
uint8_t get_w_colpf2() { return m_w.colpf2; }
uint8_t get_w_prior() { return m_w.prior; }
void count_hitclr_frames() { m_h.hitclr_frames++; }
void button_interrupt(int button_count, uint8_t button_port);
void render(uint8_t *src, uint8_t *dst, uint8_t *pmbits, uint8_t *prio);
protected:
// device-level overrides
virtual void device_start() override;
virtual void device_reset() override;
void gtia_postload();
int is_ntsc();
void recalc_p0();
void recalc_p1();
void recalc_p2();
void recalc_p3();
void recalc_m0();
void recalc_m1();
void recalc_m2();
void recalc_m3();
inline void player_render(uint8_t gfx, int size, uint8_t color, uint8_t *dst);
inline void missile_render(uint8_t gfx, int size, uint8_t color, uint8_t *dst);
private:
/* reading registers */
struct gtia_readregs
{
uint8_t m0pf; /* d000 missile 0 playfield collisions */
uint8_t m1pf; /* d001 missile 1 playfield collisions */
uint8_t m2pf; /* d002 missile 2 playfield collisions */
uint8_t m3pf; /* d003 missile 3 playfield collisions */
uint8_t p0pf; /* d004 player 0 playfield collisions */
uint8_t p1pf; /* d005 player 1 playfield collisions */
uint8_t p2pf; /* d006 player 2 playfield collisions */
uint8_t p3pf; /* d007 player 3 playfield collisions */
uint8_t m0pl; /* d008 missile 0 player collisions */
uint8_t m1pl; /* d009 missile 1 player collisions */
uint8_t m2pl; /* d00a missile 2 player collisions */
uint8_t m3pl; /* d00b missile 3 player collisions */
uint8_t p0pl; /* d00c player 0 player collisions */
uint8_t p1pl; /* d00d player 1 player collisions */
uint8_t p2pl; /* d00e player 2 player collisions */
uint8_t p3pl; /* d00f player 3 player collisions */
uint8_t but[4]; /* d010-d013 button stick 0-3 */
uint8_t pal; /* d014 PAL/NTSC config (D3,2,1 0=PAL, 1=NTSC */
uint8_t gtia15; /* d015 nothing */
uint8_t gtia16; /* d016 nothing */
uint8_t gtia17; /* d017 nothing */
uint8_t gtia18; /* d018 nothing */
uint8_t gtia19; /* d019 nothing */
uint8_t gtia1a; /* d01a nothing */
uint8_t gtia1b; /* d01b nothing */
uint8_t gtia1c; /* d01c nothing */
uint8_t gtia1d; /* d01d nothing */
uint8_t gtia1e; /* d01e nothing */
uint8_t cons; /* d01f console keys */
};
/* writing registers */
struct gtia_writeregs
{
uint8_t hposp0; /* d000 player 0 horz position */
uint8_t hposp1; /* d001 player 1 horz position */
uint8_t hposp2; /* d002 player 2 horz position */
uint8_t hposp3; /* d003 player 3 horz position */
uint8_t hposm0; /* d004 missile 0 horz position */
uint8_t hposm1; /* d005 missile 1 horz position */
uint8_t hposm2; /* d006 missile 2 horz position */
uint8_t hposm3; /* d007 missile 3 horz position */
uint8_t sizep0; /* d008 size player 0 */
uint8_t sizep1; /* d009 size player 1 */
uint8_t sizep2; /* d00a size player 2 */
uint8_t sizep3; /* d00b size player 3 */
uint8_t sizem; /* d00c size missiles */
uint8_t grafp0[2]; /* d00d graphics data for player 0 */
uint8_t grafp1[2]; /* d00e graphics data for player 1 */
uint8_t grafp2[2]; /* d00f graphics data for player 2 */
uint8_t grafp3[2]; /* d010 graphics data for player 3 */
uint8_t grafm[2]; /* d011 graphics data for missiles */
uint8_t colpm0; /* d012 color for player/missile 0 */
uint8_t colpm1; /* d013 color for player/missile 1 */
uint8_t colpm2; /* d014 color for player/missile 2 */
uint8_t colpm3; /* d015 color for player/missile 3 */
uint8_t colpf0; /* d016 playfield color 0 */
uint8_t colpf1; /* d017 playfield color 1 */
uint8_t colpf2; /* d018 playfield color 2 */
uint8_t colpf3; /* d019 playfield color 3 */
uint8_t colbk; /* d01a background playfield */
uint8_t prior; /* d01b priority select */
uint8_t vdelay; /* d01c delay until vertical retrace */
uint8_t gractl; /* d01d graphics control */
uint8_t hitclr; /* d01e clear collisions */
uint8_t cons; /* d01f write console (speaker) */
};
/* helpers */
struct gtia_helpervars
{
uint8_t grafp0; /* optimized graphics data player 0 */
uint8_t grafp1; /* optimized graphics data player 1 */
uint8_t grafp2; /* optimized graphics data player 2 */
uint8_t grafp3; /* optimized graphics data player 3 */
uint8_t grafm0; /* optimized graphics data missile 0 */
uint8_t grafm1; /* optimized graphics data missile 1 */
uint8_t grafm2; /* optimized graphics data missile 2 */
uint8_t grafm3; /* optimized graphics data missile 3 */
uint32_t hitclr_frames;/* frames gone since last hitclr */
uint8_t sizem; /* optimized size missiles */
uint8_t usedp; /* mask for used player colors */
uint8_t usedm0; /* mask for used missile 0 color */
uint8_t usedm1; /* mask for used missile 1 color */
uint8_t usedm2; /* mask for used missile 2 color */
uint8_t usedm3; /* mask for used missile 3 color */
uint8_t vdelay_m0; /* vertical delay for missile 0 */
uint8_t vdelay_m1; /* vertical delay for missile 1 */
uint8_t vdelay_m2; /* vertical delay for missile 2 */
uint8_t vdelay_m3; /* vertical delay for missile 3 */
uint8_t vdelay_p0; /* vertical delay for player 0 */
uint8_t vdelay_p1; /* vertical delay for player 1 */
uint8_t vdelay_p2; /* vertical delay for player 2 */
uint8_t vdelay_p3; /* vertical delay for player 3 */
};
gtia_readregs m_r;
gtia_writeregs m_w;
gtia_helpervars m_h;
gtia_region m_region;
uint8_t m_lumpf1;
uint8_t m_huepm0, m_huepm1, m_huepm2, m_huepm3, m_huepm4;
uint8_t m_huepf2, m_huebk;
uint16_t m_color_lookup[256]; // probably better fit to ANTIC, but it remains here for the moment...
devcb_read8 m_read_cb;
devcb_write8 m_write_cb;
};
// device type definition
DECLARE_DEVICE_TYPE(ATARI_GTIA, gtia_device)
#endif // MAME_VIDEO_GTIA_H