亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? lcd15xx.c

?? 這是我移植到GBA游戲機上的uCGUI3.24 可以通過模擬器仿真
?? C
?? 第 1 頁 / 共 5 頁
字號:
  DataR_Valid= 0xff;                    /* All bits are valid. */
  #if (LCD_NUM_CONTROLLERS == 1)
    DataR_Cache= ReadVMem0();
  #else
    switch (CurController) {
    case 0:
      DataR_Cache= ReadVMem0(); break;
    case 1:
      DataR_Cache= ReadVMem1(); break;
    #if (LCD_NUM_CONTROLLERS >2)
    case 2:
      DataR_Cache= ReadVMem2(); break;
    #endif
    #if (LCD_NUM_CONTROLLERS >3)
    case 3:
      DataR_Cache= ReadVMem3(); break;
    #endif
    }
  #endif    /* LCD_NUM_CONTROLLERS == 1 */
}
#endif

#if (LCD_NUM_CONTROLLERS > 1)
typedef void (tWriteVMem)(void);
tWriteVMem* aWriteVMemX[] = {
  WriteVMem0,WriteVMem1
#if (LCD_NUM_CONTROLLERS >2)
  ,WriteVMem2
#endif
#if (LCD_NUM_CONTROLLERS >3)
  ,WriteVMem3
#endif
}; 
#endif 

static void Flush(void) {
  /* Nothing to write ? Then we are done !*/
  if (DataW_Dirty==0)
    return;
  /* All bits are dirty ? Then write`em all, dont read !!*/
  if (DataW_Dirty!=0xff) {
    /* Only some are dirty ... We have to read the byte ! */
    if (!DataR_Valid) {
      ReadData();         /* Get current byte in our cache */
    }
    DataW_Cache &= DataW_Dirty;
    DataW_Cache |= DataR_Cache & (~DataW_Dirty);
  }
  DataR_Cache = DataW_Cache;
#if (LCD_NUM_CONTROLLERS == 1)
  WriteVMem0();
#else
  aWriteVMemX[CurController]();
#endif
  DataW_Dirty = 0;              /* No more bits to write */
}

/*
        *****************************************
        *                                       *
        *         Find Byte                     *
        *                                       *
        *****************************************

Due to the setup options reg. the area of the display which is covered
by one LCD-controller and the fact that different display controllers
can controll arbitrary areas of the display as defined in the
config-file, It can be a tricky job to find out which display
controller is concerned, where in the video memory of that particular
controller the byte is located and how many bits are left (i.e. what
the minimal and maximal physical y-position is).
Note that this job is a lot easier in a single controller system,
where the entire routine could be placed in a macro.
*/
#if (LCD_SUPPORT_SEGTRANS==0)
  #define CALCCOL(Con) Col  = DataCacheX-LCD_XORG##Con
#else
  #define CALCCOL(Con) Col  = LCD__aRow2Seg##Con[DataCacheX-LCD_XORG##Con]
#endif

#if (LCD_SUPPORT_COMTRANS==0)
  #define CALCY(Con) \
    DataCacheY0 = DataCacheY &(~7);    \
    DataCacheY1 = DataCacheY0+  7;     \
    Page = (DataCacheY0-LCD_YORG##Con)>>3
#else
    #define CALCY(Con) \
    DataCacheY1 = DataCacheY0 = DataCacheY; \
    {                                       \
      int Com = LCD__aLine2Com##Con[DataCacheY-LCD_YORG##Con]; \
      Page = Com>>3;                                   \
      DataCacheYBit0 = DataCacheY-(Com&7);             \
    }
#endif

#define IF_INLEFT(Con)   if (DataCacheX >= LCD_XORG##Con)
#define IF_INRIGHT(Con)  if (DataCacheX <= LCD_XORG##Con+LCD_NUM_SEGS##Con-1)
#define IF_INTOP(Con)    if (DataCacheY >= LCD_YORG##Con)
#define IF_INBOTTOM(Con) if (DataCacheY <= LCD_YORG##Con+LCD_NUM_COMS##Con-1)

#define IF_INAREA(Con)                                    \
   IF_INRIGHT(Con)                                        \
   IF_INLEFT(Con)                                         \
   IF_INTOP(Con)                                          \
   IF_INBOTTOM(Con)


#define CALCXY(Con) \
  CALCCOL(Con);      \
  CALCY(Con);      \
  pCacheByte = &Cache##Con[Page][Col];  \
  CurController = Con;

/* This is an optimization for a single controller system */
  #if (LCD_NUM_CONTROLLERS == 1)
	#define FindByte() \
	CALCCOL(0); CALCY(0); pCacheByte = &Cache0[Page][Col];
/*	CALCCOL(0); CALCY(0); pCacheByte = &Cache0[Page][Col-LCD_FIRSTSEG0];*/
  #endif

/* This is an optimization for a 2 controller system */
#if (LCD_NUM_CONTROLLERS == 2)
  #if (LCD_XORG0==LCD_XORG1)
    #undef IF_INAREA
    #if (LCD_YORG0 == LCD_YORG)
      #define IF_INAREA(Con) IF_INBOTTOM(Con)
    #else
      #define IF_INAREA(Con) IF_INTOP(Con)
    #endif
	#define FindByte() IF_INAREA(0) { CALCXY(0); } else { CALCXY(1); }
  #endif
#endif

/* The actual routine ... */
#ifndef FindByte
static void FindByte(void) {
  #if (LCD_NUM_CONTROLLERS > 1)
  /* Check if controller 0 is concerned */
    IF_INAREA(0)
    {
      CALCXY(0);
      return;
    }
  /* Check if controller 1 is concerned, but only
     in a system with more than 2 controllers */
  #if (LCD_NUM_CONTROLLERS > 2)
    IF_INAREA(1)
  #endif
    {
      CALCXY(1);
      return;
    }
  /* Check if controller 2 is concerned */
    #if (LCD_NUM_CONTROLLERS > 3)
      #if (LCD_NUM_CONTROLLERS > 3)
      IF_INAREA(2)
      #endif
    {
      CALCXY(2);
      return;
    }
    #endif
  /* Check if controller 3 is concerned */
    #if (LCD_NUM_CONTROLLERS >3)
      #if (LCD_NUM_CONTROLLERS >4)
      IF_INAREA(3)
      #endif
    {
      CALCXY(3);
      return;
    }
    #endif
    /* This should never happen ! */
  #endif
}
#endif

/*
        *****************************************
        *                                       *
        *         Set new Position              *
        *                                       *
        *****************************************
*/

static void Goto(void) {
  U8* pCacheByteTemp[2];
  U8  PageTemp[2];
  U8  ColTemp[2];
  #if (LCD_NUM_CONTROLLERS > 1)
    U8  CurControllerTemp[2];
  #endif
  DataR_Valid=0;       /* No info about what's in the data byte */
  if (DataW_Dirty == 0) {
    FindByte();
    return;
  }
  /* Save the current values because FindByte will overwrite them */
  pCacheByteTemp[0]        = pCacheByte;
  PageTemp[0]              = Page;
  ColTemp[0]               = Col;
  #if (LCD_NUM_CONTROLLERS > 1)
    CurControllerTemp[0]     = CurController;
  #endif
  FindByte();
  if (pCacheByteTemp[0] != pCacheByte) {
    /* Save the new values */
    pCacheByteTemp[1]        = pCacheByte;
    PageTemp[1]              = Page;
    ColTemp[1]               = Col;
    #if (LCD_NUM_CONTROLLERS > 1)
      CurControllerTemp[1] = CurController;
    #endif
    /* Restore the old values for writing */
    pCacheByte        = pCacheByteTemp[0];
    Page              = PageTemp[0];
    Col               = ColTemp[0];
    #if (LCD_NUM_CONTROLLERS > 1)
      CurController = CurControllerTemp[0];
    #endif
    Flush();
    /* Restore the new (current) values */
    pCacheByte        = pCacheByteTemp[1];
    Page              = PageTemp[1];
    Col               = ColTemp[1];
    DataR_Valid=0;       /* We have no more info about what's in the data byte */
    #if (LCD_NUM_CONTROLLERS > 1)
      CurController = CurControllerTemp[1];
    #endif
  }
}

/*
        *****************************************
        *                                       *
        *         Set X and Y- Position         *
        *                                       *
        *****************************************

   Check if we already have the right byte in the buffer.
   This works only if COM-Lines are straight, otherwise it is just
   a waste of CPU-time.
*/

#if (LCD_SUPPORT_COMTRANS)
  #define GotoXY(x,y)                     \
    DataCacheY = y;                                                      \
    DataCacheX = x;                         \
    Goto()
#else
static void GotoXY(int x, int y) {
  DataCacheY = y;                                                          
  if ((x == DataCacheX) &&                  
      (y >= DataCacheY0) &&     (y <= DataCacheY1))
  {
    return;                                 
  }                                         
  DataCacheX = x;                         
  Goto();
}
#endif

/*
        *****************************************
        *                                       *
        *         Set Y- Position               *
        *                                       *
        *****************************************
*/

#if (!LCD_SUPPORT_COMTRANS)     /* Only used if COMs are straight ! */
static void GotoY(int y) {
/* Check if we already have the right byte in the buffer.
   This works only if COM-Lines are straight, otherwise it is just
   a waste of CPU-time.
 */
  DataCacheY = y;    
  if ((y >= DataCacheY0) && (y <= DataCacheY1))
    return;
  Goto();
}
#endif


#if (LCD_SUPPORT_COMTRANS)
#define GotoYPlus1()           \
  DataCacheY++;                \
        Goto()
#else
static void GotoYPlus1(void) {
  DataCacheY++;
  if ((DataCacheY >= DataCacheY0) && (DataCacheY <= DataCacheY1))
    return;
        Goto();
}
#endif

/*
  ********************************************************************
  *                                                                  *
  *                Drawing routines, internal                        *
  *                                                                  *
  ********************************************************************
*/

static const U8 Bit2Mask[] = { 1,2,4,8,16,32,64,128 };

/*
        *****************************************
        *                                       *
        *           Xor pixel                   *
        *                                       *
        *****************************************
*/

/*
static void XORPIXEL() {
  U8 HWMask;
  LOADDATA();
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];
  DataW_Dirty |= HWMask;
  DataW_Cache ^= HWMask;
}
*/
#define XORPIXEL() {                             \
  U8 HWMask;\
  LOADDATA(); /* For XOR operations, the byte needs to be loaded */ \
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];\
  DataW_Dirty |= HWMask;\
  DataW_Cache ^= HWMask;\
}

static void XorPixel(void) {
  XORPIXEL();
}

/*
        *****************************************
        *                                       *
        *     Set pixel, internal drawing       *
        *                                       *
        *****************************************
*/
/*
static void SETPIXEL() {
  U8 HWMask;
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];
  DataW_Dirty |= HWMask;
  DataW_Cache |= HWMask;
}
*/
#define SETPIXEL() {                             \
  U8 HWMask;										 \
  HWMask = Bit2Mask[DataCacheY-DataCacheYBit0];	 \
  DataW_Dirty |= HWMask;							 \
  DataW_Cache |= HWMask;							 \
}

static void SetPixel(void) {
  SETPIXEL();
}

/*
        *********************************************************
        *                                                       *
        *       LCD_L0_XorPixel                                 *
        *                                                       *
        *********************************************************

Purpose:  This routine is called by emWin. It writes 1 pixel into the
          display.

*/

void LCD_L0_XorPixel(int x, int y) {
  GotoXY(x,y);
  LOADDATA();
  XORPIXEL();
}

/*
        *****************************************
        *                                       *
        *       Clear pixel                     *
        *                                       *
        *****************************************
*/

/*
static v

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
蜜桃精品视频在线| 成人av免费观看| 亚洲人精品午夜| 91精品国产综合久久久久久| 成人国产一区二区三区精品| 亚洲国产日韩a在线播放| 久久亚洲一区二区三区明星换脸| 一本大道久久a久久精品综合| 精品一区二区三区免费观看 | 91丨porny丨蝌蚪视频| 美女免费视频一区二区| 亚洲综合小说图片| 国产精品国产精品国产专区不片| 欧美大片国产精品| 欧美日韩国产免费| 色婷婷综合久色| 成人免费黄色在线| 韩国女主播成人在线观看| 香蕉久久一区二区不卡无毒影院| 国产精品国产成人国产三级| 国产日韩亚洲欧美综合| 欧美成人精品高清在线播放| 欧美人与禽zozo性伦| 在线观看欧美黄色| 一本大道av伊人久久综合| 丁香六月久久综合狠狠色| 国产一区二区三区精品欧美日韩一区二区三区| 亚洲一区二区在线观看视频 | 日日夜夜精品免费视频| 亚洲精品综合在线| 一区二区三区 在线观看视频| 国产精品美女www爽爽爽| 亚洲三级电影网站| 中文字幕免费观看一区| 国产农村妇女毛片精品久久麻豆| 久久婷婷国产综合精品青草| 欧美精品一区视频| 26uuu国产一区二区三区| 精品日韩一区二区| 久久蜜桃香蕉精品一区二区三区| 久久久亚洲午夜电影| 26uuu成人网一区二区三区| 久久久久国产一区二区三区四区| 久久久久久久久久久久久夜| 国产三级精品视频| 国产精品欧美精品| 亚洲精品你懂的| 亚洲bdsm女犯bdsm网站| 奇米影视在线99精品| 久久99这里只有精品| 国产精品影视在线观看| 成人黄页在线观看| 在线观看亚洲成人| 在线观看视频欧美| 91精品国产麻豆国产自产在线| 日韩一级在线观看| 久久蜜臀精品av| 亚洲欧美日韩久久| 天天av天天翘天天综合网| 欧美色涩在线第一页| 日韩写真欧美这视频| 激情综合色播五月| 不卡的av网站| 波多野洁衣一区| 色久优优欧美色久优优| 欧美精品v日韩精品v韩国精品v| 欧美成人video| 欧美国产精品中文字幕| 亚洲最新视频在线播放| 蜜桃av一区二区三区| 成人动漫视频在线| 欧美日韩国产另类不卡| 欧美精品一区视频| 一区二区三区在线视频免费| 日韩精品五月天| 成人h精品动漫一区二区三区| 色综合久久88色综合天天免费| 777亚洲妇女| 中文字幕久久午夜不卡| 午夜国产精品一区| 国产成人av影院| 精品视频免费看| 中文字幕第一页久久| 亚洲第一成年网| 成人在线视频首页| 欧美日韩不卡在线| 国产精品久久久久久久久果冻传媒| 偷拍日韩校园综合在线| 成人美女视频在线看| 欧美一区二区三区免费| 亚洲免费观看高清完整版在线观看| 美女爽到高潮91| 欧美吻胸吃奶大尺度电影| 国产网红主播福利一区二区| 午夜精品影院在线观看| 91丨porny丨国产| 久久久精品综合| 日韩电影免费在线观看网站| 成人免费高清在线| 精品久久久久久最新网址| **性色生活片久久毛片| 国产精品一区二区久激情瑜伽| 欧美日韩中文字幕一区| 一色桃子久久精品亚洲| 国产乱码一区二区三区| 91精品国产麻豆| 亚洲小说欧美激情另类| 91视频国产观看| 国产日产亚洲精品系列| 久久99久久精品欧美| 欧美日本在线观看| 亚洲午夜电影在线| 91麻豆精品在线观看| 中文字幕欧美三区| 国产在线精品一区二区三区不卡| 91精品国产福利| 亚洲地区一二三色| 欧洲一区二区三区在线| 亚洲图片激情小说| 成人av网站在线观看| 欧美激情在线看| 成人综合婷婷国产精品久久蜜臀 | 久久综合久久久久88| 日韩精品免费视频人成| 欧美天天综合网| 亚洲二区在线观看| 欧美日免费三级在线| 亚洲一区在线视频| 欧美视频日韩视频| 五月综合激情婷婷六月色窝| 欧美日韩精品福利| 亚洲gay无套男同| 欧美精品在线一区二区| 午夜精品久久久久久久| 欧美日韩视频一区二区| 丝袜a∨在线一区二区三区不卡| 欧美日韩日日骚| 午夜欧美视频在线观看| 欧美一区二区高清| 国产真实精品久久二三区| 久久亚洲捆绑美女| 高清国产一区二区三区| 亚洲视频电影在线| 精品视频123区在线观看| 日本亚洲天堂网| 精品国产露脸精彩对白| 高清不卡一二三区| 亚洲欧美偷拍卡通变态| 欧洲生活片亚洲生活在线观看| 亚洲国产一二三| 欧美一区二区三区日韩| 国产伦精品一区二区三区免费迷| 国产欧美日韩久久| 日本福利一区二区| 亚洲大型综合色站| 欧美精品一区二区三区蜜臀| 国产成人啪午夜精品网站男同| 中文字幕中文字幕在线一区 | 日韩欧美精品在线| 国产一区二区视频在线| 国产精品久久久久久久久久免费看 | 石原莉奈在线亚洲三区| 久久久精品综合| 色狠狠桃花综合| 日本成人中文字幕| 日本一区二区三区国色天香 | 欧美精品亚洲一区二区在线播放| 免费日本视频一区| 亚洲国产精品ⅴa在线观看| 欧美在线观看一区二区| 久久99精品网久久| 国产精品久久看| 欧美日韩激情在线| 国产成都精品91一区二区三| 亚洲成人自拍网| 国产日韩一级二级三级| 欧美日韩电影在线播放| 激情都市一区二区| 一区二区成人在线视频| 精品裸体舞一区二区三区| 色婷婷久久久综合中文字幕| 精品一区二区久久久| 一区二区三区在线视频观看| 精品国产乱码久久久久久老虎 | 欧美天堂一区二区三区| 国产高清无密码一区二区三区| 夜夜夜精品看看| 国产欧美精品一区aⅴ影院 | 国产美女视频一区| 亚洲一二三四区| 中文字幕国产一区| 日韩欧美在线网站| 在线国产亚洲欧美| 国产大片一区二区| 久久精品av麻豆的观看方式| 一区二区在线看| 成人欧美一区二区三区视频网页| 欧美xfplay| 91精品国产综合久久精品图片| 99re在线精品|