Advertisement
bf17

NoRAL - interpreter

Sep 5th, 2017
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.10 KB | None | 0 0
  1. # python 3 on Pythonista, iPad Pro
  2. # latest update: 20180809
  3. '''
  4. Memory:          0000 - ffff
  5. Program Counter  0000 - 0001    (starts at 0200)
  6. Carry Flag       0002
  7. Zero Flag        0003
  8. Top of Stack     0004
  9. Stack            0005 - 00ff    251 bytes
  10. Screen Memory    0100 - 01ff    32 x 8, 256 bytes
  11. Start of program memory: 0200
  12. '''
  13.  
  14. from array import array
  15.  
  16. mem = array('B')
  17. mem = [0] * 0x10000
  18.  
  19. start_of_prog = prog_mem = pc = 0x0200
  20. prog_list = ""
  21. complete_listing = ""
  22. dest = 0
  23. src = 0
  24. ind_src = 0 #indirect source used in mvi
  25. scr_char = 0
  26. sp = 5 # start of stack memory, variable for incase it changes
  27.  
  28. # definitions -------------------------
  29. def sto_pc(): #put pc into memory as if it was used from there
  30.     mem[0] = pc >> 8
  31.     mem[1] = pc & 255
  32.  
  33. def show_registers():
  34.     print()
  35.     print("Program Counter: ",   '{:04x}'.format(pc))
  36.     print("Zero Flag:         ", '{:02x}'.format(mem[3]))
  37.     print("Carry Flag:        ", '{:02x}'.format(mem[2]))
  38.     print("Stack Pointer:     ", '{:02x}'.format(mem[4]))
  39.  
  40. def printable(n):
  41.    if((n>31 and n<127)):
  42.        return(True)
  43.    else:
  44.        return(False)
  45.  
  46. def show_screen():
  47.     print()
  48.     print("+--------Screen Display----------+")
  49.     for i in range(8):
  50.         print("|", end = "")
  51.         for j in range(32):
  52.             scr_char = mem[256 + i * 32 + j]
  53.             if(printable(scr_char)):
  54.                 print(chr(scr_char), end = "")
  55.             else:
  56.                 print(" ", end = "")
  57.         print("|")
  58.     print("+" + "-" * 32 + "+\n", end = "")
  59.  
  60. def show_stack():
  61.     print()
  62.     for i in range(0, 8):
  63.         print('{:02x}'.format(mem[i + 5]) + " ", end = "")
  64.     print()
  65.     for i in range(8, 16):
  66.         print('{:02x}'.format(mem[i + 5]) + " ", end = "")
  67.     print()
  68.     for i in range(16, 24):
  69.         print('{:02x}'.format(mem[i + 5]) + " ", end = "")
  70.     print()
  71.  
  72. def debug_listing():
  73.     print()
  74.     for i in range(512, prog_mem):
  75.         print('{:04x}'.format(i), '{:02x}'.format(mem[i]))
  76.         i += 1
  77.  
  78. # read program into memory
  79. #f = open(input("NoRAL file: "), 'r')
  80. f = open("a.txt", 'r')
  81. for line in f:
  82.     if(line[:1] != "#"): # check for comments
  83.         for word in line.split():
  84.             prog_list = prog_list + " " + word
  85. f.close()
  86.  
  87. # convert mnemonics to opcodes and memory references
  88. for word in prog_list.split():
  89.     if (word == "add"):
  90.         mem[prog_mem] = 1
  91.         prog_mem += 1        
  92.     elif(word == "and"):
  93.         mem[prog_mem] = 2
  94.         prog_mem += 1
  95.     elif(word == "jmp"):
  96.         mem[prog_mem] = 3
  97.         prog_mem += 1
  98.     elif(word == "jpc"):
  99.         mem[prog_mem] = 4
  100.         prog_mem += 1
  101.     elif(word == "jpz"):
  102.         mem[prog_mem] = 5
  103.         prog_mem += 1
  104.     elif(word == "jsr"):
  105.         mem[prog_mem] = 6
  106.         prog_mem += 1
  107.     elif(word == "mov"):
  108.         mem[prog_mem] = 7
  109.         prog_mem += 1
  110.     elif(word == "nop"):
  111.         mem[prog_mem] = 8
  112.         prog_mem += 1
  113.     elif(word == "not"):
  114.         mem[prog_mem] = 9
  115.         prog_mem += 1
  116.     elif(word == "orr"):
  117.         mem[prog_mem] = 10
  118.         prog_mem += 1
  119.     elif(word == "pop"):
  120.         mem[prog_mem] = 11
  121.         prog_mem += 1
  122.     elif(word == "psh"):
  123.         mem[prog_mem] = 12
  124.         prog_mem += 1
  125.     elif(word == "ret"):
  126.         mem[prog_mem] = 13
  127.         prog_mem += 1
  128.     elif(word == "shl"):
  129.         mem[prog_mem] = 14
  130.         prog_mem += 1
  131.     elif(word == "shr"):
  132.         mem[prog_mem] = 15
  133.         prog_mem += 1
  134.     elif(word == "sto"):
  135.         mem[prog_mem] = 16
  136.         prog_mem += 1
  137.     elif(word == "sub"):
  138.         mem[prog_mem] = 17
  139.         prog_mem += 1
  140.     elif(word == "inc"):
  141.         mem[prog_mem] = 18
  142.         prog_mem += 1
  143.     elif(word == "dec"):
  144.         mem[prog_mem] = 19
  145.         prog_mem += 1
  146.     elif(word == "mvi"):
  147.         mem[prog_mem] = 20
  148.         prog_mem += 1
  149.     elif(word == "get"):
  150.         mem[prog_mem] = 21
  151.         prog_mem += 1
  152.     elif(word == "dsp"):
  153.         mem[prog_mem] = 22
  154.         prog_mem += 1
  155.     elif(word == "brk"):
  156.         mem[prog_mem] = 0
  157.         prog_mem += 1
  158.     else:
  159.         if(len(word) == 4): # 2 byte memory references
  160.             mem[prog_mem] = int(word[:2], 16)
  161.             prog_mem += 1
  162.             mem[prog_mem] = int(word[2:], 16)
  163.             prog_mem += 1
  164.         else:               # 1 byte memory references
  165.             mem[prog_mem] = int(word, 16)
  166.             prog_mem += 1
  167.  
  168. print()
  169.  
  170. # interpret instructions
  171. # xxx dest src
  172. # reset pc to start_of_prog
  173. pc = start_of_prog
  174.  
  175. while True:
  176.     dest = mem[pc + 1] * 256 + mem[pc + 2]# these are used for most
  177.     src  = mem[pc + 3] * 256 + mem[pc + 4]#  of the instructions
  178. #add 01
  179.     if(mem[pc] ==  1):
  180.         mem[2] = int((mem[dest] + mem[src]) != (mem[dest] + mem[src]) % 256)
  181.         mem[dest] = (mem[dest] + mem[src] + mem[2]) % 256
  182.         mem[3] = int(mem[dest] == 0)
  183.         pc += 5
  184. #and 02
  185.     elif(mem[pc] ==  2):
  186.         mem[dest] = mem[dest] & mem[src]
  187.         mem[3] = int(mem[dest] == 0)
  188.         pc += 5
  189. #jmp 03
  190.     elif(mem[pc] ==  3):
  191.         pc = dest
  192. #jpc 04
  193.     elif(mem[pc] ==  4):
  194.         if(mem[2] == 1):
  195.             pc = dest
  196.         else:
  197.             pc += 3
  198. #jpz 05
  199.     elif(mem[pc] ==  5):
  200.         if(mem[3] == 1):
  201.             pc = dest
  202.         else:
  203.             pc += 3
  204. #jsr 06
  205.     elif(mem[pc] ==  6):
  206.         mem[sp + mem[4]] = int(pc / 256) % 256
  207.         mem[4] += 1 # stack pointer
  208.         mem[sp + mem[4]] = (pc % 256) + 3
  209.         mem[4] += 1
  210.         pc = dest
  211. #mov 07
  212.     elif(mem[pc] ==  7):
  213.         mem[dest] = mem[src]
  214.         mem[3] = int(mem[dest] == 0)
  215.         pc += 5
  216. #nop 08
  217.     elif(mem[pc] ==  8):
  218.         pc += 1
  219. #not 09
  220.     elif(mem[pc] ==  9):
  221.         mem[dest] = (255 - mem[dest]) % 256
  222.         mem[3] = int(mem[dest] == 0)
  223.         pc += 3
  224. #orr 0a
  225.     elif(mem[pc] == 10):
  226.         mem[dest] = mem[dest] | mem[src]
  227.         mem[3] = int(mem[dest] == 0)
  228.         pc += 5
  229. #pop 0b
  230.     elif(mem[pc] == 11):
  231.         mem[4] -= 1
  232.         mem[dest] = mem[mem[4] + 5]
  233.         mem[3] = int(mem[dest] == 0)
  234.         pc += 3
  235. #psh 0c
  236.     elif(mem[pc] == 12):
  237.         mem[mem[4] + 5] = mem[dest]
  238.         mem[4] += 1
  239.         pc += 3
  240. #ret 0d
  241.     elif(mem[pc] == 13):
  242.         mem[4] -= 2
  243.         pc = mem[sp + mem[4]] * 256 + mem[sp + 1 + mem[4]]
  244. #shl 0e
  245.     elif(mem[pc] == 14):
  246.         mem[2] = int((mem[dest] & 128) > 0)
  247.         mem[dest] = (mem[dest] << 1) % 256
  248.         mem[3] = int(mem[dest] == 0)
  249.         pc += 3
  250. #shr 0f
  251.     elif(mem[pc] == 15):
  252.         mem[2] = mem[dest] & 1
  253.         mem[dest] = mem[dest] >> 1
  254.         mem[3] = int(mem[dest] == 0)
  255.         pc += 3
  256. #sto 10
  257.     elif(mem[pc] == 16):
  258.         src = pc + 3
  259.         mem[dest] = mem[pc + 3]
  260.         mem[3] = int(mem[dest] == 0)
  261.         pc += 4
  262. #sub 11
  263.     elif(mem[pc] == 17):
  264.         mem[2] = int((mem[dest] - mem[src]) != (mem[dest] - mem[src]) % 256)
  265.         mem[dest] = (mem[dest] - mem[src] - mem[2]) % 256
  266.         mem[3] = int(mem[dest] == 0)
  267.         pc += 5
  268. #inc 12
  269.     elif(mem[pc] == 18):
  270.         mem[2] = int((mem[dest] + 1) != (mem[dest] + 1) % 256)
  271.         mem[dest] = (mem[dest] + 1) % 256
  272.         mem[3] = int(mem[dest] == 0)
  273.         pc += 3
  274. #dec 13    
  275.     elif(mem[pc] == 19):
  276.         mem[2] = int((mem[dest] - 1) != (mem[dest] - 1) % 256)
  277.         mem[dest] = (mem[dest] - 1) % 256
  278.         mem[3] = int(mem[dest] == 0)
  279.         pc += 3
  280. #mvi 14 - absolute, indirect
  281.     elif(mem[pc] == 20):
  282.         ind_src = mem[src] * 256 + mem[src + 1]
  283.         mem[dest] = mem[ind_src]
  284.         mem[3] = int(mem[dest] == 0)
  285.         pc += 5
  286. #get 15 - m1(absolute) = input decimal number mod 256
  287.     elif(mem[pc] == 21):
  288.         mem[dest] = int(input("Enter Decimal Number: ")) % 256
  289.         mem[3] = int(mem[dest] == 0)
  290.         pc += 3
  291. #dsp 16 - display during program execution
  292.     elif(mem[pc] == 22):
  293.         show_registers()
  294.         show_screen()
  295.         pc += 1
  296. #brk 00 - or no more instructions
  297.     else:
  298.         if(mem[pc] == 0):
  299.             pc += 1
  300.             show_registers()
  301. #            show_stack()
  302.             show_screen()
  303. #            debug_listing()
  304.             break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement