-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathutil.py
More file actions
138 lines (113 loc) · 3.24 KB
/
util.py
File metadata and controls
138 lines (113 loc) · 3.24 KB
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
import re
import os
import struct
from math import floor, log10
def fexp(f):
return int(floor(log10(abs(f)))) if f != 0 else 0
def fman(f):
return f/10**fexp(f)
def dec2twoscmplment(val):
if val < 0:
# val = ((~abs(v) + 1) & 0xffff)#its a 16 bit value so to fix the sign bit
val = val + 2**16
return val
def twoscmplment2dec(val):
if val & 0x8000:
val = val - (2**16)
return val
def parity_calc(i):
i = i - ((i >> 1) & 0x55555555)
i = (i & 0x33333333) + ((i >> 2) & 0x33333333)
i = (((i + (i >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24
return int(i % 2)
def detectarg(curr_address, symbols, argstring):
#'003003 #octal
#+'003003 #octal
#-'003003 #octal
#h5A #hex
#+h5A #hex
#-h5A #hex
#* #current address
#23.456B10, -B6, 12C0 #FIXED point
#22.33.44E0, .12345D2 #floating point data
#''help'' #PHA
bnext = 0
sign = 1
literal = False
if argstring[bnext] == "-":
sign = -1
bnext += 1
elif argstring[bnext] == "+":
bnext += 1
if argstring[bnext] == "'": #octal
bnext += 1
if argstring[bnext] == "'": #alphanumeric
bnext += 1
t = "str"
lambdaparse = lambda x,y=bnext : [ord(x) | 0x80 for x in x[y:-2]] #patches in ASR33 converion of strings
else:
t = "oct"
lambdaparse = lambda x,y=bnext,s=sign : int(x[y:],8) * s
elif argstring[bnext] == "h": #hex
bnext += 1
t = "hex"
lambdaparse = lambda x,y=bnext,s=sign : int(x[y:],16) * s
elif argstring[bnext] == "*": #current
bnext += 1
if bnext < len(argstring):
if argstring[bnext] == "*": #"to be filled in at runtime"
bnext += 1
t = "ip"
lambdaparse = lambda x : 0 #"This address is set during assembly to an abso1ute address of 00000."
else:
t = "ip"
lambdaparse = lambda x,y =curr_address,s=sign : y * s
else:
t = "ip"
lambdaparse = lambda x,y =curr_address,s=sign : y * s
elif argstring[bnext:] in symbols:
t = "label"
lambdaparse = lambda x,y=bnext,s=sign : symbols[x[y:]][1] * s
else: #bare number.. still more work these need to be packed into a ye-olde format as words
if "." in argstring: #float or fixed
if "E" in argstring or "e" in argstring: #float
t = "float"
lambdaparse = lambda x : float(x)
else: #fixed
t = "fixed"
lambdaparse = lambda x : Decimal(x)
else:#decimal
t = "dec"
lambdaparse = lambda x: int(x)
return (t,lambdaparse)
def parsearg(curr_address,symbols, argstring):
argstring = argstring.strip()
argparts = re.split("(\+|\-)",argstring)
total = lambda :0
mth = lambda x,y : x()+y()
for i in range(len(argparts)):
if argparts[i] != "":
if argparts[i] in ["+","-"]:
if argparts[i] == "-":
mth = lambda x,y : x()-y()
else:
mth = lambda x,y : x()+y()
else:
t,f = detectarg(curr_address,symbols, argparts[i])
if t == 'str':
return lambda x=f : x(argstring)
else:
total = lambda x=total, y = lambda x=f,y=argparts[i]: x(y), z=mth: z(x, y)
return total
def loadProgramBin(filename):
size = os.path.getsize(filename)
f = open(filename,"rb")
b = f.read(size)
binfile = struct.unpack(">%dH" % (size/2), b)
return binfile
def storeProgramBin(filename,data):
f = open(filename,"wb")
size = len(data)
binfile = struct.pack(">%dH" % size, *data)
f.write(binfile)
f.close()