Game Gear Micro

FrameBuffer架構


司徒發覺有必要先把FrameBuffer的東西紀錄下來,當作以後的參考資料,因為GGM的屏是一個很奇耙的設計,解析度是240x240,但是,顯示區域則是240x195,為此,司徒在FrameBuffer驅動做了一些處理,從下圖司徒畫的圖可以看到,F1C100S的TCON0是以240x240做更新處理,DEBE則使用4個Layers做處理,解析度都是240x240,資料輸出給屏的機制是使用TE中斷腳位觸發,因此,保證從F1C100S給的資料不會有Buffer覆蓋問題(閃屏),但是,最後回報給User Application則是240x195


為何是以240x195回報給User Application呢?因為,有效顯示區域只有240x195,為了不讓User Application花費多餘力氣處理偏移問題,這也是為何Linux Logo可以正確顯示在GGM屏幕顯示區域的原因,因此,SDL程式可以直接使用240x195製作

#include <stdio.h>
#include <stdlib.h>
#include <SDL.h>
 
int main(int argc, char** argv)
{
  SDL_Rect rt={0};
  SDL_Surface* screen;
 
  SDL_Init(SDL_INIT_VIDEO);
  screen = SDL_SetVideoMode(240, 195, 16, SDL_SWSURFACE);
 
  SDL_FillRect(screen, &screen->clip_rect, SDL_MapRGB(screen->format, 0xff, 0x00, 0x00));
 
  rt.x = 50;
  rt.y = 50;
  rt.w = 30;
  rt.h = 30;
  SDL_FillRect(screen, &rt, SDL_MapRGB(screen->format, 0x00, 0xff, 0x00));
 
  rt.x = 100;
  rt.y = 100;
  rt.w = 50;
  rt.h = 80;
  SDL_FillRect(screen, &rt, SDL_MapRGB(screen->format, 0x00, 0x00, 0xff));
   
  SDL_Flip(screen);
  SDL_Delay(3000);
  SDL_Quit();
  return 0;
}

編譯好的程式還需要設定如下3個環境變數:

# export SDL_NOMOUSE=1
# export SDL_FB_BROKEN_MODES=1
# export SDL_VIDEODRIVER=fbcon

SDL_NOMOUSE:不需要檢查滑鼠
SDL_FB_BROKEN_MODES:將240x195解析度加入預設清單
SDL_VIDEODRIVER:顯示驅動使用FrameBuffer

完成

P.S. 對於需要Double Buffer或者Quadruple Buffer則需要自己做Map


返回上一頁