diff options
Diffstat (limited to 'src/mame/drivers/pasopia7.cpp')
-rw-r--r-- | src/mame/drivers/pasopia7.cpp | 205 |
1 files changed, 98 insertions, 107 deletions
diff --git a/src/mame/drivers/pasopia7.cpp b/src/mame/drivers/pasopia7.cpp index b89f1628813..87f1bb02094 100644 --- a/src/mame/drivers/pasopia7.cpp +++ b/src/mame/drivers/pasopia7.cpp @@ -75,31 +75,34 @@ public: void init_p7_lcd(); void init_p7_raster(); +protected: + virtual void machine_start() override; + private: - DECLARE_READ8_MEMBER(vram_r); - DECLARE_WRITE8_MEMBER(vram_w); - DECLARE_WRITE8_MEMBER(pasopia7_memory_ctrl_w); - DECLARE_WRITE8_MEMBER(pac2_w); - DECLARE_READ8_MEMBER(pac2_r); - DECLARE_WRITE8_MEMBER(ram_bank_w); - DECLARE_WRITE8_MEMBER(pasopia7_6845_w); - DECLARE_READ8_MEMBER(pasopia7_io_r); - DECLARE_WRITE8_MEMBER(pasopia7_io_w); - DECLARE_READ8_MEMBER(pasopia7_fdc_r); - DECLARE_WRITE8_MEMBER(pasopia7_fdc_w); + uint8_t vram_r(offs_t offset); + void vram_w(offs_t offset, uint8_t data); + void memory_ctrl_w(uint8_t data); + void pac2_w(offs_t offset, uint8_t data); + uint8_t pac2_r(offs_t offset); + void ram_bank_w(offs_t offset, uint8_t data); + void pasopia7_6845_w(offs_t offset, uint8_t data); + uint8_t io_r(offs_t offset); + void io_w(offs_t offset, uint8_t data); + uint8_t fdc_r(offs_t offset); + void fdc_w(offs_t offset, uint8_t data); uint8_t keyb_r(); - DECLARE_WRITE8_MEMBER(mux_w); - DECLARE_READ8_MEMBER(crtc_portb_r); - DECLARE_WRITE8_MEMBER(screen_mode_w); - DECLARE_WRITE8_MEMBER(plane_reg_w); - DECLARE_WRITE8_MEMBER(video_attr_w); - DECLARE_WRITE8_MEMBER(video_misc_w); - DECLARE_WRITE8_MEMBER(nmi_mask_w); - DECLARE_READ8_MEMBER(unk_r); - DECLARE_READ8_MEMBER(nmi_reg_r); - DECLARE_WRITE8_MEMBER(nmi_reg_w); - DECLARE_READ8_MEMBER(nmi_porta_r); - DECLARE_READ8_MEMBER(nmi_portb_r); + void mux_w(uint8_t data); + uint8_t crtc_portb_r(); + void screen_mode_w(uint8_t data); + void plane_reg_w(uint8_t data); + void video_attr_w(uint8_t data); + void video_misc_w(uint8_t data); + void nmi_mask_w(uint8_t data); + uint8_t unk_r(); + uint8_t nmi_reg_r(); + void nmi_reg_w(uint8_t data); + uint8_t nmi_porta_r(); + uint8_t nmi_portb_r(); DECLARE_WRITE_LINE_MEMBER(speaker_w); TIMER_CALLBACK_MEMBER(pio_timer); DECLARE_VIDEO_START(pasopia7); @@ -109,6 +112,8 @@ private: void pasopia7_io(address_map &map); void pasopia7_mem(address_map &map); + std::unique_ptr<uint8_t[]> m_work_ram; + std::unique_ptr<uint8_t[]> m_vram; uint8_t m_vram_sel; uint8_t m_mio_sel; std::unique_ptr<uint8_t[]> m_p7_pal; @@ -164,6 +169,14 @@ private: #define VDP_CLOCK 14.318181_MHz_XTAL / 16 #define LCD_CLOCK VDP_CLOCK/10 +void pasopia7_state::machine_start() +{ + m_work_ram = std::make_unique<uint8_t[]>(0x10000); + std::fill(&m_work_ram[0], &m_work_ram[0x10000], 0xff); + + m_vram = make_unique_clear<uint8_t[]>(0x10000); +} + // needed to scan the keyboard, as the pio emulation doesn't do it. TIMER_CALLBACK_MEMBER( pasopia7_state::pio_timer ) { @@ -177,7 +190,6 @@ VIDEO_START_MEMBER(pasopia7_state,pasopia7) void pasopia7_state::draw_cg4_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int width) { - uint8_t *vram = memregion("vram")->base(); int x,y,xi,yi; int count; @@ -192,8 +204,8 @@ void pasopia7_state::draw_cg4_screen(bitmap_ind16 &bitmap,const rectangle &clipr { int pen_b,pen_r,pen_g,color; - pen_b = (vram[count+0x0000]>>(7-xi)) & 1; - pen_r = (vram[count+0x4000]>>(7-xi)) & 1; + pen_b = (m_vram[count+0x0000]>>(7-xi)) & 1; + pen_r = (m_vram[count+0x4000]>>(7-xi)) & 1; pen_g = 0;//(p7_vram[count+0x8000]>>(7-xi)) & 1; color = pen_g<<2 | pen_r<<1 | pen_b<<0; @@ -208,7 +220,6 @@ void pasopia7_state::draw_cg4_screen(bitmap_ind16 &bitmap,const rectangle &clipr void pasopia7_state::draw_tv_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int width) { - uint8_t *vram = memregion("vram")->base(); uint8_t *gfx_data = memregion("font")->base(); int x,y,xi,yi; int count; @@ -219,8 +230,8 @@ void pasopia7_state::draw_tv_screen(bitmap_ind16 &bitmap,const rectangle &clipre { for(x=0;x<width;x++) { - int tile = vram[count+0x8000]; - int attr = vram[count+0xc000]; + int tile = m_vram[count+0x8000]; + int attr = m_vram[count+0xc000]; int color = attr & 7; for(yi=0;yi<8;yi++) @@ -266,7 +277,6 @@ void pasopia7_state::draw_tv_screen(bitmap_ind16 &bitmap,const rectangle &clipre void pasopia7_state::draw_mixed_screen(bitmap_ind16 &bitmap,const rectangle &cliprect,int width) { - uint8_t *vram = memregion("vram")->base(); uint8_t *gfx_data = memregion("font")->base(); int x,y,xi,yi; int count; @@ -277,11 +287,11 @@ void pasopia7_state::draw_mixed_screen(bitmap_ind16 &bitmap,const rectangle &cli { for(x=0;x<width;x++) { - int tile = vram[count+0x8000]; + int tile = m_vram[count+0x8000]; for(yi=0;yi<8;yi++) { - int attr = vram[count+0xc000+yi]; + int attr = m_vram[count+0xc000+yi]; if(attr & 0x80) { @@ -289,9 +299,9 @@ void pasopia7_state::draw_mixed_screen(bitmap_ind16 &bitmap,const rectangle &cli { int pen,pen_b,pen_r,pen_g; - pen_b = (vram[count+yi+0x0000]>>(7-xi)) & 1; - pen_r = (vram[count+yi+0x4000]>>(7-xi)) & 1; - pen_g = (vram[count+yi+0x8000]>>(7-xi)) & 1; + pen_b = (m_vram[count+yi+0x0000]>>(7-xi)) & 1; + pen_r = (m_vram[count+yi+0x4000]>>(7-xi)) & 1; + pen_g = (m_vram[count+yi+0x8000]>>(7-xi)) & 1; pen = pen_g<<2 | pen_r<<1 | pen_b<<0; @@ -362,16 +372,13 @@ uint32_t pasopia7_state::screen_update_pasopia7(screen_device &screen, bitmap_in return 0; } -READ8_MEMBER( pasopia7_state::vram_r ) +uint8_t pasopia7_state::vram_r(offs_t offset) { - uint8_t *vram = memregion("vram")->base(); uint8_t res; if (m_vram_sel == 0) { - uint8_t *work_ram = memregion("maincpu")->base(); - - return work_ram[offset+0x8000]; + return m_work_ram[offset+0x8000]; } if (m_pal_sel && (m_plane_reg & 0x70) == 0x00) @@ -380,22 +387,20 @@ READ8_MEMBER( pasopia7_state::vram_r ) res = 0xff; if ((m_plane_reg & 0x11) == 0x11) - res &= vram[offset | 0x0000]; + res &= m_vram[offset | 0x0000]; if ((m_plane_reg & 0x22) == 0x22) - res &= vram[offset | 0x4000]; + res &= m_vram[offset | 0x4000]; if ((m_plane_reg & 0x44) == 0x44) { - res &= vram[offset | 0x8000]; - m_attr_latch = vram[offset | 0xc000] & 0x87; + res &= m_vram[offset | 0x8000]; + m_attr_latch = m_vram[offset | 0xc000] & 0x87; } return res; } -WRITE8_MEMBER( pasopia7_state::vram_w ) +void pasopia7_state::vram_w(offs_t offset, uint8_t data) { - uint8_t *vram = memregion("vram")->base(); - if (m_vram_sel) { if (m_pal_sel && (m_plane_reg & 0x70) == 0x00) @@ -405,28 +410,27 @@ WRITE8_MEMBER( pasopia7_state::vram_w ) } if (m_plane_reg & 0x10) - vram[(offset & 0x3fff) | 0x0000] = (m_plane_reg & 1) ? data : 0xff; + m_vram[(offset & 0x3fff) | 0x0000] = (m_plane_reg & 1) ? data : 0xff; if (m_plane_reg & 0x20) - vram[(offset & 0x3fff) | 0x4000] = (m_plane_reg & 2) ? data : 0xff; + m_vram[(offset & 0x3fff) | 0x4000] = (m_plane_reg & 2) ? data : 0xff; if (m_plane_reg & 0x40) { - vram[(offset & 0x3fff) | 0x8000] = (m_plane_reg & 4) ? data : 0xff; + m_vram[(offset & 0x3fff) | 0x8000] = (m_plane_reg & 4) ? data : 0xff; m_attr_latch = m_attr_wrap ? m_attr_latch : m_attr_data; - vram[(offset & 0x3fff) | 0xc000] = m_attr_latch; + m_vram[(offset & 0x3fff) | 0xc000] = m_attr_latch; } } else { - uint8_t *work_ram = memregion("maincpu")->base(); - - work_ram[offset+0x8000] = data; + m_work_ram[offset+0x8000] = data; } } -WRITE8_MEMBER( pasopia7_state::pasopia7_memory_ctrl_w ) +void pasopia7_state::memory_ctrl_w(uint8_t data) { - uint8_t *work_ram = memregion("maincpu")->base(); + uint8_t *work_ram = m_work_ram.get(); uint8_t *basic = memregion("basic")->base(); + uint8_t *bios = memregion("bios")->base(); switch(data & 3) { @@ -437,7 +441,7 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_memory_ctrl_w ) break; case 1: //select Basic ROM + BIOS ROM membank("bank1")->set_base(basic + 0x00000); - membank("bank2")->set_base(work_ram + 0x10000); + membank("bank2")->set_base(bios + 0x00000); break; case 2: //select Work RAM membank("bank1")->set_base(work_ram + 0x00000); @@ -454,15 +458,8 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_memory_ctrl_w ) // printf("%02x\n",m_vram_sel); } -#if 0 -READ8_MEMBER( pasopia7_state::fdc_r ) -{ - return machine().rand(); -} -#endif - -WRITE8_MEMBER( pasopia7_state::pac2_w ) +void pasopia7_state::pac2_w(offs_t offset, uint8_t data) { /* select register: @@ -510,7 +507,7 @@ WRITE8_MEMBER( pasopia7_state::pac2_w ) } } -READ8_MEMBER( pasopia7_state::pac2_r ) +uint8_t pasopia7_state::pac2_r(offs_t offset) { if(offset == 2) { @@ -538,14 +535,12 @@ READ8_MEMBER( pasopia7_state::pac2_r ) } /* writes always occurs to the RAM banks, even if the ROMs are selected. */ -WRITE8_MEMBER( pasopia7_state::ram_bank_w ) +void pasopia7_state::ram_bank_w(offs_t offset, uint8_t data) { - uint8_t *work_ram = memregion("maincpu")->base(); - - work_ram[offset] = data; + m_work_ram[offset] = data; } -WRITE8_MEMBER( pasopia7_state::pasopia7_6845_w ) +void pasopia7_state::pasopia7_6845_w(offs_t offset, uint8_t data) { if(offset == 0) { @@ -583,7 +578,7 @@ void pasopia7_state::pasopia_nmi_trap() } } -READ8_MEMBER( pasopia7_state::pasopia7_fdc_r ) +uint8_t pasopia7_state::fdc_r(offs_t offset) { switch(offset) { @@ -595,7 +590,7 @@ READ8_MEMBER( pasopia7_state::pasopia7_fdc_r ) return 0xff; } -WRITE8_MEMBER( pasopia7_state::pasopia7_fdc_w ) +void pasopia7_state::fdc_w(offs_t offset, uint8_t data) { switch(offset) { @@ -612,7 +607,7 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_fdc_w ) } -READ8_MEMBER( pasopia7_state::pasopia7_io_r ) +uint8_t pasopia7_state::io_r(offs_t offset) { if(m_mio_sel) { @@ -638,7 +633,7 @@ READ8_MEMBER( pasopia7_state::pasopia7_io_r ) return m_crtc->register_r(); else if(io_port >= 0x18 && io_port <= 0x1b) - return pac2_r(space, io_port & 3); + return pac2_r(io_port & 3); else if(io_port >= 0x20 && io_port <= 0x23) { @@ -656,7 +651,7 @@ READ8_MEMBER( pasopia7_state::pasopia7_io_r ) // else if(io_port == 0x3c) { bankswitch } else // if(io_port >= 0xe0 && io_port <= 0xe6) -// return pasopia7_fdc_r(space, offset & 7); +// return fdc_r(offset & 7); // else { logerror("(PC=%06x) Read i/o address %02x\n",m_maincpu->pc(),io_port); @@ -665,7 +660,7 @@ READ8_MEMBER( pasopia7_state::pasopia7_io_r ) return 0xff; } -WRITE8_MEMBER( pasopia7_state::pasopia7_io_w ) +void pasopia7_state::io_w(offs_t offset, uint8_t data) { if(m_mio_sel) { @@ -684,10 +679,10 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_io_w ) m_ppi1->write(io_port & 3, data); else if(io_port >= 0x10 && io_port <= 0x11) - pasopia7_6845_w(space, io_port-0x10, data); + pasopia7_6845_w(io_port-0x10, data); else if(io_port >= 0x18 && io_port <= 0x1b) - pac2_w(space, io_port & 3, data); + pac2_w(io_port & 3, data); else if(io_port >= 0x20 && io_port <= 0x23) { @@ -708,10 +703,10 @@ WRITE8_MEMBER( pasopia7_state::pasopia7_io_w ) m_sn2->write(data); else if(io_port == 0x3c) - pasopia7_memory_ctrl_w(space,0, data); + memory_ctrl_w(data); else if(io_port >= 0xe0 && io_port <= 0xe6) - pasopia7_fdc_w(space, offset & 7, data); + fdc_w(offset & 7, data); else { logerror("(PC=%06x) Write i/o address %02x = %02x\n",m_maincpu->pc(),offset,data); @@ -731,7 +726,7 @@ void pasopia7_state::pasopia7_mem(address_map &map) void pasopia7_state::pasopia7_io(address_map &map) { map.unmap_value_high(); - map(0x0000, 0xffff).rw(FUNC(pasopia7_state::pasopia7_io_r), FUNC(pasopia7_state::pasopia7_io_w)); + map(0x0000, 0xffff).rw(FUNC(pasopia7_state::io_r), FUNC(pasopia7_state::io_w)); } static INPUT_PORTS_START( pasopia7 ) @@ -801,7 +796,7 @@ uint8_t pasopia7_state::keyb_r() return data; } -WRITE8_MEMBER( pasopia7_state::mux_w ) +void pasopia7_state::mux_w(uint8_t data) { m_mux_data = data; } @@ -814,7 +809,7 @@ static const z80_daisy_config p7_daisy[] = { nullptr } }; -READ8_MEMBER( pasopia7_state::crtc_portb_r ) +uint8_t pasopia7_state::crtc_portb_r() { // --x- ---- vsync bit // ---x ---- hardcoded bit, defines if the system screen is raster (1) or LCD (0) @@ -825,7 +820,7 @@ READ8_MEMBER( pasopia7_state::crtc_portb_r ) return 0x40 | (m_attr_latch & 0x87) | vsync | vdisp | (m_screen_type << 4); } -WRITE8_MEMBER( pasopia7_state::screen_mode_w ) +void pasopia7_state::screen_mode_w(uint8_t data) { if(data & 0x5f) printf("GFX MODE %02x\n",data); @@ -836,14 +831,14 @@ WRITE8_MEMBER( pasopia7_state::screen_mode_w ) // printf("%02x\n",m_gfx_mode); } -WRITE8_MEMBER( pasopia7_state::plane_reg_w ) +void pasopia7_state::plane_reg_w(uint8_t data) { //if(data & 0x11) //printf("PLANE %02x\n",data); m_plane_reg = data; } -WRITE8_MEMBER( pasopia7_state::video_attr_w ) +void pasopia7_state::video_attr_w(uint8_t data) { //printf("VIDEO ATTR %02x | TEXT_PAGE %02x\n",data & 0xf,data & 0x70); m_attr_data = (data & 0x7) | ((data & 0x8)<<4); @@ -851,7 +846,7 @@ WRITE8_MEMBER( pasopia7_state::video_attr_w ) //#include "debugger.h" -WRITE8_MEMBER( pasopia7_state::video_misc_w ) +void pasopia7_state::video_misc_w(uint8_t data) { /* --x- ---- blinking @@ -869,7 +864,7 @@ WRITE8_MEMBER( pasopia7_state::video_misc_w ) //m_pal_sel = data & 0x02; } -WRITE8_MEMBER( pasopia7_state::nmi_mask_w ) +void pasopia7_state::nmi_mask_w(uint8_t data) { /* --x- ---- tape motor @@ -893,18 +888,18 @@ WRITE8_MEMBER( pasopia7_state::nmi_mask_w ) } /* TODO: investigate on these. */ -READ8_MEMBER( pasopia7_state::unk_r ) +uint8_t pasopia7_state::unk_r() { return 0xff;//machine().rand(); } -READ8_MEMBER( pasopia7_state::nmi_reg_r ) +uint8_t pasopia7_state::nmi_reg_r() { //printf("C\n"); return 0xfc | m_bank_reg;//machine().rand(); } -WRITE8_MEMBER( pasopia7_state::nmi_reg_w ) +void pasopia7_state::nmi_reg_w(uint8_t data) { /* x--- ---- NMI mask @@ -914,12 +909,12 @@ WRITE8_MEMBER( pasopia7_state::nmi_reg_w ) m_nmi_enable_reg = data & 0x40; } -READ8_MEMBER( pasopia7_state::nmi_porta_r ) +uint8_t pasopia7_state::nmi_porta_r() { return 0xff; } -READ8_MEMBER( pasopia7_state::nmi_portb_r ) +uint8_t pasopia7_state::nmi_portb_r() { u8 data = (m_cass->input() > +0.04) ? 0x20 : 0; return 0xd9 | data | m_nmi_trap | m_nmi_reset; @@ -937,12 +932,12 @@ WRITE_LINE_MEMBER( pasopia7_state::speaker_w ) void pasopia7_state::machine_reset() { - uint8_t *bios = memregion("maincpu")->base(); + uint8_t *bios = memregion("bios")->base(); - membank("bank1")->set_base(bios + 0x10000); - membank("bank2")->set_base(bios + 0x10000); -// membank("bank3")->set_base(bios + 0x10000); -// membank("bank4")->set_base(bios + 0x10000); + membank("bank1")->set_base(bios); + membank("bank2")->set_base(bios); +// membank("bank3")->set_base(bios); +// membank("bank4")->set_base(bios); m_nmi_reset |= 4; m_porta_2 = 0xFF; @@ -1071,8 +1066,8 @@ void pasopia7_state::p7_lcd(machine_config &config) /* ROM definition */ ROM_START( pasopia7 ) - ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "bios.rom", 0x10000, 0x4000, CRC(b8111407) SHA1(ac93ae62db4c67de815f45de98c79cfa1313857d)) + ROM_REGION( 0x4000, "bios", ROMREGION_ERASEFF ) + ROM_LOAD( "bios.rom", 0x0000, 0x4000, CRC(b8111407) SHA1(ac93ae62db4c67de815f45de98c79cfa1313857d)) ROM_REGION( 0x8000, "basic", ROMREGION_ERASEFF ) ROM_LOAD( "basic.rom", 0x0000, 0x8000, CRC(8a58fab6) SHA1(5e1a91dfb293bca5cf145b0a0c63217f04003ed1)) @@ -1088,14 +1083,12 @@ ROM_START( pasopia7 ) ROM_REGION( 0x8000, "rampac2", ROMREGION_ERASEFF ) // ROM_LOAD( "rampac2.bin", 0x0000, 0x8000, CRC(0e4f09bd) SHA1(4088906d57e4f6085a75b249a6139a0e2eb531a1) ) - - ROM_REGION( 0x10000, "vram", ROMREGION_ERASE00 ) ROM_END /* using an identical ROMset from now, but the screen type is different */ ROM_START( pasopia7lcd ) - ROM_REGION( 0x14000, "maincpu", ROMREGION_ERASEFF ) - ROM_LOAD( "bios.rom", 0x10000, 0x4000, CRC(b8111407) SHA1(ac93ae62db4c67de815f45de98c79cfa1313857d)) + ROM_REGION( 0x4000, "bios", ROMREGION_ERASEFF ) + ROM_LOAD( "bios.rom", 0x0000, 0x4000, CRC(b8111407) SHA1(ac93ae62db4c67de815f45de98c79cfa1313857d)) ROM_REGION( 0x8000, "basic", ROMREGION_ERASEFF ) ROM_LOAD( "basic.rom", 0x0000, 0x8000, CRC(8a58fab6) SHA1(5e1a91dfb293bca5cf145b0a0c63217f04003ed1)) @@ -1111,8 +1104,6 @@ ROM_START( pasopia7lcd ) ROM_REGION( 0x8000, "rampac2", ROMREGION_ERASEFF ) // ROM_LOAD( "rampac2.bin", 0x0000, 0x8000, CRC(0e4f09bd) SHA1(4088906d57e4f6085a75b249a6139a0e2eb531a1) ) - - ROM_REGION( 0x10000, "vram", ROMREGION_ERASE00 ) ROM_END |