mirror of
https://github.com/holub/mame
synced 2025-04-21 07:52:35 +03:00
gb.cpp: Use memory views for bios disable and to remove some cartslot trampolines. (#9033)
This commit is contained in:
parent
76152ba35e
commit
2f797626a0
@ -286,195 +286,125 @@ space. This mapper uses 32KB sized banks.
|
||||
#define SGB_FRAMES_PER_SECOND 61.17
|
||||
|
||||
|
||||
uint8_t gb_state::gb_cart_r(offs_t offset)
|
||||
uint8_t gb_state::gb_bios_r(offs_t offset)
|
||||
{
|
||||
if (m_bios_disable && m_cartslot)
|
||||
return m_cartslot->read_rom(offset);
|
||||
else
|
||||
uint8_t *ROM = m_region_maincpu->base();
|
||||
if (m_bios_hack->read())
|
||||
{
|
||||
if (offset < 0x100)
|
||||
{
|
||||
uint8_t *ROM = m_region_maincpu->base();
|
||||
if (m_bios_hack->read())
|
||||
{
|
||||
// patch out logo and checksum checks
|
||||
// (useful to run some pirate carts until we implement
|
||||
// their complete functionalities + to test homebrew)
|
||||
if (offset == 0xe9 || offset == 0xea)
|
||||
return 0x00;
|
||||
if (offset == 0xfa || offset == 0xfb)
|
||||
return 0x00;
|
||||
}
|
||||
return ROM[offset];
|
||||
}
|
||||
else if (m_cartslot)
|
||||
{
|
||||
return m_cartslot->read_rom(offset);
|
||||
}
|
||||
else
|
||||
return 0xff;
|
||||
// patch out logo and checksum checks
|
||||
// (useful to run some pirate carts until we implement
|
||||
// their complete functionalities + to test homebrew)
|
||||
if (offset == 0xe9 || offset == 0xea)
|
||||
return 0x00;
|
||||
if (offset == 0xfa || offset == 0xfb)
|
||||
return 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
uint8_t gb_state::gbc_cart_r(offs_t offset)
|
||||
{
|
||||
if (m_bios_disable && m_cartslot)
|
||||
return m_cartslot->read_rom(offset);
|
||||
else
|
||||
{
|
||||
if (offset < 0x100)
|
||||
{
|
||||
uint8_t *ROM = m_region_maincpu->base();
|
||||
if (m_bios_hack->read())
|
||||
{
|
||||
// patch out logo and checksum checks
|
||||
// (useful to run some pirate carts until we implement
|
||||
// their complete functionalities + to test homebrew)
|
||||
if (offset == 0xdb || offset == 0xdc)
|
||||
return 0x00;
|
||||
if (offset == 0xed || offset == 0xee)
|
||||
return 0x00;
|
||||
}
|
||||
return ROM[offset];
|
||||
}
|
||||
else if (offset >= 0x200 && offset < 0x900)
|
||||
{
|
||||
uint8_t *ROM = m_region_maincpu->base();
|
||||
return ROM[offset - 0x100];
|
||||
}
|
||||
else if (m_cartslot)
|
||||
{
|
||||
return m_cartslot->read_rom(offset);
|
||||
}
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
}
|
||||
|
||||
void gb_state::gb_bank_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (m_cartslot)
|
||||
m_cartslot->write_bank(offset, data);
|
||||
}
|
||||
|
||||
uint8_t gb_state::gb_ram_r(offs_t offset)
|
||||
{
|
||||
if (m_cartslot)
|
||||
return m_cartslot->read_ram(offset);
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
void gb_state::gb_ram_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (m_cartslot)
|
||||
m_cartslot->write_ram(offset, data);
|
||||
}
|
||||
|
||||
uint8_t gb_state::gb_echo_r(address_space &space, offs_t offset)
|
||||
{
|
||||
return space.read_byte(0xc000 + offset);
|
||||
}
|
||||
|
||||
void gb_state::gb_echo_w(address_space &space, offs_t offset, uint8_t data)
|
||||
{
|
||||
return space.write_byte(0xc000 + offset, data);
|
||||
}
|
||||
|
||||
uint8_t megaduck_state::cart_r(offs_t offset)
|
||||
{
|
||||
if (m_cartslot)
|
||||
return m_cartslot->read_rom(offset);
|
||||
else
|
||||
return 0xff;
|
||||
}
|
||||
|
||||
void megaduck_state::bank1_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (m_cartslot)
|
||||
m_cartslot->write_bank(offset, data);
|
||||
}
|
||||
|
||||
void megaduck_state::bank2_w(offs_t offset, uint8_t data)
|
||||
{
|
||||
if (m_cartslot)
|
||||
m_cartslot->write_ram(offset, data); /* used for bankswitch, but we re-use GB name */
|
||||
return ROM[offset];
|
||||
}
|
||||
|
||||
|
||||
void gb_state::gameboy_map(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x0000, 0x7fff).rw(FUNC(gb_state::gb_cart_r), FUNC(gb_state::gb_bank_w));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(dmg_ppu_device::vram_r), FUNC(dmg_ppu_device::vram_w)); /* 8k VRAM */
|
||||
map(0xa000, 0xbfff).rw(FUNC(gb_state::gb_ram_r), FUNC(gb_state::gb_ram_w)); /* 8k switched RAM bank (cartridge) */
|
||||
map(0xc000, 0xdfff).ram(); /* 8k low RAM */
|
||||
map(0xe000, 0xfdff).rw(FUNC(gb_state::gb_echo_r), FUNC(gb_state::gb_echo_w));
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(dmg_ppu_device::oam_r), FUNC(dmg_ppu_device::oam_w)); /* OAM RAM */
|
||||
map(0xff00, 0xff0f).rw(FUNC(gb_state::gb_io_r), FUNC(gb_state::gb_io_w)); /* I/O */
|
||||
map(0xff10, 0xff26).rw(m_apu, FUNC(gameboy_sound_device::sound_r), FUNC(gameboy_sound_device::sound_w)); /* sound registers */
|
||||
map(0xff27, 0xff2f).noprw(); /* unused */
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w)); /* Wave ram */
|
||||
map(0xff40, 0xff7f).r(m_ppu, FUNC(dmg_ppu_device::video_r)).w(FUNC(gb_state::gb_io2_w)); /* Video controller & BIOS flip-flop */
|
||||
map(0xff80, 0xfffe).ram(); /* High RAM */
|
||||
map(0xffff, 0xffff).rw(FUNC(gb_state::gb_ie_r), FUNC(gb_state::gb_ie_w)); /* Interrupt enable register */
|
||||
map(0x0000, 0x7fff).view(m_cart_low);
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x00ff).r(FUNC(gb_state::gb_bios_r));
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x00ff).r(FUNC(gb_state::gb_bios_r));
|
||||
m_cart_low[BIOS_DISABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_DISABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(dmg_ppu_device::vram_r), FUNC(dmg_ppu_device::vram_w));
|
||||
map(0xa000, 0xbfff).view(m_cart_high);
|
||||
m_cart_high[NO_CART](0xa000, 0xbfff).noprw();
|
||||
m_cart_high[CART_PRESENT](0xa000, 0xbfff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_ram), FUNC(gb_cart_slot_device::write_ram));
|
||||
map(0xc000, 0xdfff).mirror(0x2000).ram();
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(dmg_ppu_device::oam_r), FUNC(dmg_ppu_device::oam_w));
|
||||
map(0xff00, 0xff0f).rw(FUNC(gb_state::gb_io_r), FUNC(gb_state::gb_io_w));
|
||||
map(0xff10, 0xff26).rw(m_apu, FUNC(gameboy_sound_device::sound_r), FUNC(gameboy_sound_device::sound_w));
|
||||
map(0xff27, 0xff2f).noprw();
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w));
|
||||
map(0xff40, 0xff7f).r(m_ppu, FUNC(dmg_ppu_device::video_r)).w(FUNC(gb_state::gb_io2_w));
|
||||
map(0xff80, 0xfffe).ram();
|
||||
map(0xffff, 0xffff).rw(FUNC(gb_state::gb_ie_r), FUNC(gb_state::gb_ie_w));
|
||||
}
|
||||
|
||||
void gb_state::sgb_map(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x0000, 0x7fff).rw(FUNC(gb_state::gb_cart_r), FUNC(gb_state::gb_bank_w));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(sgb_ppu_device::vram_r), FUNC(sgb_ppu_device::vram_w)); /* 8k VRAM */
|
||||
map(0xa000, 0xbfff).rw(FUNC(gb_state::gb_ram_r), FUNC(gb_state::gb_ram_w)); /* 8k switched RAM bank (cartridge) */
|
||||
map(0xc000, 0xdfff).ram(); /* 8k low RAM */
|
||||
map(0xe000, 0xfdff).rw(FUNC(gb_state::gb_echo_r), FUNC(gb_state::gb_echo_w));
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(sgb_ppu_device::oam_r), FUNC(sgb_ppu_device::oam_w)); /* OAM RAM */
|
||||
map(0xff00, 0xff0f).rw(FUNC(gb_state::gb_io_r), FUNC(gb_state::sgb_io_w)); /* I/O */
|
||||
map(0xff10, 0xff26).rw(m_apu, FUNC(gameboy_sound_device::sound_r), FUNC(gameboy_sound_device::sound_w)); /* sound registers */
|
||||
map(0xff27, 0xff2f).noprw(); /* unused */
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w)); /* Wave RAM */
|
||||
map(0xff40, 0xff7f).r(m_ppu, FUNC(sgb_ppu_device::video_r)).w(FUNC(gb_state::gb_io2_w)); /* Video controller & BIOS flip-flop */
|
||||
map(0xff80, 0xfffe).ram(); /* High RAM */
|
||||
map(0xffff, 0xffff).rw(FUNC(gb_state::gb_ie_r), FUNC(gb_state::gb_ie_w)); /* Interrupt enable register */
|
||||
map(0x0000, 0x7fff).view(m_cart_low);
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x00ff).r(FUNC(gb_state::gb_bios_r));
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x00ff).r(FUNC(gb_state::gb_bios_r));
|
||||
m_cart_low[BIOS_DISABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_DISABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(sgb_ppu_device::vram_r), FUNC(sgb_ppu_device::vram_w));
|
||||
map(0xa000, 0xbfff).view(m_cart_high);
|
||||
m_cart_high[NO_CART](0xa000, 0xbfff).noprw();
|
||||
m_cart_high[CART_PRESENT](0xa000, 0xbfff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_ram), FUNC(gb_cart_slot_device::write_ram));
|
||||
map(0xc000, 0xdfff).mirror(0x2000).ram();
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(sgb_ppu_device::oam_r), FUNC(sgb_ppu_device::oam_w));
|
||||
map(0xff00, 0xff0f).rw(FUNC(gb_state::gb_io_r), FUNC(gb_state::sgb_io_w));
|
||||
map(0xff10, 0xff26).rw(m_apu, FUNC(gameboy_sound_device::sound_r), FUNC(gameboy_sound_device::sound_w));
|
||||
map(0xff27, 0xff2f).noprw();
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w));
|
||||
map(0xff40, 0xff7f).r(m_ppu, FUNC(sgb_ppu_device::video_r)).w(FUNC(gb_state::gb_io2_w));
|
||||
map(0xff80, 0xfffe).ram();
|
||||
map(0xffff, 0xffff).rw(FUNC(gb_state::gb_ie_r), FUNC(gb_state::gb_ie_w));
|
||||
}
|
||||
|
||||
void gb_state::gbc_map(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x0000, 0x7fff).rw(FUNC(gb_state::gbc_cart_r), FUNC(gb_state::gb_bank_w));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(cgb_ppu_device::vram_r), FUNC(cgb_ppu_device::vram_w)); /* 8k banked VRAM */
|
||||
map(0xa000, 0xbfff).rw(FUNC(gb_state::gb_ram_r), FUNC(gb_state::gb_ram_w)); /* 8k switched RAM bank (cartridge) */
|
||||
map(0xc000, 0xcfff).ram(); /* 4k fixed RAM bank */
|
||||
map(0xd000, 0xdfff).bankrw("cgb_ram"); /* 4k switched RAM bank */
|
||||
map(0xe000, 0xfdff).rw(FUNC(gb_state::gb_echo_r), FUNC(gb_state::gb_echo_w));
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(cgb_ppu_device::oam_r), FUNC(cgb_ppu_device::oam_w)); /* OAM RAM */
|
||||
map(0xff00, 0xff0f).rw(FUNC(gb_state::gb_io_r), FUNC(gb_state::gbc_io_w)); /* I/O */
|
||||
map(0xff10, 0xff26).rw(m_apu, FUNC(gameboy_sound_device::sound_r), FUNC(gameboy_sound_device::sound_w)); /* sound controller */
|
||||
map(0xff27, 0xff2f).noprw(); /* unused */
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w)); /* Wave RAM */
|
||||
map(0xff40, 0xff7f).rw(FUNC(gb_state::gbc_io2_r), FUNC(gb_state::gbc_io2_w)); /* Other I/O and video controller */
|
||||
map(0xff80, 0xfffe).ram(); /* high RAM */
|
||||
map(0xffff, 0xffff).rw(FUNC(gb_state::gb_ie_r), FUNC(gb_state::gb_ie_w)); /* Interrupt enable register */
|
||||
map(0x0000, 0x7fff).view(m_cart_low);
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x00ff).r(FUNC(gb_state::gb_bios_r));
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0200, 0x08ff).rom().region("maincpu", 0x0100);
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x00ff).r(FUNC(gb_state::gb_bios_r));
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0200, 0x08ff).rom().region("maincpu", 0x0100);
|
||||
m_cart_low[BIOS_DISABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_DISABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(cgb_ppu_device::vram_r), FUNC(cgb_ppu_device::vram_w));
|
||||
map(0xa000, 0xbfff).view(m_cart_high);
|
||||
m_cart_high[NO_CART](0xa000, 0xbfff).noprw();
|
||||
m_cart_high[CART_PRESENT](0xa000, 0xbfff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_ram), FUNC(gb_cart_slot_device::write_ram));
|
||||
map(0xc000, 0xcfff).mirror(0x2000).ram();
|
||||
map(0xd000, 0xdfff).mirror(0x2000).bankrw("cgb_ram");
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(cgb_ppu_device::oam_r), FUNC(cgb_ppu_device::oam_w));
|
||||
map(0xff00, 0xff0f).rw(FUNC(gb_state::gb_io_r), FUNC(gb_state::gbc_io_w));
|
||||
map(0xff10, 0xff26).rw(m_apu, FUNC(gameboy_sound_device::sound_r), FUNC(gameboy_sound_device::sound_w));
|
||||
map(0xff27, 0xff2f).noprw();
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w));
|
||||
map(0xff40, 0xff7f).rw(FUNC(gb_state::gbc_io2_r), FUNC(gb_state::gbc_io2_w));
|
||||
map(0xff80, 0xfffe).ram();
|
||||
map(0xffff, 0xffff).rw(FUNC(gb_state::gb_ie_r), FUNC(gb_state::gb_ie_w));
|
||||
}
|
||||
|
||||
void megaduck_state::megaduck_map(address_map &map)
|
||||
{
|
||||
map.unmap_value_high();
|
||||
map(0x0000, 0x7fff).rw(FUNC(megaduck_state::cart_r), FUNC(megaduck_state::bank1_w));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(dmg_ppu_device::vram_r), FUNC(dmg_ppu_device::vram_w)); /* 8k VRAM */
|
||||
map(0xa000, 0xafff).noprw(); /* unused? */
|
||||
map(0xb000, 0xb000).w(FUNC(megaduck_state::bank2_w));
|
||||
map(0xb001, 0xbfff).noprw(); /* unused? */
|
||||
map(0xc000, 0xfdff).ram(); /* 8k/16k? RAM */
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(dmg_ppu_device::oam_r), FUNC(dmg_ppu_device::oam_w)); /* OAM RAM */
|
||||
map(0xff00, 0xff0f).rw(FUNC(megaduck_state::gb_io_r), FUNC(megaduck_state::gb_io_w)); /* I/O */
|
||||
map(0xff10, 0xff1f).rw(FUNC(megaduck_state::megaduck_video_r), FUNC(megaduck_state::megaduck_video_w)); /* video controller */
|
||||
map(0xff20, 0xff2f).rw(FUNC(megaduck_state::megaduck_sound_r1), FUNC(megaduck_state::megaduck_sound_w1)); /* sound controller pt1 */
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w)); /* wave ram */
|
||||
map(0xff40, 0xff46).rw(FUNC(megaduck_state::megaduck_sound_r2), FUNC(megaduck_state::megaduck_sound_w2)); /* sound controller pt2 */
|
||||
map(0xff47, 0xff7f).noprw(); /* unused */
|
||||
map(0xff80, 0xfffe).ram(); /* high RAM */
|
||||
map(0xffff, 0xffff).rw(FUNC(megaduck_state::gb_ie_r), FUNC(megaduck_state::gb_ie_w)); /* interrupt enable register */
|
||||
map(0x0000, 0x7fff).view(m_cart_low);
|
||||
m_cart_low[BIOS_ENABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_ENABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
m_cart_low[BIOS_DISABLED | NO_CART](0x0000, 0x7fff).noprw();
|
||||
m_cart_low[BIOS_DISABLED | CART_PRESENT](0x0000, 0x7fff).rw(m_cartslot, FUNC(gb_cart_slot_device::read_rom), FUNC(gb_cart_slot_device::write_bank));
|
||||
map(0x8000, 0x9fff).rw(m_ppu, FUNC(dmg_ppu_device::vram_r), FUNC(dmg_ppu_device::vram_w));
|
||||
map(0xa000, 0xafff).noprw(); // unused?
|
||||
map(0xb000, 0xb000).view(m_cart_high);
|
||||
m_cart_high[NO_CART](0xb000, 0xb000).noprw();
|
||||
m_cart_high[CART_PRESENT](0xb000, 0xb000).w(m_cartslot, FUNC(gb_cart_slot_device::write_ram)); // used for bankswitch
|
||||
map(0xb001, 0xbfff).noprw(); // unused?
|
||||
map(0xc000, 0xfdff).ram(); // 8k or 16k? ram
|
||||
map(0xfe00, 0xfeff).rw(m_ppu, FUNC(dmg_ppu_device::oam_r), FUNC(dmg_ppu_device::oam_w));
|
||||
map(0xff00, 0xff0f).rw(FUNC(megaduck_state::gb_io_r), FUNC(megaduck_state::gb_io_w));
|
||||
map(0xff10, 0xff1f).rw(FUNC(megaduck_state::megaduck_video_r), FUNC(megaduck_state::megaduck_video_w));
|
||||
map(0xff20, 0xff2f).rw(FUNC(megaduck_state::megaduck_sound_r1), FUNC(megaduck_state::megaduck_sound_w1));
|
||||
map(0xff30, 0xff3f).rw(m_apu, FUNC(gameboy_sound_device::wave_r), FUNC(gameboy_sound_device::wave_w));
|
||||
map(0xff40, 0xff46).rw(FUNC(megaduck_state::megaduck_sound_r2), FUNC(megaduck_state::megaduck_sound_w2));
|
||||
map(0xff47, 0xff7f).noprw();
|
||||
map(0xff80, 0xfffe).ram();
|
||||
map(0xffff, 0xffff).rw(FUNC(megaduck_state::gb_ie_r), FUNC(megaduck_state::gb_ie_w));
|
||||
}
|
||||
|
||||
|
||||
|
@ -32,7 +32,9 @@ public:
|
||||
m_bios_hack(*this, "SKIP_CHECK"),
|
||||
m_ram(*this, RAM_TAG),
|
||||
m_ppu(*this, "ppu"),
|
||||
m_palette(*this, "palette")
|
||||
m_palette(*this, "palette"),
|
||||
m_cart_low(*this, "cartlow"),
|
||||
m_cart_high(*this, "carthigh")
|
||||
{ }
|
||||
|
||||
uint8_t m_gb_io[0x10];
|
||||
@ -63,8 +65,6 @@ public:
|
||||
uint8_t *m_gbc_rammap[8]; /* (CGB) Addresses of internal RAM banks */
|
||||
uint8_t m_gbc_rambank; /* (CGB) Current CGB RAM bank */
|
||||
|
||||
bool m_bios_disable;
|
||||
|
||||
void gb_io_w(offs_t offset, uint8_t data);
|
||||
void gb_io2_w(offs_t offset, uint8_t data);
|
||||
void sgb_io_w(offs_t offset, uint8_t data);
|
||||
@ -84,13 +84,7 @@ public:
|
||||
void gbc_palette(palette_device &palette) const;
|
||||
void gb_timer_callback(uint8_t data);
|
||||
|
||||
uint8_t gb_cart_r(offs_t offset);
|
||||
uint8_t gbc_cart_r(offs_t offset);
|
||||
void gb_bank_w(offs_t offset, uint8_t data);
|
||||
uint8_t gb_ram_r(offs_t offset);
|
||||
void gb_ram_w(offs_t offset, uint8_t data);
|
||||
uint8_t gb_echo_r(address_space &space, offs_t offset);
|
||||
void gb_echo_w(address_space &space, offs_t offset, uint8_t data);
|
||||
uint8_t gb_bios_r(offs_t offset);
|
||||
optional_device<gb_cart_slot_device> m_cartslot;
|
||||
|
||||
void supergb(machine_config &config);
|
||||
@ -108,6 +102,10 @@ protected:
|
||||
SIO_FAST_CLOCK = 0x02,
|
||||
SIO_INTERNAL_CLOCK = 0x01
|
||||
};
|
||||
static constexpr u8 NO_CART = 0x00;
|
||||
static constexpr u8 BIOS_ENABLED = 0x00;
|
||||
static constexpr u8 CART_PRESENT = 0x01;
|
||||
static constexpr u8 BIOS_DISABLED = 0x02;
|
||||
|
||||
required_device<lr35902_cpu_device> m_maincpu;
|
||||
required_device<gameboy_sound_device> m_apu;
|
||||
@ -118,6 +116,8 @@ protected:
|
||||
optional_device<ram_device> m_ram;
|
||||
required_device<dmg_ppu_device> m_ppu;
|
||||
required_device<palette_device> m_palette;
|
||||
memory_view m_cart_low;
|
||||
memory_view m_cart_high;
|
||||
|
||||
void gb_timer_increment();
|
||||
void gb_timer_check_irq();
|
||||
@ -158,9 +158,6 @@ private:
|
||||
void megaduck_palette(palette_device &palette) const;
|
||||
void megaduck_map(address_map &map);
|
||||
|
||||
uint8_t cart_r(offs_t offset);
|
||||
void bank1_w(offs_t offset, uint8_t data);
|
||||
void bank2_w(offs_t offset, uint8_t data);
|
||||
required_device<megaduck_cart_slot_device> m_cartslot;
|
||||
};
|
||||
|
||||
|
@ -114,7 +114,6 @@ void gb_state::save_gb_base()
|
||||
save_item(NAME(m_triggering_irq));
|
||||
save_item(NAME(m_reloading));
|
||||
save_item(NAME(m_sio_count));
|
||||
save_item(NAME(m_bios_disable));
|
||||
if (m_cartslot)
|
||||
m_cartslot->save_ram();
|
||||
}
|
||||
@ -195,31 +194,25 @@ void gb_state::machine_reset()
|
||||
{
|
||||
gb_init();
|
||||
|
||||
// Enable BIOS ROM
|
||||
m_bios_disable = false;
|
||||
m_cart_low.select(BIOS_ENABLED | (m_cartslot ? CART_PRESENT : NO_CART));
|
||||
m_cart_high.select(m_cartslot ? CART_PRESENT : NO_CART);
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER(gb_state,gbc)
|
||||
{
|
||||
gb_init();
|
||||
gb_state::machine_reset();
|
||||
|
||||
gb_init_regs();
|
||||
|
||||
/* Enable BIOS rom */
|
||||
m_bios_disable = false;
|
||||
|
||||
for (auto & elem : m_gbc_rammap)
|
||||
memset(elem, 0, 0x1000);
|
||||
}
|
||||
|
||||
MACHINE_RESET_MEMBER(gb_state,sgb)
|
||||
{
|
||||
gb_init();
|
||||
gb_state::machine_reset();
|
||||
|
||||
gb_init_regs();
|
||||
|
||||
/* Enable BIOS rom */
|
||||
m_bios_disable = false;
|
||||
}
|
||||
|
||||
|
||||
@ -310,7 +303,7 @@ void gb_state::gb_io2_w(offs_t offset, uint8_t data)
|
||||
if (offset == 0x10)
|
||||
{
|
||||
/* disable BIOS ROM */
|
||||
m_bios_disable = true;
|
||||
m_cart_low.select(BIOS_DISABLED | (m_cartslot ? CART_PRESENT : NO_CART));
|
||||
}
|
||||
else
|
||||
m_ppu->video_w(offset, data);
|
||||
@ -625,7 +618,7 @@ void gb_state::gbc_io2_w(offs_t offset, uint8_t data)
|
||||
m_maincpu->set_speed(data);
|
||||
return;
|
||||
case 0x10: /* BFF - Bios disable */
|
||||
m_bios_disable = true;
|
||||
m_cart_low.select(BIOS_DISABLED | (m_cartslot ? CART_PRESENT : NO_CART));
|
||||
return;
|
||||
case 0x16: /* RP - Infrared port */
|
||||
break;
|
||||
@ -670,10 +663,10 @@ void megaduck_state::machine_start()
|
||||
|
||||
void megaduck_state::machine_reset()
|
||||
{
|
||||
// We may have to add some more stuff here, if not then it can be merged back into gb
|
||||
gb_state::machine_reset();
|
||||
gb_init();
|
||||
|
||||
m_bios_disable = true;
|
||||
m_cart_low.select((m_cartslot ? CART_PRESENT : NO_CART));
|
||||
m_cart_high.select(m_cartslot ? CART_PRESENT : NO_CART);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user