summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/includes/astrocde.h
blob: 8642e16d11b2c0076f913614e366a67202edc4ed (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11

                                                                               




                                                                            



                                
 
                        
                            
                              
                           
                          
                         
                   
                   
 
                                                
 



                                  

 


                                           





                                    

                                                                                          
                                            


                                                        
                                                        
                                        
                                          
                                            
                                                  

                                              
                                                 
                                          
           
 
                                              
                                                     
                                                                

                                                     
                                             
                                                
                                                  
                                                             

                                                            
                                          
 

                               



                              







                                                 
                                    
                                  




























                                                       


                                                      



                                                                     
                                                
                                                 

                                                
                                                   
                                                 





                                                         
                                                       
                                                      









                             
                                            
                                                              
                                     
                                                            

                                                                                                                
                                                 

                                                             


                                                                              
                            
                                
                                              
 
                                               
                                                           
 





                                                            

                                             
                                         

                                            


                                                              






                                                       
                                       
          
                                                                                                       
  



                                            


                                                                                          


















                                                  


                                                                                        



































                                                                                        



                                                                                          













                                                               
                                             

                                  

                                  
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria, Mike Coates, Frank Palazzolo, Aaron Giles
/***************************************************************************

    Bally Astrocade-based hardware

***************************************************************************/
#ifndef MAME_INCLUDES_ASTROCDE_H
#define MAME_INCLUDES_ASTROCDE_H

#pragma once

#include "cpu/z80/z80.h"
#include "machine/bankdev.h"
#include "machine/gen_latch.h"
#include "sound/astrocde.h"
#include "sound/samples.h"
#include "sound/votrax.h"
#include "emupal.h"
#include "screen.h"

#define ASTROCADE_CLOCK     (XTAL(14'318'181)/2)

#define AC_SOUND_PRESENT    (0x01)
#define AC_LIGHTPEN_INTS    (0x02)
#define AC_STARS            (0x04)
#define AC_MONITOR_BW       (0x08)


class astrocde_state : public driver_device
{
public:
	enum
	{
		TIMER_INTERRUPT_OFF,
		TIMER_SCANLINE
	};

	astrocde_state(const machine_config &mconfig, device_type type, const char *tag) :
		driver_device(mconfig, type, tag),
		m_maincpu(*this, "maincpu"),
		m_votrax(*this, "votrax"),
		m_astrocade_sound1(*this, "astrocade1"),
		m_videoram(*this, "videoram"),
		m_protected_ram(*this, "protected_ram"),
		m_nvram(*this, "nvram"),
		m_screen(*this, "screen"),
		m_palette(*this, "palette"),
		m_soundlatch(*this, "soundlatch"),
		m_bank4000(*this, "bank4000"),
		m_bank8000(*this, "bank8000"),
		m_handle(*this, "P%uHANDLE", 1U),
		m_interrupt_scanline(0xff)
	{ }

	required_device<cpu_device> m_maincpu;
	optional_device<votrax_sc01_device> m_votrax;
	optional_device<astrocade_io_device> m_astrocade_sound1;
	optional_shared_ptr<uint8_t> m_videoram;
	optional_shared_ptr<uint8_t> m_protected_ram;
	optional_shared_ptr<uint8_t> m_nvram;
	required_device<screen_device> m_screen;
	required_device<palette_device> m_palette;
	optional_device<generic_latch_8_device> m_soundlatch;
	optional_device<address_map_bank_device> m_bank4000;
	optional_memory_bank m_bank8000;
	optional_ioport_array<4> m_handle;

	uint8_t m_video_config;
	uint8_t m_sparkle[4];
	char m_totalword[256];
	char *m_totalword_ptr;
	char m_oldword[256];
	int m_plural;
	uint8_t m_ram_write_enable;
	uint8_t m_input_select;
	std::unique_ptr<uint8_t[]> m_sparklestar;
	uint8_t m_interrupt_enabl;
	uint8_t m_interrupt_vector;
	uint8_t m_interrupt_scanline;
	uint8_t m_vertical_feedback;
	uint8_t m_horizontal_feedback;
	emu_timer *m_scanline_timer;
	emu_timer *m_intoff_timer;
	uint8_t m_colors[8];
	uint8_t m_colorsplit;
	uint8_t m_bgdata;
	uint8_t m_vblank;
	uint8_t m_video_mode;
	uint8_t m_funcgen_expand_color[2];
	uint8_t m_funcgen_control;
	uint8_t m_funcgen_expand_count;
	uint8_t m_funcgen_rotate_count;
	uint8_t m_funcgen_rotate_data[4];
	uint8_t m_funcgen_shift_prev_data;
	uint8_t m_funcgen_intercept;
	uint16_t m_pattern_source;
	uint8_t m_pattern_mode;
	uint16_t m_pattern_dest;
	uint8_t m_pattern_skip;
	uint8_t m_pattern_width;
	uint8_t m_pattern_height;
	std::unique_ptr<uint16_t[]> m_profpac_videoram;
	uint16_t m_profpac_palette[16];
	uint8_t m_profpac_colormap[4];
	uint8_t m_profpac_intercept;
	uint8_t m_profpac_vispage;
	uint8_t m_profpac_readpage;
	uint8_t m_profpac_readshift;
	uint8_t m_profpac_writepage;
	uint8_t m_profpac_writemode;
	uint16_t m_profpac_writemask;
	uint8_t m_profpac_vw;
	DECLARE_WRITE8_MEMBER(protected_ram_enable_w);
	DECLARE_READ8_MEMBER(protected_ram_r);
	DECLARE_WRITE8_MEMBER(protected_ram_w);
	DECLARE_READ8_MEMBER(input_mux_r);
	template<int Coin> DECLARE_WRITE_LINE_MEMBER(coin_counter_w);
	template<int Bit> DECLARE_WRITE_LINE_MEMBER(sparkle_w);
	DECLARE_WRITE_LINE_MEMBER(gorf_sound_switch_w);
	DECLARE_WRITE8_MEMBER(profpac_banksw_w);
	DECLARE_WRITE8_MEMBER(demndrgn_banksw_w);
	DECLARE_READ8_MEMBER(video_register_r);
	DECLARE_WRITE8_MEMBER(video_register_w);
	DECLARE_WRITE8_MEMBER(astrocade_funcgen_w);
	DECLARE_WRITE8_MEMBER(expand_register_w);
	DECLARE_WRITE8_MEMBER(astrocade_pattern_board_w);
	DECLARE_WRITE8_MEMBER(profpac_page_select_w);
	DECLARE_READ8_MEMBER(profpac_intercept_r);
	DECLARE_WRITE8_MEMBER(profpac_screenram_ctrl_w);
	DECLARE_READ8_MEMBER(profpac_videoram_r);
	DECLARE_WRITE8_MEMBER(profpac_videoram_w);
	DECLARE_INPUT_CHANGED_MEMBER(spacezap_monitor);
	DECLARE_WRITE_LINE_MEMBER(lightpen_trigger_w);
	void init_profpac();
	void init_spacezap();
	void init_robby();
	void init_wow();
	void init_tenpindx();
	void init_seawolf2();
	void init_demndrgn();
	void init_ebases();
	void init_gorf();
	void init_astrocde();
	virtual void video_start() override;
	void astrocade_palette(palette_device &palette) const;
	DECLARE_VIDEO_START(profpac);
	void profpac_palette(palette_device &palette) const;
	uint32_t screen_update_astrocde(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
	uint32_t screen_update_profpac(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect);
	TIMER_CALLBACK_MEMBER(scanline_callback);
	inline int mame_vpos_to_astrocade_vpos(int scanline);
	void init_savestate();
	void astrocade_trigger_lightpen(uint8_t vfeedback, uint8_t hfeedback);
	inline void increment_source(uint8_t curwidth, uint8_t *u13ff);
	inline void increment_dest(uint8_t curwidth);
	void execute_blit();
	void init_sparklestar();
	virtual void machine_start() override;

	DECLARE_WRITE8_MEMBER(votrax_speech_w);
	DECLARE_READ_LINE_MEMBER( votrax_speech_status_r );

	void astrocade_base(machine_config &config);
	void astrocade_16color_base(machine_config &config);
	void astrocade_mono_sound(machine_config &config);
	void astrocade_stereo_sound(machine_config &config);
	void spacezap(machine_config &config);
	void gorf(machine_config &config);
	void profpac(machine_config &config);
	void robby(machine_config &config);
	void wow(machine_config &config);
	void bank4000_map(address_map &map);
	void demndrgn_map(address_map &map);
	void port_map(address_map &map);
	void port_map_16col_pattern(address_map &map);
	void port_map_16col_pattern_nosound(address_map &map);
	void port_map_mono_pattern(address_map &map);
	void port_map_stereo_pattern(address_map &map);
	void profpac_bank4000_map(address_map &map);
	void profpac_map(address_map &map);
	void robby_map(address_map &map);
	void seawolf2_map(address_map &map);
	void spacezap_map(address_map &map);
	void wow_map(address_map &map);
protected:
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;
};

class seawolf2_state : public astrocde_state
{
public:
	seawolf2_state(const machine_config &mconfig, device_type type, const char *tag) :
		astrocde_state(mconfig, type, tag),
		m_samples(*this, "samples")
	{ }

	void seawolf2(machine_config &config);
private:
	DECLARE_WRITE8_MEMBER(sound_1_w);
	DECLARE_WRITE8_MEMBER(sound_2_w);

	void port_map_discrete(address_map &map);

	virtual void machine_start() override;

	required_device<samples_device> m_samples;
	uint8_t m_port_1_last;
	uint8_t m_port_2_last;
};

class ebases_state : public astrocde_state
{
public:
	ebases_state(const machine_config &mconfig, device_type type, const char *tag) :
		astrocde_state(mconfig, type, tag),
		m_trackball(*this, {"TRACKX2", "TRACKY2", "TRACKX1", "TRACKY1"})
	{ }

	void ebases(machine_config &config);
	DECLARE_CUSTOM_INPUT_MEMBER(trackball_r);
private:
	DECLARE_WRITE8_MEMBER(trackball_select_w);
	DECLARE_WRITE8_MEMBER(coin_w);

	void ebases_map(address_map &map);
	void port_map_ebases(address_map &map);

	required_ioport_array<4> m_trackball;
};

class demndrgn_state : public astrocde_state
{
public:
	demndrgn_state(const machine_config &mconfig, device_type type, const char *tag)
		: astrocde_state(mconfig, type, tag)
		, m_joystick(*this, {"MOVEX", "MOVEY"})
	{ }

	void demndrgn(machine_config &config);
	DECLARE_CUSTOM_INPUT_MEMBER(joystick_r);
private:
	DECLARE_WRITE_LINE_MEMBER(input_select_w);
	DECLARE_WRITE8_MEMBER(sound_w);

	void port_map_16col_pattern_demndrgn(address_map &map);

	required_ioport_array<2> m_joystick;
};

class tenpindx_state : public astrocde_state
{
public:
	tenpindx_state(const machine_config &mconfig, device_type type, const char *tag) :
		astrocde_state(mconfig, type, tag),
		m_subcpu(*this, "sub"),
		m_lamps(*this, "lamp%u", 0U)
	{ }

	void tenpindx(machine_config &config);
private:
	DECLARE_WRITE8_MEMBER(lamp_w);
	DECLARE_WRITE8_MEMBER(counter_w);
	DECLARE_WRITE8_MEMBER(lights_w);

	virtual void machine_start() override;

	void port_map_16col_pattern_tenpindx(address_map &map);
	void sub_io_map(address_map &map);
	void sub_map(address_map &map);

	required_device<z80_device> m_subcpu;
	output_finder<19> m_lamps;
};

#endif // MAME_INCLUDES_ASTROCDE_H