// license:BSD-3-Clause // copyright-holders:Mathis Rosenhauer // thanks-to:Eric Smith, Brad Oliver, Bernd Wiebelt, Aaron Giles, Andrew Caldwell #ifndef MAME_VIDEO_AVGDVG_H #define MAME_VIDEO_AVGDVG_H #pragma once #include "video/vector.h" #define MCFG_AVGDVG_VECTOR(_tag) \ downcast(*device).set_vector_tag(_tag); // ======================> avgdvg_device class avgdvg_device : public device_t { public: void set_vector_tag(const char *tag) { m_vector.set_tag(tag); } DECLARE_CUSTOM_INPUT_MEMBER(done_r); DECLARE_WRITE8_MEMBER(go_w); DECLARE_WRITE8_MEMBER(reset_w); DECLARE_WRITE16_MEMBER(go_word_w); DECLARE_WRITE16_MEMBER(reset_word_w); /* Tempest and Quantum use this capability */ void set_flip_x(int flip) { flip_x = flip; } void set_flip_y(int flip) { flip_y = flip; } TIMER_CALLBACK_MEMBER(vg_set_halt_callback); TIMER_CALLBACK_MEMBER(run_state_machine); protected: static constexpr unsigned MAXVECT = 10000; struct vgvector { int x; int y; rgb_t color; int intensity; int arg1; int arg2; int status; }; // construction/destruction avgdvg_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); void apply_flipping(int *x, int *y); void vg_set_halt(int dummy); void vg_flush(); void vg_add_point_buf(int x, int y, rgb_t color, int intensity); void vg_add_clip (int xmin, int ymin, int xmax, int ymax); void register_state(); uint8_t *avgdvg_vectorram; size_t avgdvg_vectorram_size; uint8_t *avgdvg_colorram; int xmin, xmax, ymin, ymax; int xcenter, ycenter; emu_timer *vg_run_timer, *vg_halt_timer; int flip_x, flip_y; int nvect; vgvector vectbuf[MAXVECT]; uint16_t m_pc; uint8_t m_sp; uint16_t m_dvx; uint16_t m_dvy; uint8_t m_dvy12; uint16_t m_timer; uint16_t m_stack[4]; uint16_t m_data; uint8_t m_state_latch; uint8_t m_int_latch; uint8_t m_scale; uint8_t m_bin_scale; uint8_t m_intensity; uint8_t m_color; uint8_t m_enspkl; uint8_t m_spkl_shift; uint8_t m_map; uint16_t m_hst; uint16_t m_lst; uint16_t m_izblank; uint8_t m_op; uint8_t m_halt; uint8_t m_sync_halt; uint16_t m_xdac_xor; uint16_t m_ydac_xor; int32_t m_xpos; int32_t m_ypos; int32_t m_clipx_min; int32_t m_clipy_min; int32_t m_clipx_max; int32_t m_clipy_max; virtual int handler_0() = 0; virtual int handler_1() = 0; virtual int handler_2() = 0; virtual int handler_3() = 0; virtual int handler_4() = 0; virtual int handler_5() = 0; virtual int handler_6() = 0; virtual int handler_7() = 0; virtual uint8_t state_addr() = 0; virtual void update_databus() = 0; virtual void vggo() = 0; virtual void vgrst() = 0; required_device m_vector; }; class dvg_device : public avgdvg_device { public: // construction/destruction dvg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); void dvg_draw_to(int x, int y, int intensity); protected: virtual int handler_0() override; virtual int handler_1() override; virtual int handler_2() override; virtual int handler_3() override; virtual int handler_4() override; virtual int handler_5() override; virtual int handler_6() override; virtual int handler_7() override; virtual uint8_t state_addr() override; virtual void update_databus() override; virtual void vggo() override; virtual void vgrst() override; virtual void device_start() override; }; // device type definition DECLARE_DEVICE_TYPE(DVG, dvg_device) class avg_device : public avgdvg_device { public: // construction/destruction avg_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); int avg_common_strobe1(); int avg_common_strobe2(); int avg_common_strobe3(); protected: avg_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock); virtual int handler_0() override; virtual int handler_1() override; virtual int handler_2() override; virtual int handler_3() override; virtual int handler_4() override; virtual int handler_5() override; virtual int handler_6() override; virtual int handler_7() override; virtual uint8_t state_addr() override; virtual void update_databus() override; virtual void vggo() override; virtual void vgrst() override; virtual void device_start() override; }; // device type definition DECLARE_DEVICE_TYPE(AVG, avg_device) class avg_tempest_device : public avg_device { public: // construction/destruction avg_tempest_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int handler_6() override; virtual int handler_7() override; //virtual void vggo(); }; // device type definition DECLARE_DEVICE_TYPE(AVG_TEMPEST, avg_tempest_device) class avg_mhavoc_device : public avg_device { public: // construction/destruction avg_mhavoc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int handler_1() override; virtual int handler_6() override; virtual int handler_7() override; virtual void update_databus() override; virtual void vgrst() override; }; // device type definition DECLARE_DEVICE_TYPE(AVG_MHAVOC, avg_mhavoc_device) class avg_starwars_device : public avg_device { public: // construction/destruction avg_starwars_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int handler_6() override; virtual int handler_7() override; virtual void update_databus() override; }; // device type definition DECLARE_DEVICE_TYPE(AVG_STARWARS, avg_starwars_device) class avg_quantum_device : public avg_device { public: // construction/destruction avg_quantum_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int handler_0() override; virtual int handler_1() override; virtual int handler_2() override; virtual int handler_3() override; virtual int handler_4() override; virtual int handler_5() override; virtual int handler_6() override; virtual int handler_7() override; virtual void update_databus() override; virtual void vggo() override; }; // device type definition DECLARE_DEVICE_TYPE(AVG_QUANTUM, avg_quantum_device) class avg_bzone_device : public avg_device { public: // construction/destruction avg_bzone_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int handler_1() override; virtual int handler_6() override; virtual int handler_7() override; }; // device type definition DECLARE_DEVICE_TYPE(AVG_BZONE, avg_bzone_device) class avg_tomcat_device : public avg_device { public: // construction/destruction avg_tomcat_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock); protected: virtual int handler_6() override; virtual int handler_7() override; }; // device type definition DECLARE_DEVICE_TYPE(AVG_TOMCAT, avg_tomcat_device) #endif // MAME_VIDEO_AVGDVG_H