Implement 386 instruction table, improve 8086/186/286 instruction table
[multi_emu.git] / absolute_loader.py
1 #!/usr/bin/env python3
2
3 import sys
4 from intelhex import IntelHex
5
6 EXIT_SUCCESS = 0
7 EXIT_FAILURE = 1
8
9 if len(sys.argv) < 3:
10   print(f'usage: {sys.argv[0]:s} in.ptap out.ihx')
11   sys.exit(EXIT_FAILURE)
12 in_ptap = sys.argv[1]
13 out_ihx = sys.argv[2]
14
15 intelhex = IntelHex()
16 with open(in_ptap, 'rb') as fin:
17   while True:
18     data = fin.read(1)
19     if len(data) == 0:
20       break
21     #print(f'{data[0]:02x}')
22     if data[0] == 0:
23       continue
24     if data[0] != 1:
25       break
26     data += fin.read(5)
27     assert len(data) == 6
28     assert data[1] == 0
29     load_size = data[2] | (data[3] << 8)
30     load_addr = data[4] | (data[5] << 8)
31     assert load_size >= 6
32     load_size -= 6
33     data += fin.read(load_size + 1)
34     assert len(data) == load_size + 7
35     assert (sum(data) & 0xff) == 0 
36     if load_size == 0:
37       assert (load_addr & 1) == 0
38       print(f'entry_point {load_addr:04x}')
39       intelhex.start_addr = {'EIP': load_addr}
40     else:
41       print(f'[{load_addr:04x}, {load_addr + load_size:04x}]')
42       intelhex.frombytes(data[6:-1], load_addr)
43 intelhex.write_hex_file(out_ihx)