Start working on keyboard input - works when running the simulator, but no 'monitor mode' yet
This commit is contained in:
parent
6e58241288
commit
fa504685d2
92
src/cpu.mpy
92
src/cpu.mpy
|
|
@ -1,92 +0,0 @@
|
||||||
import sys
|
|
||||||
|
|
||||||
class CPU:
|
|
||||||
def __init__(self):
|
|
||||||
self.running = False
|
|
||||||
self.IP = 254
|
|
||||||
self.acc = 0
|
|
||||||
self.flags = { 'C': False, 'Z': False, 'N': False, 'Eq': False }
|
|
||||||
self.instruction = { 'opcode': False, 'operand': False }
|
|
||||||
self.memory = False
|
|
||||||
|
|
||||||
def load_memory(self, bytes):
|
|
||||||
self.memory = bytes + bytearray(256 - len(bytes))
|
|
||||||
print('mem 254', self.memory[254])
|
|
||||||
# print(self.memory)
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
self.running = True
|
|
||||||
|
|
||||||
def step(self):
|
|
||||||
if self.IP >= 256:
|
|
||||||
self.IP = 0
|
|
||||||
print("IP:", self.IP)
|
|
||||||
self.instruction['opcode'] = self.memory[self.IP]
|
|
||||||
self.IP = self.IP+1
|
|
||||||
self.instruction['operand'] = self.memory[self.IP]
|
|
||||||
self.IP = self.IP+1
|
|
||||||
print("instr:", self.instruction['opcode'], self.instruction['operand'])
|
|
||||||
print("mnem:", self.nums2mnems[self.instruction['opcode']])
|
|
||||||
self.nums2mnems[self.instruction['opcode']](self, self.instruction['operand'])
|
|
||||||
print("acc:", self.acc)
|
|
||||||
print("running:", self.running)
|
|
||||||
print()
|
|
||||||
if not self.running:
|
|
||||||
sys.exit()
|
|
||||||
|
|
||||||
def hlt(self, operand):
|
|
||||||
self.running = False
|
|
||||||
|
|
||||||
def nop(self, operand):
|
|
||||||
pass
|
|
||||||
|
|
||||||
def add_lit(self, operand):
|
|
||||||
self.acc = self.acc + operand
|
|
||||||
|
|
||||||
def add_mem(self, operand):
|
|
||||||
self.acc = self.acc + self.memory[operand]
|
|
||||||
|
|
||||||
def jmp_lit(self, operand):
|
|
||||||
self.IP = operand
|
|
||||||
|
|
||||||
nums2mnems = {
|
|
||||||
0: hlt,
|
|
||||||
1: nop,
|
|
||||||
2: 'lda_lit',
|
|
||||||
3: 'sta_lit',
|
|
||||||
4: add_lit,
|
|
||||||
5: 'sub_lit',
|
|
||||||
6: jmp_lit,
|
|
||||||
7: 'ske',
|
|
||||||
8: 'skz',
|
|
||||||
9: 'skn',
|
|
||||||
10: 'skc',
|
|
||||||
11: 'cst',
|
|
||||||
12: 'ccl',
|
|
||||||
16: 'hlt',
|
|
||||||
17: 'nop',
|
|
||||||
18: 'lda_mem',
|
|
||||||
19: 'sta_mem',
|
|
||||||
20: add_mem,
|
|
||||||
21: 'sub_mem',
|
|
||||||
22: 'jmp_mem',
|
|
||||||
23: 'ske',
|
|
||||||
24: 'skz',
|
|
||||||
25: 'skn',
|
|
||||||
26: 'skc',
|
|
||||||
27: 'cst',
|
|
||||||
28: 'ccl',
|
|
||||||
}
|
|
||||||
|
|
||||||
cpu = CPU()
|
|
||||||
|
|
||||||
prog = '04 01 14 01 00 00'
|
|
||||||
program_bytes = bytes.fromhex(prog)
|
|
||||||
# Add jmp at addr 254:
|
|
||||||
program_with_jump = program_bytes + bytearray(254 - len(program_bytes)) + bytes.fromhex('06 00')
|
|
||||||
cpu.load_memory(program_with_jump)
|
|
||||||
|
|
||||||
cpu.start()
|
|
||||||
cpu.step()
|
|
||||||
cpu.step()
|
|
||||||
cpu.step()
|
|
||||||
43
src/cpu.py
43
src/cpu.py
|
|
@ -1,4 +1,5 @@
|
||||||
import sys
|
from sys import exit
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
class CPU:
|
class CPU:
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
|
|
@ -11,6 +12,7 @@ class CPU:
|
||||||
|
|
||||||
def load_memory(self, bytes):
|
def load_memory(self, bytes):
|
||||||
self.memory = bytes + bytearray(256 - len(bytes))
|
self.memory = bytes + bytearray(256 - len(bytes))
|
||||||
|
print(type(self.memory))
|
||||||
print('mem 254', self.memory[254])
|
print('mem 254', self.memory[254])
|
||||||
# print(self.memory)
|
# print(self.memory)
|
||||||
|
|
||||||
|
|
@ -29,7 +31,21 @@ class CPU:
|
||||||
print("_", end=" ")
|
print("_", end=" ")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
|
def read_keys(self):
|
||||||
|
key = input(">").upper()
|
||||||
|
if self.running:
|
||||||
|
if key in ['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']:
|
||||||
|
print(type(self.memory))
|
||||||
|
self.memory[26] = int(key)
|
||||||
|
if key in ['A', 'B', 'C', 'D', 'E', 'F']:
|
||||||
|
self.memory[26] = ord(key) - 55
|
||||||
|
if key == "H": # halt
|
||||||
|
self.running = False
|
||||||
|
else:
|
||||||
|
# TODO trainer interface
|
||||||
|
|
||||||
def step(self):
|
def step(self):
|
||||||
|
self.read_keys()
|
||||||
if self.IP >= 256:
|
if self.IP >= 256:
|
||||||
self.IP = 0
|
self.IP = 0
|
||||||
print("IP:", self.IP)
|
print("IP:", self.IP)
|
||||||
|
|
@ -44,9 +60,16 @@ class CPU:
|
||||||
print("running:", self.running)
|
print("running:", self.running)
|
||||||
print()
|
print()
|
||||||
self.print_screen()
|
self.print_screen()
|
||||||
|
print("byte 26 (keyboard):", self.memory[26])
|
||||||
print()
|
print()
|
||||||
if not self.running:
|
# if not self.running:
|
||||||
sys.exit()
|
# exit()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
self.start()
|
||||||
|
while True:
|
||||||
|
self.step()
|
||||||
|
sleep(0.1)
|
||||||
|
|
||||||
def hlt(self, operand):
|
def hlt(self, operand):
|
||||||
self.running = False
|
self.running = False
|
||||||
|
|
@ -170,16 +193,12 @@ class CPU:
|
||||||
cpu = CPU()
|
cpu = CPU()
|
||||||
|
|
||||||
prog = '04 FF 04 01 14 01 00 00'
|
prog = '04 FF 04 01 14 01 00 00'
|
||||||
program_bytes = bytes.fromhex(prog)
|
program_bytes = bytearray.fromhex(prog)
|
||||||
# Add jmp at addr 254:
|
# Add jmp at addr 254:
|
||||||
program_with_jump = program_bytes + bytearray(254 - len(program_bytes)) + bytes.fromhex('06 00')
|
program_with_jump = program_bytes + bytearray(254 - len(program_bytes)) + bytearray.fromhex('06 00')
|
||||||
cpu.load_memory(program_with_jump)
|
cpu.load_memory(program_with_jump)
|
||||||
|
|
||||||
cpu.print_screen()
|
# cpu.start()
|
||||||
|
# cpu.step()
|
||||||
|
|
||||||
cpu.start()
|
cpu.run()
|
||||||
cpu.step()
|
|
||||||
cpu.step()
|
|
||||||
cpu.step()
|
|
||||||
cpu.step()
|
|
||||||
cpu.step()
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue