--- /dev/null
+#!/usr/bin/env python3
+
+import re
+import sys
+from intelhex import IntelHex
+
+EXIT_SUCCESS = 0
+EXIT_FAILURE = 1
+
+NMAGIC = 0o410
+HEADER_SIZE = 0x10
+
+if len(sys.argv) < 4:
+ print(f'usage: {sys.argv[0]:s} inI.ihx inD.ihx a.out <in.map')
+ sys.exit(EXIT_FAILURE)
+inI_ihx = sys.argv[1]
+inD_ihx = sys.argv[2]
+a_out = sys.argv[3]
+
+print('map')
+map = {}
+re_bank = re.compile(' (....) ([be]_[ID]|[al]_(text|data))$')
+for line in sys.stdin:
+ line = line.rstrip()
+ match = re_bank.match(line)
+ if match is not None:
+ print(match.group(1), match.group(2))
+ map[match.group(2)] = int(match.group(1), 16)
+I_size = map['e_I'] - map['b_I']
+D_size = map['e_D'] - map['b_D']
+
+intelhexI = IntelHex(inI_ihx)
+intelhexD = IntelHex(inD_ihx)
+
+text_size = map['l_text']
+assert text_size == I_size
+text_size = (text_size + 0x3f) & ~0x3f
+
+data_size = map['l_data']
+data_size = (data_size + 1) & ~1
+
+bss_size = D_size - data_size
+bss_size = (bss_size + 1) & ~1
+
+entry_point = intelhexI.start_addr['EIP'] | 1
+
+hdr = [0] * HEADER_SIZE
+hdr[0] = NMAGIC & 0xff
+hdr[1] = (NMAGIC >> 8) & 0xff
+hdr[2] = text_size & 0xff
+hdr[3] = (text_size >> 8) & 0xff
+hdr[4] = data_size & 0xff
+hdr[5] = (data_size >> 8) & 0xff
+hdr[6] = bss_size & 0xff
+hdr[7] = (bss_size >> 8) & 0xff
+# 8, 9 = string size (unsupported)
+hdr[0xa] = entry_point & 0xff
+hdr[0xb] = (entry_point >> 8) & 0xff
+# 0xc, 0xd = pad (unsupported)
+# 0xe, 0xf = relflg (unsupported)
+
+intelhexI.padding = 0
+text = list(intelhexI.tobinstr(0, text_size - 1))
+
+intelhexD.padding = 0
+data = list(intelhexD.tobinstr(0, data_size - 1))
+
+with open(a_out, 'wb') as fout:
+ fout.write(bytes(hdr + text + data))
fprintf(stderr, "CSPACE\n");
#endif
t = outname(s);
- printf(".area comm_%.8s (rel,ovr)\n%.8s:.ds %d\n.area %s\n", t, t, geti(), area);
+ printf(".bank D\n.area comm_%.8s (rel,ovr,bank = D)\n%.8s:.ds %d\n.area %s\n", t, t, geti(), area);
break;
case SSPACE: