summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author wilbertpol <wilbertpol@users.noreply.github.com>2021-12-25 00:07:02 +0000
committer GitHub <noreply@github.com>2021-12-24 19:07:02 -0500
commit2f797626a08919de7e164af27a3ee8357aff0cb2 (patch)
treee828b134756287cea023b456d280da835eb50b9c
parent76152ba35ecbf68bdac14e3aae75ea23b4529092 (diff)
gb.cpp: Use memory views for bios disable and to remove some cartslot trampolines. (#9033)
-rw-r--r--src/mame/drivers/gb.cpp260
-rw-r--r--src/mame/includes/gb.h23
-rw-r--r--src/mame/machine/gb.cpp25
3 files changed, 114 insertions, 194 deletions
diff --git a/src/mame/drivers/gb.cpp b/src/mame/drivers/gb.cpp
index ae92dce5300..5d5ed5dc3a7 100644
--- a/src/mame/drivers/gb.cpp
+++ b/src/mame/drivers/gb.cpp
@@ -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));
}
diff --git a/src/mame/includes/gb.h b/src/mame/includes/gb.h
index 6bde090e813..b90867d5c7f 100644
--- a/src/mame/includes/gb.h
+++ b/src/mame/includes/gb.h
@@ -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;
};
diff --git a/src/mame/machine/gb.cpp b/src/mame/machine/gb.cpp
index 4c742715d0c..c40618ff43d 100644
--- a/src/mame/machine/gb.cpp
+++ b/src/mame/machine/gb.cpp
@@ -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);
}
/*