package core6502

import "io/ioutil"

// Memory represents the addressable space of the processor
type Memory interface {
	Peek(address uint16) uint8
	Poke(address uint16, value uint8)
}

func getWord(m Memory, address uint16) uint16 {
	return uint16(m.Peek(address)) + 0x100*uint16(m.Peek(address+1))
}

func getZeroPageWord(m Memory, address uint8) uint16 {
	return uint16(m.Peek(uint16(address))) + 0x100*uint16(m.Peek(uint16(address+1)))
}

// FlatMemory puts RAM on the 64Kb addressable by the processor
type FlatMemory struct {
	data [65536]uint8
}

// Peek returns the data on the given address
func (m *FlatMemory) Peek(address uint16) uint8 {
	return m.data[address]
}

// Poke sets the data at the given address
func (m *FlatMemory) Poke(address uint16, value uint8) {
	m.data[address] = value
}

func (m *FlatMemory) loadBinary(filename string) error {
	bytes, err := ioutil.ReadFile(filename)
	if err != nil {
		return err
	}

	for i, v := range bytes {
		m.Poke(uint16(i), uint8(v))
	}

	return nil
}
