Skip to content

Commit

Permalink
Rework CSimulator_init()
Browse files Browse the repository at this point in the history
  • Loading branch information
skoolkid committed Mar 24, 2024
1 parent f35e1f3 commit 6d9b4fb
Show file tree
Hide file tree
Showing 12 changed files with 434 additions and 67 deletions.
418 changes: 402 additions & 16 deletions c/csimulator.c

Large diffs are not rendered by default.

8 changes: 8 additions & 0 deletions skoolkit/pagingtracer.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,14 @@ def out7ffd(self, value):
self.memory[3] = self.banks[value % 8]
self.o7ffd = value

def convert(self):
# Prepare for use by a CSimulator
rom_id = (self.o7ffd % 32) // 16
page = self.o7ffd % 8
self.roms = tuple(bytearray(rom) for rom in self.roms)
self.banks = [bytearray(bank) for bank in self.banks]
self.memory = [self.roms[rom_id], self.banks[5], self.banks[2], self.banks[page]]

class PagingTracer:
def write_port(self, registers, port, value):
if port % 2 == 0:
Expand Down
2 changes: 1 addition & 1 deletion skoolkit/rzxplay.py
Original file line number Diff line number Diff line change
Expand Up @@ -313,7 +313,7 @@ def process_block(block, options, context):
tracer = RZXTracer(context, block)
simulator.set_tracer(tracer)
if CSimulator: # pragma: no cover
context.csimulator = CSimulator(simulator, tracer.out7ffd)
context.csimulator = CSimulator.from_simulator(simulator, tracer.out7ffd)
else:
context.csimulator = None
csimulator = context.csimulator
Expand Down
16 changes: 2 additions & 14 deletions skoolkit/simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,21 +147,9 @@ def __init__(self, memory, registers=None, state=None, config=None):
if len(memory) == 65536:
self.memory = bytearray(memory)
else:
rom_id = (memory.o7ffd % 32) // 16
page = memory.o7ffd % 8
memory.roms = roms = tuple(bytearray(rom) for rom in memory.roms)
memory.banks = banks = [bytearray(bank) for bank in memory.banks]
memory.memory = [roms[rom_id], banks[5], banks[2], banks[page]]
self.memory.convert()
self.registers = array.array('I', self.registers)
self.opcodes = [None] * 256
self.after_CB = [None] * 256
self.after_ED = [None] * 256
self.after_DD = [None] * 256
self.after_FD = [None] * 256
self.after_DDCB = [None] * 256
self.after_FDCB = [None] * 256
else:
self.create_opcodes()
self.create_opcodes()
if cfg['fast_djnz']:
self.opcodes[0x10] = partial(self.djnz_fast, self.registers, self.memory)
if cfg['fast_ldir']:
Expand Down
6 changes: 3 additions & 3 deletions skoolkit/skoolmacro.py
Original file line number Diff line number Diff line change
Expand Up @@ -661,7 +661,7 @@ def parse_audio(writer, text, index, need_audio=None):
tracer = AudioTracer()
simulator.set_tracer(tracer)
if csimulator_cls: # pragma: no cover
csimulator_cls(simulator, memory.o7ffd).run(start, stop, execint)
csimulator_cls.from_simulator(simulator, memory.o7ffd).run(start, stop, execint)
if len(memory) == 65536:
memory[:] = simulator.memory[:]
else:
Expand Down Expand Up @@ -1248,7 +1248,7 @@ def parse_sim(writer, text, index, *cwd):
start = simulator.registers[PC]
simulator.set_tracer(tracer)
if csimulator_cls: # pragma: no cover
csimulator_cls(simulator, memory.o7ffd).run(start, stop, execint > 0)
csimulator_cls.from_simulator(simulator, memory.o7ffd).run(start, stop, execint > 0)
if len(memory) == 65536:
memory[:] = simulator.memory[:]
else:
Expand Down Expand Up @@ -1321,7 +1321,7 @@ def parse_tstates(writer, text, index, *cwd):
simulator.set_tracer(tracer)
start_time = simulator.registers[T]
if csimulator_cls: # pragma: no cover
csimulator_cls(simulator, memory.o7ffd).run(start, stop, execint)
csimulator_cls.from_simulator(simulator, memory.o7ffd).run(start, stop, execint)
else:
simulator.run(start, stop, execint)
if msg is None:
Expand Down
9 changes: 9 additions & 0 deletions skoolkit/skoolutils.py
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,15 @@ def out7ffd(self, value):
self.memory[3] = self.banks[value % 8]
self.o7ffd = value

def convert(self): # pragma: no cover
# Prepare for use by a CSimulator
if all(self.banks):
rom_id = (self.o7ffd % 32) // 16
page = self.o7ffd % 8
self.roms = tuple(bytearray(rom) for rom in self.roms)
self.banks = [bytearray(bank) for bank in self.banks]
self.memory = [self.roms[rom_id], self.banks[5], self.banks[2], self.banks[page]]

class Comment:
def __init__(self, rowspan, text):
self.rowspan = rowspan
Expand Down
4 changes: 2 additions & 2 deletions skoolkit/tap2sna.py
Original file line number Diff line number Diff line change
Expand Up @@ -395,7 +395,7 @@ def sim_load(blocks, options, config):
simulator = simulator_cls(memory, registers, state, sim_cfg)
tracer = KeyboardTracer(simulator, load, kb_delay)
simulator.set_tracer(tracer)
csimulator = csimulator_cls(simulator) if csimulator_cls else None
csimulator = csimulator_cls.from_simulator(simulator) if csimulator_cls else None
try:
tracer.run(stop, timeout, tracefile, trace_line, prefix, byte_fmt, word_fmt, csimulator)
border = tracer.border
Expand Down Expand Up @@ -447,7 +447,7 @@ def sim_load(blocks, options, config):
options.polarity, options.finish_tape, in_min_addr, options.accelerate_dec_a,
list_accelerators, border, out7ffd, outfffd, ay, outfe)
simulator.set_tracer(tracer, options.in_flags & 4, False)
csimulator = csimulator_cls(simulator, tracer.out7ffd) if csimulator_cls else None
csimulator = csimulator_cls.from_simulator(simulator, tracer.out7ffd) if csimulator_cls else None
try:
tracer.run(options.start, options.fast_load, timeout, tracefile, trace_line, prefix, byte_fmt, word_fmt, csimulator)
_ram_operations(simulator.memory, options.ram_ops)
Expand Down
2 changes: 1 addition & 1 deletion skoolkit/trace.py
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ def run(snafile, options, config):
trace_operand = config['TraceOperand' + ('', 'Decimal')[options.decimal]]
prefix, byte_fmt, word_fmt = (trace_operand + ',' * (2 - trace_operand.count(','))).split(',')[:3]
begin = time.time()
csimulator = csimulator_cls(simulator, tracer.out7ffd) if csimulator_cls else None
csimulator = csimulator_cls.from_simulator(simulator, tracer.out7ffd) if csimulator_cls else None
tracer.run(start, options.stop, options.max_operations, options.max_tstates,
options.interrupts, trace_line, prefix, byte_fmt, word_fmt, csimulator)
rt = time.time() - begin
Expand Down
2 changes: 1 addition & 1 deletion tests/sim_test_tracers.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ def run(self, simulator, csimulator_cls):
opcodes = simulator.opcodes
memory = simulator.memory
registers = simulator.registers
csimulator = csimulator_cls(simulator) if csimulator_cls else None
csimulator = csimulator_cls.from_simulator(simulator) if csimulator_cls else None

while True:
for i in range(PC + 1):
Expand Down
4 changes: 2 additions & 2 deletions tests/slow_test_simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class ROMReadOnlyTest(SkoolKitTestCase):
def _get_simulator(self, memory):
simulator = Simulator(memory, config={'c': CSimulator})
if CSimulator:
return CSimulator(simulator), simulator.memory, simulator.registers
return CSimulator.from_simulator(simulator), simulator.memory, simulator.registers
return simulator, simulator.memory, simulator.registers

def _test_read_only(self, code, start, value=0):
Expand All @@ -17,7 +17,7 @@ def _test_read_only(self, code, start, value=0):
memory[start:stop] = code
simulator = Simulator(memory, config={'c': CSimulator})
if CSimulator:
CSimulator(simulator).run(start, stop)
CSimulator.from_simulator(simulator).run(start, stop)
else:
simulator.run(start, stop)
self.assertTrue(all(b == value for b in simulator.memory[:0x4000]))
Expand Down
14 changes: 0 additions & 14 deletions tests/test_simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -2932,13 +2932,6 @@ def test_config_c_48k(self):
simulator = Simulator([0] * 65536, config={'c': True})
self.assertTrue(isinstance(simulator.memory, bytearray))
self.assertTrue(isinstance(simulator.registers, array.array))
self.assertEqual([None] * 256, simulator.opcodes)
self.assertEqual([None] * 256, simulator.after_CB)
self.assertEqual([None] * 256, simulator.after_ED)
self.assertEqual([None] * 256, simulator.after_DD)
self.assertEqual([None] * 256, simulator.after_FD)
self.assertEqual([None] * 256, simulator.after_DDCB)
self.assertEqual([None] * 256, simulator.after_FDCB)

def test_config_c_128k(self):
memory = Memory(out7ffd=0x14)
Expand All @@ -2958,10 +2951,3 @@ def test_config_c_128k(self):
self.assertIs(memory.memory[2], memory.banks[2])
self.assertIs(memory.memory[3], memory.banks[4])
self.assertTrue(isinstance(simulator.registers, array.array))
self.assertEqual([None] * 256, simulator.opcodes)
self.assertEqual([None] * 256, simulator.after_CB)
self.assertEqual([None] * 256, simulator.after_ED)
self.assertEqual([None] * 256, simulator.after_DD)
self.assertEqual([None] * 256, simulator.after_FD)
self.assertEqual([None] * 256, simulator.after_DDCB)
self.assertEqual([None] * 256, simulator.after_FDCB)
16 changes: 3 additions & 13 deletions tools/z80-test-simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,11 @@
sys.exit(1)
sys.path.insert(0, SKOOLKIT_HOME)

from skoolkit import ROM48, integer, read_bin_file
from skoolkit import ROM48, CSimulator, CCMIOSimulator, integer, read_bin_file
from skoolkit.cmiosimulator import CMIOSimulator
from skoolkit.simulator import Simulator, A, PC, T
from skoolkit.tap2sna import get_tap_blocks, sim_load

try:
from skoolkit.csimulator import CSimulator
except ImportError:
CSimulator = None

try:
from skoolkit.ccmiosimulator import CCMIOSimulator
except ImportError:
CCMIOSimulator = None

STOP = 0x8094

class Options:
Expand Down Expand Up @@ -129,15 +119,15 @@ def run(tapfile, options):
print('Running tests')
begin = time.time()
if c:
csimulator_cls(simulator).exec_all(STOP)
csimulator_cls.from_simulator(simulator).exec_all(STOP)
else:
simulator.run(stop=STOP)
else:
tracer = Tracer()
simulator.set_tracer(tracer)
begin = time.time()
if c:
csimulator_cls(simulator).exec_all(STOP, tracer.rst16_cb)
csimulator_cls.from_simulator(simulator).exec_all(STOP, tracer.rst16_cb)
else:
tracer.run(simulator)
rt = time.time() - begin
Expand Down

0 comments on commit 6d9b4fb

Please sign in to comment.