Finshed adding source

This commit is contained in:
notblisy
2023-04-27 10:48:20 -04:00
committed by GitHub
parent 54e258f1b4
commit 80a61385f9
36 changed files with 2180 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
asmProblemBytes = ['\x00', '\x09', '\x0A', '\x22']
def asmQuote(t):
result = ""
quoted = False
if t[0] in asmProblemBytes:
result = '{0}'.format(ord(t[0]))
else:
result = '"' + t[0]
quoted = True
t = t[1:]
while len(t):
if quoted and t[0] in asmProblemBytes:
result += '",{0}'.format(ord(t[0]))
quoted = False
elif quoted:
result += t[0]
elif t[0] in asmProblemBytes:
result += ',{0}'.format(ord(t[0]))
quoted = False
else:
result += ',"' + t[0]
quoted = True
t = t[1:]
if quoted:
result += '"'
return result

BIN
SOURCE/scripts/asmquote.pyc Normal file

Binary file not shown.

View File

@@ -0,0 +1,89 @@
import struct
import sys
chunk_lengths = [0,0,0,6,2,5,12,5,3,1,2,5,5,5,1,13,13]
bytewises = []
bytewise_results = []
wordwises = []
wordwise_results = []
crcs = []
crc_results = []
data = ""
with open(sys.argv[1], 'rb') as f:
data = f.read()
f.closed
base_address = struct.unpack('<I', data[1:5])[0]
i = 0x11 # first chunk location
while i < len(data):
chunk_type = ord(data[i])
if chunk_type == 0x02: # END_OF_CHUNKS
break
elif chunk_type == 0x07: # CUSTOM_BERRY
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
bytewises.append([start_address + 0x52C, start_address, start_address + 0x52C])
elif chunk_type == 0x0D: # BATTLE_TRAINER
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
wordwises.append([start_address + 0xB8, start_address, start_address + 0xB8])
elif chunk_type == 0x0F: # CHECKSUM_BYTES
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
bytewise.append([i + 1, start_address, end_address])
elif chunk_type == 0x10: # CHECKSUM_CRC
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
crcs.append([i + 1, start_address, end_address])
elif chunk_type < 0x02 or chunk_type > 0x10:
print "Unknown chunk {0:X}".format(chunk_type)
raise TypeError
i += chunk_lengths[chunk_type]
# calculate and insert all wordwise checksums
for wordwise in wordwises:
sum = 0
for i in range(wordwise[1], wordwise[2], 4):
sum = (sum + struct.unpack('<I', data[i:i+4])[0]) & 0xFFFFFFFF
wordwise_results.append(sum)
i = 0
for wordwise in wordwises:
data = data[0:wordwise[0]] + struct.pack('<I', wordwise_results[i]) + data[(wordwise[0] + 4):]
i += 1
# calculate and insert all bytewise checksums
for bytewise in bytewises:
sum = 0
for i in range(bytewise[1], bytewise[2]):
sum = (sum + ord(data[i])) & 0xFFFFFFFF
bytewise_results.append(sum)
i = 0
for bytewise in bytewises:
data = data[0:bytewise[0]] + struct.pack('<I', bytewise_results[i]) + data[(bytewise[0] + 4):]
i += 1
# calculate and insert all CRC checksums
for crc in crcs:
sum = 0x1121
for i in range(crc[1], crc[2]):
sum ^= ord(data[i])
for j in range(8):
if(sum & 1):
sum = (sum >> 1) ^ 0x8408
else:
sum >>= 1
sum = ~sum & 0xFFFF
crc_results.append(sum)
i = 0
for crc in crcs:
data = data[0:crc[0]] + struct.pack('<I', crc_results[i]) + data[(crc[0] + 4):]
i += 1
# write the updated file
out = open(sys.argv[2], 'w')
out.write(data)

View File

@@ -0,0 +1,105 @@
import struct
import sys
chunk_lengths = [0,0,0,6,2,5,12,5,3,1,2,5,5,5,1,13,13,5]
bytewises = []
bytewise_results = []
wordwises = []
wordwise_results = []
crcs = []
crc_results = []
data = ""
with open(sys.argv[1], 'rb') as f:
data = f.read()
f.closed
base_address = struct.unpack('<I', data[1:5])[0]
def find_all(a_str, sub):
start = 0
while True:
start = a_str.find(sub, start)
if start == -1: return
yield start
start += len(sub) # use start += 1 to find overlapping matches
pos=list(find_all(data,b'\x01\x00\x00\x00\x02\x02\x00\x02\x00\x00\x00\x04\x00\x80\x01\x00\x00\x10'))
for i in pos:
i=i+17
chunk_type = ord(data[i])
if chunk_type == 0x02: # END_OF_CHUNKS
break
elif chunk_type == 0x07: # CUSTOM_BERRY
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
bytewises.append([start_address + 0x52C, start_address, start_address + 0x52C])
elif chunk_type == 0x0D: # BATTLE_TRAINER
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
wordwises.append([start_address + 0x13C, start_address, start_address + 0x13C])
elif chunk_type == 0x0F: # CHECKSUM_BYTES
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
bytewise.append([i + 1, start_address, end_address])
elif chunk_type == 0x10: # CHECKSUM_CRC
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address +i-0x11
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address +i-0x11
crcs.append([i + 1, start_address, end_address])
elif chunk_type == 0x11: # DOME_TRAINER
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
wordwises.append([start_address + 0x13C, start_address, start_address + 0x13C])
elif chunk_type < 0x02 or chunk_type > 0x11:
print "Unknown chunk {0:X}".format(chunk_type)
raise TypeError
i += chunk_lengths[chunk_type]
# calculate and insert all wordwise checksums
for wordwise in wordwises:
sum = 0
for i in range(wordwise[1], wordwise[2], 4):
sum = (sum + struct.unpack('<I', data[i:i+4])[0]) & 0xFFFFFFFF
wordwise_results.append(sum)
i = 0
for wordwise in wordwises:
data = data[0:wordwise[0]] + struct.pack('<I', wordwise_results[i]) + data[(wordwise[0] + 4):]
i += 1
# calculate and insert all bytewise checksums
for bytewise in bytewises:
sum = 0
for i in range(bytewise[1], bytewise[2]):
sum = (sum + ord(data[i])) & 0xFFFFFFFF
bytewise_results.append(sum)
i = 0
for bytewise in bytewises:
data = data[0:bytewise[0]] + struct.pack('<I', bytewise_results[i]) + data[(bytewise[0] + 4):]
i += 1
# calculate and insert all CRC checksums
for crc in crcs:
sum = 0x1121
for i in range(crc[1], crc[2]):
sum ^= ord(data[i])
for j in range(8):
if(sum & 1):
sum = (sum >> 1) ^ 0x8408
else:
sum >>= 1
sum = ~sum & 0xFFFF
crc_results.append(sum)
i = 0
for crc in crcs:
data = data[0:crc[0]] + struct.pack('<I', crc_results[i]) + data[(crc[0] + 4):]
i += 1
# write the updated file
out = open(sys.argv[2], 'w')
out.write(data)

View File

@@ -0,0 +1,26 @@
# -*- coding: utf-8 -*-
import sys
from asmquote import asmQuote
region = sys.argv[3]
out = open(sys.argv[2], 'w')
with open(sys.argv[1], 'rb') as f:
for asm in f:
asms = asm.split('"')
command = asms[0].strip()
if command == "db":
# this is only for the American e-Reader; still need to deal with Japanese
asms[1] = asms[1].replace('\\0', '\x00')
asms[1] = asms[1].replace('\\n', '\n')
asms[1] = asms[1].replace('é', '\x7F')
out.write("db " + asmQuote(asms[1]) + "\n")
else:
out.write(asm)
if "macros.asm" in asm:
out.write("REGION EQU REGION_{0}\n".format(region))
out.write('REGION_NAME EQUS "{0}"\n'.format(region))
f.closed

481
SOURCE/scripts/gen3text.py Normal file
View File

@@ -0,0 +1,481 @@
# -*- coding: utf-8 -*-
import sys
chars = {
# Japanese character table
' ': '\x00',
'': '\x01',
'': '\x02',
'': '\x03',
'': '\x04',
'': '\x05',
'': '\x06',
'': '\x07',
'': '\x08',
'': '\x09',
'': '\x0A',
'': '\x0B',
'': '\x0C',
'': '\x0D',
'': '\x0E',
'': '\x0F',
'': '\x10',
'': '\x11',
'': '\x12',
'': '\x13',
'': '\x14',
'': '\x15',
'': '\x16',
'': '\x17',
'': '\x18',
'': '\x19',
'': '\x1A',
'': '\x1B',
'': '\x1C',
'': '\x1D',
'': '\x1E',
'': '\x1F',
'': '\x20',
'': '\x21',
'': '\x22',
'': '\x23',
'': '\x24',
'': '\x25',
'': '\x26',
'': '\x27',
'': '\x28',
'': '\x29',
'': '\x2A',
'': '\x2B',
'': '\x2C',
'': '\x2D',
'': '\x2E',
'': '\x2F',
'': '\x30',
'': '\x31',
'': '\x32',
'': '\x33',
'': '\x34',
'': '\x35',
'': '\x36',
'': '\x37',
'': '\x38',
'': '\x39',
'': '\x3A',
'': '\x3B',
'': '\x3C',
'': '\x3D',
'': '\x3E',
'': '\x3F',
'': '\x40',
'': '\x41',
'': '\x42',
'': '\x43',
'': '\x44',
'': '\x45',
'': '\x46',
'': '\x47',
'': '\x48',
'': '\x49',
'': '\x4A',
'': '\x4B',
'': '\x4C',
'': '\x4D',
'': '\x4E',
'': '\x4F',
'': '\x50',
'': '\x51',
'': '\x52',
'': '\x53',
'': '\x54',
'': '\x55',
'': '\x56',
'': '\x57',
'': '\x58',
'': '\x59',
'': '\x5A',
'': '\x5B',
'': '\x5C',
'': '\x5D',
'': '\x5E',
'': '\x5F',
'': '\x60',
'': '\x61',
'': '\x62',
'': '\x63',
'': '\x64',
'': '\x65',
'': '\x66',
'': '\x67',
'': '\x68',
'': '\x69',
'': '\x6A',
'': '\x6B',
'': '\x6C',
'': '\x6D',
'': '\x6E',
'': '\x6F',
'': '\x70',
'': '\x71',
'': '\x72',
'': '\x73',
'': '\x74',
'': '\x75',
'': '\x76',
'': '\x77',
'': '\x78',
'': '\x79',
'': '\x7A',
'': '\x7B',
'': '\x7C',
'': '\x7D',
'': '\x7E',
'': '\x7F',
'': '\x80',
'': '\x81',
'': '\x82',
'': '\x83',
'': '\x84',
'': '\x85',
'': '\x86',
'': '\x87',
'': '\x88',
'': '\x89',
'': '\x8A',
'': '\x8B',
'': '\x8C',
'': '\x8D',
'': '\x8E',
'': '\x8F',
'': '\x90',
'': '\x91',
'': '\x92',
'': '\x93',
'': '\x94',
'': '\x95',
'': '\x96',
'': '\x97',
'': '\x98',
'': '\x99',
'': '\x9A',
'': '\x9B',
'': '\x9C',
'': '\x9D',
'': '\x9E',
'': '\x9F',
'': '\xA0',
'': '\xA1',
'': '\xA2',
'': '\xA3',
'': '\xA4',
'': '\xA5',
'': '\xA6',
'': '\xA7',
'': '\xA8',
'': '\xA9',
'': '\xAA',
'': '\xAB',
'': '\xAC',
'': '\xAD',
'': '\xAE',
'': '\xAF',
'': '\xB0',
'': '\xB1',
'': '\xB2',
'': '\xB3',
'': '\xB4',
'': '\xB5',
'': '\xB6',
'': '\xB7',
'': '\xB8',
'×': '\xB9',
'': '\xBA',
'': '\xBB',
'': '\xBC',
'': '\xBD',
'': '\xBE',
'': '\xBF',
'': '\xC0',
'': '\xC1',
'': '\xC2',
'': '\xC3',
'': '\xC4',
'': '\xC5',
'': '\xC6',
'': '\xC7',
'': '\xC8',
'': '\xC9',
'': '\xCA',
'': '\xCB',
'': '\xCC',
'': '\xCD',
'': '\xCE',
'': '\xCF',
'': '\xD0',
'': '\xD1',
'': '\xD2',
'': '\xD3',
'': '\xD4',
'': '\xD5',
'': '\xD6',
'': '\xD7',
'': '\xD8',
'': '\xD9',
'': '\xDA',
'': '\xDB',
'': '\xDC',
'': '\xDD',
'': '\xDE',
'': '\xDF',
'': '\xE0',
'': '\xE1',
'': '\xE2',
'': '\xE3',
'': '\xE4',
'': '\xE5',
'': '\xE6',
'': '\xE7',
'': '\xE8',
'': '\xE9',
'': '\xEA',
'': '\xEB',
'': '\xEC',
'': '\xED',
'': '\xEE',
'': '\xEF',
'': '\xF0',
'Ä': '\xF1',
'Ö': '\xF2',
'Ü': '\xF3',
'ä': '\xF4',
'ö': '\xF5',
'ü': '\xF6',
#'⬆': '\xF7',
#'⬇': '\xF8',
#'⬅': '\xF9',
'\\l': '\xFA',
'\\p': '\xFB',
'\{FC}': '\xFC',
'\\v1': '\xFD\x01',
'\\v2': '\xFD\x02',
'\\v3': '\xFD\x03',
'\\n': '\xFE',
'@': '\xFF',
# characters changed for Western versions
' ': '\x00',
'À': '\x01',
'Á': '\x02',
'Â': '\x03',
'Ç': '\x04',
'È': '\x05',
'É': '\x06',
'Ê': '\x07',
'Ë': '\x08',
'Ì': '\x09',
'Î': '\x0B',
'Ï': '\x0C',
'Ò': '\x0D',
'Ó': '\x0E',
'Ô': '\x0F',
'Œ': '\x10',
'Ù': '\x11',
'Ú': '\x12',
'Û': '\x13',
'Ñ': '\x14',
'ß': '\x15',
'à': '\x16',
'á': '\x17',
'ç': '\x19',
'è': '\x1A',
'é': '\x1B',
'ê': '\x1C',
'ë': '\x1D',
'ì': '\x1E',
'î': '\x20',
'ï': '\x21',
'ò': '\x22',
'ó': '\x23',
'ô': '\x24',
'œ': '\x25',
'ù': '\x26',
'ú': '\x27',
'û': '\x28',
'ñ': '\x29',
'º': '\x2A',
'ª': '\x2B',
'\{er}': '\x2C',
'&': '\x2D',
'+': '\x2E',
'\{L.}': '\x34', # Italian
'\{Lv}': '\x34', # English
'\{Lv.}': '\x34', # German
'\{N.}': '\x34', # French
'\{Nv}': '\x34', # Spanish
'=': '\x35',
';': '\x36', # European
'¿': '\x51',
'¡': '\x52',
'\{PKMN}': '\x53\x54',
'\{POKé}': '\x55\x56',
'\{POKéBLOC}': '\x55\x56\x57\x58\x59', # French
'\{POKéBLOCK}': '\x55\x56\x57\x58\x59', # English
'\{POKéCUBO}': '\x55\x56\x57\x58\x59', # Spanish
'\{POKéRIEGEL}': '\x55\x56\x57\x58\x59', # German
'Í': '\x5A',
'%': '\x5B',
'(': '\x5C',
')': '\x5D',
'\{POKéMELLA}': '\x5E\x5F\x60\x61\x62', # Italian
'\{POKéMELLE}': '\x5E\x5F\x60\x61\x63', # Italian
'â': '\x68',
'í': '\x6F',
'': '\x79',
'': '\x7A',
'': '\x7B',
'': '\x7C',
'\{e}': '\x84', # European
'': '\x85', # European
'': '\x86', # European
'\{re}': '\xA0', # European
'0': '\xA1',
'1': '\xA2',
'2': '\xA3',
'3': '\xA4',
'4': '\xA5',
'5': '\xA6',
'6': '\xA7',
'7': '\xA8',
'8': '\xA9',
'9': '\xAA',
'!': '\xAB',
'?': '\xAC',
'.': '\xAD',
'-': '\xAE',
'': '\xB0',
'': '\xB1', # English, Italian, Spanish
'«': '\xB1', # French
'': '\xB1', # German
'': '\xB2', # English, Italian, Spanish
'»': '\xB2', # French
#'“': '\xB2', # German — clashes with English B1
'': '\xB3',
'': '\xB4',
'$': '\xB7',
',': '\xB8',
'/': '\xBA',
'A': '\xBB',
'B': '\xBC',
'C': '\xBD',
'D': '\xBE',
'E': '\xBF',
'F': '\xC0',
'G': '\xC1',
'H': '\xC2',
'I': '\xC3',
'J': '\xC4',
'K': '\xC5',
'L': '\xC6',
'M': '\xC7',
'N': '\xC8',
'O': '\xC9',
'P': '\xCA',
'Q': '\xCB',
'R': '\xCC',
'S': '\xCD',
'T': '\xCE',
'U': '\xCF',
'V': '\xD0',
'W': '\xD1',
'X': '\xD2',
'Y': '\xD3',
'Z': '\xD4',
'a': '\xD5',
'b': '\xD6',
'c': '\xD7',
'd': '\xD8',
'e': '\xD9',
'f': '\xDA',
'g': '\xDB',
'h': '\xDC',
'i': '\xDD',
'j': '\xDE',
'k': '\xDF',
'l': '\xE0',
'm': '\xE1',
'n': '\xE2',
'o': '\xE3',
'p': '\xE4',
'q': '\xE5',
'r': '\xE6',
's': '\xE7',
't': '\xE8',
'u': '\xE9',
'v': '\xEA',
'w': '\xEB',
'x': '\xEC',
'y': '\xED',
'z': '\xEE',
':': '\xF0',
}
asmProblemBytes = ['\x00', '\x09', '\x0A', '\x22']
def utf8ToRSText(t, region = ""):
currentChars = chars
if region == "DE":
chars[''] = '\xB2'
characters = []
char = ""
while len(t):
if ord(t[0]) >= 0xF0:
char += t[0:4]
t = t[4:]
elif ord(t[0]) >= 0xE0:
char += t[0:3]
t = t[3:]
elif ord(t[0]) >= 0xC0:
char += t[0:2]
t = t[2:]
else:
char += t[0:1]
t = t[1:]
if char != "\\" and char != "\\v" and (char[0:2] != "\\{" or char[-1] == "}"):
characters.append(char)
char = ""
result = ""
for char in characters:
result += chars[char]
return result
def asmQuote(t):
result = ""
quoted = False
if t[0] in asmProblemBytes:
result = '{0}'.format(ord(t[0]))
else:
result = '"' + t[0]
quoted = True
while len(t):
if quoted and t[0] in asmProblemBytes:
result += '",{0}'.format(ord(t[0]))
quoted = False
elif quoted:
result += t[0]
elif t[0] in asmProblemBytes:
result += ',{0}'.format(ord(t[0]))
quoted = False
else:
result += ',"' + t[0]
quoted = True
t = t[1:]
if quoted:
result += '"'
return result

BIN
SOURCE/scripts/gen3text.pyc Normal file

Binary file not shown.

View File

@@ -0,0 +1,210 @@
# -*- coding: utf-8 -*-
import struct
import sys
data = ""
dataout=""
with open(sys.argv[1], 'rb') as f:
data = f.read()
f.closed
pv=struct.unpack('<I', data[36:40])[0]
otid=struct.unpack('<I', data[40:44])[0]
mask1=65280
mask2=255
mask=255
key4 = (pv ^ otid) >> 24
key3 = ((pv ^ otid) >> 16) & mask
key2 = ((pv ^ otid) >> 8) & mask
key1 = (pv ^ otid) & mask
substructG=[struct.unpack('<B', data[68])[0]]
substructA=[struct.unpack('<B', data[80])[0]]
substructE=[struct.unpack('<B', data[92])[0]]
substructM=[struct.unpack('<B', data[104])[0]]
for i in range(1,12):
substructG.append(struct.unpack('<B', data[68+i])[0])
substructA.append(struct.unpack('<B', data[80+i])[0])
substructE.append(struct.unpack('<B', data[92+i])[0])
substructM.append(struct.unpack('<B', data[104+i])[0])
checksum=0
i=68
while i < 116:
checksum=checksum+struct.unpack('<H', data[i:i+2])[0]
i+=2
data = data[0:64] + struct.pack('<B', checksum & mask2) + struct.pack('<B', (checksum & mask1) >> 8) + data[66:]
i=0
while i < 12:
substructG[i] ^= key1
substructA[i] ^= key1
substructE[i] ^= key1
substructM[i] ^= key1
substructG[i+1] ^= key2
substructA[i+1] ^= key2
substructE[i+1] ^= key2
substructM[i+1] ^= key2
substructG[i+2] ^= key3
substructA[i+2] ^= key3
substructE[i+2] ^= key3
substructM[i+2] ^= key3
substructG[i+3] ^= key4
substructA[i+3] ^= key4
substructE[i+3] ^= key4
substructM[i+3] ^= key4
i+=4
mod = pv % 24
i=0
if mod == 0:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
elif mod == 1:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
elif mod == 2:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
elif mod == 3:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
elif mod == 4:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
elif mod == 5:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
elif mod == 6:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
elif mod == 7:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
elif mod == 8:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
elif mod == 9:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
elif mod == 10:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
elif mod == 11:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
elif mod == 12:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
elif mod == 13:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
elif mod == 14:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
elif mod == 15:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
elif mod == 16:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
elif mod == 17:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
elif mod == 18:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
elif mod == 19:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
elif mod == 20:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
elif mod == 21:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
elif mod == 22:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
else:
for i in range(12):
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
out = open(sys.argv[2], 'w')
out.write(data)

View File

@@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
import sys
from gen3text import utf8ToRSText
from asmquote import asmQuote
data_region = sys.argv[3] # determines region code
text_region = sys.argv[4] # determines string translation
out = open(sys.argv[2], 'w')
with open(sys.argv[1], 'rb') as f:
for asm in f:
asms = asm.split('"')
command = asms[0].strip()
if (command == "Text_" + text_region) or (command == "Text"):
asms[1] = utf8ToRSText(asms[1], text_region)
try:
length = asms[2].split(';')[0] # strip trailing comment
padding = int(length) - len(asms[1])
if padding > 0:
asms[1] += '\xFF'
for i in range(padding - 1):
asms[1] += "\x00"
except ValueError:
pass
out.write("db " + asmQuote(asms[1]) + "\n")
elif len(command) < 5 or command[0:5] != "Text_":
out.write(asm)
if "macros.asm" in asm:
# cant do this until after REGION_EN, etc. are loaded
out.write("REGION EQU REGION_" + data_region + "\n")
# else this is foreign text, delete it
f.closed

View File

@@ -0,0 +1,29 @@
# -*- coding: utf-8 -*-
import sys
out = open(sys.argv[2], 'w')
buffering = False
buf = ""
with open(sys.argv[1], 'rb') as f:
f.read(256) # skip to $0100
while True:
byte = f.read(1)
if not byte:
break
# the program shall end with $FF followed only by $00 bytes
# for every $FF we hit, buffer until something that isnt $00
if (not buffering and ord(byte) == 0xFF) or (buffering and ord(byte) == 0x00):
buf += byte
buffering = True
elif buffering and ord(byte) == 0xFF:
out.write(buf)
buf = byte
elif buffering:
out.write(buf)
out.write(byte)
buf = ""
buffering = False
else:
out.write(byte)
f.closed