#! /usr/bin/python3

import sys, os, shutil, struct

input = sys.argv[1]
#input='SDS2000x_1.2.2.2R10.ADS'
#output = input+'_ByteSwaped'

# First step check sections and print Versions
#==============================================

b = bytearray(open(input, 'rb').read())

#print('Magic: ',format(b[3],'02x'),format(b[2],'02x'),format(b[1],'02x'),format(b[0],'02x'))
print("Magic: {3:02x}{2:02x}{1:02x}{0:02x}".format(b[0],b[1],b[2],b[3]))
SsizeIdx=(0,12,16,20,24,28,32,36,40)
VnamIdx=(0,44,59,74,89,104,118,134,148)
SecLen=[0,0,0,0,0,0,0,0,0,0]
SecHdLen=[196,16,72,72,72,72,72,72,72,0]
SecStartOff=[0,0,0,0,0,0,0,0,0,0]
SecCHKSum=[0,0,0,0,0,0,0,0,0,0]



for i in range(4,11):
    j=i-3
    if (int(b[i])==1):
        SecLen[j]=int.from_bytes(b[SsizeIdx[j]+3:SsizeIdx[j]-1:-1], byteorder='big', signed=False)
        print("Section: {0} exist  LEN: {1:>07x}  VER: {2:>12}".format(j,SecLen[j],\
                "".join(map(chr,b[VnamIdx[j]:VnamIdx[j]+12])).split('\x00',1)[0])) 

SecStartOff[0]=SecHdLen[0]      
for i in range(1,9):
    SecStartOff[i]=SecStartOff[i-1]+SecLen[i-1]

for i in range(1,9):
     SecCHKSum[i]=int.from_bytes(b[SecStartOff[i]:SecStartOff[i]+4], byteorder='big', signed=False)
           
print("\n\nSection Length:\n") 
print("  S1:    S2:    S3:    S4:    S5:   S6:    S7:    S8:  ")
print("=======================================================")
print("{0:>06x} {1:>06x} {2:>06x} {3:>06x} {4:>06x} {5:>06x} {6:>06x} {7:>06x}".format(*[i for i in SecLen[1:9]]))

print("\n\nSection Start Offset:\n") 
print("  S1:    S2:    S3:    S4:    S5:   S6:    S7:    S8:  ")
print("=======================================================")
print("{0:>06x} {1:>06x} {2:>06x} {3:>06x} {4:>06x} {5:>06x} {6:>06x} {7:>06x}".format(*[i for i in SecStartOff[1:9]]))
      
      
print("\n\nSection CHK Sum:\n") 
print("  S1:    S2:    S3:    S4:    S5:   S6:    S7:    S8:  ")
print("=======================================================")        
print("{0:>06x} {1:>06x} {2:>06x} {3:>06x} {4:>06x} {5:>06x} {6:>06x} {7:>06x}".format(*[i for i in SecCHKSum[1:9]]))


for i in range(2,9):
    output  = input+'_S'+str(i)
    output2 = input+'_S'+str(i)+'_REV_XOR'
    outb=b[SecStartOff[i]+SecHdLen[i]:SecStartOff[i]+SecLen[i]]
    outb2=outb
    for j in range(0,len(outb2)):
        outb2[j]=outb[j] ^ 0xFF
    print("Start to write {}\n".format(output))
    open(output, 'wb').write(outb2)
    print("End of write {}\n".format(output))
    print("Start to write {}\n".format(output2))
    open(output2, 'wb').write(outb2)
    print("End of write {}\n".format(output))
    
    
