From 0e1d9eaa8f3c9dc78b3118d69cb4abf9a3deae2e Mon Sep 17 00:00:00 2001 From: Ariejan de Vroom Date: Sun, 17 Aug 2014 16:20:30 +0200 Subject: [PATCH] Add ROM Memory --- ram_test.go | 9 +++------ rom.go | 38 ++++++++++++++++++++++++++++++++++++++ rom_test.go | 39 +++++++++++++++++++++++++++++++++++++++ test/16kb.rom | Bin 0 -> 16384 bytes test/8kb.rom | Bin 0 -> 8192 bytes 5 files changed, 80 insertions(+), 6 deletions(-) create mode 100644 rom.go create mode 100644 rom_test.go create mode 100644 test/16kb.rom create mode 100644 test/8kb.rom diff --git a/ram_test.go b/ram_test.go index 6890621..f958986 100644 --- a/ram_test.go +++ b/ram_test.go @@ -6,21 +6,18 @@ import ( ) func TestRamSize(t *testing.T) { - assert := assert.New(t) - ram, _ := NewRam(0x8000) // 32 kB - assert.Equal(0x8000, ram.Size()) + assert.Equal(t, 0x8000, ram.Size()) } func TestRamReadWrite(t *testing.T) { - assert := assert.New(t) ram, _ := NewRam(0x8000) // 32 kB // Ram zeroed out initially for i := 0; i < 0x8000; i++ { - assert.Equal(0x00, ram.data[i]) + assert.Equal(t, 0x00, ram.data[i]) } ram.Write(0x1000, 0x42) - assert.Equal(0x42, ram.Read(0x1000)) + assert.Equal(t, 0x42, ram.Read(0x1000)) } diff --git a/rom.go b/rom.go new file mode 100644 index 0000000..9c8e248 --- /dev/null +++ b/rom.go @@ -0,0 +1,38 @@ +package i6502 + +import ( + "fmt" + "io/ioutil" +) + +/* +Read-Only Memory +*/ +type Rom struct { + data []byte +} + +/* +Create a new Rom component, using the content of `path`. The file automatically +specifies the size of Rom. +*/ +func NewRom(path string) (*Rom, error) { + data, err := ioutil.ReadFile(path) + if err != nil { + return nil, err + } + + return &Rom{data: data}, nil +} + +func (r *Rom) Size() uint16 { + return uint16(len(r.data)) +} + +func (r *Rom) Read(address uint16) byte { + return r.data[address] +} + +func (r *Rom) Write(address uint16, data byte) { + panic(fmt.Errorf("Trying to write to ROM at 0x%04X", address)) +} diff --git a/rom_test.go b/rom_test.go new file mode 100644 index 0000000..58a24b3 --- /dev/null +++ b/rom_test.go @@ -0,0 +1,39 @@ +package i6502 + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func Test8kRoms(t *testing.T) { + rom, err := NewRom("test/8kb.rom") + + assert.Nil(t, err) + assert.Equal(t, 0x2000, rom.Size()) + assert.Equal(t, 0x01, rom.Read(0x0000)) + assert.Equal(t, 0xFF, rom.Read(0x2000-1)) +} + +func TestRomWritePanic(t *testing.T) { + rom, _ := NewRom("test/8kb.rom") + + // Writing to rom should panic + assert.Panics(t, func() { + rom.Write(0x1337, 0x42) + }, "Writing to Rom should panic") +} + +func Test16kRom(t *testing.T) { + rom, err := NewRom("test/16kb.rom") + + assert.Nil(t, err) + assert.Equal(t, 0x4000, rom.Size()) + assert.Equal(t, 0x01, rom.Read(0x0000)) + assert.Equal(t, 0xFF, rom.Read(0x4000-1)) +} + +func TestRomNotFound(t *testing.T) { + rom, err := NewRom("test/does-not-exists.rom") + assert.NotNil(t, err) + assert.Nil(t, rom) +} diff --git a/test/16kb.rom b/test/16kb.rom new file mode 100644 index 0000000000000000000000000000000000000000..7f395904e9d0b1ba70b9ffba4e525e50a7744745 GIT binary patch literal 16384 zcmeIuK>+|j1OTve^pA`fK3jyv&w3azV8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwA vz<>b*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VKfB^#r3>YwAz<>b*hXXwe!vz8e literal 0 HcmV?d00001 diff --git a/test/8kb.rom b/test/8kb.rom new file mode 100644 index 0000000000000000000000000000000000000000..c138c62cf51eea12ac731bb72e9b612524fc6f7c GIT binary patch literal 8192 zcmeIu0Sy2!2mqja?H^gq;RX?ipYb*1`HT5V8DO@0|pEjFkrxd0RsjM7%*VK LfB^#r4iEG!V)g