From d4454e41d74b85c92fbca06a30622a18545aad81 Mon Sep 17 00:00:00 2001 From: Mark Cave-Ayland Date: Sat, 5 Mar 2022 15:09:54 +0000 Subject: mos6522: record last_irq_levels in mos6522_set_irq() To detect edge-triggered IRQs it is necessary to store the last state of each IRQ in a last_irq_levels bitmap. Note: this is a migration break for machines which use mos6522 instances which are g3beige/mac99 (PPC) and q800 (m68k). Signed-off-by: Mark Cave-Ayland Reviewed-by: Laurent Vivier Message-Id: <20220305150957.5053-10-mark.cave-ayland@ilande.co.uk> Signed-off-by: Mark Cave-Ayland --- hw/misc/mos6522.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) (limited to 'hw/misc/mos6522.c') diff --git a/hw/misc/mos6522.c b/hw/misc/mos6522.c index 2c20decca1..c67123f864 100644 --- a/hw/misc/mos6522.c +++ b/hw/misc/mos6522.c @@ -72,6 +72,12 @@ static void mos6522_set_irq(void *opaque, int n, int level) } mos6522_update_irq(s); + + if (level) { + s->last_irq_levels |= 1 << n; + } else { + s->last_irq_levels &= ~(1 << n); + } } static uint64_t get_counter_value(MOS6522State *s, MOS6522Timer *ti) @@ -544,8 +550,8 @@ static const VMStateDescription vmstate_mos6522_timer = { const VMStateDescription vmstate_mos6522 = { .name = "mos6522", - .version_id = 0, - .minimum_version_id = 0, + .version_id = 1, + .minimum_version_id = 1, .fields = (VMStateField[]) { VMSTATE_UINT8(a, MOS6522State), VMSTATE_UINT8(b, MOS6522State), @@ -556,6 +562,7 @@ const VMStateDescription vmstate_mos6522 = { VMSTATE_UINT8(pcr, MOS6522State), VMSTATE_UINT8(ifr, MOS6522State), VMSTATE_UINT8(ier, MOS6522State), + VMSTATE_UINT8(last_irq_levels, MOS6522State), VMSTATE_STRUCT_ARRAY(timers, MOS6522State, 2, 0, vmstate_mos6522_timer, MOS6522Timer), VMSTATE_END_OF_LIST() -- cgit v1.2.3-55-g7522