aboutsummaryrefslogtreecommitdiff
path: root/components/microprogram.py
blob: f415fcf84d48e503f1924b50616f0ef3926477db (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103

from components.ijvm import ijvm

class Microprogram:
	
	def __init__(self,components):
		self.c=components
		if self.c["RAM"]==None:
			raise RuntimeError("Microprogram initialization fail, RAM is not initialized")
	
	def run(self):
		self.c["LV"]=(1024)# Place stack to 1024
		self.c["SP"]=(1024-1) # Init SP to LV-1 (because otherwise first element of the stack will be enty because of BIPUSH impl
		
		for i in range(1,30): # Launche first 30 insctructions
			self.fetch() # Fetch
			self.c["PC"]+=1 # INC PC
			self.exec() # Execute opcode
			
	def fetch(self):
		opcode=self.c["RAM"].fetch()
		self.c["MBR"]=opcode # Opcode to MBR
		
	def rd(self):
		data=self.c["RAM"].read()
		self.c["MDR"]=data
		
	def wr(self):
		self.c["RAM"].write()

	def exec(self):# link: https://users-cs.au.dk/bouvin/dComArk/2015/noter/Note_2/#Instructions
		opcode=self.c["MBR"] # Get loaded OpCode
		if opcode==ijvm["NOP"]: # NOP
			pass
		elif opcode==ijvm["BIPUSH"]: # BIPUSH
			self.fetch();self.c["PC"]+=1 # Fetch byte to push in MBR
			self.c["SP"]+=1 # Increment stack pointer
			self.c["MAR"]=self.c["SP"] # Copy SP to MAR
			self.c["MDR"]=self.c["MBR"] # Set MDR to MBR
			self.c["TOS"]=self.c["MBR"] # Set MDR to MBR
			self.wr() # Write data to stack
		elif opcode==ijvm["IADD"]:
			self.c["SP"]-=1
			self.c["MAR"]=self.c["SP"]
			self.c["H"]=self.c["TOS"]
			self.rd()
			self.c["TOS"]=self.c["MDR"]+self.c["H"]
			self.c["MDR"]=self.c["TOS"]
			self.wr()
		elif opcode==ijvm["ISUB"]:
			self.c["SP"]-=1
			self.c["MAR"]=self.c["SP"]
			self.c["H"]=self.c["TOS"]
			self.rd()
			self.c["TOS"]=self.c["MDR"]-self.c["H"]
			self.c["MDR"]=self.c["TOS"]
			self.wr()
		elif opcode==ijvm["POP"]:
			self.c["SP"]-=1
			self.c["MAR"]=self.c["SP"]
			self.rd()
			self.c["TOS"]=self.c["MDR"]
		elif opcode==ijvm["DUP"]:
			self.c["SP"]+=1
			self.c["MAR"]=self.c["SP"]
			self.c["MDR"]=self.c["TOS"]
			self.wr()
		elif opcode==ijvm["IAND"]:
			self.c["SP"]-=1
			self.c["MAR"]=self.c["SP"]
			self.c["H"]=self.c["TOS"]
			self.rd()
			self.c["TOS"]=(self.c["MDR"] and self.c["H"])
			self.c["MDR"]=self.c["TOS"]
			self.wr()
		elif opcode==ijvm["IOR"]:
			self.c["SP"]-=1
			self.c["MAR"]=self.c["SP"]
			self.c["H"]=self.c["TOS"]
			self.rd()
			self.c["TOS"]=(self.c["MDR"] or self.c["H"])
			self.c["MDR"]=self.c["TOS"]
			self.wr()
		elif opcode==ijvm["SWAP"]:
			self.c["MAR"]=self.c["SP"]-1
			self.rd()
			self.c["MAR"]=self.c["SP"]
			self.c["H"]=self.c["MDR"]
			self.wr()
			self.c["MDR"]=self.c["TOS"]
			self.c["MAR"]=self.c["SP"]-1
			self.wr()
			self.c["TOS"]=self.c["H"]
		else:
			if opcode in ijvm:
				print("Instruction {} not yet implemented.".format(ijvm[opcode]))
			else:
				raise RuntimeError("Instruction {} not found".format(opcode))
	
	def dump(self):
		print("---------- Stack ----------")
		self.c["RAM"].dump(self.c["LV"],self.c["SP"])
		print("---------------------------")