START_ADDR = 0x200
_MEM_SIZE = 4 * 1024
_FONTSET = [0xF0, 0x90, 0x90, 0x90, 0xF0, # 0
0x20, 0x60, 0x20, 0x20, 0x70, # 1
0xF0, 0x10, 0xF0, 0x80, 0xF0, # 2
0xF0, 0x10, 0xF0, 0x10, 0xF0, # 3
0x90, 0x90, 0xF0, 0x10, 0x10, # 4
0xF0, 0x80, 0xF0, 0x10, 0xF0, # 5
0xF0, 0x80, 0xF0, 0x90, 0xF0, # 6
0xF0, 0x10, 0x20, 0x40, 0x40, # 7
0xF0, 0x90, 0xF0, 0x90, 0xF0, # 8
0xF0, 0x90, 0xF0, 0x10, 0xF0, # 9
0xF0, 0x90, 0xF0, 0x90, 0x90, # A
0xE0, 0x90, 0xE0, 0x90, 0xE0, # B
0xF0, 0x80, 0x80, 0x80, 0xF0, # C
0xE0, 0x90, 0x90, 0x90, 0xE0, # D
0xF0, 0x80, 0xF0, 0x80, 0xF0, # E
0xF0, 0x80, 0xF0, 0x80, 0x80] # F
class Memory:
def __init__(self):
# 4KB memory
self._ram = [0] * 4 * 1024
# stack
self._stack = []
for i in range(len(_FONTSET)):
self._ram[i] = _FONTSET[i]
def stack_pop(self):
return self._stack.pop()
def stack_push(self, x: int):
return self._stack.append(x)
class Display:
def render(self):
pass
class Keyboard:
def poll_event(self):
pass
[docs]class CPU:
def __init__(self):
self.memory = Memory()
# 8 bits register
self._reg_V = [0] * 16
# 16 bits register
self._reg_PC = START_ADDR
self._reg_I = 0
self.draw_flag = False
self._screen_buf = [[0 for _ in range(640)] for _ in range(320)]
self._keys_pressed_buf = [0] * 16
self._delay_timer = 0
self._sound_timer = 0
def cycle(self):
pass
class Machine:
def __init__(self):
self.display = Display()
self.keyboard = Keyboard()
self.cpu = CPU()
def run(self):
while True:
self.cpu.cycle()
self.keyboard.poll_event()
self.display.render()
def main():
machine = Machine()
machine.run()
if __name__ == '__main__':
main()