mirror of
https://github.com/catseye/SixtyPical.git
synced 2024-07-10 00:28:59 +00:00
66 lines
1.6 KiB
Python
66 lines
1.6 KiB
Python
|
class Word(object):
|
||
|
def __init__(self, value):
|
||
|
self.value = value
|
||
|
|
||
|
def size(self):
|
||
|
return 2
|
||
|
|
||
|
def serialize(self):
|
||
|
word = self.value
|
||
|
low = word & 255
|
||
|
high = (word >> 8) & 255
|
||
|
return chr(low) + chr(high)
|
||
|
|
||
|
|
||
|
class Label(object):
|
||
|
def __init__(self, name, addr=None):
|
||
|
self.name = name
|
||
|
self.addr = addr
|
||
|
|
||
|
def set_addr(self, addr):
|
||
|
self.addr = addr
|
||
|
|
||
|
def size(self):
|
||
|
return 2
|
||
|
|
||
|
def serialize(self):
|
||
|
if self.addr is None:
|
||
|
raise ValueError(self.addr)
|
||
|
return Word(self.addr).serialize()
|
||
|
|
||
|
|
||
|
class Emitter(object):
|
||
|
def __init__(self, addr):
|
||
|
self.accum = []
|
||
|
self.addr = addr
|
||
|
self.name_counter = 0
|
||
|
|
||
|
def gen(self, *things):
|
||
|
for thing in things:
|
||
|
if isinstance(thing, int):
|
||
|
if thing < -127 or thing > 255:
|
||
|
raise ValueError(thing)
|
||
|
if thing < 0:
|
||
|
thing += 256
|
||
|
self.accum.append(thing)
|
||
|
self.addr += 1
|
||
|
else:
|
||
|
self.accum.append(thing)
|
||
|
self.addr += thing.size()
|
||
|
|
||
|
def serialize(self, stream):
|
||
|
for thing in self.accum:
|
||
|
if isintance(thing, int):
|
||
|
stream.write(chr(thing))
|
||
|
else:
|
||
|
stream.write(thing.serialize())
|
||
|
|
||
|
def make_label(self, name=None):
|
||
|
if name is None:
|
||
|
name = 'label' + self.name_counter
|
||
|
self.name_counter += 1
|
||
|
return Label(name, addr=self.addr)
|
||
|
|
||
|
def resolve_label(self, label):
|
||
|
label.set_addr(self.addr)
|