Skip to content

Instantly share code, notes, and snippets.

@phase
Created June 1, 2016 02:38
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phase/d94b0da24fca9b7b458804f105a3d71b to your computer and use it in GitHub Desktop.
Save phase/d94b0da24fca9b7b458804f105a3d71b to your computer and use it in GitHub Desktop.
The worst Python code I've ever seen.
import time
def ALU(A,B,IA,IB,Cin,OR,FC):
preC,Carry,C=[0 for i in range(len(A)+1)],[0 for i in range(len(A)+2)],[0 for i in range(len(A)+1)]
for i in range(len(A)):
if IA:
if A[i] == 1:
A[i] = 0
else:
A[i] = 1
if IB:
if B[i] == 1:
B[i] = 0
else:
B[i] = 1
A=[0]+A
B=[0]+B
if Cin or FC:
Carry[len(A)]=1
else:
Carry[len(A)]=0
i=len(A)-1
while i != 0:
if (A[i]&B[i])==1:
if not OR:
Carry[i]=1
else:
preC[i]=1
elif (A[i]|B[i])==1:
preC[i]=1
if FC:
Carry[i]=1
if (preC[i]&Carry[i+1])==1:
Carry[i]=1
elif (preC[i]|Carry[i+1])==1:
C[i]=1
i-=1
i=0
out=[]
while i != len(A):
if i != 0:
out.append(bool(C[i]))
i+=1
return out,Carry[1]
def convertTo(Value,MaxValue):
j=0
i=1
while j!=MaxValue-1:
i*=2
j+=1
output=[]
while i!=1:
if Value>=i:
Value-=i
output.append(True)
else:
output.append(False)
i=int(i/2)
if Value>=i:
Value-=i
output.append(True)
else:
output.append(False)
return output
'''ROM = ["LOAD 0 255",
"LOAD 1 0",
"ADD 0 1",
"PRNT 0 ",
"HALT ",
]'''
#FIBONACCI
ROM = ["LOAD 0 1",
"LOAD 2 10",
"ADD 0 1",
"JMPIF 2 1",
"PRNT 0 ",
"ADD 1 0",
"JMPIF 2 1",
"PRNT 1 ",
"LOAD 2 1",
"JMP 2 ",
"HALT ",
]
INFO =["LOAD ID VALUE ",#LOAD Number_ID_of_the_REGS[SLOT] Value_Goes_into_that_SLOT/
"ADD ID ID ",#ADD Number_ID_of_the_REGS[SLOT]_as_A Number_ID_of_the_REGS[SLOT]_as_B Then_Is_Added_A_and_B_and_oututs_to_A's_ID
"SUB ID ID ",#ADD Number_ID_of_the_REGS[SLOT]_as_A Number_ID_of_the_REGS[SLOT]_as_B Then_Is_Subtracted_A_and_B_and_oututs_to_A's_ID
"PRNT ID ",#PRINT Number_ID_of_the_REGS[SLOT]_to_Debug_Print
"DETC ID ID ",#DETECT Number_ID_of_the_REGS[SLOT]_as_A Number_ID_of_the_REGS[SLOT]_as_B Then_Is_Subtracted_A_and_B_and_outputs_to_REGS[5](FLAG)
"JMPIF ID FGVALUE",#JUMPIF Number_ID_of_the_REGS[SLOT]_to_JUMP_To Number_ID_of_the_REGS[SLOT]_compared_to_REGS[5](FLAGS)
"JMP ID ",#JUMP Number_ID_of_the_REGS[SLOT]_to_JUMP_To
"HALT ",#HALT STOPS_THE_PROGRAM
"WRAM ID ID ",#WRITE_RAM Number_ID_of_the_REGS[SLOT]_for_RAMPOS Number_ID_of_the_REGS[SLOT]_for_RAMPOS_to_write
"RRAM ID ID ",#READ_RAM Number_ID_of_the_REGS[SLOT]_for_RAMPOS Number_ID_of_the_REGS[SLOT]_for_RAMPOS_to_read
]
RAM=[[False,False,False,False,False,False,False,False] for x in range(65536*64+65536)]
REGS=[[False,False,False,False,False,False,False,False] for x in range(8)]
#print(RAM)
print((len(RAM)*8)/1024/1024,"MB of RAM")
PC=0x00
running=1
delay=0
while running:
Line=ROM[PC].split()
#print(PC,Line)
#for i in range(8):
# print(REGS[i])
if Line[0] == "LOAD":
REGS[int(Line[1])]=convertTo(int(Line[2]),8)
PC+=1
elif Line[0] == "ADD":
REGS[int(Line[1])],o=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,0,0,0,0)
REGS[5]=convertTo(o,8)
PC+=1
elif Line[0] == "SUB":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,1,0,0)
PC+=1
elif Line[0] == "OR":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,0,0,1,0)
PC+=1
elif Line[0] == "NOR":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,0,1,0)
PC+=1
elif Line[0] == "XOR":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],1,1,0,0,1)
PC+=1
elif Line[0] == "XNOR":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,0,0,1)
PC+=1
elif Line[0] == "AND":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],1,1,1,1,1)
PC+=1
elif Line[0] == "NAND":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,1,1,1)
PC+=1
elif Line[0] == "INV":
REGS[int(Line[1])],none=ALU(REGS[int(Line[1])],[0,0,0,0,0,0,0,0],1,0,0,0,0)
PC+=1
elif Line[0] == "PRNT":
temp=[]
for i in range(8):
temp.append(int(REGS[int(Line[1])][i]))
print(temp)
PC+=1
elif Line[0] == "DETC":
l,o=ALU(REGS[int(Line[1])],REGS[int(Line[2])],0,1,1,0,0)
#print(l,o)
REGS[5]=convertTo(o,8)
if l == convertTo(0,8):
REGS[5]=convertTo(2,8)
PC+=1
elif Line[0] == "JMP":
PC=0
k=128
for i in range(8):
PC=int(PC)+int(int(REGS[int(Line[1])][i])*k)
k/=2
elif Line[0] == "JMPIF":
j=0
k=128
for i in range(8):
j=int(j)+int(int(REGS[int(Line[1])][i])*k)
k/=2
d=Line[2]
o=0
k=128
for i in range(8):
o=int(o)+int(int(REGS[5][i])*k)
k/=2
#print(j,d,o)
if int(d)==int(o):
PC=j
else:
PC+=1
elif Line[0] == "HALT":
running=0
time.sleep(delay)
print("CPU HALTED!!")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment