Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from math import sqrt
- from random import randint
- ram = [0] * 65536
- a = 0
- b = 0
- pc = 0
- pa = 0
- executed = 0
- free_mem = 0
- append = False
- program = False
- exceptions = ["","reset","run","?","program","ram","mem"]
- def ram_adjust():
- global a,b
- for i in range(len(ram)):
- if ram[i] > 255:
- ram[i] = 0
- elif ram[i] < 0:
- ram[i] = 255
- if a > 255:
- a = 0
- elif a < 0:
- a = 255
- if b > 255:
- b = 0
- elif b < 0:
- b = 255
- print("Mikro-Un 0.2 | 2023 | Use '?' for help")
- while True:
- ram_adjust()
- command = input(">>>")
- if command == "?":
- print("Mikro-Un is a text-based virtual computer with 64 kB of RAM.")
- print("\nThe computer has a built in assembler with its own assembly")
- print("code. Below is a list of all 35 avalible commands (AAAA =")
- print("Address, VV = Value):")
- print("\nLDAA AAAA | LoaD A w/ Address")
- print("LDAV VV | LoaD A w/ Value")
- print("STOA AAAA | STore A in Address")
- print("LDBA AAAA | LoaD B w/ Address")
- print("LDBV VV | LoaD B w/ Value")
- print("STOB AAAA | STore B in address")
- print("INCA/B | INcrement A/B")
- print("DECA/B | DEcrement A/B")
- print("ADDI | A+B")
- print("SUB1 | A-B")
- print("SUB2 | B-A")
- print("MULT | A×B")
- print("DIV1 | A÷B - Floor Divide")
- print("DIV2 | B÷A - Floor Divide")
- print("MOD1 | A%B")
- print("MOD2 | B%A")
- print("EXP1 | A^B")
- print("EXP2 | B^A")
- print("SQRT | Square Root of A, rounded as integer")
- print("BRAN AAAA | BRanch Always")
- print("BREQ AAAA | Branch if EQual to Address (A == Address)")
- print("BRNE AAAA | Branch if Not Equal to Address (A != Address)")
- print("BRLT AAAA | Branch if Less Than Address (A < Address)")
- print("BRGT AAAA | Branch if Greater Than Address (A > Address)")
- print("BRZE AAAA | Branch if ZEro Address (Address == 0)")
- print("BRNZ AAAA | Branch if Not Zero Address (Address != 0)")
- print("INPA/B | Numerical INPut A/B")
- print("NUOA/B | NUMerical Output A/B")
- print("ASOA/B | ASCii Output A/B")
- print("SWAP | SWAP A and B (a=b and b=a)")
- print("\nFor arithmetic, the result is stored in A. There's a random")
- print("integer in 0xffff that changes value every instruction cycle")
- print("too. The assembler commands outside of programming are:")
- print("\nreset | Reset all of RAM to 0x0")
- print("run | Run current program, starts from address 0x0")
- print("program | Actually begin to program something")
- print("ram | Displays all 65536 bytes of RAM and both registers")
- print("mem | Displays free memory space")
- print("back | Exits program mode")
- elif command == "ram":
- for i in range(len(ram)):
- if i%8 == 0:
- 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])} ")
- print(f"Registers: A={hex(a)} | B={hex(b)}")
- elif command == "reset":
- ram = [255] * 65536
- program_content = []
- elif command == "mem":
- for i in ram:
- if ram[pc] == 0:
- free_mem += 1
- print(f"{free_mem}/65536 avalible bytes ({free_mem/1024}/64 kilobytes)")
- elif command == "program":
- pa = int(input("Where to start programming? 0x"),16)
- program = True
- if pa > 65536:
- pa = 65536
- while program:
- instruction = input(f"{hex(pa)} >>>")
- try:
- code = instruction[0:4]
- operand = instruction[5:9]
- except:
- print(f"Command Not Found: {command}")
- code = None
- operand = None
- continue
- if code == "LDAA":
- ram[pa] = 1
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "LDAV":
- ram[pa] = 2
- ram[pa+1] = int(operand[0:2],16)
- pa += 2
- elif code == "STOA":
- ram[pa] = 3
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "LDBA":
- ram[pa] = 4
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "LDBV":
- ram[pa] = 5
- ram[pa+1] = int(operand[0:2],16)
- pa += 2
- elif code == "STOB":
- ram[pa] = 6
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "INCA":
- ram[pa] = 7
- pa += 1
- elif code == "INCB":
- ram[pa] = 8
- pa += 1
- elif code == "DECA":
- ram[pa] = 9
- pa += 1
- elif code == "DECB":
- ram[pa] = 10
- pa += 1
- elif code == "ADDI":
- ram[pa] = 11
- pa += 1
- elif code == "SUB1":
- ram[pa] = 12
- pa += 1
- elif code == "SUB2":
- ram[pa] = 13
- pa += 1
- elif code == "MULT":
- ram[pa] = 14
- pa += 1
- elif code == "DIV1":
- ram[pa] = 15
- pa += 1
- elif code == "DIV2":
- ram[pa] = 16
- pa += 1
- elif code == "MOD1":
- ram[pa] = 17
- pa += 1
- elif code == "MOD2":
- ram[pa] = 18
- pa += 1
- elif code == "EXP1":
- ram[pa] = 19
- pa += 1
- elif code == "EXP2":
- ram[pa] = 20
- pa += 1
- elif code == "SQRT":
- ram[pa] = 21
- pa += 1
- elif code == "BRAN":
- ram[pa] = 22
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "BREQ":
- ram[pa] = 23
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "BRNE":
- ram[pa] = 24
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "BRLT":
- ram[pa] = 25
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "BRGT":
- ram[pa] = 26
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "BRZE":
- ram[pa] = 27
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "BRNZ":
- ram[pa] = 28
- ram[pa+1] = int(operand[0:2],16)
- ram[pa+2] = int(operand[2:4],16)
- pa += 3
- elif code == "INPA":
- ram[pa] = 29
- pa += 1
- elif code == "INPB":
- ram[pa] = 30
- pa += 1
- elif code == "NUOA":
- ram[pa] = 31
- pa += 1
- elif code == "NUOB":
- ram[pa] = 32
- pa += 1
- elif code == "ASOA":
- ram[pa] = 33
- pa += 1
- elif code == "ASOB":
- ram[pa] = 34
- pa += 1
- elif code == "SWAP":
- ram[pa] = 35
- pa += 1
- elif instruction == "back":
- append = False
- program = False
- elif command == "run":
- pc = 0
- print("Executing...")
- while ram[pc] != 0:
- temp = 0
- ram[0xffff] = randint(0,255)
- if ram[pc] == 1:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- a = ram[temp]
- pc += 3
- elif ram[pc] == 2:
- temp += ram[pc+1]
- a = temp
- pc += 2
- elif ram[pc] == 3:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- ram[temp] = a
- pc += 3
- elif ram[pc] == 4:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- b = ram[temp]
- pc += 3
- elif ram[pc] == 5:
- temp += ram[pc+1]
- b = temp
- pc += 2
- elif ram[pc] == 6:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- ram[temp] = b
- pc += 3
- elif ram[pc] == 7:
- a += 1
- pc += 1
- elif ram[pc] == 8:
- b += 1
- pc += 1
- elif ram[pc] == 9:
- a -= 1
- pc += 1
- elif ram[pc] == 10:
- b -= 1
- pc += 1
- elif ram[pc] == 11:
- for i in range(b):
- a += 1
- pc += 1
- elif ram[pc] == 12:
- for i in range(b):
- a -= 1
- pc += 1
- elif ram[pc] == 13:
- for i in range(b):
- a = b-1
- pc += 1
- elif ram[pc] == 14:
- for i in range(b):
- a += b
- pc += 1
- elif ram[pc] == 15:
- a //= b
- pc += 1
- elif ram[pc] == 16:
- a = b//a
- pc += 1
- elif ram[pc] == 17:
- a %= b
- pc += 1
- elif ram[pc] == 18:
- a = b%a
- pc += 1
- elif ram[pc] == 19:
- for i in range(b):
- a *= b
- pc += 1
- elif ram[pc] == 20:
- for i in range(b):
- a = b**a
- pc += 1
- elif ram[pc] == 21:
- a = int(round(sqrt(a)))
- pc += 1
- elif ram[pc] == 22:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- pc = temp
- elif ram[pc] == 23:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- if a == ram[temp]:
- pc = temp
- elif ram[pc] == 24:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- if a != ram[temp]:
- pc = temp
- elif ram[pc] == 25:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- if a < ram[temp]:
- pc = temp
- elif ram[pc] == 26:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- if a > ram[temp]:
- pc = temp
- elif ram[pc] == 27:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- if a == 0:
- pc = temp
- elif ram[pc] == 28:
- temp += ram[pc+1] * 0x100 +ram[pc+2]
- if a != 0:
- pc = temp
- elif ram[pc] == 29:
- a = int(input("(0-255) A = "))
- pc += 1
- elif ram[pc] == 30:
- b = int(input("(0-255) B = "))
- pc += 1
- elif ram[pc] == 31:
- print(a,end="")
- pc += 1
- elif ram[pc] == 32:
- print(b,end="")
- pc += 1
- elif ram[pc] == 33:
- print(chr(a),end="")
- pc += 1
- elif ram[pc] == 34:
- print(chr(b),end="")
- pc += 1
- elif ram[pc] == 35:
- temp = a
- a = b
- b = temp
- pc += 1
- ram_adjust()
- print(f"\nExecution ended at {hex(pc)}")
- else:
- print(f"Command not found: {command}")
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement