mirror of
https://github.com/ariejan/i6502.git
synced 2024-09-30 12:54:52 +00:00
43 lines
963 B
Go
43 lines
963 B
Go
package cpu
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/ariejan/i6502/bus"
|
|
)
|
|
|
|
// Instruction is a self-contained, variable length instruction,
|
|
// it includes the the operation type and a possible 8 or 16 bit operand.
|
|
type Instruction struct {
|
|
OpType
|
|
|
|
// 2 byte instructions have a single byte operand
|
|
Op8 uint8
|
|
|
|
// 3 byte instruction have a double byte operand
|
|
Op16 uint16
|
|
}
|
|
|
|
func ReadInstruction(pc uint16, bus *bus.Bus) Instruction {
|
|
// Read the opcode
|
|
opcode := bus.Read(pc)
|
|
|
|
// Do we know this opcode in our optypes table?
|
|
optype, ok := optypes[opcode]
|
|
if !ok {
|
|
panic(fmt.Sprintf("Unknown opcode $%02X at $04X", opcode, pc))
|
|
}
|
|
|
|
instruction := Instruction{OpType: optype}
|
|
switch instruction.Bytes {
|
|
case 1: // No operand.
|
|
case 2:
|
|
instruction.Op8 = bus.Read(pc + 1)
|
|
case 3:
|
|
instruction.Op16 = bus.Read16(pc + 1)
|
|
default:
|
|
panic(fmt.Sprintf("Unknown instruction length (%d) for $%02X at $04X", instruction.Bytes, opcode, pc))
|
|
}
|
|
|
|
return instruction
|
|
}
|