diff options
| author | Jan Tuomi <jan@jantuomi.fi> | 2024-04-12 19:01:52 +0300 |
|---|---|---|
| committer | Jan Tuomi <jan@jantuomi.fi> | 2024-04-12 19:01:52 +0300 |
| commit | d993f522cfd091d35e538a8c3f77bc233a560bf2 (patch) | |
| tree | 0cab4973e13b5972a4b1038ebf45c3910135d003 /atk16_emu/emu.py | |
| parent | 4f78086920cd4e2cee6d970decaee7025875f2a9 (diff) | |
Add initial TPU emu
Diffstat (limited to 'atk16_emu/emu.py')
| -rw-r--r-- | atk16_emu/emu.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/atk16_emu/emu.py b/atk16_emu/emu.py index 8277d00..a118472 100644 --- a/atk16_emu/emu.py +++ b/atk16_emu/emu.py @@ -5,6 +5,7 @@ import sys import time from .opcodes import * from .colors import C +from .peripherals import Graphics, DummyGraphics class Register: def __init__(self, bits: int): @@ -156,7 +157,7 @@ class ALU: raise ValueError(f"Invalid ALU S: {S}") class Machine: - def __init__(self): + def __init__(self, peripherals_enabled: bool = False): self.rom = ROM(15, 16) self.ram = RAM(15, 16) self.alu = ALU() @@ -181,9 +182,18 @@ class Machine: self.steps_taken = 0 self.running = False + self.peripherals_enabled = peripherals_enabled + if peripherals_enabled: + self.graphics = Graphics() + else: + self.graphics = DummyGraphics() + def make_copy(self): new_machine = Machine() + new_machine.peripherals_enabled = self.peripherals_enabled + new_machine.graphics = self.graphics + new_machine.rom = ROM(self.rom.addr_bits, self.rom.data_bits) new_machine.rom.memory = self.rom.memory.copy() @@ -242,7 +252,14 @@ class Machine: raise ValueError(f"Cannot write to ROM, addr: 0x{addr:>04x}") else: # TODO: Implement memory-mapped I/O - self.ram.write(addr & 0x7FFF, value) + if addr == 0xE002 and value == 0b00: + self.graphics.deactivate() + elif addr == 0xE002 and value == 0b01: + self.graphics.activate_tpu() + elif addr == 0xE002 and value == 0b10: + self.graphics.activate_ppu() + else: + self.ram.write(addr & 0x7FFF, value) def get_nth_register(self, n: int) -> Register: if n < 0 or n >= 8: @@ -393,6 +410,8 @@ class Machine: print(f"Error while executing instruction 0b{instr:>016b} (0x{instr:>04x}) at address 0x{pc_addr:>04x}", file=sys.stderr) raise + self.graphics.step() + def decode(self, instr: int): opcode = (instr & 0xF000) >> 12 opdata = instr & 0x0FFF |
