# mkips.py base.bin patched.bin out.ips  -- writes an IPS patch and verifies it
import sys
a=open(sys.argv[1],'rb').read(); b=open(sys.argv[2],'rb').read(); assert len(a)==len(b)
out=bytearray(b'PATCH'); i=0
while i<len(a):
    if a[i]!=b[i]:
        j=i
        while j<len(a) and (a[j]!=b[j] or (j+1<len(a) and a[j+1]!=b[j+1])) and j-i<65000: j+=1
        out+=i.to_bytes(3,'big')+(j-i).to_bytes(2,'big')+b[i:j]; i=j
    else: i+=1
out+=b'EOF'
c=bytearray(a); k=5
while out[k:k+3]!=b'EOF':
    o=int.from_bytes(out[k:k+3],'big'); s=int.from_bytes(out[k+3:k+5],'big'); c[o:o+s]=out[k+5:k+5+s]; k+=5+s
assert bytes(c)==b
open(sys.argv[3],'wb').write(out); print('ips',sys.argv[3],len(out),'bytes, verified')
