diff --git a/py65/monitor.py b/py65/monitor.py index 5d2679c..16d389c 100644 --- a/py65/monitor.py +++ b/py65/monitor.py @@ -43,10 +43,11 @@ class Monitor(cmd.Cmd): '65Org16': V65Org16} def __init__(self, mpu_type=NMOS6502, completekey='tab', stdin=None, - stdout=None, argv=None): + stdout=None, argv=None, memory=None, putc_addr=0xF001, getc_addr=0xF004): self.mpu_type = mpu_type - self.putc_addr = 0xF001 - self.getc_addr = 0xF004 + self.memory = memory + self.putc_addr = putc_addr + self.getc_addr = getc_addr if argv is None: argv = sys.argv self._breakpoints = [] @@ -149,14 +150,15 @@ class Monitor(cmd.Cmd): return result def _reset(self, mpu_type,getc_addr=0xF004,putc_addr=0xF001): - self._mpu = mpu_type() + self._mpu = mpu_type(memory=self.memory) self.addrWidth = self._mpu.ADDR_WIDTH self.byteWidth = self._mpu.BYTE_WIDTH self.addrFmt = self._mpu.ADDR_FORMAT self.byteFmt = self._mpu.BYTE_FORMAT self.addrMask = self._mpu.addrMask self.byteMask = self._mpu.byteMask - self._install_mpu_observers(getc_addr,putc_addr) + if getc_addr and putc_addr: + self._install_mpu_observers(getc_addr,putc_addr) self._address_parser = AddressParser() self._disassembler = Disassembler(self._mpu, self._address_parser) self._assembler = Assembler(self._mpu, self._address_parser) @@ -245,7 +247,7 @@ class Monitor(cmd.Cmd): byte = 0 return byte - m = ObservableMemory(addrWidth=self.addrWidth) + m = ObservableMemory(subject=self.memory, addrWidth=self.addrWidth) m.subscribe_to_write([self.putc_addr], putc) m.subscribe_to_read([self.getc_addr], getc) diff --git a/py65/tests/test_monitor.py b/py65/tests/test_monitor.py index 928c9d1..3477668 100644 --- a/py65/tests/test_monitor.py +++ b/py65/tests/test_monitor.py @@ -1144,6 +1144,18 @@ class MonitorTests(unittest.TestCase): out = stdout.getvalue() self.assertTrue(out.startswith("width ")) + def test_external_memory(self): + stdout = StringIO() + memory = bytearray(65536) + memory[10] = 0xff + mon = Monitor(memory=memory, stdout=stdout, putc_addr=None, getc_addr=None) + self.assertEqual(0xff, memory[10], "memory must remain untouched") + mon.do_mem('0008:000c') + mon.do_fill('0000:0020 ab') + self.assertEqual(0xab, memory[10], "memory must have been modified") + out = stdout.getvalue() + self.assertTrue(out.startswith('0008: 00 00 ff 00 00'), "monitor must see pre-initialized memory") + def test_suite(): return unittest.findTestCases(sys.modules[__name__])