Skip to content

Commit 0717b98

Browse files
authored
Add files via upload
0 parents  commit 0717b98

File tree

2 files changed

+166
-0
lines changed

2 files changed

+166
-0
lines changed

B16.py

Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
#CPU module
2+
import time
3+
4+
def arrSet(len):
5+
arr = []
6+
i = 0
7+
while i < len:
8+
arr.append(0)
9+
i += 1
10+
return arr
11+
12+
rom = arrSet(512)
13+
regs = arrSet(16)
14+
15+
execute = 1
16+
jumped = 0
17+
18+
milli, lmilli = 0, 0
19+
20+
raw = open("rom.bin", "rb")
21+
i, byte = 0, raw.read(1)
22+
while byte:
23+
rom[i] = int.from_bytes(byte, "little")
24+
i += 1
25+
byte = raw.read(1)
26+
27+
while execute:
28+
lmilli = milli
29+
milli = int(round(time.time() * 1000))
30+
if milli - lmilli > 0: regs[6] += milli - lmilli
31+
32+
regs[5] = 1
33+
34+
if(regs[0] + 1 < len(rom)):
35+
lByte = rom[regs[0]]
36+
rByte = rom[regs[0] + 1]
37+
38+
mode = lByte >> 6
39+
opcode = (lByte >> 1) & 0b11111
40+
arg1 = rByte >> 4
41+
arg2 = rByte & 0b00001111
42+
imm = ((lByte & 1) << 8) | rByte
43+
44+
if opcode == 0x01: #clr
45+
regs[arg1] = 0
46+
elif opcode == 0x02: #rst
47+
regs[0] = 0
48+
elif opcode == 0x03: #hlt
49+
execute = 0
50+
#0x04: mem not implemented
51+
elif opcode == 0x05: #mov - movm not implemented
52+
regs[arg2] = regs[arg1]
53+
elif opcode == 0x06: #ldm
54+
regs[arg2] = rom[regs[arg1]]
55+
#0x04: stm not implemented
56+
elif opcode == 0x08: #dat
57+
regs[0] += 2
58+
regs[arg1] = (rom[regs[0]] << 8) | rom[regs[0] + 1]
59+
jumped = 1
60+
elif opcode == 0x09: #add/i
61+
if mode & 1:
62+
regs[arg1] += regs[arg2]
63+
else:
64+
regs[1] = (regs[arg1] + regs[arg2]) if not mode >> 1 else (regs[2] + imm)
65+
elif opcode == 0x0A: #sub/d
66+
if mode & 1:
67+
regs[arg1] -= regs[arg2]
68+
else:
69+
regs[1] = (regs[arg1] - regs[arg2]) if not mode >> 1 else (regs[2] - imm)
70+
if regs[arg2] > regs[arg1]: regs[3] |= 6
71+
elif opcode == 0x0B: #mul/i
72+
if mode & 1:
73+
regs[arg1] *= regs[arg2]
74+
else:
75+
regs[1] = (regs[arg1] * regs[arg2]) if not mode >> 1 else (regs[2] * imm)
76+
elif opcode == 0x0C: #div/d
77+
if mode & 1:
78+
regs[arg1] = int(regs[arg1] / regs[arg2])
79+
else:
80+
regs[1] = int((regs[arg1] / regs[arg2]) if not mode >> 1 else (regs[2] / imm))
81+
elif opcode == 0x0D: #shl
82+
regs[1] = (regs[arg1] << regs[arg2]) if not mode >> 1 else (regs[2] << imm)
83+
regs[3] |= 4
84+
elif opcode == 0x0E: #shr
85+
regs[1] = (regs[arg1] >> regs[arg2]) if not mode >> 1 else (regs[2] >> imm)
86+
regs[3] |= 5
87+
elif opcode == 0x0F: #and
88+
regs[1] = (regs[arg1] & regs[arg2]) if not mode >> 1 else (regs[2] & imm)
89+
elif opcode == 0x10: #or
90+
regs[1] = (regs[arg1] | regs[arg2]) if not mode >> 1 else (regs[2] | imm)
91+
elif opcode == 0x11: #not
92+
regs[1] = ~regs[arg1]
93+
elif opcode == 0x12: #xor
94+
regs[1] = (regs[arg1] ^ regs[arg2]) if not mode >> 1 else (regs[2] ^ imm)
95+
elif opcode == 0x13: #cmp
96+
if (regs[arg1] > regs[arg2]) if not mode >> 1 else (regs[2] > imm): regs[3] |= 1
97+
if (regs[arg1] == regs[arg2]) if not mode >> 1 else (regs[2] == imm): regs[3] |= 2
98+
if (regs[arg1] == 0) if not mode >> 1 else (regs[2] == 0): regs[3] |= 4
99+
elif opcode == 0x14: #jmp
100+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
101+
jumped = 1
102+
elif opcode == 0x15: #jal/nal
103+
if (regs[3] & 1) if not mode & 1 else (not regs[3] & 1):
104+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
105+
jumped = 1
106+
elif opcode == 0x16: #jeq/neq
107+
if (regs[3] & 1) if not mode & 2 else (not regs[3] & 2):
108+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
109+
jumped = 1
110+
elif opcode == 0x17: #jze/nze
111+
if (regs[3] & 4) if not mode & 1 else (not regs[3] & 4):
112+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
113+
jumped = 1
114+
elif opcode == 0x18: #jof/nof
115+
if (regs[3] & 8) if not mode & 1 else (not regs[3] & 8):
116+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
117+
jumped = 1
118+
elif opcode == 0x19: #juf/nuf
119+
if (regs[3] & 16) if not mode & 1 else (not regs[3] & 16):
120+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
121+
jumped = 1
122+
elif opcode == 0x1A: #jng/nng
123+
if (regs[3] & 32) if not mode & 1 else (not regs[3] & 32):
124+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
125+
jumped = 1
126+
elif opcode == 0x1B: #jin/nin
127+
if (regs[3] & 64) if not mode & 1 else (not regs[3] & 64):
128+
regs[0] = (regs[arg1]) if not mode >> 1 else imm
129+
jumped = 1
130+
#0x1C: sdr not implemented
131+
#0x1D: gdr not implemented
132+
elif opcode == 0x1E: #deb
133+
print(regs[arg1])
134+
#0x1F: ram dump not implemented
135+
136+
if not jumped:
137+
if regs[0] < len(rom) - 1:
138+
regs[0] += 2
139+
else: regs[0] = 0
140+
else: jumped = 0
141+
142+
for i in range(16):
143+
if(regs[i] > 65535): regs[i] = 0
144+
if(regs[i] < 0): regs[i] = 65535

code.b16

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
//Countdown timer v4
2+
3+
dat g1; 3000 //total milliseconds
4+
dat g2; 3000 //initial time value
5+
dat g3; 1000
6+
7+
#loop:
8+
mov tim, tmp
9+
10+
sub g1, tim
11+
mov acc, g1
12+
clr tim
13+
14+
cmp g1, g2
15+
jal #end
16+
17+
div g1, g3
18+
add acc, one
19+
deb acc
20+
jmp #loop
21+
22+
#end: hlt

0 commit comments

Comments
 (0)