diff -U 3 -H -d -r -N -- puNES_old/src/core/conf.h puNES_new/src/core/conf.h
--- puNES_old/src/core/conf.h	2019-05-13 19:05:26.878865211 +0200
+++ puNES_new/src/core/conf.h	2019-05-13 17:51:08.000000000 +0200
@@ -43,6 +43,7 @@
 	BYTE scale;
 	BYTE fullscreen;
 	BYTE fullscreen_in_window;
+	BYTE center_in_fullscreen;
 	DBWORD filter;
 	DBWORD shader;
 	BYTE ntsc_format;
diff -U 3 -H -d -r -N -- puNES_old/src/gui/cmd_line.cpp puNES_new/src/gui/cmd_line.cpp
--- puNES_old/src/gui/cmd_line.cpp	2019-05-13 19:05:27.006865211 +0200
+++ puNES_new/src/gui/cmd_line.cpp	2019-05-13 18:50:44.000000000 +0200
@@ -88,6 +88,7 @@
 	{ "save-battery-ram-file", req_arg,  0 },
 	{ "language",              req_arg,  0 },
 	{ "fullscreen-window",     req_arg,  0 },
+	{ "center-fullscreen",     req_arg,  0 },
 	{ "audio-output-device",   req_arg,  0 },
 	{ "shader",                req_arg,  0 },
 	{ "overscan-blk-brd",      req_arg,  0 },
@@ -182,6 +183,8 @@
 					set_int(cfg_from_file.language, SET_GUI_LANGUAGE);
 				} else if (key == "fullscreen-window") {
 					set_int(cfg_from_file.fullscreen_in_window, SET_FULLSCREEN_IN_WINDOW);
+				} else if (key == "center-fullscreen") {
+					set_int(cfg_from_file.center_in_fullscreen, SET_CENTER_IN_FULLSCREEN);
 				} else if (key == "audio-output-device") {
 					set_cpy_utchar_to_val(cfg_from_file.audio_output, SET_AUDIO_OUTPUT_DEVICE);
 				} else if (key == "shader") {
@@ -365,6 +368,7 @@
 			main_cfg[SET_OVERSCAN_BRD_PAL].hlp,
 			main_cfg[SET_FULLSCREEN].hlp,
 			main_cfg[SET_FULLSCREEN_IN_WINDOW].hlp,
+			main_cfg[SET_CENTER_IN_FULLSCREEN].hlp,
 			main_cfg[SET_STRETCH_FULLSCREEN].hlp,
 			main_cfg[SET_AUDIO_OUTPUT_DEVICE].hlp,
 			main_cfg[SET_AUDIO].hlp,
diff -U 3 -H -d -r -N -- puNES_old/src/gui/objSettings.cpp puNES_new/src/gui/objSettings.cpp
--- puNES_old/src/gui/objSettings.cpp	2019-05-13 19:05:27.022865211 +0200
+++ puNES_new/src/gui/objSettings.cpp	2019-05-13 18:58:03.000000000 +0200
@@ -709,6 +709,7 @@
 #endif
 		int_to_val(SET_FULLSCREEN, cfg_from_file.fullscreen);
 		int_to_val(SET_FULLSCREEN_IN_WINDOW, cfg_from_file.fullscreen_in_window);
+		int_to_val(SET_CENTER_IN_FULLSCREEN, cfg_from_file.center_in_fullscreen);
 		int_to_val(SET_STRETCH_FULLSCREEN, cfg_from_file.stretch);
 	}
 
@@ -794,6 +795,7 @@
 #endif
 		cfg_from_file.fullscreen = val_to_int(SET_FULLSCREEN);
 		cfg_from_file.fullscreen_in_window = val_to_int(SET_FULLSCREEN_IN_WINDOW);
+		cfg_from_file.center_in_fullscreen = val_to_int(SET_CENTER_IN_FULLSCREEN);
 		cfg_from_file.stretch = val_to_int(SET_STRETCH_FULLSCREEN);
 	}
 
diff -U 3 -H -d -r -N -- puNES_old/src/gui/settings.h puNES_new/src/gui/settings.h
--- puNES_old/src/gui/settings.h	2019-05-13 19:05:27.026865211 +0200
+++ puNES_new/src/gui/settings.h	2019-05-13 18:31:04.000000000 +0200
@@ -75,6 +75,7 @@
 #endif
 	SET_FULLSCREEN,
 	SET_FULLSCREEN_IN_WINDOW,
+	SET_CENTER_IN_FULLSCREEN,
 	SET_STRETCH_FULLSCREEN,
 	SET_AUDIO_OUTPUT_DEVICE,
 	SET_AUDIO_BUFFER_FACTOR,
@@ -696,6 +697,12 @@
 		{LENGTH(opt_no_yes), opt_no_yes}
 	},
 	{
+		uL("video"), uL("center in fullscreen"), uL("no"),
+		uL("# possible values: yes, no"),
+		uL("    --center-fullscreen   no comment            : yes, no"),
+		{LENGTH(opt_no_yes), opt_no_yes}
+	},
+	{
 		uL("video"), uL("stretch in fullscreen"), uL("no"),
 		uL("# possible values: yes, no"),
 		uL("-t, --stretch-fullscreen  stretch image         : yes, no"),
diff -U 3 -H -d -r -N -- puNES_old/src/video/opengl/opengl.c puNES_new/src/video/opengl/opengl.c
--- puNES_old/src/video/opengl/opengl.c	2019-05-13 19:05:27.038865212 +0200
+++ puNES_new/src/video/opengl/opengl.c	2019-05-13 19:11:45.934866995 +0200
@@ -206,21 +206,33 @@
 
 		if (cfg->fullscreen) {
 			if (!cfg->stretch) {
-				float ratio_frame = (float) gfx.w[VIDEO_MODE] / (float) gfx.h[VIDEO_MODE];
-				float ratio_surface;
-
-				if (overscan.enabled && (cfg->oscan_black_borders_fscr == FALSE)) {
-					ratio_surface = _SCR_ROWS_BRD / _SCR_LINES_BRD;
-				} else {
-					ratio_surface = _SCR_ROWS_NOBRD / _SCR_LINES_NOBRD;
-				}
-
-				if (ratio_frame > ratio_surface) {
-					vp->w = (int) ((float) gfx.h[VIDEO_MODE] * ratio_surface);
-					vp->x = (int) (((float) gfx.w[VIDEO_MODE] - (float) vp->w) * 0.5f);
+				if (!cfg->center_in_fullscreen) {
+					float ratio_frame = (float) gfx.w[VIDEO_MODE] / (float) gfx.h[VIDEO_MODE];
+					float ratio_surface;
+	
+					if (overscan.enabled && (cfg->oscan_black_borders_fscr == FALSE)) {
+						ratio_surface = _SCR_ROWS_BRD / _SCR_LINES_BRD;
+					} else {
+						ratio_surface = _SCR_ROWS_NOBRD / _SCR_LINES_NOBRD;
+					}
+	
+					if (ratio_frame > ratio_surface) {
+						vp->w = (int) ((float) gfx.h[VIDEO_MODE] * ratio_surface);
+						vp->x = (int) (((float) gfx.w[VIDEO_MODE] - (float) vp->w) * 0.5f);
+					} else {
+						vp->h = (int) ((float) gfx.w[VIDEO_MODE] / ratio_surface);
+						vp->y = (int) (((float) gfx.h[VIDEO_MODE] - (float) vp->h) * 0.5f);
+					}
 				} else {
-					vp->h = (int) ((float) gfx.w[VIDEO_MODE] / ratio_surface);
-					vp->y = (int) (((float) gfx.h[VIDEO_MODE] - (float) vp->h) * 0.5f);
+					int mul =
+						gfx.w[VIDEO_MODE] > gfx.h[VIDEO_MODE]
+						? (gfx.h[VIDEO_MODE] - (gfx.h[VIDEO_MODE] % gfx.h[PASS0])) / gfx.h[PASS0]
+						: (gfx.w[VIDEO_MODE] - (gfx.w[VIDEO_MODE] % gfx.w[PASS0])) / gfx.w[PASS0]
+					;
+					vp->w = gfx.w[PASS0] * mul;
+					vp->h = gfx.h[PASS0] * mul;
+					vp->x = (gfx.w[VIDEO_MODE] - vp->w) >> 1;
+					vp->y = (gfx.h[VIDEO_MODE] - vp->h) >> 1;
 				}
 			}
 
