1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2024-06-18 03:29:32 +00:00
SixtyPical/src/sixtypical/gen6502.py
2015-10-17 16:17:35 +01:00

259 lines
3.8 KiB
Python

"""This is just a sketch for now."""
from sixtypical.emitter import Emittable, Byte, Word, Label
class AddressingMode(object):
def size(self):
"""Size of the operand for the mode (not including the opcode)"""
raise NotImplementedError
class Implied(AddressingMode):
def size(self):
return 0
def serialize(self):
return ''
def __repr__(self):
return "%s()" % (self.__class__.__name__)
class Immediate(AddressingMode):
def __init__(self, value):
assert isinstance(value, Byte)
self.value = value
def size(self):
return 1
def serialize(self):
return self.value.serialize()
def __repr__(self):
return "%s(%r)" % (self.__class__.__name__, self.value)
class Absolute(AddressingMode):
def __init__(self, value):
assert isinstance(value, (Word, Label))
self.value = value
def size(self):
return 2
def serialize(self):
return self.value.serialize()
def __repr__(self):
return "%s(%r)" % (self.__class__.__name__, self.value)
class Opcode(Emittable):
def __init__(self, operand=None):
self.operand = operand or Implied()
def size(self):
return 1 + self.operand.size() if self.operand else 0
def serialize(self):
return (
chr(self.opcodes[self.operand.__class__]) +
self.operand.serialize()
)
def __repr__(self):
return "%s(%r)" % (self.__class__.__name__, self.operand)
class ADC(Opcode):
opcodes = {
Immediate: 0x69,
Absolute: 0x6d,
}
class AND(Opcode):
opcodes = {
Immediate: 0x29,
Absolute: 0x2d,
}
class CLC(Opcode):
opcodes = {
Implied: 0x18
}
class CMP(Opcode):
opcodes = {
Immediate: 0xc9,
Absolute: 0xcd,
}
class CPX(Opcode):
opcodes = {
Immediate: 0xe0,
Absolute: 0xec,
}
class CPY(Opcode):
opcodes = {
Immediate: 0xc0,
Absolute: 0xcc,
}
class DEC(Opcode):
opcodes = {
Absolute: 0xce,
}
class DEX(Opcode):
opcodes = {
Implied: 0xca,
}
class DEY(Opcode):
opcodes = {
Implied: 0x88,
}
class EOR(Opcode):
opcodes = {
Immediate: 0x49,
Absolute: 0x4d,
}
class INC(Opcode):
opcodes = {
Absolute: 0xee,
}
class INX(Opcode):
opcodes = {
Implied: 0xe8,
}
class INY(Opcode):
opcodes = {
Implied: 0xc8,
}
class JSR(Opcode):
opcodes = {
Absolute: 0x20,
}
class LDA(Opcode):
opcodes = {
Immediate: 0xa9,
Absolute: 0xad,
}
class LDX(Opcode):
opcodes = {
Immediate: 0xa2,
Absolute: 0xae,
}
class LDY(Opcode):
opcodes = {
Immediate: 0xa0,
Absolute: 0xac,
}
class ORA(Opcode):
opcodes = {
Immediate: 0x09,
Absolute: 0x0d,
}
class ROL(Opcode):
opcodes = {
Implied: 0x2a, # Accumulator
}
class ROR(Opcode):
opcodes = {
Implied: 0x6a, # Accumulator
}
class RTS(Opcode):
opcodes = {
Implied: 0x60,
}
class SBC(Opcode):
opcodes = {
Immediate: 0xe9,
Absolute: 0xed,
}
class SEC(Opcode):
opcodes = {
Implied: 0x38,
}
class STA(Opcode):
opcodes = {
Absolute: 0x8d,
}
class STX(Opcode):
opcodes = {
Absolute: 0x8e,
}
class STY(Opcode):
opcodes = {
Absolute: 0x8c,
}
class TAX(Opcode):
opcodes = {
Implied: 0xaa,
}
class TAY(Opcode):
opcodes = {
Implied: 0xa8,
}
class TXA(Opcode):
opcodes = {
Implied: 0x8a,
}
class TYA(Opcode):
opcodes = {
Implied: 0x98,
}