/*************************************************************************** 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; } I8255A_INTERFACE( pp01_ppi8255_interface ) { DEVCB_DRIVER_MEMBER(pp01_state,pp01_8255_porta_r), DEVCB_DRIVER_MEMBER(pp01_state,pp01_8255_porta_w), DEVCB_DRIVER_MEMBER(pp01_state,pp01_8255_portb_r), DEVCB_DRIVER_MEMBER(pp01_state,pp01_8255_portb_w), DEVCB_DRIVER_MEMBER(pp01_state,pp01_8255_portc_r), DEVCB_DRIVER_MEMBER(pp01_state,pp01_8255_portc_w) };