mirror of
https://github.com/JetSetIlly/Gopher2600.git
synced 2024-06-01 11:37:58 -04:00
9f6cbdad58
updated QUANTUM and STEP commands to accoodate new quantum control window changed to support the three quantum options improved/corrected the conditions under which the ONSTEP command is run disassembly.ExecutedEntry() updates existing entry
117 lines
2.6 KiB
Go
117 lines
2.6 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/>.
|
|
|
|
package disassembly
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
// Field identifies which part of the disassmbly entry is of interest.
|
|
type Field int
|
|
|
|
// List of valid fields.
|
|
const (
|
|
FldLabel Field = iota
|
|
FldBytecode
|
|
FldAddress
|
|
FldOperator
|
|
FldOperand
|
|
FldCycles
|
|
FldNotes
|
|
)
|
|
|
|
// required widths (in characters) of the various disassembly fields.
|
|
const (
|
|
// the width of the label field is equal to the value returned by
|
|
// Symbols.LabelWidth().
|
|
|
|
// the widths of bytecode, address, and operator can be decided in advance.
|
|
widthBytecode = 9
|
|
widthAddress = 6
|
|
widthOperator = 3
|
|
|
|
// the oeprand field width should be the value of Symbols.SymbolWidth()
|
|
// plus widthOperandDecoration, which accounts for the maximum number of
|
|
// additional symbols required to correctly display the addressing mode.
|
|
// for example:
|
|
//
|
|
// ($6e), Y
|
|
//
|
|
// or
|
|
//
|
|
// (OFFSET), Y
|
|
widthOperandDecoration = 4
|
|
|
|
// the width for the cycles column assumes that there will be at least one
|
|
// branch instruction that has been executed. For example:
|
|
//
|
|
// 2/3 [3]
|
|
//
|
|
// see Entry.Cycles() function.
|
|
widthCycles = 7
|
|
|
|
// the width of the notes field is not needed.
|
|
)
|
|
|
|
// GetField returns the formatted field from the speficied Entry.
|
|
func (e *Entry) GetField(field Field) string {
|
|
var s string
|
|
var w int
|
|
var rightJust bool
|
|
|
|
switch field {
|
|
case FldLabel:
|
|
s = e.Label.Resolve()
|
|
if s == "" {
|
|
w = 0
|
|
} else {
|
|
w = e.dsm.Sym.LabelWidth()
|
|
rightJust = true
|
|
}
|
|
|
|
case FldBytecode:
|
|
w = widthBytecode
|
|
s = e.Bytecode
|
|
|
|
case FldAddress:
|
|
w = widthAddress
|
|
s = e.Address
|
|
|
|
case FldOperator:
|
|
w = widthOperator
|
|
s = e.Operator
|
|
|
|
case FldOperand:
|
|
s = e.Operand.Resolve()
|
|
w = e.dsm.Sym.SymbolWidth() + widthOperandDecoration
|
|
|
|
case FldCycles:
|
|
w = widthCycles
|
|
s = e.Cycles()
|
|
|
|
case FldNotes:
|
|
return e.Notes()
|
|
}
|
|
|
|
if rightJust {
|
|
s = fmt.Sprintf(fmt.Sprintf("%%-%ds", w), s)
|
|
} else {
|
|
s = fmt.Sprintf(fmt.Sprintf("%%%ds", w), s)
|
|
}
|
|
|
|
return s
|
|
}
|