46 lines
1 KiB
Python
46 lines
1 KiB
Python
#!/usr/bin/env python
|
|
from __future__ import print_function
|
|
import sys
|
|
from struct import pack,unpack
|
|
|
|
if sys.platform == "win32":
|
|
import os, msvcrt
|
|
msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)
|
|
|
|
|
|
class Mem:
|
|
def __init__(self):
|
|
self.low_water=0xffff
|
|
self.high_water=0
|
|
page=b'\0'*256
|
|
self.mem=page*256
|
|
def load_prg(self, fn):
|
|
data=open(fn,'rb').read()
|
|
start=unpack('<H',data[:2])[0]
|
|
data=data[2:]
|
|
end=min(0x10000,start+len(data))
|
|
data=data[:end-start]
|
|
self.low_water=min(self.low_water, start)
|
|
self.high_water=max(self.high_water, end)
|
|
self.mem=self.mem[:start]+data+self.mem[end:]
|
|
|
|
def write(self, f):
|
|
if self.low_water<self.high_water:
|
|
f.write(pack('<H',self.low_water)+self.mem[self.low_water:self.high_water])
|
|
else:
|
|
f.write(pack('<H',0x0801))
|
|
|
|
|
|
|
|
m=Mem()
|
|
for fn in sys.argv[1:]:
|
|
m.load_prg(fn)
|
|
|
|
try:
|
|
fo=sys.stdout.buffer
|
|
except AttributeError:
|
|
import sys
|
|
fo=sys.stdout
|
|
m.write(fo)
|
|
|