From b3f639da1fbdbdd50efd5c993e786fc0f3cd04bf Mon Sep 17 00:00:00 2001 From: cam900 Date: Fri, 13 Jul 2018 17:31:33 +0900 Subject: lynx.cpp : Reduce runtime tag lookups, Cleanup palette (#3626) * lynx.cpp : Reduce runtime tag lookups, Cleanup palette * lynx.cpp : Minor cleanup of drawing --- src/mame/drivers/lynx.cpp | 53 ++++++++++++++++++++++++++++------------------- src/mame/includes/lynx.h | 21 +++++++++++++------ src/mame/machine/lynx.cpp | 52 +++++++++++++++++----------------------------- 3 files changed, 66 insertions(+), 60 deletions(-) diff --git a/src/mame/drivers/lynx.cpp b/src/mame/drivers/lynx.cpp index 592b3b50e3f..d4f2299cb94 100644 --- a/src/mame/drivers/lynx.cpp +++ b/src/mame/drivers/lynx.cpp @@ -21,12 +21,24 @@ void lynx_state::lynx_mem(address_map &map) { map(0x0000, 0xfbff).ram().share("mem_0000"); - map(0xfc00, 0xfcff).ram().share("mem_fc00"); - map(0xfd00, 0xfdff).ram().share("mem_fd00"); - map(0xfe00, 0xfff7).bankr("bank3").writeonly().share("mem_fe00"); + map(0xfc00, 0xfcff).m(m_bank_fc00, FUNC(address_map_bank_device::amap8)); + map(0xfd00, 0xfdff).m(m_bank_fd00, FUNC(address_map_bank_device::amap8)); + map(0xfe00, 0xfff7).bankr("bank_fe00").writeonly().share("mem_fe00"); map(0xfff8, 0xfff8).ram(); map(0xfff9, 0xfff9).rw(FUNC(lynx_state::lynx_memory_config_r), FUNC(lynx_state::lynx_memory_config_w)); - map(0xfffa, 0xffff).bankr("bank4").writeonly().share("mem_fffa"); + map(0xfffa, 0xffff).bankr("bank_fffa").writeonly().share("mem_fffa"); +} + +void lynx_state::lynx_fc00_mem(address_map &map) +{ + map(0x000, 0x0ff).rw(FUNC(lynx_state::suzy_read), FUNC(lynx_state::suzy_write)); + map(0x100, 0x1ff).ram().share("mem_fc00"); +} + +void lynx_state::lynx_fd00_mem(address_map &map) +{ + map(0x000, 0x0ff).rw(FUNC(lynx_state::mikey_read), FUNC(lynx_state::mikey_write)); + map(0x100, 0x1ff).ram().share("mem_fd00"); } static INPUT_PORTS_START( lynx ) @@ -45,25 +57,12 @@ static INPUT_PORTS_START( lynx ) // power on and power off buttons INPUT_PORTS_END -PALETTE_INIT_MEMBER(lynx_state, lynx) -{ - int i; - - for (i=0; i< 0x1000; i++) - { - palette.set_pen_color(i, - ((i >> 0) & 0x0f) * 0x11, - ((i >> 4) & 0x0f) * 0x11, - ((i >> 8) & 0x0f) * 0x11); - } -} - void lynx_state::video_start() { m_screen->register_screen_bitmap(m_bitmap); } -uint32_t lynx_state::screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect) +uint32_t lynx_state::screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect) { copybitmap(bitmap, m_bitmap, 0, 0, 0, 0, cliprect); return 0; @@ -81,6 +80,20 @@ MACHINE_CONFIG_START(lynx_state::lynx) MCFG_DEVICE_PROGRAM_MAP(lynx_mem) MCFG_QUANTUM_TIME(attotime::from_hz(60)) + MCFG_DEVICE_ADD("bank_fc00", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(lynx_fc00_mem) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(9) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x100) + + MCFG_DEVICE_ADD("bank_fd00", ADDRESS_MAP_BANK, 0) + MCFG_DEVICE_PROGRAM_MAP(lynx_fd00_mem) + MCFG_ADDRESS_MAP_BANK_ENDIANNESS(ENDIANNESS_LITTLE) + MCFG_ADDRESS_MAP_BANK_DATA_WIDTH(8) + MCFG_ADDRESS_MAP_BANK_ADDR_WIDTH(9) + MCFG_ADDRESS_MAP_BANK_STRIDE(0x100) + /* video hardware */ MCFG_SCREEN_ADD("screen", LCD) MCFG_SCREEN_REFRESH_RATE(LCD_FRAMES_PER_SECOND) @@ -88,11 +101,9 @@ MACHINE_CONFIG_START(lynx_state::lynx) MCFG_SCREEN_UPDATE_DRIVER(lynx_state, screen_update) MCFG_SCREEN_SIZE(160, 102) MCFG_SCREEN_VISIBLE_AREA(0, 160-1, 0, 102-1) - MCFG_SCREEN_PALETTE("palette") MCFG_DEFAULT_LAYOUT(layout_lynx) - MCFG_PALETTE_ADD("palette", 0x1000) - MCFG_PALETTE_INIT_OWNER(lynx_state, lynx) + MCFG_PALETTE_ADD("palette", 0x10) /* sound hardware */ SPEAKER(config, "mono").front_center(); diff --git a/src/mame/includes/lynx.h b/src/mame/includes/lynx.h index cad2ec549c8..fa0efe6b004 100644 --- a/src/mame/includes/lynx.h +++ b/src/mame/includes/lynx.h @@ -14,6 +14,7 @@ #include "screen.h" #include "audio/lynx.h" #include "imagedev/snapquik.h" +#include "machine/bankdev.h" #include "bus/generic/slot.h" #include "bus/generic/carts.h" @@ -37,7 +38,11 @@ public: m_sound(*this, "custom"), m_cart(*this, "cartslot"), m_palette(*this, "palette"), - m_screen(*this, "screen") + m_screen(*this, "screen"), + m_bank_fc00(*this, "bank_fc00"), + m_bank_fd00(*this, "bank_fd00"), + m_bank_fe00(*this, "bank_fe00"), + m_bank_fffa(*this, "bank_fffa") { } void lynx(machine_config &config); @@ -141,10 +146,13 @@ private: required_device m_cart; required_device m_palette; required_device m_screen; + required_device m_bank_fc00; + required_device m_bank_fd00; + required_memory_bank m_bank_fe00; + required_memory_bank m_bank_fffa; uint16_t m_granularity; int m_sign_AB; int m_sign_CD; - uint32_t m_lynx_palette[0x10]; int m_rotate; uint8_t m_memory_config; @@ -154,12 +162,14 @@ private: UART m_uart; LYNX_TIMER m_timer[NR_LYNX_TIMERS]; - bitmap_ind16 m_bitmap; - bitmap_ind16 m_bitmap_temp; + bitmap_rgb32 m_bitmap; + bitmap_rgb32 m_bitmap_temp; void lynx_mem(address_map &map); + void lynx_fc00_mem(address_map &map); + void lynx_fd00_mem(address_map &map); - uint32_t screen_update(screen_device &screen, bitmap_ind16 &bitmap, const rectangle &cliprect); + uint32_t screen_update(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect); DECLARE_READ8_MEMBER(suzy_read); DECLARE_WRITE8_MEMBER(suzy_write); @@ -173,7 +183,6 @@ private: void lynx_multiply(); uint8_t lynx_timer_read(int which, int offset); void lynx_timer_write(int which, int offset, uint8_t data); - DECLARE_PALETTE_INIT(lynx); void sound_cb(); TIMER_CALLBACK_MEMBER(lynx_blitter_timer); TIMER_CALLBACK_MEMBER(lynx_timer_shot); diff --git a/src/mame/machine/lynx.cpp b/src/mame/machine/lynx.cpp index 715986ba7e0..f038e7d3925 100644 --- a/src/mame/machine/lynx.cpp +++ b/src/mame/machine/lynx.cpp @@ -1299,6 +1299,7 @@ DISPCTL EQU $FD92 ; set to $D by INITMIKEY void lynx_state::lynx_draw_line() { + const pen_t *pen = m_palette->pens(); int x, y; uint16_t j; // clipping needed! uint8_t byte; @@ -1313,22 +1314,22 @@ void lynx_state::lynx_draw_line() if (m_mikey.data[0x92] & 0x02) { j -= 160 * 102 / 2 - 1; - line = &m_bitmap_temp.pix16(102 - 1 - y); + line = &m_bitmap_temp.pix32(102 - 1 - y); for (x = 160 - 2; x >= 0; j++, x -= 2) { byte = lynx_read_ram(j); - line[x + 1] = m_lynx_palette[(byte >> 4) & 0x0f]; - line[x + 0] = m_lynx_palette[(byte >> 0) & 0x0f]; + line[x + 1] = pen[(byte >> 4) & 0x0f]; + line[x + 0] = pen[(byte >> 0) & 0x0f]; } } else { - line = &m_bitmap_temp.pix16(y); + line = &m_bitmap_temp.pix32(y); for (x = 0; x < 160; j++, x += 2) { byte = lynx_read_ram(j); - line[x + 0] = m_lynx_palette[(byte >> 4) & 0x0f]; - line[x + 1] = m_lynx_palette[(byte >> 0) & 0x0f]; + line[x + 0] = pen[(byte >> 4) & 0x0f]; + line[x + 1] = pen[(byte >> 0) & 0x0f]; } } } @@ -1832,10 +1833,10 @@ WRITE8_MEMBER(lynx_state::mikey_write) m_mikey.data[offset] = data; /* RED = 0xb- & 0x0f, GREEN = 0xa- & 0x0f, BLUE = (0xb- & 0xf0) >> 4 */ - m_lynx_palette[offset & 0x0f] = m_palette->pen( - ((m_mikey.data[0xb0 + (offset & 0x0f)] & 0x0f)) | - ((m_mikey.data[0xa0 + (offset & 0x0f)] & 0x0f) << 4) | - ((m_mikey.data[0xb0 + (offset & 0x0f)] & 0xf0) << 4)); + m_palette->set_pen_color(offset & 0x0f, rgb_t( + pal4bit(m_mikey.data[0xb0 | (offset & 0x0f)] & 0x0f), + pal4bit(m_mikey.data[0xa0 | (offset & 0x0f)] & 0x0f), + pal4bit((m_mikey.data[0xb0 | (offset & 0x0f)] & 0xf0) >> 4))); break; /* TODO: properly implement these writes */ @@ -1886,24 +1887,10 @@ WRITE8_MEMBER(lynx_state::lynx_memory_config_w) * when these are safe in the cpu */ m_memory_config = data; - if (data & 1) - { - space.install_readwrite_bank(0xfc00, 0xfcff, "bank1"); - membank("bank1")->set_base(m_mem_fc00); - } - else - space.install_readwrite_handler(0xfc00, 0xfcff, read8_delegate(FUNC(lynx_state::suzy_read),this), write8_delegate(FUNC(lynx_state::suzy_write),this)); - - if (data & 2) - { - space.install_readwrite_bank(0xfd00, 0xfdff, "bank2"); - membank("bank2")->set_base(m_mem_fd00); - } - else - space.install_readwrite_handler(0xfd00, 0xfdff, read8_delegate(FUNC(lynx_state::mikey_read),this), write8_delegate(FUNC(lynx_state::mikey_write),this)); - - membank("bank3")->set_entry((data & 4) ? 1 : 0); - membank("bank4")->set_entry((data & 8) ? 1 : 0); + m_bank_fc00->set_bank(BIT(data, 0)); + m_bank_fd00->set_bank(BIT(data, 1)); + m_bank_fe00->set_entry(BIT(data, 2)); + m_bank_fffa->set_entry(BIT(data, 3)); } void lynx_state::machine_reset() @@ -1954,7 +1941,6 @@ void lynx_state::machine_start() save_item(NAME(m_memory_config)); save_item(NAME(m_sign_AB)); save_item(NAME(m_sign_CD)); - save_item(NAME(m_lynx_palette)); save_item(NAME(m_rotate)); // save blitter variables save_item(NAME(m_blitter.screen)); @@ -2014,10 +2000,10 @@ void lynx_state::machine_start() machine().save().register_postload(save_prepost_delegate(FUNC(lynx_state::lynx_postload), this)); - membank("bank3")->configure_entry(0, memregion("maincpu")->base() + 0x0000); - membank("bank3")->configure_entry(1, m_mem_fe00); - membank("bank4")->configure_entry(0, memregion("maincpu")->base() + 0x01fa); - membank("bank4")->configure_entry(1, m_mem_fffa); + m_bank_fe00->configure_entry(0, memregion("maincpu")->base() + 0x0000); + m_bank_fe00->configure_entry(1, m_mem_fe00); + m_bank_fffa->configure_entry(0, memregion("maincpu")->base() + 0x01fa); + m_bank_fffa->configure_entry(1, m_mem_fffa); for (int i = 0; i < NR_LYNX_TIMERS; i++) lynx_timer_init(i); -- cgit v1.2.3