diff --git a/include/vga.h b/include/vga.h index d85b4042..d0500dbe 100644 --- a/include/vga.h +++ b/include/vga.h @@ -142,6 +142,7 @@ typedef struct { Bit8u count,delay; Bit8u enabled; } cursor; + bool vret_triggered; } VGA_Draw; typedef struct { diff --git a/src/hardware/vga_draw.cpp b/src/hardware/vga_draw.cpp index 70693707..185e2a1d 100644 --- a/src/hardware/vga_draw.cpp +++ b/src/hardware/vga_draw.cpp @@ -617,6 +617,10 @@ static void VGA_VerticalTimer(Bitu val) { //VGA_DrawPart( vga.draw.parts_lines ); PIC_AddEvent(VGA_DrawPart,(float)vga.draw.delay.parts,vga.draw.parts_lines); // PIC_AddEvent(VGA_DrawPart,(float)(vga.draw.delay.parts/2),vga.draw.parts_lines); //Else tearline in Tyrian and second reality + if (GCC_UNLIKELY(machine==MCH_EGA)) { + PIC_ActivateIRQ(2); + vga.draw.vret_triggered=true; + } } void VGA_CheckScanLength(void) { diff --git a/src/hardware/vga_misc.cpp b/src/hardware/vga_misc.cpp index 4d9093b9..2da0c33e 100644 --- a/src/hardware/vga_misc.cpp +++ b/src/hardware/vga_misc.cpp @@ -139,11 +139,17 @@ static Bitu read_p3ca(Bitu port,Bitu iolen) { } static Bitu read_p3c2(Bitu port,Bitu iolen) { - return 0x70; + Bitu retcode=0x70; + if (GCC_UNLIKELY(machine==MCH_EGA)) { + retcode |= (vga.draw.vret_triggered ? 0x80 : 0x00); + vga.draw.vret_triggered=false; + } + return retcode; } void VGA_SetupMisc(void) { if (IS_EGAVGA_ARCH) { + vga.draw.vret_triggered=false; IO_RegisterReadHandler(0x3c2,read_p3c2,IO_MB); IO_RegisterWriteHandler(0x3c2,write_p3c2,IO_MB); if (IS_VGA_ARCH) { @@ -156,5 +162,3 @@ void VGA_SetupMisc(void) { IO_RegisterReadHandler(0x3ba,vga_read_p3da,IO_MB); } } - -