Add micro-instructions IFEQ and IFLT

This commit is contained in:
Loic GUEGAN 2018-09-01 23:23:19 +02:00
parent 4a9d274fd7
commit cec2994481
2 changed files with 40 additions and 3 deletions

View file

@ -145,6 +145,26 @@ class Microprogram:
elif opcode==ijvm["OUT"]:
self.fetch();self.c["PC"]+=1 # Fetch byte to push in MBR
print(str(chr(self.c["MBRU"])),end="") # MBRU because no char which are negative
elif opcode==ijvm["IFEQ"]:
self.c["SP"]=self.c["SP"]-1
self.c["MAR"]=self.c["SP"]
self.c["OPC"]=self.c["TOS"]
self.rd()
self.c["TOS"]=self.c["MDR"]
if self.c["OPC"]==0:
self.T()
else:
self.F()
elif opcode==ijvm["IFLT"]:
self.c["SP"]=self.c["SP"]-1
self.c["MAR"]=self.c["SP"]
self.c["OPC"]=self.c["TOS"]
self.rd()
self.c["TOS"]=self.c["MDR"]
if self.c["OPC"]<0:
self.T()
else:
self.F()
elif opcode==ijvm["HALT"]:
return(1)
else:
@ -154,6 +174,19 @@ class Microprogram:
raise RuntimeError("Instruction {} not found on address {}".format(opcode,self.c["PC"]-1))
return(0)
def T(self): # This function is here just to follow ijvm implementation of "Structured Computer Organization"
self.fetch();self.c["PC"]+=1 # exactly like GOTO implementation
self.c["OPC"]=self.c["PC"]-1 # exactly like GOTO implementation
###### GOTO2 #####
self.c["H"]=self.c["MBR"]<<8
self.fetch();self.c["PC"]+=1 # Fetch second byte
self.c["H"]=self.c["MBRU"]|self.c["H"]
self.c["PC"]=self.c["OPC"]+self.c["H"]
##################
def F(self): # This function is here just to follow ijvm implementation of "Structured Computer Organization"
self.fetch();self.c["PC"]+=1 # Needed because memory access take 1 cycle in simulation
self.c["PC"]=self.c["PC"]+1
def dump(self):
"""
Print RAM, stack and registers

10
ram.txt
View file

@ -1,5 +1,9 @@
BIPUSH
-4
IFLT
0
4
BIPUSH
6
BIPUSH
7
BIPUSH
8
IADD