mirror of
https://github.com/JetSetIlly/Gopher2600.git
synced 2025-04-02 11:02:17 -04:00
73 lines
2.1 KiB
Go
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
|
|
}
|