changeset 23:2efb577ac2d7

finished?
author james <jb302@eecs.qmul.ac.uk>
date Tue, 25 Feb 2014 01:55:39 +0000
parents c988e43bf2b5
children 19cbcbde19af
files assembler/assembler.py assembler/language.py assembler/language.pyc tests/full.asm tests/full.bin
diffstat 5 files changed, 27 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/assembler/assembler.py	Mon Feb 24 18:59:47 2014 +0000
+++ b/assembler/assembler.py	Tue Feb 25 01:55:39 2014 +0000
@@ -55,26 +55,29 @@
                     e = i[-1]
                     i = i[:-1]
                 # replace and put removed characters back
-                for j in equ_index.keys():
-                    if i == j:
-                        statement[n] = t + equ_index[j] + e
+                if i in equ_index:
+                    statement[n] = t + equ_index[i] + e
+                # labels can be used in equates but they have
+                # to defined before they are used
+                elif i in label_index:
+                    statement[n] = t + num_string(label_index[i]) + e
                 n = n + 1                   
             
-            # deal with org on second pass
+            # deal with org
             if statement[0].lower() == 'org':
-                asm.append([statement[0], statement[1:], ('',), ''])
+                asm.append(['org', statement[1:], ('',), ''])
                 pc = string_num(statement[1])
                 continue
-
+            # if needed update index and remove label 
+            elif statement[0][-1] == ':':
+                label_index[statement[0][:-1]] = pc;
+                del statement[0]
+            
             # store equates
             # these are case sensative
             if (len(statement) >= 3) and (statement[1].lower() == 'equ'):
                 equ_index[statement[0]] = ' '.join(statement[2:])
                 continue
-            # if needed update index and remove label 
-            elif statement[0][-1] == ':':
-                label_index[statement[0][:-1]] = pc;
-                del statement[0]
                 
             if not statement:
                 continue
@@ -84,9 +87,11 @@
             arguments = ''.join(statement[1:]).split(',')
             
             # deal with db
-            if statement[0].lower() == 'db':
-                symbols, constants = tokenize(arguments)
-                asm.append([mnemonic, arguments, symbols, constants])
+            if mnemonic == 'db':
+                constants = ''
+                for a in arguments:
+                    constants = constants +  tokenize(['#' + a])[1]
+                asm.append([mnemonic, arguments, ('',), constants])
                 pc = pc + len(constants)
                 continue
             
@@ -119,11 +124,8 @@
                 pc = string_num(args[0])
                 continue
             elif mne == 'db':
-                data = ''
-                for a in args:
-                    data = data + tokenize(a)[1]
-                f.write(data)
-                pc = pc + len(data)
+                f.write(const)
+                pc = pc + len(const)
                 continue
             
             # replace labels with addresses
@@ -149,8 +151,7 @@
                         const = const + tokenize([args[i]])[1]
                     elif a not in label_index:
                         print '** label error **', line
-                        raise KeyError
-                        
+                        raise KeyError       
                 i = i + 1
             
             # assemble to file
--- a/assembler/language.py	Mon Feb 24 18:59:47 2014 +0000
+++ b/assembler/language.py	Tue Feb 25 01:55:39 2014 +0000
@@ -277,7 +277,7 @@
     sym = []
     data = ''
 
-    for a in args:   
+    for a in args:
         # tokenize reserved arguments immediatly (not case sensitive)
         # determine arg type and remove identifier if needed
         # unprefixed arguments are addresses so this is the default
Binary file assembler/language.pyc has changed
--- a/tests/full.asm	Mon Feb 24 18:59:47 2014 +0000
+++ b/tests/full.asm	Tue Feb 25 01:55:39 2014 +0000
@@ -1,5 +1,6 @@
-db 'ABCDEF', 0x0, (0x1 * 2)
-data8 EQU 0x42
+zero:
+db 'ABCDEF', 0x0, (0x1 * 2 + zero)
+data8 EQU (0x42 + zero)
 data16 EQU ((0x2BAB * 2) - data8 + 0x01 + data8)
 port_addr EQU $0x50
 vect8 EQU *0x56
@@ -20,7 +21,7 @@
 MOV SP, DPTR
 MOV A, #'B'
 MOV SP, #'WW'
-MOV DPTR, #data16
+MOV DPTR, #((0x2BAB * 2) - data8 + 0x01 + data8)
 MOV A, addr16
 MOV addr16, A
 MOV A, @A+DPTR
@@ -254,7 +255,7 @@
 INT vect8
 HLT
 
-org 0x0151
+ORG 0x0152
 rel8:
 addr16:
 NOP
Binary file tests/full.bin has changed