This fixes those rare programs that use specific EOI instead of regular EOI for acknowledging IRQs. Changelog: Add support for specific EOI PIC command. Index: dlls/winedos/dosvm.c =================================================================== RCS file: /home/wine/wine/dlls/winedos/dosvm.c,v retrieving revision 1.48 diff -u -r1.48 dosvm.c --- dlls/winedos/dosvm.c 27 Aug 2003 02:52:18 -0000 1.48 +++ dlls/winedos/dosvm.c 30 Aug 2003 16:12:33 -0000 @@ -599,31 +599,48 @@ */ void WINAPI DOSVM_PIC_ioport_out( WORD port, BYTE val) { - LPDOSEVENT event; + if (port != 0x20) + { + FIXME( "Unsupported PIC port %04x\n", port ); + } + else if (val == 0x20 || (val >= 0x60 && val <= 0x67)) + { + EnterCriticalSection(&qcrit); - if ((port==0x20) && (val==0x20)) { - EnterCriticalSection(&qcrit); - if (current_event) { - /* EOI (End Of Interrupt) */ - TRACE("received EOI for current IRQ, clearing\n"); - event = current_event; - current_event = event->next; - if (event->relay) - (*event->relay)(NULL,event->data); - free(event); + if (!current_event) + { + WARN( "%s without active IRQ\n", + val == 0x20 ? "EOI" : "Specific EOI" ); + } + else if (val != 0x20 && val - 0x60 != current_event->irq) + { + WARN( "Specific EOI but current IRQ %d is not %d\n", + current_event->irq, val - 0x60 ); + } + else + { + LPDOSEVENT event = current_event; - if (DOSVM_HasPendingEvents()) { - /* another event is pending, which we should probably - * be able to process now */ - TRACE("another event pending, setting flag\n"); - NtCurrentTeb()->vm86_pending |= VIP_MASK; - } - } else { - WARN("EOI without active IRQ\n"); - } - LeaveCriticalSection(&qcrit); - } else { - FIXME("unrecognized PIC command %02x\n",val); + TRACE( "Received %s for current IRQ %d, clearing event\n", + val == 0x20 ? "EOI" : "Specific EOI", event->irq ); + + current_event = event->next; + if (event->relay) + (*event->relay)(NULL,event->data); + free(event); + + if (DOSVM_HasPendingEvents()) + { + TRACE( "Another event pending, setting pending flag\n" ); + NtCurrentTeb()->vm86_pending |= VIP_MASK; + } + } + + LeaveCriticalSection(&qcrit); + } + else + { + FIXME( "Unrecognized PIC command %02x\n", val ); } } -- Jukka Heinonen <http://www.iki.fi/jhei/>