1
0
mirror of https://github.com/catseye/SixtyPical.git synced 2024-11-26 14:49:15 +00:00

Sketch the compiler.

This commit is contained in:
Chris Pressey 2015-10-16 23:12:52 +01:00
parent bb7fbcda6c
commit ba55065060
2 changed files with 89 additions and 0 deletions

View File

@ -0,0 +1,83 @@
# encoding: UTF-8
from sixtypical.ast import Program, Routine, Block, Instr
from sixtypical.model import (
ConstantRef, LocationRef,
REG_A, REG_X, REG_Y, FLAG_Z, FLAG_N, FLAG_V, FLAG_C
)
from sixtypical.gen6502 import Generator
def compile_program(program):
assert isinstance(program, Program)
generator = Generator(49152)
routines = {r.name: r for r in program.routines}
for routine in program.routines:
compile_routine(routine, generator, routines)
def compile_routine(routine, generator, routines):
assert isinstance(routine, Routine)
label = generator.emitter.make_label(routine.name)
compile_block(routine.block, generator, routines)
return label
def compile_block(block, generator, routines):
assert isinstance(block, Block)
label = generator.emitter.make_label()
for instr in block.instrs:
compile_instr(instr, generator, routines)
return label
def compile_instr(instr, generator, routines):
assert isinstance(instr, Instr)
opcode = instr.opcode
dest = instr.dest
src = instr.src
if opcode == 'ld':
if dest == REG_A:
if isinstance(src, ConstantRef):
# LDA #...
pass
elif:
# LDA abs
pass
elif dest == REG_X:
elif dest == REG_Y:
else:
raise KeyError
elif opcode == 'st':
if src == REG_A:
# assert isinstance(dest, MemoryRef)
# generate STA
else:
raise KeyError
elif opcode == 'add':
raise NotImplementedError
elif opcode == 'sub':
raise NotImplementedError
elif opcode == 'inc':
raise NotImplementedError
elif opcode == 'dec':
raise NotImplementedError
elif opcode == 'cmp':
raise NotImplementedError
elif opcode == 'and':
raise NotImplementedError
elif opcode == 'or':
raise NotImplementedError
elif opcode == 'xor':
raise NotImplementedError
elif opcode == 'shl':
raise NotImplementedError
elif opcode == 'shr':
raise NotImplementedError
elif opcode == 'call':
raise NotImplementedError
elif opcode == 'if':
raise NotImplementedError
else:
raise NotImplementedError

View File

@ -7,6 +7,9 @@ class LocationRef(object):
def __repr__(self):
return 'LocationRef(%r)' % self.name
def __eq__(self, other):
return isinstance(other, LocationRef) and other.name == self.name
class ConstantRef(object):
def __init__(self, value):
@ -15,6 +18,9 @@ class ConstantRef(object):
def __repr__(self):
return 'ConstantRef(%r)' % self.value
def __eq__(self, other):
return isinstance(other, ConstantRef) and other.value == self.value
# TODO type=byte