1
0
mirror of https://github.com/ariejan/i6502.git synced 2024-11-17 11:04:48 +00:00
i6502/instruction.go

54 lines
1.3 KiB
Go
Raw Normal View History

2014-08-13 11:51:53 +00:00
package i6502
import (
"fmt"
)
type Instruction struct {
// Embed OpType
OpType
// 8-bit operand for 2-byte instructions
Op8 byte
// 16-bit operand for 3-byte instructions
Op16 uint16
// Address location where this instruction got read
Address uint16
}
func (i Instruction) String() (output string) {
switch i.Size {
case 1:
output = fmt.Sprintf("~~ 0x%04X: 0x%02X - %s [%s] {%d}\n", i.Address, i.Opcode, instructionNames[i.opcodeId], addressingNames[i.addressingId], i.Cycles)
case 2:
output = fmt.Sprintf("~~ 0x%04X: 0x%02X - %s 0x%02X [%s] {%d}\n", i.Address, i.Opcode, instructionNames[i.opcodeId], i.Op8, addressingNames[i.addressingId], i.Cycles)
case 3:
output = fmt.Sprintf("~~ 0x%04X: 0x%02X - %s 0x%04X [%s] {%d}\n", i.Address, i.Opcode, instructionNames[i.opcodeId], i.Op16, addressingNames[i.addressingId], i.Cycles)
}
return
}
func (c *Cpu) readNextInstruction() Instruction {
// Read the opcode
opcode := c.bus.Read(c.PC)
optype, ok := opTypes[opcode]
if !ok {
panic(fmt.Sprintf("Unknown or unimplemented opcde 0x%02X", opcode))
}
instruction := Instruction{OpType: optype}
switch instruction.Size {
case 1: // Zero operand instruction
case 2: // 8-bit operand
instruction.Op8 = c.bus.Read(c.PC + 1)
case 3: // 16-bit operand
instruction.Op16 = c.bus.Read16(c.PC + 1)
}
return instruction
}