mirror of
https://github.com/holub/mame
synced 2025-04-22 08:22:15 +03:00
lynx.cpp : Reduce runtime tag lookups, Cleanup palette (#3626)
* lynx.cpp : Reduce runtime tag lookups, Cleanup palette * lynx.cpp : Minor cleanup of drawing
This commit is contained in:
parent
3c251c174f
commit
b3f639da1f
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user