summaryrefslogtreecommitdiffstatshomepage
path: root/src/mame/atari/tia.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/mame/atari/tia.h')
-rw-r--r--src/mame/atari/tia.h245
1 files changed, 245 insertions, 0 deletions
diff --git a/src/mame/atari/tia.h b/src/mame/atari/tia.h
new file mode 100644
index 00000000000..c54650d3221
--- /dev/null
+++ b/src/mame/atari/tia.h
@@ -0,0 +1,245 @@
+// license:BSD-3-Clause
+// copyright-holders:Wilbert Pol,Stefan Jokisch
+#ifndef MAME_ATARI_TIA_H
+#define MAME_ATARI_TIA_H
+
+#pragma once
+
+#include "sound/tiaintf.h"
+
+//**************************************************************************
+// MACROS / CONSTANTS
+//**************************************************************************
+
+
+#define TIA_PALETTE_LENGTH 128 + 128 * 128
+#define TIA_INPUT_PORT_ALWAYS_ON 0
+#define TIA_INPUT_PORT_ALWAYS_OFF 0xff
+#define TIA_MAX_SCREEN_HEIGHT 342
+
+#define HMOVE_INACTIVE -200
+#define PLAYER_GFX_SLOTS 4
+// Per player graphic
+// - pixel number to start drawing from (0-7, from GRPx) / number of pixels drawn from GRPx
+// - display position to start drawing
+// - size to use
+struct player_gfx {
+ int start_pixel[PLAYER_GFX_SLOTS];
+ int start_drawing[PLAYER_GFX_SLOTS];
+ int size[PLAYER_GFX_SLOTS];
+ int skipclip[PLAYER_GFX_SLOTS];
+};
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+
+// ======================> tia_video_device
+
+class tia_video_device : public device_t, public device_video_interface, public device_palette_interface
+{
+public:
+ uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
+
+ auto read_input_port_callback() { return m_read_input_port_cb.bind(); }
+ auto databus_contents_callback() { return m_databus_contents_cb.bind(); }
+ auto vsync_callback() { return m_vsync_cb.bind(); }
+
+ uint8_t read(offs_t offset);
+ void write(offs_t offset, uint8_t data);
+
+protected:
+ // construction/destruction
+ tia_video_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
+
+ template <typename T> void set_tia_tag(T &&tag) { m_tia.set_tag(std::forward<T>(tag)); }
+
+ // device-level overrides
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
+
+ // device_palette_interface overrides
+ virtual uint32_t palette_entries() const noexcept override { return TIA_PALETTE_LENGTH; }
+
+ void extend_palette();
+ virtual void init_palette() = 0;
+ void draw_sprite_helper(uint8_t* p, uint8_t *col, struct player_gfx *gfx, uint8_t GRP, uint8_t COLUP, uint8_t REFP);
+ void draw_missile_helper(uint8_t* p, uint8_t* col, int horz, int skipdelay, int latch, int start, uint8_t RESMP, uint8_t ENAM, uint8_t NUSIZ, uint8_t COLUM);
+ void draw_playfield_helper(uint8_t* p, uint8_t* col, int horz, uint8_t COLU, uint8_t REFPF);
+ void draw_ball_helper(uint8_t* p, uint8_t* col, int horz, uint8_t ENAB);
+ void drawS0(uint8_t* p, uint8_t* col);
+ void drawS1(uint8_t* p, uint8_t* col);
+ void drawM0(uint8_t* p, uint8_t* col);
+ void drawM1(uint8_t* p, uint8_t* col);
+ void drawBL(uint8_t* p, uint8_t* col);
+ void drawPF(uint8_t* p, uint8_t *col);
+ int collision_check(uint8_t* p1, uint8_t* p2, int x1, int x2);
+ int current_x();
+ int current_y();
+ void setup_pXgfx(void);
+ void update_bitmap(int next_x, int next_y);
+ void WSYNC_w();
+ void VSYNC_w(uint8_t data);
+ void VBLANK_w(uint8_t data);
+ void CTRLPF_w(uint8_t data);
+ void HMP0_w(uint8_t data);
+ void HMP1_w(uint8_t data);
+ void HMM0_w(uint8_t data);
+ void HMM1_w(uint8_t data);
+ void HMBL_w(uint8_t data);
+ void HMOVE_w(uint8_t data);
+ void RSYNC_w();
+ void NUSIZ0_w(uint8_t data);
+ void NUSIZ1_w(uint8_t data);
+ void HMCLR_w(uint8_t data);
+ void CXCLR_w();
+ void RESP0_w();
+ void RESP1_w();
+ void RESM0_w();
+ void RESM1_w();
+ void RESBL_w();
+ void RESMP0_w(uint8_t data);
+ void RESMP1_w(uint8_t data);
+ void GRP0_w(uint8_t data);
+ void GRP1_w(uint8_t data);
+ uint8_t INPT_r(offs_t offset);
+
+
+private:
+ devcb_read16 m_read_input_port_cb;
+ devcb_read8 m_databus_contents_cb;
+ devcb_write16 m_vsync_cb;
+
+ required_device<cpu_device> m_maincpu;
+ required_device<tia_device> m_tia;
+
+ struct player_gfx p0gfx;
+ struct player_gfx p1gfx;
+
+ uint64_t frame_cycles;
+ uint64_t paddle_start;
+
+ int horzP0;
+ int horzP1;
+ int horzM0;
+ int horzM1;
+ int horzBL;
+ int motclkP0;
+ int motclkP1;
+ int motclkM0;
+ int motclkM1;
+ int motclkBL;
+ int startP0;
+ int startP1;
+ int startM0;
+ int startM1;
+ int skipclipP0;
+ int skipclipP1;
+ int skipM0delay;
+ int skipM1delay;
+
+ int current_bitmap;
+
+ int prev_x;
+ int prev_y;
+
+ uint8_t VSYNC;
+ uint8_t VBLANK;
+ uint8_t COLUP0;
+ uint8_t COLUP1;
+ uint8_t COLUBK;
+ uint8_t COLUPF;
+ uint8_t CTRLPF;
+ uint8_t GRP0;
+ uint8_t GRP1;
+ uint8_t REFP0;
+ uint8_t REFP1;
+ uint8_t HMP0;
+ uint8_t HMP1;
+ uint8_t HMM0;
+ uint8_t HMM1;
+ uint8_t HMBL;
+ uint8_t VDELP0;
+ uint8_t VDELP1;
+ uint8_t VDELBL;
+ uint8_t NUSIZ0;
+ uint8_t NUSIZ1;
+ uint8_t ENAM0;
+ uint8_t ENAM1;
+ uint8_t ENABL;
+ uint8_t CXM0P;
+ uint8_t CXM1P;
+ uint8_t CXP0FB;
+ uint8_t CXP1FB;
+ uint8_t CXM0FB;
+ uint8_t CXM1FB;
+ uint8_t CXBLPF;
+ uint8_t CXPPMM;
+ uint8_t RESMP0;
+ uint8_t RESMP1;
+ uint8_t PF0;
+ uint8_t PF1;
+ uint8_t PF2;
+ uint8_t INPT4;
+ uint8_t INPT5;
+
+ uint8_t prevGRP0;
+ uint8_t prevGRP1;
+ uint8_t prevENABL;
+
+ int HMOVE_started;
+ int HMOVE_started_previous;
+ uint8_t HMP0_latch;
+ uint8_t HMP1_latch;
+ uint8_t HMM0_latch;
+ uint8_t HMM1_latch;
+ uint8_t HMBL_latch;
+ uint8_t REFLECT; /* Should playfield be reflected or not */
+ uint8_t NUSIZx_changed;
+
+ bitmap_ind16 helper[2];
+ bitmap_rgb32 buffer;
+
+ uint16_t screen_height;
+
+ void register_save_state();
+};
+
+class tia_pal_video_device : public tia_video_device
+{
+public:
+ template <typename T> tia_pal_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&tia_tag)
+ : tia_pal_video_device(mconfig, tag, owner, clock)
+ {
+ set_tia_tag(std::forward<T>(tia_tag));
+ }
+
+ tia_pal_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void init_palette() override;
+};
+
+class tia_ntsc_video_device : public tia_video_device
+{
+public:
+ template <typename T> tia_ntsc_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock, T &&tia_tag)
+ : tia_ntsc_video_device(mconfig, tag, owner, clock)
+ {
+ set_tia_tag(std::forward<T>(tia_tag));
+ }
+
+ tia_ntsc_video_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
+
+protected:
+ virtual void init_palette() override;
+};
+
+
+// device type definition
+DECLARE_DEVICE_TYPE(TIA_PAL_VIDEO, tia_pal_video_device)
+DECLARE_DEVICE_TYPE(TIA_NTSC_VIDEO, tia_ntsc_video_device)
+
+#endif // MAME_ATARI_TIA_H