summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/includes/vectrex.h
blob: 116b5d99e35a7a63656be197cd2a4cbf878b9cbb (plain) (tree)
1
2
3
4
5
6
7
8
9
                       
                                      




                                                                              

                               
 

            
                            
                      
                         
                         
 

                             
 

                   

                   
                                               

       










                                                  


                                                                                              
                                            

                                                        


                                                
                                          
                                                                                




                                                 
                                         
           
 































                                                                                                               
                                   



                                                         

                                  












                                                     

                            
                                      
                                 












                                        
                             


                           



                                      
                              
                                     
                      
                                                                                    
 
                                                    
                                                  
                                                
                                                
                                            




                                      
                                                
  
 



































                                                                                         
  
 
                                 
// license:BSD-3-Clause
// copyright-holders:Mathis Rosenhauer
/*****************************************************************************
 *
 * includes/vectrex.h
 *
 ****************************************************************************/
#ifndef MAME_INCLUDES_VECTREX_H
#define MAME_INCLUDES_VECTREX_H

#pragma once

#include "machine/6522via.h"
#include "sound/dac.h"
#include "sound/ay8910.h"
#include "video/vector.h"

#include "bus/vectrex/slot.h"
#include "bus/vectrex/rom.h"

#include "screen.h"

#define NVECT 10000

class vectrex_base_state : public driver_device
{
public:
	enum
	{
		TIMER_VECTREX_IMAGER_CHANGE_COLOR,
		TIMER_UPDATE_LEVEL,
		TIMER_VECTREX_IMAGER_EYE,
		TIMER_LIGHTPEN_TRIGGER,
		TIMER_VECTREX_REFRESH,
		TIMER_VECTREX_ZERO_INTEGRATORS,
		TIMER_UPDATE_SIGNAL
	};

protected:
	vectrex_base_state(const machine_config &mconfig, device_type type, const char *tag) :
		driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_cart(*this, "cartslot"),
		m_gce_vectorram(*this, "gce_vectorram"),
		m_via6522_0(*this, "via6522_0"),
		m_dac(*this, "dac"),
		m_ay8912(*this, "ay8912"),
		m_vector(*this, "vector"),
		m_io_contr(*this, {"CONTR1X", "CONTR1Y", "CONTR2X", "CONTR2Y"}),
		m_io_buttons(*this, "BUTTONS"),
		m_io_3dconf(*this, "3DCONF"),
		m_io_lpenconf(*this, "LPENCONF"),
		m_io_lpenx(*this, "LPENX"),
		m_io_lpeny(*this, "LPENY"),
		m_screen(*this, "screen")
	{ }

	DECLARE_WRITE8_MEMBER(vectrex_psg_port_w);
	DECLARE_READ8_MEMBER(vectrex_via_r);
	DECLARE_WRITE8_MEMBER(vectrex_via_w);
	virtual void driver_start() override;
	virtual void video_start() override;
	uint32_t screen_update_vectrex(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
	TIMER_CALLBACK_MEMBER(vectrex_imager_change_color);
	TIMER_CALLBACK_MEMBER(update_level);
	TIMER_CALLBACK_MEMBER(vectrex_imager_eye);
	TIMER_CALLBACK_MEMBER(lightpen_trigger);
	TIMER_CALLBACK_MEMBER(vectrex_refresh);
	TIMER_CALLBACK_MEMBER(vectrex_zero_integrators);
	TIMER_CALLBACK_MEMBER(update_signal);
	DECLARE_READ8_MEMBER(vectrex_via_pb_r);
	DECLARE_READ8_MEMBER(vectrex_via_pa_r);
	DECLARE_WRITE8_MEMBER(v_via_pb_w);
	DECLARE_WRITE8_MEMBER(v_via_pa_w);
	DECLARE_WRITE_LINE_MEMBER(v_via_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(v_via_cb2_w);
	DECLARE_DEVICE_IMAGE_LOAD_MEMBER(vectrex_cart);
	DECLARE_WRITE_LINE_MEMBER(vectrex_via_irq);

	void vectrex_base(machine_config &config);

	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;

	void configure_imager(bool reset_refresh, const double *imager_angles);
	void vectrex_configuration();
	void vectrex_multiplexer(int mux);
	void vectrex_add_point(int x, int y, rgb_t color, int intensity);
	void vectrex_add_point_stereo(int x, int y, rgb_t color, int intensity);

	unsigned char m_via_out[2];

	required_device<cpu_device> m_maincpu;
	optional_device<vectrex_cart_slot_device> m_cart;

	double m_imager_freq;
	emu_timer *m_imager_timer;
	emu_timer *m_lp_t;

private:
	struct vectrex_point
	{
		int x; int y;
		rgb_t col;
		int intensity;
	};

	required_shared_ptr<uint8_t> m_gce_vectorram;
	int m_imager_status;
	uint32_t m_beam_color;
	int m_lightpen_port;
	int m_reset_refresh;
	const double *m_imager_angles;
	rgb_t m_imager_colors[6];
	unsigned char m_imager_pinlevel;
	int m_old_mcontrol;
	double m_sl;
	double m_pwl;
	int m_x_center;
	int m_y_center;
	int m_x_max;
	int m_y_max;
	int m_x_int;
	int m_y_int;
	int m_lightpen_down;
	int m_pen_x;
	int m_pen_y;
	emu_timer *m_refresh;
	uint8_t m_blank;
	uint8_t m_ramp;
	int8_t m_analog[5];
	int m_point_index;
	int m_display_start;
	int m_display_end;
	vectrex_point m_points[NVECT];
	uint16_t m_via_timer2;
	attotime m_vector_start_time;
	uint8_t m_cb2;
	void (vectrex_base_state::*vector_add_point_function)(int, int, rgb_t, int);

	required_device<via6522_device> m_via6522_0;
	required_device<dac_byte_interface> m_dac;
	required_device<ay8910_device> m_ay8912;
	required_device<vector_device> m_vector;
	optional_ioport_array<4> m_io_contr;
	required_ioport m_io_buttons;
	required_ioport m_io_3dconf;
	required_ioport m_io_lpenconf;
	required_ioport m_io_lpenx;
	required_ioport m_io_lpeny;
	required_device<screen_device> m_screen;
};


class vectrex_state : public vectrex_base_state
{
public:
	vectrex_state(const machine_config &mconfig, device_type type, const char *tag) :
		vectrex_base_state(mconfig, type, tag)
	{ }

	void vectrex(machine_config &config);

protected:
	virtual void video_start() override;
	virtual void machine_start() override;

	void vectrex_map(address_map &map);
};


class raaspec_state : public vectrex_base_state
{
public:
	raaspec_state(const machine_config &mconfig, device_type type, const char *tag) :
		vectrex_base_state(mconfig, type, tag),
		m_io_coin(*this, "COIN")
	{ }

	void raaspec(machine_config &config);

protected:
	DECLARE_WRITE8_MEMBER(raaspec_led_w);
	DECLARE_READ8_MEMBER(vectrex_s1_via_pb_r);

	void raaspec_map(address_map &map);

private:
	required_ioport m_io_coin;
};

#endif // MAME_INCLUDES_VECTREX_H