Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 34 additions & 52 deletions lib/rubyboy/cartridge/mbc1.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,65 +10,47 @@ def initialize(rom, ram)
@ram_bank = 0
@ram_enable = false
@ram_banking_mode = false

@read_methods = Array.new(0xc000)
@write_methods = Array.new(0xc000)

set_methods
end

def set_methods
0xc000.times do |addr|
@read_methods[addr] =
case addr
when 0x0000..0x3fff then -> { @rom.data[addr] }
when 0x4000..0x7fff then -> { @rom.data[addr + (@rom_bank - 1) * 0x4000] }
when 0xa000..0xbfff
lambda do
if @ram_enable
if @ram_banking_mode
@ram.eram[addr - 0xa000 + @ram_bank * 0x800]
else
@ram.eram[addr - 0xa000]
end
else
0xff
end
end
end
end

0xc000.times do |addr|
@write_methods[addr] =
case addr
when 0x0000..0x1fff then ->(value) { @ram_enable = value & 0x0f == 0x0a }
when 0x2000..0x3fff
lambda do |value|
@rom_bank = value & 0x1f
@rom_bank = 1 if @rom_bank == 0
end
when 0x4000..0x5fff then ->(value) { @ram_bank = value & 0x03 }
when 0x6000..0x7fff then ->(value) { @ram_banking_mode = value & 0x01 == 0x01 }
when 0xa000..0xbfff
lambda do |value|
if @ram_enable
if @ram_banking_mode
@ram.eram[addr - 0xa000 + @ram_bank * 0x800] = value
else
@ram.eram[addr - 0xa000] = value
end
end
end
def read_byte(addr)
case (addr >> 12)
when 0x0, 0x1, 0x2, 0x3
@rom.data[addr]
when 0x4, 0x5, 0x6, 0x7
@rom.data[addr + ((@rom_bank - 1) << 14)]
when 0xa, 0xb
if @ram_enable
if @ram_banking_mode
@ram.eram[addr - 0xa000 + (@ram_bank << 11)]
else
@ram.eram[addr - 0xa000]
end
else
0xff
end
end
end

def read_byte(addr)
@read_methods[addr].call
end

def write_byte(addr, value)
@write_methods[addr].call(value)
case addr >> 12
when 0x0, 0x1
@ram_enable = value & 0x0f == 0x0a
when 0x2, 0x3
@rom_bank = value & 0x1f
@rom_bank = 1 if @rom_bank == 0
when 0x4, 0x5
@ram_bank = value & 0x03
when 0x6, 0x7
@ram_banking_mode = value & 0x01 == 0x01
when 0xa, 0xb
if @ram_enable
if @ram_banking_mode
@ram.eram[addr - 0xa000 + (@ram_bank << 11)] = value
else
@ram.eram[addr - 0xa000] = value
end
end
end
end
end
end
Expand Down