LCDMemC.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:48k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : LCDMem.C
  16. Purpose     : Driver for LCDs using internal memory
  17. ----------------------------------------------------------------------
  18. Version-Date---Author-Explanation
  19. ----------------------------------------------------------------------
  20. 2.01a   010927 JE     a) Reworked to work with LCD_MIRROR_...
  21.                          and LCD_SWAP_XY
  22. 2.01    010814 JE     a) Support for 6bpp added,
  23.                          HLine & 1bpp optimized
  24. 2.00    010402 RS     a) LCD_GetDevCaps removed from driver
  25.                          (now LCD.c)
  26. 0.92    000122 RS     _GetPixel functionality written
  27. 0.91    000121 RS     Default for LCD_VRAMTYPE defined
  28. 0.90    991205 RS     Driver accelerated
  29. 0.00    990118 RS     First release. 
  30. ----------------------------------------------------------------------
  31. Known problems or limitations with current version
  32. ----------------------------------------------------------------------
  33. None.
  34. ---------------------------LIST OF CONFIG SWITCHES--------------------
  35. The following is a list of additional configuration switches for this
  36. driver. These switches might not be listed in the manual, because
  37. the manual mainly covers the general config switches which are
  38. supported by all drivers.
  39. ----------------------------------------------------------------------
  40. define ----------------------Explanation------------------------------
  41. LCD_LSB_SHIFT                Support for both big and little endian
  42.                              systems.
  43.                              0 for little endian (default),
  44.                              8 for big endian.
  45. LCD_OPTIMIZE                 Controls the use of optimized routines.
  46.                              If 1, several (speed) optimizations are used.
  47.                              Default: ON (1)
  48. LCD_VRAMTYPE                 Controls storage area of VRAM
  49. ---------------------------END-OF-HEADER------------------------------
  50. */
  51. #define LCDMEMC_C
  52. #include <string.h>             /* for memset */
  53. #include <stddef.h>           /* needed for definition of NULL */
  54. #include "LCD_Private.h"      /* private modul definitions & config */
  55. #include "GUI_Private.h"
  56. #include "GUIDebug.h"
  57. #include "LCD_0.h"            /* Defines for first display */
  58. #ifndef LCD_VRAMTYPE
  59.   #define LCD_VRAMTYPE
  60. #endif
  61. #if (LCD_CONTROLLER   == 0) && ((LCD_FIXEDPALETTE == 111) || (LCD_FIXEDPALETTE == 222)) 
  62.       && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  63.    /* Generate code only if selected ! */
  64. #define LCD_BYTESPERLINE (3*(((LCD_VXSIZE_PHYS)+7)/8))
  65. #ifndef WIN32
  66.   #if   (LCD_BITSPERPIXEL == 3)
  67.     LCD_VRAMTYPE U8 LCD_VRam[LCD_BITSPERPIXEL/3][LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
  68.   #elif (LCD_BITSPERPIXEL == 6)
  69.     LCD_VRAMTYPE U8 LCD_VRam_0[LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
  70.     LCD_VRAMTYPE U8 LCD_VRam_1[LCD_VYSIZE_PHYS * LCD_BYTESPERLINE];
  71.   #endif
  72. #else
  73.   U8* GetpVRam(int);
  74.   #if   (LCD_BITSPERPIXEL == 3)
  75.     U8* pVRam;
  76.   #elif (LCD_BITSPERPIXEL == 6)
  77.     U8* pVRam_0;
  78.     U8* pVRam_1;
  79.   #endif
  80. #endif
  81. /*
  82.   ********************************************************************
  83.   *                                                                  *
  84.   *            Defaults for configuration                            *
  85.   *                                                                  *
  86.   ********************************************************************
  87. Please be aware that not all configuration errors can be captured !
  88. */
  89. #ifndef LCD_VERIFY
  90.   #define LCD_VERIFY (0)
  91. #endif
  92. /* Switch for support of multiple pages.
  93.  Only available with certain LCD-controllers */
  94. #ifndef LCD_SUPPORT_PAGING
  95.   #define LCD_SUPPORT_PAGING            (0)
  96. #endif
  97. /* Switch for support of run-time inversion of display. */
  98. #ifndef LCD_SUPPORT_REVERSEMODE
  99.   #define LCD_SUPPORT_REVERSEMODE       (0)
  100. #endif
  101. /* Switch support for the LCD_SetOrg function of the driver */
  102. #ifndef LCD_SUPPORT_SETORG
  103.   #define LCD_SUPPORT_SETORG            (1)
  104. #endif
  105. #ifndef LCD_SUPPORT_PALETTE
  106.   #define LCD_SUPPORT_PALETTE            (1)
  107. #endif
  108. #ifndef LCD_SCHEDULE_CNT
  109.   #define LCD_SCHEDULE_CNT        (0)
  110. #endif
  111. #ifndef LCD_ISRDATA
  112.   #define LCD_ISRDATA
  113. #endif
  114.   
  115. /* Bit position of least sig. byte when accessing words */
  116. #ifndef LCD_LSB_SHIFT
  117.   #define LCD_LSB_SHIFT                 (0)
  118. #endif
  119. #ifndef LCD_OPTIMIZE
  120.   #define LCD_OPTIMIZE                (1)
  121. #endif
  122. /*
  123.   ********************************************************************
  124.   *                                                                  *
  125.   *                Support for Segment/COMLUTs                       *
  126.   *                                                                  *
  127.   ********************************************************************
  128. */
  129. /* For compatibility with older configs, define defaults */
  130. #ifndef LCD_SUPPORT_COMTRANS
  131.   #define LCD_SUPPORT_COMTRANS 0
  132. #endif
  133. #ifndef LCD_SUPPORT_SEGTRANS
  134.   #define LCD_SUPPORT_SEGTRANS 0
  135. #endif
  136. #if LCD_SUPPORT_COMTRANS
  137.   extern U8 LCD__aLine2Com0[LCD_LASTCOM0-LCD_FIRSTCOM0+1];
  138. #endif
  139. #if LCD_SUPPORT_SEGTRANS
  140.   extern U8 LCD__aRow2Seg0[LCD_LASTSEG0-LCD_FIRSTSEG0+1];
  141. #endif
  142. /*
  143.   ********************************************************************
  144.   *                                                                  *
  145.   *                 Macro calculations                               *
  146.   *                                                                  *
  147.   ********************************************************************
  148. */
  149. /* Define number of used coms/segments per controller */
  150. #define LCD_NUM_SEGS0 (LCD_LASTSEG0-LCD_FIRSTSEG0+1)
  151. #define LCD_NUM_COMS0 (LCD_LASTCOM0-LCD_FIRSTCOM0+1)
  152. /* Define total number of used coms/segments */
  153. #define LCD_NUM_SEGS LCD_NUM_SEGS0
  154. #define LCD_NUM_COMS LCD_NUM_COMS0
  155. #define BKCOLOR LCD_BKCOLORINDEX
  156. #define   COLOR LCD_COLORINDEX
  157. /*
  158.   ********************************************************************
  159.   *                                                                  *
  160.   *            Configuration switch checking                         *
  161.   *                                                                  *
  162.   ********************************************************************
  163. Please be aware that not all configuration errors can be captured !
  164. */
  165. #if (LCD_BITSPERPIXEL != 3) && (LCD_BITSPERPIXEL != 6)
  166.   #error this value for LCD_BITSPERPIXEL not yet supported
  167. #endif
  168. /* Check if number of segments / coms equals resolution */
  169. #if (LCD_NUM_SEGS < LCD_XSIZE_PHYS)
  170. /*  #error Please check segment setup of controller 0 and X/YSIZE !!!*/
  171. #endif
  172. #if (LCD_NUM_COMS < LCD_YSIZE_PHYS)
  173. /*  #error Please check com setup of controller 0 and X/YSIZE !!!*/
  174. #endif
  175. /*
  176.   ********************************************************************
  177.   *                                                                  *
  178.   *       EXPORTs for ISR                                            *
  179.   *                                                                  *
  180.   ********************************************************************
  181. */
  182. #ifndef LCD_TIMERINIT1
  183.   #define LCD_TIMERINIT1  1599
  184. #endif
  185. #ifndef LCD_TIMERINIT0
  186.   #define LCD_TIMERINIT0  1065
  187. #endif
  188. LCD_ISRDATA U16 LCD__BitsPerPixel = LCD_BITSPERPIXEL/3;
  189. LCD_ISRDATA U8 LCD_VRAMTYPE* LCD__apVRam[LCD_BITSPERPIXEL/3];
  190. LCD_ISRDATA U16 LCD__aTimerReload[LCD_BITSPERPIXEL/3] = {
  191.   LCD_TIMERINIT0
  192.   #if LCD_BITSPERPIXEL/3 >1
  193. ,LCD_TIMERINIT1
  194.   #endif
  195. };
  196. /*
  197.   ********************************************************************
  198.   *
  199.   *                  ID translation table
  200.   *
  201.   ********************************************************************
  202. This table contains 0, 1, 2, ... and serves as translation table for DDBs
  203. */
  204. #define INTS(Base)  Base+0,Base+1,Base+2,Base+3,Base+4,Base+5,   
  205.                     Base+6,Base+7,Base+8,Base+9,Base+10,Base+11, 
  206.                     Base+12,Base+13,Base+14,Base+15
  207. static const LCD_PIXELINDEX aID[] = {
  208.   INTS(0),
  209.   #if LCD_MAX_LOG_COLORS > 0x10
  210.     INTS(0x10),
  211.   #endif
  212.   #if LCD_MAX_LOG_COLORS > 0x20
  213.     INTS(0x20),
  214.     INTS(0x30),
  215.   #endif
  216.   #if LCD_MAX_LOG_COLORS > 0x40
  217.     INTS(0x40),
  218.     INTS(0x50),
  219.     INTS(0x60),
  220.     INTS(0x70),
  221.   #endif
  222.   #if LCD_MAX_LOG_COLORS > 0x80
  223.     INTS(0x80),
  224.     INTS(0x90),
  225.     INTS(0xa0),
  226.     INTS(0xb0),
  227.     INTS(0xc0),
  228.     INTS(0xd0),
  229.     INTS(0xe0),
  230.     INTS(0xf0)
  231.   #endif
  232. };
  233. /*
  234.         *********************************************************
  235.         *                                                       *
  236.         *       Macros for internal use                         *
  237.         *                                                       *
  238.         *********************************************************
  239. */
  240. #if (LCD_SUPPORT_COMTRANS)
  241.   #if (LCD_MIRROR_Y)
  242.     #error LCD_MIRROR_Y not supported with COMTrans !
  243.   #endif
  244.   #if (LCD_MIRROR_X)
  245.     #error LCD_MIRROR_X not supported with COMTrans !
  246.   #endif
  247. #endif
  248. #if (!LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  249.   #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  250.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((x), (y), (c))
  251.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((x), (y), (c))
  252.     #define GETPIXEL(x, y)         GetPixel            ((x), (y))
  253.     #define XORPIXEL(x, y)         XorPixel            ((x), (y))
  254.   #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  255.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((y), (x), (c))
  256.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((y), (x), (c))
  257.     #define GETPIXEL(x, y)         GetPixel            ((y), (x))
  258.     #define XORPIXEL(x, y)         XorPixel            ((y), (x))
  259.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  260.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((x), (LCD_YSIZE-1-(y)), (c))
  261.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((x), (LCD_YSIZE-1-(y)), (c))
  262.     #define GETPIXEL(x, y)         GetPixel            ((x), (LCD_YSIZE-1-(y)))
  263.     #define XORPIXEL(x, y)         XorPixel            ((x), (LCD_YSIZE-1-(y)))
  264.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  265.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((LCD_YSIZE-1-(y)), (x), (c))
  266.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((LCD_YSIZE-1-(y)), (x), (c))
  267.     #define GETPIXEL(x, y)         GetPixel            ((LCD_YSIZE-1-(y)), (x))
  268.     #define XORPIXEL(x, y)         XorPixel            ((LCD_YSIZE-1-(y)), (x))
  269.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  270.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (y), (c))
  271.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (y), (c))
  272.     #define GETPIXEL(x, y)         GetPixel            ((LCD_XSIZE-1-(x)), (y))
  273.     #define XORPIXEL(x, y)         XorPixel            ((LCD_XSIZE-1-(x)), (y))
  274.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  275.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((y), (LCD_XSIZE-1-(x)), (c))
  276.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((y), (LCD_XSIZE-1-(x)), (c))
  277.     #define GETPIXEL(x, y)         GetPixel            ((y), (LCD_XSIZE-1-(x)))
  278.     #define XORPIXEL(x, y)         XorPixel            ((y), (LCD_XSIZE-1-(x)))
  279.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  280.     #define SETPIXEL(x, y, c)      SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)), (c))
  281.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS        ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)), (c))
  282.     #define GETPIXEL(x, y)         GetPixel            ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)))
  283.     #define XORPIXEL(x, y)         XorPixel            ((LCD_XSIZE-1-(x)), (LCD_YSIZE-1-(y)))
  284.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  285.     #error This combination of mirroring/swapping not yet supported
  286.   #endif
  287. #elif (LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  288.   #if (!LCD_SWAP_XY)
  289.     #define SETPIXEL(x, y, c)      SetPixelPhys(x,LCD__aLine2Com0[y], c)
  290.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS(x,LCD__aLine2Com0[y], c)
  291.     #define GETPIXEL(x, y)     LCD_L0_GetPixelIndex(x,LCD__aLine2Com0[y])
  292.     #define XORPIXEL(x, y)      XorPixel(x,LCD__aLine2Com0[y])
  293.   #else
  294.     #define SETPIXEL(x, y, c)      SetPixelPhys(y,LCD__aLine2Com0[x], c)
  295.     #define SETPIXELFAST(x, y, c)  SETPIXELPHYS(y,LCD__aLine2Com0[x], c)
  296.     #define GETPIXEL(x, y)     LCD_L0_GetPixelIndex(y,LCD__aLine2Com0[x])
  297.     #define XORPIXEL(x, y)      XorPixel(y,LCD__aLine2Com0[x])
  298.   #endif
  299. #else
  300.   #error This combination of switches not yet supported
  301. #endif
  302. #define XY2OFF(x,y) (y*LCD_BYTESPERLINE+3*(x>>3))
  303. #ifndef WIN32
  304.   #if   (LCD_BITSPERPIXEL == 3)
  305.     #define OFF2PTR(Off) &LCD_VRam[0][Off]
  306.   #elif (LCD_BITSPERPIXEL == 6)
  307.     #define OFF2PTR_0(Off) &LCD_VRam_0[Off]
  308.     #define OFF2PTR_1(Off) &LCD_VRam_1[Off]
  309.   #endif
  310. #else
  311.   #if   (LCD_BITSPERPIXEL == 3)
  312.     #define OFF2PTR(Off) (pVRam+Off)
  313.   #elif (LCD_BITSPERPIXEL == 6)
  314.     #define OFF2PTR_0(Off) (pVRam_0+Off)
  315.     #define OFF2PTR_1(Off) (pVRam_1+Off)
  316.   #endif
  317. #endif
  318. /*
  319.         *********************************************************
  320.         *                                                       *
  321.         *       Internal set pixel routines                     *
  322.         *                                                       *
  323.         *********************************************************
  324. */
  325. #if (LCD_BITSPERPIXEL == 3)
  326. #define SETPIXELPHYS(x,y,c)                       
  327. {                                                 
  328.    U8 LCD_VRAMTYPE* p = OFF2PTR(XY2OFF(x,y));     
  329.   switch (x&7) {                                  
  330.   case 0:                                         
  331.     *p = (*p&~(7<<5))|(c<<5);                     
  332.     break;                                        
  333.   case 1:                                         
  334.     *p = (*p&~(7<<2))|(c<<2);                     
  335.     break;                                        
  336.   case 2:                                         
  337.     *p   = (*p&~(3))|(c>>1);                      
  338.     p++;                                          
  339.     *p = (*p &~(1<<7))|(c<<7);                    
  340.     break;                                        
  341.   case 3:                                         
  342.     p++;                                          
  343.     *p = (*p&~(7<<4))|(c<<4);                     
  344.     break;                                        
  345.   case 4:                                         
  346.     p++;                                          
  347.     *p = (*p&~(7<<1))|(c<<1);                     
  348.     break;                                        
  349.   case 5:                                         
  350.     p++;                                          
  351.     *p   = (*p&~(1))|(c>>2);                      
  352.     p++;                                          
  353.     *p = (*p &~(3<<6))|(c<<6);                    
  354.     break;                                        
  355.   case 6:                                         
  356.     p+=2;                                         
  357.     *p = (*p&~(7<<3))|(c<<3);                     
  358.     break;                                        
  359.   case 7:                                         
  360.     p+=2;                                         
  361.     *p = (*p&~(7<<0))|(c);                        
  362.     break;                                        
  363.   }                                               
  364. }
  365. #elif (LCD_BITSPERPIXEL == 6)
  366. void SetPixelPhys222(int x, int y, LCD_PIXELINDEX c) {
  367.   U8 LCD_VRAMTYPE* p0 = OFF2PTR_0(XY2OFF(x,y));
  368.   U8 LCD_VRAMTYPE* p1 = OFF2PTR_1(XY2OFF(x,y));
  369.   U8 c0 = ((c & 0x20) >> 3) + ((c & 0x08) >> 2) + ((c & 0x02) >> 1);
  370.   U8 c1 = ((c & 0x10) >> 2) + ((c & 0x04) >> 1) +  (c & 0x01);
  371.   switch (x&7) {
  372.   case 0:
  373.     *p0 = (*p0&~(7<<5))|(c0<<5);
  374.     *p1 = (*p1&~(7<<5))|(c1<<5);
  375.     break;
  376.   case 1:
  377.     *p0 = (*p0&~(7<<2))|(c0<<2);
  378.     *p1 = (*p1&~(7<<2))|(c1<<2);
  379.     break;
  380.   case 2:
  381.     *p0   = (*p0&~(3))|(c0>>1);
  382.     *p1   = (*p1&~(3))|(c1>>1);
  383.     p0++;
  384.     p1++;
  385.     *p0 = (*p0 &~(1<<7))|(c0<<7);
  386.     *p1 = (*p1 &~(1<<7))|(c1<<7);
  387.     break;
  388.   case 3:
  389.     p0++;
  390.     p1++;
  391.     *p0 = (*p0&~(7<<4))|(c0<<4);
  392.     *p1 = (*p1&~(7<<4))|(c1<<4);
  393.     break;
  394.   case 4:
  395.     p0++;
  396.     p1++;
  397.     *p0 = (*p0&~(7<<1))|(c0<<1);
  398.     *p1 = (*p1&~(7<<1))|(c1<<1);
  399.     break;
  400.   case 5:
  401.     p0++;
  402.     p1++;
  403.     *p0   = (*p0&~(1))|(c0>>2);
  404.     *p1   = (*p1&~(1))|(c1>>2);
  405.     p0++;
  406.     p1++;
  407.     *p0 = (*p0 &~(3<<6))|(c0<<6);
  408.     *p1 = (*p1 &~(3<<6))|(c1<<6);
  409.     break;
  410.   case 6:
  411.     p0+=2;
  412.     p1+=2;
  413.     *p0 = (*p0&~(7<<3))|(c0<<3);
  414.     *p1 = (*p1&~(7<<3))|(c1<<3);
  415.     break;
  416.   case 7:
  417.     p0+=2;
  418.     p1+=2;
  419.     *p0 = (*p0&~(7<<0))|(c0);
  420.     *p1 = (*p1&~(7<<0))|(c1);
  421.     break;
  422.   }
  423. }
  424. #define SETPIXELPHYS(x,y,c) SetPixelPhys222(x,y,c) 
  425. #endif
  426. static void SetPixelPhys(int x, int y, LCD_PIXELINDEX c) {
  427.   SETPIXELPHYS(x,y,c);
  428. }
  429. /*
  430.         *********************************************************
  431.         *                                                       *
  432.         *       Next pixel routines, optimized for 3bpp
  433.         *                                                       *
  434.         *********************************************************
  435. */
  436. #if      (LCD_OPTIMIZE)             
  437.       && (!LCD_MIRROR_X)            
  438.       && (!LCD_MIRROR_Y)            
  439.       && (!LCD_SWAP_XY)             
  440.       && (!LCD_SUPPORT_COMTRANS)    
  441.       && (!LCD_SUPPORT_SEGTRANS)    
  442.       && (LCD_BITSPERPIXEL == 3)
  443. static int CurPosX;
  444. static U8 LCD_VRAMTYPE* pCurPos;
  445. static void SetPosXY(int x, int y) {
  446.   CurPosX = x;
  447.   pCurPos = OFF2PTR(XY2OFF(x,y));
  448.   switch (x&7) {
  449.   case 3:
  450.   case 4:
  451.   case 5:
  452.     pCurPos++; break;
  453.   case 6:
  454.   case 7:
  455.     pCurPos+=2;
  456.   }
  457. }
  458. static void SetNextPixel(LCD_PIXELINDEX c) {
  459.   switch (CurPosX&7) {
  460.   case 0: *pCurPos = (*pCurPos&~(7<<5))|(c<<5); break;
  461.   case 1: *pCurPos = (*pCurPos&~(7<<2))|(c<<2); break;
  462.   case 2: *pCurPos = (*pCurPos&~(3))|(c>>1);
  463.            pCurPos++;
  464.           *pCurPos = (*pCurPos &~(1<<7))|(c<<7);
  465.            break;
  466.   case 3: *pCurPos = (*pCurPos&~(7<<4))|(c<<4); break;
  467.   case 4: *pCurPos = (*pCurPos&~(7<<1))|(c<<1); break;
  468.   case 5: *pCurPos = (*pCurPos&~(1))|(c>>2);
  469.            pCurPos++;
  470.           *pCurPos = (*pCurPos &~(3<<6))|(c<<6);
  471.            break;
  472.   case 6: *pCurPos = (*pCurPos&~(7<<3))|(c<<3); break;
  473.   case 7: *pCurPos = (*pCurPos&~(7<<0))|(c);
  474.            pCurPos++;
  475.            break;
  476.   }
  477.   CurPosX++;
  478. }
  479. /*
  480.         *********************************************************
  481.         *                                                       *
  482.         *       Next pixel routines, optimized for 6bpp
  483.         *                                                       *
  484.         *********************************************************
  485. */
  486. #elif    (LCD_OPTIMIZE)             
  487.       && (!LCD_MIRROR_X)            
  488.       && (!LCD_MIRROR_Y)            
  489.       && (!LCD_SWAP_XY)             
  490.       && (!LCD_SUPPORT_COMTRANS)    
  491.       && (!LCD_SUPPORT_SEGTRANS)    
  492.       && (LCD_BITSPERPIXEL == 6)
  493. static int CurPosX;
  494. static U8 LCD_VRAMTYPE* pCurPos_0;
  495. static U8 LCD_VRAMTYPE* pCurPos_1;
  496. static void SetPosXY(int x, int y) {
  497.   CurPosX = x;
  498.   pCurPos_0 = OFF2PTR_0(XY2OFF(x,y));
  499.   pCurPos_1 = OFF2PTR_1(XY2OFF(x,y));
  500.   switch (x&7) {
  501.   case 3:
  502.   case 4:
  503.   case 5:
  504.     pCurPos_0++;
  505.     pCurPos_1++;
  506.     break;
  507.   case 6:
  508.   case 7:
  509.     pCurPos_0+=2;
  510.     pCurPos_1+=2;
  511.   }
  512. }
  513. static void SetNextPixel(LCD_PIXELINDEX c) {
  514.   U8 c0 = ((c & 0x20) >> 3) + ((c & 0x08) >> 2) + ((c & 0x02) >> 1);
  515.   U8 c1 = ((c & 0x10) >> 2) + ((c & 0x04) >> 1) +  (c & 0x01);
  516.   switch (CurPosX&7) {
  517.   case 0: 
  518.     *pCurPos_0 = (*pCurPos_0&~(7<<5))|(c0<<5); 
  519.     *pCurPos_1 = (*pCurPos_1&~(7<<5))|(c1<<5); 
  520.     break;
  521.   case 1: 
  522.     *pCurPos_0 = (*pCurPos_0&~(7<<2))|(c0<<2); 
  523.     *pCurPos_1 = (*pCurPos_1&~(7<<2))|(c1<<2); 
  524.     break;
  525.   case 2: 
  526.     *pCurPos_0 = (*pCurPos_0&~(3))|(c0>>1);
  527.     *pCurPos_1 = (*pCurPos_1&~(3))|(c1>>1);
  528.     pCurPos_0++;
  529.     pCurPos_1++;
  530.     *pCurPos_0 = (*pCurPos_0 &~(1<<7))|(c0<<7);
  531.     *pCurPos_1 = (*pCurPos_1 &~(1<<7))|(c1<<7);
  532.     break;
  533.   case 3: 
  534.     *pCurPos_0 = (*pCurPos_0&~(7<<4))|(c0<<4); 
  535.     *pCurPos_1 = (*pCurPos_1&~(7<<4))|(c1<<4); 
  536.     break;
  537.   case 4: 
  538.     *pCurPos_0 = (*pCurPos_0&~(7<<1))|(c0<<1); 
  539.     *pCurPos_1 = (*pCurPos_1&~(7<<1))|(c1<<1); 
  540.     break;
  541.   case 5: 
  542.     *pCurPos_0 = (*pCurPos_0&~(1))|(c0>>2);
  543.     *pCurPos_1 = (*pCurPos_1&~(1))|(c1>>2);
  544.     pCurPos_0++;
  545.     pCurPos_1++;
  546.     *pCurPos_0 = (*pCurPos_0 &~(3<<6))|(c0<<6);
  547.     *pCurPos_1 = (*pCurPos_1 &~(3<<6))|(c1<<6);
  548.     break;
  549.   case 6: 
  550.     *pCurPos_0 = (*pCurPos_0&~(7<<3))|(c0<<3); 
  551.     *pCurPos_1 = (*pCurPos_1&~(7<<3))|(c1<<3); 
  552.     break;
  553.   case 7: 
  554.     *pCurPos_0 = (*pCurPos_0&~(7<<0))|(c0);
  555.     *pCurPos_1 = (*pCurPos_1&~(7<<0))|(c1);
  556.     pCurPos_0++;
  557.     pCurPos_1++;
  558.     break;
  559.   }
  560.   CurPosX++;
  561. }
  562. #endif
  563. #if (LCD_BITSPERPIXEL == 3)
  564. unsigned int GetPixel(int x, int y) {
  565.   U8 LCD_VRAMTYPE* p = OFF2PTR(XY2OFF(x,y));
  566.   switch(x&7) {
  567.     case 0: return (*p>>5);
  568.     case 1: return (*p>>2)&7;
  569.     case 2: return ((*p&(3   )) <<1)|(*(p+1)>>7);
  570.     case 3: return (*(p+1)>>4) &7;
  571.     case 4: return (*(p+1)>>1) &7;
  572.     case 5: return ((*(p+1)&(1)) <<2)|(*(p+2)>>6);
  573.     case 6: return (*(p+2)&(7<<3)) >>3;
  574.   }
  575.   return (*(p+2)&(7<<0)) >>0;
  576. }
  577. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  578.   return GETPIXEL(x, y);
  579. }
  580. #elif (LCD_BITSPERPIXEL == 6)
  581. unsigned int GetPixel(int x, int y) {
  582.   U8 LCD_VRAMTYPE* p0 = OFF2PTR_0(XY2OFF(x,y));
  583.   U8 LCD_VRAMTYPE* p1 = OFF2PTR_1(XY2OFF(x,y));
  584.   U8 c0, c1;
  585.   switch(x&7) {
  586.     case 0: 
  587.       c0 = (*p0>>5);
  588.       c1 = (*p1>>5);
  589.       break;
  590.     case 1: 
  591.       c0 = (*p0>>2)&7;
  592.       c1 = (*p1>>2)&7;
  593.       break;
  594.     case 2: 
  595.       c0 = ((*p0&3)<<1)|(*(p0+1)>>7);
  596.       c1 = ((*p1&3)<<1)|(*(p1+1)>>7);
  597.       break;
  598.     case 3: 
  599.       c0 = (*(p0+1)>>4) &7;
  600.       c1 = (*(p1+1)>>4) &7;
  601.       break;
  602.     case 4: 
  603.       c0 = (*(p0+1)>>1) &7;
  604.       c1 = (*(p1+1)>>1) &7;
  605.       break;
  606.     case 5: 
  607.       c0 = ((*(p0+1)&(1)) <<2)|(*(p0+2)>>6);
  608.       c1 = ((*(p1+1)&(1)) <<2)|(*(p1+2)>>6);
  609.       break;
  610.     case 6: 
  611.       c0 = (*(p0+2)&(7<<3)) >>3;
  612.       c1 = (*(p1+2)&(7<<3)) >>3;
  613.       break;
  614.     case 7: 
  615.       c0 = (*(p0+2)&(7<<0)) >>0;
  616.       c1 = (*(p1+2)&(7<<0)) >>0;
  617.       break;
  618.   }
  619.   return ((c0 & 0x04) << 3) + ((c0 & 0x02) << 2) + ((c0 & 0x01) << 1)
  620.        + ((c1 & 0x04) << 2) + ((c1 & 0x02) << 1) +  (c1 & 0x01);
  621. }
  622. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  623.   return GETPIXEL(x, y);
  624. }
  625. #endif
  626. static void XorPixel   (int x, int y) {
  627.   LCD_PIXELINDEX Index = GetPixel(x,y);
  628.   Index = LCD_NUM_COLORS-1-Index;
  629.   SetPixelPhys(x,y,Index);
  630. }
  631. void LCD_L0_XorPixel   (int x, int y) {
  632.   XORPIXEL(x,y);
  633. }
  634. void LCD_L0_SetPixelIndex   (int x, int y, int ColorIndex) {
  635.   SETPIXELFAST(x,y,ColorIndex);
  636. }
  637. /*
  638.         *********************************************************
  639.         *                                                       *
  640.         *          LCD_DrawHLine optimized                      *
  641.         *                                                       *
  642.         *          Normal display, 3 Bpp                        *
  643.         *                                                       *
  644.         *********************************************************
  645. */
  646. #if      (LCD_OPTIMIZE)             
  647.       && (!LCD_MIRROR_X)            
  648.       && (!LCD_MIRROR_Y)            
  649.       && (!LCD_SWAP_XY)             
  650.       && (!LCD_SUPPORT_COMTRANS)    
  651.       && (!LCD_SUPPORT_SEGTRANS)    
  652.       && (LCD_BITSPERPIXEL == 3)
  653. static U8 MaskLeft[8][3] = {
  654.   { 0xff, 0xff, 0xff},
  655.   { 0x1f, 0xff, 0xff},
  656.   { 0x03, 0xff, 0xff},
  657.   { 0x00, 0x7f, 0xff},
  658.   { 0x00, 0x0f, 0xff},
  659.   { 0x00, 0x01, 0xff},
  660.   { 0x00, 0x00, 0x3f},
  661.   { 0x00, 0x00, 0x07}/*!!!0x0e*/
  662. };
  663. static U8 MaskRight[8][3] = {
  664.   { 0xe0, 0x00, 0x00},
  665.   { 0xfc, 0x00, 0x00},
  666.   { 0xff, 0x80, 0x00},
  667.   { 0xff, 0xf0, 0x00},
  668.   { 0xff, 0xfe, 0x00},
  669.   { 0xff, 0xff, 0xc0},
  670.   { 0xff, 0xff, 0xf8},
  671.   { 0xff, 0xff, 0xff}
  672. };
  673. static U8* GetMaskRight(int x) { return &MaskRight[(x&7)][0]; }
  674. static U8* GetMaskLeft (int x) { return &MaskLeft[(x&7)][0]; }
  675. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  676.   if (x0>x1) return;  /* Check if nothing to draw */
  677.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  678.     while (x0 <= x1) {
  679.       XORPIXEL(x0, y);
  680.       x0++;
  681.     }
  682.   } else {
  683.     int i;
  684.     U8 LCD_VRAMTYPE* p = OFF2PTR(XY2OFF(x0,y));
  685.     U8* pMask = GetMaskLeft(x0);
  686.     U8 aData[3];
  687.     U8 aDataMasked[3];
  688.     aData[0] = (COLOR<<5)|(COLOR<<2)|(COLOR>>1);            /* hhhgggff */
  689.     aData[1] = (COLOR<<7)|(COLOR<<4)|(COLOR<<1)|(COLOR>>2); /* feeedddc */
  690.     aData[2] = (COLOR<<6)|(COLOR<<3)|(COLOR);               /* ccbbbaaa */
  691.     for (i=0; i<3; i++, pMask++) {
  692.       aDataMasked[i] = (*(p+i) &~*pMask) | (aData[i] &*pMask);
  693.     }
  694.     if ((x0&~7) == (x1&~7)) {    /* Do we have to clip left and right side ? */
  695.       U8* pMask = GetMaskRight(x1);
  696. #if 0
  697.       for (i=0; i<3; i++, pMask++) {
  698.         *(p+i) = (*(p+i) &~*pMask) | (aDataMasked[i]&*pMask);
  699.       }
  700. #else
  701.       *(p+0) = (*(p+0) &~*(pMask+0)) | (aDataMasked[0]&*(pMask+0));
  702.       *(p+1) = (*(p+1) &~*(pMask+1)) | (aDataMasked[1]&*(pMask+1));
  703.       *(p+2) = (*(p+2) &~*(pMask+2)) | (aDataMasked[2]&*(pMask+2));
  704. #endif
  705.       return;
  706.     }
  707.     *p = aDataMasked[0];
  708.     *(p+1) = aDataMasked[1];
  709.     *(p+2) = aDataMasked[2];
  710.     p+=3;
  711.     x0 = (x0&~7)+8;
  712. /* Draw optimized portion */
  713.     {
  714.       int Len = (x1-x0+1)>>3;
  715.       if (Len >0) {
  716.         x0 += Len<<3;
  717.         do {
  718.           *p     = aData[0];
  719.           *(p+1) = aData[1];
  720.           *(p+2) = aData[2];
  721.           p+=3;
  722.         } while (--Len);
  723.       }
  724.     }
  725.     /* Draw right portion */
  726.     if ((x1&7)!=7) {
  727.       U8* pMask = GetMaskRight(x1);
  728.       for (i=0; i<3; i++, pMask++) {
  729.         *(p+i) = (*(p+i) &~*pMask) | (aData[i]&*pMask);
  730.       }
  731.     }
  732.     
  733.   }
  734. }
  735. /*
  736.         *********************************************************
  737.         *                                                       *
  738.         *          LCD_DrawHLine optimized                      *
  739.         *                                                       *
  740.         *          Normal display, 6 Bpp                        *
  741.         *                                                       *
  742.         *********************************************************
  743. */
  744. #elif    (LCD_OPTIMIZE)             
  745.       && (!LCD_MIRROR_X)            
  746.       && (!LCD_MIRROR_Y)            
  747.       && (!LCD_SWAP_XY)             
  748.       && (!LCD_SUPPORT_COMTRANS)    
  749.       && (!LCD_SUPPORT_SEGTRANS)    
  750.       && (LCD_BITSPERPIXEL == 6)
  751. static U8 MaskLeft[8][3] = {
  752.   { 0xff, 0xff, 0xff},
  753.   { 0x1f, 0xff, 0xff},
  754.   { 0x03, 0xff, 0xff},
  755.   { 0x00, 0x7f, 0xff},
  756.   { 0x00, 0x0f, 0xff},
  757.   { 0x00, 0x01, 0xff},
  758.   { 0x00, 0x00, 0x3f},
  759.   { 0x00, 0x00, 0x07}/*!!!0x0e*/
  760. };
  761. static U8 MaskRight[8][3] = {
  762.   { 0xe0, 0x00, 0x00},
  763.   { 0xfc, 0x00, 0x00},
  764.   { 0xff, 0x80, 0x00},
  765.   { 0xff, 0xf0, 0x00},
  766.   { 0xff, 0xfe, 0x00},
  767.   { 0xff, 0xff, 0xc0},
  768.   { 0xff, 0xff, 0xf8},
  769.   { 0xff, 0xff, 0xff}
  770. };
  771. static U8* GetMaskRight(int x) { return &MaskRight[(x&7)][0]; }
  772. static U8* GetMaskLeft (int x) { return &MaskLeft[(x&7)][0]; }
  773. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  774.   if (x0>x1) return;  /* Check if nothing to draw */
  775.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  776.     while (x0 <= x1) {
  777.       XORPIXEL(x0, y);
  778.       x0++;
  779.     }
  780.   } else {
  781.     int i;
  782.     U8 LCD_VRAMTYPE* p0 = OFF2PTR_0(XY2OFF(x0,y));
  783.     U8 LCD_VRAMTYPE* p1 = OFF2PTR_1(XY2OFF(x0,y));
  784.     U8* pMask = GetMaskLeft(x0);
  785.     U8 aData[2][3];
  786.     U8 aDataMasked[2][3];
  787.     U8 c0 = ((COLOR & 0x20) >> 3) + ((COLOR & 0x08) >> 2) + ((COLOR & 0x02) >> 1);
  788.     U8 c1 = ((COLOR & 0x10) >> 2) + ((COLOR & 0x04) >> 1) +  (COLOR & 0x01);
  789.     aData[0][0] = (c0<<5)|(c0<<2)|(c0>>1);         /* hhhgggff */
  790.     aData[0][1] = (c0<<7)|(c0<<4)|(c0<<1)|(c0>>2); /* feeedddc */
  791.     aData[0][2] = (c0<<6)|(c0<<3)|(c0);            /* ccbbbaaa */
  792.     aData[1][0] = (c1<<5)|(c1<<2)|(c1>>1);         /* hhhgggff */
  793.     aData[1][1] = (c1<<7)|(c1<<4)|(c1<<1)|(c1>>2); /* feeedddc */
  794.     aData[1][2] = (c1<<6)|(c1<<3)|(c1);            /* ccbbbaaa */
  795.     for (i=0; i<3; i++, pMask++) {
  796.       aDataMasked[0][i] = (*(p0+i) &~*pMask) | (aData[0][i] &*pMask);
  797.       aDataMasked[1][i] = (*(p1+i) &~*pMask) | (aData[1][i] &*pMask);
  798.     }
  799.     if ((x0&~7) == (x1&~7)) {    /* Do we have to clip left and right side ? */
  800.       U8* pMask = GetMaskRight(x1);
  801.       *(p0+0) = (*(p0+0) &~*(pMask+0)) | (aDataMasked[0][0]&*(pMask+0));
  802.       *(p0+1) = (*(p0+1) &~*(pMask+1)) | (aDataMasked[0][1]&*(pMask+1));
  803.       *(p0+2) = (*(p0+2) &~*(pMask+2)) | (aDataMasked[0][2]&*(pMask+2));
  804.       *(p1+0) = (*(p1+0) &~*(pMask+0)) | (aDataMasked[1][0]&*(pMask+0));
  805.       *(p1+1) = (*(p1+1) &~*(pMask+1)) | (aDataMasked[1][1]&*(pMask+1));
  806.       *(p1+2) = (*(p1+2) &~*(pMask+2)) | (aDataMasked[1][2]&*(pMask+2));
  807.       return;
  808.     }
  809.     *p0     = aDataMasked[0][0];
  810.     *(p0+1) = aDataMasked[0][1];
  811.     *(p0+2) = aDataMasked[0][2];
  812.     p0+=3;
  813.     *p1     = aDataMasked[1][0];
  814.     *(p1+1) = aDataMasked[1][1];
  815.     *(p1+2) = aDataMasked[1][2];
  816.     p1+=3;
  817.     x0 = (x0&~7)+8;
  818. /* Draw optimized portion */
  819.     {
  820.       int Len = (x1-x0+1)>>3;
  821.       if (Len >0) {
  822.         x0 += Len<<3;
  823.         do {
  824.           *p0     = aData[0][0];
  825.           *(p0+1) = aData[0][1];
  826.           *(p0+2) = aData[0][2];
  827.           p0+=3;
  828.           *p1     = aData[1][0];
  829.           *(p1+1) = aData[1][1];
  830.           *(p1+2) = aData[1][2];
  831.           p1+=3;
  832.         } while (--Len);
  833.       }
  834.     }
  835.     /* Draw right portion */
  836.     if ((x1&7)!=7) {
  837.       U8* pMask = GetMaskRight(x1);
  838.       for (i=0; i<3; i++, pMask++) {
  839.         *(p0+i) = (*(p0+i) &~*pMask) | (aData[0][i]&*pMask);
  840.         *(p1+i) = (*(p1+i) &~*pMask) | (aData[1][i]&*pMask);
  841.       }
  842.     }
  843.   }
  844. }
  845. /*
  846.         *********************************************************
  847.         *                                                       *
  848.         *          LCD_DrawHLine                                *
  849.         *                                                       *
  850.         *          Unoptimized                                  *
  851.         *                                                       *
  852.         *********************************************************
  853. */
  854. #else
  855. void LCD_L0_DrawHLine(int x0, int y,  int x1) {
  856.   if (x0>x1) return;  /* Check if nothing to draw */
  857.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  858.     while (x0 <= x1) {
  859.       XORPIXEL(x0, y);
  860.       x0++;
  861.     }
  862.   } else {
  863.     while (x0 <= x1) {
  864.       SETPIXEL(x0, y, COLOR);
  865.       x0++;
  866.     }
  867.   }
  868. }
  869. #endif
  870. /*
  871.         *********************************************************
  872.         *                                                       *
  873.         *          LCD_DrawVLine                                *
  874.         *                                                       *
  875.         *          Unoptimized                                  *
  876.         *                                                       *
  877.         *********************************************************
  878. */
  879. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  880.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  881.     while (y0 <= y1) {
  882.       XORPIXEL(x, y0);
  883.       y0++;
  884.     }
  885.   } else {
  886.     while (y0 <= y1) {
  887.       SETPIXEL(x, y0, COLOR);
  888.       y0++;
  889.     }
  890.   }
  891. }
  892. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  893.   for (; y0 <= y1; y0++) {
  894.     LCD_L0_DrawHLine(x0,y0, x1);
  895.   }
  896. }
  897. /*
  898.   ***************************************************************
  899.   *                                                             *
  900.   *            Internal bitmap routines                         *
  901.   *                                                             *
  902.   ***************************************************************
  903. */
  904. /*
  905.     *********************************************
  906.     *                                           *
  907.     *      Draw Bitmap 1 BPP                    *
  908.     *                                           *
  909.     *********************************************
  910. */
  911. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  912.   LCD_PIXELINDEX pixels;
  913.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  914.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  915. /*
  916. // Jump to right entry point
  917. */
  918.   pixels = *p;
  919.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  920.   case 0:
  921. #if      (LCD_OPTIMIZE)             
  922.       && (!LCD_MIRROR_X)            
  923.       && (!LCD_MIRROR_Y)            
  924.       && (!LCD_SWAP_XY)             
  925.       && (!LCD_SUPPORT_COMTRANS)    
  926.       && (!LCD_SUPPORT_SEGTRANS)    
  927.       && ((LCD_BITSPERPIXEL == 3) || (LCD_BITSPERPIXEL == 6))
  928.     SetPosXY(x+(Diff&7),y);
  929. #endif
  930.     switch (Diff&7) {
  931.     case 0:   
  932.       goto WriteBit0;
  933.     case 1:   
  934.       goto WriteBit1;
  935.     case 2:
  936.       goto WriteBit2;
  937.     case 3:
  938.       goto WriteBit3;
  939.     case 4:
  940.       goto WriteBit4;
  941.     case 5:   
  942.       goto WriteBit5;
  943.     case 6:   
  944.       goto WriteBit6;
  945.     case 7:   
  946.       goto WriteBit7;
  947.     }
  948.     break;
  949.   case LCD_DRAWMODE_TRANS:
  950.     switch (Diff&7) {
  951.     case 0:
  952.       goto WriteTBit0;
  953.     case 1:
  954.       goto WriteTBit1;
  955.     case 2:
  956.       goto WriteTBit2;
  957.     case 3:
  958.       goto WriteTBit3;
  959.     case 4:
  960.       goto WriteTBit4;
  961.     case 5:   
  962.       goto WriteTBit5;
  963.     case 6:   
  964.       goto WriteTBit6;
  965.     case 7:   
  966.       goto WriteTBit7;
  967.     }
  968.     break;
  969.   case LCD_DRAWMODE_XOR:
  970.     switch (Diff&7) {
  971.     case 0:   
  972.       goto WriteXBit0;
  973.     case 1:   
  974.       goto WriteXBit1;
  975.     case 2:
  976.       goto WriteXBit2;
  977.     case 3:
  978.       goto WriteXBit3;
  979.     case 4:
  980.       goto WriteXBit4;
  981.     case 5:   
  982.       goto WriteXBit5;
  983.     case 6:   
  984.       goto WriteXBit6;
  985.     case 7:   
  986.       goto WriteXBit7;
  987.     }
  988.   }
  989. /*
  990.         Write with transparency
  991. */
  992.   WriteTBit0:
  993.     if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
  994.     if (!--xsize)
  995.       return;
  996.   WriteTBit1:
  997.     if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
  998.     if (!--xsize)
  999.       return;
  1000.   WriteTBit2:
  1001.     if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
  1002.     if (!--xsize)
  1003.       return;
  1004.   WriteTBit3:
  1005.     if (pixels&(1<<4)) SETPIXEL(x+3, y, Index1);
  1006.     if (!--xsize)
  1007.       return;
  1008.   WriteTBit4:
  1009.     if (pixels&(1<<3)) SETPIXEL(x+4, y, Index1);
  1010.     if (!--xsize)
  1011.       return;
  1012.   WriteTBit5:
  1013.     if (pixels&(1<<2)) SETPIXEL(x+5, y, Index1);
  1014.     if (!--xsize)
  1015.       return;
  1016.   WriteTBit6:
  1017.     if (pixels&(1<<1)) SETPIXEL(x+6, y, Index1);
  1018.     if (!--xsize)
  1019.       return;
  1020.   WriteTBit7:
  1021.     if (pixels&(1<<0)) SETPIXEL(x+7, y, Index1);
  1022.     if (!--xsize)
  1023.       return;
  1024.     x+=8;
  1025.     pixels = *(++p);
  1026.     goto WriteTBit0;
  1027. /*
  1028.         Write without transparency
  1029. */
  1030. #if      (LCD_OPTIMIZE)             
  1031.       && (!LCD_MIRROR_X)            
  1032.       && (!LCD_MIRROR_Y)            
  1033.       && (!LCD_SWAP_XY)             
  1034.       && (!LCD_SUPPORT_COMTRANS)    
  1035.       && (!LCD_SUPPORT_SEGTRANS)    
  1036.       && ((LCD_BITSPERPIXEL == 3) || (LCD_BITSPERPIXEL == 6))
  1037.   WriteBit0:
  1038.     SetNextPixel((pixels&(1<<7)) ? Index1 : Index0);
  1039.     if (!--xsize) return;
  1040.   WriteBit1:
  1041.     SetNextPixel((pixels&(1<<6)) ? Index1 : Index0);
  1042.     if (!--xsize) return;
  1043.   WriteBit2:
  1044.     SetNextPixel((pixels&(1<<5)) ? Index1 : Index0);
  1045.     if (!--xsize) return;
  1046.   WriteBit3:
  1047.     SetNextPixel((pixels&(1<<4)) ? Index1 : Index0);
  1048.     if (!--xsize) return;
  1049.   WriteBit4:
  1050.     SetNextPixel((pixels&(1<<3)) ? Index1 : Index0);
  1051.     if (!--xsize) return;
  1052.   WriteBit5:
  1053.     SetNextPixel((pixels&(1<<2)) ? Index1 : Index0);
  1054.     if (!--xsize) return;
  1055.   WriteBit6:
  1056.     SetNextPixel((pixels&(1<<1)) ? Index1 : Index0);
  1057.     if (!--xsize) return;
  1058.   WriteBit7:
  1059.     SetNextPixel((pixels&(1<<0)) ? Index1 : Index0);
  1060.     if (!--xsize) return;
  1061.     x+=8;
  1062.     pixels = *(++p);
  1063.     goto WriteBit0;
  1064. #else
  1065.   WriteBit0:
  1066.     SETPIXEL(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
  1067.     if (!--xsize)
  1068.       return;
  1069.   WriteBit1:
  1070.     SETPIXEL(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
  1071.     if (!--xsize)
  1072.       return;
  1073.   WriteBit2:
  1074.     SETPIXEL(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
  1075.     if (!--xsize)
  1076.       return;
  1077.   WriteBit3:
  1078.     SETPIXEL(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
  1079.     if (!--xsize)
  1080.       return;
  1081.   WriteBit4:
  1082.     SETPIXEL(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
  1083.     if (!--xsize)
  1084.       return;
  1085.   WriteBit5:
  1086.     SETPIXEL(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
  1087.     if (!--xsize)
  1088.       return;
  1089.   WriteBit6:
  1090.     SETPIXEL(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
  1091.     if (!--xsize)
  1092.       return;
  1093.   WriteBit7:
  1094.     SETPIXEL(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
  1095.     if (!--xsize)
  1096.       return;
  1097.     x+=8;
  1098.     pixels = *(++p);
  1099.     goto WriteBit0;
  1100. #endif
  1101. /*
  1102.         Write XOR mode
  1103. */
  1104.   WriteXBit0:
  1105.     if (pixels&(1<<7))
  1106.       XORPIXEL(x+0, y);
  1107.     if (!--xsize)
  1108.       return;
  1109.   WriteXBit1:
  1110.     if (pixels&(1<<6))
  1111.       XORPIXEL(x+1, y);
  1112.     if (!--xsize)
  1113.       return;
  1114.   WriteXBit2:
  1115.     if (pixels&(1<<5))
  1116.       XORPIXEL(x+2, y);
  1117.     if (!--xsize)
  1118.       return;
  1119.   WriteXBit3:
  1120.     if (pixels&(1<<4))
  1121.       XORPIXEL(x+3, y);
  1122.     if (!--xsize)
  1123.       return;
  1124.   WriteXBit4:
  1125.     if (pixels&(1<<3))
  1126.       XORPIXEL(x+4, y);
  1127.     if (!--xsize)
  1128.       return;
  1129.   WriteXBit5:
  1130.     if (pixels&(1<<2))
  1131.       XORPIXEL(x+5, y);
  1132.     if (!--xsize)
  1133.       return;
  1134.   WriteXBit6:
  1135.     if (pixels&(1<<1))
  1136.       XORPIXEL(x+6, y);
  1137.     if (!--xsize)
  1138.       return;
  1139.   WriteXBit7:
  1140.     if (pixels&(1<<0))
  1141.       XORPIXEL(x+7, y);
  1142.     if (!--xsize)
  1143.       return;
  1144.     x+=8;
  1145.     pixels = *(++p);
  1146.     goto WriteXBit0;
  1147. }
  1148. /*
  1149.     *********************************************
  1150.     *                                           *
  1151.     *      Draw Bitmap 2 BPP                    *
  1152.     *                                           *
  1153.     *********************************************
  1154. */
  1155. #if (LCD_MAX_LOG_COLORS > 2)
  1156. static void  DrawBitLine2BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1157.   LCD_PIXELINDEX pixels;
  1158. /*
  1159. // Jump to right entry point
  1160. */
  1161.   pixels = *p;
  1162.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  1163.     switch (Diff&3) {
  1164.     case 0:
  1165.       goto WriteTBit0;
  1166.     case 1:
  1167.       goto WriteTBit1;
  1168.     case 2:
  1169.       goto WriteTBit2;
  1170.     default:
  1171.       goto WriteTBit3;
  1172.     }
  1173.   } else {
  1174.     switch (Diff&3) {
  1175.     case 0:
  1176.       goto WriteBit0;
  1177.     case 1:
  1178.       goto WriteBit1;
  1179.     case 2:
  1180.       goto WriteBit2;
  1181.     default:
  1182.       goto WriteBit3;
  1183.     }
  1184.   }
  1185. /*
  1186.         Write without transparency
  1187. */
  1188. WriteBit0:
  1189.   SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1190.   if (!--xsize)
  1191.     return;
  1192. WriteBit1:
  1193.   SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1194.   if (!--xsize)
  1195.     return;
  1196. WriteBit2:
  1197.   SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1198.   if (!--xsize)
  1199.     return;
  1200. WriteBit3:
  1201.   SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1202.   if (!--xsize)
  1203.     return;
  1204.   pixels = *(++p);
  1205.   x+=4;
  1206.   goto WriteBit0;
  1207. /*
  1208.         Write with transparency
  1209. */
  1210. WriteTBit0:
  1211.   if (pixels&(3<<6))
  1212.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1213.   if (!--xsize)
  1214.     return;
  1215. WriteTBit1:
  1216.   if (pixels&(3<<4))
  1217.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1218.   if (!--xsize)
  1219.     return;
  1220. WriteTBit2:
  1221.   if (pixels&(3<<2))
  1222.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1223.   if (!--xsize)
  1224.     return;
  1225. WriteTBit3:
  1226.   if (pixels&(3<<0))
  1227.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1228.   if (!--xsize)
  1229.     return;
  1230.   pixels = *(++p);
  1231.   x+=4;
  1232.   goto WriteTBit0;
  1233. }
  1234. #endif
  1235. /*
  1236.     *********************************************
  1237.     *                                           *
  1238.     *      Draw Bitmap 4 BPP                    *
  1239.     *                                           *
  1240.     *********************************************
  1241. */
  1242. #if (LCD_MAX_LOG_COLORS > 4)
  1243. static void  DrawBitLine4BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1244.   LCD_PIXELINDEX pixels;
  1245. /*
  1246. // Jump to right entry point
  1247. */
  1248.   pixels = *p;
  1249.    if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  1250.      if ((Diff&1) ==0) {
  1251.        goto WriteTBit0;
  1252.      } else {
  1253.         goto WriteTBit1;
  1254.      }
  1255.    } else {
  1256.      if ((Diff&1) ==0) {
  1257.        goto WriteBit0;
  1258.      } else {
  1259.         goto WriteBit1;
  1260.      }
  1261.    }
  1262. /*
  1263.         Write without transparency
  1264. */
  1265. WriteBit0:
  1266.   SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1267.   if (!--xsize)
  1268.     return;
  1269. WriteBit1:
  1270.   SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1271.   if (!--xsize)
  1272.     return;
  1273.   x+=2;
  1274.   pixels = *(++p);
  1275.   goto WriteBit0;
  1276. /*
  1277.         Write with transparency
  1278. */
  1279. WriteTBit0:
  1280.   if (pixels>>4)
  1281.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1282.   if (!--xsize)
  1283.     return;
  1284. WriteTBit1:
  1285.   if (pixels&0xf)
  1286.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1287.   if (!--xsize)
  1288.     return;
  1289.   x+=2;
  1290.   pixels = *(++p);
  1291.   goto WriteTBit0;
  1292. }
  1293. #endif
  1294. /*
  1295.     *********************************************
  1296.     *                                           *
  1297.     *      Draw Bitmap 8 BPP  (256 colors)      *
  1298.     *                                           *
  1299.     *********************************************
  1300. */
  1301. #if (LCD_MAX_LOG_COLORS > 16)
  1302. static void  DrawBitLine8BPP(int x, int y, U8 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  1303.   LCD_PIXELINDEX pixels;
  1304.   do {
  1305.     pixels = *p;
  1306.     SETPIXEL(x+0, y, *(pTrans+pixels));
  1307.     x++;
  1308.     p++;
  1309.   } while (--xsize);
  1310. }
  1311. #endif
  1312. /*
  1313.     **********************************************************************
  1314.     *                                                                    *
  1315.     *             Universal draw Bitmap routine                          *
  1316.     *                                                                    *
  1317.     **********************************************************************
  1318. */
  1319. void LCD_L0_DrawBitmap   (int x0, int y0,
  1320.                        int xsize, int ysize,
  1321.                        int BitsPerPixel, 
  1322.                        int BytesPerLine,
  1323.                        const U8* pData, int Diff,
  1324.                        const LCD_PIXELINDEX* pTrans)
  1325. {
  1326.   int i;
  1327.   /* Use aID for bitmaps without palette */
  1328.   if (!pTrans) {
  1329.     pTrans = aID;
  1330.   }
  1331.   /* Use DrawBitLineXBPP */
  1332.   for (i=0; i<ysize; i++) {
  1333.     switch (BitsPerPixel) {
  1334.     case 1:
  1335.       DrawBitLine1BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1336.       break;
  1337.     #if (LCD_MAX_LOG_COLORS > 2)
  1338.       case 2:
  1339.         DrawBitLine2BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1340.         break;
  1341.     #endif
  1342.     #if (LCD_MAX_LOG_COLORS > 4)
  1343.       case 4:
  1344.         DrawBitLine4BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1345.         break;
  1346.     #endif
  1347.       case 8:
  1348.     #if (LCD_MAX_LOG_COLORS > 16)
  1349.         DrawBitLine8BPP(x0, i+y0, pData, xsize, pTrans);
  1350.     #else
  1351.         DEBUG_WARN("nCan not display 8bpp bitmaps, please #define LCD_MAX_LOG_COLORS 256");
  1352.     #endif
  1353.     }
  1354.     pData += BytesPerLine;
  1355.   }
  1356. }
  1357. /*
  1358.         *********************************************************
  1359.         *                                                       *
  1360.         *       LCD_L0_SetOrg                                   *
  1361.         *                                                       *
  1362.         *********************************************************
  1363. Purpose:        Sets the original position of the virtual display.
  1364.                 Has no function at this point with the PC-driver.
  1365. */
  1366. #if LCD_SUPPORT_SETORG
  1367. void LCD_L0_SetOrg(int x, int y) {
  1368.   int Off;
  1369.   if (y>(LCD_VYSIZE_PHYS-LCD_YSIZE_PHYS))
  1370.   y = LCD_VYSIZE_PHYS-LCD_YSIZE_PHYS;
  1371.   Off = y*LCD_BYTESPERLINE+(x>>3);
  1372.   #if   (LCD_BITSPERPIXEL == 3)
  1373.   {
  1374.     int i;
  1375.     for (i=0; i<LCD_BITSPERPIXEL/3; i++) {
  1376.       #ifndef WIN32
  1377.         LCD__apVRam[i] = &LCD_VRam[i][0] +Off;
  1378.       #endif
  1379.     }
  1380.   }
  1381.   #elif (LCD_BITSPERPIXEL == 6)
  1382.     #ifndef WIN32
  1383.       LCD__apVRam[0] = &LCD_VRam_0[0] +Off;
  1384.       LCD__apVRam[1] = &LCD_VRam_1[0] +Off;
  1385.     #endif
  1386.   #endif
  1387. }
  1388. #endif
  1389.   /*
  1390.         *********************************************************
  1391.         *                                                       *
  1392.         *           Support for verification                    *
  1393.         *                                                       *
  1394.         *********************************************************
  1395. The following routines are implemented, but have no functionility
  1396. at this point. The reason is that these functions are supposed
  1397. to supervise the hardware, which for obvious reasons can not be
  1398. done in a simulation.
  1399. */
  1400. #if LCD_VERIFY
  1401. int  LCD_GetErrStat(void) {
  1402.   return 0;
  1403. }
  1404. void LCD_ClrErrStat(void) {
  1405. }
  1406. int  LCD_GetErrCnt (void) {
  1407.   return 0;
  1408. }
  1409. #endif  
  1410. /*
  1411.         *********************************************************
  1412.         *                                                       *
  1413.         *       LCD_On                                          *
  1414.         *       LCD_Off                                         *
  1415.         *                                                       *
  1416.         *********************************************************
  1417. These funtions are not implemented for this driver, they
  1418. have to be in the external modul which refreshes the LCD
  1419. regularily.
  1420. */
  1421. #ifndef WIN32
  1422. void LCD_Off          (void) {
  1423. #ifdef LCD_OFF
  1424.     LCD_OFF(); 
  1425. #endif
  1426. }
  1427. #endif
  1428. #ifndef WIN32
  1429. void LCD_On           (void) {
  1430. #ifdef LCD_ON
  1431.     LCD_ON(); 
  1432. #endif
  1433. }
  1434. #endif
  1435. /*
  1436.         *********************************************************
  1437.         *                                                       *
  1438.         *       LCD_ReInit : Re-Init the display                *
  1439.         *                                                       *
  1440.         *********************************************************
  1441. ReInit contains all of the code that can be re-executed at any point without
  1442. changing or even disturbing what can be seen on the LCD.
  1443. Note that it is also used as a subroutine by LCD_Init().
  1444. */
  1445. void  LCD_ReInit(void) {
  1446. }
  1447. /*
  1448.         *********************************************************
  1449.         *                                                       *
  1450.         *       LCD_Init : Init the display                     *
  1451.         *                                                       *
  1452.         *********************************************************
  1453. */
  1454. int  LCD_L0_Init(void) {
  1455. #ifdef WIN32
  1456.   #if   (LCD_BITSPERPIXEL == 3)
  1457.     pVRam = GetpVRam(LCD_VYSIZE_PHYS*LCD_BYTESPERLINE);
  1458.   #elif (LCD_BITSPERPIXEL == 6)
  1459.     pVRam_0 = GetpVRam(LCD_VYSIZE_PHYS*LCD_BYTESPERLINE);
  1460.     pVRam_1 = pVRam_0 + LCD_VYSIZE_PHYS * LCD_BYTESPERLINE;
  1461.   #endif
  1462. #endif
  1463.   LCD_Off();
  1464.   LCD_ReInit();
  1465.   LCD_L0_SetOrg(0,0);
  1466.   /* Clear entire video RAM */
  1467.   LCD_SetDrawMode(LCD_DRAWMODE_REV);
  1468.   LCD_FillRect(0,0,4095,4095);
  1469.   LCD_SetDrawMode(0);
  1470.   LCD_On();
  1471.   return 0;
  1472. }
  1473. /*
  1474.         *********************************************************
  1475.         *                                                       *
  1476.         *       LCD_L0_CheckInit                                   *
  1477.         *                                                       *
  1478.         *  Check if display controller(s) is/are still          *
  1479.         *  properly initialized                                 *
  1480.         *                                                       *
  1481.         *********************************************************
  1482. Return value: 0 => No error, init is O.K.
  1483. */
  1484. int LCD_L0_CheckInit(void) {
  1485.     return 0;
  1486. }
  1487. /*
  1488.         *********************************************************
  1489.         *                                                       *
  1490.         *                   LCD_L0_SetLUTEntry                  *
  1491.         *                                                       *
  1492.         *********************************************************
  1493. */
  1494. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR color) {
  1495.   LCD_USE_PARA(Pos);
  1496.   LCD_USE_PARA(color);
  1497. }
  1498. #endif  /*(LCD_CONTROLLER/100 == 0) */
  1499. void LCDMemC(void) { } /* avoid empty object files */