cpu clock setup, save rom dir, cleanups
[gpsp.git] / video.c
diff --git a/video.c b/video.c
index e1f749e..457a7b5 100644 (file)
--- a/video.c
+++ b/video.c
@@ -79,6 +79,18 @@ static void Ge_Finish_Callback(int id, void *arg)
 {
 }
 
+#define get_screen_pixels()                                                   \
+  screen_pixels                                                               \
+
+#define get_screen_pitch()                                                    \
+  screen_pitch                                                                \
+
+#elif defined(WIZ_BUILD)
+
+static u32 screen_offset = 0;
+static u16 *screen_pixels = NULL;
+const u32 screen_pitch = 320;
+
 #define get_screen_pixels()                                                   \
   screen_pixels                                                               \
 
@@ -3322,6 +3334,20 @@ void flip_screen()
   }
 }
 
+#elif defined(WIZ_BUILD)
+
+void flip_screen()
+{
+  if((screen_scale == scaled_aspect) &&
+   (resolution_width == small_resolution_width) &&
+   (resolution_height == small_resolution_height))
+  {
+    upscale_aspect(gpsp_gp2x_screen, screen_pixels);
+  }
+  pollux_video_flip();
+  screen_pixels = (u16 *)gpsp_gp2x_screen + screen_offset;
+}
+
 #else
 
 #define integer_scale_copy_2()                                                \
@@ -3405,10 +3431,18 @@ void flip_screen()
       SDL_Rect drect = {40, 40, 240, 160};
       SDL_BlitSurface(screen, &srect, hw_screen, &drect);
     }
+    else if((screen_scale == scaled_aspect) &&
+     (resolution_width == small_resolution_width) &&
+     (resolution_height == small_resolution_height))
+    {
+      SDL_Rect drect = {0, 10, 0, 0};
+      SDL_BlitSurface(screen, NULL, hw_screen, &drect);
+    }
     else
     {
       SDL_BlitSurface(screen, NULL, hw_screen, NULL);
     }
+    warm_cache_op_all(WOP_D_CLEAN);
   }
 #else
   SDL_Flip(screen);
@@ -3512,6 +3546,12 @@ void init_video()
   GE_CMD(NOP, 0);
 }
 
+#elif defined(WIZ_BUILD)
+
+void init_video()
+{
+}
+
 #else
 
 void init_video()
@@ -3527,7 +3567,7 @@ void init_video()
   screen = SDL_CreateRGBSurface(SDL_HWSURFACE, 240 * video_scale,
    160 * video_scale, 16, 0xFFFF, 0xFFFF, 0xFFFF, 0);
 
-  gp2x_load_mmuhack();
+  warm_change_cb_upper(WCB_C_BIT|WCB_B_BIT, 1);
 #else
   screen = SDL_SetVideoMode(240 * video_scale, 160 * video_scale, 16, 0);
 #endif
@@ -3640,6 +3680,50 @@ void clear_screen(u16 color)
   sceGuSync(0, 0); */
 }
 
+#elif defined(WIZ_BUILD)
+
+void video_resolution_large()
+{
+  screen_offset = 0;
+  resolution_width = 320;
+  resolution_height = 240;
+
+  fb_use_buffers(1);
+  flip_screen();
+  clear_screen(0);
+}
+
+void video_resolution_small()
+{
+  if(screen_scale == scaled_aspect)
+    screen_offset = 320*(80 - 14) + 80;
+  else
+    screen_offset = 320*40 + 40;
+  resolution_width = 240;
+  resolution_height = 160;
+
+  fb_use_buffers(3);
+  clear_screen(0);
+  flip_screen();
+  clear_screen(0);
+  flip_screen();
+  clear_screen(0);
+}
+
+void set_gba_resolution(video_scale_type scale)
+{
+  screen_scale = scale;
+}
+
+void clear_screen(u16 color)
+{
+  u32 col = ((u32)color << 16) | color;
+  u32 *p = gpsp_gp2x_screen;
+  int c = 320*240/2;
+  while (c-- > 0)
+    *p++ = col;
+}
+
 #else
 
 void video_resolution_large()
@@ -3656,7 +3740,7 @@ void video_resolution_large()
     resolution_height = 240;
   SDL_ShowCursor(0);
 
-  gp2x_load_mmuhack();
+  warm_change_cb_upper(WCB_C_BIT|WCB_B_BIT, 1);
 #else
   screen = SDL_SetVideoMode(480, 272, 16, 0);
   resolution_width = 480;
@@ -3669,11 +3753,18 @@ void video_resolution_small()
   current_scale = screen_scale;
 
 #ifdef GP2X_BUILD
+  int w, h;
   SDL_FreeSurface(screen);
   SDL_GP2X_AllowGfxMemory(NULL, 0);
-  hw_screen = SDL_SetVideoMode((screen_scale == unscaled ? 320 :
-   small_resolution_width * video_scale), (screen_scale == unscaled ? 320 :
-   small_resolution_height * video_scale), 16, SDL_HWSURFACE);
+
+  w = 320; h = 240;
+  if (screen_scale != unscaled)
+  {
+    w = small_resolution_width * video_scale;
+    h = small_resolution_height * video_scale;
+  }
+  if (screen_scale == scaled_aspect) h += 20;
+  hw_screen = SDL_SetVideoMode(w, h, 16, SDL_HWSURFACE);
 
   screen = SDL_CreateRGBSurface(SDL_HWSURFACE,
    small_resolution_width * video_scale, small_resolution_height *
@@ -3681,7 +3772,7 @@ void video_resolution_small()
 
   SDL_ShowCursor(0);
 
-  gp2x_load_mmuhack();
+  warm_change_cb_upper(WCB_C_BIT|WCB_B_BIT, 1);
 #else
   screen = SDL_SetVideoMode(small_resolution_width * video_scale,
    small_resolution_height * video_scale, 16, 0);
@@ -3764,7 +3855,7 @@ void print_string_ext(const char *str, u16 fg_color, u16 bg_color,
 
 
   /* EDIT */
-  if(y + FONT_HEIGHT >= resolution_height)
+  if(y + FONT_HEIGHT > resolution_height)
       return;
 
   while(current_char)
@@ -3808,8 +3899,13 @@ void print_string_ext(const char *str, u16 fg_color, u16 bg_color,
       str_index++;
     }
 
-    if(current_x + FONT_WIDTH >= resolution_width /* EDIT */)
-      break;
+    if(current_x + FONT_WIDTH > resolution_width /* EDIT */)
+    {
+      while (current_char && current_char != '\n')
+      {
+        current_char = str[str_index++];
+      }
+    }
   }
 }
 
@@ -3919,7 +4015,8 @@ void debug_screen_printl(const char *format, ...)
 
   va_start(ap, format);
   debug_screen_printf(format, ap);
-  debug_screen_printf("\n");
+  debug_screen_newline(1);
+//  debug_screen_printf("\n");
   va_end(ap);
 }