summaryrefslogtreecommitdiff
path: root/support/scripts/as2gbmap.py
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/scripts/as2gbmap.py
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'support/scripts/as2gbmap.py')
-rw-r--r--support/scripts/as2gbmap.py181
1 files changed, 181 insertions, 0 deletions
diff --git a/support/scripts/as2gbmap.py b/support/scripts/as2gbmap.py
new file mode 100644
index 0000000..2ab5cde
--- /dev/null
+++ b/support/scripts/as2gbmap.py
@@ -0,0 +1,181 @@
+#!/usr/bin/env python
+
+# as2gbmap - asxxxx to gb map file converter
+#
+# Copyright (c) 2010 Borut Razem
+#
+# This file is part of sdcc.
+#
+# This software is provided 'as-is', without any express or implied
+# warranty. In no event will the authors be held liable for any damages
+# arising from the use of this software.
+#
+# Permission is granted to anyone to use this software for any purpose,
+# including commercial applications, and to alter it and redistribute it
+# freely, subject to the following restrictions:
+#
+# 1. The origin of this software must not be misrepresented; you must not
+# claim that you wrote the original software. If you use this software
+# in a product, an acknowledgment in the product documentation would be
+# appreciated but is not required.
+# 2. Altered source versions must be plainly marked as such, and must not be
+# misrepresented as being the original software.
+# 3. This notice may not be removed or altered from any source distribution.
+#
+# Borut Razem
+# borut.razem@siol.net
+
+from __future__ import print_function
+
+import sys
+import os
+import re
+from optparse import OptionParser
+import operator
+
+def main():
+ '''asxxxx to gb map file converter'''
+ usage = "usage: %prog [options] [<input_asxxxx_map_file> [<output_gb_file>]]"
+ parser = OptionParser(usage = usage, version = "1.0")
+ parser.set_defaults(no_gmb = False)
+ parser.add_option("-j", "--no$gmb", action = "store_true", dest = "no_gmb", help = "generate no$gmb symbol file (default: rrgb)")
+ (options, args) = parser.parse_args()
+
+ if len(args) > 0 and args[0] != "-":
+ try:
+ fin = open(args[0], "r")
+ except IOError as xxx_todo_changeme:
+ (errno, strerror) = xxx_todo_changeme.args
+ print("%s: can't open %s: %s" % (os.path.basename(sys.argv[0]), args[0], strerror), file=sys.stderr)
+ return 1
+ else:
+ fin = sys.stdin
+
+ if len(args) > 1 and args[1] != "-":
+ try:
+ fout = open(args[1], "w")
+ except IOError as xxx_todo_changeme1:
+ (errno, strerror) = xxx_todo_changeme1.args
+ print("%s: can't create %s: %s" % (os.path.basename(sys.argv[1]), args[1], strerror), file=sys.stderr)
+ return 1
+ else:
+ fout = sys.stdout;
+
+ areas = []
+ modules = []
+ libraries = []
+ ubads = []
+
+ radix = 'HEX'
+ state = None
+ area = None
+
+ # process asxxxx map file
+ for line in fin:
+ if re.match(r"^Hexadecimal$", line):
+ radix = 'HEX';
+ continue
+
+ if re.match(r"^Area +Addr +Size +Decimal +Bytes +\(Attributes\)$", line):
+ line = next(fin)
+ if re.match(r"^[- ]+$", line):
+ line = next(fin)
+ m = re.match(r"^([^ ]+) +([0-9A-Fa-f]{4}) +([0-9A-Fa-f]{4}) += +\d+\. +\w+ +\(([^\)]+)\)$", line)
+ if m:
+ if area:
+ if m.group(1) != area['area']:
+ areas.append(area)
+ area = {'area': m.group(1), 'radix': radix, 'base': int(m.group(2), 16), 'size': int(m.group(3), 16), 'attrib': m.group(4).replace(',', ' '), 'globals': []}
+ else:
+ area = {'area': m.group(1), 'radix': radix, 'base': int(m.group(2), 16), 'size': int(m.group(3), 16), 'attrib': m.group(4).replace(',', ' '), 'globals': []}
+ state = 'IN_AREA'
+ continue
+
+ m = re.match(r"^ +([0-9A-Fa-f]{4}) +([^ ]+) +$", line)
+ if state == 'IN_AREA' and m:
+ area['globals'].append({'value': int(m.group(1), 16), 'global': m.group(2)})
+ continue
+
+ m = re.match(r"Files Linked +\[ module\(s\) \]$", line)
+ if m:
+ state = 'IN_MODULES'
+ continue
+
+ m = re.match(r"Libraries Linked +\[ object file \]$", line)
+ if m:
+ state = 'IN_LIBRARIES'
+ continue
+
+ m = re.match(r"User Base Address Definitions$", line)
+ if m:
+ state = 'IN_UBAD'
+ continue
+
+ m = re.match(r"^([^ ]+) +\[ ([^ ]*) \]$", line)
+ if m:
+ if state == 'IN_MODULES':
+ modules.append({'file': m.group(1), 'name': m.group(2)})
+ continue
+
+ if state == 'IN_LIBRARIES':
+ libraries.append({'library': m.group(1), 'module': m.group(2)})
+ continue
+
+ m = re.match(r"^([^ ]+) += +0x([0-9A-Fa-f]{4})$", line)
+ if state == 'IN_UBAD' and m:
+ ubads.append({'symbol': m.group(1), 'value': m.group(2)})
+ continue
+
+ if area:
+ areas.append(area)
+
+
+ if options.no_gmb:
+ # generate no$gmp map file
+ print('; no$gmb format .sym file', file=fout)
+ print('; Generated automagically by %s' % os.path.basename(sys.argv[0]), file=fout)
+ for e in areas:
+ print('; Area: %s' % e['area'], file=fout)
+ if e['globals']:
+ e['globals'].sort(key = operator.itemgetter('value'))
+ for g in e['globals']:
+ if g['global'][0:3] != 'l__':
+ if g['value'] > 0x7FFF:
+ print('00:%04X %s' % (g['value'], g['global']), file=fout)
+ else:
+ print('%02X:%04X %s' % (g['value'] // 16384, g['value'], g['global']), file=fout)
+ else:
+ # generate rrgb map file
+ for e in areas:
+ print('AREA %s' % e['area'], file=fout)
+ print('\tRADIX %s' % e['radix'], file=fout)
+ print('\tBASE %04X' % e['base'], file=fout)
+ print('\tSIZE %04X' % e['size'], file=fout)
+ print('\tATTRIB %s' % e['attrib'], file=fout)
+ if e['globals']:
+ e['globals'].sort(key = operator.itemgetter('value'))
+ print('\tGLOBALS', file=fout)
+ for g in e['globals']:
+ print('\t\t%s\t%04X' % (g['global'], g['value']), file=fout)
+
+ if modules:
+ print('MODULES', file=fout)
+ for m in modules:
+ print('\tFILE %s' % m['file'], file=fout)
+ if m['name']:
+ print('\t\tNAME %s' % m['name'], file=fout)
+
+ if libraries:
+ print('LIBRARIES', file=fout)
+ for m in libraries:
+ print('\tLIBRARY %s' % m['library'], file=fout)
+ print('\t\tMODULE %s' % m['module'], file=fout)
+
+ if ubads:
+ print('USERBASEDEF', file=fout)
+ for m in ubads:
+ print('\t%s = 0x%04X' % (m['symbol'], int(m['value'], 16)), file=fout)
+ return 0
+
+if __name__ == '__main__':
+ sys.exit(main())