summaryrefslogblamecommitdiffstatshomepage
path: root/src/mess/machine/pp01.c
blob: 6a85659e7e9d103e26956a5f594983c9833a4cc8 (plain) (tree)
1
2
3
4
5
6
7
8
9








                                                                             
                          






                                                  
                                                                              
 
                                                    
                                      
 
                                        
                            
                                               



                                                             
                                               



                                                             
                                               


















                                                             
                                      


                                           
                                      


                                           
                                      



                                           
                                      


                                           
                                      


                                           
                                      


 
                                                         
 

                                                            






                                                
                                                                   

                                   
                                                                                                                                                  

                                              
                                                                                                                                                  

                                              
                                                                                                                                                  

                                              
                                                                                                                                                  

                                              
                                                                                                                                                  

                                              
                                                                                                                                                  


                                              
                                                                                           


                                              
                                                                                  
                                

                                                                   
                                                                                 

                                                   
                                                           


         
                                
 
              
                                       
                           
                                         
                                         





                                           
                                      



                                          
                                       

 
                                



 
                                            


 
                                            


 
                                           
 
                              
 
                                            
 
                              

 
                                           
 




                                                                                       
                                                                                                  
 
                                            




                                                    
                                            
 



                                                 

 
                                           


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

        PP-01 driver by Miodrag Milanovic

        08/09/2008 Preliminary driver.

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


#include "includes/pp01.h"


WRITE8_MEMBER(pp01_state::pp01_video_write_mode_w)
{
	m_video_write_mode = data & 0x0f;
}

void pp01_state::pp01_video_w(UINT8 block,UINT16 offset,UINT8 data,UINT8 part)
{
	UINT16 addroffset = part ? 0x1000  : 0x0000;
	UINT8 *ram = m_ram->pointer();

	if (BIT(m_video_write_mode,3)) {
		// Copy mode
		if(BIT(m_video_write_mode,0)) {
			ram[0x6000+offset+addroffset] = data;
		} else {
			ram[0x6000+offset+addroffset] = 0;
		}
		if(BIT(m_video_write_mode,1)) {
			ram[0xa000+offset+addroffset] = data;
		} else {
			ram[0xa000+offset+addroffset] = 0;
		}
		if(BIT(m_video_write_mode,2)) {
			ram[0xe000+offset+addroffset] = data;
		} else {
			ram[0xe000+offset+addroffset] = 0;
		}
	} else {
		if (block==0) {
			ram[0x6000+offset+addroffset] = data;
		}
		if (block==1) {
			ram[0xa000+offset+addroffset] = data;
		}
		if (block==2) {
			ram[0xe000+offset+addroffset] = data;
		}
	}
}

WRITE8_MEMBER(pp01_state::pp01_video_r_1_w)
{
	pp01_video_w(0,offset,data,0);
}
WRITE8_MEMBER(pp01_state::pp01_video_g_1_w)
{
	pp01_video_w(1,offset,data,0);
}
WRITE8_MEMBER(pp01_state::pp01_video_b_1_w)
{
	pp01_video_w(2,offset,data,0);
}

WRITE8_MEMBER(pp01_state::pp01_video_r_2_w)
{
	pp01_video_w(0,offset,data,1);
}
WRITE8_MEMBER(pp01_state::pp01_video_g_2_w)
{
	pp01_video_w(1,offset,data,1);
}
WRITE8_MEMBER(pp01_state::pp01_video_b_2_w)
{
	pp01_video_w(2,offset,data,1);
}


void pp01_state::pp01_set_memory(UINT8 block, UINT8 data)
{
	UINT8 *mem = memregion("maincpu")->base();
	address_space &space = m_maincpu->space(AS_PROGRAM);
	UINT16 startaddr = block*0x1000;
	UINT16 endaddr   = ((block+1)*0x1000)-1;
	UINT8  blocknum  = block + 1;
	char bank[10];
	sprintf(bank,"bank%d",blocknum);
	if (data>=0xE0 && data<=0xEF) {
		// This is RAM
		space.install_read_bank (startaddr, endaddr, bank);
		switch(data) {
			case 0xe6 :
					space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_r_1_w),this));
					break;
			case 0xe7 :
					space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_r_2_w),this));
					break;
			case 0xea :
					space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_g_1_w),this));
					break;
			case 0xeb :
					space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_g_2_w),this));
					break;
			case 0xee :
					space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_b_1_w),this));
					break;
			case 0xef :
					space.install_write_handler(startaddr, endaddr, write8_delegate(FUNC(pp01_state::pp01_video_b_2_w),this));
					break;

			default :
					space.install_write_bank(startaddr, endaddr, bank);
					break;
		}

		membank(bank)->set_base(m_ram->pointer() + (data & 0x0F)* 0x1000);
	} else if (data>=0xF8) {
		space.install_read_bank (startaddr, endaddr, bank);
		space.unmap_write(startaddr, endaddr);
		membank(bank)->set_base(mem + ((data & 0x0F)-8)* 0x1000+0x10000);
	} else {
		logerror("%02x %02x\n",block,data);
		space.unmap_readwrite (startaddr, endaddr);
	}
}

void pp01_state::machine_reset()
{
	int i;
	memset(m_memory_block,0xff,16);
	for(i=0;i<16;i++) {
		m_memory_block[i] = 0xff;
		pp01_set_memory(i, 0xff);
	}
}

WRITE8_MEMBER(pp01_state::pp01_mem_block_w)
{
	m_memory_block[offset] = data;
	pp01_set_memory(offset, data);
}

READ8_MEMBER(pp01_state::pp01_mem_block_r)
{
	return  m_memory_block[offset];
}

void pp01_state::machine_start()
{
}


WRITE_LINE_MEMBER(pp01_state::pp01_pit_out0)
{
}

WRITE_LINE_MEMBER(pp01_state::pp01_pit_out1)
{
}

READ8_MEMBER(pp01_state::pp01_8255_porta_r)
{
	return m_video_scroll;
}
WRITE8_MEMBER(pp01_state::pp01_8255_porta_w)
{
	m_video_scroll = data;
}

READ8_MEMBER(pp01_state::pp01_8255_portb_r)
{
	static const char *const keynames[] = {
		"LINE0", "LINE1", "LINE2", "LINE3", "LINE4", "LINE5", "LINE6", "LINE7",
		"LINE8", "LINE9", "LINEA", "LINEB", "LINEC", "LINED", "LINEE", "LINEF"
	};

	return (ioport(keynames[m_key_line])->read() & 0x3F) | (ioport("LINEALL")->read() & 0xC0);
}
WRITE8_MEMBER(pp01_state::pp01_8255_portb_w)
{
	//logerror("pp01_8255_portb_w %02x\n",data);

}

WRITE8_MEMBER(pp01_state::pp01_8255_portc_w)
{
	if BIT(data, 4)
		m_key_line = data & 0x0f;
	else
		m_speaker->level_w(BIT(data, 0));
}

READ8_MEMBER(pp01_state::pp01_8255_portc_r)
{
	return 0xff;
}