jb302@1: { jb302@1: "metadata": { jb302@1: "name": "gen_language" jb302@1: }, jb302@1: "nbformat": 3, jb302@1: "nbformat_minor": 0, jb302@1: "worksheets": [ jb302@1: { jb302@1: "cells": [ jb302@1: { jb302@1: "cell_type": "code", jb302@1: "collapsed": false, jb302@1: "input": [ jb302@1: "from pprint import pprint\n", jb302@1: "import sys\n", jb302@1: "sys.path.append('../assembler')\n", jb302@1: "from assembler import *\n", jb302@14: "f = open('iset.csv', 'r')\n", jb302@1: "\n", jb302@1: "codes = []\n", jb302@14: "lang = []\n", jb302@14: "for line in f:\n", jb302@14: " line = line.split(';')\n", jb302@14: " codes.append(int(line[0]))\n", jb302@14: " statement = line[1].strip().lower().split()\n", jb302@14: " mnemonic = statement[0]\n", jb302@14: " arguments = ''.join(statement[1:]).split(',')\n", jb302@14: " lang.append([mnemonic, arguments])\n", jb302@14: " \n", jb302@14: "#pprint(lang) \n" jb302@1: ], jb302@1: "language": "python", jb302@1: "metadata": {}, jb302@18: "outputs": [] jb302@1: }, jb302@1: { jb302@1: "cell_type": "code", jb302@1: "collapsed": false, jb302@1: "input": [ jb302@14: "consts = { 'addr11':1, 'addr16':2, '@addr16':2, 'vect8':1, '#data8':1, 'port_addr':1, 'rel8':1, '#data16':2}\n", jb302@14: "labelable = ('addr11', 'addr16', 'rel8')\n", jb302@14: "\n", jb302@1: "mne_syms = []\n", jb302@1: "arg_syms = []\n", jb302@1: "for line in lang:\n", jb302@1: " mne_syms.append(line[0])\n", jb302@1: " arg_syms.extend(line[1])\n", jb302@1: "mne_set = set(mne_syms)\n", jb302@1: "arg_set = set(arg_syms)\n", jb302@1: "\n", jb302@1: "iset = {}\n", jb302@1: "for mne in mne_set:\n", jb302@1: " i = 0\n", jb302@1: " valid_args = {}\n", jb302@1: " for line in lang:\n", jb302@14: " args = []\n", jb302@1: " if line[0] == mne:\n", jb302@14: " width = 1\n", jb302@14: " for a in line[1]:\n", jb302@14: " if a in consts:\n", jb302@14: " width = width + consts[a]\n", jb302@14: " valid_args.update({tuple(line[1]):[int(codes[i]), width]})\n", jb302@14: " \n", jb302@18: " found_label = 0\n", jb302@14: " for a in line[1]:\n", jb302@14: " if a in labelable:\n", jb302@14: " found_label = 1\n", jb302@14: " args.append('label')\n", jb302@18: " elif a == '@addr16':\n", jb302@18: " found_label = 1\n", jb302@18: " args.append('@label')\n", jb302@14: " else:\n", jb302@14: " args.append(a)\n", jb302@14: " if found_label:\n", jb302@14: " valid_args.update({tuple(args):[int(codes[i]), width]})\n", jb302@14: " \n", jb302@1: " i = i + 1\n", jb302@1: " iset.update({mne:valid_args})\n", jb302@18: "pprint(iset, indent=5)\n" jb302@1: ], jb302@1: "language": "python", jb302@1: "metadata": {}, jb302@18: "outputs": [ jb302@18: { jb302@18: "output_type": "stream", jb302@18: "stream": "stdout", jb302@18: "text": [ jb302@18: "{ 'add': { ('a', '#data8'): [166, 2],\n", jb302@18: " ('a', '@dptr'): [167, 1],\n", jb302@18: " ('a', 'dph'): [164, 1],\n", jb302@18: " ('a', 'dpl'): [165, 1],\n", jb302@18: " ('a', 'r0'): [160, 1],\n", jb302@18: " ('a', 'r1'): [161, 1],\n", jb302@18: " ('a', 'r2'): [162, 1],\n", jb302@18: " ('a', 'r3'): [163, 1]},\n", jb302@18: " 'addc': { ('a', '#data8'): [174, 2],\n", jb302@18: " ('a', '@dptr'): [175, 1],\n", jb302@18: " ('a', 'dph'): [172, 1],\n", jb302@18: " ('a', 'dpl'): [173, 1],\n", jb302@18: " ('a', 'r0'): [168, 1],\n", jb302@18: " ('a', 'r1'): [169, 1],\n", jb302@18: " ('a', 'r2'): [170, 1],\n", jb302@18: " ('a', 'r3'): [171, 1]},\n", jb302@18: " 'anl': { ('a', '#data8'): [134, 2],\n", jb302@18: " ('a', '@dptr'): [135, 1],\n", jb302@18: " ('a', 'dph'): [132, 1],\n", jb302@18: " ('a', 'dpl'): [133, 1],\n", jb302@18: " ('a', 'r0'): [128, 1],\n", jb302@18: " ('a', 'r1'): [129, 1],\n", jb302@18: " ('a', 'r2'): [130, 1],\n", jb302@18: " ('a', 'r3'): [131, 1]},\n", jb302@18: " 'cjne': { ('a', '#data8', 'label'): [223, 3],\n", jb302@18: " ('a', '#data8', 'rel8'): [223, 3],\n", jb302@18: " ('r0', '#data', 'label'): [212, 2],\n", jb302@18: " ('r0', '#data', 'rel8'): [212, 2],\n", jb302@18: " ('r1', '#data', 'label'): [213, 2],\n", jb302@18: " ('r1', '#data', 'rel8'): [213, 2],\n", jb302@18: " ('r2', '#data', 'label'): [214, 2],\n", jb302@18: " ('r2', '#data', 'rel8'): [214, 2],\n", jb302@18: " ('r3', '#data', 'label'): [215, 2],\n", jb302@18: " ('r3', '#data', 'rel8'): [215, 2]},\n", jb302@18: " 'clr': { ('bs',): [11, 1], ('c',): [9, 1], ('ie',): [13, 1]},\n", jb302@18: " 'cpl': { ('a',): [15, 1], ('c',): [14, 1]},\n", jb302@18: " 'da': { ('a',): [250, 1]},\n", jb302@18: " 'dec': { ('a',): [159, 1], ('dptr',): [157, 1]},\n", jb302@18: " 'div': { ('r0', 'r1'): [249, 1]},\n", jb302@18: " 'djnz': { ('r0', 'label'): [208, 2],\n", jb302@18: " ('r0', 'rel8'): [208, 2],\n", jb302@18: " ('r1', 'label'): [209, 2],\n", jb302@18: " ('r1', 'rel8'): [209, 2],\n", jb302@18: " ('r2', 'label'): [210, 2],\n", jb302@18: " ('r2', 'rel8'): [210, 2],\n", jb302@18: " ('r3', 'label'): [211, 2],\n", jb302@18: " ('r3', 'rel8'): [211, 2]},\n", jb302@18: " 'hlt': { ('',): [255, 1]},\n", jb302@18: " 'in': { ('a', 'port_addr'): [252, 2]},\n", jb302@18: " 'inc': { ('a',): [158, 1], ('dptr',): [156, 1]},\n", jb302@18: " 'int': { ('vect8',): [254, 2]},\n", jb302@18: " 'jc': { ('label',): [226, 2], ('rel8',): [226, 2]},\n", jb302@18: " 'jmp': { ('@a+dptr',): [221, 1], ('@dptr',): [222, 1]},\n", jb302@18: " 'jnc': { ('label',): [227, 2], ('rel8',): [227, 2]},\n", jb302@18: " 'jns': { ('label',): [231, 2], ('rel8',): [231, 2]},\n", jb302@18: " 'jnz': { ('label',): [225, 2], ('rel8',): [225, 2]},\n", jb302@18: " 'jpe': { ('label',): [229, 2], ('rel8',): [229, 2]},\n", jb302@18: " 'jpo': { ('label',): [228, 2], ('rel8',): [228, 2]},\n", jb302@18: " 'js': { ('label',): [230, 2], ('rel8',): [230, 2]},\n", jb302@18: " 'jz': { ('label',): [224, 2], ('rel8',): [224, 2]},\n", jb302@18: " 'laf': { ('',): [18, 1]},\n", jb302@18: " 'lcall': { ('addr16',): [217, 3], ('label',): [217, 3]},\n", jb302@18: " 'ljmp': { ('addr16',): [216, 3], ('label',): [216, 3]},\n", jb302@18: " 'mov': { ('@addr16', 'a'): [29, 3],\n", jb302@18: " ('@dptr', 'a'): [31, 1],\n", jb302@18: " ('@dptr', 'dph'): [36, 1],\n", jb302@18: " ('@dptr', 'dpl'): [37, 1],\n", jb302@18: " ('@dptr', 'r0'): [32, 1],\n", jb302@18: " ('@dptr', 'r1'): [33, 1],\n", jb302@18: " ('@dptr', 'r2'): [34, 1],\n", jb302@18: " ('@dptr', 'r3'): [35, 1],\n", jb302@18: " ('@dptr', 'sph'): [38, 1],\n", jb302@18: " ('@dptr', 'spl'): [39, 1],\n", jb302@18: " ('@label', 'a'): [29, 3],\n", jb302@18: " ('a', '#data8'): [21, 2],\n", jb302@18: " ('a', '@a+dptr'): [26, 1],\n", jb302@18: " ('a', '@a+pc'): [27, 1],\n", jb302@18: " ('a', '@addr16'): [28, 3],\n", jb302@18: " ('a', '@dptr'): [30, 1],\n", jb302@18: " ('a', '@label'): [28, 3],\n", jb302@18: " ('a', 'addr16'): [24, 3],\n", jb302@18: " ('a', 'dph'): [60, 1],\n", jb302@18: " ('a', 'dpl'): [61, 1],\n", jb302@18: " ('a', 'label'): [24, 3],\n", jb302@18: " ('a', 'r0'): [56, 1],\n", jb302@18: " ('a', 'r1'): [57, 1],\n", jb302@18: " ('a', 'r2'): [58, 1],\n", jb302@18: " ('a', 'r3'): [59, 1],\n", jb302@18: " ('a', 'sph'): [62, 1],\n", jb302@18: " ('a', 'spl'): [63, 1],\n", jb302@18: " ('addr16', 'a'): [25, 3],\n", jb302@18: " ('dph', '#data8'): [44, 2],\n", jb302@18: " ('dph', '@dptr'): [100, 1],\n", jb302@18: " ('dph', 'a'): [52, 1],\n", jb302@18: " ('dph', 'dpl'): [101, 1],\n", jb302@18: " ('dph', 'r0'): [96, 1],\n", jb302@18: " ('dph', 'r1'): [97, 1],\n", jb302@18: " ('dph', 'r2'): [98, 1],\n", jb302@18: " ('dph', 'r3'): [99, 1],\n", jb302@18: " ('dph', 'sph'): [102, 1],\n", jb302@18: " ('dph', 'spl'): [103, 1],\n", jb302@18: " ('dpl', '#data8'): [45, 2],\n", jb302@18: " ('dpl', '@dptr'): [109, 1],\n", jb302@18: " ('dpl', 'a'): [53, 1],\n", jb302@18: " ('dpl', 'dph'): [108, 1],\n", jb302@18: " ('dpl', 'r0'): [104, 1],\n", jb302@18: " ('dpl', 'r1'): [105, 1],\n", jb302@18: " ('dpl', 'r2'): [106, 1],\n", jb302@18: " ('dpl', 'r3'): [107, 1],\n", jb302@18: " ('dpl', 'sph'): [110, 1],\n", jb302@18: " ('dpl', 'spl'): [111, 1],\n", jb302@18: " ('dptr', '#data16'): [23, 3],\n", jb302@18: " ('dptr', 'sp'): [19, 1],\n", jb302@18: " ('label', 'a'): [25, 3],\n", jb302@18: " ('r0', '#data8'): [40, 2],\n", jb302@18: " ('r0', '@dptr'): [64, 1],\n", jb302@18: " ('r0', 'a'): [48, 1],\n", jb302@18: " ('r0', 'dph'): [68, 1],\n", jb302@18: " ('r0', 'dpl'): [69, 1],\n", jb302@18: " ('r0', 'r1'): [65, 1],\n", jb302@18: " ('r0', 'r2'): [66, 1],\n", jb302@18: " ('r0', 'r3'): [67, 1],\n", jb302@18: " ('r0', 'sph'): [70, 1],\n", jb302@18: " ('r0', 'spl'): [71, 1],\n", jb302@18: " ('r1', '#data8'): [41, 2],\n", jb302@18: " ('r1', '@dptr'): [73, 1],\n", jb302@18: " ('r1', 'a'): [49, 1],\n", jb302@18: " ('r1', 'dph'): [76, 1],\n", jb302@18: " ('r1', 'dpl'): [77, 1],\n", jb302@18: " ('r1', 'r0'): [72, 1],\n", jb302@18: " ('r1', 'r2'): [74, 1],\n", jb302@18: " ('r1', 'r3'): [75, 1],\n", jb302@18: " ('r1', 'sph'): [78, 1],\n", jb302@18: " ('r1', 'spl'): [79, 1],\n", jb302@18: " ('r2', '#data8'): [42, 2],\n", jb302@18: " ('r2', '@dptr'): [82, 1],\n", jb302@18: " ('r2', 'a'): [50, 1],\n", jb302@18: " ('r2', 'dph'): [84, 1],\n", jb302@18: " ('r2', 'dpl'): [85, 1],\n", jb302@18: " ('r2', 'r0'): [80, 1],\n", jb302@18: " ('r2', 'r1'): [81, 1],\n", jb302@18: " ('r2', 'r3'): [83, 1],\n", jb302@18: " ('r2', 'sph'): [86, 1],\n", jb302@18: " ('r2', 'spl'): [87, 1],\n", jb302@18: " ('r3', '#data8'): [43, 2],\n", jb302@18: " ('r3', '@dptr'): [91, 1],\n", jb302@18: " ('r3', 'a'): [51, 1],\n", jb302@18: " ('r3', 'dph'): [92, 1],\n", jb302@18: " ('r3', 'dpl'): [93, 1],\n", jb302@18: " ('r3', 'r0'): [88, 1],\n", jb302@18: " ('r3', 'r1'): [89, 1],\n", jb302@18: " ('r3', 'r2'): [90, 1],\n", jb302@18: " ('r3', 'sph'): [94, 1],\n", jb302@18: " ('r3', 'spl'): [95, 1],\n", jb302@18: " ('sp', '#data16'): [22, 3],\n", jb302@18: " ('sp', 'dptr'): [20, 1],\n", jb302@18: " ('sph', '#data8'): [46, 2],\n", jb302@18: " ('sph', '@dptr'): [118, 1],\n", jb302@18: " ('sph', 'a'): [54, 1],\n", jb302@18: " ('sph', 'dph'): [116, 1],\n", jb302@18: " ('sph', 'dpl'): [117, 1],\n", jb302@18: " ('sph', 'r0'): [112, 1],\n", jb302@18: " ('sph', 'r1'): [113, 1],\n", jb302@18: " ('sph', 'r2'): [114, 1],\n", jb302@18: " ('sph', 'r3'): [115, 1],\n", jb302@18: " ('sph', 'spl'): [119, 1],\n", jb302@18: " ('spl', '#data8'): [47, 2],\n", jb302@18: " ('spl', '@dptr'): [127, 1],\n", jb302@18: " ('spl', 'a'): [55, 1],\n", jb302@18: " ('spl', 'dph'): [124, 1],\n", jb302@18: " ('spl', 'dpl'): [125, 1],\n", jb302@18: " ('spl', 'r0'): [120, 1],\n", jb302@18: " ('spl', 'r1'): [121, 1],\n", jb302@18: " ('spl', 'r2'): [122, 1],\n", jb302@18: " ('spl', 'r3'): [123, 1],\n", jb302@18: " ('spl', 'sph'): [126, 1]},\n", jb302@18: " 'mul': { ('r0', 'r1'): [248, 1]},\n", jb302@18: " 'nop': { ('',): [0, 1]},\n", jb302@18: " 'orl': { ('a', '#data8'): [142, 2],\n", jb302@18: " ('a', '@dptr'): [143, 1],\n", jb302@18: " ('a', 'dph'): [140, 1],\n", jb302@18: " ('a', 'dpl'): [141, 1],\n", jb302@18: " ('a', 'r0'): [136, 1],\n", jb302@18: " ('a', 'r1'): [137, 1],\n", jb302@18: " ('a', 'r2'): [138, 1],\n", jb302@18: " ('a', 'r3'): [139, 1]},\n", jb302@18: " 'out': { ('port_addr', 'a'): [253, 2]},\n", jb302@18: " 'pcall': { ('addr11',): [207, 2], ('label',): [207, 2]},\n", jb302@18: " 'pjmp': { ('addr11',): [199, 2], ('label',): [199, 2]},\n", jb302@18: " 'pop': { ('a',): [246, 1],\n", jb302@18: " ('dph',): [244, 1],\n", jb302@18: " ('dpl',): [245, 1],\n", jb302@18: " ('flags',): [247, 1],\n", jb302@18: " ('r0',): [240, 1],\n", jb302@18: " ('r1',): [241, 1],\n", jb302@18: " ('r2',): [242, 1],\n", jb302@18: " ('r3',): [243, 1]},\n", jb302@18: " 'push': { ('a',): [238, 1],\n", jb302@18: " ('dph',): [236, 1],\n", jb302@18: " ('dpl',): [237, 1],\n", jb302@18: " ('flags',): [239, 1],\n", jb302@18: " ('r0',): [232, 1],\n", jb302@18: " ('r1',): [233, 1],\n", jb302@18: " ('r2',): [234, 1],\n", jb302@18: " ('r3',): [235, 1]},\n", jb302@18: " 'reserved': { ('',): [251, 1]},\n", jb302@18: " 'ret': { ('',): [218, 1]},\n", jb302@18: " 'reti': { ('',): [219, 1]},\n", jb302@18: " 'rl': { ('a',): [152, 1]" jb302@18: ] jb302@18: }, jb302@18: { jb302@18: "output_type": "stream", jb302@18: "stream": "stdout", jb302@18: "text": [ jb302@18: "},\n", jb302@18: " 'rlc': { ('a',): [153, 1]},\n", jb302@18: " 'rr': { ('a',): [154, 1]},\n", jb302@18: " 'rrc': { ('a',): [155, 1]},\n", jb302@18: " 'set': { ('bs',): [10, 1], ('c',): [8, 1], ('ie',): [12, 1]},\n", jb302@18: " 'sfa': { ('',): [17, 1]},\n", jb302@18: " 'sjmp': { ('label',): [220, 2], ('rel8',): [220, 2]},\n", jb302@18: " 'sub': { ('a', '#data8'): [182, 2],\n", jb302@18: " ('a', '@dptr'): [183, 1],\n", jb302@18: " ('a', 'dph'): [180, 1],\n", jb302@18: " ('a', 'dpl'): [181, 1],\n", jb302@18: " ('a', 'r0'): [176, 1],\n", jb302@18: " ('a', 'r1'): [177, 1],\n", jb302@18: " ('a', 'r2'): [178, 1],\n", jb302@18: " ('a', 'r3'): [179, 1]},\n", jb302@18: " 'subb': { ('a', '#data8'): [190, 2],\n", jb302@18: " ('a', '@dptr'): [191, 1],\n", jb302@18: " ('a', 'dph'): [188, 1],\n", jb302@18: " ('a', 'dpl'): [189, 1],\n", jb302@18: " ('a', 'r0'): [184, 1],\n", jb302@18: " ('a', 'r1'): [185, 1],\n", jb302@18: " ('a', 'r2'): [186, 1],\n", jb302@18: " ('a', 'r3'): [187, 1]},\n", jb302@18: " 'xcsd': { ('',): [16, 1]},\n", jb302@18: " 'xrl': { ('a', '#data8'): [150, 2],\n", jb302@18: " ('a', '@dptr'): [151, 1],\n", jb302@18: " ('a', 'dph'): [148, 1],\n", jb302@18: " ('a', 'dpl'): [149, 1],\n", jb302@18: " ('a', 'r0'): [144, 1],\n", jb302@18: " ('a', 'r1'): [145, 1],\n", jb302@18: " ('a', 'r2'): [146, 1],\n", jb302@18: " ('a', 'r3'): [147, 1]}}\n" jb302@18: ] jb302@18: } jb302@18: ], jb302@18: "prompt_number": 11 jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [ jb302@14: "# generate function lookup table\n", jb302@14: "optable = []\n", jb302@14: "for l in lang:\n", jb302@14: " optable.append(l[0])\n", jb302@14: "\n", jb302@14: "for i in range(17):\n", jb302@14: " 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", jb302@14: "\n" jb302@14: ], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@18: "outputs": [] jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [ jb302@14: "# print function templates\n", jb302@14: "#for mne in mne_set:\n", jb302@14: "# print \"//implement me\\nvoid\\n%s(void) {\\n registers.PC = registers.PC + 1;\\n}\\n\" % mne.upper()\n", jb302@14: "\n", jb302@14: "# print function definitions\n", jb302@14: "#for mne in mne_set:\n", jb302@14: "# print \"void\\n%s(void);\\n\" % mne.upper()\n" jb302@14: ], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@18: "outputs": [] jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@18: "input": [], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@18: "outputs": [] jb302@14: }, jb302@14: { jb302@14: "cell_type": "code", jb302@14: "collapsed": false, jb302@14: "input": [], jb302@14: "language": "python", jb302@14: "metadata": {}, jb302@1: "outputs": [] jb302@1: } jb302@1: ], jb302@1: "metadata": {} jb302@1: } jb302@1: ] jb302@1: }