igs017.cpp : Updates

Simplify handlers, Reduce duplicates, Unnecessary runtime tag lookups, Unnecessary lines, Fix spacings
This commit is contained in:
cam900 2019-05-03 13:45:19 +09:00
parent 9a57fb3d79
commit faa8cd8cd9

View File

@ -94,9 +94,9 @@ public:
auto out_pb_callback() { return m_out_pb_cb.bind(); } auto out_pb_callback() { return m_out_pb_cb.bind(); }
auto out_pc_callback() { return m_out_pc_cb.bind(); } auto out_pc_callback() { return m_out_pc_cb.bind(); }
DECLARE_WRITE8_MEMBER( address_w ); void address_w(u8 data);
DECLARE_WRITE8_MEMBER( data_w ); void data_w(u8 data);
DECLARE_READ8_MEMBER( data_r ); u8 data_r();
void set_m3_bits(int m3, u8 b0, u8 b1, u8 b2, u8 b3); void set_m3_bits(int m3, u8 b0, u8 b1, u8 b2, u8 b3);
void set_mf_bits(u8 b0, u8 b1, u8 b2, u8 b3); void set_mf_bits(u8 b0, u8 b1, u8 b2, u8 b3);
@ -199,33 +199,33 @@ void igs_bitswap_device::device_reset()
m_val = m_word = 0; m_val = m_word = 0;
} }
WRITE8_MEMBER(igs_bitswap_device::address_w) void igs_bitswap_device::address_w(u8 data)
{ {
m_address = data; m_address = data;
} }
WRITE8_MEMBER(igs_bitswap_device::data_w) void igs_bitswap_device::data_w(u8 data)
{ {
switch (m_address) switch (m_address)
{ {
case 0x00: case 0x00:
if (!m_out_pa_cb.isnull()) if (!m_out_pa_cb.isnull())
{ {
m_out_pa_cb((offs_t)0, data); m_out_pa_cb(data);
return; return;
} }
break; break;
case 0x01: case 0x01:
if (!m_out_pb_cb.isnull()) if (!m_out_pb_cb.isnull())
{ {
m_out_pb_cb((offs_t)0, data); m_out_pb_cb(data);
return; return;
} }
break; break;
case 0x02: case 0x02:
if (!m_out_pc_cb.isnull()) if (!m_out_pc_cb.isnull())
{ {
m_out_pc_cb((offs_t)0, data); m_out_pc_cb(data);
return; return;
} }
break; break;
@ -312,21 +312,21 @@ WRITE8_MEMBER(igs_bitswap_device::data_w)
logerror("%s: warning, writing to address %02x = %02x\n", machine().describe_context(), m_address, data); logerror("%s: warning, writing to address %02x = %02x\n", machine().describe_context(), m_address, data);
} }
READ8_MEMBER(igs_bitswap_device::data_r) u8 igs_bitswap_device::data_r()
{ {
switch (m_address) switch (m_address)
{ {
case 0x00: case 0x00:
if (!m_in_pa_cb.isnull()) if (!m_in_pa_cb.isnull())
return m_in_pa_cb(0); return m_in_pa_cb();
break; break;
case 0x01: case 0x01:
if (!m_in_pb_cb.isnull()) if (!m_in_pb_cb.isnull())
return m_in_pb_cb(0); return m_in_pb_cb();
break; break;
case 0x02: case 0x02:
if (!m_in_pc_cb.isnull()) if (!m_in_pc_cb.isnull())
return m_in_pc_cb(0); return m_in_pc_cb();
break; break;
case 0x03: // result case 0x03: // result
@ -387,10 +387,10 @@ class igs_incdec_device : public device_t
public: public:
igs_incdec_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock); igs_incdec_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock);
DECLARE_WRITE8_MEMBER( reset_w ); void reset_w(u8 data = 0);
DECLARE_WRITE8_MEMBER( inc_w ); void inc_w(u8 data = 0);
DECLARE_WRITE8_MEMBER( dec_w ); void dec_w(u8 data = 0);
DECLARE_READ8_MEMBER( val_r ); u8 val_r();
protected: protected:
virtual void device_start() override; virtual void device_start() override;
@ -400,25 +400,25 @@ private:
u8 m_val; u8 m_val;
}; };
WRITE8_MEMBER(igs_incdec_device::reset_w) void igs_incdec_device::reset_w(u8 data)
{ {
m_val = 0x00; m_val = 0x00;
logerror("%s: reset -> %02x\n", machine().describe_context(), m_val); logerror("%s: reset -> %02x\n", machine().describe_context(), m_val);
} }
WRITE8_MEMBER(igs_incdec_device::inc_w) void igs_incdec_device::inc_w(u8 data)
{ {
m_val++; m_val++;
logerror("%s: inc -> %02x\n", machine().describe_context(), m_val); logerror("%s: inc -> %02x\n", machine().describe_context(), m_val);
} }
WRITE8_MEMBER(igs_incdec_device::dec_w) void igs_incdec_device::dec_w(u8 data)
{ {
m_val--; m_val--;
logerror("%s: dec -> %02x\n", machine().describe_context(), m_val); logerror("%s: dec -> %02x\n", machine().describe_context(), m_val);
} }
READ8_MEMBER(igs_incdec_device::val_r) u8 igs_incdec_device::val_r()
{ {
u8 res = (BIT(m_val, 0) << 7) | u8 res = (BIT(m_val, 0) << 7) |
(BIT(m_val, 3) << 5) | (BIT(m_val, 3) << 5) |
@ -465,7 +465,14 @@ public:
m_decrypted_opcodes(*this, "decrypted_opcodes"), m_decrypted_opcodes(*this, "decrypted_opcodes"),
m_igs017_igs031(*this, "igs017_igs031"), m_igs017_igs031(*this, "igs017_igs031"),
m_igs_bitswap(*this, "igs_bitswap"), m_igs_bitswap(*this, "igs_bitswap"),
m_igs_incdec(*this, "igs_incdec") m_igs_incdec(*this, "igs_incdec"),
m_io_coins(*this, "COINS"),
m_io_buttons(*this, "BUTTONS"),
m_io_player1(*this, "PLAYER1"),
m_io_player2(*this, "PLAYER2"),
m_io_hopper(*this, "HOPPER"),
m_io_key(*this, "KEY%u", 0U),
m_io_dsw(*this, "DSW%u", 1U)
{ } { }
void mgcs(machine_config &config); void mgcs(machine_config &config);
@ -513,11 +520,19 @@ private:
optional_device<igs_bitswap_device> m_igs_bitswap; optional_device<igs_bitswap_device> m_igs_bitswap;
optional_device<igs_incdec_device> m_igs_incdec; optional_device<igs_incdec_device> m_igs_incdec;
optional_ioport m_io_coins;
optional_ioport m_io_buttons;
optional_ioport m_io_player1;
optional_ioport m_io_player2;
optional_ioport m_io_hopper;
optional_ioport_array<5> m_io_key;
optional_ioport_array<2> m_io_dsw;
void igs025_to_igs022_callback(void); void igs025_to_igs022_callback(void);
u8 m_input_select; u8 m_input_select;
u8 m_hopper; u8 m_hopper;
u16 m_igs_magic[2]; u16 m_igs_magic;
u8 m_scramble_data; u8 m_scramble_data;
u8 m_dsw_select; u8 m_dsw_select;
@ -529,41 +544,45 @@ private:
// IGS029 protection (mgcs) // IGS029 protection (mgcs)
u32 m_igs029_mgcs_long; u32 m_igs029_mgcs_long;
DECLARE_WRITE8_MEMBER(input_select_w); void input_select_w(u8 data);
DECLARE_WRITE8_MEMBER(iqblocka_keyin_w); void iqblocka_keyin_w(u8 data);
DECLARE_WRITE8_MEMBER(iqblockf_keyout_w); void iqblockf_keyout_w(u8 data);
DECLARE_WRITE8_MEMBER(iqblocka_remap_addr_w); void iqblocka_remap_addr_w(offs_t offset, u8 data);
DECLARE_WRITE16_MEMBER(mgcs_magic_w);
DECLARE_READ16_MEMBER(mgcs_magic_r);
u16 mgcs_palette_bitswap(u16 bgr) const; u16 mgcs_palette_bitswap(u16 bgr) const;
u16 lhzb2a_palette_bitswap(u16 bgr) const; u16 lhzb2a_palette_bitswap(u16 bgr) const;
u16 tjsb_palette_bitswap(u16 bgr) const; u16 tjsb_palette_bitswap(u16 bgr) const;
u16 slqz2_palette_bitswap(u16 bgr) const; u16 slqz2_palette_bitswap(u16 bgr) const;
DECLARE_READ8_MEMBER(sdmg2_keys_r); void magic_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(sdmg2_magic_w); u16 magic_r();
DECLARE_READ16_MEMBER(sdmg2_magic_r);
DECLARE_READ8_MEMBER(mgdh_keys_r);
DECLARE_WRITE16_MEMBER(mgdha_magic_w);
DECLARE_READ16_MEMBER(mgdha_magic_r);
DECLARE_WRITE8_MEMBER(tjsb_output_w); void mgcs_magic_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_READ8_MEMBER(tjsb_input_r); u16 mgcs_magic_r();
DECLARE_READ8_MEMBER(spkrform_input_r);
DECLARE_WRITE16_MEMBER(lhzb2a_input_select_w); u8 sdmg2_keys_r();
DECLARE_READ16_MEMBER(lhzb2a_input_r); void sdmg2_magic_w(offs_t offset, u16 data, u16 mem_mask = ~0);
DECLARE_WRITE16_MEMBER(lhzb2a_remap_addr_w); u16 sdmg2_magic_r();
DECLARE_WRITE16_MEMBER(lhzb2_magic_w); u8 mgdh_keys_r();
DECLARE_READ16_MEMBER(lhzb2_magic_r); void mgdha_magic_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 mgdha_magic_r();
DECLARE_WRITE16_MEMBER(slqz2_magic_w); void tjsb_output_w(u8 data);
DECLARE_READ16_MEMBER(slqz2_magic_r); u8 tjsb_input_r();
DECLARE_READ8_MEMBER(mgcs_keys_r); u8 spkrform_input_r();
void lhzb2a_input_select_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 lhzb2a_input_r(offs_t offset);
void lhzb2a_remap_addr_w(address_space &space, u16 data);
void lhzb2_magic_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 lhzb2_magic_r();
void slqz2_magic_w(offs_t offset, u16 data, u16 mem_mask = ~0);
u16 slqz2_magic_r();
u8 mgcs_keys_r();
DECLARE_MACHINE_RESET(iqblocka); DECLARE_MACHINE_RESET(iqblocka);
DECLARE_MACHINE_RESET(mgcs); DECLARE_MACHINE_RESET(mgcs);
@ -655,12 +674,11 @@ void igs017_state::decrypt_program_rom(int mask, int a7, int a6, int a5, int a4,
int length = memregion("maincpu")->bytes(); int length = memregion("maincpu")->bytes();
u8 *rom = memregion("maincpu")->base(); u8 *rom = memregion("maincpu")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length); std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length);
int i;
// decrypt the program ROM // decrypt the program ROM
// XOR layer // XOR layer
for (i = 0;i < length;i++) for (int i = 0; i < length; i++)
{ {
if (i & 0x2000) if (i & 0x2000)
{ {
@ -693,7 +711,7 @@ void igs017_state::decrypt_program_rom(int mask, int a7, int a6, int a5, int a4,
memcpy(tmp.get(),rom,length); memcpy(tmp.get(),rom,length);
// address lines swap // address lines swap
for (i = 0;i < length;i++) for (int i = 0; i < length; i++)
{ {
int addr = (i & ~0xff) | bitswap<8>(i,a7,a6,a5,a4,a3,a2,a1,a0); int addr = (i & ~0xff) | bitswap<8>(i,a7,a6,a5,a4,a3,a2,a1,a0);
rom[i] = tmp[addr]; rom[i] = tmp[addr];
@ -721,18 +739,17 @@ void igs017_state::tjsb_decrypt_sprites()
int length = memregion("igs017_igs031:sprites")->bytes(); int length = memregion("igs017_igs031:sprites")->bytes();
u8 *rom = memregion("igs017_igs031:sprites")->base(); u8 *rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length); std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length);
int i, addr;
// address lines swap // address lines swap
memcpy(tmp.get(), rom, length); memcpy(tmp.get(), rom, length);
for (i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
addr = (i & ~0xff) | bitswap<8>(i,7,6,5,2,1,4,3,0); int addr = (i & ~0xff) | bitswap<8>(i,7,6,5,2,1,4,3,0);
rom[i] = tmp[addr]; rom[i] = tmp[addr];
} }
// data lines swap // data lines swap
for (i = 0; i < length; i += 2) for (int i = 0; i < length; i += 2)
{ {
u16 data = (rom[i+1] << 8) | rom[i+0]; // x-22222-11111-00000 u16 data = (rom[i+1] << 8) | rom[i+0]; // x-22222-11111-00000
data = bitswap<16>(data, 15, 14,13,12,11,10, 9,1,7,6,5, 4,3,2,8,0); data = bitswap<16>(data, 15, 14,13,12,11,10, 9,1,7,6,5, 4,3,2,8,0);
@ -753,12 +770,11 @@ void igs017_state::init_tjsb()
void igs017_state::mgcs_decrypt_program_rom() void igs017_state::mgcs_decrypt_program_rom()
{ {
int i;
u16 *src = (u16 *)memregion("maincpu")->base(); u16 *src = (u16 *)memregion("maincpu")->base();
int rom_size = 0x80000; int rom_size = 0x80000;
for (i=0; i<rom_size/2; i++) for (int i=0; i<rom_size/2; i++)
{ {
u16 x = src[i]; u16 x = src[i];
@ -806,10 +822,9 @@ void igs017_state::mgcs_decrypt_tiles()
int length = memregion("igs017_igs031:tilemaps")->bytes(); int length = memregion("igs017_igs031:tilemaps")->bytes();
u8 *rom = memregion("igs017_igs031:tilemaps")->base(); u8 *rom = memregion("igs017_igs031:tilemaps")->base();
std::vector<u8> tmp(length); std::vector<u8> tmp(length);
int i;
memcpy(&tmp[0],rom,length); memcpy(&tmp[0],rom,length);
for (i = 0;i < length;i++) for (int i = 0; i < length; i++)
{ {
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10,6,7,8,9,5,4,3,2,1,0); int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,10,6,7,8,9,5,4,3,2,1,0);
rom[i^1] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7); rom[i^1] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7);
@ -820,9 +835,8 @@ void igs017_state::mgcs_flip_sprites()
{ {
int length = memregion("igs017_igs031:sprites")->bytes(); int length = memregion("igs017_igs031:sprites")->bytes();
u8 *rom = memregion("igs017_igs031:sprites")->base(); u8 *rom = memregion("igs017_igs031:sprites")->base();
int i;
for (i = 0;i < length;i+=2) for (int i = 0; i < length; i+=2)
{ {
u16 pixels = (rom[i+1] << 8) | rom[i+0]; u16 pixels = (rom[i+1] << 8) | rom[i+0];
@ -866,10 +880,9 @@ void igs017_state::tarzan_decrypt_tiles()
int length = memregion("igs017_igs031:tilemaps")->bytes(); int length = memregion("igs017_igs031:tilemaps")->bytes();
u8 *rom = memregion("igs017_igs031:tilemaps")->base(); u8 *rom = memregion("igs017_igs031:tilemaps")->base();
std::vector<u8> tmp(length); std::vector<u8> tmp(length);
int i;
memcpy(&tmp[0],rom,length); memcpy(&tmp[0],rom,length);
for (i = 0;i < length;i++) for (int i = 0; i < length; i++)
{ {
int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,7,8,6,10,9,5,4,3,2,1,0); int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,12,11,7,8,6,10,9,5,4,3,2,1,0);
rom[i] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7); rom[i] = bitswap<8>(tmp[addr],0,1,2,3,4,5,6,7);
@ -880,10 +893,9 @@ void igs017_state::tarzan_decrypt_tiles()
void igs017_state::tarzan_decrypt_program_rom() void igs017_state::tarzan_decrypt_program_rom()
{ {
u16 *ROM = (u16 *)memregion("maincpu")->base(); u16 *ROM = (u16 *)memregion("maincpu")->base();
int i;
int size = 0x40000; int size = 0x40000;
for(i=0; i<size/2; i++) for(int i=0; i<size/2; i++)
{ {
u16 x = ROM[i]; u16 x = ROM[i];
@ -906,10 +918,9 @@ void igs017_state::tarzan_decrypt_program_rom()
void igs017_state::tarzana_decrypt_program_rom() void igs017_state::tarzana_decrypt_program_rom()
{ {
u8 *ROM = memregion("maincpu")->base(); u8 *ROM = memregion("maincpu")->base();
int i;
int size = 0x80000; int size = 0x80000;
for (i = 0; i < size; i++) for (int i = 0; i < size; i++)
{ {
u8 x = 0; u8 x = 0;
if ((i & 0x00011) == 0x00011) x ^= 0x01; if ((i & 0x00011) == 0x00011) x ^= 0x01;
@ -1115,13 +1126,11 @@ void igs017_state::lhzb2_decrypt_tiles()
int length = memregion("igs017_igs031:tilemaps")->bytes(); int length = memregion("igs017_igs031:tilemaps")->bytes();
u8 *rom = memregion("igs017_igs031:tilemaps")->base(); u8 *rom = memregion("igs017_igs031:tilemaps")->base();
std::vector<u8> tmp(length); std::vector<u8> tmp(length);
int i;
int addr;
memcpy(&tmp[0], rom, length); memcpy(&tmp[0], rom, length);
for (i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
addr = (i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,18,17,1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0); int addr = (i & ~0xffffff) | bitswap<24>(i,23,22,21,20,19,18,17,1,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,0);
rom[i] = tmp[addr]; rom[i] = tmp[addr];
} }
} }
@ -1131,18 +1140,17 @@ void igs017_state::lhzb2_decrypt_sprites()
int length = memregion("igs017_igs031:sprites")->bytes(); int length = memregion("igs017_igs031:sprites")->bytes();
u8 *rom = memregion("igs017_igs031:sprites")->base(); u8 *rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length); std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length);
int i, addr;
// address lines swap // address lines swap
memcpy(tmp.get(), rom, length); memcpy(tmp.get(), rom, length);
for (i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,6,7,10,9,8,11,12,5,4,3,2,1,0); int addr = (i & ~0xffff) | bitswap<16>(i,15,14,13,6,7,10,9,8,11,12,5,4,3,2,1,0);
rom[i] = tmp[addr]; rom[i] = tmp[addr];
} }
// data lines swap // data lines swap
for (i = 0;i < length;i+=2) for (int i = 0; i < length; i+=2)
{ {
u16 data = (rom[i+1] << 8) | rom[i+0]; // x-22222-11111-00000 u16 data = (rom[i+1] << 8) | rom[i+0]; // x-22222-11111-00000
data = bitswap<16>(data, 15, 7,6,5,4,3, 2,1,0,14,13, 12,11,10,9,8); data = bitswap<16>(data, 15, 7,6,5,4,3, 2,1,0,14,13, 12,11,10,9,8);
@ -1330,10 +1338,9 @@ void igs017_state::slqz2_decrypt_tiles()
int length = memregion("igs017_igs031:tilemaps")->bytes(); int length = memregion("igs017_igs031:tilemaps")->bytes();
u8 *rom = memregion("igs017_igs031:tilemaps")->base(); u8 *rom = memregion("igs017_igs031:tilemaps")->base();
std::vector<u8> tmp(length); std::vector<u8> tmp(length);
int i;
memcpy(&tmp[0],rom,length); memcpy(&tmp[0],rom,length);
for (i = 0;i < length;i++) for (int i = 0; i < length; i++)
{ {
int addr = (i & ~0xff) | bitswap<8>(i,7,4,5,6,3,2,1,0); int addr = (i & ~0xff) | bitswap<8>(i,7,4,5,6,3,2,1,0);
rom[i] = tmp[addr]; rom[i] = tmp[addr];
@ -1433,12 +1440,12 @@ void igs017_state::spkrform_decrypt_sprites()
int length = memregion("igs017_igs031:sprites")->bytes(); int length = memregion("igs017_igs031:sprites")->bytes();
u8 *rom = memregion("igs017_igs031:sprites")->base(); u8 *rom = memregion("igs017_igs031:sprites")->base();
std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length); std::unique_ptr<u8[]> tmp = std::make_unique<u8[]>(length);
int i, addr;
// address lines swap // address lines swap
memcpy(tmp.get(), rom, length); memcpy(tmp.get(), rom, length);
for (i = 0; i < length; i++) for (int i = 0; i < length; i++)
{ {
int addr;
if (i & 0x80000) if (i & 0x80000)
addr = (i & ~0xff) | bitswap<8>(i,7,6,3,4,5,2,1,0); addr = (i & ~0xff) | bitswap<8>(i,7,6,3,4,5,2,1,0);
else else
@ -1475,12 +1482,12 @@ void igs017_state::decrypted_opcodes_map(address_map &map)
map(0x00000, 0x3ffff).rom().share("decrypted_opcodes"); map(0x00000, 0x3ffff).rom().share("decrypted_opcodes");
} }
WRITE8_MEMBER(igs017_state::input_select_w) void igs017_state::input_select_w(u8 data)
{ {
m_input_select = data; m_input_select = data;
} }
WRITE8_MEMBER(igs017_state::iqblocka_keyin_w) void igs017_state::iqblocka_keyin_w(u8 data)
{ {
machine().bookkeeping().coin_counter_w(0, data & 0x80); // key in (in gambling mode) machine().bookkeeping().coin_counter_w(0, data & 0x80); // key in (in gambling mode)
// popmessage("PORT0 %02X", data); // popmessage("PORT0 %02X", data);
@ -1488,7 +1495,7 @@ WRITE8_MEMBER(igs017_state::iqblocka_keyin_w)
logerror("%s: warning, unknown bits written in keyin_w = %02x\n", machine().describe_context(), data); logerror("%s: warning, unknown bits written in keyin_w = %02x\n", machine().describe_context(), data);
} }
WRITE8_MEMBER(igs017_state::iqblockf_keyout_w) void igs017_state::iqblockf_keyout_w(u8 data)
{ {
machine().bookkeeping().coin_counter_w(1, data & 0x80); // key out (in gambling mode, only iqblockf/genius6) machine().bookkeeping().coin_counter_w(1, data & 0x80); // key out (in gambling mode, only iqblockf/genius6)
// popmessage("PORT1 %02X", data); // popmessage("PORT1 %02X", data);
@ -1496,7 +1503,7 @@ WRITE8_MEMBER(igs017_state::iqblockf_keyout_w)
logerror("%s: warning, unknown bits written in keyout_w = %02x\n", machine().describe_context(), data); logerror("%s: warning, unknown bits written in keyout_w = %02x\n", machine().describe_context(), data);
} }
WRITE8_MEMBER(igs017_state::iqblocka_remap_addr_w) void igs017_state::iqblocka_remap_addr_w(offs_t offset, u8 data)
{ {
if (offset == 0) if (offset == 0)
{ {
@ -1520,10 +1527,10 @@ WRITE8_MEMBER(igs017_state::iqblocka_remap_addr_w)
// Add new memory ranges // Add new memory ranges
address_space &prg_space = m_maincpu->space(AS_PROGRAM); address_space &prg_space = m_maincpu->space(AS_PROGRAM);
prg_space.install_write_handler ( m_remap_addr + 0x0, m_remap_addr + 0x0, write8_delegate(FUNC(igs_incdec_device::reset_w), &(*m_igs_incdec)) ); prg_space.install_write_handler(m_remap_addr + 0x0, m_remap_addr + 0x0, write8smo_delegate(FUNC(igs_incdec_device::reset_w), &(*m_igs_incdec)));
prg_space.install_write_handler ( m_remap_addr + 0x1, m_remap_addr + 0x1, write8_delegate(FUNC(igs_incdec_device::dec_w), &(*m_igs_incdec)) ); prg_space.install_write_handler(m_remap_addr + 0x1, m_remap_addr + 0x1, write8smo_delegate(FUNC(igs_incdec_device::dec_w), &(*m_igs_incdec)));
prg_space.install_write_handler ( m_remap_addr + 0x3, m_remap_addr + 0x3, write8_delegate(FUNC(igs_incdec_device::inc_w), &(*m_igs_incdec)) ); prg_space.install_write_handler(m_remap_addr + 0x3, m_remap_addr + 0x3, write8smo_delegate(FUNC(igs_incdec_device::inc_w), &(*m_igs_incdec)));
prg_space.install_read_handler ( m_remap_addr + 0x5, m_remap_addr + 0x5, read8_delegate (FUNC(igs_incdec_device::val_r), &(*m_igs_incdec)) ); prg_space.install_read_handler (m_remap_addr + 0x5, m_remap_addr + 0x5, read8smo_delegate (FUNC(igs_incdec_device::val_r), &(*m_igs_incdec)));
logerror("%s: incdec protection remapped at %04x\n", machine().describe_context(), m_remap_addr); logerror("%s: incdec protection remapped at %04x\n", machine().describe_context(), m_remap_addr);
} }
@ -1608,7 +1615,7 @@ void igs017_state::mgcs_igs029_run()
m_igs029_recv_buf[m_igs029_recv_len++] = 0x00; m_igs029_recv_buf[m_igs029_recv_len++] = 0x00;
m_igs029_recv_buf[m_igs029_recv_len++] = 0x00; m_igs029_recv_buf[m_igs029_recv_len++] = 0x00;
m_igs029_recv_buf[m_igs029_recv_len++] = 0x00; m_igs029_recv_buf[m_igs029_recv_len++] = 0x00;
m_igs029_recv_buf[m_igs029_recv_len++] = min_bets[ (~ioport("DSW2")->read()) & 3 ]; m_igs029_recv_buf[m_igs029_recv_len++] = min_bets[ (~m_io_dsw[1]->read()) & 3 ];
m_igs029_recv_buf[m_igs029_recv_len++] = 0x05; m_igs029_recv_buf[m_igs029_recv_len++] = 0x05;
} }
else if (m_igs029_send_buf[0] == 0x03 && m_igs029_send_buf[1] == 0x39) else if (m_igs029_send_buf[0] == 0x03 && m_igs029_send_buf[1] == 0x39)
@ -1616,8 +1623,8 @@ void igs017_state::mgcs_igs029_run()
logerror("READ DSW\n"); logerror("READ DSW\n");
u8 ret; u8 ret;
if (~m_dsw_select & 0x01) ret = ioport("DSW1")->read(); if (~m_dsw_select & 0x01) ret = m_io_dsw[0]->read();
else if (~m_dsw_select & 0x02) ret = ioport("DSW2")->read(); else if (~m_dsw_select & 0x02) ret = m_io_dsw[1]->read();
else else
{ {
logerror("%s: warning, reading dsw with dsw_select = %02x\n", machine().describe_context(), m_dsw_select); logerror("%s: warning, reading dsw with dsw_select = %02x\n", machine().describe_context(), m_dsw_select);
@ -1674,14 +1681,19 @@ void igs017_state::mgcs_igs029_run()
m_igs029_send_len = 0; m_igs029_send_len = 0;
} }
WRITE16_MEMBER(igs017_state::mgcs_magic_w) void igs017_state::magic_w(offs_t offset, u16 data, u16 mem_mask)
{ {
COMBINE_DATA(&m_igs_magic[offset]); COMBINE_DATA(&m_igs_magic);
}
if (offset == 0) u16 igs017_state::magic_r()
return; {
return m_igs_magic;
}
switch(m_igs_magic[0]) void igs017_state::mgcs_magic_w(offs_t offset, u16 data, u16 mem_mask)
{
switch (m_igs_magic)
{ {
case 0x00: case 0x00:
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
@ -1738,7 +1750,7 @@ WRITE16_MEMBER(igs017_state::mgcs_magic_w)
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
m_scramble_data = data & 0xff; m_scramble_data = data & 0xff;
// logerror("%s: writing %02x to igs_magic = %02x\n", machine().describe_context(), data & 0xff, m_igs_magic[0]); // logerror("%s: writing %02x to igs_magic = %02x\n", machine().describe_context(), data & 0xff, m_igs_magic);
} }
break; break;
@ -1748,21 +1760,18 @@ WRITE16_MEMBER(igs017_state::mgcs_magic_w)
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
m_igs029_send_data = data & 0xff; m_igs029_send_data = data & 0xff;
// logerror("%s: writing %02x to igs_magic = %02x\n", machine().describe_context(), data & 0xff, m_igs_magic[0]); // logerror("%s: writing %02x to igs_magic = %02x\n", machine().describe_context(), data & 0xff, m_igs_magic);
} }
break; break;
default: default:
logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data); logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic, data);
} }
} }
READ16_MEMBER(igs017_state::mgcs_magic_r) u16 igs017_state::mgcs_magic_r()
{ {
if (offset == 0) switch (m_igs_magic)
return m_igs_magic[0];
switch(m_igs_magic[0])
{ {
case 0x00: case 0x00:
return m_input_select | 0x02; return m_input_select | 0x02;
@ -1770,34 +1779,34 @@ READ16_MEMBER(igs017_state::mgcs_magic_r)
case 0x01: case 0x01:
{ {
u16 ret = bitswap<8>( (bitswap<8>(m_scramble_data, 0,1,2,3,4,5,6,7) + 1) & 3, 4,5,6,7, 0,1,2,3); u16 ret = bitswap<8>( (bitswap<8>(m_scramble_data, 0,1,2,3,4,5,6,7) + 1) & 3, 4,5,6,7, 0,1,2,3);
logerror("%s: reading %02x from igs_magic = %02x\n", machine().describe_context(), ret, m_igs_magic[0]); logerror("%s: reading %02x from igs_magic = %02x\n", machine().describe_context(), ret, m_igs_magic);
return ret; return ret;
} }
case 0x02: case 0x02:
{ {
u8 ret = m_igs029_recv_data; u8 ret = m_igs029_recv_data;
logerror("%s: reading %02x from igs_magic = %02x\n", machine().describe_context(), ret, m_igs_magic[0]); logerror("%s: reading %02x from igs_magic = %02x\n", machine().describe_context(), ret, m_igs_magic);
return ret; return ret;
} }
// case 0x05: ??? // case 0x05: ???
default: default:
logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]); logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic);
break; break;
} }
return 0xffff; return 0xffff;
} }
READ8_MEMBER(igs017_state::mgcs_keys_r) u8 igs017_state::mgcs_keys_r()
{ {
if (~m_input_select & 0x08) return ioport("KEY0")->read(); if (~m_input_select & 0x08) return m_io_key[0]->read();
if (~m_input_select & 0x10) return ioport("KEY1")->read(); if (~m_input_select & 0x10) return m_io_key[1]->read();
if (~m_input_select & 0x20) return ioport("KEY2")->read(); if (~m_input_select & 0x20) return m_io_key[2]->read();
if (~m_input_select & 0x40) return ioport("KEY3")->read(); if (~m_input_select & 0x40) return m_io_key[3]->read();
if (~m_input_select & 0x80) return ioport("KEY4")->read(); if (~m_input_select & 0x80) return m_io_key[4]->read();
logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select); logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
return 0xff; return 0xff;
@ -1807,7 +1816,8 @@ void igs017_state::mgcs_map(address_map &map)
{ {
map(0x000000, 0x07ffff).rom(); map(0x000000, 0x07ffff).rom();
map(0x300000, 0x303fff).ram(); map(0x300000, 0x303fff).ram();
map(0x49c000, 0x49c003).w(FUNC(igs017_state::mgcs_magic_w)).r(FUNC(igs017_state::mgcs_magic_r)); map(0x49c000, 0x49c001).rw(FUNC(igs017_state::magic_r), FUNC(igs017_state::magic_w));
map(0x49c002, 0x49c003).rw(FUNC(igs017_state::mgcs_magic_r), FUNC(igs017_state::mgcs_magic_w));
map(0xa00000, 0xa0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff); map(0xa00000, 0xa0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff);
@ -1818,28 +1828,23 @@ void igs017_state::mgcs_map(address_map &map)
// sdmg2 // sdmg2
READ8_MEMBER(igs017_state::sdmg2_keys_r) u8 igs017_state::sdmg2_keys_r()
{ {
if (~m_input_select & 0x01) return ioport("KEY0")->read(); if (~m_input_select & 0x01) return m_io_key[0]->read();
if (~m_input_select & 0x02) return ioport("KEY1")->read(); if (~m_input_select & 0x02) return m_io_key[1]->read();
if (~m_input_select & 0x04) return ioport("KEY2")->read(); if (~m_input_select & 0x04) return m_io_key[2]->read();
if (~m_input_select & 0x08) return ioport("KEY3")->read(); if (~m_input_select & 0x08) return m_io_key[3]->read();
if (~m_input_select & 0x10) return ioport("KEY4")->read(); if (~m_input_select & 0x10) return m_io_key[4]->read();
if (m_input_select == 0x1f) return ioport("KEY0")->read(); // in joystick mode if (m_input_select == 0x1f) return m_io_key[0]->read(); // in joystick mode
logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select); logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
return 0xff; return 0xff;
} }
WRITE16_MEMBER(igs017_state::sdmg2_magic_w) void igs017_state::sdmg2_magic_w(offs_t offset, u16 data, u16 mem_mask)
{ {
COMBINE_DATA(&m_igs_magic[offset]); switch (m_igs_magic)
if (offset == 0)
return;
switch(m_igs_magic[0])
{ {
// case 0x00: ? 0x80 // case 0x00: ? 0x80
@ -1861,25 +1866,25 @@ WRITE16_MEMBER(igs017_state::sdmg2_magic_w)
break; break;
default: default:
logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data); logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic, data);
} }
} }
READ16_MEMBER(igs017_state::sdmg2_magic_r) u16 igs017_state::sdmg2_magic_r()
{ {
switch(m_igs_magic[0]) switch (m_igs_magic)
{ {
case 0x00: case 0x00:
{ {
u16 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x0000 : 0x0001; u16 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x0000 : 0x0001;
return ioport("COINS")->read() | hopper_bit; return m_io_coins->read() | hopper_bit;
} }
case 0x02: case 0x02:
return sdmg2_keys_r(space, 0); return sdmg2_keys_r();
default: default:
logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]); logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic);
break; break;
} }
@ -1894,35 +1899,30 @@ void igs017_state::sdmg2_map(address_map &map)
map(0x200000, 0x20ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff); map(0x200000, 0x20ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff);
map(0x210001, 0x210001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write)); map(0x210001, 0x210001).rw(m_oki, FUNC(okim6295_device::read), FUNC(okim6295_device::write));
map(0x300000, 0x300003).w(FUNC(igs017_state::sdmg2_magic_w)); map(0x300000, 0x300001).w(FUNC(igs017_state::magic_w));
map(0x300002, 0x300003).r(FUNC(igs017_state::sdmg2_magic_r)); map(0x300002, 0x300003).rw(FUNC(igs017_state::sdmg2_magic_r), FUNC(igs017_state::sdmg2_magic_w));
} }
// mgdh, mgdha // mgdh, mgdha
READ8_MEMBER(igs017_state::mgdh_keys_r) u8 igs017_state::mgdh_keys_r()
{ {
if (~m_input_select & 0x04) return ioport("KEY0")->read(); if (~m_input_select & 0x04) return m_io_key[0]->read();
if (~m_input_select & 0x08) return ioport("KEY1")->read(); if (~m_input_select & 0x08) return m_io_key[1]->read();
if (~m_input_select & 0x10) return ioport("KEY2")->read(); if (~m_input_select & 0x10) return m_io_key[2]->read();
if (~m_input_select & 0x20) return ioport("KEY3")->read(); if (~m_input_select & 0x20) return m_io_key[3]->read();
if (~m_input_select & 0x40) return ioport("KEY4")->read(); if (~m_input_select & 0x40) return m_io_key[4]->read();
if ((m_input_select & 0xfc) == 0xfc) return ioport("DSW1")->read(); if ((m_input_select & 0xfc) == 0xfc) return m_io_dsw[0]->read();
logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select); logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
return 0xff; return 0xff;
} }
WRITE16_MEMBER(igs017_state::mgdha_magic_w) void igs017_state::mgdha_magic_w(offs_t offset, u16 data, u16 mem_mask)
{ {
COMBINE_DATA(&m_igs_magic[offset]); switch (m_igs_magic)
if (offset == 0)
return;
switch(m_igs_magic[0])
{ {
case 0x00: case 0x00:
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
@ -1968,31 +1968,31 @@ WRITE16_MEMBER(igs017_state::mgdha_magic_w)
04ac10: warning, writing to igs_magic 06 = ff 04ac10: warning, writing to igs_magic 06 = ff
04ac20: warning, writing to igs_magic 07 = 3f 04ac20: warning, writing to igs_magic 07 = 3f
*/ */
logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data); logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic, data);
} }
} }
READ16_MEMBER(igs017_state::mgdha_magic_r) u16 igs017_state::mgdha_magic_r()
{ {
switch(m_igs_magic[0]) switch (m_igs_magic)
{ {
case 0x00: case 0x00:
return mgdh_keys_r(space, 0); return mgdh_keys_r();
case 0x01: case 0x01:
return ioport("BUTTONS")->read(); return m_io_buttons->read();
case 0x02: case 0x02:
return bitswap<8>(ioport("DSW2")->read(), 0,1,2,3,4,5,6,7); return bitswap<8>(m_io_dsw[1]->read(), 0,1,2,3,4,5,6,7);
case 0x03: case 0x03:
{ {
u16 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x0000 : 0x0001; u16 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x0000 : 0x0001;
return ioport("COINS")->read() | hopper_bit; return m_io_coins->read() | hopper_bit;
} }
default: default:
logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]); logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic);
break; break;
} }
@ -2003,8 +2003,8 @@ void igs017_state::mgdha_map(address_map &map)
{ {
map(0x000000, 0x07ffff).rom(); map(0x000000, 0x07ffff).rom();
map(0x600000, 0x603fff).ram(); map(0x600000, 0x603fff).ram();
map(0x876000, 0x876003).w(FUNC(igs017_state::mgdha_magic_w)); map(0x876000, 0x876001).w(FUNC(igs017_state::magic_w));
map(0x876002, 0x876003).r(FUNC(igs017_state::mgdha_magic_r)); map(0x876002, 0x876003).rw(FUNC(igs017_state::mgdha_magic_r), FUNC(igs017_state::mgdha_magic_w));
map(0xa00000, 0xa0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff); map(0xa00000, 0xa0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff);
@ -2014,7 +2014,7 @@ void igs017_state::mgdha_map(address_map &map)
// tjsb // tjsb
WRITE8_MEMBER(igs017_state::tjsb_output_w) void igs017_state::tjsb_output_w(u8 data)
{ {
switch (m_input_select) switch (m_input_select)
{ {
@ -2045,17 +2045,17 @@ WRITE8_MEMBER(igs017_state::tjsb_output_w)
logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_input_select, data); logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_input_select, data);
} }
READ8_MEMBER(igs017_state::tjsb_input_r) u8 igs017_state::tjsb_input_r()
{ {
switch (m_input_select) switch (m_input_select)
{ {
case 0x00: return ioport("PLAYER1")->read(); case 0x00: return m_io_player1->read();
case 0x01: return ioport("PLAYER2")->read(); case 0x01: return m_io_player2->read();
case 0x02: return ioport("COINS")->read(); case 0x02: return m_io_coins->read();
case 0x03: case 0x03:
{ {
u8 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x00 : 0x20; u8 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x00 : 0x20;
return ioport("HOPPER")->read() | hopper_bit; return m_io_hopper->read() | hopper_bit;
} }
default: default:
@ -2097,16 +2097,16 @@ void igs017_state::spkrform_map(address_map &map)
map(0x10000, 0x3ffff).rom(); map(0x10000, 0x3ffff).rom();
} }
READ8_MEMBER(igs017_state::spkrform_input_r) u8 igs017_state::spkrform_input_r()
{ {
switch (m_input_select) switch (m_input_select)
{ {
case 0x00: return ioport("PLAYER1")->read(); case 0x00: return m_io_player1->read();
case 0x01: return ioport("PLAYER2")->read(); case 0x01: return m_io_player2->read();
case 0x02: return ioport("COINS")->read(); case 0x02: return m_io_coins->read();
case 0x03: case 0x03:
{ {
return ioport("BUTTONS")->read(); return m_io_buttons->read();
} }
default: default:
@ -2135,14 +2135,9 @@ void igs017_state::spkrform_io(address_map &map)
// lhzb2 // lhzb2
WRITE16_MEMBER(igs017_state::lhzb2_magic_w) void igs017_state::lhzb2_magic_w(offs_t offset, u16 data, u16 mem_mask)
{ {
COMBINE_DATA(&m_igs_magic[offset]); switch (m_igs_magic)
if (offset == 0)
return;
switch(m_igs_magic[0])
{ {
case 0x00: case 0x00:
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
@ -2165,28 +2160,28 @@ WRITE16_MEMBER(igs017_state::lhzb2_magic_w)
break; break;
default: default:
logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data); logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic, data);
} }
} }
READ16_MEMBER(igs017_state::lhzb2_magic_r) u16 igs017_state::lhzb2_magic_r()
{ {
switch(m_igs_magic[0]) switch (m_igs_magic)
{ {
case 0x01: case 0x01:
{ {
if (~m_input_select & 0x01) return ioport("KEY0")->read(); if (~m_input_select & 0x01) return m_io_key[0]->read();
if (~m_input_select & 0x02) return ioport("KEY1")->read(); if (~m_input_select & 0x02) return m_io_key[1]->read();
if (~m_input_select & 0x04) return ioport("KEY2")->read(); if (~m_input_select & 0x04) return m_io_key[2]->read();
if (~m_input_select & 0x08) return ioport("KEY3")->read(); if (~m_input_select & 0x08) return m_io_key[3]->read();
if (~m_input_select & 0x10) return ioport("KEY4")->read(); if (~m_input_select & 0x10) return m_io_key[4]->read();
logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select); logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
return 0xffff; return 0xffff;
} }
default: default:
logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]); logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic);
break; break;
} }
@ -2197,8 +2192,8 @@ void igs017_state::lhzb2_map(address_map &map)
{ {
map(0x000000, 0x07ffff).rom(); map(0x000000, 0x07ffff).rom();
map(0x500000, 0x503fff).ram(); map(0x500000, 0x503fff).ram();
map(0x910000, 0x910003).w(FUNC(igs017_state::lhzb2_magic_w)); map(0x910000, 0x910001).w(FUNC(igs017_state::magic_w));
map(0x910002, 0x910003).r(FUNC(igs017_state::lhzb2_magic_r)); map(0x910002, 0x910003).rw(FUNC(igs017_state::lhzb2_magic_r), FUNC(igs017_state::lhzb2_magic_w));
map(0xb00000, 0xb0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff); map(0xb00000, 0xb0ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff);
@ -2209,17 +2204,17 @@ void igs017_state::lhzb2_map(address_map &map)
// lhzb2a // lhzb2a
// To do: what devices are on this PCB? // To do: what devices are on this PCB?
READ16_MEMBER(igs017_state::lhzb2a_input_r) u16 igs017_state::lhzb2a_input_r(offs_t offset)
{ {
switch (offset*2) switch (offset*2)
{ {
case 0x00: // Keys case 0x00: // Keys
{ {
if (~m_input_select & 0x01) return ioport("KEY0")->read() << 8; if (~m_input_select & 0x01) return m_io_key[0]->read() << 8;
if (~m_input_select & 0x02) return ioport("KEY1")->read() << 8; if (~m_input_select & 0x02) return m_io_key[1]->read() << 8;
if (~m_input_select & 0x04) return ioport("KEY2")->read() << 8; if (~m_input_select & 0x04) return m_io_key[2]->read() << 8;
if (~m_input_select & 0x08) return ioport("KEY3")->read() << 8; if (~m_input_select & 0x08) return m_io_key[3]->read() << 8;
if (~m_input_select & 0x10) return ioport("KEY4")->read() << 8; if (~m_input_select & 0x10) return m_io_key[4]->read() << 8;
logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select); logerror("%s: warning, reading key with input_select = %02x\n", machine().describe_context(), m_input_select);
return 0xffff; return 0xffff;
@ -2228,11 +2223,11 @@ READ16_MEMBER(igs017_state::lhzb2a_input_r)
case 0x02: case 0x02:
{ {
u16 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x0000 : 0x0002; u16 hopper_bit = (m_hopper && ((m_screen->frame_number()/10)&1)) ? 0x0000 : 0x0002;
return (ioport("DSW1")->read() << 8) | ioport("COINS")->read() | hopper_bit; return (m_io_dsw[0]->read() << 8) | m_io_coins->read() | hopper_bit;
} }
case 0x04: case 0x04:
return ioport("DSW2")->read(); return m_io_dsw[1]->read();
} }
return 0xffff; return 0xffff;
@ -2246,7 +2241,7 @@ READ16_MEMBER(igs017_state::lhzb2a_input_r)
***************************************************************************/ ***************************************************************************/
WRITE16_MEMBER(igs017_state::lhzb2a_remap_addr_w) void igs017_state::lhzb2a_remap_addr_w(address_space &space, u16 data)
{ {
// Unmap previous address ranges // Unmap previous address ranges
if (m_remap_addr != -1) if (m_remap_addr != -1)
@ -2261,16 +2256,16 @@ WRITE16_MEMBER(igs017_state::lhzb2a_remap_addr_w)
m_remap_addr = data & 0xff; m_remap_addr = data & 0xff;
// Add new memory ranges // Add new memory ranges
space.install_write_handler ( m_remap_addr * 0x10000 + 0x4001, m_remap_addr * 0x10000 + 0x4001, write8_delegate(FUNC(igs_bitswap_device::address_w), &(*m_igs_bitswap)) ); space.install_write_handler (m_remap_addr * 0x10000 + 0x4001, m_remap_addr * 0x10000 + 0x4001, write8smo_delegate(FUNC(igs_bitswap_device::address_w), &(*m_igs_bitswap)));
space.install_readwrite_handler ( m_remap_addr * 0x10000 + 0x4003, m_remap_addr * 0x10000 + 0x4003, read8_delegate (FUNC(igs_bitswap_device::data_r), &(*m_igs_bitswap)), write8_delegate(FUNC(igs_bitswap_device::data_w), &(*m_igs_bitswap)) ); space.install_readwrite_handler(m_remap_addr * 0x10000 + 0x4003, m_remap_addr * 0x10000 + 0x4003, read8smo_delegate (FUNC(igs_bitswap_device::data_r), &(*m_igs_bitswap)), write8smo_delegate(FUNC(igs_bitswap_device::data_w), &(*m_igs_bitswap)));
space.install_read_handler ( m_remap_addr * 0x10000 + 0x8000, m_remap_addr * 0x10000 + 0x8005, read16_delegate (FUNC(igs017_state::lhzb2a_input_r), this) ); space.install_read_handler (m_remap_addr * 0x10000 + 0x8000, m_remap_addr * 0x10000 + 0x8005, read16sm_delegate (FUNC(igs017_state::lhzb2a_input_r), this));
space.install_write_handler ( m_remap_addr * 0x10000 + 0xc000, m_remap_addr * 0x10000 + 0xc001, write16_delegate(FUNC(igs017_state::lhzb2a_remap_addr_w), this) ); space.install_write_handler (m_remap_addr * 0x10000 + 0xc000, m_remap_addr * 0x10000 + 0xc001, write16mo_delegate(FUNC(igs017_state::lhzb2a_remap_addr_w), this));
logerror("%s: inputs and protection remapped at %02xxxxx\n", machine().describe_context(), m_remap_addr); logerror("%s: inputs and protection remapped at %02xxxxx\n", machine().describe_context(), m_remap_addr);
} }
WRITE16_MEMBER(igs017_state::lhzb2a_input_select_w) void igs017_state::lhzb2a_input_select_w(offs_t offset, u16 data, u16 mem_mask)
{ {
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
{ {
@ -2283,7 +2278,7 @@ WRITE16_MEMBER(igs017_state::lhzb2a_input_select_w)
{ {
m_oki->set_rom_bank((data >> 8) & 1); m_oki->set_rom_bank((data >> 8) & 1);
if ( data & 0x0fe00 ) if (data & 0xfe00)
logerror("%s: warning, unknown bits written in input_select = %04x\n", machine().describe_context(), data); logerror("%s: warning, unknown bits written in input_select = %04x\n", machine().describe_context(), data);
} }
} }
@ -2312,14 +2307,9 @@ void igs017_state::lhzb2a_map(address_map &map)
// slqz2 // slqz2
WRITE16_MEMBER(igs017_state::slqz2_magic_w) void igs017_state::slqz2_magic_w(offs_t offset, u16 data, u16 mem_mask)
{ {
COMBINE_DATA(&m_igs_magic[offset]); switch (m_igs_magic)
if (offset == 0)
return;
switch(m_igs_magic[0])
{ {
case 0x00: case 0x00:
if (ACCESSING_BITS_0_7) if (ACCESSING_BITS_0_7)
@ -2336,23 +2326,23 @@ WRITE16_MEMBER(igs017_state::slqz2_magic_w)
break; break;
default: default:
logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic[0], data); logerror("%s: warning, writing to igs_magic %02x = %02x\n", machine().describe_context(), m_igs_magic, data);
} }
} }
READ16_MEMBER(igs017_state::slqz2_magic_r) u16 igs017_state::slqz2_magic_r()
{ {
switch(m_igs_magic[0]) switch (m_igs_magic)
{ {
case 0x00: case 0x00:
return ioport("PLAYER2")->read(); return m_io_player2->read();
case 0x01: case 0x01:
return ioport("PLAYER1")->read(); return m_io_player1->read();
case 0x02: case 0x02:
return ioport("BUTTONS")->read(); return m_io_buttons->read();
default: default:
logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic[0]); logerror("%s: warning, reading with igs_magic = %02x\n", machine().describe_context(), m_igs_magic);
break; break;
} }
@ -2363,8 +2353,8 @@ void igs017_state::slqz2_map(address_map &map)
{ {
map(0x000000, 0x07ffff).rom(); map(0x000000, 0x07ffff).rom();
map(0x100000, 0x103fff).ram(); map(0x100000, 0x103fff).ram();
map(0x602000, 0x602003).w(FUNC(igs017_state::slqz2_magic_w)); map(0x602000, 0x602001).w(FUNC(igs017_state::magic_w));
map(0x602002, 0x602003).r(FUNC(igs017_state::slqz2_magic_r)); map(0x602002, 0x602003).rw(FUNC(igs017_state::slqz2_magic_r), FUNC(igs017_state::slqz2_magic_w));
map(0x900000, 0x90ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff); map(0x900000, 0x90ffff).rw(m_igs017_igs031, FUNC(igs017_igs031_device::read), FUNC(igs017_igs031_device::write)).umask16(0x00ff);
@ -3600,7 +3590,7 @@ MACHINE_RESET_MEMBER(igs017_state,mgcs)
MACHINE_RESET_CALL_MEMBER( iqblocka ); MACHINE_RESET_CALL_MEMBER( iqblocka );
m_scramble_data = 0; m_scramble_data = 0;
memset(m_igs_magic, 0, sizeof(m_igs_magic)); m_igs_magic = 0;
} }
void igs017_state::mgcs(machine_config &config) void igs017_state::mgcs(machine_config &config)
@ -3683,7 +3673,7 @@ void igs017_state::lhzb2(machine_config &config)
MACHINE_RESET_MEMBER(igs017_state,lhzb2a) MACHINE_RESET_MEMBER(igs017_state,lhzb2a)
{ {
MACHINE_RESET_CALL_MEMBER( mgcs ); MACHINE_RESET_CALL_MEMBER( mgcs );
lhzb2a_remap_addr_w(m_maincpu->space(AS_PROGRAM), 0, 0xf0); lhzb2a_remap_addr_w(m_maincpu->space(AS_PROGRAM), 0xf0);
} }
void igs017_state::lhzb2a(machine_config &config) void igs017_state::lhzb2a(machine_config &config)