-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
118 lines (99 loc) · 4.57 KB
/
main.py
File metadata and controls
118 lines (99 loc) · 4.57 KB
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
from kernel import Kernel
from memory import MemoryManagementUnit
from cpu import CPU
class System:
def __init__(self):
self.MMU = MemoryManagementUnit()
self.CPU = CPU(self.MMU)
self.KERNEL = Kernel(self.MMU, self.CPU)
if __name__ == "__main__":
sys = System()
program1 = [
# main
0x05, 0x01, # SET b0 = 1 ; 1-byte registers
0x01, 0x00, 0x05, # MOV r0, 5 ; input
0x01, 0x05, 0xA0, # MOV r5, A0 ; syscall code
0x05, 0x02, # SET b0 = 2 ; 2-byte registers
0x06, 0x16, 0x00, # CALL ; call double function
0x05, 0x01,
0x03, 0x00, # PUSH r0 ; push result safely
0x04, 0x01, # POP r1 ; r1 = result
0x10, 0x05, # SYS r5 ; print r1
0x00, # HALT
# func 1
0x02, 0x00, 0x00, # ADD r0, r0 ; r0 = r0 * 2
0x07, # RET
]
opcode_test = [
# main
0x05, 0x01, # SET b0 = 1 ; set 1-byte mode
0x01, 0x00, 0x05, # MOV r0 = 5 ; put 5 r0
0x01, 0x01, 0x05, # MOV r1 = 5 ; put 5 r1
0x01, 0x02, 0x05, # MOV r2 = 5 ; put 5 r2
0x01, 0x03, 0x05, # MOV r3 = 5 ; put 5 r3
0x01, 0x04, 0x05, # MOV r4 = 5 ; put 5 r4
0x01, 0x05, 0x05, # MOV r5 = 5 ; put 5 r5
0x01, 0x06, 0x05, # MOV r6 = 5 ; put 5 r6
0x01, 0x07, 0x05, # MOV r7 = 5 ; put 5 r7
0x02, 0x00, 0x01, # ADD r0 r1
0x02, 0x01, 0x02, # ADD r1 r2
0x02, 0x02, 0x03, # ADD r2 r3
0x02, 0x03, 0x04, # ADD r3 r4
0x02, 0x04, 0x05, # ADD r4 r5
0x02, 0x05, 0x06, # ADD r5 r6
0x02, 0x06, 0x07, # ADD r6 r7
0x02, 0x07, 0x07, # ADD r7 r7
0x03, 0x00, 0x04, 0x01, # PUSH r0 POP r1
0x03, 0x01, 0x04, 0x02, # PUSH r1 POP r2
0x03, 0x02, 0x04, 0x03, # PUSH r2 POP r3
0x03, 0x03, 0x04, 0x04, # PUSH r3 POP r4
0x03, 0x04, 0x04, 0x05, # PUSH r4 POP r5
0x03, 0x05, 0x04, 0x06, # PUSH r5 POP r6
0x03, 0x06, 0x04, 0x07, # PUSH r6 POP r7
0x01, 0x00, 0xA0, # MOV r0 A0 syscall
0x01, 0x01, 0xFF, # MOV r1 255
0x06, 0x7C, # CALL address 0x0124 ; function 1
0x10, 0x00, # SYS r0
0x08, 0x01, 0x02, # MOVR r2 -> r1
0x10, 0x00, # SYS r0
0x08, 0x01, 0x03, # MOVR r3 -> r2
0x10, 0x00, # SYS r0
0x08, 0x01, 0x04, # MOVR r3 -> r2
0x10, 0x00, # SYS r0
0x08, 0x01, 0x05, # MOVR r3 -> r2
0x10, 0x00, # SYS r0
0x08, 0x01, 0x06, # MOVR r3 -> r2
0x10, 0x00, # SYS r0
0x08, 0x01, 0x07, # MOVR r3 -> r2
0x10, 0x00, # SYS r0
0x01, 0x07, 0x00, # MOV r7 exit syscall
0x10, 0x07, # SYS r7
0x00, # HALT
# function 1
0x01, 0x01, 0x05, # MOV r1 5
0x07 # RET
]
sys.KERNEL.create_process(opcode_test)
while len(sys.KERNEL.processes) > 0:
process = sys.KERNEL.get_current_process() # get scheduled process
sys.CPU.registers.update(process.registers) # load reg
sys.CPU.step(process)
process.registers.update(sys.CPU.registers) # save reg
status = process.registers["c0"]
if status == 0x00: # HALT
print(f"pid {process.pid} exited, code {process.exit_code}")
print(f"pid {process.pid} used {process.page_table} pages")
sys.KERNEL.processes.remove(process)
if len(sys.KERNEL.processes) > 0:
sys.KERNEL.schedule_next()
continue
elif status >= 0xD0 and status <= 0xD7: # SYSCALL
sys.KERNEL.handle_syscall(process)
elif status != 0xFF: # any error
print(f"pid {process.pid} raised error: {sys.KERNEL.CPU_CODES.get(status, 'Unknown')}")
sys.KERNEL.processes.remove(process)
if len(sys.KERNEL.processes) > 0:
sys.KERNEL.schedule_next()
continue
if len(sys.KERNEL.processes) > 1:
sys.KERNEL.context_switch()