Skip to content

Commit 5bc9cca

Browse files
committed
Merged in feature/append_binary (pull request #188)
Feature/append binary Approved-by: Jose Rodriguez <boriel@gmail.com>
2 parents e9b5344 + e9a398e commit 5bc9cca

5 files changed

Lines changed: 94 additions & 72 deletions

File tree

arch/zx48k/backend/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2164,11 +2164,11 @@ def __str__(self):
21642164
# -------------------------
21652165
def emit_start():
21662166
output = list()
2167+
output.append('org %s' % OPTIONS.org.value)
2168+
21672169
if OPTIONS.headerless.value:
21682170
return output
21692171

2170-
output.append('org %s' % OPTIONS.org.value)
2171-
21722172
if REQUIRES.intersection(MEMINITS) or '__MEM_INIT' in INITS:
21732173
output.append('; Defines HEAP SIZE\n' + OPTIONS.heap_size_label.value + ' EQU ' + str(OPTIONS.heap_size.value))
21742174

asmparse.py

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from api import global_ as gl
2727
import api.utils
2828
import zxbpp
29+
import outfmt
2930

3031
LEXER = asmlex.Lexer()
3132

@@ -1438,7 +1439,7 @@ def assemble(input_):
14381439
return gl.has_errors
14391440

14401441

1441-
def generate_binary(outputfname, format_, progname=''):
1442+
def generate_binary(outputfname, format_, progname='', binary_files=None, headless_binary_files=None):
14421443
""" Outputs the memory binary to the
14431444
output filename using one of the given
14441445
formats: tap, tzx or bin
@@ -1449,6 +1450,22 @@ def generate_binary(outputfname, format_, progname=''):
14491450
if gl.has_errors:
14501451
return
14511452

1453+
if binary_files is None:
1454+
binary_files = []
1455+
1456+
if headless_binary_files is None:
1457+
headless_binary_files = []
1458+
1459+
bin_blocks = []
1460+
for fname in binary_files:
1461+
with api.utils.open_file(fname) as f:
1462+
bin_blocks.append((os.path.basename(fname), f.read()))
1463+
1464+
headless_bin_blocks = []
1465+
for fname in headless_binary_files:
1466+
with api.utils.open_file(fname) as f:
1467+
headless_bin_blocks.append(f.read())
1468+
14521469
if AUTORUN_ADDR is None:
14531470
AUTORUN_ADDR = org
14541471

@@ -1468,24 +1485,18 @@ def generate_binary(outputfname, format_, progname=''):
14681485
else:
14691486
program.add_line([['REM'], ['RANDOMIZE', program.token('USR'), AUTORUN_ADDR]])
14701487

1471-
if format_ == 'tzx':
1472-
import outfmt
1473-
t = outfmt.TZX()
1488+
if format_ in ('tap', 'tzx'):
1489+
t = {'tap': outfmt.TAP, 'tzx': outfmt.TZX}[format_]()
14741490

14751491
if OPTIONS.use_loader.value:
14761492
t.save_program('loader', program.bytes, line=1) # Put line 0 to protect against MERGE
14771493

14781494
t.save_code(progname, org, binary)
1479-
t.dump(outputfname)
1495+
for name, block in bin_blocks:
1496+
t.save_code(name, 0, block)
1497+
for block in headless_bin_blocks:
1498+
t.standard_block(block)
14801499

1481-
elif format_ == 'tap':
1482-
import outfmt
1483-
t = outfmt.TAP()
1484-
1485-
if OPTIONS.use_loader.value:
1486-
t.save_program('loader', program.bytes, line=1) # Put line 0 to protect against MERGE
1487-
1488-
t.save_code(progname, org, binary)
14891500
t.dump(outputfname)
14901501

14911502
else:

identityset.py

Lines changed: 55 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,55 @@
1-
#!/usr/bin/env python
2-
# -*- coding: utf-8 -*-
3-
# vim:ts=4:et:
4-
5-
import collections
6-
7-
8-
class IdentitySet(object):
9-
""" This set implementation only adds items
10-
if they are not exactly the same (same reference)
11-
preserving its order (OrderedDict). Allows deleting by ith-index.
12-
"""
13-
def __init__(self, l=None):
14-
self.elems = []
15-
self._elems = set()
16-
if l is not None:
17-
self.add(l)
18-
19-
def add(self, l):
20-
if not isinstance(l, collections.Iterable):
21-
l = [l]
22-
self.elems.extend(x for x in l if x not in self._elems)
23-
self._elems.update(x for x in l)
24-
25-
def remove(self, l):
26-
if not isinstance(l, collections.Iterable):
27-
l = [l]
28-
29-
self._elems.difference_update(l)
30-
self.elems = [x for x in self.elems if x not in self._elems]
31-
32-
def __len__(self):
33-
return len(self.elems)
34-
35-
def __getitem__(self, key):
36-
return self.elems[key]
37-
38-
def __str__(self):
39-
return str(self.elems)
40-
41-
def __contains__(self, elem):
42-
return elem in self._elems
43-
44-
def __delitem__(self, key):
45-
self.pop(self.elems.index(key))
46-
47-
def intersection(self, other):
48-
return IdentitySet([x for x in self.elems if x in self._elems.intersection(other)])
49-
50-
def union(self, other):
51-
return IdentitySet(self.elems + [x for x in other])
52-
53-
def pop(self, i):
54-
tmp = self.elems.pop(i)
55-
self._elems.remove(tmp)
1+
#!/usr/bin/env python
2+
# -*- coding: utf-8 -*-
3+
# vim:ts=4:et:
4+
5+
import collections
6+
7+
8+
class IdentitySet(object):
9+
""" This set implementation only adds items
10+
if they are not exactly the same (same reference)
11+
preserving its order (OrderedDict). Allows deleting by ith-index.
12+
"""
13+
def __init__(self, l=None):
14+
self.elems = []
15+
self._elems = set()
16+
if l is not None:
17+
self.add(l)
18+
19+
def add(self, l):
20+
if not isinstance(l, collections.Iterable):
21+
l = [l]
22+
self.elems.extend(x for x in l if x not in self._elems)
23+
self._elems.update(x for x in l)
24+
25+
def remove(self, l):
26+
if not isinstance(l, collections.Iterable):
27+
l = [l]
28+
29+
self._elems.difference_update(l)
30+
self.elems = [x for x in self.elems if x not in self._elems]
31+
32+
def __len__(self):
33+
return len(self.elems)
34+
35+
def __getitem__(self, key):
36+
return self.elems[key]
37+
38+
def __str__(self):
39+
return str(self.elems)
40+
41+
def __contains__(self, elem):
42+
return elem in self._elems
43+
44+
def __delitem__(self, key):
45+
self.pop(self.elems.index(key))
46+
47+
def intersection(self, other):
48+
return IdentitySet([x for x in self.elems if x in self._elems.intersection(other)])
49+
50+
def union(self, other):
51+
return IdentitySet(self.elems + [x for x in other])
52+
53+
def pop(self, i):
54+
tmp = self.elems.pop(i)
55+
self._elems.remove(tmp)

tests/functional/headerless.asm

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
org 32768
12
ld hl, _a
23
inc (hl)
34
ld hl, 0

zxb.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,11 @@ def main(args=None):
145145
help='Header-less mode: omit asm prologue and epilogue')
146146
parser.add_argument('--version', action='version', version='%(prog)s {0}'.format(VERSION))
147147
parser.add_argument('--parse-only', action='store_true',
148-
help="Only parses to check for syntax and semantic errors")
148+
help='Only parses to check for syntax and semantic errors')
149+
parser.add_argument('--append-binary', default=[], action='append',
150+
help='Appends binary to tape file (only works with -t or -T)')
151+
parser.add_argument('--append-headless-binary', default=[], action='append',
152+
help='Appends binary to tape file (only works with -t or -T)')
149153

150154
options = parser.parse_args(args=args)
151155

@@ -201,6 +205,10 @@ def main(args=None):
201205
parser.error('Option --BASIC and --autorun requires --tzx or tap format')
202206
return 4
203207

208+
if options.append_binary and not options.tzx and not options.tap:
209+
parser.error('Option --append-binary needs either --tap or --tzx')
210+
return 5
211+
204212
OPTIONS.use_loader.value = options.basic
205213
OPTIONS.autorun.value = options.autorun
206214

@@ -330,7 +338,9 @@ def main(args=None):
330338
output(asm_output, fout)
331339
asmparse.assemble(fout.getvalue())
332340
fout.close()
333-
asmparse.generate_binary(OPTIONS.outputFileName.value, OPTIONS.output_file_type.value)
341+
asmparse.generate_binary(OPTIONS.outputFileName.value, OPTIONS.output_file_type.value,
342+
binary_files=options.append_binary,
343+
headless_binary_files=options.append_headless_binary)
334344
if gl.has_errors:
335345
return 5 # Error in assembly
336346

0 commit comments

Comments
 (0)