# HG changeset patch # User james # Date 1393293339 0 # Node ID 2efb577ac2d7939b054e6b4bbd239b67d38cfce8 # Parent c988e43bf2b536f723a3f51e3bd12b14a93f7634 finished? diff -r c988e43bf2b5 -r 2efb577ac2d7 assembler/assembler.py --- 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 diff -r c988e43bf2b5 -r 2efb577ac2d7 assembler/language.py --- 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 diff -r c988e43bf2b5 -r 2efb577ac2d7 assembler/language.pyc Binary file assembler/language.pyc has changed diff -r c988e43bf2b5 -r 2efb577ac2d7 tests/full.asm --- 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 diff -r c988e43bf2b5 -r 2efb577ac2d7 tests/full.bin Binary file tests/full.bin has changed