changeset 14:2b8eb2c86602

Major update to assembler design, now handles labels proper. Next step unit test Added boot procedure and experimental function look up table to emulator Started implementing operations tested SET and CLR operations with success
author james <jb302@eecs.qmul.ac.uk>
date Wed, 29 Jan 2014 20:11:07 +0000
parents 7a988d894f74
children 26044ed126fb
files assembler/README assembler/assembler.py assembler/assembler.pyc assembler/language.py assembler/language.pyc emulator/a.out emulator/emu.c emulator/iset.c emulator/iset.h emulator/mem.c emulator/mem.h emulator/test.c tests/label_test.asm tests/label_test.bin tests/mem.dump tests/test.asm tests/test.bin utils/gen_language.ipynb utils/instruction_set.txt utils/instruction_table.txt utils/iset.csv utils/iset.txt
diffstat 22 files changed, 1216 insertions(+), 1541 deletions(-) [+]
line wrap: on
line diff
--- a/assembler/README	Sat Jan 11 12:44:39 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,23 +0,0 @@
-version: 0.00001
-
-NOTES:
-
-language.py:
--The entire language is defined in language.iset
-
--language.tokenize() does not yet handle these data types:
-     - addr11
-     - port_addr
-     - vect8
-
--16 bit hex strings must be in the format '0xXXXX' or '0xXXX'
- or they will be interpreted an a 8 bit data type
-
-assembler.py:
-
-- first_pass() doesn't handle any directives apart from 'label:'
-- labels must be defined before they are referenced or second_pass() breaks
-- 16 bit address labels don't work unless the address is actually > 255
-  otherwise tokenize returns them as 'rel8' and the symbol doesn't match
-  anything in iset
-
--- a/assembler/assembler.py	Sat Jan 11 12:44:39 2014 +0000
+++ b/assembler/assembler.py	Wed Jan 29 20:11:07 2014 +0000
@@ -19,9 +19,12 @@
     source_code = filter(lambda l: l != '\n', f.readlines())
     
     asm = []
+    label_index = {}
+    pc = 0
+    
     # <line> ::= [<statement>] [";"<comment>] <EOL>
     for line in source_code:
-        
+
         # remove EOL
         line = line.strip()
         
@@ -42,15 +45,15 @@
         # skip empty statements
         if not statement: continue
         
-        # if needed update label tag and remove label 
+        # if needed update index and remove label 
         label = None
         if statement[0][-1:] == ':':
-            label = statement[0][:-1]
+            label_index[statement[0][:-1]] = pc;
             del statement[0]
             
         # return things that return False if empty
         if not statement:
-            asm.append(['', [], '', label])
+            asm.append(['', [], [], ''])
             continue
         
         # <statement> ::= <mnemonic> [<arguments>]
@@ -58,49 +61,44 @@
         arguments = ''.join(statement[1:]).split(',')
 
         symbols, constants = tokenize(arguments)
-        asm.append([mnemonic, symbols, constants, label])
+        width = iset[mnemonic][symbols][1]
+
+        asm.append([mnemonic, arguments, symbols, constants])
         
-    return asm
+        pc = pc + width
+    
+    return asm, label_index
 
 # take preprocessed asm and write machine code to binary file
-def second_pass(f, asm):
+def second_pass(f, asm, label_index):
     pc = 0
-    label_index = {}
+
+    for line in asm:
+        mne, args, sym, const = line
     
-    for line in asm:
-        mne, sym, const, label = line
-        
-        # if there is a label tag add label to index
-        if label:
-            label_index.update({label:pc})
         # skip instructionless lines
         if not mne: continue
 
         # replace labels with addresses
         i = 0
-        for s in sym:
-            if s in label_index:
-                sym[i] = num_string(label_index[s])
-                val = tokenize([sym[i]])[1]
+        for a in args:
+            if a in label_index:
+                args[i] = num_string(label_index[a])
+                val = tokenize([args[i]])[1]
                 const = const + val
             i = i + 1
-        # re-tokenize
-        sym = tokenize(sym)[0]
-        
-        # make symbols hashable
-        sym = tuple(sym)
         
         # assemble to file
+        # need to make sure 16 bit arguments are padded
         f.seek(pc)
         try:
-            f.write(struct.pack('>B', iset[mne][sym]))
+            f.write(struct.pack('>B', iset[mne][sym][0]))
             f.write(const)
         except:
             # will raise a symbol error when any unrecognised
             # mnemonic or argument format is found
             print 'syntax error: %s %s' % (mne, sym)
             return 'symbol_error'
-        
         pc = pc + len(const) + 1
         
     f.seek(0)    
@@ -109,8 +107,8 @@
 if __name__ == '__main__':
     f = open(sys.argv[1], 'r')
     b = open(sys.argv[2], 'wb')
-    asm = first_pass(f)
-    b = second_pass(b, asm)
+    asm, label_index = first_pass(f)
+    b = second_pass(b, asm, label_index)
     f.close()
     b.close()
 
Binary file assembler/assembler.pyc has changed
--- a/assembler/language.py	Sat Jan 11 12:44:39 2014 +0000
+++ b/assembler/language.py	Wed Jan 29 20:11:07 2014 +0000
@@ -12,243 +12,251 @@
 
 
 # valid arguments for this instruction set
-# not actually in use
-iargs = ('', 'addr11', 'addr16', 'sph', 'spl', '@dptr', 'ie', '@a+dptr', 
-         '@addr16', 'vect8', '#data8', 'port_addr', 'dptr', 'bs', '@a+pc', 
-         'a', 'c', 'rel8', 'r0', 'r1', 'r2', 'r3', '#data16', 'sp', 'flags', 
-         'dpl', 'dph')
+vargs = ('', '@a+dptr', 'dptr', 'bs', '@a+pc', 
+         'a', 'c','r0', 'r1', 'r2', 'r3', 'ie',
+         'sp', 'flags', 'dpl', 'dph')
 
 # dictionary embedded dictionaries?
 # for every mnemonic in the instruction set index
 # there is an index of possible argument formats ('symbol')
-# for that mnemonic and a corresponding op code
-iset =  {'add': {('a', '#data8'): 166,
-                 ('a', '@dptr'): 167,
-                 ('a', 'dph'): 164,
-                 ('a', 'dpl'): 165,
-                 ('a', 'r0'): 160,
-                 ('a', 'r1'): 161,
-                 ('a', 'r2'): 162,
-                 ('a', 'r3'): 163},
-         'addc': {('a', '#data8'): 174,
-                  ('a', '@dptr'): 175,
-                  ('a', 'dph'): 172,
-                  ('a', 'dpl'): 173,
-                  ('a', 'r0'): 168,
-                  ('a', 'r1'): 169,
-                  ('a', 'r2'): 170,
-                  ('a', 'r3'): 171},
-         'anl': {('a', '#data8'): 134,
-                 ('a', '@dptr'): 135,
-                 ('a', 'dph'): 132,
-                 ('a', 'dpl'): 133,
-                 ('a', 'r0'): 128,
-                 ('a', 'r1'): 129,
-                 ('a', 'r2'): 130,
-                 ('a', 'r3'): 131},
-         'cjne': {('a', '#data8', 'rel8'): 223,
-                  ('r0', '#data8', 'rel8'): 212,
-                  ('r1', '#data8', 'rel8'): 213,
-                  ('r2', '#data8', 'rel8'): 214,
-                  ('r3', '#data8', 'rel8'): 215},
-         'clr': {('bs',): 11, ('c',): 9, ('ie',): 13},
-         'cpl': {('a',): 15, ('c',): 14},
-         'da': {('a',): 250},
-         'dec': {('a',): 159, ('dptr',): 157},
-         'div': {('r0', 'r1'): 249},
-         'djnz': {('r0', 'rel8'): 208,
-                  ('r1', 'rel8'): 209,
-                  ('r2', 'rel8'): 210,
-                  ('r3', 'rel8'): 211},
-         'hlt': {('',): 255},
-         'in': {('a', 'port_addr'): 252},
-         'inc': {('a',): 158, ('dptr',): 156},
-         'int': {('vect8',): 254},
-         'jc': {('rel8',): 226},
-         'jmp': {('@a+dptr',): 221, ('@dptr',): 222},
-         'jnc': {('rel8',): 227},
-         'jns': {('rel8',): 231},
-         'jnz': {('rel8',): 225},
-         'jpe': {('rel8',): 229},
-         'jpo': {('rel8',): 228},
-         'js': {('rel8',): 230},
-         'jz': {('rel8',): 224},
-         'laf': {('',): 18},
-         'lcall': {('addr16',): 217},
-         'ljmp': {('addr16',): 216},
-         'mov': {('@addr16', 'a'): 29,
-                 ('@dptr', 'a'): 31,
-                 ('@dptr', 'dph'): 36,
-                 ('@dptr', 'dpl'): 37,
-                 ('@dptr', 'r0'): 32,
-                 ('@dptr', 'r1'): 33,
-                 ('@dptr', 'r2'): 34,
-                 ('@dptr', 'r3'): 35,
-                 ('@dptr', 'sph'): 38,
-                 ('@dptr', 'spl'): 39,
-                 ('a', '#data8'): 21,
-                 ('a', '@a+dptr'): 26,
-                 ('a', '@a+pc'): 27,
-                 ('a', '@addr16'): 28,
-                 ('a', '@dptr'): 30,
-                 ('a', 'addr16'): 24,
-                 ('a', 'dph'): 60,
-                 ('a', 'dpl'): 61,
-                 ('a', 'r0'): 56,
-                 ('a', 'r1'): 57,
-                 ('a', 'r2'): 58,
-                 ('a', 'r3'): 59,
-                 ('a', 'sph'): 62,
-                 ('a', 'spl'): 63,
-                 ('addr16', 'a'): 25,
-                 ('dph', '#data8'): 44,
-                 ('dph', '@dptr'): 100,
-                 ('dph', 'a'): 52,
-                 ('dph', 'dpl'): 101,
-                 ('dph', 'r0'): 96,
-                 ('dph', 'r1'): 97,
-                 ('dph', 'r2'): 98,
-                 ('dph', 'r3'): 99,
-                 ('dph', 'sph'): 102,
-                 ('dph', 'spl'): 103,
-                 ('dpl', '#data8'): 45,
-                 ('dpl', '@dptr'): 109,
-                 ('dpl', 'a'): 53,
-                 ('dpl', 'dph'): 108,
-                 ('dpl', 'r0'): 104,
-                 ('dpl', 'r1'): 105,
-                 ('dpl', 'r2'): 106,
-                 ('dpl', 'r3'): 107,
-                 ('dpl', 'sph'): 110,
-                 ('dpl', 'spl'): 111,
-                 ('dptr', '#data16'): 23,
-                 ('dptr', 'sp'): 19,
-                 ('r0', '#data8'): 40,
-                 ('r0', '@dptr'): 64,
-                 ('r0', 'a'): 48,
-                 ('r0', 'dph'): 68,
-                 ('r0', 'dpl'): 69,
-                 ('r0', 'r1'): 65,
-                 ('r0', 'r2'): 66,
-                 ('r0', 'r3'): 67,
-                 ('r0', 'sph'): 70,
-                 ('r0', 'spl'): 71,
-                 ('r1', '#data8'): 41,
-                 ('r1', '@dptr'): 73,
-                 ('r1', 'a'): 49,
-                 ('r1', 'dph'): 76,
-                 ('r1', 'dpl'): 77,
-                 ('r1', 'r0'): 72,
-                 ('r1', 'r2'): 74,
-                 ('r1', 'r3'): 75,
-                 ('r1', 'sph'): 78,
-                 ('r1', 'spl'): 79,
-                 ('r2', '#data8'): 42,
-                 ('r2', '@dptr'): 82,
-                 ('r2', 'a'): 50,
-                 ('r2', 'dph'): 84,
-                 ('r2', 'dpl'): 85,
-                 ('r2', 'r0'): 80,
-                 ('r2', 'r1'): 81,
-                 ('r2', 'r3'): 83,
-                 ('r2', 'sph'): 86,
-                 ('r2', 'spl'): 87,
-                 ('r3', '#data8'): 43,
-                 ('r3', '@dptr'): 91,
-                 ('r3', 'a'): 51,
-                 ('r3', 'dph'): 92,
-                 ('r3', 'dpl'): 93,
-                 ('r3', 'r0'): 88,
-                 ('r3', 'r1'): 89,
-                 ('r3', 'r2'): 90,
-                 ('r3', 'sph'): 94,
-                 ('r3', 'spl'): 95,
-                 ('sp', '#data16'): 22,
-                 ('sp', 'dptr'): 20,
-                 ('sph', '#data8'): 46,
-                 ('sph', '@dptr'): 118,
-                 ('sph', 'a'): 54,
-                 ('sph', 'dph'): 116,
-                 ('sph', 'dpl'): 117,
-                 ('sph', 'r0'): 112,
-                 ('sph', 'r1'): 113,
-                 ('sph', 'r2'): 114,
-                 ('sph', 'r3'): 115,
-                 ('sph', 'spl'): 119,
-                 ('spl', '#data8'): 47,
-                 ('spl', '@dptr'): 127,
-                 ('spl', 'a'): 55,
-                 ('spl', 'dph'): 124,
-                 ('spl', 'dpl'): 125,
-                 ('spl', 'r0'): 120,
-                 ('spl', 'r1'): 121,
-                 ('spl', 'r2'): 122,
-                 ('spl', 'r3'): 123,
-                 ('spl', 'sph'): 126},
-         'mul': {('r0', 'r1'): 248},
-         'nop': {('',): 0},
-         'orl': {('a', '#data8'): 142,
-                 ('a', '@dptr'): 143,
-                 ('a', 'dph'): 140,
-                 ('a', 'dpl'): 141,
-                 ('a', 'r0'): 136,
-                 ('a', 'r1'): 137,
-                 ('a', 'r2'): 138,
-                 ('a', 'r3'): 139},
-         'out': {('port_addr', 'a'): 253},
-         'pcall': {('addr11',): 207},
-         'pjmp': {('addr11',): 199},
-         'pop': {('a',): 246,
-                 ('dph',): 244,
-                 ('dpl',): 245,
-                 ('flags',): 247,
-                 ('r0',): 240,
-                 ('r1',): 241,
-                 ('r2',): 242,
-                 ('r3',): 243},
-         'push': {('a',): 238,
-                  ('dph',): 236,
-                  ('dpl',): 237,
-                  ('flags',): 239,
-                  ('r0',): 232,
-                  ('r1',): 233,
-                  ('r2',): 234,
-                  ('r3',): 235},
-         'reserved': {('',): 251},
-         'ret': {('',): 218},
-         'reti': {('',): 219},
-         'rl': {('a',): 152},
-         'rlc': {('a',): 153},
-         'rr': {('a',): 154},
-         'rrc': {('a',): 155},
-         'set': {('bs',): 10, ('c',): 8, ('ie',): 12},
-         'sfa': {('',): 17},
-         'sjmp': {('',): 220},
-         'sub': {('a', '#data8'): 182,
-                 ('a', '@dptr'): 183,
-                 ('a', 'dph'): 180,
-                 ('a', 'dpl'): 181,
-                 ('a', 'r0'): 176,
-                 ('a', 'r1'): 177,
-                 ('a', 'r2'): 178,
-                 ('a', 'r3'): 179},
-         'subb': {('a', '#data8'): 190,
-                  ('a', '@dptr'): 191,
-                  ('a', 'dph'): 188,
-                  ('a', 'dpl'): 189,
-                  ('a', 'r0'): 184,
-                  ('a', 'r1'): 185,
-                  ('a', 'r2'): 186,
-                  ('a', 'r3'): 187},
-         'xcsd': {('',): 16},
-         'xrl': {('a', '#data8'): 150,
-                 ('a', '@dptr'): 151,
-                 ('a', 'dph'): 148,
-                 ('a', 'dpl'): 149,
-                 ('a', 'r0'): 144,
-                 ('a', 'r1'): 145,
-                 ('a', 'r2'): 146,
-                 ('a', 'r3'): 147}}
+# for that mnemonic and a corresponding op code and it's length
+iset = { 'add': {    ('a', '#data8'): [166, 2],
+                     ('a', '@dptr'): [167, 1],
+                     ('a', 'dph'): [164, 1],
+                     ('a', 'dpl'): [165, 1],
+                     ('a', 'r0'): [160, 1],
+                     ('a', 'r1'): [161, 1],
+                     ('a', 'r2'): [162, 1],
+                     ('a', 'r3'): [163, 1]},
+         'addc': {    ('a', '#data8'): [174, 2],
+                      ('a', '@dptr'): [175, 1],
+                      ('a', 'dph'): [172, 1],
+                      ('a', 'dpl'): [173, 1],
+                      ('a', 'r0'): [168, 1],
+                      ('a', 'r1'): [169, 1],
+                      ('a', 'r2'): [170, 1],
+                      ('a', 'r3'): [171, 1]},
+         'anl': {    ('a', '#data8'): [134, 2],
+                     ('a', '@dptr'): [135, 1],
+                     ('a', 'dph'): [132, 1],
+                     ('a', 'dpl'): [133, 1],
+                     ('a', 'r0'): [128, 1],
+                     ('a', 'r1'): [129, 1],
+                     ('a', 'r2'): [130, 1],
+                     ('a', 'r3'): [131, 1]},
+         'cjne': {    ('a', '#data8', 'label'): [223, 3],
+                      ('a', '#data8', 'rel8'): [223, 3],
+                      ('r0', '#data', 'label'): [212, 2],
+                      ('r0', '#data', 'rel8'): [212, 2],
+                      ('r1', '#data', 'label'): [213, 2],
+                      ('r1', '#data', 'rel8'): [213, 2],
+                      ('r2', '#data', 'label'): [214, 2],
+                      ('r2', '#data', 'rel8'): [214, 2],
+                      ('r3', '#data', 'label'): [215, 2],
+                      ('r3', '#data', 'rel8'): [215, 2]},
+         'clr': {    ('bs',): [11, 1], ('c',): [9, 1], ('ie',): [13, 1]},
+         'cpl': {    ('a',): [15, 1], ('c',): [14, 1]},
+         'da': {    ('a',): [250, 1]},
+         'dec': {    ('a',): [159, 1], ('dptr',): [157, 1]},
+         'div': {    ('r0', 'r1'): [249, 1]},
+         'djnz': {    ('r0', 'label'): [208, 2],
+                      ('r0', 'rel8'): [208, 2],
+                      ('r1', 'label'): [209, 2],
+                      ('r1', 'rel8'): [209, 2],
+                      ('r2', 'label'): [210, 2],
+                      ('r2', 'rel8'): [210, 2],
+                      ('r3', 'label'): [211, 2],
+                      ('r3', 'rel8'): [211, 2]},
+         'hlt': {    ('',): [255, 1]},
+         'in': {    ('a', 'port_addr'): [252, 2]},
+         'inc': {    ('a',): [158, 1], ('dptr',): [156, 1]},
+         'int': {    ('vect8',): [254, 2]},
+         'jc': {    ('label',): [226, 2], ('rel8',): [226, 2]},
+         'jmp': {    ('@a+dptr',): [221, 1], ('@dptr',): [222, 1]},
+         'jnc': {    ('label',): [227, 2], ('rel8',): [227, 2]},
+         'jns': {    ('label',): [231, 2], ('rel8',): [231, 2]},
+         'jnz': {    ('label',): [225, 2], ('rel8',): [225, 2]},
+         'jpe': {    ('label',): [229, 2], ('rel8',): [229, 2]},
+         'jpo': {    ('label',): [228, 2], ('rel8',): [228, 2]},
+         'js': {    ('label',): [230, 2], ('rel8',): [230, 2]},
+         'jz': {    ('label',): [224, 2], ('rel8',): [224, 2]},
+         'laf': {    ('',): [18, 1]},
+         'lcall': {    ('addr16',): [217, 3], ('label',): [217, 3]},
+         'ljmp': {    ('addr16',): [216, 3], ('label',): [216, 3]},
+         'mov': {    ('@addr16', 'a'): [29, 3],
+                     ('@dptr', 'a'): [31, 1],
+                     ('@dptr', 'dph'): [36, 1],
+                     ('@dptr', 'dpl'): [37, 1],
+                     ('@dptr', 'r0'): [32, 1],
+                     ('@dptr', 'r1'): [33, 1],
+                     ('@dptr', 'r2'): [34, 1],
+                     ('@dptr', 'r3'): [35, 1],
+                     ('@dptr', 'sph'): [38, 1],
+                     ('@dptr', 'spl'): [39, 1],
+                     ('a', '#data8'): [21, 2],
+                     ('a', '@a+dptr'): [26, 1],
+                     ('a', '@a+pc'): [27, 1],
+                     ('a', '@addr16'): [28, 3],
+                     ('a', '@dptr'): [30, 1],
+                     ('a', 'addr16'): [24, 3],
+                     ('a', 'dph'): [60, 1],
+                     ('a', 'dpl'): [61, 1],
+                     ('a', 'label'): [24, 3],
+                     ('a', 'r0'): [56, 1],
+                     ('a', 'r1'): [57, 1],
+                     ('a', 'r2'): [58, 1],
+                     ('a', 'r3'): [59, 1],
+                     ('a', 'sph'): [62, 1],
+                     ('a', 'spl'): [63, 1],
+                     ('addr16', 'a'): [25, 3],
+                     ('dph', '#data8'): [44, 2],
+                     ('dph', '@dptr'): [100, 1],
+                     ('dph', 'a'): [52, 1],
+                     ('dph', 'dpl'): [101, 1],
+                     ('dph', 'r0'): [96, 1],
+                     ('dph', 'r1'): [97, 1],
+                     ('dph', 'r2'): [98, 1],
+                     ('dph', 'r3'): [99, 1],
+                     ('dph', 'sph'): [102, 1],
+                     ('dph', 'spl'): [103, 1],
+                     ('dpl', '#data8'): [45, 2],
+                     ('dpl', '@dptr'): [109, 1],
+                     ('dpl', 'a'): [53, 1],
+                     ('dpl', 'dph'): [108, 1],
+                     ('dpl', 'r0'): [104, 1],
+                     ('dpl', 'r1'): [105, 1],
+                     ('dpl', 'r2'): [106, 1],
+                     ('dpl', 'r3'): [107, 1],
+                     ('dpl', 'sph'): [110, 1],
+                     ('dpl', 'spl'): [111, 1],
+                     ('dptr', '#data16'): [23, 3],
+                     ('dptr', 'sp'): [19, 1],
+                     ('r0', '#data8'): [40, 2],
+                     ('r0', '@dptr'): [64, 1],
+                     ('r0', 'a'): [48, 1],
+                     ('r0', 'dph'): [68, 1],
+                     ('r0', 'dpl'): [69, 1],
+                     ('r0', 'r1'): [65, 1],
+                     ('r0', 'r2'): [66, 1],
+                     ('r0', 'r3'): [67, 1],
+                     ('r0', 'sph'): [70, 1],
+                     ('r0', 'spl'): [71, 1],
+                     ('r1', '#data8'): [41, 2],
+                     ('r1', '@dptr'): [73, 1],
+                     ('r1', 'a'): [49, 1],
+                     ('r1', 'dph'): [76, 1],
+                     ('r1', 'dpl'): [77, 1],
+                     ('r1', 'r0'): [72, 1],
+                     ('r1', 'r2'): [74, 1],
+                     ('r1', 'r3'): [75, 1],
+                     ('r1', 'sph'): [78, 1],
+                     ('r1', 'spl'): [79, 1],
+                     ('r2', '#data8'): [42, 2],
+                     ('r2', '@dptr'): [82, 1],
+                     ('r2', 'a'): [50, 1],
+                     ('r2', 'dph'): [84, 1],
+                     ('r2', 'dpl'): [85, 1],
+                     ('r2', 'r0'): [80, 1],
+                     ('r2', 'r1'): [81, 1],
+                     ('r2', 'r3'): [83, 1],
+                     ('r2', 'sph'): [86, 1],
+                     ('r2', 'spl'): [87, 1],
+                     ('r3', '#data8'): [43, 2],
+                     ('r3', '@dptr'): [91, 1],
+                     ('r3', 'a'): [51, 1],
+                     ('r3', 'dph'): [92, 1],
+                     ('r3', 'dpl'): [93, 1],
+                     ('r3', 'r0'): [88, 1],
+                     ('r3', 'r1'): [89, 1],
+                     ('r3', 'r2'): [90, 1],
+                     ('r3', 'sph'): [94, 1],
+                     ('r3', 'spl'): [95, 1],
+                     ('sp', '#data16'): [22, 3],
+                     ('sp', 'dptr'): [20, 1],
+                     ('sph', '#data8'): [46, 2],
+                     ('sph', '@dptr'): [118, 1],
+                     ('sph', 'a'): [54, 1],
+                     ('sph', 'dph'): [116, 1],
+                     ('sph', 'dpl'): [117, 1],
+                     ('sph', 'r0'): [112, 1],
+                     ('sph', 'r1'): [113, 1],
+                     ('sph', 'r2'): [114, 1],
+                     ('sph', 'r3'): [115, 1],
+                     ('sph', 'spl'): [119, 1],
+                     ('spl', '#data8'): [47, 2],
+                     ('spl', '@dptr'): [127, 1],
+                     ('spl', 'a'): [55, 1],
+                     ('spl', 'dph'): [124, 1],
+                     ('spl', 'dpl'): [125, 1],
+                     ('spl', 'r0'): [120, 1],
+                     ('spl', 'r1'): [121, 1],
+                     ('spl', 'r2'): [122, 1],
+                     ('spl', 'r3'): [123, 1],
+                     ('spl', 'sph'): [126, 1]},
+         'mul': {    ('r0', 'r1'): [248, 1]},
+         'nop': {    ('',): [0, 1]},
+         'orl': {    ('a', '#data8'): [142, 2],
+                     ('a', '@dptr'): [143, 1],
+                     ('a', 'dph'): [140, 1],
+                     ('a', 'dpl'): [141, 1],
+                     ('a', 'r0'): [136, 1],
+                     ('a', 'r1'): [137, 1],
+                     ('a', 'r2'): [138, 1],
+                     ('a', 'r3'): [139, 1]},
+         'out': {    ('port_addr', 'a'): [253, 2]},
+         'pcall': {    ('addr11',): [207, 2], ('label',): [207, 2]},
+         'pjmp': {    ('addr11',): [199, 2], ('label',): [199, 2]},
+         'pop': {    ('a',): [246, 1],
+                     ('dph',): [244, 1],
+                     ('dpl',): [245, 1],
+                     ('flags',): [247, 1],
+                     ('r0',): [240, 1],
+                     ('r1',): [241, 1],
+                     ('r2',): [242, 1],
+                     ('r3',): [243, 1]},
+         'push': {    ('a',): [238, 1],
+                      ('dph',): [236, 1],
+                      ('dpl',): [237, 1],
+                      ('flags',): [239, 1],
+                      ('r0',): [232, 1],
+                      ('r1',): [233, 1],
+                      ('r2',): [234, 1],
+                      ('r3',): [235, 1]},
+         'reserved': {    ('',): [251, 1]},
+         'ret': {    ('',): [218, 1]},
+         'reti': {    ('',): [219, 1]},
+         'rl': {    ('a',): [152, 1]},
+         'rlc': {    ('a',): [153, 1]},
+         'rr': {    ('a',): [154, 1]},
+         'rrc': {    ('a',): [155, 1]},
+         'set': {    ('bs',): [10, 1], ('c',): [8, 1], ('ie',): [12, 1]},
+         'sfa': {    ('',): [17, 1]},
+         'sjmp': {    ('label',): [220, 2], ('rel8',): [220, 2]},
+         'sub': {    ('a', '#data8'): [182, 2],
+                     ('a', '@dptr'): [183, 1],
+                     ('a', 'dph'): [180, 1],
+                     ('a', 'dpl'): [181, 1],
+                     ('a', 'r0'): [176, 1],
+                     ('a', 'r1'): [177, 1],
+                     ('a', 'r2'): [178, 1],
+                     ('a', 'r3'): [179, 1]},
+         'subb': {    ('a', '#data8'): [190, 2],
+                      ('a', '@dptr'): [191, 1],
+                      ('a', 'dph'): [188, 1],
+                      ('a', 'dpl'): [189, 1],
+                      ('a', 'r0'): [184, 1],
+                      ('a', 'r1'): [185, 1],
+                      ('a', 'r2'): [186, 1],
+                      ('a', 'r3'): [187, 1]},
+         'xcsd': {    ('',): [16, 1]},
+         'xrl': {    ('a', '#data8'): [150, 2],
+                     ('a', '@dptr'): [151, 1],
+                     ('a', 'dph'): [148, 1],
+                     ('a', 'dpl'): [149, 1],
+                     ('a', 'r0'): [144, 1],
+                     ('a', 'r1'): [145, 1],
+                     ('a', 'r2'): [146, 1],
+                     ('a', 'r3'): [147, 1]}}
 
 # take a list of arguments
 # identify constant data:
@@ -259,7 +267,7 @@
     data = ''
     
     for a in args:   
-        
+
         # immediate ints
         if a[:3] == '#' + PREFIX:
             # 8 bit ints
@@ -303,10 +311,15 @@
             sym.append('@addr16')
             val = int(a[1:], BASE)
             data = data + struct.pack('>H', val)
-                
-        # return unknown symbols so language can be extended more easily
+
+        elif a in vargs:
+            sym.append(a)
+
+        # return unknown stings are either labels or source code errors
         else:
-            sym.append(a)
+            sym.append('label')
         
-    return sym, data
 
+
+    return tuple(sym), data
+
Binary file assembler/language.pyc has changed
Binary file emulator/a.out has changed
--- a/emulator/emu.c	Sat Jan 11 12:44:39 2014 +0000
+++ b/emulator/emu.c	Wed Jan 29 20:11:07 2014 +0000
@@ -1,12 +1,46 @@
 /* emu.c
- * emulation start up and fetch/decode/execute loop */
+ * ema00ulation start up and fetch/decode/execute loop */
+#include <stdio.h>
 #include <string.h>
 #include "mem.h"
 #include "iset.h"
 
 /* instruction table */
-void (*iset[2])(void) = { NOP,
-                          FOO };
+void (*iset[256])(void) = {
+    NOP, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED, RESERVED,
+    SET, CLR, SET, CLR, SET, CLR, CPL, CPL,
+    XCSD, SFA, LAF, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    MOV, MOV, MOV, MOV, MOV, MOV, MOV, MOV,
+    ANL, ANL, ANL, ANL, ANL, ANL, ANL, ANL,
+    ORL, ORL, ORL, ORL, ORL, ORL, ORL, ORL,
+    XRL, XRL, XRL, XRL, XRL, XRL, XRL, XRL,
+    RL, RLC, RR, RRC, INC, DEC, INC, DEC,
+    ADD, ADD, ADD, ADD, ADD, ADD, ADD, ADD,
+    ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC, ADDC,
+    SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB,
+    SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB, SUBB,
+    PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP, PJMP,
+    PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL, PCALL,
+    DJNZ, DJNZ, DJNZ, DJNZ, CJNE, CJNE, CJNE, CJNE,
+    LJMP, LCALL, RET, RETI, SJMP, JMP, JMP, CJNE,
+    JZ, JNZ, JC, JNC, JPO, JPE, JS, JNS,
+    PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH, PUSH,
+    POP, POP, POP, POP, POP, POP, POP, POP,
+    MUL, DIV, DA, RESERVED, IN, OUT, INT, HLT
+};
+
 
 void
 boot(void) {
@@ -14,20 +48,33 @@
     memset(&registers, 0, sizeof(registers));
     memset(&memory, 0, sizeof(memory));
 
-    /* hack hack hack */
-    BYTE program[] = { 0x00,
-                       0x01};
-    memcpy(&memory, program, sizeof(program));
+    /* load program from stdin
+     * c must be signed since EOF is -1 on linux */
+    WIDE i = 0;
+    BYTE c = getchar();
+    for(i ; i < 0x10000 ; i++) {
+        /* add HLT if EOF is reached */
+        if ((signed char) c == EOF) { 
+            memory[i] = 0xFF;
+            break; 
+        }
+        memory[i] = c;
+        c = getchar();
+    }
 }
 
-void
+void 
+step(void) {
+    op = fetch();
+    (*iset[op])();
+}
+
+void 
 main(void) {
     boot();
-    BYTE op;
-    int i = 0;
-    for (i ; i < 3 ; i++) {
-        op = fetch();
-        (*iset[op])();
+    for (;;) { 
+        step();
+        putchar(registers.flags);
     }
-    dump_all();
 }
+
--- a/emulator/iset.c	Sat Jan 11 12:44:39 2014 +0000
+++ b/emulator/iset.c	Wed Jan 29 20:11:07 2014 +0000
@@ -1,15 +1,326 @@
 /* iset.c
  * op functions */
+#include <stdlib.h>
+#include <stdio.h> // debug
 #include "iset.h"
 #include "mem.h"
 
+//implement me
+void
+JNS(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+LJMP(void) {
+    registers.PC = registers.PC + 1;
+}
+
+/*
+ * 0x08 - SET C
+ * 0x0A - SET BS
+ * 0x0c - SET IE */
+void
+SET(void) {
+    switch (op) {
+        case 0x08:
+            registers.flags = registers.flags | 0x80;
+            break;
+        case 0x0A:
+            registers.flags = registers.flags | 0x01;
+            break;
+        case 0x0C:
+            registers.flags = registers.flags | 0x02;
+            break;
+    }
+    registers.PC = registers.PC + 1;
+}
+
+void
+RESERVED(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JPO(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+ANL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JNZ(void) {
+    registers.PC = registers.PC + 1;
+}
+
+/* 0xFF - HLT */
+void
+HLT(void) {
+    exit(0);
+}
+
+//implement me
+void
+RRC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+POP(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JNC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+SUBB(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+PCALL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+IN(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+INC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+XRL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+SUB(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+RR(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+SJMP(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+RETI(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+RET(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+INT(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+ADD(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+ADDC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+RL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+MUL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JMP(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+DJNZ(void) {
+    registers.PC = registers.PC + 1;
+}
+
+/* 0x09 - CLR C
+ * 0x0B - CLR BS
+ * 0x0D - CLR IE */
+void
+CLR(void) {
+    switch (op) {
+        case 0x09:
+            registers.flags = registers.flags ^ 0x80;
+            break;
+        case 0x0B:
+            registers.flags = registers.flags ^ 0x01;
+            break;
+        case 0x0D:
+            registers.flags = registers.flags ^ 0x02;
+            break;
+    }
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JZ(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JPE(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+LAF(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+MOV(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+RLC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+JS(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+ORL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+CJNE(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+XCSD(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+LCALL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+DA(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
 void
 NOP(void) {
     registers.PC = registers.PC + 1;
 }
 
+//implement me
 void
-FOO(void) {
-    set_A(0x41);
+SFA(void) {
     registers.PC = registers.PC + 1;
 }
+
+//implement me
+void
+CPL(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+PUSH(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+DIV(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+DEC(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+OUT(void) {
+    registers.PC = registers.PC + 1;
+}
+
+//implement me
+void
+PJMP(void) {
+    registers.PC = registers.PC + 1;
+}
--- a/emulator/iset.h	Sat Jan 11 12:44:39 2014 +0000
+++ b/emulator/iset.h	Wed Jan 29 20:11:07 2014 +0000
@@ -2,12 +2,153 @@
  * op function definitions */
 #ifndef ISET_H
 #define ISET_H
+ 
+void
+JNS(void);
 
-void 
+void
+LJMP(void);
+
+void
+SET(void);
+
+void
+RESERVED(void);
+
+void
+JPO(void);
+
+void
+ANL(void);
+
+void
+JNZ(void);
+
+void
+HLT(void);
+
+void
+RRC(void);
+
+void
+POP(void);
+
+void
+JNC(void);
+
+void
+SUBB(void);
+
+void
+PCALL(void);
+
+void
+IN(void);
+
+void
+INC(void);
+
+void
+XRL(void);
+
+void
+SUB(void);
+
+void
+RR(void);
+
+void
+SJMP(void);
+
+void
+RETI(void);
+
+void
+RET(void);
+
+void
+INT(void);
+
+void
+ADD(void);
+
+void
+ADDC(void);
+
+void
+RL(void);
+
+void
+MUL(void);
+
+void
+JC(void);
+
+void
+JMP(void);
+
+void
+DJNZ(void);
+
+void
+CLR(void);
+
+void
+JZ(void);
+
+void
+JPE(void);
+
+void
+LAF(void);
+
+void
+MOV(void);
+
+void
+RLC(void);
+
+void
+JS(void);
+
+void
+ORL(void);
+
+void
+CJNE(void);
+
+void
+XCSD(void);
+
+void
+LCALL(void);
+
+void
+DA(void);
+
+void
 NOP(void);
 
 void
-FOO(void);
+SFA(void);
+
+void
+CPL(void);
+
+void
+PUSH(void);
+
+void
+DIV(void);
+
+void
+DEC(void);
+
+void
+OUT(void);
+
+void
+PJMP(void);
 
 #endif
 
--- a/emulator/mem.c	Sat Jan 11 12:44:39 2014 +0000
+++ b/emulator/mem.c	Wed Jan 29 20:11:07 2014 +0000
@@ -3,6 +3,11 @@
 #include "mem.h"
 
 BYTE
+fetch(void) {
+    return memory[registers.PC];
+}
+
+BYTE
 read_mem(WIDE addr) {
     return memory[addr];
 }
@@ -13,21 +18,6 @@
 }
 
 BYTE
-fetch(void) {
-    return memory[registers.PC];
-}
-
-void
-set_PC(WIDE data) {
-    registers.PC = data;
-}
-
-WIDE
-get_PC(void) {
-    return registers.PC;
-}
-
-BYTE
 get_R(BYTE reg, _Bool bank) {
     switch(bank) {
         case 0:
@@ -47,68 +37,6 @@
     }
 }
 
-BYTE
-get_A(void) {
-    return registers.A;
-}
-
-void
-set_A(BYTE data) {
-    registers.A = data;
-}
-
-BYTE
-get_DPH(void) {
-    return registers.DPH;
-}
-
-void
-set_DPH(BYTE data) {
-    registers.DPH = data;
-
-}
-
-BYTE
-get_DPL(void) {
-    return registers.DPL;
-}   
-
-void
-set_DPL(BYTE data) {
-    registers.DPL = data;
-}
-
-BYTE
-get_SPH(void) {
-    return registers.SPH;
-}
-
-void
-set_SPH(BYTE data) {
-    registers.SPH = data;
-}
-
-BYTE
-get_SPL(void) {
-    return registers.SPL;
-}
-
-void
-set_SPL(BYTE data) {
-    registers.SPL = data;
-}
-
-BYTE
-get_flags(void) {
-    return registers.flags;
-}
-
-void
-set_flags(BYTE data) {
-    registers.flags = data;
-}
-
-
 WIDE
 get_DPTR(void) {
     return (((WIDE)registers.DPH) << 8) | registers.DPL;
--- a/emulator/mem.h	Sat Jan 11 12:44:39 2014 +0000
+++ b/emulator/mem.h	Wed Jan 29 20:11:07 2014 +0000
@@ -9,6 +9,9 @@
 typedef unsigned char BYTE;
 typedef unsigned short WIDE;
 
+/* current opcode */
+BYTE op;
+
 /* emulator memory
  *  - registers
  *  - 64kB 16-bit main memory */
@@ -28,6 +31,9 @@
      *   bank 1: R[0x03 - 0x06] */ 
     BYTE R[0x06];
     BYTE A;
+
+    /* 7 6 5  4 3 2  1 0
+     * C Z AC P S OV IE BS */
     BYTE flags;
     
 } registers;
@@ -39,22 +45,8 @@
  *  - fetch() returns BYTE
  *  - read_mem(WIDE) returns BYTE
  *  - write_mem(WIDE, BYTE)
- *  - set_PC(WIDE)
- *  - get_PC() returns WIDE
  *  - get_R(BYTE, BOOL) returns BYTE
  *  - set_R(BYTE, BOOL, BYTE)
- *  - get_A() returns BYTE
- *  - set_A(BYTE)
- *  - get_DPH() returns BYTE
- *  - set_DPH(BYTE)
- *  - get DPL() returns BYTE
- *  - set_DPL(BYTE)
- *  - get_SPH() returns BYTE
- *  - set_SPH(BYTE)
- *  - get_SPL() returns BYTE
- *  - set_SPL(BYTE)
- *  - get_flags() returns BYTE
- *  - set_flags(BYTE)
  *  - get_DPTR() returns WIDE
  *  - set_DPTR(WIDE)
  *  - get_SP() returns WIDE
@@ -69,54 +61,12 @@
 void
 write_mem(WIDE addr, BYTE data);
 
-WIDE
-get_PC(void);
-
-void
-set_PC(WIDE data);
-
 BYTE
 get_R(BYTE reg, _Bool bank);
 
 void
 set_R(BYTE reg, _Bool bank, BYTE data);
 
-BYTE
-get_A(void);
-
-void
-set_A(BYTE data);
-
-BYTE
-get_DPH(void);
-
-void
-set_DPH(BYTE data);
-
-BYTE
-get_DPL(void);
-
-void
-set_DPL(BYTE data);
-
-BYTE
-get_SPH(void);
-
-void
-set_SPH(BYTE data);
-
-BYTE
-get_SPL(void);
-
-void
-set_SPL(BYTE data);
-
-BYTE
-get_flags(void);
-
-void
-set_flags(BYTE data);
-
 WIDE
 get_DPTR(void);
 
--- a/emulator/test.c	Sat Jan 11 12:44:39 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,60 +0,0 @@
-/* test.c
- * because we need to test things
- */
-#include <stdio.h>
-
-void 
-dump_all(void) {
-    int i;
-    
-    /* dump reg bank 0 */
-    for (i = 0 ; i < 3 ; i++) {
-        printf("%c", get_R(i, 0x0));
-    }
-    /* dump reg bank 1 */
-    for (i = 0 ; i < 3 ; i++) {
-        printf("%c", get_R(i, 0x1));
-    } 
-    /* dump other registers */
-    printf("%c", get_A());
-    printf("%C", get_flags());
-    printf("%c", get_DPH());
-    printf("%c", get_DPL());
-    printf("%c", get_SPH());
-    printf("%c", get_SPL());
-    
-    /* dump main memory */
-    for (i = 0 ; i < 0x10000 ; i++) {
-        printf("%c", read_mem(i));
-    }
-}
-
-void
-test_pattern(void) {
-    int i;
-    /* fill mem with M's */
-    for (i = 0 ; i < 0x10000 ; i++) {
-        write_mem(i, 0x4D);
-    }
-    /* fill reg bank 1 with R's */
-    for (i = 0 ; i < 3 ; i++) {
-        set_R(i, 0, 0x52);
-    }
-    /* fill reg bank 2 with R's */
-    for (i = 0 ; i < 3 ; i++) {
-        set_R(i, 1, 0x52);
-    }
-    /* A */
-    set_A(0x41);
-    /* F */
-    set_flags(0x46);
-    /* DP */
-    set_DPTR(0x4450);
-    /* SP */
-    set_SP(0x5350);
-    //set_DPH(0x44);
-    //set_DPL(0x50);
-    //set_SPH(0x53);
-    //set_SPL(0x50);
-}
-
--- a/tests/label_test.asm	Sat Jan 11 12:44:39 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10 +0,0 @@
-; label test
-label_1: MOV A, #0xFF       ; 0: 0x15 0xFF
-label_2: JNZ label_2        ; 2: 0xE1 0x02
-label_4:                    ; 4:
-label_3: JC label_4         ; 4: 0xE2 0x04     
-MOV A, @0xF00F              ; 6: 0x1C 0xFO 0x0F
-JNZ label_1                 ; 9: 0xE1 0x00 
-JNZ label_3                 ; 0B: 0xE1 0x04
-CJNE R0, #0xFF, label_2     ; 0D: 0xD4 0xFF 0x02
-
Binary file tests/label_test.bin has changed
Binary file tests/mem.dump has changed
--- a/tests/test.asm	Sat Jan 11 12:44:39 2014 +0000
+++ b/tests/test.asm	Wed Jan 29 20:11:07 2014 +0000
@@ -1,258 +1,7 @@
-; unit test asm
-NOP
-reserved
-reserved
-reserved
-reserved
-reserved
-reserved
-reserved
 SET C
 CLR C
 SET BS
 CLR BS
 SET IE
 CLR IE
-CPL C
-CPL A
-XCSD
-SFA
-LAF
-MOV DPTR, SP
-MOV SP, DPTR
-MOV A, #0xF0
-MOV SP, #0xF000
-MOV DPTR, #0xF000
-MOV A, 0x000F
-MOV 0x000F, A
-MOV A, @A+DPTR
-MOV A, @A+PC
-MOV A, @0x000F
-MOV @0x000F, A
-MOV A, @DPTR
-MOV @DPTR, A
-MOV @DPTR, R0
-MOV @DPTR, R1
-MOV @DPTR, R2
-MOV @DPTR, R3
-MOV @DPTR, DPH
-MOV @DPTR, DPL
-MOV @DPTR, SPH
-MOV @DPTR, SPL
-MOV R0, #0xF0
-MOV R1, #0xF0
-MOV R2, #0xF0
-MOV R3, #0xF0
-MOV DPH, #0xF0
-MOV DPL, #0xF0
-MOV SPH, #0xF0
-MOV SPL, #0xF0
-MOV R0, A
-MOV R1, A
-MOV R2, A
-MOV R3, A
-MOV DPH, A
-MOV DPL, A
-MOV SPH, A
-MOV SPL, A
-MOV A, R0
-MOV A, R1
-MOV A, R2
-MOV A, R3
-MOV A, DPH
-MOV A, DPL
-MOV A, SPH
-MOV A, SPL
-MOV R0, @DPTR
-MOV R0, R1
-MOV R0, R2
-MOV R0, R3
-MOV R0, DPH
-MOV R0, DPL
-MOV R0, SPH
-MOV R0, SPL
-MOV R1, R0
-MOV R1, @DPTR
-MOV R1, R2
-MOV R1, R3
-MOV R1, DPH
-MOV R1, DPL
-MOV R1, SPH
-MOV R1, SPL
-MOV R2, R0
-MOV R2, R1
-MOV R2, @DPTR
-MOV R2, R3
-MOV R2, DPH
-MOV R2, DPL
-MOV R2, SPH
-MOV R2, SPL
-MOV R3, R0
-MOV R3, R1
-MOV R3, R2
-MOV R3, @DPTR
-MOV R3, DPH
-MOV R3, DPL
-MOV R3, SPH
-MOV R3, SPL
-MOV DPH, R0
-MOV DPH, R1
-MOV DPH, R2
-MOV DPH, R3
-MOV DPH, @DPTR
-MOV DPH, DPL
-MOV DPH, SPH
-MOV DPH, SPL
-MOV DPL, R0
-MOV DPL, R1
-MOV DPL, R2
-MOV DPL, R3
-MOV DPL, DPH
-MOV DPL, @DPTR
-MOV DPL, SPH
-MOV DPL, SPL
-MOV SPH, R0
-MOV SPH, R1
-MOV SPH, R2
-MOV SPH, R3
-MOV SPH, DPH
-MOV SPH, DPL
-MOV SPH, @DPTR
-MOV SPH, SPL
-MOV SPL, R0
-MOV SPL, R1
-MOV SPL, R2
-MOV SPL, R3
-MOV SPL, DPH
-MOV SPL, DPL
-MOV SPL, SPH
-MOV SPL, @DPTR
-ANL A, R0
-ANL A, R1
-ANL A, R2
-ANL A, R3
-ANL A, DPH
-ANL A, DPL
-ANL A, #0xF0
-ANL A, @DPTR
-ORL A, R0
-ORL A, R1
-ORL A, R2
-ORL A, R3
-ORL A, DPH
-ORL A, DPL
-ORL A, #0xF0
-ORL A, @DPTR
-XRL A, R0
-XRL A, R1
-XRL A, R2
-XRL A, R3
-XRL A, DPH
-XRL A, DPL
-XRL A, #0xF0
-XRL A, @DPTR
-RL A
-RLC A
-RR A
-RRC A
-INC DPTR
-DEC DPTR
-INC A
-DEC A
-ADD A, R0
-ADD A, R1
-ADD A, R2
-ADD A, R3
-ADD A, DPH
-ADD A, DPL
-ADD A, #0xF0
-ADD A, @DPTR
-ADDC A, R0
-ADDC A, R1
-ADDC A, R2
-ADDC A, R3
-ADDC A, DPH
-ADDC A, DPL
-ADDC A, #0xF0
-ADDC A, @DPTR
-SUB A, R0
-SUB A, R1
-SUB A, R2
-SUB A, R3
-SUB A, DPH
-SUB A, DPL
-SUB A, #0xF0
-SUB A, @DPTR
-SUBB A, R0
-SUBB A, R1
-SUBB A, R2
-SUBB A, R3
-SUBB A, DPH
-SUBB A, DPL
-SUBB A, #0xF0
-SUBB A, @DPTR
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-DJNZ R0, 0x0F
-DJNZ R1, 0x0F
-DJNZ R2, 0x0F
-DJNZ R3, 0x0F
-CJNE R0, #0xF0, 0x0F
-CJNE R1, #0xF0, 0x0F
-CJNE R2, #0xF0, 0x0F
-CJNE R3, #0xF0, 0x0F
-LJMP 0x000F
-LCALL 0x000F
-RET
-RETI
-SJMP
-JMP @A+DPTR
-JMP @DPTR
-CJNE A, #0xF0, 0x0F
-JZ 0x0F
-JNZ 0x0F
-JC 0x0F
-JNC 0x0F
-JPO 0x0F
-JPE 0x0F
-JS 0x0F
-JNS 0x0F
-PUSH R0
-PUSH R1
-PUSH R2
-PUSH R3
-PUSH DPH
-PUSH DPL
-PUSH A
-reserved ;PUSH FLAGS
-POP R0
-POP R1
-POP R2
-POP R3
-POP DPH
-POP DPL
-POP A
-reserved ;POP FLAGS
-MUL R0, R1
-DIV R0, R1
-DA A
-reserved
-reserved ;IN A, port_addr
-reserved ;OUT port_addr, A
-reserved ;INT vect8
 HLT
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/test.bin	Wed Jan 29 20:11:07 2014 +0000
@@ -0,0 +1,2 @@
+	
+
ÿ
\ No newline at end of file
--- a/utils/gen_language.ipynb	Sat Jan 11 12:44:39 2014 +0000
+++ b/utils/gen_language.ipynb	Wed Jan 29 20:11:07 2014 +0000
@@ -15,25 +15,32 @@
       "import sys\n",
       "sys.path.append('../assembler')\n",
       "from assembler import *\n",
-      "f = open('instruction_set.txt', 'r')\n",
-      "lang = first_pass(f)\n",
+      "f = open('iset.csv', 'r')\n",
       "\n",
-      "r = open('instruction_table.txt', 'r')\n",
-      "r = filter(lambda l: l != '\\n', r.readlines())\n",
       "codes = []\n",
-      "for line in r:\n",
-      "    codes.append(line.split()[0])\n",
-      "    "
+      "lang = []\n",
+      "for line in f:\n",
+      "    line = line.split(';')\n",
+      "    codes.append(int(line[0]))\n",
+      "    statement = line[1].strip().lower().split()\n",
+      "    mnemonic = statement[0]\n",
+      "    arguments = ''.join(statement[1:]).split(',')\n",
+      "    lang.append([mnemonic, arguments])\n",
+      "    \n",
+      "#pprint(lang) \n"
      ],
      "language": "python",
      "metadata": {},
      "outputs": [],
-     "prompt_number": 2
+     "prompt_number": 1
     },
     {
      "cell_type": "code",
      "collapsed": false,
      "input": [
+      "consts = { 'addr11':1, 'addr16':2, '@addr16':2, 'vect8':1, '#data8':1, 'port_addr':1, 'rel8':1, '#data16':2}\n",
+      "labelable = ('addr11', 'addr16', 'rel8')\n",
+      "\n",
       "mne_syms = []\n",
       "arg_syms = []\n",
       "for line in lang:\n",
@@ -47,14 +54,151 @@
       "    i = 0\n",
       "    valid_args = {}\n",
       "    for line in lang:\n",
+      "        args = []\n",
       "        if line[0] == mne:\n",
-      "            valid_args.update({tuple(line[1]):int(codes[i])})\n",
+      "            width = 1\n",
+      "            for a in line[1]:\n",
+      "                if a in consts:\n",
+      "                    width = width + consts[a]\n",
+      "            valid_args.update({tuple(line[1]):[int(codes[i]), width]})\n",
+      "            \n",
+      "            for a in line[1]:\n",
+      "                found_label = 0\n",
+      "                if a in labelable:\n",
+      "                    found_label = 1\n",
+      "                    args.append('label')\n",
+      "                else:\n",
+      "                    args.append(a)\n",
+      "            if found_label:\n",
+      "                valid_args.update({tuple(args):[int(codes[i]), width]})\n",
+      "            \n",
       "        i = i + 1\n",
       "    iset.update({mne:valid_args})\n",
-      "pprint(iset)\n"
+      "#pprint(iset, indent=5)\n"
      ],
      "language": "python",
      "metadata": {},
+     "outputs": [],
+     "prompt_number": 2
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "# generate function lookup table\n",
+      "optable = []\n",
+      "for l in lang:\n",
+      "    optable.append(l[0])\n",
+      "\n",
+      "for i in range(17):\n",
+      "    print \"%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, \" % (optable[(i*15)], optable[(i*15)+1], optable[(i*15)+2], optable[(i*15)+3], optable[(i*15)+4], optable[(i*15)+5], optable[(i*15)+6], optable[(i*15)+7], optable[(i*15)+8], optable[(i*15)+9], optable[(i*15)+10], optable[(i*15)+11], optable[(i*15)+12], optable[(i*15)+13], optable[(i*15)+14])\n",
+      "\n"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "stream",
+       "stream": "stdout",
+       "text": [
+        "nop, reserved, reserved, reserved, reserved\n",
+        "reserved, reserved, reserved, set, clr\n",
+        "set, clr, set, clr, cpl\n",
+        "cpl, xcsd, sfa, laf, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, mov, mov\n",
+        "mov, mov, mov, anl, anl\n",
+        "anl, anl, anl, anl, anl\n",
+        "anl, orl, orl, orl, orl\n",
+        "orl, orl, orl, orl, xrl\n",
+        "xrl, xrl, xrl, xrl, xrl\n",
+        "xrl, xrl, rl, rlc, rr\n",
+        "rrc, inc, dec, inc, dec\n",
+        "add, add, add, add, add\n",
+        "add, add, add, addc, addc\n",
+        "addc, addc, addc, addc, addc\n",
+        "addc, sub, sub, sub, sub\n",
+        "sub, sub, sub, sub, subb\n",
+        "subb, subb, subb, subb, subb\n",
+        "subb, subb, pjmp, pjmp, pjmp\n",
+        "pjmp, pjmp, pjmp, pjmp, pjmp\n",
+        "pcall, pcall, pcall, pcall, pcall\n",
+        "pcall, pcall, pcall, djnz, djnz\n",
+        "djnz, djnz, cjne, cjne, cjne\n",
+        "cjne, ljmp, lcall, ret, reti\n",
+        "sjmp, jmp, jmp, cjne, jz\n",
+        "jnz, jc, jnc, jpo, jpe\n",
+        "js, jns, push, push, push\n",
+        "push, push, push, push, push\n",
+        "pop, pop, pop, pop, pop\n",
+        "pop, pop, pop, mul, div\n",
+        "da, reserved, in, out, int\n"
+       ]
+      }
+     ],
+     "prompt_number": 3
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "# print function templates\n",
+      "#for mne in mne_set:\n",
+      "#    print \"//implement me\\nvoid\\n%s(void) {\\n    registers.PC = registers.PC + 1;\\n}\\n\" % mne.upper()\n",
+      "\n",
+      "# print function definitions\n",
+      "#for mne in mne_set:\n",
+      "#    print \"void\\n%s(void);\\n\" % mne.upper()\n"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [],
+     "prompt_number": 2
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [
+      "float(255)/15\n"
+     ],
+     "language": "python",
+     "metadata": {},
+     "outputs": [
+      {
+       "output_type": "pyout",
+       "prompt_number": 13,
+       "text": [
+        "17.0"
+       ]
+      }
+     ],
+     "prompt_number": 13
+    },
+    {
+     "cell_type": "code",
+     "collapsed": false,
+     "input": [],
+     "language": "python",
+     "metadata": {},
      "outputs": []
     }
    ],
--- a/utils/instruction_set.txt	Sat Jan 11 12:44:39 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-NOP
-reserved
-reserved
-reserved
-reserved
-reserved
-reserved
-reserved
-SET C
-CLR C
-SET BS
-CLR BS
-SET IE
-CLR IE
-CPL C
-CPL A
-XCSD
-SFA
-LAF
-MOV DPTR, SP
-MOV SP, DPTR
-MOV A, #data8
-MOV SP, #data16
-MOV DPTR, #data16
-MOV A, addr16
-MOV addr16, A
-MOV A, @A+DPTR
-MOV A, @A+PC
-MOV A, @addr16
-MOV @addr16, A
-MOV A, @DPTR
-MOV @DPTR, A
-MOV @DPTR, R0
-MOV @DPTR, R1
-MOV @DPTR, R2
-MOV @DPTR, R3
-MOV @DPTR, DPH
-MOV @DPTR, DPL
-MOV @DPTR, SPH
-MOV @DPTR, SPL
-MOV R0, #data8
-MOV R1, #data8
-MOV R2, #data8
-MOV R3, #data8
-MOV DPH, #data8
-MOV DPL, #data8
-MOV SPH, #data8
-MOV SPL, #data8
-MOV R0, A
-MOV R1, A
-MOV R2, A
-MOV R3, A
-MOV DPH, A
-MOV DPL, A
-MOV SPH, A
-MOV SPL, A
-MOV A, R0
-MOV A, R1
-MOV A, R2
-MOV A, R3
-MOV A, DPH
-MOV A, DPL
-MOV A, SPH
-MOV A, SPL
-MOV R0, @DPTR
-MOV R0, R1
-MOV R0, R2
-MOV R0, R3
-MOV R0, DPH
-MOV R0, DPL
-MOV R0, SPH
-MOV R0, SPL
-MOV R1, R0
-MOV R1, @DPTR
-MOV R1, R2
-MOV R1, R3
-MOV R1, DPH
-MOV R1, DPL
-MOV R1, SPH
-MOV R1, SPL
-MOV R2, R0
-MOV R2, R1
-MOV R2, @DPTR
-MOV R2, R3
-MOV R2, DPH
-MOV R2, DPL
-MOV R2, SPH
-MOV R2, SPL
-MOV R3, R0
-MOV R3, R1
-MOV R3, R2
-MOV R3, @DPTR
-MOV R3, DPH
-MOV R3, DPL
-MOV R3, SPH
-MOV R3, SPL
-MOV DPH, R0
-MOV DPH, R1
-MOV DPH, R2
-MOV DPH, R3
-MOV DPH, @DPTR
-MOV DPH, DPL
-MOV DPH, SPH
-MOV DPH, SPL
-MOV DPL, R0
-MOV DPL, R1
-MOV DPL, R2
-MOV DPL, R3
-MOV DPL, DPH
-MOV DPL, @DPTR
-MOV DPL, SPH
-MOV DPL, SPL
-MOV SPH, R0
-MOV SPH, R1
-MOV SPH, R2
-MOV SPH, R3
-MOV SPH, DPH
-MOV SPH, DPL
-MOV SPH, @DPTR
-MOV SPH, SPL
-MOV SPL, R0
-MOV SPL, R1
-MOV SPL, R2
-MOV SPL, R3
-MOV SPL, DPH
-MOV SPL, DPL
-MOV SPL, SPH
-MOV SPL, @DPTR
-ANL A, R0
-ANL A, R1
-ANL A, R2
-ANL A, R3
-ANL A, DPH
-ANL A, DPL
-ANL A, #data8
-ANL A, @DPTR
-ORL A, R0
-ORL A, R1
-ORL A, R2
-ORL A, R3
-ORL A, DPH
-ORL A, DPL
-ORL A, #data8
-ORL A, @DPTR
-XRL A, R0
-XRL A, R1
-XRL A, R2
-XRL A, R3
-XRL A, DPH
-XRL A, DPL
-XRL A, #data8
-XRL A, @DPTR
-RL A
-RLC A
-RR A
-RRC A
-INC DPTR
-DEC DPTR
-INC A
-DEC A
-ADD A, R0
-ADD A, R1
-ADD A, R2
-ADD A, R3
-ADD A, DPH
-ADD A, DPL
-ADD A, #data8
-ADD A, @DPTR
-ADDC A, R0
-ADDC A, R1
-ADDC A, R2
-ADDC A, R3
-ADDC A, DPH
-ADDC A, DPL
-ADDC A, #data8
-ADDC A, @DPTR
-SUB A, R0
-SUB A, R1
-SUB A, R2
-SUB A, R3
-SUB A, DPH
-SUB A, DPL
-SUB A, #data8
-SUB A, @DPTR
-SUBB A, R0
-SUBB A, R1
-SUBB A, R2
-SUBB A, R3
-SUBB A, DPH
-SUBB A, DPL
-SUBB A, #data8
-SUBB A, @DPTR
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PJMP addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-PCALL addr11
-DJNZ R0, rel8
-DJNZ R1, rel8
-DJNZ R2, rel8
-DJNZ R3, rel8
-CJNE R0, #data8, rel8
-CJNE R1, #data8, rel8
-CJNE R2, #data8, rel8
-CJNE R3, #data8, rel8
-LJMP addr16
-LCALL addr16
-RET
-RETI
-SJMP
-JMP @A+DPTR
-JMP @DPTR
-CJNE A, #data8, rel8
-JZ rel8
-JNZ rel8
-JC rel8
-JNC rel8
-JPO rel8
-JPE rel8
-JS rel8
-JNS rel8
-PUSH R0
-PUSH R1
-PUSH R2
-PUSH R3
-PUSH DPH
-PUSH DPL
-PUSH A
-PUSH FLAGS
-POP R0
-POP R1
-POP R2
-POP R3
-POP DPH
-POP DPL
-POP A
-POP FLAGS
-MUL R0, R1
-DIV R0, R1
-DA A
-reserved
-IN A, port_addr
-OUT port_addr, A
-INT vect8
-HLT
-
--- a/utils/instruction_table.txt	Sat Jan 11 12:44:39 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-0	NOP
-1	reserved
-2	reserved
-3	reserved
-4	reserved
-5	reserved
-6	reserved
-7	reserved
-8	SET C
-9	CLR C
-10	SET BS
-11	CLR BS
-12	SET IE
-13	CLR IE
-14	CPL C
-15	CPL A
-16	XCSD
-17	SFA
-18	LAF
-19	MOV DPTR, SP
-20	MOV SP, DPTR
-21	MOV A, #data8
-22	MOV SP, #data16
-23	MOV DPTR, #data16
-24	MOV A, addr16
-25	MOV addr16, A
-26	MOV A, @A+DPTR
-27	MOV A, @A+PC
-28	MOV A, @addr16
-29	MOV @addr16, A
-30	MOV A, @DPTR
-31	MOV @DPTR, A
-32	MOV @DPTR, R0
-33	MOV @DPTR, R1
-34	MOV @DPTR, R2
-35	MOV @DPTR, R3
-36	MOV @DPTR, DPH
-37	MOV @DPTR, DPL
-38	MOV @DPTR, SPH
-39	MOV @DPTR, SPL
-40	MOV R0, #data8
-41	MOV R1, #data8
-42	MOV R2, #data8
-43	MOV R3, #data8
-44	MOV DPH, #data8
-45	MOV DPL, #data8
-46	MOV SPH, #data8
-47	MOV SPL, #data8
-48	MOV R0, A
-49	MOV R1, A
-50	MOV R2, A
-51	MOV R3, A
-52	MOV DPH, A
-53	MOV DPL, A
-54	MOV SPH, A
-55	MOV SPL, A
-56	MOV A, R0
-57	MOV A, R1
-58	MOV A, R2
-59	MOV A, R3
-60	MOV A, DPH
-61	MOV A, DPL
-62	MOV A, SPH
-63	MOV A, SPL
-64	MOV R0, @DPTR
-65	MOV R0, R1
-66	MOV R0, R2
-67	MOV R0, R3
-68	MOV R0, DPH
-69	MOV R0, DPL
-70	MOV R0, SPH
-71	MOV R0, SPL
-72	MOV R1, R0
-73	MOV R1, @DPTR
-74	MOV R1, R2
-75	MOV R1, R3
-76	MOV R1, DPH
-77	MOV R1, DPL
-78	MOV R1, SPH
-79	MOV R1, SPL
-80	MOV R2, R0
-81	MOV R2, R1
-82	MOV R2, @DPTR
-83	MOV R2, R3
-84	MOV R2, DPH
-85	MOV R2, DPL
-86	MOV R2, SPH
-87	MOV R2, SPL
-88	MOV R3, R0
-89	MOV R3, R1
-90	MOV R3, R2
-91	MOV R3, @DPTR
-92	MOV R3, DPH
-93	MOV R3, DPL
-94	MOV R3, SPH
-95	MOV R3, SPL
-96	MOV DPH, R0
-97	MOV DPH, R1
-98	MOV DPH, R2
-99	MOV DPH, R3
-100	MOV DPH, @DPTR
-101	MOV DPH, DPL
-102	MOV DPH, SPH
-103	MOV DPH, SPL
-104	MOV DPL, R0
-105	MOV DPL, R1
-106	MOV DPL, R2
-107	MOV DPL, R3
-108	MOV DPL, DPH
-109	MOV DPL, @DPTR
-110	MOV DPL, SPH
-111	MOV DPL, SPL
-112	MOV SPH, R0
-113	MOV SPH, R1
-114	MOV SPH, R2
-115	MOV SPH, R3
-116	MOV SPH, DPH
-117	MOV SPH, DPL
-118	MOV SPH, @DPTR
-119	MOV SPH, SPL
-120	MOV SPL, R0
-121	MOV SPL, R1
-122	MOV SPL, R2
-123	MOV SPL, R3
-124	MOV SPL, DPH
-125	MOV SPL, DPL
-126	MOV SPL, SPH
-127	MOV SPL, @DPTR
-128	ANL A, R0
-129	ANL A, R1
-130	ANL A, R2
-131	ANL A, R3
-132	ANL A, DPH
-133	ANL A, DPL
-134	ANL A, #data8
-135	ANL A, @DPTR
-136	ORL A, R0
-137	ORL A, R1
-138	ORL A, R2
-139	ORL A, R3
-140	ORL A, DPH
-141	ORL A, DPL
-142	ORL A, #data8
-143	ORL A, @DPTR
-144	XRL A, R0
-145	XRL A, R1
-146	XRL A, R2
-147	XRL A, R3
-148	XRL A, DPH
-149	XRL A, DPL
-150	XRL A, #data8
-151	XRL A, @DPTR
-152	RL A
-153	RLC A
-154	RR A
-155	RRC A
-156	INC DPTR
-157	DEC DPTR
-158	INC A
-159	DEC A
-160	ADD A, R0
-161	ADD A, R1
-162	ADD A, R2
-163	ADD A, R3
-164	ADD A, DPH
-165	ADD A, DPL
-166	ADD A, #data8
-167	ADD A, @DPTR
-168	ADDC A, R0
-169	ADDC A, R1
-170	ADDC A, R2
-171	ADDC A, R3
-172	ADDC A, DPH
-173	ADDC A, DPL
-174	ADDC A, #data8
-175	ADDC A, @DPTR
-176	SUB A, R0
-177	SUB A, R1
-178	SUB A, R2
-179	SUB A, R3
-180	SUB A, DPH
-181	SUB A, DPL
-182	SUB A, #data8
-183	SUB A, @DPTR
-184	SUBB A, R0
-185	SUBB A, R1
-186	SUBB A, R2
-187	SUBB A, R3
-188	SUBB A, DPH
-189	SUBB A, DPL
-190	SUBB A, #data8
-191	SUBB A, @DPTR
-192	PJMP addr11
-193	PJMP addr11
-194	PJMP addr11
-195	PJMP addr11
-196	PJMP addr11
-197	PJMP addr11
-198	PJMP addr11
-199	PJMP addr11
-200	PCALL addr11
-201	PCALL addr11
-202	PCALL addr11
-203	PCALL addr11
-204	PCALL addr11
-205	PCALL addr11
-206	PCALL addr11
-207	PCALL addr11
-208	DJNZ R0, rel8
-209	DJNZ R1, rel8
-210	DJNZ R2, rel8
-211	DJNZ R3, rel8
-212	CJNE R0, #data, rel8
-213	CJNE R1, #data, rel8
-214	CJNE R2, #data, rel8
-215	CJNE R3, #data, rel8
-216	LJMP addr16
-217	LCALL addr16
-218	RET
-219	RETI
-220	SJMP
-221	JMP @A+DPTR
-222	JMP @DPTR
-223	CJNE A, #data8, rel8
-224	JZ rel8
-225	JNZ rel8
-226	JC rel8
-227	JNC rel8
-228	JPO rel8
-229	JPE rel8
-230	JS rel8
-231	JNS rel8
-232	PUSH R0
-233	PUSH R1
-234	PUSH R2
-235	PUSH R3
-236	PUSH DPH
-237	PUSH DPL
-238	PUSH A
-239	PUSH FLAGS
-240	POP R0
-241	POP R1
-242	POP R2
-243	POP R3
-244	POP DPH
-245	POP DPL
-246	POP A
-247	POP FLAGS
-248	MUL R0, R1
-249	DIV R0, R1
-250	DA A
-251	reserved
-252	IN A, port_addr
-253	OUT port_addr, A
-254	INT vect8
-255	HLT
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/utils/iset.csv	Wed Jan 29 20:11:07 2014 +0000
@@ -0,0 +1,256 @@
+0;NOP
+1;reserved
+2;reserved
+3;reserved
+4;reserved
+5;reserved
+6;reserved
+7;reserved
+8;SET C
+9;CLR C
+10;SET BS
+11;CLR BS
+12;SET IE
+13;CLR IE
+14;CPL C
+15;CPL A
+16;XCSD
+17;SFA
+18;LAF
+19;MOV DPTR, SP
+20;MOV SP, DPTR
+21;MOV A, #data8
+22;MOV SP, #data16
+23;MOV DPTR, #data16
+24;MOV A, addr16
+25;MOV addr16, A
+26;MOV A, @A+DPTR
+27;MOV A, @A+PC
+28;MOV A, @addr16
+29;MOV @addr16, A
+30;MOV A, @DPTR
+31;MOV @DPTR, A
+32;MOV @DPTR, R0
+33;MOV @DPTR, R1
+34;MOV @DPTR, R2
+35;MOV @DPTR, R3
+36;MOV @DPTR, DPH
+37;MOV @DPTR, DPL
+38;MOV @DPTR, SPH
+39;MOV @DPTR, SPL
+40;MOV R0, #data8
+41;MOV R1, #data8
+42;MOV R2, #data8
+43;MOV R3, #data8
+44;MOV DPH, #data8
+45;MOV DPL, #data8
+46;MOV SPH, #data8
+47;MOV SPL, #data8
+48;MOV R0, A
+49;MOV R1, A
+50;MOV R2, A
+51;MOV R3, A
+52;MOV DPH, A
+53;MOV DPL, A
+54;MOV SPH, A
+55;MOV SPL, A
+56;MOV A, R0
+57;MOV A, R1
+58;MOV A, R2
+59;MOV A, R3
+60;MOV A, DPH
+61;MOV A, DPL
+62;MOV A, SPH
+63;MOV A, SPL
+64;MOV R0, @DPTR
+65;MOV R0, R1
+66;MOV R0, R2
+67;MOV R0, R3
+68;MOV R0, DPH
+69;MOV R0, DPL
+70;MOV R0, SPH
+71;MOV R0, SPL
+72;MOV R1, R0
+73;MOV R1, @DPTR
+74;MOV R1, R2
+75;MOV R1, R3
+76;MOV R1, DPH
+77;MOV R1, DPL
+78;MOV R1, SPH
+79;MOV R1, SPL
+80;MOV R2, R0
+81;MOV R2, R1
+82;MOV R2, @DPTR
+83;MOV R2, R3
+84;MOV R2, DPH
+85;MOV R2, DPL
+86;MOV R2, SPH
+87;MOV R2, SPL
+88;MOV R3, R0
+89;MOV R3, R1
+90;MOV R3, R2
+91;MOV R3, @DPTR
+92;MOV R3, DPH
+93;MOV R3, DPL
+94;MOV R3, SPH
+95;MOV R3, SPL
+96;MOV DPH, R0
+97;MOV DPH, R1
+98;MOV DPH, R2
+99;MOV DPH, R3
+100;MOV DPH, @DPTR
+101;MOV DPH, DPL
+102;MOV DPH, SPH
+103;MOV DPH, SPL
+104;MOV DPL, R0
+105;MOV DPL, R1
+106;MOV DPL, R2
+107;MOV DPL, R3
+108;MOV DPL, DPH
+109;MOV DPL, @DPTR
+110;MOV DPL, SPH
+111;MOV DPL, SPL
+112;MOV SPH, R0
+113;MOV SPH, R1
+114;MOV SPH, R2
+115;MOV SPH, R3
+116;MOV SPH, DPH
+117;MOV SPH, DPL
+118;MOV SPH, @DPTR
+119;MOV SPH, SPL
+120;MOV SPL, R0
+121;MOV SPL, R1
+122;MOV SPL, R2
+123;MOV SPL, R3
+124;MOV SPL, DPH
+125;MOV SPL, DPL
+126;MOV SPL, SPH
+127;MOV SPL, @DPTR
+128;ANL A, R0
+129;ANL A, R1
+130;ANL A, R2
+131;ANL A, R3
+132;ANL A, DPH
+133;ANL A, DPL
+134;ANL A, #data8
+135;ANL A, @DPTR
+136;ORL A, R0
+137;ORL A, R1
+138;ORL A, R2
+139;ORL A, R3
+140;ORL A, DPH
+141;ORL A, DPL
+142;ORL A, #data8
+143;ORL A, @DPTR
+144;XRL A, R0
+145;XRL A, R1
+146;XRL A, R2
+147;XRL A, R3
+148;XRL A, DPH
+149;XRL A, DPL
+150;XRL A, #data8
+151;XRL A, @DPTR
+152;RL A
+153;RLC A
+154;RR A
+155;RRC A
+156;INC DPTR
+157;DEC DPTR
+158;INC A
+159;DEC A
+160;ADD A, R0
+161;ADD A, R1
+162;ADD A, R2
+163;ADD A, R3
+164;ADD A, DPH
+165;ADD A, DPL
+166;ADD A, #data8
+167;ADD A, @DPTR
+168;ADDC A, R0
+169;ADDC A, R1
+170;ADDC A, R2
+171;ADDC A, R3
+172;ADDC A, DPH
+173;ADDC A, DPL
+174;ADDC A, #data8
+175;ADDC A, @DPTR
+176;SUB A, R0
+177;SUB A, R1
+178;SUB A, R2
+179;SUB A, R3
+180;SUB A, DPH
+181;SUB A, DPL
+182;SUB A, #data8
+183;SUB A, @DPTR
+184;SUBB A, R0
+185;SUBB A, R1
+186;SUBB A, R2
+187;SUBB A, R3
+188;SUBB A, DPH
+189;SUBB A, DPL
+190;SUBB A, #data8
+191;SUBB A, @DPTR
+192;PJMP addr11
+193;PJMP addr11
+194;PJMP addr11
+195;PJMP addr11
+196;PJMP addr11
+197;PJMP addr11
+198;PJMP addr11
+199;PJMP addr11
+200;PCALL addr11
+201;PCALL addr11
+202;PCALL addr11
+203;PCALL addr11
+204;PCALL addr11
+205;PCALL addr11
+206;PCALL addr11
+207;PCALL addr11
+208;DJNZ R0, rel8
+209;DJNZ R1, rel8
+210;DJNZ R2, rel8
+211;DJNZ R3, rel8
+212;CJNE R0, #data, rel8
+213;CJNE R1, #data, rel8
+214;CJNE R2, #data, rel8
+215;CJNE R3, #data, rel8
+216;LJMP addr16
+217;LCALL addr16
+218;RET
+219;RETI
+220;SJMP rel8
+221;JMP @A+DPTR
+222;JMP @DPTR
+223;CJNE A, #data8, rel8
+224;JZ rel8
+225;JNZ rel8
+226;JC rel8
+227;JNC rel8
+228;JPO rel8
+229;JPE rel8
+230;JS rel8
+231;JNS rel8
+232;PUSH R0
+233;PUSH R1
+234;PUSH R2
+235;PUSH R3
+236;PUSH DPH
+237;PUSH DPL
+238;PUSH A
+239;PUSH FLAGS
+240;POP R0
+241;POP R1
+242;POP R2
+243;POP R3
+244;POP DPH
+245;POP DPL
+246;POP A
+247;POP FLAGS
+248;MUL R0, R1
+249;DIV R0, R1
+250;DA A
+251;reserved
+252;IN A, port_addr
+253;OUT port_addr, A
+254;INT vect8
+255;HLT
--- a/utils/iset.txt	Sat Jan 11 12:44:39 2014 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,257 +0,0 @@
-0	00	00000000		NOP
-1	01	00000001		reserved
-2	02	00000010		reserved
-3	03	00000011		reserved
-4	04	00000100		reserved
-5	05	00000101		reserved
-6	06	00000110		reserved
-7	07	00000111		reserved
-8	08	00001000		SET C
-9	09	00001001		CLR C
-10	0A	00001010		SET BS
-11	0B	00001011		CLR BS
-12	0C	00001100		SET IE
-13	0D	00001101		CLR IE
-14	0E	00001110		CPL C
-15	0F	00001111		CPL A
-16	10	00010000		XCSD
-17	11	00010001		SFA
-18	12	00010010		LAF
-19	13	00010011		MOV DPTR, SP
-20	14	00010100		MOV SP, DPTR
-21	15	00010101		MOV A, #data8
-22	16	00010110		MOV SP, #data16
-23	17	00010111		MOV DPTR, #data16
-24	18	00011000		MOV A, addr16
-25	19	00011001		MOV addr16, A
-26	1A	00011010		MOV A, @A+DPTR
-27	1B	00011011		MOV A, @A+PC
-28	1C	00011100		MOV A, @addr16
-29	1D	00011101		MOV @addr16, A
-30	1E	00011110	 	MOV A, @DPTR
-31	1F	00011111		MOV @DPTR, A
-32	20	00100000		MOV @DPTR, R0
-33	21	00100001		MOV @DPTR, R1
-34	22	00100010		MOV @DPTR, R2
-35	23	00100011		MOV @DPTR, R3
-36	24	00100100		MOV @DPTR, DPH
-37	25	00100101		MOV @DPTR, DPL
-38	26	00100110		MOV @DPTR, SPH
-39	27	00100111		MOV @DPTR, SPL
-40	28	00101000		MOV R0, #data8
-41	29	00101001		MOV R1, #data8
-42	2A	00101010		MOV R2, #data8
-43	2B	00101011		MOV R3, #data8
-44	2C	00101100		MOV DPH, #data8
-45	2D	00101101		MOV DPL, #data8
-46	2E	00101110		MOV SPH, #data8
-47	2F	00101111		MOV SPL, #data8
-48	30	00110000		MOV R0, A
-49	31	00110001		MOV R1, A
-50	32	00110010		MOV R2, A
-51	33	00110011		MOV R3, A
-52	34	00110100		MOV DPH, A
-53	35	00110101		MOV DPL, A
-54	36	00110110		MOV SPH, A
-55	37	00110111		MOV SPL, A
-56	38	00111000		MOV A, R0
-57	39	00111001		MOV A, R1
-58	3A	00111010		MOV A, R2
-59	3B	00111011		MOV A, R3
-60	3C	00111100		MOV A, DPH
-61	3D	00111101		MOV A, DPL
-62	3E	00111110		MOV A, SPH
-63	3F	00111111		MOV A, SPL
-64	40	01000000		MOV R0, @DPTR
-65	41	01000001		MOV R0, R1
-66	42	01000010		MOV R0, R2
-67	43	01000011		MOV R0, R3
-68	44	01000100		MOV R0, DPH
-69	45	01000101		MOV R0, DPL
-70	46	01000110		MOV R0, SPH
-71	47	01000111		MOV R0, SPL
-72	48	01001000		MOV R1, R0
-73	49	01001001		MOV R1, @DPTR
-74	4A	01001010		MOV R1, R2
-75	4B	01001011		MOV R1, R3
-76	4C	01001100		MOV R1, DPH
-77	4D	01001101		MOV R1, DPL
-78	4E	01001110		MOV R1, SPH
-79	4F	01001111		MOV R1, SPL
-80	50	01010000		MOV R2, R0
-81	51	01010001		MOV R2, R1
-82	52	01010010		MOV R2, @DPTR
-83	53	01010011		MOV R2, R3
-84	54	01010100		MOV R2, DPH
-85	55	01010101		MOV R2, DPL
-86	56	01010110		MOV R2, SPH
-87	57	01010111		MOV R2, SPL
-88	58	01011000		MOV R3, R0
-89	59	01011001		MOV R3, R1
-90	5A	01011010		MOV R3, R2
-91	5B	01011011		MOV R3, @DPTR
-92	5C	01011100		MOV R3, DPH
-93	5D	01011101		MOV R3, DPL
-94	5E	01011110		MOV R3, SPH
-95	5F	01011111		MOV R3, SPL
-96	60	01100000		MOV DPH, R0
-97	61	01100001		MOV DPH, R1
-98	62	01100010		MOV DPH, R2
-99	63	01100011		MOV DPH, R3
-100	64	01100100		MOV DPH, @DPTR
-101	65	01100101		MOV DPH, DPL
-102	66	01100110		MOV DPH, SPH
-103	67	01100111		MOV DPH, SPL
-104	68	01101000		MOV DPL, R0
-105	69	01101001		MOV DPL, R1
-106	6A	01101010		MOV DPL, R2
-107	6B	01101011		MOV DPL, R3
-108	6C	01101100		MOV DPL, DPH
-109	6D	01101101		MOV DPL, @DPTR
-110	6E	01101110		MOV DPL, SPH
-111	6F	01101111		MOV DPL, SPL
-112	70	01110000		MOV SPH, R0
-113	71	01110001		MOV SPH, R1
-114	72	01110010		MOV SPH, R2
-115	73	01110011		MOV SPH, R3
-116	74	01110100		MOV SPH, DPH
-117	75	01110101		MOV SPH, DPL
-118	76	01110110		MOV SPH, @DPTR
-119	77	01110111		MOV SPH, SPL
-120	78	01111000		MOV SPL, R0
-121	79	01111001		MOV SPL, R1
-122	7A	01111010		MOV SPL, R2
-123	7B	01111011		MOV SPL, R3
-124	7C	01111100		MOV SPL, DPH
-125	7D	01111101		MOV SPL, DPL
-126	7E	01111110		MOV SPL, SPH
-127	7F	01111111		MOV SPL, @DPTR
-128	80	10000000		ANL A, R0
-129	81	10000001		ANL A, R1
-130	82	10000010		ANL A, R2
-131	83	10000011		ANL A, R3
-132	84	10000100		ANL A, DPH
-133	85	10000101		ANL A, DPL
-134	86	10000110		ANL A, #data8
-135	87	10000111		ANL A, @DPTR
-136	88	10001000		ORL A, R0
-137	89	10001001		ORL A, R1
-138	8A	10001010		ORL A, R2
-139	8B	10001011		ORL A, R3
-140	8C	10001100		ORL A, DPH
-141	8D	10001101		ORL A, DPL
-142	8E	10001110		ORL A, #data8
-143	8F	10001111		ORL A, @DPTR
-144	90	10010000		XRL A, R0
-145	91	10010001		XRL A, R1
-146	92	10010010		XRL A, R2
-147	93	10010011		XRL A, R3
-148	94	10010100		XRL A, DPH
-149	95	10010101		XRL A, DPL
-150	96	10010110		XRL A, #data8
-151	97	10010111	 	XRL A, @DPTR
-152	98	10011000		RL A
-153	99	10011001		RLC A
-154	9A	10011010		RR A
-155	9B	10011011		RRC A
-156	9C	10011100		INC DPTR
-157	9D	10011101		DEC DPTR
-158	9E	10011110		INC A
-159	9F	10011111		DEC A
-160	A0	10100000		ADD A, R0
-161	A1	10100001		ADD A, R1
-162	A2	10100010		ADD A, R2
-163	A3	10100011		ADD A, R3
-164	A4	10100100		ADD A, DPH
-165	A5	10100101		ADD A, DPL
-166	A6	10100110		ADD A, #data8
-167	A7	10100111		ADD A, @DPTR
-168	A8	10101000		ADDC A, R0
-169	A9	10101001		ADDC A, R1
-170	AA	10101010		ADDC A, R2
-171	AB	10101011		ADDC A, R3
-172	AC	10101100		ADDC A, DPH
-173	AD	10101101		ADDC A, DPL
-174	AE	10101110		ADDC A, #data8
-175	AF	10101111		ADDC A, @DPTR
-176	B0	10110000		SUB A, R0
-177	B1	10110001		SUB A, R1
-178	B2	10110010		SUB A, R2
-179	B3	10110011		SUB A, R3
-180	B4	10110100		SUB A, DPH
-181	B5	10110101		SUB A, DPL
-182	B6	10110110		SUB A, #data8
-183	B7	10110111		SUB A, @DPTR
-184	B8	10111000		SUBB A, R0
-185	B9	10111001		SUBB A, R1
-186	BA	10111010		SUBB A, R2
-187	BB	10111011		SUBB A, R3
-188	BC	10111100		SUBB A, DPH
-189	BD	10111101		SUBB A, DPL
-190	BE	10111110		SUBB A, #data8
-191	BF	10111111		SUBB A, @DPTR
-192	C0	11000000		PJMP addr11
-193	C1	11000001		PJMP addr11
-194	C2	11000010		PJMP addr11
-195	C3	11000011		PJMP addr11
-196	C4	11000100		PJMP addr11
-197	C5	11000101		PJMP addr11
-198	C6	11000110		PJMP addr11
-199	C7	11000111		PJMP addr11
-200	C8	11001000		PCALL addr11
-201	C9	11001001		PCALL addr11
-202	CA	11001010		PCALL addr11
-203	CB	11001011		PCALL addr11
-204	CC	11001100		PCALL addr11
-205	CD	11001101		PCALL addr11
-206	CE	11001110		PCALL addr11
-207	CF	11001111		PCALL addr11
-208	D0	11010000		DJNZ R0, rel8
-209	D1	11010001		DJNZ R1, rel8
-210	D2	11010010		DJNZ R2, rel8
-211	D3	11010011		DJNZ R3, rel8
-212	D4	11010100		CJNE R0, #data, rel8
-213	D5	11010101		CJNE R1, #data, rel8
-214	D6	11010110		CJNE R2, #data, rel8
-215	D7	11010111		CJNE R3, #data, rel8
-216	D8	11011000		LJMP addr16
-217	D9	11011001		LCALL addr16
-218	DA	11011010		RET
-219	DB	11011011		RETI
-220	DC	11011100		SJMP
-221	DD	11011101		JMP @A+DPTR
-222	DE	11011110		JMP @DPTR
-223	DF	11011111		CJNE A, #data8, rel8
-224	E0	11100000		JZ rel8
-225	E1	11100001		JNZ rel8
-226	E2	11100010		JC rel8
-227	E3	11100011		JNC rel8
-228	E4	11100100		JPO rel8
-229	E5	11100101		JPE rel8
-230	E6	11100110		JS rel8
-231	E7	11100111		JNS rel8
-232	E8	11101000		PUSH R0
-233	E9	11101001		PUSH R1
-234	EA	11101010		PUSH R2
-235	EB	11101011		PUSH R3
-236	EC	11101100		PUSH DPH
-237	ED	11101101		PUSH DPL
-238	EE	11101110		PUSH A
-239	EF	11101111		PUSH FLAGS
-240	F0	11110000		POP R0
-241	F1	11110001		POP R1
-242	F2	11110010		POP R2
-243	F3	11110011		POP R3
-244	F4	11110100		POP DPH
-245	F5	11110101		POP DPL
-246	F6	11110110		POP A
-247	F7	11110111		POP FLAGS
-248	F8	11111000		MUL R0, R1
-249	F9	11111001		DIV R0, R1
-250	FA	11111010		DA A
-251	FB	11111011		reserved
-252	FC	11111100		IN A, port_addr
-253	FD	11111101		OUT port_addr, A
-254	FE	11111110		INT vect8
-255	FF	11111111		HLT
-