extern void *hGPUDriver;
        void (*rearmed_set_cbs)(const struct rearmed_cbs *cbs);
 
+       pl_rearmed_cbs.screen_centering_type_default =
+               Config.hacks.gpu_centering ? C_INGAME : C_AUTO;
+
        rearmed_set_cbs = SysLoadSym(hGPUDriver, "GPUrearmedCallbacks");
        if (rearmed_set_cbs != NULL)
                rearmed_set_cbs(&pl_rearmed_cbs);
 
        // misc
        int gpu_caps;
        int screen_centering_type;
+       int screen_centering_type_default;
        int screen_centering_x;
        int screen_centering_y;
 };
 
        "SLPS01919", "SLPS01920",
 };
 
+static const char * const gpu_centering_hack_db[] =
+{
+       /* Gradius Gaiden */
+       "SLPM86042", "SLPM86103", "SLPM87323",
+       /* Sexy Parodius */
+       "SLPM86009",
+};
+
 #define HACK_ENTRY(var, list) \
        { #var, &Config.hacks.var, list, ARRAY_SIZE(list) }
 
 {
        HACK_ENTRY(cdr_read_timing, cdr_read_hack_db),
        HACK_ENTRY(gpu_slow_list_walking, gpu_slow_llist_db),
-       HACK_ENTRY(gpu_busy_hack, gpu_busy_hack_db),
+       HACK_ENTRY(gpu_busy, gpu_busy_hack_db),
+       HACK_ENTRY(gpu_centering, gpu_centering_hack_db),
 };
 
 static const struct
 
        struct {
                boolean cdr_read_timing;
                boolean gpu_slow_list_walking;
-               boolean gpu_busy_hack;
+               boolean gpu_busy;
+               boolean gpu_centering;
        } hacks;
 } PcsxConfig;
 
 
        cdrReset();
        psxRcntInit();
        HW_GPU_STATUS = SWAP32(0x10802000);
-       psxHwReadGpuSRptr = Config.hacks.gpu_busy_hack
+       psxHwReadGpuSRptr = Config.hacks.gpu_busy
                ? psxHwReadGpuSRbusyHack : psxHwReadGpuSR;
 }
 
 
   int hres = hres_all[(gpu.status >> 16) & 7];
   int pal = gpu.status & PSX_GPU_STATUS_PAL;
   int sw = gpu.screen.x2 - gpu.screen.x1;
+  int type = gpu.state.screen_centering_type;
   int x = 0, x_auto;
+  if (type == C_AUTO)
+    type = gpu.state.screen_centering_type_default;
   if (sw <= 0)
     /* nothing displayed? */;
   else {
     x = (x + 1) & ~1;   // blitter limitation
     sw /= hdiv;
     sw = (sw + 2) & ~3; // according to nocash
-    switch (gpu.state.screen_centering_type) {
+    switch (type) {
     case C_INGAME:
       break;
     case C_MANUAL:
   gpu.state.frame_count = cbs->gpu_frame_count;
   gpu.state.allow_interlace = cbs->gpu_neon.allow_interlace;
   gpu.state.enhancement_enable = cbs->gpu_neon.enhancement_enable;
+  gpu.state.screen_centering_type_default = cbs->screen_centering_type_default;
   if (gpu.state.screen_centering_type != cbs->screen_centering_type
       || gpu.state.screen_centering_x != cbs->screen_centering_x
       || gpu.state.screen_centering_y != cbs->screen_centering_y) {
 
     } last_list;
     uint32_t last_vram_read_frame;
     uint32_t w_out_old, h_out_old, status_vo_old;
-    int screen_centering_type; // 0 - auto, 1 - game conrolled, 2 - manual
+    short screen_centering_type;
+    short screen_centering_type_default;
     int screen_centering_x;
     int screen_centering_y;
   } state;