diff --git a/include/mouse.h b/include/mouse.h index 2756d0d0..0a1000a6 100644 --- a/include/mouse.h +++ b/include/mouse.h @@ -36,6 +36,7 @@ void Mouse_ButtonPressed(Bit8u button); void Mouse_ButtonReleased(Bit8u button); void Mouse_AutoLock(bool enable); -void Mouse_NewVideoMode(void); +void Mouse_BeforeNewVideoMode(bool setmode); +void Mouse_AfterNewVideoMode(bool setmode); #endif diff --git a/src/ints/int10.cpp b/src/ints/int10.cpp index 288854b6..fe17a142 100644 --- a/src/ints/int10.cpp +++ b/src/ints/int10.cpp @@ -23,6 +23,7 @@ #include "regs.h" #include "inout.h" #include "int10.h" +#include "mouse.h" #include "setup.h" Int10Data int10; @@ -50,7 +51,9 @@ static Bitu INT10_Handler(void) { switch (reg_ah) { case 0x00: /* Set VideoMode */ - INT10_SetVideoMode(reg_al); + Mouse_BeforeNewVideoMode(true); + INT10_SetVideoMode(reg_al); + Mouse_AfterNewVideoMode(true); break; case 0x01: /* Set TextMode Cursor Shape */ INT10_SetCursorShape(reg_ch,reg_cl); @@ -202,6 +205,7 @@ static Bitu INT10_Handler(void) { case 0x11: /* Character generator functions */ if (!IS_EGAVGA_ARCH) break; + if ((reg_al&0xf0)==0x10) Mouse_BeforeNewVideoMode(false); switch (reg_al) { /* Textmode calls */ case 0x00: /* Load user font */ @@ -311,6 +315,7 @@ graphics_chars: LOG(LOG_INT10,LOG_ERROR)("Function 11:Unsupported character generator call %2X",reg_al); break; } + if ((reg_al&0xf0)==0x10) Mouse_AfterNewVideoMode(false); break; case 0x12: /* alternate function select */ if (!IS_EGAVGA_ARCH) @@ -536,8 +541,10 @@ graphics_chars: reg_ah=VESA_GetSVGAModeInformation(reg_cx,SegValue(es),reg_di); break; case 0x02: /* Set videomode */ - reg_al=0x4f; - reg_ah=VESA_SetSVGAMode(reg_bx); + Mouse_BeforeNewVideoMode(true); + reg_al=0x4f; + reg_ah=VESA_SetSVGAMode(reg_bx); + Mouse_AfterNewVideoMode(true); break; case 0x03: /* Get videomode */ reg_al=0x4f; diff --git a/src/ints/int10_modes.cpp b/src/ints/int10_modes.cpp index f68a7fc9..06a825f9 100644 --- a/src/ints/int10_modes.cpp +++ b/src/ints/int10_modes.cpp @@ -23,7 +23,6 @@ #include "mem.h" #include "inout.h" #include "int10.h" -#include "mouse.h" #include "vga.h" #define _EGA_HALF_CLOCK 0x0001 @@ -447,8 +446,6 @@ static void FinishSetMode(bool clearmem) { case 14:RealSetVec(0x43,int10.rom.font_14);break; case 16:RealSetVec(0x43,int10.rom.font_16);break; } - /* Tell mouse resolution change */ - Mouse_NewVideoMode(); } bool INT10_SetVideoMode_OTHER(Bit16u mode,bool clearmem) { diff --git a/src/ints/mouse.cpp b/src/ints/mouse.cpp index 7d5cf59c..f4065b1b 100644 --- a/src/ints/mouse.cpp +++ b/src/ints/mouse.cpp @@ -465,8 +465,8 @@ void Mouse_CursorMoved(float xrel,float yrel,float x,float y,bool emulate) { mouse.y += dy; } else { if (CurMode->type == M_TEXT) { - mouse.x = x*CurMode->swidth; - mouse.y = y*CurMode->sheight * 8 / CurMode->cheight; + mouse.x = x*real_readw(BIOSMEM_SEG,BIOSMEM_NB_COLS)*8; + mouse.y = y*(real_readb(BIOSMEM_SEG,BIOSMEM_NB_ROWS)+1)*8; } else if ((mouse.max_x < 2048) || (mouse.max_y < 2048) || (mouse.max_x != mouse.max_y)) { if ((mouse.max_x > 0) && (mouse.max_y > 0)) { mouse.x = x*mouse.max_x; @@ -590,12 +590,20 @@ static void Mouse_ResetHardware(void){ PIC_SetIRQMask(MOUSE_IRQ,false); } +void Mouse_BeforeNewVideoMode(bool setmode) { + if (CurMode->type!=M_TEXT) RestoreCursorBackground(); + else RestoreCursorBackgroundText(); + mouse.hidden = 1; + mouse.oldhidden = 1; + mouse.background = false; +} + //Does way to much. Many things should be moved to mouse reset one day -void Mouse_NewVideoMode(void) { +void Mouse_AfterNewVideoMode(bool setmode) { mouse.inhibit_draw = false; /* Get the correct resolution from the current video mode */ Bit8u mode = mem_readb(BIOS_VIDEO_MODE); - if(mode == mouse.mode) {LOG(LOG_MOUSE,LOG_NORMAL)("New video is the same as the old"); /*return;*/} + if (setmode && mode == mouse.mode) LOG(LOG_MOUSE,LOG_NORMAL)("New video mode is the same as the old"); mouse.gran_x = (Bit16s)0xffff; mouse.gran_y = (Bit16s)0xffff; switch (mode) { @@ -637,7 +645,6 @@ void Mouse_NewVideoMode(void) { return; } mouse.mode = mode; - mouse.hidden = 1; mouse.max_x = 639; mouse.min_x = 0; mouse.min_y = 0; @@ -648,7 +655,6 @@ void Mouse_NewVideoMode(void) { mouse.hotx = 0; mouse.hoty = 0; - mouse.background = false; mouse.screenMask = defaultScreenMask; mouse.cursorMask = defaultCursorMask; mouse.textAndMask= defaultTextAndMask; @@ -662,7 +668,6 @@ void Mouse_NewVideoMode(void) { mouse.updateRegion_y[1] = 1; mouse.cursorType = 0; mouse.enabled=true; - mouse.oldhidden=1; oldmouseX = static_cast(mouse.x); oldmouseY = static_cast(mouse.y); @@ -672,12 +677,8 @@ void Mouse_NewVideoMode(void) { //Much too empty, Mouse_NewVideoMode contains stuff that should be in here static void Mouse_Reset(void) { - /* Remove drawn mouse Legends of Valor */ - if (CurMode->type!=M_TEXT) RestoreCursorBackground(); - else RestoreCursorBackgroundText(); - mouse.hidden = 1; - - Mouse_NewVideoMode(); + Mouse_BeforeNewVideoMode(false); + Mouse_AfterNewVideoMode(false); Mouse_SetMickeyPixelRate(8,16); mouse.mickey_x = 0;