changeset 19:c9fbeb852ff2

unmangled if/elif/else structures in assembler
author james <jb302@eecs.qmul.ac.uk>
date Sun, 23 Feb 2014 14:47:41 +0000
parents 256d24488e3f
children ddeae9d3fff4
files assembler/.assembler.py.swp assembler/assembler.py assembler/language.py assembler/language.pyc
diffstat 4 files changed, 70 insertions(+), 55 deletions(-) [+]
line wrap: on
line diff
Binary file assembler/.assembler.py.swp has changed
--- a/assembler/assembler.py	Sat Feb 22 20:30:58 2014 +0000
+++ b/assembler/assembler.py	Sun Feb 23 14:47:41 2014 +0000
@@ -58,9 +58,8 @@
             if (len(statement) >= 3) and (statement[1] == 'equ'):
                 equ_index[statement[0]] = statement[2]
                 continue
-
             # if needed update index and remove label 
-            if statement[0][-1:] == ':':
+            elif statement[0][-1:] == ':':
                 label_index[statement[0][:-1]] = pc;
                 del statement[0]
                 
@@ -88,10 +87,14 @@
         except:
             print ' ** first pass error **\nline:\n', line
             raise
-
+    
     return asm, label_index
 
 # take preprocessed asm and write machine code to binary file
+# for each line of asm
+#   check if it's an org or db command deal with it accordingly
+#   check if arguments are labels and replace with value
+#   write instruction to file
 def second_pass(f, asm, label_index):
     pc = 0
 
@@ -116,21 +119,25 @@
             for a in args:
                 
                 if not a: continue
-                # labeled pointer uglyness
-                elif (a[0] == '@') and (a[1:] in label_index):
-                    args[i] = '@' + num_string(label_index[a[1:]])
-                    const = const + tokenize([args[i]])[1]
-                elif a in label_index:
-                    # check if constant needs to be a relative address
-                    r = list(sym)
-                    r.insert(i, 'rel8')
-                    r.pop(i + 1)
-                    if tuple(r) in iset[mne].keys():
-                        # relative addresses can be negative
-                        args[i] = num_string(label_index[a] - pc)
+                elif (sym[i] == 'label') or (sym[i] == '@label'):
+                    # labeled pointer uglyness
+                    if (a[0] == '@') and (a[1:] in label_index):
+                        args[i] = '@' + num_string(label_index[a[1:]])
+                        const = const + tokenize([args[i]])[1]
+                    elif a in label_index:
+                        # check if constant needs to be a relative address
+                        r = list(sym)
+                        r.insert(i, 'rel8')
+                        r.pop(i + 1)
+                        if tuple(r) in iset[mne].keys():
+                            # relative addresses can be negative
+                            args[i] = num_string(label_index[a] - pc)
+                        else:
+                            args[i] = num_string(label_index[a])
+                        const = const + tokenize([args[i]])[1]
                     else:
-                        args[i] = num_string(label_index[a])
-                    const = const + tokenize([args[i]])[1]
+                        print '** label error **\nline:\n', line
+                        raise
                 i = i + 1
             
             # assemble to file
--- a/assembler/language.py	Sat Feb 22 20:30:58 2014 +0000
+++ b/assembler/language.py	Sun Feb 23 14:47:41 2014 +0000
@@ -274,19 +274,50 @@
     data = ''
     
     i = 0
-
     for a in args:   
-    
+        
+        # things that can't be negative
         is_neg = 0
         # reserved words
         if a in vargs:
             sym.append(a)
             continue
-        # check if value is negative and remove sign
+        # 16 bit addresses
+        elif (a[:2] == PREFIX) and (2 < len(a[2:]) <= 4):
+            sym.append('addr16')
+            val = string_num(a)
+            data = data + struct.pack('>H', val)
+            continue
+        # pointers
+        elif a[0] == '@':
+            if a[:3] == '@' + PREFIX:
+                sym.append('@addr16')
+                val = string_num(a[1:])
+                data = data + struct.pack('>H', val)
+                continue
+            # labeled pointers make for ugly code considering
+            # only two instructions can use them
+            else:
+                sym.append('@label')
+                continue
+        # ports
+        elif a[:3] == 'p' + PREFIX:
+            sym.append('port_addr')
+            val = string_num(a[1:])
+            data = data + struct.pack('>B', val)
+            continue
+        # vectors
+        elif a[:3] == 'v' + PREFIX:
+            sym.append('vect8')
+            val = string_num(a[1:])
+            data = data + struct.pack('>B', val)
+            continue
+        # check if other values are negative and remove sign
         elif a[0] == '-':
             a = a[1:]
             is_neg = 1
         
+        # things that can be negative
         # immediate ints
         if (a[:3] == '#' + PREFIX):
             # 8 bit ints
@@ -298,6 +329,7 @@
                     val = string_num(a[1:])
                 # signed big-endian byte
                 data = data + struct.pack('>b', val)
+                continue
             # 16 bit ints
             elif len(a[3:]) <= 4:
                 sym.append('#data16')
@@ -307,45 +339,21 @@
                     val = string_num(a[1:])
                 # signed big-endian short
                 data = data + struct.pack('>h', val)
-        # addresses
-        elif (a[:2] == PREFIX):
-            # 8 bit addresses
-            if len(a[2:]) <= 2:
-                sym.append('rel8')
-                if is_neg:
-                    val = string_num('-' + a)
-                else:
-                    val = string_num(a)
-                # signed
-                data = data + struct.pack('>b', val)
-            # 16 bit addresses
-            elif len(a[2:]) <= 4:
-                sym.append('addr16')
+                continue
+        # 8 bit relative addresses
+        elif (a[:2] == PREFIX) and (len(a[2:]) <= 2):
+            sym.append('rel8')
+            if is_neg:
+                val = string_num('-' + a)
+            else:
                 val = string_num(a)
-                data = data + struct.pack('>H', val)
-        # pointers
-        elif a[0] == '@':
-            if a[:3] == '@' + PREFIX:
-                sym.append('@addr16')
-                val = string_num(a[1:])
-                data = data + struct.pack('>H', val)
-            # labeled pointers make for ugly code considering
-            # only two instructions can use them
-            else:
-                sym.append('@label')
-        # ports
-        elif a[:3] == 'p' + PREFIX:
-            sym.append('port_addr')
-            val = string_num(a[1:])
-            data = data + struct.pack('>B', val)
-        # vectors
-        elif a[:3] == 'v' + PREFIX:
-            sym.append('vect8')
-            val = string_num(a[1:])
-            data = data + struct.pack('>B', val)
+            # signed
+            data = data + struct.pack('>b', val)
+            continue
         # unknown strings are either labels or source code errors
         else:
             sym.append('label')
+            continue
     
     return tuple(sym), data
 
Binary file assembler/language.pyc has changed