Just as an experiment to see if it's synchronization issues I put

config.set_maximum_quantum(attotime::from_usec(15)); into device_add_mconfig and it seemed to help.



One other thing I noted was that reads to C0nx have side effects, so maybe a debugger guard would be good here (for completeness):

Interesting that they didn't worry about the R/W line for access to C082 and C084 so reads can set/clear the strobe line as well as writes.

Code
u8 a2bus_grappler_device::read_c0nx(u8 offset)
{
        LOG("Read C0n%01X\n", offset);

        if (BIT(offset, 1)) // A1 - assert strobe
                machine().scheduler().synchronize(timer_expired_delegate(FUNC(a2bus_grappler_device::set_strobe), this), 0);
        else if (BIT(offset, 2)) // A2 - release strobe
                machine().scheduler().synchronize(timer_expired_delegate(FUNC(a2bus_grappler_device::set_strobe), this), 1);