diff --git a/src/cpu.mpy b/src/cpu.mpy deleted file mode 100644 index c8dc73d..0000000 --- a/src/cpu.mpy +++ /dev/null @@ -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() diff --git a/src/cpu.py b/src/cpu.py index 7da5078..d9c8b92 100644 --- a/src/cpu.py +++ b/src/cpu.py @@ -1,4 +1,5 @@ -import sys +from sys import exit +from time import sleep class CPU: def __init__(self): @@ -11,6 +12,7 @@ class CPU: def load_memory(self, bytes): self.memory = bytes + bytearray(256 - len(bytes)) + print(type(self.memory)) print('mem 254', self.memory[254]) # print(self.memory) @@ -29,7 +31,21 @@ class CPU: print("_", end=" ") 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): + self.read_keys() if self.IP >= 256: self.IP = 0 print("IP:", self.IP) @@ -44,9 +60,16 @@ class CPU: print("running:", self.running) print() self.print_screen() + print("byte 26 (keyboard):", self.memory[26]) print() - if not self.running: - sys.exit() + # if not self.running: + # exit() + + def run(self): + self.start() + while True: + self.step() + sleep(0.1) def hlt(self, operand): self.running = False @@ -170,16 +193,12 @@ class CPU: cpu = CPU() prog = '04 FF 04 01 14 01 00 00' -program_bytes = bytes.fromhex(prog) +program_bytes = bytearray.fromhex(prog) # 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.print_screen() +# cpu.start() +# cpu.step() -cpu.start() -cpu.step() -cpu.step() -cpu.step() -cpu.step() -cpu.step() +cpu.run()