LCD6642X.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        : 
  16. Purpose     : 
  17. ----------------------------------------------------------------------
  18. Version-Date---Author-Explanation
  19. ----------------------------------------------------------------------
  20. 1.04f   020204 JE     a) Hardwareinterface routines renamed:
  21.                          ...REG01 -> ...A1, ...REG00 -> ...A0
  22. 1.04e   010706 JE     a) Bugfixes in DrawBitLine1BPP_Swap
  23. 1.04d   010627 JE     a) Bugfix in DrawBitLine1BPP_Swap
  24. 1.04c   010420 JE     a) Defaults for config switches added
  25. 1.04b   010418 JE     a) Accelerations of DrawVLine changed 
  26.                          for using with cache
  27.                       b) LCD_L0_DrawBitmap changed
  28. 1.04a   010417 RS     a) DrawVLine for "Philips mode" accelerated
  29. 1.04    010411 JE     a) 2bpp bitmaps accelerated
  30.                       b) 1bpp bitmaps accelerated
  31. 1.02    010406 JE     a) Use of cache completed
  32.                       b) DrawVLine optimized
  33. 1.00    010401 RS     a) Major work ...
  34. 0.02    010314 JE     a) REORG0 changed
  35.                       b) _GetPixel0 & _GetPixel0 changed
  36.                       c) Superfluous macro definitions SETPIXEL, ... deleted
  37.                       d) PHYS_... new to handle rotation
  38. 0.01    010313 JE     a) Initialisation changed
  39. 0.00    001019 RS     Start of development
  40. ---------------------------LIST OF CONFIG SWITCHES--------------------
  41. The following is a list of additional configuration switches for this
  42. driver. These switches might not be listed in the manual, because
  43. the manual mainly covers the general config switches which are
  44. supported by all drivers.
  45. ----------------------------------------------------------------------
  46. define ----------------------Explanation------------------------------
  47. LCD_OPTIMIZE                 Controls the use of optimized routines.
  48. LCD_CACHE                    If active cache is used
  49. ----------------------------------------------------------------------
  50. Known problems or limitations with current version
  51. ----------------------------------------------------------------------
  52. none
  53. ---------------------------END-OF-HEADER------------------------------
  54. */
  55. #include <string.h>             /* for memset */
  56. #include <stddef.h>           /* needed for definition of NULL */
  57. #include "LCD_Private.h"      /* private modul definitions & config */
  58. #include "GUI_Private.h"
  59. #include "GUIDebug.h"
  60. #include "LCD_0.h"            /* Defines for first display */
  61. #if   ((LCD_CONTROLLER == 66420) | (LCD_CONTROLLER == 66421)) 
  62.       && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  63. /*
  64.   ********************************************************************
  65.   *
  66.   *                  ID translation table
  67.   *
  68.   ********************************************************************
  69. This table contains 0, 1, 2, ... and serves as translation table for DDBs
  70. */
  71. #define INTS(Base)  Base+0,Base+1,Base+2,Base+3,Base+4,Base+5,   
  72.                     Base+6,Base+7,Base+8,Base+9,Base+10,Base+11, 
  73.                     Base+12,Base+13,Base+14,Base+15
  74. static const LCD_PIXELINDEX aID[] = {
  75.   INTS(0),
  76.   #if LCD_MAX_LOG_COLORS > 0x10
  77.     INTS(0x10),
  78.   #endif
  79.   #if LCD_MAX_LOG_COLORS > 0x20
  80.     INTS(0x20),
  81.     INTS(0x30),
  82.   #endif
  83.   #if LCD_MAX_LOG_COLORS > 0x40
  84.     INTS(0x40),
  85.     INTS(0x50),
  86.     INTS(0x60),
  87.     INTS(0x70),
  88.   #endif
  89.   #if LCD_MAX_LOG_COLORS > 0x80
  90.     INTS(0x80),
  91.     INTS(0x90),
  92.     INTS(0xa0),
  93.     INTS(0xb0),
  94.     INTS(0xc0),
  95.     INTS(0xd0),
  96.     INTS(0xe0),
  97.     INTS(0xf0)
  98.   #endif
  99. };
  100. /*
  101.         *********************************************************
  102.         *                                                       *
  103.         *           Defaults for configuration                  *
  104.         *                                                       *
  105.         *********************************************************
  106. */
  107. #ifndef LCD_XORG0
  108.   #define LCD_XORG0     (0)     /* leftmost position covered by this controller */
  109. #endif
  110. #ifndef LCD_YORG0
  111.   #define LCD_YORG0     (0)     /* topmost position covered by this controller */
  112. #endif
  113. #ifndef LCD_STATIC
  114.   #define LCD_STATIC static
  115. #endif
  116. #ifndef LCD_CACHE
  117.   #define  LCD_CACHE (0)
  118. #endif
  119. #ifndef LCD_FIRSTSEG0
  120.   #define LCD_FIRSTSEG0   (0)     /* Contr.0: first segment line used */
  121. #endif
  122. #ifndef LCD_LASTSEG0
  123.   #define LCD_LASTSEG0    (LCD_XSIZE_PHYS-1)    /* Contr.0: last segment line used */
  124. #endif
  125. #ifndef LCD_FIRSTCOM0
  126.   #define LCD_FIRSTCOM0   (0)     /* Contr.0: first com line used */
  127. #endif
  128. #ifndef LCD_LASTCOM0
  129.   #define LCD_LASTCOM0    (LCD_YSIZE_PHYS-1)     /* Contr.0: last com line used */
  130. #endif
  131. #ifndef LCD_NUM_CONTROLLERS
  132.   #define LCD_NUM_CONTROLLERS           (1)
  133. #endif
  134. #ifndef LCD_SUPPORT_CHECKINIT
  135.   #define LCD_SUPPORT_CHECKINIT         (0)
  136. #endif
  137. #ifndef LCD_OPTIMIZE
  138.   #define LCD_OPTIMIZE                (1)
  139. #endif
  140. /*      *********************************************************
  141.         *                                                       *
  142.         *              Controller dependend values              *
  143.         *                                                       *
  144.         *********************************************************
  145. */
  146. #define MAX_REGS   18
  147. #if (LCD_CONTROLLER == 66420)
  148.   #define MAX_SEGS   160
  149.   #define MAX_COMS   80
  150. #elif (LCD_CONTROLLER == 66421)
  151.   #define MAX_SEGS   160
  152.   #define MAX_COMS   100
  153. #endif
  154. /*
  155.         *********************************************************
  156.         *                                                       *
  157.         *           Compiler specific settings                  *
  158.         *                                                       *
  159.         *********************************************************
  160. */
  161. #ifdef WIN32   /* Avoid warnings in MS-compiler */
  162.   #pragma warning(disable : 4761)  // warning C4761: integral size mismatch in argument; conversion supplied
  163. #endif
  164. /*
  165.         *********************************************************
  166.         *
  167.         *           Defines for simulation
  168.         *
  169.         *********************************************************
  170. */
  171. #ifdef WIN32
  172.   U8 SIM_Read00(void);
  173.   U8 SIM_Read01(void);
  174.   U8 SIM_Read10(void);
  175.   U8 SIM_Read11(void);
  176.   void SIM_Write00(U8 Data);
  177.   void SIM_Write01(U8 Data);
  178.   void SIM_Write10(U8 Data);
  179.   void SIM_Write11(U8 Data);
  180. /* Write data */
  181.   #undef  LCD_WRITE_A0
  182.   #define LCD_WRITE_A0(Data) SIM_Write00(Data)
  183.   #undef  LCD_WRITE_A1
  184.   #define LCD_WRITE_A1(Data) SIM_Write01(Data)
  185.   #if LCD_NUM_CONTROLLERS > 1
  186.     #undef  LCD_WRITE_A0C1
  187.     #define LCD_WRITE_A0C1(Data) SIM_Write10(Data)
  188.     #undef  LCD_WRITE_A1C1
  189.     #define LCD_WRITE_A1C1(Data) SIM_Write11(Data)
  190.   #endif  /* LCD_NUM_CONTROLLERS > 1 */
  191. /* Read data */
  192.   #undef  LCD_READ_A0
  193.   #define LCD_READ_A0(Data) Data = SIM_Read00()
  194.   #undef  LCD_READ_A1
  195.   #define LCD_READ_A1(Data) Data = SIM_Read01()
  196.   #if LCD_NUM_CONTROLLERS > 1
  197.     #undef  LCD_READ_A0C0
  198.     #define LCD_READ_A0C0(Data) Data = SIM_Read10()
  199.     #undef  LCD_READ_A1C0
  200.     #define LCD_READ_A1C0(Data) Data = SIM_Read11()
  201.   #endif  /* LCD_NUM_CONTROLLERS > 1 */
  202. #endif
  203. /*
  204.         *********************************************************
  205.         *
  206.         *          Remap ...A0, ...A1 -> ...CMD, ...DATA
  207.         *
  208.         *********************************************************
  209. */
  210. #define LCD_WRITE_REG00 LCD_WRITE_A0
  211. #define LCD_WRITE_REG01 LCD_WRITE_A1
  212. #define LCD_READ_REG00  LCD_READ_A0
  213. #define LCD_READ_REG01  LCD_READ_A1
  214. #if LCD_NUM_CONTROLLERS > 1
  215.   #define LCD_WRITE_REG10 LCD_WRITE_A0C1
  216.   #define LCD_WRITE_REG11 LCD_WRITE_A1C1
  217.   #define LCD_READ_REG10  LCD_READ_A0C1
  218.   #define LCD_READ_REG11  LCD_READ_A1C1
  219. #endif
  220. /*
  221.         *********************************************************
  222.         *                                                       *
  223.         *          Internal types                               *
  224.         *                                                       *
  225.         *********************************************************
  226. */
  227. #define PIXELCOLOR U8
  228. #define BKCOLOR LCD_BKCOLORINDEX
  229. #define   COLOR LCD_COLORINDEX
  230. /*
  231.         *********************************************************
  232.         *                                                       *
  233.         *          Support for Segment/COMLUTs                  *
  234.         *                                                       *
  235.         *********************************************************
  236. */
  237. /* For compatibility with older configs, define defaults */
  238. #ifndef LCD_SUPPORT_COMTRANS
  239.   #define LCD_SUPPORT_COMTRANS 0
  240. #endif
  241. #ifndef LCD_SUPPORT_SEGTRANS
  242.   #define LCD_SUPPORT_SEGTRANS 0
  243. #endif
  244. #if LCD_SUPPORT_COMTRANS
  245.   extern LCD_TYPE_COMTRANS LCD__aLine2Com0[LCD_LASTCOM0-LCD_FIRSTCOM0+1];
  246. #endif
  247. #if LCD_SUPPORT_SEGTRANS
  248.   extern LCD_TYPE_SEGTRANS LCD__aRow2Seg0[LCD_LASTSEG0-LCD_FIRSTSEG0+1];
  249. #endif
  250. /*
  251.         *********************************************************
  252.         *                                                       *
  253.         *           Macro calculations                          *
  254.         *                                                       *
  255.         *********************************************************
  256. */
  257. #define LCD_MSB_SHIFT       (8-LCD_LSB_SHIFT)
  258. /* Define number of used coms/segments per controller */
  259. #define LCD_NUM_SEGS0 (LCD_LASTSEG0-LCD_FIRSTSEG0+1)
  260. #define LCD_NUM_COMS0 (LCD_LASTCOM0-LCD_FIRSTCOM0+1)
  261. #if (LCD_NUM_CONTROLLERS >1)
  262.   #define LCD_NUM_SEGS1 (LCD_LASTSEG1-LCD_FIRSTSEG1+1)
  263.   #define LCD_NUM_COMS1 (LCD_LASTCOM1-LCD_FIRSTCOM1+1)
  264. #endif
  265. /* Define total number of used coms/segments */
  266. #if (LCD_NUM_CONTROLLERS ==1)
  267.   #define LCD_NUM_SEGS LCD_NUM_SEGS0
  268.   #define LCD_NUM_COMS LCD_NUM_COMS0
  269. #elif (LCD_NUM_CONTROLLERS ==2)
  270.   #define LCD_NUM_SEGS (LCD_NUM_SEGS0+LCD_NUM_SEGS1)
  271.   #define LCD_NUM_COMS (LCD_NUM_COMS0+LCD_NUM_COMS1)
  272. #endif
  273. #define LCD_MEMSIZE ((LCD_BITSPERPIXEL*LCD_VXSIZE/LCD_BUSWIDTH)*(LCD_VYSIZE+LCD_NUM_EMPTY_LINES))
  274. #define LCD_NUM_PAGES (LCD_NUM_COMS+7)/8
  275. /*
  276.         *********************************************************
  277.         *                                                       *
  278.         *      Configuration switch checking                    *
  279.         *                                                       *
  280.         *********************************************************
  281. Please be aware that not all configuration errors can be captured !
  282. */
  283. /* Check number of controllers */
  284. #if ((LCD_NUM_CONTROLLERS >1) || (LCD_NUM_CONTROLLERS <0))
  285.   #error "More than 1 controller not supported by this driver"
  286. #endif
  287. #if (!defined(LCD_INIT_R00)) | (!defined(LCD_INIT_R01))
  288.   #error You have to define init values in the configuration for Registers 0,1
  289.          /* Drivers needs to know as these values can not be read back ! */
  290. #endif
  291. /*********************************************************************
  292. *
  293. *           Static variables
  294. *
  295. **********************************************************************
  296. */
  297. static struct {
  298.   U8 ConReg0;
  299.   U8 ConReg1;
  300.   U8 x,y;
  301.   #if LCD_CACHE
  302.     U8 aaVMem[MAX_COMS][MAX_SEGS/4];  /* video memory */
  303.   #endif
  304. } aState[LCD_NUM_CONTROLLERS];
  305. /*
  306.         *********************************************************
  307.         *                                                       *
  308.         *              Macros, standard                         *
  309.         *                                                       *
  310.         *********************************************************
  311. These macros can be found in any LCD-driver as they serve purposes
  312. that can be found in any class of LCD-driver.
  313. */
  314. #if (!LCD_SWAP_XY) && (!LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  315.   #define LOG2PHYS(x,y) x,y
  316. #elif (!LCD_SWAP_XY) && (!LCD_MIRROR_X) && (LCD_MIRROR_Y)
  317.   #define LOG2PHYS(x,y) x,LCD_YSIZE_PHYS-1-(y)
  318. #elif (!LCD_SWAP_XY) && (LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  319.   #define LOG2PHYS(x,y) LCD_XSIZE_PHYS-1-(x),y
  320. #elif (!LCD_SWAP_XY) && (LCD_MIRROR_X) && (LCD_MIRROR_Y)
  321.   #define LOG2PHYS(x,y) LCD_XSIZE_PHYS-1-(x),LCD_YSIZE_PHYS-1-(y)
  322. #elif (LCD_SWAP_XY) && (!LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  323.   #define LOG2PHYS(x,y) y,x
  324. #elif (LCD_SWAP_XY) && (LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  325.   #define LOG2PHYS(x,y) y,LCD_XSIZE-1-(x)
  326. #elif (LCD_SWAP_XY) && (!LCD_MIRROR_X) && (LCD_MIRROR_Y)
  327.   #define LOG2PHYS(x,y) LCD_YSIZE-1-(y),x
  328. #elif (LCD_SWAP_XY) && (LCD_MIRROR_X) && (LCD_MIRROR_Y)
  329.   #define LOG2PHYS(x,y) LCD_YSIZE-1-(y),LCD_XSIZE-1-(x)
  330. #else
  331.   #error unsupported configuration
  332. #endif
  333. /*
  334.         *********************************************************
  335.         *                                                       *
  336.         *       Macros for internal use                         *
  337.         *                                                       *
  338.         *********************************************************
  339. */
  340. #if (LCD_SUPPORT_COMTRANS)
  341.   #if (LCD_MIRROR_Y)
  342.     #error LCD_MIRROR_Y not supported with COMTrans !
  343.   #endif
  344.   #if (LCD_MIRROR_X)
  345.     #error LCD_MIRROR_X not supported with COMTrans !
  346.   #endif
  347. #endif
  348. #define XORPIXEL_DATA(x, y,c)  XorPixel_Data(x,y,c)
  349. #if (!LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  350.   #define SETPIXEL(x, y, c)  _SetPixel(x, y, c)
  351.   #define GETPIXEL(x, y)     _GetPixel(x,y)
  352.   #define XORPIXEL(x, y)     XorPixel(x,y)
  353.   #define XORPIXEL_DATA(x, y,c)  XorPixel_Data(x,y,c)
  354. #elif (LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  355.   #if (!LCD_SWAP_XY)
  356.     #define SETPIXEL(x, y, c)  _SetPixel(x,LCD__aLine2Com0[y], c)
  357.     #define GETPIXEL(x, y)     _GetPixel(x,LCD__aLine2Com0[y])
  358.     #define XORPIXEL(x, y)      XorPixel(x,LCD__aLine2Com0[y])
  359.   #else
  360.     #define SETPIXEL(x, y, c)  _SetPixel(y,LCD__aLine2Com0[x], c)
  361.     #define GETPIXEL(x, y)     _GetPixel(y,LCD__aLine2Com0[x])
  362.     #define XORPIXEL(x, y)      XorPixel(y,LCD__aLine2Com0[x])
  363.   #endif
  364. #elif (!LCD_SUPPORT_COMTRANS && LCD_SUPPORT_SEGTRANS)
  365.   #if (!LCD_SWAP_XY)
  366.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[x],y, c)
  367.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[x],y)
  368.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[x],y)
  369.   #else
  370.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[y],x, c)
  371.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[y],x)
  372.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[y],x)
  373.   #endif
  374. #elif (LCD_SUPPORT_COMTRANS && LCD_SUPPORT_SEGTRANS)
  375.   #if (!LCD_SWAP_XY)
  376.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y], c)
  377.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y])
  378.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y])
  379.   #else
  380.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x], c)
  381.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x])
  382.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x])
  383.   #endif
  384. #else
  385.   #error This combination of switches not yet supported
  386. #endif
  387. /*
  388.         *********************************************************
  389.         *                                                       *
  390.         *       Next pixel routines                             *
  391.         *                                                       *
  392.         *********************************************************
  393. */
  394. /*
  395.         *********************************************************
  396.         *                                                       *
  397.         *                   LCD_SetPaletteEntry                 *
  398.         *                                                       *
  399.         *********************************************************
  400. */
  401. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR color) {
  402.   Pos=Pos;
  403.   color=color;
  404. }
  405. /*
  406. ********************************************************************
  407. *
  408. *           Hardware access routines
  409. *
  410. ********************************************************************
  411. */
  412. /* Write into controller 0 */
  413. void LCD_WriteReg0(int Reg, U8 Data) {
  414.   LCD_WRITE_REG00(Reg);
  415.   LCD_WRITE_REG01(Data);
  416. }
  417. #if LCD_NUM_CONTROLLERS > 1
  418. void LCD_WriteReg1(int Reg, U8 Data) {
  419.   LCD_WRITE_REG10(Reg);
  420.   LCD_WRITE_REG11(Data);
  421. }
  422. #endif
  423. /*
  424.   ********************************************************************
  425.   *                                                                  *
  426.   *                  Hardware access, register level                 *
  427.   *                                                                  *
  428.   *           Write Page / Column                                    *
  429.   *                                                                  *
  430.   ********************************************************************
  431.  The following routines are used for all access to the
  432.  LCD-controller(s).
  433. */
  434. #define SET_X_INCREMENT()                    
  435.   aState[0].ConReg1 = (LCD_INIT_R01) | ( 2); 
  436.   LCD_WriteReg0( 1, aState[0].ConReg1)
  437. #define SET_Y_INCREMENT()                    
  438.   aState[0].ConReg1 = (LCD_INIT_R01) & (~2); 
  439.   LCD_WriteReg0( 1, aState[0].ConReg1)
  440. #define SET_X0(xNew) 
  441.   if (aState[0].x != xNew) 
  442.   { LCD_WRITE_REG00(2); LCD_WRITE_REG01(xNew); aState[0].x = xNew; }
  443. #define SET_Y0(yNew) 
  444.   if (aState[0].y != yNew) 
  445.   { LCD_WRITE_REG00(3); LCD_WRITE_REG01(yNew); aState[0].y = yNew; }
  446. #define EXEC_INCREMENT()        
  447.   if (aState[0].ConReg1 & 1<<1) 
  448.     aState[0].x++;              
  449.   else                          
  450.     aState[0].y++
  451. #if LCD_CACHE
  452.   #define WRITE_VMEM0(Data) {     
  453.     aState[0].aaVMem[aState[0].y][aState[0].x] = Data; 
  454.     LCD_WRITE_REG00(4);           
  455.     LCD_WRITE_REG01(Data);        
  456.     EXEC_INCREMENT();             
  457.   }
  458. #else
  459.   #define WRITE_VMEM0(Data) {     
  460.     LCD_WRITE_REG00(4);           
  461.     LCD_WRITE_REG01(Data);        
  462.     EXEC_INCREMENT();             
  463.   }
  464. #endif
  465. #if LCD_CACHE
  466.   #define READ_VMEM0(Data)  {     
  467.     Data = aState[0].aaVMem[aState[0].y][aState[0].x]; 
  468.   }
  469. #else
  470.   #define READ_VMEM0(Data)  {     
  471.     LCD_WRITE_REG00(4);           
  472.     LCD_READ_REG01(Data);         
  473.     LCD_READ_REG01(Data);         
  474.   }
  475. #endif
  476. /*
  477.         *********************************************************
  478.         *                                                       *
  479.         *       Internal set pixel routines                     *
  480.         *                                                       *
  481.         *********************************************************
  482. */
  483. static U8 aAndMask[4] = {255-(3<<6), 255-(3<<4), 255-(3<<2), 255-(3<<0)};
  484. static void _SetPixel0_Phys(int x, int y, PIXELCOLOR c) {
  485.   U8 Data;
  486.   int xByte = x>>2;
  487.   int Pos = x&3;
  488.   #if LCD_CACHE ==0
  489.     SET_X0(xByte);
  490.     SET_Y0(y);
  491.     READ_VMEM0(Data);
  492.     Data &= aAndMask[Pos];
  493.     Data |= c<<(6-(Pos<<1));
  494.     WRITE_VMEM0(Data);
  495.   #else
  496.     U8* pData = &aState[0].aaVMem[y][xByte];
  497.     Data = *pData & aAndMask[Pos];
  498.     Data |= c<<(6-(Pos<<1));
  499.     if (Data != *pData) {
  500.       SET_X0(xByte);
  501.       SET_Y0(y);
  502.       WRITE_VMEM0(Data);
  503.     }
  504.   #endif
  505. }
  506. #define _SetPixel(x,y,c)     _SetPixel0_Phys(LOG2PHYS((x-LCD_XORG0),(y-LCD_YORG0)), c)
  507. static PIXELCOLOR _GetPixel0(int x, int y) {
  508.   int xByte = x>>2;
  509.   int Pos = 3-(x&3);
  510.   U8 Data;
  511.   SET_X0(xByte);
  512.   SET_Y0(y);
  513.   READ_VMEM0(Data);
  514.   return 3&(Data>>(Pos<<1));
  515. }
  516. static PIXELCOLOR _GetPixel(int x, int y) {
  517.   return _GetPixel0(LOG2PHYS((x-LCD_XORG0),(y-LCD_YORG0)));
  518. }
  519. static void XorPixel(int x, int y) {
  520.   PIXELCOLOR Index = _GetPixel(x,y);
  521.   _SetPixel(x,y, LCD_NUM_COLORS-1-Index);
  522. }
  523. static void XorPixel_Data(int x, int y, PIXELCOLOR c) {
  524.   PIXELCOLOR Index = _GetPixel(x,y);
  525.   _SetPixel(x,y,Index^c);
  526. }
  527. /*
  528. *********************************************************
  529. *
  530. *                  LCD_L0_GetPixelIndex
  531. *
  532. *********************************************************
  533. */
  534. unsigned LCD_L0_GetPixelIndex(int x, int y) {
  535.   return _GetPixel(x,y);
  536. }
  537. /*
  538.         *********************************************************
  539.         *                                                       *
  540.         *       LCD_L0_XorPixel                                 *
  541.         *                                                       *
  542.         *********************************************************
  543. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  544.           display.
  545. */
  546. void LCD_L0_XorPixel(int x, int y) {
  547.   XORPIXEL(x, y);
  548. }
  549. /*
  550.         *********************************************************
  551.         *                                                       *
  552.         *       LCD_L0_SetPixelIndex                            *
  553.         *                                                       *
  554.         *********************************************************
  555. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  556.           display.
  557. */
  558. void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
  559.   SETPIXEL(x, y, ColorIndex);
  560. }
  561. /*
  562.         *********************************************************
  563.         *                                                       *
  564.         *          LCD_L0_DrawHLine unoptimized                 *
  565.         *                                                       *
  566.         *********************************************************
  567. */
  568. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  569.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  570.     while (x0 <= x1) {
  571.       XORPIXEL(x0, y);
  572.       x0++;
  573.     }
  574.   } else {
  575.     while (x0 <= x1) {
  576.       SETPIXEL(x0, y, COLOR);
  577.       x0++;
  578.     }
  579.   }
  580. }
  581. /*
  582.         *********************************************************
  583.         *
  584.         *          LCD_L0_DrawVLine, optimized
  585.         *
  586.         *********************************************************
  587. */
  588. #if (LCD_OPTIMIZE)               
  589.     && (LCD_BITSPERPIXEL == 2)   
  590.     && (LCD_SWAP_XY ==1)         
  591.     && (LCD_MIRROR_X==1)         
  592.     && (LCD_MIRROR_Y==0)         
  593.     && (!defined (LCD_LUT_SEG))
  594. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  595.   U8 ColorMask, OrMask, AndMask, Data;
  596.   int y = LCD_XSIZE - x - 1;
  597.   int x0 = y0;
  598.   int x1 = y1;
  599.   int x0Byte = x0 >> 2;
  600.   int x1Byte = (x1 + 1) >> 2;
  601.   int NumBytes = x1Byte - x0Byte;
  602.   SET_X_INCREMENT();
  603.   SET_Y0(y);
  604.   SET_X0(x0Byte);
  605.   ColorMask  = COLOR + (COLOR<<2) + (COLOR<<4) + (COLOR<<6);
  606.   if (x0 & 3) {
  607.     int Pos = (x0 & 3) << 1;
  608.     AndMask = 0xff << (8 - Pos);
  609.     OrMask = ColorMask >> Pos;
  610.     READ_VMEM0(Data);
  611.     if (x0Byte == (x1 >> 2)) {
  612.       if ((x1 & 3) != 3) {
  613.         int Pos = ((x1 + 1) & 3) << 1;
  614.         AndMask |= 0xff >> Pos;
  615.         OrMask &= ColorMask << (8 - Pos);
  616.       }
  617.       NumBytes = 0;
  618.     }
  619.     if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  620.       Data ^= (0xff & ~AndMask);
  621.     } else {
  622.       Data &= AndMask;
  623.       Data |= OrMask;
  624.     }
  625.     WRITE_VMEM0(Data);
  626.     if (!NumBytes) {
  627.       SET_Y_INCREMENT();
  628.       return;
  629.     }
  630.     --NumBytes;
  631.   }
  632.   if (NumBytes) {
  633.     if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  634.       do {
  635.         READ_VMEM0(Data);
  636.         Data ^= 0xff;
  637.         WRITE_VMEM0(Data);
  638.       } while(--NumBytes);
  639.     } else {
  640.       LCD_WRITE_REG00(4);
  641.       #if LCD_CACHE
  642.         memset(&aState[0].aaVMem[aState[0].y][aState[0].x], ColorMask, NumBytes);
  643.       #endif
  644.       aState[0].x += NumBytes;
  645.       do {
  646.         LCD_WRITE_REG01(ColorMask);
  647.       } while(--NumBytes);
  648.     }
  649.   }
  650.   if ((x1 + 1) & 3) {
  651.     int Pos = ((x1 + 1) & 3) << 1;
  652.     AndMask = 0xff >> Pos;
  653.     OrMask = ColorMask << (8 - Pos);
  654.     READ_VMEM0(Data);
  655.     if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  656.       Data ^= (0xff & ~AndMask);
  657.     } else {
  658.       Data &= AndMask;
  659.       Data |= OrMask;
  660.     }
  661.     WRITE_VMEM0(Data);
  662.   }
  663.   SET_Y_INCREMENT();
  664. }
  665. /*
  666.         *********************************************************
  667.         *
  668.         *          LCD_L0_DrawVLine no optimization
  669.         *
  670.         *********************************************************
  671. */
  672. #else
  673. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  674.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  675.     while (y0 <= y1) {
  676.       XORPIXEL(x, y0);
  677.       y0++;
  678.     }
  679.   } else {
  680.     while (y0 <= y1) {
  681.       SETPIXEL(x, y0, COLOR);
  682.       y0++;
  683.     }
  684.   }
  685. }
  686. #endif
  687. /*********************************************************************
  688. *
  689. *          LCD_FillRect
  690. *
  691. **********************************************************************
  692. */
  693. #if LCD_SWAP_XY
  694. void LCD_L0_FillRect(int x, int y0, int x1, int y1) {
  695.   for (; x <= x1; x++) {
  696.     LCD_L0_DrawVLine(x,y0, y1);
  697.   }
  698. }
  699. #else
  700. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  701.   for (; y0 <= y1; y0++) {
  702.     LCD_L0_DrawHLine(x0,y0, x1);
  703.   }
  704. }
  705. #endif
  706. /*
  707.         *********************************************************
  708.         *
  709.         *  Draw Bitmap 1 BPP, optimized
  710.         *
  711.         *********************************************************
  712. */
  713. #if (LCD_OPTIMIZE)               
  714.     && (LCD_BITSPERPIXEL == 2)   
  715.     && (LCD_SWAP_XY ==1)         
  716.     && (LCD_MIRROR_X==1)         
  717.     && (LCD_MIRROR_Y==0)         
  718.     && (!defined (LCD_LUT_SEG))
  719. static void DrawBitLine1BPP_Swap(
  720.   int x,
  721.   int y,
  722.   U8 const * pData,
  723.   int ysize,
  724.   const U8 * pTrans,
  725.   int BytesPerLine,
  726.   U8 Pos)
  727. {
  728.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  729.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  730.   int i;
  731.   int y0 = LCD_XSIZE - x - 1;
  732.   int x0 = y;
  733.   int x0Byte = y >> 2;
  734.   U8 Buffer, DataMask, Index, Data, ShiftPos, BufferMask, Pixel;
  735.   U8 BufferValid = 0;
  736.   SET_Y0(y0);
  737.   SET_X0(x0Byte);
  738.   ShiftPos = Pos & 7;
  739.   BufferMask = 0xC0 >> ((x0  & 3) << 1);
  740.   DataMask =   0x80 >> ShiftPos;
  741.   for (i = 0; i < ysize; i++, pData += BytesPerLine) {
  742.     if (!BufferValid) {
  743.       READ_VMEM0(Buffer);
  744.       BufferValid = 1;
  745.     }
  746.     switch (GUI_Context.DrawMode) {
  747.     case LCD_DRAWMODE_NORMAL:
  748.     case LCD_DRAWMODE_REV:
  749.       Buffer &= ~BufferMask;
  750.       Index = *(pTrans + ((*pData & DataMask) >> (7 - ShiftPos)));
  751.       Data = Index << (6 - (((i + x0) & 3) << 1));
  752.       Buffer |= Data;
  753.       break;
  754.     case LCD_DRAWMODE_XOR:
  755.       Pixel = (*pData & DataMask) >> (7 - ShiftPos);
  756.       if (Pixel) {
  757.         Data = 3 << (6 - (((i + x0) & 3) << 1));
  758.         Buffer ^= Data;
  759.       }
  760.       break;
  761.     case LCD_DRAWMODE_TRANS:
  762.       Pixel = (*pData & DataMask) >> (7 - ShiftPos);
  763.       if (Pixel) {
  764.         Index = *(pTrans + Pixel);
  765.         Buffer &= ~BufferMask;
  766.         Data = Index << (6 - (((i + x0) & 3) << 1));
  767.         Buffer |= Data;
  768.       }
  769.       break;
  770.     }
  771.     if (BufferMask == 3) {
  772.       BufferMask = 0xC0;
  773.       BufferValid = 0;
  774.       WRITE_VMEM0(Buffer);
  775.     } else {
  776.       BufferMask >>= 2;
  777.     }
  778.   }
  779.   if (BufferValid) {
  780.     WRITE_VMEM0(Buffer);
  781.   }
  782. }
  783. #else
  784. /*
  785.         *********************************************************
  786.         *
  787.         *  Draw Bitmap 1 BPP no optimization
  788.         *
  789.         *********************************************************
  790. */
  791. static void  DrawBitLine1BPP(int x, int y, U8 const *p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  792.   PIXELCOLOR pixels;
  793.   PIXELCOLOR Index0 = *(pTrans+0);
  794.   PIXELCOLOR Index1 = *(pTrans+1);
  795. /*
  796. // Jump to right entry point
  797. */
  798.   pixels = *p;
  799.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  800.   case 0:
  801.     #if defined (SETNEXTPIXEL)
  802.       SetPosXY(x,y);
  803.     #endif
  804.     switch (Diff&7) {
  805.     case 0:
  806.       goto WriteBit0;
  807.     case 1:
  808.       goto WriteBit1;
  809.     case 2:
  810.       goto WriteBit2;
  811.     case 3:
  812.       goto WriteBit3;
  813.     case 4:
  814.       goto WriteBit4;
  815.     case 5:
  816.       goto WriteBit5;
  817.     case 6:
  818.       goto WriteBit6;
  819.     case 7:
  820.       goto WriteBit7;
  821.     }
  822.     break;
  823.   case LCD_DRAWMODE_TRANS:
  824.     switch (Diff&7) {
  825.     case 0:
  826.       goto WriteTBit0;
  827.     case 1:
  828.       goto WriteTBit1;
  829.     case 2:
  830.       goto WriteTBit2;
  831.     case 3:
  832.       goto WriteTBit3;
  833.     case 4:
  834.       goto WriteTBit4;
  835.     case 5:
  836.       goto WriteTBit5;
  837.     case 6:
  838.       goto WriteTBit6;
  839.     case 7:
  840.       goto WriteTBit7;
  841.     }
  842.     break;
  843.   case LCD_DRAWMODE_XOR:
  844.     switch (Diff&7) {
  845.     case 0:
  846.       goto WriteXBit0;
  847.     case 1:
  848.       goto WriteXBit1;
  849.     case 2:
  850.       goto WriteXBit2;
  851.     case 3:
  852.       goto WriteXBit3;
  853.     case 4:
  854.       goto WriteXBit4;
  855.     case 5:
  856.       goto WriteXBit5;
  857.     case 6:
  858.       goto WriteXBit6;
  859.     case 7:
  860.       goto WriteXBit7;
  861.     }
  862.   }
  863. /*
  864.         Write with transparency
  865. */
  866.   WriteTBit0:
  867.     if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
  868.     if (!--xsize)
  869.       return;
  870.   WriteTBit1:
  871.     if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
  872.     if (!--xsize)
  873.       return;
  874.   WriteTBit2:
  875.     if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
  876.     if (!--xsize)
  877.       return;
  878.   WriteTBit3:
  879.     if (pixels&(1<<4)) SETPIXEL(x+3, y, Index1);
  880.     if (!--xsize)
  881.       return;
  882.   WriteTBit4:
  883.     if (pixels&(1<<3)) SETPIXEL(x+4, y, Index1);
  884.     if (!--xsize)
  885.       return;
  886.   WriteTBit5:
  887.     if (pixels&(1<<2)) SETPIXEL(x+5, y, Index1);
  888.     if (!--xsize)
  889.       return;
  890.   WriteTBit6:
  891.     if (pixels&(1<<1)) SETPIXEL(x+6, y, Index1);
  892.     if (!--xsize)
  893.       return;
  894.   WriteTBit7:
  895.     if (pixels&(1<<0)) SETPIXEL(x+7, y, Index1);
  896.     if (!--xsize)
  897.       return;
  898.     x+=8;
  899.     pixels = *(++p);
  900.     goto WriteTBit0;
  901. /*
  902.         Write without transparency
  903. */
  904. #if defined (SETNEXTPIXEL)   /* Optimization ! */
  905.   WriteBit0:
  906.     SetNextPixel(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
  907.     if (!--xsize)
  908.       return;
  909.   WriteBit1:
  910.     SetNextPixel(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
  911.     if (!--xsize)
  912.       return;
  913.   WriteBit2:
  914.     SetNextPixel(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
  915.     if (!--xsize)
  916.       return;
  917.   WriteBit3:
  918.     SetNextPixel(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
  919.     if (!--xsize)
  920.       return;
  921.   WriteBit4:
  922.     SetNextPixel(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
  923.     if (!--xsize)
  924.       return;
  925.   WriteBit5:
  926.     SetNextPixel(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
  927.     if (!--xsize)
  928.       return;
  929.   WriteBit6:
  930.     SetNextPixel(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
  931.     if (!--xsize)
  932.       return;
  933.   WriteBit7:
  934.     SetNextPixel(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
  935.     if (!--xsize)
  936.       return;
  937.     x+=8;
  938.     pixels = *(++p);
  939.     goto WriteBit0;
  940. #else
  941.   WriteBit0:
  942.     SETPIXEL(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
  943.     if (!--xsize)
  944.       return;
  945.   WriteBit1:
  946.     SETPIXEL(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
  947.     if (!--xsize)
  948.       return;
  949.   WriteBit2:
  950.     SETPIXEL(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
  951.     if (!--xsize)
  952.       return;
  953.   WriteBit3:
  954.     SETPIXEL(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
  955.     if (!--xsize)
  956.       return;
  957.   WriteBit4:
  958.     SETPIXEL(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
  959.     if (!--xsize)
  960.       return;
  961.   WriteBit5:
  962.     SETPIXEL(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
  963.     if (!--xsize)
  964.       return;
  965.   WriteBit6:
  966.     SETPIXEL(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
  967.     if (!--xsize)
  968.       return;
  969.   WriteBit7:
  970.     SETPIXEL(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
  971.     if (!--xsize)
  972.       return;
  973.     x+=8;
  974.     pixels = *(++p);
  975.     goto WriteBit0;
  976. #endif
  977. /*
  978.         Write XOR mode
  979. */
  980.   WriteXBit0:
  981.     if (pixels&(1<<7))
  982.       XORPIXEL(x+0, y);
  983.     if (!--xsize)
  984.       return;
  985.   WriteXBit1:
  986.     if (pixels&(1<<6))
  987.       XORPIXEL(x+1, y);
  988.     if (!--xsize)
  989.       return;
  990.   WriteXBit2:
  991.     if (pixels&(1<<5))
  992.       XORPIXEL(x+2, y);
  993.     if (!--xsize)
  994.       return;
  995.   WriteXBit3:
  996.     if (pixels&(1<<4))
  997.       XORPIXEL(x+3, y);
  998.     if (!--xsize)
  999.       return;
  1000.   WriteXBit4:
  1001.     if (pixels&(1<<3))
  1002.       XORPIXEL(x+4, y);
  1003.     if (!--xsize)
  1004.       return;
  1005.   WriteXBit5:
  1006.     if (pixels&(1<<2))
  1007.       XORPIXEL(x+5, y);
  1008.     if (!--xsize)
  1009.       return;
  1010.   WriteXBit6:
  1011.     if (pixels&(1<<1))
  1012.       XORPIXEL(x+6, y);
  1013.     if (!--xsize)
  1014.       return;
  1015.   WriteXBit7:
  1016.     if (pixels&(1<<0))
  1017.       XORPIXEL(x+7, y);
  1018.     if (!--xsize)
  1019.       return;
  1020.     x+=8;
  1021.     pixels = *(++p);
  1022.     goto WriteXBit0;
  1023. }
  1024. #endif
  1025. /*
  1026.         *********************************************************
  1027.         *
  1028.         *  Draw Bitmap 2 BPP, optimized
  1029.         *
  1030.         *********************************************************
  1031. */
  1032. #if (LCD_MAX_LOG_COLORS > 2)
  1033. #if (LCD_OPTIMIZE)               
  1034.     && (LCD_BITSPERPIXEL == 2)   
  1035.     && (LCD_SWAP_XY ==1)         
  1036.     && (LCD_MIRROR_X==1)         
  1037.     && (LCD_MIRROR_Y==0)         
  1038.     && (!defined (LCD_LUT_SEG))
  1039. static void DrawBitLine2BPP_Swap(
  1040.   int x,
  1041.   int y,
  1042.   U8 const * pData,
  1043.   int ysize,
  1044.   const U8 * pTrans,
  1045.   int BytesPerLine,
  1046.   U8 Pos)
  1047. {
  1048.   int i;
  1049.   int y0 = LCD_XSIZE - x - 1;
  1050.   int x0 = y;
  1051.   int x0Byte = y >> 2;
  1052.   U8 Buffer, DataMask, Index, Data, ShiftPos, BufferMask;
  1053.   U8 BufferValid = 0;
  1054.   SET_Y0(y0);
  1055.   SET_X0(x0Byte);
  1056.   ShiftPos = (Pos & 3) << 1;
  1057.   BufferMask = 0xC0 >> ((x0  & 3) << 1);
  1058.   DataMask =   0xC0 >> ShiftPos;
  1059.   for (i = 0; i < ysize; i++, pData += BytesPerLine) {
  1060.     if (!BufferValid) {
  1061.       READ_VMEM0(Buffer);
  1062.       BufferValid = 1;
  1063.     }
  1064.     switch (GUI_Context.DrawMode) {
  1065.     case LCD_DRAWMODE_NORMAL:
  1066.     case LCD_DRAWMODE_REV:
  1067.       Buffer &= ~BufferMask;
  1068.       Index = *(pTrans + ((*pData & DataMask) >> (6 - ShiftPos)));
  1069.       Data = Index << (6 - (((i + x0) & 3) << 1));
  1070.       Buffer |= Data;
  1071.       break;
  1072.     case LCD_DRAWMODE_XOR:
  1073.       Index = *(pTrans + ((*pData & DataMask) >> (6 - ShiftPos))) * 3;
  1074.       Data = Index << (6 - (((i + x0) & 3) << 1));
  1075.       Buffer ^= Data;
  1076.       break;
  1077.     case LCD_DRAWMODE_TRANS:
  1078.       Index = *(pTrans + ((*pData & DataMask) >> (6 - ShiftPos)));
  1079.       if (Index) {
  1080.         Buffer &= ~BufferMask;
  1081.         Data = Index << (6 - (((i + x0) & 3) << 1));
  1082.         Buffer |= Data;
  1083.       }
  1084.       break;
  1085.     }
  1086.     if (BufferMask == 3) {
  1087.       BufferMask = 0xC0;
  1088.       BufferValid = 0;
  1089.       WRITE_VMEM0(Buffer);
  1090.     } else {
  1091.       BufferMask >>= 2;
  1092.     }
  1093.   }
  1094.   if (BufferValid) {
  1095.     WRITE_VMEM0(Buffer);
  1096.   }
  1097. }
  1098. /*
  1099.         *********************************************************
  1100.         *
  1101.         *  Draw Bitmap 2 BPP no optimization
  1102.         *
  1103.         *********************************************************
  1104. */
  1105. #else
  1106. static void  DrawBitLine2BPP(int x, int y, U8 const *p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1107.   PIXELCOLOR pixels;
  1108. /*
  1109. // Jump to right entry point
  1110. */
  1111.   pixels = *p;
  1112.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  1113.   case 0:
  1114.     switch (Diff&3) {
  1115.     case 0:
  1116.       goto WriteBit0;
  1117.     case 1:
  1118.       goto WriteBit1;
  1119.     case 2:
  1120.       goto WriteBit2;
  1121.     default:
  1122.       goto WriteBit3;
  1123.     }
  1124.   case LCD_DRAWMODE_TRANS:
  1125.     switch (Diff&3) {
  1126.     case 0:
  1127.       goto WriteTBit0;
  1128.     case 1:
  1129.       goto WriteTBit1;
  1130.     case 2:
  1131.       goto WriteTBit2;
  1132.     default:
  1133.       goto WriteTBit3;
  1134.     }
  1135.   case LCD_DRAWMODE_XOR:
  1136.     switch (Diff&3) {
  1137.     case 0:
  1138.       goto WriteXBit0;
  1139.     case 1:
  1140.       goto WriteXBit1;
  1141.     case 2:
  1142.       goto WriteXBit2;
  1143.     default:
  1144.       goto WriteXBit3;
  1145.     }
  1146.   case LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR:
  1147.     switch (Diff&3) {
  1148.     case 0:
  1149.       goto WriteTXBit0;
  1150.     case 1:
  1151.       goto WriteTXBit1;
  1152.     case 2:
  1153.       goto WriteTXBit2;
  1154.     default:
  1155.       goto WriteTXBit3;
  1156.     }
  1157.   }
  1158. /*
  1159.         Write without transparency
  1160. */
  1161. WriteBit0:
  1162.   SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1163.   if (!--xsize)
  1164.     return;
  1165. WriteBit1:
  1166.   SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1167.   if (!--xsize)
  1168.     return;
  1169. WriteBit2:
  1170.   SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1171.   if (!--xsize)
  1172.     return;
  1173. WriteBit3:
  1174.   SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1175.   if (!--xsize)
  1176.     return;
  1177.   pixels = *(++p);
  1178.   x+=4;
  1179.   goto WriteBit0;
  1180. /*
  1181.         Write with transparency
  1182. */
  1183. WriteTBit0:
  1184.   if (pixels&(3<<6))
  1185.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1186.   if (!--xsize)
  1187.     return;
  1188. WriteTBit1:
  1189.   if (pixels&(3<<4))
  1190.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1191.   if (!--xsize)
  1192.     return;
  1193. WriteTBit2:
  1194.   if (pixels&(3<<2))
  1195.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1196.   if (!--xsize)
  1197.     return;
  1198. WriteTBit3:
  1199.   if (pixels&(3<<0))
  1200.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1201.   if (!--xsize)
  1202.     return;
  1203.   pixels = *(++p);
  1204.   x+=4;
  1205.   goto WriteTBit0;
  1206. /*
  1207.         Write without transparency, xor
  1208. */
  1209. WriteXBit0:
  1210.   XORPIXEL_DATA(x+0, y, *(pTrans+(pixels>>6)));
  1211.   if (!--xsize)
  1212.     return;
  1213. WriteXBit1:
  1214.   XORPIXEL_DATA(x+1, y, *(pTrans+(3&(pixels>>4))));
  1215.   if (!--xsize)
  1216.     return;
  1217. WriteXBit2:
  1218.   XORPIXEL_DATA(x+2, y, *(pTrans+(3&(pixels>>2))));
  1219.   if (!--xsize)
  1220.     return;
  1221. WriteXBit3:
  1222.   XORPIXEL_DATA(x+3, y, *(pTrans+(3&(pixels))));
  1223.   if (!--xsize)
  1224.     return;
  1225.   pixels = *(++p);
  1226.   x+=4;
  1227.   goto WriteXBit0;
  1228. /*
  1229.         Write with transparency, xor
  1230. */
  1231. WriteTXBit0:
  1232.   if (pixels&(3<<6))
  1233.     XORPIXEL_DATA(x+0, y, *(pTrans+(pixels>>6)));
  1234.   if (!--xsize)
  1235.     return;
  1236. WriteTXBit1:
  1237.   if (pixels&(3<<4))
  1238.     XORPIXEL_DATA(x+1, y, *(pTrans+(3&(pixels>>4))));
  1239.   if (!--xsize)
  1240.     return;
  1241. WriteTXBit2:
  1242.   if (pixels&(3<<2))
  1243.     XORPIXEL_DATA(x+2, y, *(pTrans+(3&(pixels>>2))));
  1244.   if (!--xsize)
  1245.     return;
  1246. WriteTXBit3:
  1247.   if (pixels&(3<<0))
  1248.     XORPIXEL_DATA(x+3, y, *(pTrans+(3&(pixels))));
  1249.   if (!--xsize)
  1250.     return;
  1251.   pixels = *(++p);
  1252.   x+=4;
  1253.   goto WriteTXBit0;
  1254. }
  1255. #endif
  1256. #endif
  1257. /*
  1258.         *********************************************************
  1259.         *                                                       *
  1260.         *  Draw Bitmap 4 BPP                                    *
  1261.         *                                                       *
  1262.         *********************************************************
  1263. */
  1264. #if (LCD_MAX_LOG_COLORS > 4)
  1265. static void  DrawBitLine4BPP(int x, int y, U8 const *p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1266.   PIXELCOLOR pixels;
  1267. /*
  1268. // Jump to right entry point
  1269. */
  1270.   pixels = *p;
  1271.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  1272.     if ((Diff&1) ==0)
  1273.       goto WriteTBit0;
  1274.     goto WriteTBit1;
  1275.   } else {
  1276.     if ((Diff&1) ==0)
  1277.       goto WriteBit0;
  1278.     goto WriteBit1;
  1279.   }
  1280. /*
  1281.         Write without transparency
  1282. */
  1283. WriteBit0:
  1284.   SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1285.   if (!--xsize)
  1286.     return;
  1287. WriteBit1:
  1288.   SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1289.   if (!--xsize)
  1290.     return;
  1291.   x+=2;
  1292.   pixels = *(++p);
  1293.   goto WriteBit0;
  1294. /*
  1295.         Write with transparency
  1296. */
  1297. WriteTBit0:
  1298.   if (pixels>>4)
  1299.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1300.   if (!--xsize)
  1301.     return;
  1302. WriteTBit1:
  1303.   if (pixels&0xf)
  1304.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1305.   if (!--xsize)
  1306.     return;
  1307.   x+=2;
  1308.   pixels = *(++p);
  1309.   goto WriteTBit0;
  1310. }
  1311. #endif
  1312. /*
  1313.         *********************************************************
  1314.         *                                                       *
  1315.         *  Draw Bitmap 8 BPP  (256 colors)                      *
  1316.         *                                                       *
  1317.         *      Default (no optimization)                        *
  1318.         *                                                       *
  1319.         *********************************************************
  1320. */
  1321. #if (LCD_MAX_LOG_COLORS > 16)
  1322. static void  DrawBitLine8BPP(int x, int y, U8 const *p, int xsize, const LCD_PIXELINDEX*pTrans) {
  1323.   LCD_PIXELINDEX pixel;
  1324.   if (pTrans) {
  1325.     if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  1326.       while (xsize > 0) {
  1327.         pixel = *p;
  1328.         SETPIXEL(x+0, y, *(pTrans+pixel));
  1329.         xsize--; x++; p++;
  1330.       }
  1331.     } else {   /* Handle transparent bitmap */
  1332.       while (xsize > 0) {
  1333.         pixel = *p;
  1334.         if (pixel)
  1335.           SETPIXEL(x+0, y, *(pTrans+pixel));
  1336.         xsize--; x++; p++;
  1337.       }
  1338.     }
  1339.   } else {
  1340.     if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  1341.       while (xsize > 0) {
  1342.         pixel = *p;
  1343.         SETPIXEL(x+0, y, pixel);
  1344.         xsize--; x++; p++;
  1345.       }
  1346.     } else {   /* Handle transparent bitmap */
  1347.       while (xsize > 0) {
  1348.         pixel = *p;
  1349.         if (pixel)
  1350.           SETPIXEL(x+0, y, pixel);
  1351.         xsize--; x++; p++;
  1352.       }
  1353.     }
  1354.   }
  1355. }
  1356. #endif
  1357. /*
  1358.         *********************************************************
  1359.         *                                                       *
  1360.         *         Universal draw Bitmap routine                 *
  1361.         *                                                       *
  1362.         *********************************************************
  1363. */
  1364. void LCD_L0_DrawBitmap(int x0, int y0,
  1365.                        int xsize, int ysize,
  1366.                        int BitsPerPixel,
  1367.                        int BytesPerLine,
  1368.                        const U8* pData, int Diff,
  1369.                        const LCD_PIXELINDEX* pTrans)
  1370. {
  1371.   int i;
  1372.   /* Use aID for bitmaps without palette */
  1373.   if (!pTrans) {
  1374.     pTrans = aID;
  1375.   }
  1376.   /*
  1377.      Use DrawBitLineXBPP
  1378.   */
  1379.   switch (BitsPerPixel) {
  1380.   case 1:
  1381.     #if (LCD_OPTIMIZE)               
  1382.         && (LCD_BITSPERPIXEL == 2)   
  1383.         && (LCD_SWAP_XY ==1)         
  1384.         && (LCD_MIRROR_X==1)         
  1385.         && (LCD_MIRROR_Y==0)         
  1386.         && (!defined (LCD_LUT_SEG))
  1387.       SET_X_INCREMENT();
  1388.       xsize += Diff & 7;
  1389.       for (i = Diff; i < xsize; i++) {
  1390.         DrawBitLine1BPP_Swap(
  1391.           x0+i, y0,
  1392.           pData + (i>>3),
  1393.           ysize,
  1394.           pTrans,
  1395.           BytesPerLine,
  1396.           i
  1397.         );
  1398.       }
  1399.       SET_Y_INCREMENT();
  1400.       break;
  1401.     #else
  1402.       for (i=0; i<ysize; i++) {
  1403.         DrawBitLine1BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1404.         pData += BytesPerLine;
  1405.       }
  1406.       break;
  1407.     #endif
  1408.     #if (LCD_MAX_LOG_COLORS > 2)
  1409.     case 2:
  1410.       #if (LCD_OPTIMIZE)               
  1411.           && (LCD_BITSPERPIXEL == 2)   
  1412.           && (LCD_SWAP_XY ==1)         
  1413.           && (LCD_MIRROR_X==1)         
  1414.           && (LCD_MIRROR_Y==0)         
  1415.           && (!defined (LCD_LUT_SEG))
  1416.         SET_X_INCREMENT();
  1417.         xsize += Diff & 3;
  1418.         for (i = Diff; i < xsize; i++) {
  1419.           DrawBitLine2BPP_Swap(
  1420.             x0+i, y0,
  1421.             pData + (i>>2),
  1422.             ysize,
  1423.             pTrans,
  1424.             BytesPerLine,
  1425.             i
  1426.           );
  1427.         }
  1428.         SET_Y_INCREMENT();
  1429.         break;
  1430.       #else
  1431.         for (i=0; i<ysize; i++) {
  1432.           DrawBitLine2BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1433.           pData += BytesPerLine;
  1434.         }
  1435.         break;
  1436.       #endif
  1437.     #endif
  1438.     #if (LCD_MAX_LOG_COLORS > 4)
  1439.       case 4:
  1440.         for (i=0; i<ysize; i++) {
  1441.           DrawBitLine4BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1442.           pData += BytesPerLine;
  1443.         }
  1444.         break;
  1445.     #endif
  1446.     #if (LCD_MAX_LOG_COLORS > 16)
  1447.       case 8:
  1448.         for (i=0; i<ysize; i++) {
  1449.           DrawBitLine8BPP(x0, i+y0, pData, xsize, pTrans);
  1450.           pData += BytesPerLine;
  1451.         }
  1452.         break;
  1453.     #endif
  1454.   }
  1455. }
  1456. /*
  1457.         *********************************************************
  1458.         *                                                       *
  1459.         *       LCD_L0_SetOrg                                   *
  1460.         *                                                       *
  1461.         *********************************************************
  1462. Purpose:        Sets the original position of the virtual display.
  1463.                 Has no function at this point with the PC-driver.
  1464. */
  1465. int OrgX, OrgY;
  1466. void LCD_L0_SetOrg(int x, int y) {
  1467.   OrgX = x;
  1468.   OrgY = y;
  1469. }
  1470. /*
  1471.         *********************************************************
  1472.         *                                                       *
  1473.         *       LCD_On                                          *
  1474.         *       LCD_Off                                         *
  1475.         *                                                       *
  1476.         *********************************************************
  1477. */
  1478. void LCD_Off          (void) {
  1479.   aState[0].ConReg0 = (LCD_INIT_R00) & ~(1<<6);
  1480.   LCD_WriteReg0( 0, aState[0].ConReg0);
  1481. }
  1482. void LCD_On           (void) {
  1483.   aState[0].ConReg0 = (LCD_INIT_R00) |  (1<<6);
  1484.   LCD_WriteReg0( 0, aState[0].ConReg0);
  1485. }
  1486. /*
  1487.         *********************************************************
  1488.         *                                                       *
  1489.         *       LCD_L0_ReInit : Re-Init the display                *
  1490.         *                                                       *
  1491.         *********************************************************
  1492. ReInit contains all of the code that can be re-executed at any point without
  1493. changing or even disturbing what can be seen on the LCD.
  1494. Note that it is also used as a subroutine by LCD_L0_Init().
  1495. */
  1496. void  LCD_L0_ReInit(void) {
  1497.   LCD_INIT_CONTROLLER();
  1498.   aState[0].ConReg0 = (LCD_INIT_R00) | 0x80;
  1499.   aState[0].ConReg1 = (LCD_INIT_R01) & (~2);
  1500. /* Write control register 0, 1 */
  1501.   LCD_WriteReg0( 0, aState[0].ConReg0); /* Control register 1 */ 
  1502.   LCD_WriteReg0( 1, aState[0].ConReg1); /* Control register 2 */ 
  1503. }
  1504. /*
  1505.         *********************************************************
  1506.         *                                                       *
  1507.         *       LCD_Init : Init the display                     *
  1508.         *                                                       *
  1509.         *********************************************************
  1510. */
  1511. int  LCD_L0_Init(void) {
  1512.   U8 Data;
  1513.   GUI_DEBUG_LOG("nLCD_L0_Init()");
  1514. /* Invalidate register cache */
  1515.   { int i;
  1516.     for (i=0; i<LCD_NUM_CONTROLLERS; i++) {
  1517.      aState[i].x = aState[i].y = 255;
  1518.     }
  1519.   }
  1520.   LCD_L0_ReInit();
  1521. /* Check memory */
  1522.   SET_X0(1);
  1523.   SET_Y0(2);
  1524.   WRITE_VMEM0(0x12);
  1525.   SET_X0(3);
  1526.   SET_Y0(4);
  1527.   WRITE_VMEM0(0x34);
  1528.   SET_X0(1);
  1529.   SET_Y0(2);
  1530.   READ_VMEM0(Data);
  1531.   if (Data != 0x12) {
  1532.     GUI_DEBUG_ERROROUT("nLCD6642X: video memory problem");
  1533.     return LCD_ERR_MEMORY;
  1534.   }
  1535.   SET_X0(3);
  1536.   SET_Y0(4);
  1537.   READ_VMEM0(Data);
  1538.   if (Data != 0x34) {
  1539.     GUI_DEBUG_ERROROUT("nLCD6642X: video memory problem");
  1540.     return LCD_ERR_MEMORY;
  1541.   }
  1542. /* Fill LCD memory with gray scale bar */
  1543.   #if 1
  1544.   {
  1545.     int x, y;
  1546.     int MaxX, MaxY;
  1547.     int IncX = (aState[0].ConReg1 & 1<<1) ? 1 : 0;
  1548.     if (IncX) {
  1549.       MaxX = MAX_COMS;
  1550.       MaxY = MAX_SEGS/4;
  1551.     } else {
  1552.       MaxY = MAX_COMS;
  1553.       MaxX = MAX_SEGS/4;
  1554.     }
  1555.     for (x=0; x < MaxX; x++) {
  1556.       if (IncX) {
  1557.         SET_X0(0);
  1558.         SET_Y0(x);
  1559.       } else {
  1560.         SET_X0(x);
  1561.         SET_Y0(0);
  1562.       }
  1563.       for (y=0; y<MaxY; y++) {
  1564.         WRITE_VMEM0(0x00);
  1565.       }
  1566.     }
  1567.   }
  1568.   #endif
  1569.   return 0;    /* Init successfull ! */
  1570. }
  1571. /*
  1572.         *********************************************************
  1573.         *                                                       *
  1574.         *       LCD_L0_CheckInit                                   *
  1575.         *                                                       *
  1576.         *  Check if display controller(s) is/are still          *
  1577.         *  properly initialized                                 *
  1578.         *                                                       *
  1579.         *********************************************************
  1580. Return value: 0 => No error, init is O.K.
  1581. */
  1582. #if LCD_SUPPORT_CHECKINIT
  1583. char LCD_L0_CheckInit(void) {
  1584.   return 0;
  1585. }
  1586. #endif
  1587. #else
  1588. void LCD6642X(void) { } /* avoid empty object files */
  1589. #endif  /* Right LCD_CONTROLLER */