diff --git a/src/dd.c b/src/dd.c
index 37ffb2a..9e2fb7a 100644
--- a/src/dd.c
+++ b/src/dd.c
@@ -1189,7 +1189,9 @@ HRESULT dd_WaitForVerticalBlank(DWORD dwFlags, HANDLE hEvent)
 {
     if (g_config.maxgameticks == -2)
     {
-        BOOL open = !(g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency));
+        BOOL open = 
+            !(g_config.maxfps < 0 || 
+                (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency));
 
         if (fpsl_dwm_flush() || fpsl_wait_for_vblank(open))
             return DD_OK;
diff --git a/src/fps_limiter.c b/src/fps_limiter.c
index d157612..b8a8ac0 100644
--- a/src/fps_limiter.c
+++ b/src/fps_limiter.c
@@ -14,7 +14,7 @@ void fpsl_init()
     g_fpsl.tick_length_ns = 0;
     g_fpsl.tick_length = 0;
 
-    if (max_fps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))
+    if (max_fps < 0 || (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)))
         max_fps = g_ddraw->mode.dmDisplayFrequency;
 
     if (max_fps > 1000)
@@ -125,7 +125,8 @@ void fpsl_frame_start()
 
 void fpsl_frame_end()
 {
-    if (g_config.maxfps < 0 || (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))
+    if (g_config.maxfps < 0 || 
+        (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency))
     {
         if (fpsl_dwm_flush() || fpsl_wait_for_vblank(TRUE))
             return;
@@ -135,7 +136,7 @@ void fpsl_frame_end()
     {
         if (g_fpsl.htimer)
         {
-            if (g_config.vsync && g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)
+            if (g_config.vsync && (!g_config.maxfps || g_config.maxfps >= g_ddraw->mode.dmDisplayFrequency)
             {
                 WaitForSingleObject(g_fpsl.htimer, g_fpsl.tick_length * 2);
                 LARGE_INTEGER due_time = { .QuadPart = -g_fpsl.tick_length_ns };