is it correct to assume that in this code from mon_breakpoint_check_checkpoint: instpc = new_addr(mem, (monitor_cpu->mon_register_get_val)(mem, e_PC)); loadstorepc = new_addr(mem, lastpc); instpc is $1003 and loadstorepc is $6000 for the second example? Cant check myself without debugging symbols for WinDbg. If this assumption is correct then maybe it can be special cased with something like this: diff --git a/mon_breakpoint.c b/mon_breakpoint.c index a8d2bd4..840b8d6 100644 --- a/mon_breakpoint.c...
I just noticed it also affects subroutine jumps: a 1000 jmp $6000 rts a 6000 jsr $1003 jmp $1000 r pc = 1000 watch 2000 9fff if (pc >= $1000) && (pc <= $1003) x The monitor thinks that loading the address high byte from $6002 happens when PC == $1003: #1 (Stop on load 6002) 12/$00c, 11/$0b .C:6000 20 03 10 JSR $1003 - A:00 X:00 Y:0A SP:f1 ..-...Z. 5013047
Watchpoints get a wrong PC during interrupts
Checkpoints for non-default devices are unreliable
thanks for the fix, it works fine now.
This is the implementation of read_pra() in /src/drive/iecieee/via2d.c: static uint8_t read_pra(via_context_t *via_context, uint16_t addr) { /* GCR data port */ uint8_t byte; drivevia2_context_t *via2p; via2p = (drivevia2_context_t *)(via_context->prv); /* IF: add bus read delay */ via2p->drive->req_ref_cycles = BUS_READ_DELAY; rotation_byte_read(via2p->drive); byte = ((via2p->drive->GCR_read & ~(via_context->via[VIA_DDRA])) | (via_context->via[VIA_PRA] & via_context->via[VIA_DDRA])); #if 0 printf("(%u)%02x",...
I've attached a smaller testcase. Monitor commands: dev 8: break f35c if (A == $D6) Then autostart smallertestcase.g64 I don't know what a test program for this would look like. The exact GCR byte the drive is reading isn't deterministic, so you can't write a simple reference file expecting 1c01 to always read 0x52 (for example), it's necessary to compare values at specific positions and verify that they're always the same.
some useful notes can be found in /src/core/viacore.c: /* return value of a register without side effects */ /* FIXME: this is buggy/incomplete */ uint8_t viacore_peek(via_context_t *via_context, uint16_t addr) { addr &= 0xf; switch (addr) { case VIA_PRA: case VIA_PRA_NHS: /* port A, no handshake */ { uint8_t byte; /* WARNING: this pin reads the voltage of the output pins, not the ORA value as the other port. Value read might be different from what is expected due to excessive load. */ #ifdef MYVIA_NEED_LATCHING...