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



                            
                          



                            
                         





                             

                                                    








                                                                    








                     





                                                                     




 

                                                                                                                                      
 
                                                                                                   
 
           








                                                                                                                                             
                





                                                                       
           



                         
             





                             




                               

                         



                                                                    
                         

  



                                       
                                                                                    

























                                                                                                                     


                                                    
            
 
                                                                                                      


                         
 










                                                   
                                       
                                            


                                                   
































                                                 



























































                                                                                         








                                           
                                               
                                                                                                                                                     




































                                                      

                                             
          
                                                                                                       




                                                               







                                                              

                                              
                                             






                                                  
                                            



                                                   







                                                

                                                  
 

                                                                                                                





                                                                                                     














                                                                                                                                 






                          


















                               
                                      
                          

                          



                                





                                              
                            
 





















                            
                           

                                              

  
                           
// license:BSD-3-Clause
// copyright-holders:David Haywood

#include "machine/6821pia.h"
#include "machine/6840ptm.h"
#include "machine/nvram.h"
#include "machine/timer.h"

#include "cpu/m6809/m6809.h"
#include "sound/ay8910.h"
#include "sound/okim6376.h"
#include "sound/ym2413.h"
#include "sound/upd7759.h"
#include "machine/steppers.h"
#include "machine/roc10937.h"
#include "machine/meters.h"


#define MPU4_MASTER_CLOCK           XTAL(6'880'000)
#define VIDEO_MASTER_CLOCK          XTAL(10'000'000)


#ifdef MAME_DEBUG
#define MPU4VIDVERBOSE 1
#else
#define MPU4VIDVERBOSE 0
#endif

#define LOGSTUFF(x) do { if (MPU4VIDVERBOSE) logerror x; } while (0)



#ifdef MAME_DEBUG
#define MPU4VERBOSE 1
#else
#define MPU4VERBOSE 0
#endif

#define LOG(x)  do { if (MPU4VERBOSE) logerror x; } while (0)
#define LOG_CHR(x)  do { if (MPU4VERBOSE) logerror x; } while (0)
#define LOG_CHR_FULL(x) do { if (MPU4VERBOSE) logerror x; } while (0)
#define LOG_IC3(x)  do { if (MPU4VERBOSE) logerror x; } while (0)
#define LOG_IC8(x)  do { if (MPU4VERBOSE) logerror x; } while (0)
#define LOG_SS(x)   do { if (MPU4VERBOSE) logerror x; } while (0)





static const uint8_t reel_mux_table[8]= {0,4,2,6,1,5,3,7};//include 7, although I don't think it's used, this is basically a wire swap
static const uint8_t reel_mux_table7[8]= {3,1,5,6,4,2,0,7};

static const uint8_t bwb_chr_table_common[10]= {0x00,0x04,0x04,0x0c,0x0c,0x1c,0x14,0x2c,0x5c,0x2c};

//reel info
#define STANDARD_REEL  0    // As originally designed 3/4 reels
#define FIVE_REEL_5TO8 1    // Interfaces to meter port, allows some mechanical metering, but there is significant 'bounce' in the extra reel
#define FIVE_REEL_8TO5 2    // Mounted backwards for space reasons, but different board
#define FIVE_REEL_3TO6 3    // Connected to the centre of the meter connector, taking up meters 3 to 6
#define SIX_REEL_1TO8  4    // Two reels on the meter drives
#define SIX_REEL_5TO8  5    // Like FIVE_REEL_5TO8, but with an extra reel elsewhere
#define SEVEN_REEL     6    // Mainly club machines, significant reworking of reel hardware
#define FLUTTERBOX     7    // Will you start the fans, please!  A fan using a reel mux-like setup, but not actually a reel

//Lamp extension
#define NO_EXTENDER         0 // As originally designed
#define SMALL_CARD          1
#define LARGE_CARD_A        2 //96 Lamps
#define LARGE_CARD_B        3 //96 Lamps, 16 LEDs - as used by BwB
#define LARGE_CARD_C        4 //Identical to B, no built in LED support

//LED cards
#define CARD_A          1
#define CARD_B          2
#define CARD_C          3

//Hopper info
#define TUBES               0
#define HOPPER_DUART_A      1
#define HOPPER_DUART_B      2
#define HOPPER_DUART_C      3
#define HOPPER_NONDUART_A   4
#define HOPPER_NONDUART_B   5

/* Lookup table for CHR data */

struct mpu4_chr_table
{
	uint8_t call;
	uint8_t response;
};

struct bwb_chr_table//dynamically populated table for BwB protection
{
	uint8_t response;
};


class mpu4_state : public driver_device
{
public:
	mpu4_state(const machine_config &mconfig, device_type type, const char *tag)
		: driver_device(mconfig, type, tag)
		, m_maincpu(*this, "maincpu")
		, m_vfd(*this, "vfd")
		, m_6840ptm(*this, "ptm_ic2")
		, m_pia3(*this, "pia_ic3")
		, m_pia4(*this, "pia_ic4")
		, m_pia5(*this, "pia_ic5")
		, m_pia6(*this, "pia_ic6")
		, m_pia7(*this, "pia_ic7")
		, m_pia8(*this, "pia_ic8")
		, m_port_mux(*this, {"ORANGE1", "ORANGE2", "BLACK1", "BLACK2", "ORANGE1", "ORANGE2", "DIL1", "DIL2"})
		, m_aux1_port(*this, "AUX1")
		, m_aux2_port(*this, "AUX2")
		, m_bank1(*this, "bank1")
		, m_msm6376(*this, "msm6376")
		, m_reel0(*this, "reel0")
		, m_reel1(*this, "reel1")
		, m_reel2(*this, "reel2")
		, m_reel3(*this, "reel3")
		, m_reel4(*this, "reel4")
		, m_reel5(*this, "reel5")
		, m_reel6(*this, "reel6")
		, m_reel7(*this, "reel7")
		, m_palette(*this, "palette")
		, m_meters(*this, "meters")
		, m_lamps(*this, "lamp%u", 0U)
		, m_mpu4leds(*this, "mpu4led%u", 0U)
		, m_digits(*this, "digit%u", 0U)
		, m_triacs(*this, "triac%u", 0U)
	 { }

	uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect)
	{
		return 0;
	}

	DECLARE_WRITE8_MEMBER(bankswitch_w);
	DECLARE_READ8_MEMBER(bankswitch_r);
	DECLARE_WRITE8_MEMBER(bankset_w);
	DECLARE_WRITE8_MEMBER(characteriser_w);
	DECLARE_READ8_MEMBER(characteriser_r);
	DECLARE_WRITE8_MEMBER(bwb_characteriser_w);
	DECLARE_READ8_MEMBER(bwb_characteriser_r);
	DECLARE_WRITE8_MEMBER(mpu4_ym2413_w);
	DECLARE_READ8_MEMBER(mpu4_ym2413_r);
	DECLARE_READ8_MEMBER(crystal_sound_r);
	DECLARE_WRITE8_MEMBER(crystal_sound_w);
	DECLARE_WRITE8_MEMBER(ic3ss_w);
	DECLARE_WRITE_LINE_MEMBER(cpu0_irq);
	DECLARE_WRITE_LINE_MEMBER(ic2_o1_callback);
	DECLARE_WRITE_LINE_MEMBER(ic2_o2_callback);
	DECLARE_WRITE_LINE_MEMBER(ic2_o3_callback);
	DECLARE_WRITE8_MEMBER(pia_ic3_porta_w);
	DECLARE_WRITE8_MEMBER(pia_ic3_portb_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic3_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic3_cb2_w);
	DECLARE_WRITE8_MEMBER(pia_ic4_porta_w);
	DECLARE_WRITE8_MEMBER(pia_ic4_portb_w);
	DECLARE_READ8_MEMBER(pia_ic4_portb_r);
	DECLARE_WRITE_LINE_MEMBER(pia_ic4_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic4_cb2_w);
	DECLARE_READ8_MEMBER(pia_ic5_porta_r);
	DECLARE_WRITE8_MEMBER(pia_ic5_porta_w);
	DECLARE_WRITE8_MEMBER(pia_ic5_portb_w);
	DECLARE_READ8_MEMBER(pia_ic5_portb_r);
	DECLARE_WRITE_LINE_MEMBER(pia_ic5_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic5_cb2_w);
	DECLARE_WRITE8_MEMBER(pia_ic6_portb_w);
	DECLARE_WRITE8_MEMBER(pia_ic6_porta_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic6_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic6_cb2_w);
	DECLARE_WRITE8_MEMBER(pia_ic7_porta_w);
	DECLARE_WRITE8_MEMBER(pia_ic7_portb_w);
	DECLARE_READ8_MEMBER(pia_ic7_portb_r);
	DECLARE_WRITE_LINE_MEMBER(pia_ic7_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic7_cb2_w);
	DECLARE_READ8_MEMBER(pia_ic8_porta_r);
	DECLARE_WRITE8_MEMBER(pia_ic8_portb_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic8_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_ic8_cb2_w);
	DECLARE_WRITE8_MEMBER(pia_gb_porta_w);
	DECLARE_WRITE8_MEMBER(pia_gb_portb_w);
	DECLARE_READ8_MEMBER(pia_gb_portb_r);
	DECLARE_WRITE_LINE_MEMBER(pia_gb_ca2_w);
	DECLARE_WRITE_LINE_MEMBER(pia_gb_cb2_w);
	void init_m4default_alt();
	void init_crystali();
	void init_m4tst2();
	void init_crystal();
	void init_m_frkstn();
	void init_m4default_big();
	void init_m4default();
	void init_m4default_banks();
	void init_m4default_reels();
	void init_m4_low_volt_alt();
	void init_m4_aux1_invert();
	void init_m4_aux2_invert();
	void init_m4_door_invert();
	void init_m4_five_reel_std();
	void init_m4_five_reel_rev();
	void init_m4_five_reel_alt();
	void init_m4_six_reel_std();
	void init_m4_six_reel_alt();
	void init_m4_seven_reel();
	void init_m4_small_extender();
	void init_m4_large_extender_a();
	void init_m4_large_extender_b();
	void init_m4_large_extender_c();
	void init_m4_hopper_tubes();
	void init_m4_hopper_duart_a();
	void init_m4_hopper_duart_b();
	void init_m4_hopper_duart_c();
	void init_m4_hopper_nonduart_a();
	void init_m4_hopper_nonduart_b();
	void init_m4_led_a();
	void init_m4_led_b();
	void init_m4_led_c();
	void init_m4_andycp10c();
	void init_m_blsbys();
	void init_m_oldtmr();
	void init_m4tst();
	void init_m_ccelbr();
	void init_m4gambal();
	void init_m4debug();
	void init_m4_showstring();
	void init_m4_showstring_mod4yam();
	void init_m4_debug_mod4yam();
	void init_m4_showstring_mod2();
	void init_m4_showstring_big();
	void init_connect4();
	void init_m4altreels();//legacy, will be removed once things are sorted out
	void init_m_grtecp();//legacy, will be removed once things are sorted out RE: CHR
	void init_m4tenten();
	void init_m4actbnk();
	void init_m4actclb();
	void init_m4actpak();
	void init_m4addr();
	void init_m4aao();
	void init_m4alladv();
	void init_m4alpha();
	void init_m4andycp();
	void init_m4andybt();
	void init_m4andyfh();
	void init_m4andyge();
	void init_m4apachg();
	DECLARE_MACHINE_START(mod2);
	DECLARE_MACHINE_RESET(mpu4);
	DECLARE_MACHINE_START(mpu4yam);
	DECLARE_MACHINE_START(mpu4oki);
	DECLARE_MACHINE_START(mpu4oki_alt);
	DECLARE_MACHINE_START(mod4oki_5r);
	DECLARE_MACHINE_START(mod2_alt);
	DECLARE_MACHINE_START(mpu4bwb);
	DECLARE_MACHINE_START(mpu4cry);
	TIMER_DEVICE_CALLBACK_MEMBER(gen_50hz);
	template <unsigned N> DECLARE_WRITE_LINE_MEMBER(reel_optic_cb) { if (state) m_optic_pattern |= (1 << N); else m_optic_pattern &= ~(1 << N); }
	void bwboki(machine_config &config);
	void mod2(machine_config &config);
	void mod2_alt(machine_config &config);
	void mod4oki(machine_config &config);
	void mod4oki_5r(machine_config &config);
	void mod4oki_alt(machine_config &config);
	void mod4yam(machine_config &config);
	void mpu4_common(machine_config &config);
	void mpu4_common2(machine_config &config);
	void mpu4crys(machine_config &config);
	void mpu4_std_3reel(machine_config &config);
	void mpu4_type2_3reel(machine_config &config);
	void mpu4_type3_3reel(machine_config &config);
	void mpu4_type4_3reel(machine_config &config);
	void mpu4_bwb_3reel(machine_config &config);
	void mpu4_std_4reel(machine_config &config);
	void mpu4_type2_4reel(machine_config &config);
	void mpu4_type3_4reel(machine_config &config);
	void mpu4_type4_4reel(machine_config &config);
	void mpu4_bwb_4reel(machine_config &config);
	void mpu4_std_5reel(machine_config &config);
	void mpu4_type2_5reel(machine_config &config);
	void mpu4_type3_5reel(machine_config &config);
	void mpu4_type4_5reel(machine_config &config);
	void mpu4_bwb_5reel(machine_config &config);
	void mpu4_std_6reel(machine_config &config);
	void mpu4_type2_6reel(machine_config &config);
	void mpu4_type3_6reel(machine_config &config);
	void mpu4_type4_6reel(machine_config &config);
	void mpu4_bwb_6reel(machine_config &config);
	void mpu4_std_7reel(machine_config &config);
	void mpu4_type2_7reel(machine_config &config);
	void mpu4_type3_7reel(machine_config &config);
	void mpu4_type4_7reel(machine_config &config);
	void mpu4_bwb_7reel(machine_config &config);
	void mpu4base(machine_config &config);

	void mpu4_6809_map(address_map &map);
	void mpu4_memmap(address_map &map);
protected:
	virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) override;

	void lamp_extend_small(int data);
	void lamp_extend_large(int data,int column,int active);
	void led_write_latch(int latch, int data, int column);
	void update_meters();
	void ic23_update();
	void ic24_output(int data);
	void ic24_setup();
	void update_ay(device_t *device);
	void mpu4_install_mod4yam_space(address_space &space);
	void mpu4_install_mod4oki_space(address_space &space);
	void mpu4_install_mod4bwb_space(address_space &space);
	void mpu4_config_common();

	required_device<cpu_device> m_maincpu;
	optional_device<rocvfd_device> m_vfd;
	optional_device<ptm6840_device> m_6840ptm;
	optional_device<pia6821_device> m_pia3;
	optional_device<pia6821_device> m_pia4;
	optional_device<pia6821_device> m_pia5;
	optional_device<pia6821_device> m_pia6;
	optional_device<pia6821_device> m_pia7;
	optional_device<pia6821_device> m_pia8;
	required_ioport_array<8> m_port_mux;
	required_ioport m_aux1_port;
	required_ioport m_aux2_port;
	optional_memory_bank m_bank1;
	optional_device<okim6376_device> m_msm6376;
	optional_device<stepper_device> m_reel0;
	optional_device<stepper_device> m_reel1;
	optional_device<stepper_device> m_reel2;
	optional_device<stepper_device> m_reel3;
	optional_device<stepper_device> m_reel4;
	optional_device<stepper_device> m_reel5;
	optional_device<stepper_device> m_reel6;
	optional_device<stepper_device> m_reel7;
	optional_device<palette_device> m_palette;
	required_device<meters_device> m_meters;

	// not all systems have this many lamps/LEDs/digits but the driver is too much of a mess to split up now

	// 0-63 are on PIA IC3 port A (always present)
	// 64-127 are on PIA IC3 port B (always present)
	// 128-132 136-140 144-148 152-156 160-164 168-172 176-180 184-188 are on small lamp extender
	// 128-255 are on large lamp externders
	output_finder<256> m_lamps;

	// 0-63 are on PIA IC4 port A (always present)
	// 0-143 are on card B (possibly incorrectly mapped?)
	// 64-127 are on card C
	// 0-127 are on large card B
	output_finder<144> m_mpu4leds;

	// 0-7 are on PIA IC4 port A with no LED extender
	// 0, 8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136 are on card B (possible incorrectly mapped?)
	// 8-15 are on card C
	// 8-9 are mapped to lamp lines for Connect 4
	// 0-15 are on large card B
	output_finder<144> m_digits;

	output_finder<8> m_triacs;

	enum
	{
		TIMER_IC24
	};

	int m_mod_number;
	int m_mmtr_data;
	int m_ay8913_address;
	int m_serial_data;
	int m_signal_50hz;
	int m_ic4_input_b;
	int m_aux1_input;
	int m_aux2_input;
	int m_IC23G1;
	int m_IC23G2A;
	int m_IC23G2B;
	int m_IC23GC;
	int m_IC23GB;
	int m_IC23GA;
	int m_prot_col;
	int m_lamp_col;
	int m_init_col;
	int m_reel_flag;
	int m_ic23_active;
	int m_led_lamp;
	int m_link7a_connected;
	int m_low_volt_detect_disable;
	int m_aux1_invert;
	int m_aux2_invert;
	int m_door_invert;
	emu_timer *m_ic24_timer;
	int m_expansion_latch;
	int m_global_volume;
	int m_input_strobe;
	uint8_t m_lamp_strobe;
	uint8_t m_lamp_strobe2;
	uint8_t m_lamp_strobe_ext;
	uint8_t m_lamp_strobe_ext_persistence;
	uint8_t m_led_strobe;
	uint8_t m_ay_data;
	int m_optic_pattern;

	int m_active_reel;
	int m_remote_meter;
	int m_reel_mux;
	int m_lamp_extender;
	int m_last_b7;
	int m_last_latch;
	int m_lamp_sense;
	int m_card_live;
	int m_led_extender;
	int m_bwb_bank;
	int m_chr_state;
	int m_chr_counter;
	int m_chr_value;
	int m_bwb_return;
	int m_pageval;
	int m_pageset;
	int m_hopper;
	int m_reels;
	int m_chrdata;
	int m_t1;
	int m_t3l;
	int m_t3h;
	uint8_t m_numbanks;
	mpu4_chr_table* m_current_chr_table;
	const bwb_chr_table* m_bwb_chr_table1;
};

INPUT_PORTS_EXTERN( mpu4 );