route16: split off jongpute class

This commit is contained in:
hap 2024-12-18 15:29:49 +01:00
parent a80767f5c1
commit ef708b8037
3 changed files with 149 additions and 138 deletions

View File

@ -179,6 +179,9 @@ public:
void stratvox(machine_config &config);
void spacecho(machine_config &config);
protected:
virtual void machine_start() override ATTR_COLD;
private:
uint8_t speakres_in3_r();
void speakres_out2_w(uint8_t data);
@ -203,14 +206,23 @@ private:
*
*************************************/
MACHINE_START_MEMBER(speakres_state, speakres)
void route16_state::machine_start()
{
save_item(NAME(m_protection_data));
save_item(NAME(m_flipscreen));
save_item(NAME(m_palreg));
}
void speakres_state::machine_start()
{
route16_state::machine_start();
save_item(NAME(m_speakres_vrx));
}
MACHINE_START_MEMBER(route16_state, jongpute)
void jongpute_state::machine_start()
{
save_item(NAME(m_jongpute_port_select));
route16_state::machine_start();
save_item(NAME(m_port_select));
}
void route16_state::init_route16a()
@ -230,8 +242,6 @@ void route16_state::init_route16a()
void route16_state::init_route16()
{
save_item(NAME(m_protection_data));
// hack out the protection
u8 *rom = memregion("cpu1")->base();
rom[0x105] = 0; // remove jp nz,4109
@ -251,8 +261,6 @@ void route16_state::init_route16()
void route16_state::init_route16c()
{
save_item(NAME(m_protection_data));
// hack out the protection
u8 *rom = memregion("cpu1")->base();
rom[0x0e9] = 0x3a; // remove call 2CD8
@ -264,8 +272,6 @@ void route16_state::init_route16c()
void route16_state::init_route16d()
{
save_item(NAME(m_protection_data));
// hack out the protection
u8 *rom = memregion("cpu1")->base();
@ -284,7 +290,7 @@ void route16_state::init_route16d()
rom[0x74d] = 0x07;
}
void route16_state::init_vscompmj() // only opcodes encrypted
void jongpute_state::init_vscompmj() // only opcodes encrypted
{
uint8_t *rom = memregion("cpu1")->base();
@ -401,18 +407,18 @@ void speakres_state::stratvox_dac_w(uint8_t data)
*
***************************************************/
void route16_state::jongpute_input_w(uint8_t data)
void jongpute_state::input_w(uint8_t data)
{
m_jongpute_port_select = data;
m_port_select = data;
}
template <int N>
uint8_t route16_state::jongpute_input_r()
uint8_t jongpute_state::input_r()
{
uint8_t data = 0;
for (int i = 0; i < 4; i++)
if (BIT(m_jongpute_port_select, i))
if (BIT(m_port_select, i))
data |= m_key[N * 4 + i]->read();
return data;
@ -471,7 +477,7 @@ void route16_state::route16_cpu1_map(address_map &map)
map(0x4800, 0x4800).portr("DSW").w(FUNC(route16_state::out0_w));
map(0x5000, 0x5000).portr("P1").w(FUNC(route16_state::out1_w));
map(0x5800, 0x5800).portr("P2");
map(0x8000, 0xbfff).ram().share("videoram1");
map(0x8000, 0xbfff).ram().share(m_videoram[0]);
}
@ -483,7 +489,7 @@ void route16_state::routex_cpu1_map(address_map &map)
map(0x5000, 0x5000).portr("P1").w(FUNC(route16_state::out1_w));
map(0x5800, 0x5800).portr("P2");
map(0x6400, 0x6400).r(FUNC(route16_state::routex_prot_r));
map(0x8000, 0xbfff).ram().share("videoram1");
map(0x8000, 0xbfff).ram().share(m_videoram[0]);
}
@ -494,7 +500,7 @@ void speakres_state::stratvox_cpu1_map(address_map &map)
map(0x4800, 0x4800).portr("DSW").w(FUNC(speakres_state::out0_w));
map(0x5000, 0x5000).portr("P1").w(FUNC(speakres_state::out1_w));
map(0x5800, 0x5800).portr("P2");
map(0x8000, 0xbfff).ram().share("videoram1");
map(0x8000, 0xbfff).ram().share(m_videoram[0]);
}
@ -506,23 +512,23 @@ void speakres_state::speakres_cpu1_map(address_map &map)
map(0x5000, 0x5000).portr("P1").w(FUNC(speakres_state::out1_w));
map(0x5800, 0x5800).portr("P2").w(FUNC(speakres_state::speakres_out2_w));
map(0x6000, 0x6000).r(FUNC(speakres_state::speakres_in3_r));
map(0x8000, 0xbfff).ram().share("videoram1");
map(0x8000, 0xbfff).ram().share(m_videoram[0]);
}
void route16_state::jongpute_cpu1_map(address_map &map)
void jongpute_state::jongpute_cpu1_map(address_map &map)
{
map(0x0000, 0x3fff).rom();
map(0x4000, 0x43ff).ram().share("sharedram");
map(0x4800, 0x4800).portr("DSW").w(FUNC(route16_state::out0_w));
map(0x5000, 0x5000).r(FUNC(route16_state::jongpute_input_r<1>)).w(FUNC(route16_state::out1_w));
map(0x5800, 0x5800).rw(FUNC(route16_state::jongpute_input_r<0>), FUNC(route16_state::jongpute_input_w));
map(0x4800, 0x4800).portr("DSW").w(FUNC(jongpute_state::out0_w));
map(0x5000, 0x5000).r(FUNC(jongpute_state::input_r<1>)).w(FUNC(jongpute_state::out1_w));
map(0x5800, 0x5800).rw(FUNC(jongpute_state::input_r<0>), FUNC(jongpute_state::input_w));
map(0x6800, 0x6800).w("ay8910", FUNC(ay8910_device::data_w));
map(0x6900, 0x6900).w("ay8910", FUNC(ay8910_device::address_w));
map(0x8000, 0xbfff).ram().share("videoram1");
map(0x8000, 0xbfff).ram().share(m_videoram[0]);
}
void route16_state::vscompmj_cpu1_map(address_map &map)
void jongpute_state::vscompmj_cpu1_map(address_map &map)
{
jongpute_cpu1_map(map);
@ -530,29 +536,12 @@ void route16_state::vscompmj_cpu1_map(address_map &map)
map(0x7000, 0x7fff).rom();
}
void route16_state::vscompmj_decrypted_opcodes(address_map &map)
void jongpute_state::vscompmj_decrypted_opcodes(address_map &map)
{
map(0x0000, 0x7fff).rom().share("decrypted_opcodes");
}
void route16_state::route16_cpu2_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x4000, 0x43ff).ram().share("sharedram");
map(0x8000, 0xbfff).ram().share("videoram2");
}
void speakres_state::stratvox_cpu2_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x2800, 0x2800).w(FUNC(speakres_state::stratvox_dac_w));
map(0x4000, 0x43ff).ram().share("sharedram");
map(0x8000, 0xbfff).ram().share("videoram2");
}
void route16_state::cpu1_io_map(address_map &map)
{
map.global_mask(0x1ff);
@ -561,6 +550,23 @@ void route16_state::cpu1_io_map(address_map &map)
}
void route16_state::route16_cpu2_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x4000, 0x43ff).ram().share("sharedram");
map(0x8000, 0xbfff).ram().share(m_videoram[1]);
}
void speakres_state::stratvox_cpu2_map(address_map &map)
{
map(0x0000, 0x1fff).rom();
map(0x2800, 0x2800).w(FUNC(speakres_state::stratvox_dac_w));
map(0x4000, 0x43ff).ram().share("sharedram");
map(0x8000, 0xbfff).ram().share(m_videoram[1]);
}
/*************************************
*
@ -878,7 +884,7 @@ INPUT_PORTS_END
void route16_state::route16(machine_config &config)
{
/* basic machine hardware */
// basic machine hardware
Z80(config, m_cpu1, 10_MHz_XTAL / 4); // verified on PCB
m_cpu1->set_addrmap(AS_PROGRAM, &route16_state::route16_cpu1_map);
m_cpu1->set_addrmap(AS_IO, &route16_state::cpu1_io_map);
@ -889,17 +895,17 @@ void route16_state::route16(machine_config &config)
config.set_maximum_quantum(attotime::from_hz(m_cpu1->clock() / 4));
/* video hardware */
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
m_screen->set_size(256, 256);
m_screen->set_visarea(0, 256-1, 0, 256-1);
m_screen->set_refresh_hz(57);
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); /* not accurate */
m_screen->set_vblank_time(ATTOSECONDS_IN_USEC(2500)); // not accurate
m_screen->set_screen_update(FUNC(route16_state::screen_update_route16));
PALETTE(config, m_palette, palette_device::RGB_3BIT);
/* sound hardware */
// sound hardware
SPEAKER(config, "speaker").front_center();
AY8910(config, "ay8910", 10_MHz_XTAL / 8).add_route(ALL_OUTPUTS, "speaker", 0.5); // verified on PCB
}
@ -909,7 +915,7 @@ void route16_state::routex(machine_config &config)
{
route16(config);
/* basic machine hardware */
// basic machine hardware
m_cpu1->set_addrmap(AS_PROGRAM, &route16_state::routex_cpu1_map);
}
@ -918,14 +924,14 @@ void speakres_state::stratvox(machine_config &config)
{
route16(config);
/* basic machine hardware */
// basic machine hardware
m_cpu1->set_addrmap(AS_PROGRAM, &speakres_state::stratvox_cpu1_map);
m_cpu2->set_addrmap(AS_PROGRAM, &speakres_state::stratvox_cpu2_map);
/* video hardware */
// video hardware
m_screen->set_screen_update(FUNC(speakres_state::screen_update_stratvox));
/* sound hardware */
// sound hardware
subdevice<ay8910_device>("ay8910")->port_a_write_callback().set(FUNC(speakres_state::stratvox_sn76477_w)); // SN76477 commands (SN76477 not populated on Route 16 PCB)
SN76477(config, m_sn);
@ -951,40 +957,36 @@ void speakres_state::speakres(machine_config &config)
{
stratvox(config);
/* basic machine hardware */
// basic machine hardware
m_cpu1->set_addrmap(AS_PROGRAM, &speakres_state::speakres_cpu1_map);
MCFG_MACHINE_START_OVERRIDE(speakres_state, speakres)
}
void speakres_state::spacecho(machine_config &config)
{
speakres(config);
/* basic machine hardware */
// basic machine hardware
m_cpu2->set_periodic_int(FUNC(route16_state::irq0_line_hold), attotime::from_hz(48*60));
}
void route16_state::jongpute(machine_config &config)
void jongpute_state::jongpute(machine_config &config)
{
route16(config);
m_cpu1->set_addrmap(AS_PROGRAM, &route16_state::jongpute_cpu1_map);
m_cpu1->set_addrmap(AS_PROGRAM, &jongpute_state::jongpute_cpu1_map);
m_cpu1->set_addrmap(AS_IO, address_map_constructor());
MCFG_MACHINE_START_OVERRIDE(route16_state, jongpute)
/* video hardware */
m_screen->set_screen_update(FUNC(route16_state::screen_update_stratvox));
// video hardware
m_screen->set_screen_update(FUNC(jongpute_state::screen_update_stratvox));
PALETTE(config.replace(), m_palette, palette_device::BGR_3BIT);
}
void route16_state::vscompmj(machine_config &config)
void jongpute_state::vscompmj(machine_config &config)
{
jongpute(config);
m_cpu1->set_addrmap(AS_PROGRAM, &route16_state::vscompmj_cpu1_map);
m_cpu1->set_addrmap(AS_OPCODES, &route16_state::vscompmj_decrypted_opcodes);
m_cpu1->set_addrmap(AS_PROGRAM, &jongpute_state::vscompmj_cpu1_map);
m_cpu1->set_addrmap(AS_OPCODES, &jongpute_state::vscompmj_decrypted_opcodes);
}
@ -1451,15 +1453,15 @@ GAME( 1981, route16bl, route16, route16, route16, route16_state, empty_init,
GAME( 1981, routex, route16, routex, route16, route16_state, empty_init, ROT270, "bootleg", "Route X (bootleg, set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1981, routexa, route16, routex, route16, route16_state, empty_init, ROT270, "bootleg", "Route X (bootleg, set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, speakres, 0, speakres, speakres, speakres_state, empty_init, ROT270, "Sun Electronics", "Speak & Rescue", MACHINE_SUPPORTS_SAVE )
GAME( 1980, speakresb, speakres, speakres, speakres, speakres_state, empty_init, ROT270, "bootleg", "Speak & Rescue (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, stratvox, speakres, stratvox, stratvox, speakres_state, empty_init, ROT270, "Sun Electronics (Taito license)", "Stratovox (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, stratvoxa, speakres, stratvox, stratvox, speakres_state, empty_init, ROT270, "Sun Electronics (Taito license)", "Stratovox (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, stratvoxb, speakres, stratvox, stratvox, speakres_state, empty_init, ROT270, "bootleg", "Stratovox (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, spacecho, speakres, spacecho, spacecho, speakres_state, empty_init, ROT270, "bootleg (Gayton Games)", "Space Echo (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, spacecho2, speakres, spacecho, spacecho, speakres_state, empty_init, ROT270, "bootleg (Gayton Games)", "Space Echo (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, speakhlp, speakres, spacecho, spacecho, speakres_state, empty_init, ROT270, "bootleg", "Speak & Help", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1980, speakres, 0, speakres, speakres, speakres_state, empty_init, ROT270, "Sun Electronics", "Speak & Rescue", MACHINE_SUPPORTS_SAVE )
GAME( 1980, speakresb, speakres, speakres, speakres, speakres_state, empty_init, ROT270, "bootleg", "Speak & Rescue (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, stratvox, speakres, stratvox, stratvox, speakres_state, empty_init, ROT270, "Sun Electronics (Taito license)", "Stratovox (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, stratvoxa, speakres, stratvox, stratvox, speakres_state, empty_init, ROT270, "Sun Electronics (Taito license)", "Stratovox (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, stratvoxb, speakres, stratvox, stratvox, speakres_state, empty_init, ROT270, "bootleg", "Stratovox (bootleg)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, spacecho, speakres, spacecho, spacecho, speakres_state, empty_init, ROT270, "bootleg (Gayton Games)", "Space Echo (set 1)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, spacecho2, speakres, spacecho, spacecho, speakres_state, empty_init, ROT270, "bootleg (Gayton Games)", "Space Echo (set 2)", MACHINE_SUPPORTS_SAVE )
GAME( 1980, speakhlp, speakres, spacecho, spacecho, speakres_state, empty_init, ROT270, "bootleg", "Speak & Help", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND )
GAME( 1981, jongpute, 0, jongpute, jongpute, route16_state, empty_init, ROT0, "Alpha Denshi Co.", "Jongputer", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NOT_WORKING ) // sampling voice is not emulated, bug with colors makes tile recognition difficult
GAME( 1981, ttmahjng, jongpute, jongpute, jongpute, route16_state, empty_init, ROT0, "Alpha Denshi Co. (Taito license)", "T.T Mahjong", MACHINE_SUPPORTS_SAVE )
GAME( 1981, vscompmj, jongpute, vscompmj, jongpute, route16_state, init_vscompmj, ROT0, "Nichibutsu", "VS Computer Mahjong", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NOT_WORKING ) // decryption might be incomplete (attract resets), inputs seem read differently
GAME( 1981, jongpute, 0, jongpute, jongpute, jongpute_state, empty_init, ROT0, "Alpha Denshi Co.", "Jongputer", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NOT_WORKING ) // sampling voice is not emulated, bug with colors makes tile recognition difficult
GAME( 1981, ttmahjng, jongpute, jongpute, jongpute, jongpute_state, empty_init, ROT0, "Alpha Denshi Co. (Taito license)", "T.T Mahjong", MACHINE_SUPPORTS_SAVE )
GAME( 1981, vscompmj, jongpute, vscompmj, jongpute, jongpute_state, init_vscompmj, ROT0, "Nichibutsu", "VS Computer Mahjong", MACHINE_SUPPORTS_SAVE | MACHINE_IMPERFECT_SOUND | MACHINE_IMPERFECT_COLORS | MACHINE_NOT_WORKING ) // decryption might be incomplete (attract resets), inputs seem read differently

View File

@ -15,68 +15,80 @@ public:
: driver_device(mconfig, type, tag)
, m_cpu1(*this, "cpu1")
, m_cpu2(*this, "cpu2")
, m_videoram1(*this, "videoram1")
, m_videoram2(*this, "videoram2")
, m_decrypted_opcodes(*this, "decrypted_opcodes")
, m_videoram(*this, "videoram%u", 1U)
, m_proms(*this, "proms")
, m_palette(*this, "palette")
, m_screen(*this, "screen")
, m_key(*this, "KEY%u", 0U)
{ }
void routex(machine_config &config);
void jongpute(machine_config &config);
void route16(machine_config &config);
void vscompmj(machine_config &config);
void init_route16();
void init_route16a();
void init_route16c();
void init_route16d();
void init_vscompmj();
protected:
virtual void video_start() override ATTR_COLD;
virtual void machine_start() override ATTR_COLD;
void out0_w(uint8_t data);
void out1_w(uint8_t data);
uint32_t screen_update_route16(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
uint32_t screen_update_stratvox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
required_device<cpu_device> m_cpu1;
required_device<cpu_device> m_cpu2;
required_shared_ptr_array<uint8_t, 2> m_videoram;
required_region_ptr<uint8_t> m_proms;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
uint8_t m_protection_data = 0;
uint8_t m_flipscreen = 0;
uint8_t m_palreg[2] = { };
private:
uint8_t route16_prot_r();
uint8_t routex_prot_r();
void jongpute_input_w(uint8_t data);
template <int N> uint8_t jongpute_input_r();
DECLARE_MACHINE_START(jongpute);
uint32_t screen_update_route16(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
protected:
uint32_t screen_update_stratvox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect);
private:
void cpu1_io_map(address_map &map) ATTR_COLD;
void route16_cpu1_map(address_map &map) ATTR_COLD;
void route16_cpu2_map(address_map &map) ATTR_COLD;
void routex_cpu1_map(address_map &map) ATTR_COLD;
};
class jongpute_state : public route16_state
{
public:
jongpute_state(const machine_config &mconfig, device_type type, const char *tag)
: route16_state(mconfig, type, tag)
, m_decrypted_opcodes(*this, "decrypted_opcodes")
, m_key(*this, "KEY%u", 0U)
{ }
void jongpute(machine_config &config);
void vscompmj(machine_config &config);
void init_vscompmj();
protected:
virtual void machine_start() override ATTR_COLD;
private:
void input_w(uint8_t data);
template <int N> uint8_t input_r();
void jongpute_cpu1_map(address_map &map) ATTR_COLD;
void vscompmj_cpu1_map(address_map &map) ATTR_COLD;
void vscompmj_decrypted_opcodes(address_map &map) ATTR_COLD;
protected:
required_device<cpu_device> m_cpu1;
required_device<cpu_device> m_cpu2;
required_shared_ptr<uint8_t> m_videoram1;
required_shared_ptr<uint8_t> m_videoram2;
optional_shared_ptr<uint8_t> m_decrypted_opcodes;
required_device<palette_device> m_palette;
required_device<screen_device> m_screen;
optional_ioport_array<8> m_key;
uint8_t m_protection_data = 0;
required_ioport_array<8> m_key;
uint8_t m_jongpute_port_select = 0;
uint8_t m_flipscreen = 0;
uint8_t m_palette_1 = 0;
uint8_t m_palette_2 = 0;
uint8_t m_port_select = 0;
};
#endif // MAME_SUNELECTRONICS_ROUTE16_H

View File

@ -11,13 +11,6 @@
#include "emu.h"
#include "route16.h"
void route16_state::video_start()
{
save_item(NAME(m_flipscreen));
save_item(NAME(m_palette_1));
save_item(NAME(m_palette_2));
}
/*************************************
*
* Memory handlers
@ -26,7 +19,7 @@ void route16_state::video_start()
void route16_state::out0_w(uint8_t data)
{
m_palette_1 = data & 0x1f;
m_palreg[0] = data & 0x1f;
machine().bookkeeping().coin_counter_w(0, (data >> 5) & 0x01);
}
@ -34,7 +27,7 @@ void route16_state::out0_w(uint8_t data)
void route16_state::out1_w(uint8_t data)
{
m_palette_2 = data & 0x1f;
m_palreg[1] = data & 0x1f;
m_flipscreen = (data >> 5) & 0x01;
}
@ -49,31 +42,33 @@ void route16_state::out1_w(uint8_t data)
uint32_t route16_state::screen_update_route16(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t *color_prom1 = &memregion("proms")->base()[0x000];
uint8_t *color_prom2 = &memregion("proms")->base()[0x100];
uint8_t *color_prom1 = &m_proms[0x000];
uint8_t *color_prom2 = &m_proms[0x100];
for (offs_t offs = 0; offs < m_videoram1.bytes(); offs++)
for (offs_t offs = 0; offs < m_videoram[0].bytes(); offs++)
{
uint8_t y = offs >> 6;
uint8_t x = offs << 2;
uint8_t data1 = m_videoram1[offs];
uint8_t data2 = m_videoram2[offs];
uint8_t data1 = m_videoram[0][offs];
uint8_t data2 = m_videoram[1][offs];
for (int i = 0; i < 4; i++)
{
uint8_t dx = x, dy = y;
// Game observation shows that Route 16 can blank each bitmap by setting bit 1 of the
// palette register. Since the schematics are missing the relevant pages, I cannot confirm
// how this works, but I am 99% sure the bit 1 would be connected to A7 of the color PROM.
// Since the color PROMs contain 0 in the upper half, this would produce a black output.
uint8_t color1 = color_prom1[((m_palette_1 << 6) & 0x80) |
(m_palette_1 << 2) |
uint8_t color1 = color_prom1[((m_palreg[0] << 6) & 0x80) |
(m_palreg[0] << 2) |
((data1 >> 3) & 0x02) |
((data1 >> 0) & 0x01)];
uint8_t color2 = color_prom2[((m_palette_2 << 6) & 0x80) |
(m_palette_2 << 2) |
uint8_t color2 = color_prom2[((m_palreg[1] << 6) & 0x80) |
(m_palreg[1] << 2) |
((data2 >> 3) & 0x02) |
((data2 >> 0) & 0x01)];
@ -82,12 +77,12 @@ uint32_t route16_state::screen_update_route16(screen_device &screen, bitmap_rgb3
if (m_flipscreen)
{
y = 255 - y;
x = 255 - x;
dy = 255 - dy;
dx = 255 - dx;
}
if (cliprect.contains(x, y))
bitmap.pix(y, x) = m_palette->pen_color(final_color);
if (cliprect.contains(dx, dy))
bitmap.pix(dy, dx) = m_palette->pen_color(final_color);
x++;
data1 >>= 1;
@ -103,26 +98,28 @@ uint32_t route16_state::screen_update_route16(screen_device &screen, bitmap_rgb3
uint32_t route16_state::screen_update_stratvox(screen_device &screen, bitmap_rgb32 &bitmap, const rectangle &cliprect)
{
uint8_t *color_prom1 = &memregion("proms")->base()[0x000];
uint8_t *color_prom2 = &memregion("proms")->base()[0x100];
uint8_t *color_prom1 = &m_proms[0x000];
uint8_t *color_prom2 = &m_proms[0x100];
for (offs_t offs = 0; offs < m_videoram1.bytes(); offs++)
for (offs_t offs = 0; offs < m_videoram[0].bytes(); offs++)
{
uint8_t y = offs >> 6;
uint8_t x = offs << 2;
uint8_t data1 = m_videoram1[offs];
uint8_t data2 = m_videoram2[offs];
uint8_t data1 = m_videoram[0][offs];
uint8_t data2 = m_videoram[1][offs];
for (int i = 0; i < 4; i++)
{
uint8_t color1 = color_prom1[(m_palette_1 << 2) |
uint8_t dx = x, dy = y;
uint8_t color1 = color_prom1[(m_palreg[0] << 2) |
((data1 >> 3) & 0x02) |
((data1 >> 0) & 0x01)];
// bit 7 of the 2nd color is the OR of the 1st color bits 0 and 1 (verified)
uint8_t color2 = color_prom2[(((data1 << 3) & 0x80) | ((data1 << 7) & 0x80)) |
(m_palette_2 << 2) |
(m_palreg[1] << 2) |
((data2 >> 3) & 0x02) |
((data2 >> 0) & 0x01)];
@ -131,12 +128,12 @@ uint32_t route16_state::screen_update_stratvox(screen_device &screen, bitmap_rgb
if (m_flipscreen)
{
y = 255 - y;
x = 255 - x;
dy = 255 - dy;
dx = 255 - dx;
}
if (cliprect.contains(x, y))
bitmap.pix(y, x) = m_palette->pen_color(final_color);
if (cliprect.contains(dx, dy))
bitmap.pix(dy, dx) = m_palette->pen_color(final_color);
x++;
data1 >>= 1;