Class: Amaterasu::Cartridge::Mbc1

Inherits:
Object
  • Object
show all
Defined in:
lib/amaterasu/cartridge/mbc1.rb

Overview

Models the MBC1 chip inside the Game Boy cartridge.

0x0000 - 0x3FFF => ROM Bank X0 0x4000 - 0x7FFF => ROM Bank 01-7F (1 - 127)

Can switch between Modes 0 and 1.

Instance Method Summary collapse

Constructor Details

#initialize(rom, ram) ⇒ Mbc1

Returns a new instance of Mbc1.



12
13
14
15
16
17
18
19
20
21
# File 'lib/amaterasu/cartridge/mbc1.rb', line 12

def initialize(rom, ram)
  @rom = rom
  @ram = ram

  @rom_banks = rom.rom_size / ROM_BANK_SIZE
  @ram_enabled = false
  @banking_mode = 0
  @rom_banking_reg1 = 0b00001
  @rom_banking_reg2 = 0b00
end

Instance Method Details

#read_byte(address) ⇒ Object

TODO: Implement banking mode logic for reads



41
42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/amaterasu/cartridge/mbc1.rb', line 41

def read_byte(address)
  if address <= 0x3FFF
    @rom.read_byte(address)
  elsif address <= 0x7FFF
    selected_bank = (@rom_banking_reg2 << 5) | @rom_banking_reg1
    bank_offset = selected_bank * ROM_BANK_SIZE
    @rom.read_byte(address - 0x4000 + bank_offset)
  else
    return 0xFF if @ram.nil? || !@ram_enabled

    @ram.read_byte(address:)
  end
end

#write_byte(address, value) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# File 'lib/amaterasu/cartridge/mbc1.rb', line 23

def write_byte(address, value)
  if address <= 0x1FFF
    @ram_enabled = true if (value & 0xF) == 0xA
  elsif address <= 0x3FFF
    value &= 0b11111
    @rom_banking_reg1 = value.zero? ? 1 : value
  elsif address <= 0x5FFF
    @rom_banking_reg2 = value & 0b11
  elsif address <= 0x7FFF
    @banking_mode = value & 1
  else
    return 0xFF if @ram.nil? || !@ram_enabled

    @ram.write_byte(address:, value:)
  end
end