mirror of
https://github.com/safiire/n65.git
synced 2025-08-14 19:27:24 +00:00
Refactored memory space to remove big method (#3)
Co-authored-by: Saf <saf@irkenkitties.com>
This commit is contained in:
@@ -92,21 +92,29 @@ module N65
|
|||||||
def normalize_address(address)
|
def normalize_address(address)
|
||||||
case @type
|
case @type
|
||||||
when :prog
|
when :prog
|
||||||
return (address - 0x8000) if address_inside_prog_rom1?(address)
|
normalize_prog_rom_address(address)
|
||||||
return (address - 0xC000) if address_inside_prog_rom2?(address)
|
|
||||||
|
|
||||||
raise(AccessOutsideProgRom, format('Address $%.4X is outside PROG ROM', address))
|
|
||||||
when :char
|
when :char
|
||||||
unless address_inside_char_rom?(address)
|
normalize_char_rom_address(address)
|
||||||
raise(AccessOutsideCharRom, format('Address $%.4X is outside CHAR ROM', address))
|
|
||||||
end
|
|
||||||
|
|
||||||
address
|
|
||||||
else
|
else
|
||||||
address
|
address
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def normalize_prog_rom_address(address)
|
||||||
|
return (address - 0x8000) if address_inside_prog_rom1?(address)
|
||||||
|
return (address - 0xC000) if address_inside_prog_rom2?(address)
|
||||||
|
|
||||||
|
message = 'Address $%.4X is outside PROG ROM'
|
||||||
|
raise(AccessOutsideProgRom, format(message, address))
|
||||||
|
end
|
||||||
|
|
||||||
|
def normalize_char_rom_address(address)
|
||||||
|
return address if address_inside_char_rom?(address)
|
||||||
|
|
||||||
|
message = 'Address $%.4X is outside CHAR ROM'
|
||||||
|
raise(AccessOutsideCharRom, format(message, address))
|
||||||
|
end
|
||||||
|
|
||||||
def address_inside_prog_rom1?(address)
|
def address_inside_prog_rom1?(address)
|
||||||
address >= 0x8000 && address < 0xC000
|
address >= 0x8000 && address < 0xC000
|
||||||
end
|
end
|
||||||
|
@@ -47,7 +47,7 @@ RSpec.describe(N65::MemorySpace) do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#read' do
|
describe '#read prog rom' do
|
||||||
let(:address) { 0xC100 }
|
let(:address) { 0xC100 }
|
||||||
let(:mirroed_address) { 0x8100 }
|
let(:mirroed_address) { 0x8100 }
|
||||||
let(:bank) { described_class.create_prog_rom }
|
let(:bank) { described_class.create_prog_rom }
|
||||||
@@ -76,7 +76,27 @@ RSpec.describe(N65::MemorySpace) do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
describe '#write' do
|
describe '#read char rom' do
|
||||||
|
let(:address) { 0x100 }
|
||||||
|
let(:bank) { described_class.create_char_rom }
|
||||||
|
let(:data) { 'hi there'.bytes }
|
||||||
|
|
||||||
|
before { bank.write(address, data) }
|
||||||
|
|
||||||
|
context 'when reading from the bank' do
|
||||||
|
it 'can read from the bank' do
|
||||||
|
expect(bank.read(address, data.size)).to eq(data)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when attempting to read out of bounds' do
|
||||||
|
it 'throws an error' do
|
||||||
|
expect { bank.read(0x2000, 0x10) }.to raise_error(described_class::AccessOutsideCharRom)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
describe '#write prog rom' do
|
||||||
let(:address) { 0xC100 }
|
let(:address) { 0xC100 }
|
||||||
let(:mirroed_address) { 0x8100 }
|
let(:mirroed_address) { 0x8100 }
|
||||||
let(:bank) { described_class.create_prog_rom }
|
let(:bank) { described_class.create_prog_rom }
|
||||||
@@ -104,4 +124,24 @@ RSpec.describe(N65::MemorySpace) do
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe '#write char rom' do
|
||||||
|
let(:address) { 0x100 }
|
||||||
|
let(:bank) { described_class.create_char_rom }
|
||||||
|
let(:data) { 'hi there'.bytes }
|
||||||
|
|
||||||
|
before { bank.write(address, data) }
|
||||||
|
|
||||||
|
context 'when reading from the bank' do
|
||||||
|
it 'can read from the bank' do
|
||||||
|
expect(bank.read(address, data.size)).to eq(data)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
context 'when attempting to write out of bounds' do
|
||||||
|
it 'throws an error' do
|
||||||
|
expect { bank.write(0x2000, data) }.to raise_error(described_class::AccessOutsideCharRom)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user