summaryrefslogblamecommitdiffstatshomepage
path: root/src/mame/machine/galaxold.cpp
blob: c7a57bd1754a82fdb2f70fb4aaa13f5bc139f7ab (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11

                                    

                                                                            
              





                                                                            
                
                              
 
 
                                         
 
                                                 


                    
                              
                                                                

                                            
                                                  
                                    

 
                                                              

                                    
                                                                                

 
                                                        
 
                                            


 
                                                                      

                                       
                                                           

                                      
                                                               


                                      
                                                             


 
                                                   
 
                          
 
                                                                

                                 
 


                                 

                                                  
                                                                                  

 
                                             
 
                                             

 
                                             
 
                                
 
 
                                                          
 
                                                                 


 
                                                                         
 
                                                                    

 
                                                            
 
                                                               

 
                                                            
 
                                                               


 
                                                                 
 
                                      

 
                                                 
 
                                



                                 
                                                                      



                         
                                                 
 
                                


                                 
                                                                      




                         
                                               
 
                                   
                                            
                                                  

 
                                
 
                                                         
                                                    

                                  
                                        


                                                 
                                                                         
 

                                                                 
                                                       
 
                                      

 
                                     
 
                                          
                                                    
                                   




                                                                                     
                                        




                                                                                    
                                               



                                       
// license:BSD-3-Clause
// copyright-holders:Nicola Salmoria
/***************************************************************************

  galaxold.cpp

  Functions to emulate general aspects of the machine (RAM, ROM, interrupts,
  I/O ports)

***************************************************************************/

#include "emu.h"
#include "includes/galaxold.h"


uint8_t galaxold_state::hunchbkg_intack()
{
	m_maincpu->set_input_line(0, CLEAR_LINE);
	return 0x03;
}

/* FIXME: remove trampoline */
WRITE_LINE_MEMBER(galaxold_state::galaxold_7474_9m_2_q_callback)
{
	/* Q bar clocks the other flip-flop,
	   Q is VBLANK (not visible to the CPU) */
	m_7474_9m_1->clock_w(state);
}

WRITE_LINE_MEMBER(galaxold_state::galaxold_7474_9m_1_callback)
{
	/* Q goes to the NMI line */
	m_maincpu->set_input_line(m_irq_line, state ? CLEAR_LINE : ASSERT_LINE);
}

void galaxold_state::galaxold_nmi_enable_w(uint8_t data)
{
	m_7474_9m_1->preset_w(data ? 1 : 0);
}


TIMER_DEVICE_CALLBACK_MEMBER(galaxold_state::galaxold_interrupt_timer)
{
	/* 128V, 64V and 32V go to D */
	m_7474_9m_2->d_w(((param & 0xe0) != 0xe0) ? 1 : 0);

	/* 16V clocks the flip-flop */
	m_7474_9m_2->clock_w(((param & 0x10) == 0x10) ? 1 : 0);

	param = (param + 0x10) & 0xff;

	timer.adjust(m_screen->time_until_pos(param), param);
}


void galaxold_state::machine_reset_common(int line)
{
	m_irq_line = line;

	/* initialize main CPU interrupt generator flip-flops */
	m_7474_9m_2->preset_w(1);
	m_7474_9m_2->clear_w (1);

	m_7474_9m_1->clear_w (1);
	m_7474_9m_1->d_w     (0);
	m_7474_9m_1->preset_w(0);

	/* start a timer to generate interrupts */
	subdevice<timer_device>("int_timer")->adjust(m_screen->time_until_pos(0));
}

MACHINE_RESET_MEMBER(galaxold_state,galaxold)
{
	machine_reset_common(INPUT_LINE_NMI);
}

MACHINE_RESET_MEMBER(galaxold_state,hunchbkg)
{
	machine_reset_common(0);
}

void galaxold_state::galaxold_coin_lockout_w(uint8_t data)
{
	machine().bookkeeping().coin_lockout_global_w(~data & 1);
}


void galaxold_state::galaxold_coin_counter_w(offs_t offset, uint8_t data)
{
	machine().bookkeeping().coin_counter_w(offset, data & 0x01);
}

void galaxold_state::galaxold_coin_counter_1_w(uint8_t data)
{
	machine().bookkeeping().coin_counter_w(1, data & 0x01);
}

void galaxold_state::galaxold_coin_counter_2_w(uint8_t data)
{
	machine().bookkeeping().coin_counter_w(2, data & 0x01);
}


void galaxold_state::galaxold_leds_w(offs_t offset, uint8_t data)
{
	m_leds[offset] = BIT(data, 0);
}

uint8_t galaxold_state::scramblb_protection_1_r()
{
	switch (m_maincpu->pc())
	{
	case 0x01da: return 0x80;
	case 0x01e4: return 0x00;
	default:
		logerror("%04x: read protection 1\n",m_maincpu->pc());
		return 0;
	}
}

uint8_t galaxold_state::scramblb_protection_2_r()
{
	switch (m_maincpu->pc())
	{
	case 0x01ca: return 0x90;
	default:
		logerror("%04x: read protection 2\n",m_maincpu->pc());
		return 0;
	}
}


void galaxold_state::_4in1_bank_w(uint8_t data)
{
	m__4in1_bank = data & 0x03;
	galaxold_gfxbank_w(0, m__4in1_bank);
	membank("bank1")->set_entry(m__4in1_bank);
}

void galaxold_state::init_4in1()
{
	const offs_t len = memregion("maincpu")->bytes();
	uint8_t *RAM = memregion("maincpu")->base();

	/* Decrypt Program Roms */
	for (offs_t i = 0; i < len; i++)
		RAM[i] = RAM[i] ^ (i & 0xff);

	/* games are banked at 0x0000 - 0x3fff */
	membank("bank1")->configure_entries(0, 4, &RAM[0x10000], 0x4000);

	std::fill(std::begin(m_gfxbank), std::end(m_gfxbank), 0);

	_4in1_bank_w(0); /* set the initial CPU bank */

	save_item(NAME(m__4in1_bank));
}

void galaxold_state::init_bullsdrtg()
{
	// patch char supposed to be space
	uint8_t *gfxrom = memregion("gfx1")->base();
	for (int i = 0; i < 8; i++)
	{
		gfxrom[i] = 0;
	}

	// patch gfx for charset (seems to be 1bpp with bitplane data in correct rom)
	for (int i = 0*8; i < 27*8; i++)
	{
		gfxrom[0x1000 + i] = 0;
	}

	// patch gfx for digits (seems to be 1bpp with bitplane data in correct rom)
	for (int i = 48*8; i < (48+10)*8; i++ )
	{
		gfxrom[0x1000 + i] = 0;
	}
}