summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cam900 <dbtlrchl@naver.com>2018-07-13 17:31:33 +0900
committer Vas Crabb <cuavas@users.noreply.github.com>2018-07-13 18:31:33 +1000
commitb3f639da1fbdbdd50efd5c993e786fc0f3cd04bf (patch)
tree2ba341363d9dc7164a246844cb942ebb4e8f7a3d
parent3c251c174fe50af1ef9a06bb181284669b099596 (diff)
lynx.cpp : Reduce runtime tag lookups, Cleanup palette (#3626)
* lynx.cpp : Reduce runtime tag lookups, Cleanup palette * lynx.cpp : Minor cleanup of drawing
-rw-r--r--src/mame/drivers/lynx.cpp53
-rw-r--r--src/mame/includes/lynx.h21
-rw-r--r--src/mame/machine/lynx.cpp52
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<generic_slot_device> m_cart;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
+ required_device<address_map_bank_device> m_bank_fc00;
+ required_device<address_map_bank_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);