Gopher2600/hardware/cpu/registers/program_counter.go
2020-01-05 18:58:43 +00:00

73 lines
2.1 KiB
Go

// This file is part of Gopher2600.
//
// Gopher2600 is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Gopher2600 is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Gopher2600. If not, see <https://www.gnu.org/licenses/>.
//
// *** NOTE: all historical versions of this file, as found in any
// git repository, are also covered by the licence, even when this
// notice is not present ***
package registers
import "fmt"
// ProgramCounter represents the PC register in the 6507 CPU
type ProgramCounter struct {
value uint16
}
// NewProgramCounter is the preferred method of initialisation for ProgramCounter
func NewProgramCounter(val uint16) *ProgramCounter {
return &ProgramCounter{value: val}
}
// Label returns an identifying string for the PC
func (pc ProgramCounter) Label() string {
return "PC"
}
func (pc ProgramCounter) String() string {
return fmt.Sprintf("%#04x", pc.value)
}
// Value returns the current value of the register
func (pc ProgramCounter) Value() uint16 {
return pc.value
}
// FormatValue formats an arbitary value to look like a PC value
func (pc ProgramCounter) FormatValue(val interface{}) string {
return fmt.Sprintf("%#04x", val)
}
// TargetValue returns the current value of the PC as an integer (wrapped as a generic value)
func (pc ProgramCounter) TargetValue() interface{} {
return int(pc.value)
}
// Address returns the current value of the PC as a a value of type uint16
func (pc *ProgramCounter) Address() uint16 {
return pc.value
}
// Load a value into the PC
func (pc *ProgramCounter) Load(val uint16) {
pc.value = val
}
// Add a value to the PC
func (pc *ProgramCounter) Add(val uint16) (carry, overflow bool) {
v := pc.value
pc.value += val
return pc.value < v, false
}