Advertisement
Guest User

Mikro-Un.py

a guest
May 16th, 2023
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 8.71 KB | None | 0 0
  1. from math import sqrt
  2. from random import randint
  3.  
  4. ram = [0] * 65536
  5. a = 0
  6. b = 0
  7. pc = 0
  8. pa = 0
  9. executed = 0
  10. free_mem = 0
  11. append = False
  12. program = False
  13. exceptions = ["","reset","run","?","program","ram","mem"]
  14.  
  15. def ram_adjust():
  16.     global a,b
  17.    
  18.     for i in range(len(ram)):
  19.         if ram[i] > 255:
  20.             ram[i] = 0
  21.         elif ram[i] < 0:
  22.             ram[i] = 255
  23.    
  24.     if a > 255:
  25.         a = 0
  26.     elif a < 0:
  27.         a = 255
  28.  
  29.     if b > 255:
  30.         b = 0
  31.     elif b < 0:
  32.         b = 255
  33.  
  34.  
  35. print("Mikro-Un 0.2 | 2023 | Use '?' for help")
  36. while True:
  37.     ram_adjust()
  38.     command = input(">>>")
  39.        
  40.     if command == "?":
  41.         print("Mikro-Un is a text-based virtual computer with 64 kB of RAM.")
  42.         print("\nThe computer has a built in assembler with its own assembly")
  43.         print("code. Below is a list of all 35 avalible commands (AAAA =")
  44.         print("Address, VV = Value):")
  45.         print("\nLDAA AAAA | LoaD A w/ Address")
  46.         print("LDAV VV | LoaD A w/ Value")
  47.         print("STOA AAAA | STore A in Address")
  48.         print("LDBA AAAA | LoaD B w/ Address")
  49.         print("LDBV VV | LoaD B w/ Value")
  50.         print("STOB AAAA | STore B in address")
  51.         print("INCA/B | INcrement A/B")
  52.         print("DECA/B | DEcrement A/B")
  53.         print("ADDI | A+B")
  54.         print("SUB1 | A-B")
  55.         print("SUB2 | B-A")
  56.         print("MULT | A×B")
  57.         print("DIV1 | A÷B - Floor Divide")
  58.         print("DIV2 | B÷A - Floor Divide")
  59.         print("MOD1 | A%B")
  60.         print("MOD2 | B%A")
  61.         print("EXP1 | A^B")
  62.         print("EXP2 | B^A")
  63.         print("SQRT | Square Root of A, rounded as integer")
  64.         print("BRAN AAAA | BRanch Always")
  65.         print("BREQ AAAA | Branch if EQual to Address (A == Address)")
  66.         print("BRNE AAAA | Branch if Not Equal to Address (A != Address)")
  67.         print("BRLT AAAA | Branch if Less Than Address (A < Address)")
  68.         print("BRGT AAAA | Branch if Greater Than Address (A > Address)")
  69.         print("BRZE AAAA | Branch if ZEro Address (Address == 0)")
  70.         print("BRNZ AAAA | Branch if Not Zero Address (Address != 0)")
  71.         print("INPA/B | Numerical INPut A/B")
  72.         print("NUOA/B | NUMerical Output A/B")
  73.         print("ASOA/B | ASCii Output A/B")
  74.         print("SWAP | SWAP A and B (a=b and b=a)")
  75.         print("\nFor arithmetic, the result is stored in A. There's a random")
  76.         print("integer in 0xffff that changes value every instruction cycle")
  77.         print("too. The assembler commands outside of programming are:")
  78.         print("\nreset | Reset all of RAM to 0x0")
  79.         print("run | Run current program, starts from address 0x0")
  80.         print("program | Actually begin to program something")
  81.         print("ram | Displays all 65536 bytes of RAM and both registers")
  82.         print("mem | Displays free memory space")
  83.         print("back | Exits program mode")
  84.     elif command == "ram":
  85.         for i in range(len(ram)):
  86.             if i%8 == 0:
  87.                 print(f"{hex(i)} | {hex(ram[i])} {hex(ram[i+1])} {hex(ram[i+2])} {hex(ram[i+3])} {hex(ram[i+4])} {hex(ram[i+5])} {hex(ram[i+6])} {hex(ram[i+7])} ")
  88.         print(f"Registers: A={hex(a)} | B={hex(b)}")
  89.     elif command == "reset":
  90.         ram = [255] * 65536
  91.         program_content = []
  92.     elif command == "mem":
  93.         for i in ram:
  94.             if ram[pc] == 0:
  95.                 free_mem += 1
  96.         print(f"{free_mem}/65536 avalible bytes ({free_mem/1024}/64 kilobytes)")
  97.     elif command == "program":
  98.         pa = int(input("Where to start programming? 0x"),16)
  99.         program = True
  100.         if pa > 65536:
  101.             pa = 65536
  102.        
  103.         while program:
  104.             instruction = input(f"{hex(pa)} >>>")
  105.            
  106.             try:
  107.                 code = instruction[0:4]
  108.                 operand = instruction[5:9]
  109.             except:
  110.                 print(f"Command Not Found: {command}")
  111.                 code = None
  112.                 operand = None
  113.                 continue
  114.            
  115.             if code == "LDAA":
  116.                 ram[pa] = 1
  117.                 ram[pa+1] = int(operand[0:2],16)
  118.                 ram[pa+2] = int(operand[2:4],16)
  119.                 pa += 3
  120.             elif code == "LDAV":
  121.                 ram[pa] = 2
  122.                 ram[pa+1] = int(operand[0:2],16)
  123.                 pa += 2
  124.             elif code == "STOA":
  125.                 ram[pa] = 3
  126.                 ram[pa+1] = int(operand[0:2],16)
  127.                 ram[pa+2] = int(operand[2:4],16)
  128.                 pa += 3
  129.             elif code == "LDBA":
  130.                 ram[pa] = 4
  131.                 ram[pa+1] = int(operand[0:2],16)
  132.                 ram[pa+2] = int(operand[2:4],16)
  133.                 pa += 3
  134.             elif code == "LDBV":
  135.                 ram[pa] = 5
  136.                 ram[pa+1] = int(operand[0:2],16)
  137.                 pa += 2
  138.             elif code == "STOB":
  139.                 ram[pa] = 6
  140.                 ram[pa+1] = int(operand[0:2],16)
  141.                 ram[pa+2] = int(operand[2:4],16)
  142.                 pa += 3
  143.             elif code == "INCA":
  144.                 ram[pa] = 7
  145.                 pa += 1
  146.             elif code == "INCB":
  147.                 ram[pa] = 8
  148.                 pa += 1
  149.             elif code == "DECA":
  150.                 ram[pa] = 9
  151.                 pa += 1
  152.             elif code == "DECB":
  153.                 ram[pa] = 10
  154.                 pa += 1
  155.             elif code == "ADDI":
  156.                 ram[pa] = 11
  157.                 pa += 1
  158.             elif code == "SUB1":
  159.                 ram[pa] = 12
  160.                 pa += 1
  161.             elif code == "SUB2":
  162.                 ram[pa] = 13
  163.                 pa += 1
  164.             elif code == "MULT":
  165.                 ram[pa] = 14
  166.                 pa += 1
  167.             elif code == "DIV1":
  168.                 ram[pa] = 15
  169.                 pa += 1
  170.             elif code == "DIV2":
  171.                 ram[pa] = 16
  172.                 pa += 1
  173.             elif code == "MOD1":
  174.                 ram[pa] = 17
  175.                 pa += 1
  176.             elif code == "MOD2":
  177.                 ram[pa] = 18
  178.                 pa += 1
  179.             elif code == "EXP1":
  180.                 ram[pa] = 19
  181.                 pa += 1
  182.             elif code == "EXP2":
  183.                 ram[pa] = 20
  184.                 pa += 1
  185.             elif code == "SQRT":
  186.                 ram[pa] = 21
  187.                 pa += 1
  188.             elif code == "BRAN":
  189.                 ram[pa] = 22
  190.                 ram[pa+1] = int(operand[0:2],16)
  191.                 ram[pa+2] = int(operand[2:4],16)
  192.                 pa += 3
  193.             elif code == "BREQ":
  194.                 ram[pa] = 23
  195.                 ram[pa+1] = int(operand[0:2],16)
  196.                 ram[pa+2] = int(operand[2:4],16)
  197.                 pa += 3
  198.             elif code == "BRNE":
  199.                 ram[pa] = 24
  200.                 ram[pa+1] = int(operand[0:2],16)
  201.                 ram[pa+2] = int(operand[2:4],16)
  202.                 pa += 3
  203.             elif code == "BRLT":
  204.                 ram[pa] = 25
  205.                 ram[pa+1] = int(operand[0:2],16)
  206.                 ram[pa+2] = int(operand[2:4],16)
  207.                 pa += 3
  208.             elif code == "BRGT":
  209.                 ram[pa] = 26
  210.                 ram[pa+1] = int(operand[0:2],16)
  211.                 ram[pa+2] = int(operand[2:4],16)
  212.                 pa += 3
  213.             elif code == "BRZE":
  214.                 ram[pa] = 27
  215.                 ram[pa+1] = int(operand[0:2],16)
  216.                 ram[pa+2] = int(operand[2:4],16)
  217.                 pa += 3
  218.             elif code == "BRNZ":
  219.                 ram[pa] = 28
  220.                 ram[pa+1] = int(operand[0:2],16)
  221.                 ram[pa+2] = int(operand[2:4],16)
  222.                 pa += 3
  223.             elif code == "INPA":
  224.                 ram[pa] = 29
  225.                 pa += 1
  226.             elif code == "INPB":
  227.                 ram[pa] = 30
  228.                 pa += 1
  229.             elif code == "NUOA":
  230.                 ram[pa] = 31
  231.                 pa += 1
  232.             elif code == "NUOB":
  233.                 ram[pa] = 32
  234.                 pa += 1
  235.             elif code == "ASOA":
  236.                 ram[pa] = 33
  237.                 pa += 1
  238.             elif code == "ASOB":
  239.                 ram[pa] = 34
  240.                 pa += 1
  241.             elif code == "SWAP":
  242.                 ram[pa] = 35
  243.                 pa += 1
  244.             elif instruction == "back":
  245.                 append = False
  246.                 program = False
  247.                
  248.     elif command == "run":
  249.         pc = 0
  250.         print("Executing...")
  251.         while ram[pc] != 0:
  252.             temp = 0
  253.             ram[0xffff] = randint(0,255)
  254.             if ram[pc] == 1:
  255.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  256.                 a = ram[temp]
  257.                 pc += 3
  258.             elif ram[pc] == 2:
  259.                 temp += ram[pc+1]
  260.                 a = temp
  261.                 pc += 2
  262.             elif ram[pc] == 3:
  263.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  264.                 ram[temp] = a
  265.                 pc += 3
  266.             elif ram[pc] == 4:
  267.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  268.                 b = ram[temp]
  269.                 pc += 3
  270.             elif ram[pc] == 5:
  271.                 temp += ram[pc+1]
  272.                 b = temp
  273.                 pc += 2
  274.             elif ram[pc] == 6:
  275.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  276.                 ram[temp] = b
  277.                 pc += 3
  278.             elif ram[pc] == 7:
  279.                 a += 1
  280.                 pc += 1
  281.             elif ram[pc] == 8:
  282.                 b += 1
  283.                 pc += 1
  284.             elif ram[pc] == 9:
  285.                 a -= 1
  286.                 pc += 1
  287.             elif ram[pc] == 10:
  288.                 b -= 1
  289.                 pc += 1
  290.             elif ram[pc] == 11:
  291.                 for i in range(b):
  292.                     a += 1
  293.                 pc += 1
  294.             elif ram[pc] == 12:
  295.                 for i in range(b):
  296.                     a -= 1
  297.                 pc += 1
  298.             elif ram[pc] == 13:
  299.                 for i in range(b):
  300.                     a = b-1
  301.                 pc += 1
  302.             elif ram[pc] == 14:
  303.                 for i in range(b):
  304.                     a += b
  305.                 pc += 1
  306.             elif ram[pc] == 15:
  307.                 a //= b
  308.                 pc += 1
  309.             elif ram[pc] == 16:
  310.                 a = b//a
  311.                 pc += 1
  312.             elif ram[pc] == 17:
  313.                 a %= b
  314.                 pc += 1
  315.             elif ram[pc] == 18:
  316.                 a = b%a
  317.                 pc += 1
  318.             elif ram[pc] == 19:
  319.                 for i in range(b):
  320.                     a *= b
  321.                 pc += 1
  322.             elif ram[pc] == 20:
  323.                 for i in range(b):
  324.                     a = b**a
  325.                 pc += 1
  326.             elif ram[pc] == 21:
  327.                 a = int(round(sqrt(a)))
  328.                 pc += 1
  329.             elif ram[pc] == 22:
  330.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  331.                 pc = temp
  332.             elif ram[pc] == 23:
  333.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  334.                 if a == ram[temp]:
  335.                     pc = temp
  336.             elif ram[pc] == 24:
  337.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  338.                 if a != ram[temp]:
  339.                     pc = temp
  340.             elif ram[pc] == 25:
  341.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  342.                 if a < ram[temp]:
  343.                     pc = temp
  344.             elif ram[pc] == 26:
  345.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  346.                 if a > ram[temp]:
  347.                     pc = temp
  348.             elif ram[pc] == 27:
  349.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  350.                 if a == 0:
  351.                     pc = temp
  352.             elif ram[pc] == 28:
  353.                 temp += ram[pc+1] * 0x100 +ram[pc+2]
  354.                 if a != 0:
  355.                     pc = temp
  356.             elif ram[pc] == 29:
  357.                 a = int(input("(0-255) A = "))
  358.                 pc += 1
  359.             elif ram[pc] == 30:
  360.                 b = int(input("(0-255) B = "))
  361.                 pc += 1
  362.             elif ram[pc] == 31:
  363.                 print(a,end="")
  364.                 pc += 1
  365.             elif ram[pc] == 32:
  366.                 print(b,end="")
  367.                 pc += 1
  368.             elif ram[pc] == 33:
  369.                 print(chr(a),end="")
  370.                 pc += 1
  371.             elif ram[pc] == 34:
  372.                 print(chr(b),end="")
  373.                 pc += 1
  374.             elif ram[pc] == 35:
  375.                 temp = a
  376.                 a = b
  377.                 b = temp
  378.                 pc += 1
  379.            
  380.             ram_adjust()
  381.        
  382.         print(f"\nExecution ended at {hex(pc)}")
  383.     else:
  384.         print(f"Command not found: {command}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement