-
Notifications
You must be signed in to change notification settings - Fork 1
/
pydetokenmsx.py
112 lines (101 loc) · 2.44 KB
/
pydetokenmsx.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#!/usr/bin/env python3
#######################
# MSX BASIC Detokenizer
#
# takes a binary BASIC file (header: FFh)
# and creates a BASIC listing with proper line endings.
# [incomplete but workable.]
#
# $ python3 ./pydetokenmsx.py <INPUTFILE>
#
# Output: "INPUTFILE"-listing.bas
# ** Requires msxbasic-tokenlist.txt **
import sys
f=open('msxbasic-tokenlist.txt','r')
i = 0
tokens = []
while i < 16:
inl=f.readline()
inl = inl.split(',')
inl[15] = inl[15][:-1]
for p in inl:
tokens.append(p)
i += 1
outstring = ''
tokens[44] = ','
subtokens = []
i = 0
while i < 4:
inl=f.readline()
inl = inl.split(',')
inl[len(inl)-1] = inl[len(inl)-1][:-1]
for p in inl:
subtokens.append(p)
i += 1
f.close()
f=open(sys.argv[1],'rb')
inbytes=f.read()
f.close()
bc = 0
if inbytes[bc] != 255:
print("This is not a MSX tokenized BASIC file!")
sys.exit()
def print_token():
global bc
global outstring
b = inbytes[bc]
if b == 0:
bc += 3
outstring += str((inbytes[bc+1] * 256) + inbytes[bc]) + " "
bc += 1
return
elif b == 11:
print('[octal]')
bc += 2
elif b == 12:
bc += 1
outstring += '&H' + hex((inbytes[bc+1]*256)+inbytes[bc])[2:]
bc += 1
elif b == 14:
bc += 1
outstring += str((inbytes[bc+1]*256)+inbytes[bc])
bc += 1
elif b == 15:
outstring += str(inbytes[bc+1])
bc += 1
elif b == 28:
bc += 1
outstring += str((inbytes[bc+1]*256)+inbytes[bc])
bc += 1
elif b == 255:
bc += 1
b = inbytes[bc]
outstring += subtokens[b-128]
else:
outstring += tokens[b]
bc += 1
startaddr = hex((inbytes[bc+1] * 256) + inbytes[bc])
outstring += "1 REM Start address: " + startaddr + '\r\n'
bc += 2
outstring += str((inbytes[bc+1] * 256) + inbytes[bc]) + " "
def process_file():
global outstring
global bc
global inbytes
while bc < len(inbytes):
bc += 2
while inbytes[bc] != 0:
print_token()
bc += 1
if inbytes[bc] == 0:
if inbytes[bc+1] == 0:
if inbytes[bc+2] == 0:
return
bc += 1
bc += 2
outstring += "\r\n"+str((inbytes[bc+1] * 256) + inbytes[bc]) + " "
process_file()
f = open(sys.argv[1]+'-listing.bas', 'w')
f.write(outstring)
f.close()
print (sys.argv[1]+'-listing.bas written successfully!')