diff options
author | AJR <ajrhacker@users.noreply.github.com> | 2020-04-06 11:21:06 -0400 |
---|---|---|
committer | AJR <ajrhacker@users.noreply.github.com> | 2020-04-06 11:21:06 -0400 |
commit | 7a112398a16cd66afce0247bc8f23605f23833cb (patch) | |
tree | e7e1ad5351142983d00619576b01fa8d2bcd8cfb | |
parent | 81d73831a2cc381a896af9df8850c42516cf775c (diff) |
pasopia.cpp: Simplify handler signatures; clean up memory usage (nw)
-rw-r--r-- | src/mame/drivers/pasopia.cpp | 144 |
1 files changed, 70 insertions, 74 deletions
diff --git a/src/mame/drivers/pasopia.cpp b/src/mame/drivers/pasopia.cpp index 7fe2af76b2e..494e601c7b8 100644 --- a/src/mame/drivers/pasopia.cpp +++ b/src/mame/drivers/pasopia.cpp @@ -43,8 +43,9 @@ public: pasopia_state(const machine_config &mconfig, device_type type, const char *tag) : driver_device(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_p_basic(*this, "basic") , m_p_chargen(*this, "chargen") - , m_p_vram(*this, "vram") + , m_p_ram(*this, "ram") , m_ppi0(*this, "ppi0") , m_ppi1(*this, "ppi1") , m_ppi2(*this, "ppi2") @@ -59,21 +60,24 @@ public: void pasopia(machine_config &config); - void init_pasopia(); +protected: + virtual void machine_start() override; + virtual void machine_reset() override; private: - DECLARE_WRITE8_MEMBER(pasopia_ctrl_w); - DECLARE_WRITE8_MEMBER(vram_addr_lo_w); - DECLARE_WRITE8_MEMBER(vram_latch_w); - DECLARE_READ8_MEMBER(vram_latch_r); - DECLARE_READ8_MEMBER(portb_1_r); - DECLARE_READ8_MEMBER(portb_2_r); - DECLARE_WRITE8_MEMBER(porta_2_w); - DECLARE_WRITE8_MEMBER(vram_addr_hi_w); - DECLARE_WRITE8_MEMBER(screen_mode_w); - DECLARE_READ8_MEMBER(rombank_r); - uint8_t keyb_r(); - DECLARE_WRITE8_MEMBER(mux_w); + void pasopia_ctrl_w(u8 data); + u8 memory_r(offs_t offset); + void vram_addr_lo_w(u8 data); + void vram_latch_w(u8 data); + u8 vram_latch_r(); + u8 portb_1_r(); + u8 portb_2_r(); + void porta_2_w(u8 data); + void vram_addr_hi_w(u8 data); + void screen_mode_w(u8 data); + u8 rombank_r(); + u8 keyb_r(); + void mux_w(u8 data); DECLARE_WRITE_LINE_MEMBER(speaker_w); MC6845_UPDATE_ROW(crtc_update_row); TIMER_CALLBACK_MEMBER(pio_timer); @@ -81,22 +85,22 @@ private: void pasopia_io(address_map &map); void pasopia_map(address_map &map); - uint8_t m_hblank; - uint16_t m_vram_addr; - uint8_t m_vram_latch; - uint8_t m_attr_latch; - uint8_t m_gfx_mode; - uint8_t m_mux_data; + u8 m_hblank; + u16 m_vram_addr; + u16 m_vram_latch; + u8 m_gfx_mode; + u8 m_mux_data; u8 m_porta_2; bool m_video_wl; bool m_ram_bank; bool m_spr_sw; emu_timer *m_pio_timer; - virtual void machine_start() override; - virtual void machine_reset() override; + std::unique_ptr<u16[]> m_p_vram; + required_device<z80_device> m_maincpu; + required_region_ptr<u8> m_p_basic; required_region_ptr<u8> m_p_chargen; - required_region_ptr<u8> m_p_vram; + required_shared_ptr<u8> m_p_ram; required_device<i8255_device> m_ppi0; required_device<i8255_device> m_ppi1; required_device<i8255_device> m_ppi2; @@ -118,35 +122,41 @@ TIMER_CALLBACK_MEMBER( pasopia_state::pio_timer ) MC6845_UPDATE_ROW( pasopia_state::crtc_update_row ) { const rgb_t *palette = m_palette->palette()->entry_list_raw(); - uint8_t chr,gfx,xi,fg=7,bg=0; // colours need to be determined - uint16_t mem=ma,x; + u8 fg=7,bg=0; // colours need to be determined uint32_t *p = &bitmap.pix32(y); - for (x = 0; x < x_count; x++) + for (u16 x = 0; x < x_count; x++) { - uint8_t inv = (x == cursor_x) ? 0xff : 0; - mem = ma + x; - chr = m_p_vram[mem & 0x7ff]; + u8 inv = (x == cursor_x) ? 0xff : 0; + u16 mem = ma + x; + u16 chr = m_p_vram[mem & 0x7ff]; /* get pattern of pixels for that character scanline */ - gfx = m_p_chargen[(chr<<3) | ra] ^ inv; + u8 gfx = m_p_chargen[((chr & 0xff)<<3) | ra] ^ inv; /* Display a scanline of a character */ - for (xi = 0; xi < 8; xi++) + for (u8 xi = 0; xi < 8; xi++) *p++ = palette[BIT(gfx, 7-xi) ? fg : bg]; } } -WRITE8_MEMBER( pasopia_state::pasopia_ctrl_w ) +void pasopia_state::pasopia_ctrl_w(u8 data) { m_ram_bank = BIT(data, 1); - membank("bank1")->set_entry(m_ram_bank); +} + +u8 pasopia_state::memory_r(offs_t offset) +{ + if (offset < 0x8000 && !m_ram_bank) + return m_p_basic[offset]; + else + return m_p_ram[offset]; } void pasopia_state::pasopia_map(address_map &map) { - map(0x0000, 0x7fff).bankr("bank1").bankw("bank2"); - map(0x8000, 0xffff).ram(); + map(0x0000, 0xffff).r(FUNC(pasopia_state::memory_r)); + map(0x0000, 0xffff).writeonly().share("ram"); } @@ -174,9 +184,12 @@ INPUT_PORTS_END void pasopia_state::machine_start() { + m_p_vram = make_unique_clear<u16[]>(0x4000); + + m_pio_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pasopia_state::pio_timer), this)); + m_pio_timer->adjust(attotime::from_hz(50), 0, attotime::from_hz(50)); + m_hblank = 0; - membank("bank1")->set_entry(0); - membank("bank2")->set_entry(0); } void pasopia_state::machine_reset() @@ -185,22 +198,22 @@ void pasopia_state::machine_reset() m_cass->change_state(CASSETTE_MOTOR_DISABLED, CASSETTE_MASK_MOTOR); } -WRITE8_MEMBER( pasopia_state::vram_addr_lo_w ) +void pasopia_state::vram_addr_lo_w(u8 data) { m_vram_addr = (m_vram_addr & 0x3f00) | data; } -WRITE8_MEMBER( pasopia_state::vram_latch_w ) +void pasopia_state::vram_latch_w(u8 data) { - m_vram_latch = data; + m_vram_latch = (m_vram_latch & 0x100) | data; } -READ8_MEMBER( pasopia_state::vram_latch_r ) +u8 pasopia_state::vram_latch_r() { - return m_p_vram[m_vram_addr]; + return m_p_vram[m_vram_addr] & 0xff; } -READ8_MEMBER( pasopia_state::portb_1_r ) +u8 pasopia_state::portb_1_r() { /* x--- ---- attribute latch @@ -208,21 +221,21 @@ READ8_MEMBER( pasopia_state::portb_1_r ) --x- ---- vblank ---x ---- LCD system mode, active low */ - uint8_t grph_latch,lcd_mode; + u8 grph_latch,lcd_mode; m_hblank ^= 0x40; //TODO - grph_latch = (m_p_vram[m_vram_addr | 0x4000] & 0x80); + grph_latch = (m_p_vram[m_vram_addr] & 0x100) >> 1; lcd_mode = 0x10; return m_hblank | lcd_mode | grph_latch; //bit 4: LCD mode } -READ8_MEMBER( pasopia_state::portb_2_r ) +u8 pasopia_state::portb_2_r() { return (m_cass->input() > +0.04) ? 0x20 : 0; } -WRITE8_MEMBER( pasopia_state::porta_2_w ) +void pasopia_state::porta_2_w(u8 data) { m_cass->output(BIT(data, 4) ? -1.0 : +1.0); u8 changed = data ^ m_porta_2; @@ -243,32 +256,31 @@ WRITE_LINE_MEMBER( pasopia_state::speaker_w ) } } -WRITE8_MEMBER( pasopia_state::vram_addr_hi_w ) +void pasopia_state::vram_addr_hi_w(u8 data) { - m_attr_latch = (data & 0x80) | (m_attr_latch & 0x7f); + m_vram_latch = u16(data & 0x80) << 1 | m_vram_latch; if ( BIT(data, 6) && !m_video_wl ) { m_p_vram[m_vram_addr] = m_vram_latch; - m_p_vram[m_vram_addr | 0x4000] = m_attr_latch; } m_video_wl = BIT(data, 6); m_vram_addr = (m_vram_addr & 0xff) | ((data & 0x3f) << 8); } -WRITE8_MEMBER( pasopia_state::screen_mode_w ) +void pasopia_state::screen_mode_w(u8 data) { m_gfx_mode = (data & 0xe0) >> 5; - m_attr_latch = (m_attr_latch & 0x80) | (data & 7); + //m_attr_latch = (m_attr_latch & 0x80) | (data & 7); printf("Screen Mode=%02x\n",data); } -READ8_MEMBER( pasopia_state::rombank_r ) +u8 pasopia_state::rombank_r() { return (m_ram_bank) ? 4 : 0; } -uint8_t pasopia_state::keyb_r() +u8 pasopia_state::keyb_r() { u8 data = 0xff; for (u8 i = 0; i < 3; i++) @@ -280,7 +292,7 @@ uint8_t pasopia_state::keyb_r() return data; } -WRITE8_MEMBER( pasopia_state::mux_w ) +void pasopia_state::mux_w(u8 data) { m_mux_data = data; } @@ -310,20 +322,6 @@ static const z80_daisy_config pasopia_daisy[] = -void pasopia_state::init_pasopia() -{ -/* -We preset all banks here, so that bankswitching will incur no speed penalty. -0000 indicates ROMs, 8000 indicates RAM. -*/ - uint8_t *ram = memregion("maincpu")->base(); - membank("bank1")->configure_entries(0, 2, &ram[0x0000], 0x8000); - membank("bank2")->configure_entry(0, &ram[0x8000]); - - m_pio_timer = machine().scheduler().timer_alloc(timer_expired_delegate(FUNC(pasopia_state::pio_timer), this)); - m_pio_timer->adjust(attotime::from_hz(50), 0, attotime::from_hz(50)); -} - void pasopia_state::pasopia(machine_config &config) { /* basic machine hardware */ @@ -383,16 +381,14 @@ void pasopia_state::pasopia(machine_config &config) /* ROM definition */ ROM_START( pasopia ) - ROM_REGION( 0x10000, "maincpu", 0 ) + ROM_REGION( 0x8000, "basic", 0 ) ROM_LOAD( "tbasic.rom", 0x0000, 0x8000, CRC(f53774ff) SHA1(bbec45a3bad8d184505cc6fe1f6e2e60a7fb53f2)) ROM_REGION( 0x0800, "chargen", 0 ) ROM_LOAD( "font.rom", 0x0000, 0x0800, BAD_DUMP CRC(a91c45a9) SHA1(a472adf791b9bac3dfa6437662e1a9e94a88b412)) //stolen from pasopia7 - - ROM_REGION( 0x8000, "vram", ROMREGION_ERASE00 ) ROM_END /* Driver */ -// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS -COMP( 1982, pasopia, 0, 0, pasopia, pasopia, pasopia_state, init_pasopia, "Toshiba", "Personal Computer Pasopia PA7010", MACHINE_NOT_WORKING ) +// YEAR NAME PARENT COMPAT MACHINE INPUT CLASS INIT COMPANY FULLNAME FLAGS +COMP( 1982, pasopia, 0, 0, pasopia, pasopia, pasopia_state, empty_init, "Toshiba", "Personal Computer Pasopia PA7010", MACHINE_NOT_WORKING ) |