mirror of https://github.com/xemu-project/xemu.git
mac_via: make SCSI_DATA (DRQ) bit live rather than latched
The VIA2 on the Q800 machine is not a separate chip as in older Macs but instead is integrated into the on-board logic. From analysing the SCSI routines in the MacOS toolbox ROM (and to a lesser extent NetBSD and Linux) the expectation seems to be that the SCSI_DATA (DRQ) bit is live on the Q800 and not latched. Fortunately we can use the recently introduced mos6522 last_irq_levels variable which tracks the edge-triggered state to return the SCSI_DATA (DRQ) bit live to the guest OS. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: Laurent Vivier <laurent@vivier.eu> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Message-Id: <20220305150957.5053-11-mark.cave-ayland@ilande.co.uk> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
This commit is contained in:
parent
d4454e41d7
commit
677a4725b1
|
@ -906,9 +906,24 @@ static uint64_t mos6522_q800_via2_read(void *opaque, hwaddr addr, unsigned size)
|
|||
{
|
||||
MOS6522Q800VIA2State *s = MOS6522_Q800_VIA2(opaque);
|
||||
MOS6522State *ms = MOS6522(s);
|
||||
uint64_t val;
|
||||
|
||||
addr = (addr >> 9) & 0xf;
|
||||
return mos6522_read(ms, addr, size);
|
||||
val = mos6522_read(ms, addr, size);
|
||||
|
||||
switch (addr) {
|
||||
case VIA_REG_IFR:
|
||||
/*
|
||||
* On a Q800 an emulated VIA2 is integrated into the onboard logic. The
|
||||
* expectation of most OSs is that the DRQ bit is live, rather than
|
||||
* latched as it would be on a real VIA so do the same here.
|
||||
*/
|
||||
val &= ~VIA2_IRQ_SCSI_DATA;
|
||||
val |= (ms->last_irq_levels & VIA2_IRQ_SCSI_DATA);
|
||||
break;
|
||||
}
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
static void mos6522_q800_via2_write(void *opaque, hwaddr addr, uint64_t val,
|
||||
|
|
Loading…
Reference in New Issue