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

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        : LCD159A.C
  16. Purpose     : Driver for LCDs using a Seiko Epson SED159A controller
  17. ----------------------------------------------------------------------   
  18. Version-Date---Author-Explanation                                        
  19. ----------------------------------------------------------------------   
  20. 1.00b   020204 JE     a) Hardwareinterface routines renamed:
  21.                          ...DATA -> ...A1, ...CMD -> ...A0
  22. 1.00a   010926 JE     a) Support for LCD_SWAPXY added
  23. 1.00.00 010710 JE     a) Speed optimizations added
  24. 0.90.00 010709 JE     a) First release
  25. ---------------------------LIST OF CONFIG SWITCHES--------------------
  26. The following is a list of additional configuration switches for this
  27. driver. These switches might not be listed in the manual, because
  28. the manual mainly covers the general config switches which are
  29. supported by all drivers.
  30. ----------------------------------------------------------------------
  31. define ----------------------Explanation------------------------------
  32. LCD_OPTIMIZE                 Controls the use of optimized routines.
  33.                              If 1, several (speed) optimizations are used.
  34.                              Default: ON (1)
  35. ----------------------------------------------------------------------
  36. Known problems or limitations with current version
  37. ----------------------------------------------------------------------
  38. a) Cache not supported yet, becuse RAM requirement would be 
  39.    to large. LCD_CACHE must be set to 0
  40. ----------------------------------------------------------------------
  41. Open issues
  42. ----------------------------------------------------------------------
  43. none
  44. ---------------------------END-OF-HEADER------------------------------
  45. */
  46. #include <string.h>             /* for memset */
  47. #include <stddef.h>           /* needed for definition of NULL */
  48. #include "LCD_Private.h"      /* private modul definitions & config */
  49. #include "GUI_Private.h"
  50. #include "GUIDebug.h"
  51. #include "LCD_0.h"            /* Defines for first display */
  52. #if      (LCD_CONTROLLER == 0x159A) 
  53.       && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  54. /*
  55.         *********************************************************
  56.         *
  57.         *           Defaults for config switches
  58.         *
  59.         *********************************************************
  60. */
  61. #ifndef LCD_OPTIMIZE
  62.   #define LCD_OPTIMIZE                (1)
  63. #endif
  64. #ifndef LCD_CACHE
  65.   #define  LCD_CACHE                  (0)
  66. #endif
  67. /*
  68.         *********************************************************
  69.         *
  70.         *           Defines for simulation
  71.         *
  72.         *********************************************************
  73. */
  74. #ifdef WIN32
  75.   #undef LCD_WRITE_A0
  76.   #undef LCD_WRITE_A1
  77.   #undef LCD_READ_A0
  78.   #undef LCD_READ_A1
  79.   void SIM_WriteA1C0(U8 Byte);
  80.   void SIM_WriteA0C0(U8 Byte);
  81.   U8   SIM_ReadA1C0(void);
  82.   U8   SIM_ReadA0C0(void);
  83.   #define LCD_WRITE_A1(Byte) SIM_WriteA1C0(Byte) 
  84.   #define LCD_WRITE_A0(Byte) SIM_WriteA0C0(Byte)
  85.   #define LCD_READ_A1(Byte)  Byte = SIM_ReadA1C0()
  86.   #define LCD_READ_A0(Byte)  Byte = SIM_ReadA0C0()
  87. #endif
  88. /*
  89.         *********************************************************
  90.         *
  91.         *          Remap ...A0, ...A1 -> ...CMD, ...DATA
  92.         *
  93.         *********************************************************
  94. */
  95. #define LCD_READCMD0    LCD_READ_A0
  96. #define LCD_READDATA0   LCD_READ_A1
  97. #define LCD_WRITECMD0   LCD_WRITE_A0
  98. #define LCD_WRITEDATA0  LCD_WRITE_A1
  99. /*
  100.         *********************************************************
  101.         *
  102.         *           Macro calculations
  103.         *
  104.         *********************************************************
  105. */
  106. /*
  107.         *********************************************************
  108.         *
  109.         *           Configuration switch checking
  110.         *
  111.         *********************************************************
  112. */
  113. #if (LCD_BITSPERPIXEL != 8)
  114.   #error This controller can handle only 8bpp displays
  115. #endif
  116. /*
  117.         *********************************************************
  118.         *
  119.         *           Macros, standard
  120.         *
  121.         *********************************************************
  122. These macros can be found in any LCD-driver as they serve purposes
  123. that can be found in any class of LCD-driver (Like clipping).
  124. */
  125. #if (!LCD_SWAP_XY) && (!LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  126.   #define LOG2PHYS(x, y) x, y
  127. #elif (!LCD_SWAP_XY) && (!LCD_MIRROR_X) && (LCD_MIRROR_Y)
  128.   #define LOG2PHYS(x, y) x, LCD_YSIZE_PHYS - 1 - (y)
  129. #elif (!LCD_SWAP_XY) && (LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  130.   #define LOG2PHYS(x, y) LCD_XSIZE_PHYS - 1 - (x), y
  131. #elif (!LCD_SWAP_XY) && (LCD_MIRROR_X) && (LCD_MIRROR_Y)
  132.   #define LOG2PHYS(x, y) LCD_XSIZE_PHYS - 1 - (x), LCD_YSIZE_PHYS - 1 - (y)
  133. #elif (LCD_SWAP_XY) && (!LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  134.   #define LOG2PHYS(x, y) y, x
  135. #elif (LCD_SWAP_XY) && (LCD_MIRROR_X) && (!LCD_MIRROR_Y)
  136.   #define LOG2PHYS(x, y) y, LCD_XSIZE - 1 - (x)
  137. #elif (LCD_SWAP_XY) && (!LCD_MIRROR_X) && (LCD_MIRROR_Y)
  138.   #define LOG2PHYS(x, y) LCD_YSIZE - 1 - (y), x
  139. #elif (LCD_SWAP_XY) && (LCD_MIRROR_X) && (LCD_MIRROR_Y)
  140.   #define LOG2PHYS(x, y) LCD_YSIZE - 1 - (y), LCD_XSIZE - 1 - (x)
  141. #else
  142.   #error unsupported configuration
  143. #endif
  144. #define BKCOLOR LCD_BKCOLORINDEX
  145. #define   COLOR LCD_COLORINDEX
  146. /*
  147.         *********************************************************
  148.         *
  149.         *           Static variables for driver
  150.         *
  151.         *********************************************************
  152. */
  153. #if LCD_CACHE
  154.   static U8 VRam[LCD_YSIZE_PHYS][LCD_XSIZE_PHYS];
  155. #endif
  156. static int CurrentX, CurrentY, StartPage, StartColumn, RAM_Mode;
  157. /*
  158.         *********************************************************
  159.         *
  160.         *           Hardware access
  161.         *
  162.         *********************************************************
  163. */
  164. /*
  165.         *****************************************
  166.         *
  167.         *           Low level macros
  168.         *
  169.         *****************************************
  170. */
  171. #define RAM_WRITE (0x5c)
  172. #define RAM_READ  (0x5d)
  173. #define INCREMENT_CURSOR() 
  174.   CurrentX++; 
  175.   if (CurrentX >= LCD_XSIZE_PHYS) { 
  176.     CurrentX = StartColumn; 
  177.     CurrentY++; 
  178.     if (CurrentY >= LCD_YSIZE_PHYS) 
  179.       CurrentY = StartPage; 
  180.   }
  181. #define RESET_CURSOR() 
  182.   CurrentX = StartColumn; 
  183.   CurrentY = StartPage
  184. #define SET_RAMMODE(Mode) 
  185.   RAM_Mode = Mode; 
  186.   LCD_WRITECMD0 (Mode); 
  187.   RESET_CURSOR()
  188. #define PASET(y) 
  189.   RAM_Mode = 0; 
  190.   LCD_WRITECMD0 (0x75); 
  191.   LCD_WRITEDATA0(y); 
  192.   LCD_WRITEDATA0(LCD_YSIZE_PHYS - 1); 
  193.   StartPage = y
  194.   
  195. #define CASET(x) 
  196.   RAM_Mode = 0; 
  197.   LCD_WRITECMD0 (0x15); 
  198.   LCD_WRITEDATA0(x); 
  199.   LCD_WRITEDATA0(LCD_XSIZE_PHYS - 1); 
  200.   StartColumn = x
  201. #define LCD_ON() 
  202.   LCD_WRITECMD0 (0xaf); 
  203.   SET_RAMMODE(RAM_WRITE)
  204. #define LCD_OFF() 
  205.   LCD_WRITECMD0 (0xae); 
  206.   SET_RAMMODE(RAM_WRITE)
  207. #define DUMMYREAD(Data) 
  208.   LCD_READDATA0(Data)
  209. #if (LCD_OPTIMIZE)
  210.   
  211.   #define SET_RECT(x1, y1, x2, y2) 
  212.     CurrentX = CurrentY = 0xfff; 
  213.     LCD_WRITECMD0 (0x15); 
  214.     LCD_WRITEDATA0(x1); 
  215.     LCD_WRITEDATA0(x2); 
  216.     LCD_WRITECMD0 (0x75); 
  217.     LCD_WRITEDATA0(y1); 
  218.     LCD_WRITEDATA0(y2); 
  219.     LCD_WRITECMD0 (0x5c)
  220.   #define WRITEDATA_DIRECT(Data) 
  221.     LCD_WRITEDATA0(Data)
  222. #endif
  223. #if LCD_CACHE
  224.   #define WRITEDATA(Data) 
  225.     if (VRam[CurrentX][CurrentY] != Data) { 
  226.       VRam[CurrentX][CurrentY] = Data; 
  227.       LCD_WRITEDATA0(Data); 
  228.     } 
  229.     INCREMENT_CURSOR()
  230.   #define READDATA(Data) 
  231.     Data = VRam[CurrentX][CurrentY]
  232. #else
  233.   #define WRITEDATA(Data) 
  234.     LCD_WRITEDATA0(Data); 
  235.     INCREMENT_CURSOR()
  236.   #define READDATA(Data) 
  237.     LCD_READDATA0(Data); 
  238.     INCREMENT_CURSOR()
  239. #endif
  240. /*
  241.         *****************************************
  242.         *
  243.         *           GotoXY
  244.         *
  245.         *****************************************
  246. */
  247. void GotoXY(int x, int y, int Mode) {
  248.   if ((CurrentX != x) || (CurrentY != y)) {
  249.     CASET(x);
  250.     PASET(y);
  251.   }
  252.   if (RAM_Mode != Mode) {
  253.     SET_RAMMODE(Mode);
  254.   }
  255. }
  256. #define GOTOXY(x, y, Mode) GotoXY(x, y, Mode)
  257. /*
  258.         *********************************************************
  259.         *
  260.         *           Drawing routines, internal
  261.         *
  262.         *********************************************************
  263. */
  264. /*
  265.         *****************************************
  266.         *
  267.         *           SET pixel
  268.         *
  269.         *****************************************
  270. */
  271. static void SetPixel(int x, int y, U8 Color) {
  272.   GOTOXY(x, y, RAM_WRITE);
  273.   WRITEDATA(Color);
  274. }
  275. /*
  276.         *****************************************
  277.         *
  278.         *           GET pixel
  279.         *
  280.         *****************************************
  281. */
  282. static U8 GetPixel(int x, int y) {
  283.   U8 Color;
  284.   CASET(x);
  285.   PASET(y);
  286.   SET_RAMMODE(RAM_READ);
  287.   DUMMYREAD(Color);
  288.   READDATA(Color);
  289.   return Color;
  290. }
  291. /*
  292.         *****************************************
  293.         *
  294.         *           XOR pixel
  295.         *
  296.         *****************************************
  297. */
  298. static void XorPixel(int x, int y) {
  299.   U8 Color = GetPixel(x, y);
  300.   Color ^= 0xff;
  301.   SET_RAMMODE(RAM_WRITE);
  302.   WRITEDATA(Color);
  303. }
  304. /*
  305.         *********************************************************
  306.         *
  307.         *           Access macros for pixel access
  308.         *
  309.         *********************************************************
  310. Use only this macros for pixel access
  311. */
  312. #define XORPIXEL(x, y) 
  313.   XorPixel(LOG2PHYS(x, y));
  314. #define SETPIXEL(x, y, Color) 
  315.   SetPixel(LOG2PHYS(x, y), Color);
  316. #define GETPIXEL(x, y, Color) 
  317.   Color = GetPixel(LOG2PHYS(x, y));
  318. /*
  319.         *********************************************************
  320.         *
  321.         *           Exported routines
  322.         *
  323.         *********************************************************
  324. */
  325. /*
  326.         *****************************************
  327.         *
  328.         *           LCD_L0_XorPixel
  329.         *
  330.         *****************************************
  331. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  332.           display.
  333. */
  334. void LCD_L0_XorPixel(int x, int y) {
  335.   XORPIXEL(x, y);
  336. }
  337. /*
  338.         *****************************************
  339.         *
  340.         *           LCD_L0_SetPixelIndex
  341.         *
  342.         *****************************************
  343. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  344.           display.
  345. */
  346. void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
  347.   SETPIXEL(x, y, ColorIndex);
  348. }
  349. /*
  350.         *****************************************
  351.         *
  352.         *           LCD_L0_GetPixelIndex
  353.         *
  354.         *****************************************
  355. */
  356. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  357.   U8 ColorIndex;
  358.   GETPIXEL(x, y, ColorIndex);
  359.   return ColorIndex;
  360. }
  361. /*
  362.         *****************************************
  363.         *
  364.         *           LCD_L0_DrawPixel
  365.         *
  366.         *****************************************
  367. */
  368. void LCD_L0_DrawPixel(int x, int y) {
  369.   SETPIXEL(x, y, COLOR);
  370. }
  371. /*
  372.         ****************************************
  373.         *
  374.         *           LCD_DrawHLine
  375.         *
  376.         ****************************************
  377. */
  378. #if  (LCD_OPTIMIZE)  
  379.   && (!LCD_MIRROR_X) 
  380.   && (!LCD_MIRROR_Y) 
  381.   && (!LCD_SWAP_XY)
  382. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  383.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  384.     while (x0 <= x1) {
  385.       XORPIXEL(x0, y);
  386.       x0++;
  387.     }
  388.   } else {
  389.     SET_RECT(x0, y, x1, y);
  390.     while (x0++ <= x1) {
  391.       WRITEDATA_DIRECT(COLOR);
  392.     }
  393.   }
  394. }
  395. #else
  396. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  397.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  398.     while (x0 <= x1) {
  399.       XORPIXEL(x0, y);
  400.       x0++;
  401.     }
  402.   } else {
  403.     while (x0 <= x1) {
  404.       SETPIXEL(x0, y, COLOR);
  405.       x0++;
  406.     }
  407.   }
  408. }
  409. #endif
  410. /*
  411.         ****************************************
  412.         *
  413.         *           LCD_DrawVLine
  414.         *
  415.         ****************************************
  416. */
  417. #if  (LCD_OPTIMIZE)  
  418.   && (!LCD_MIRROR_X) 
  419.   && (!LCD_MIRROR_Y) 
  420.   && (!LCD_SWAP_XY)
  421. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  422.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  423.     while (y0 <= y1) {
  424.       XORPIXEL(x, y0);
  425.       y0++;
  426.     }
  427.   } else {
  428.     SET_RECT(x, y0, x, y1);
  429.     while (y0++ <= y1) {
  430.       WRITEDATA_DIRECT(COLOR);
  431.     }
  432.   }
  433. }
  434. #else
  435. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  436.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  437.     while (y0 <= y1) {
  438.       XORPIXEL(x, y0);
  439.       y0++;
  440.     }
  441.   } else {
  442.     while (y0 <= y1) {
  443.       SETPIXEL(x, y0, COLOR);
  444.       y0++;
  445.     }
  446.   }
  447. }
  448. #endif
  449. /*
  450.         *****************************************
  451.         *
  452.         *           LCD_L0_FillRect
  453.         *
  454.         *****************************************
  455. */
  456. #if  (LCD_OPTIMIZE)  
  457.   && (!LCD_MIRROR_X) 
  458.   && (!LCD_MIRROR_Y) 
  459.   && (!LCD_SWAP_XY)
  460. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  461.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  462.     for (; y0 <= y1; y0++) {
  463.       LCD_L0_DrawHLine(x0, y0, x1);
  464.     }
  465.   } else {
  466.     int Bytes = (y1 - y0 + 1) * (x1 - x0 + 1);
  467.     SET_RECT(x0, y0, x1, y1);
  468.     while (Bytes--) {
  469.       WRITEDATA_DIRECT(COLOR);
  470.     }
  471.   }
  472. }
  473. #else
  474. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  475.   for (; y0 <= y1; y0++) {
  476.     LCD_L0_DrawHLine(x0, y0, x1);
  477.   }
  478. }
  479. #endif
  480. /*
  481.         *****************************************
  482.         *
  483.         *           Draw Bitmap 1 BPP
  484.         *           optimized
  485.         *
  486.         *****************************************
  487. */
  488. #if  (LCD_OPTIMIZE)  
  489.   && (!LCD_MIRROR_X) 
  490.   && (!LCD_MIRROR_Y) 
  491.   && (!LCD_SWAP_XY)
  492. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  493.   LCD_PIXELINDEX pixels;
  494.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  495.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  496. /*
  497. // Jump to right entry point
  498. */
  499.   pixels = *p;
  500.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  501.   case 0:
  502.     switch (Diff&7) {
  503.     case 0:   
  504.       goto WriteBit0;
  505.     case 1:   
  506.       goto WriteBit1;
  507.     case 2:
  508.       goto WriteBit2;
  509.     case 3:
  510.       goto WriteBit3;
  511.     case 4:
  512.       goto WriteBit4;
  513.     case 5:   
  514.       goto WriteBit5;
  515.     case 6:   
  516.       goto WriteBit6;
  517.     case 7:   
  518.       goto WriteBit7;
  519.     }
  520.     break;
  521.   case LCD_DRAWMODE_TRANS:
  522.     switch (Diff&7) {
  523.     case 0:
  524.       goto WriteTBit0;
  525.     case 1:
  526.       goto WriteTBit1;
  527.     case 2:
  528.       goto WriteTBit2;
  529.     case 3:
  530.       goto WriteTBit3;
  531.     case 4:
  532.       goto WriteTBit4;
  533.     case 5:   
  534.       goto WriteTBit5;
  535.     case 6:   
  536.       goto WriteTBit6;
  537.     case 7:   
  538.       goto WriteTBit7;
  539.     }
  540.     break;
  541.   case LCD_DRAWMODE_XOR:
  542.     switch (Diff&7) {
  543.     case 0:   
  544.       goto WriteXBit0;
  545.     case 1:   
  546.       goto WriteXBit1;
  547.     case 2:
  548.       goto WriteXBit2;
  549.     case 3:
  550.       goto WriteXBit3;
  551.     case 4:
  552.       goto WriteXBit4;
  553.     case 5:   
  554.       goto WriteXBit5;
  555.     case 6:   
  556.       goto WriteXBit6;
  557.     case 7:   
  558.       goto WriteXBit7;
  559.     }
  560.   }
  561. /*
  562.         Write with transparency
  563. */
  564.   WriteTBit0:
  565.     if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
  566.     if (!--xsize)
  567.       return;
  568.   WriteTBit1:
  569.     if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
  570.     if (!--xsize)
  571.       return;
  572.   WriteTBit2:
  573.     if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
  574.     if (!--xsize)
  575.       return;
  576.   WriteTBit3:
  577.     if (pixels&(1<<4)) SETPIXEL(x+3, y, Index1);
  578.     if (!--xsize)
  579.       return;
  580.   WriteTBit4:
  581.     if (pixels&(1<<3)) SETPIXEL(x+4, y, Index1);
  582.     if (!--xsize)
  583.       return;
  584.   WriteTBit5:
  585.     if (pixels&(1<<2)) SETPIXEL(x+5, y, Index1);
  586.     if (!--xsize)
  587.       return;
  588.   WriteTBit6:
  589.     if (pixels&(1<<1)) SETPIXEL(x+6, y, Index1);
  590.     if (!--xsize)
  591.       return;
  592.   WriteTBit7:
  593.     if (pixels&(1<<0)) SETPIXEL(x+7, y, Index1);
  594.     if (!--xsize)
  595.       return;
  596.     x+=8;
  597.     pixels = *(++p);
  598.     goto WriteTBit0;
  599. /*
  600.         Write without transparency
  601. */
  602.   WriteBit0:
  603.     WRITEDATA_DIRECT((pixels&(1<<7)) ? Index1 : Index0);
  604.     if (!--xsize)
  605.       return;
  606.   WriteBit1:
  607.     WRITEDATA_DIRECT((pixels&(1<<6)) ? Index1 : Index0);
  608.     if (!--xsize)
  609.       return;
  610.   WriteBit2:
  611.     WRITEDATA_DIRECT((pixels&(1<<5)) ? Index1 : Index0);
  612.     if (!--xsize)
  613.       return;
  614.   WriteBit3:
  615.     WRITEDATA_DIRECT((pixels&(1<<4)) ? Index1 : Index0);
  616.     if (!--xsize)
  617.       return;
  618.   WriteBit4:
  619.     WRITEDATA_DIRECT((pixels&(1<<3)) ? Index1 : Index0);
  620.     if (!--xsize)
  621.       return;
  622.   WriteBit5:
  623.     WRITEDATA_DIRECT((pixels&(1<<2)) ? Index1 : Index0);
  624.     if (!--xsize)
  625.       return;
  626.   WriteBit6:
  627.     WRITEDATA_DIRECT((pixels&(1<<1)) ? Index1 : Index0);
  628.     if (!--xsize)
  629.       return;
  630.   WriteBit7:
  631.     WRITEDATA_DIRECT((pixels&(1<<0)) ? Index1 : Index0);
  632.     if (!--xsize)
  633.       return;
  634.     x+=8;
  635.     pixels = *(++p);
  636.     goto WriteBit0;
  637. /*
  638.         Write XOR mode
  639. */
  640.   WriteXBit0:
  641.     if (pixels&(1<<7))
  642.       XORPIXEL(x+0, y);
  643.     if (!--xsize)
  644.       return;
  645.   WriteXBit1:
  646.     if (pixels&(1<<6))
  647.       XORPIXEL(x+1, y);
  648.     if (!--xsize)
  649.       return;
  650.   WriteXBit2:
  651.     if (pixels&(1<<5))
  652.       XORPIXEL(x+2, y);
  653.     if (!--xsize)
  654.       return;
  655.   WriteXBit3:
  656.     if (pixels&(1<<4))
  657.       XORPIXEL(x+3, y);
  658.     if (!--xsize)
  659.       return;
  660.   WriteXBit4:
  661.     if (pixels&(1<<3))
  662.       XORPIXEL(x+4, y);
  663.     if (!--xsize)
  664.       return;
  665.   WriteXBit5:
  666.     if (pixels&(1<<2))
  667.       XORPIXEL(x+5, y);
  668.     if (!--xsize)
  669.       return;
  670.   WriteXBit6:
  671.     if (pixels&(1<<1))
  672.       XORPIXEL(x+6, y);
  673.     if (!--xsize)
  674.       return;
  675.   WriteXBit7:
  676.     if (pixels&(1<<0))
  677.       XORPIXEL(x+7, y);
  678.     if (!--xsize)
  679.       return;
  680.     x+=8;
  681.     pixels = *(++p);
  682.     goto WriteXBit0;
  683. }
  684. #else
  685. /*
  686.         *****************************************
  687.         *
  688.         *           Draw Bitmap 1 BPP
  689.         *           no optimizations
  690.         *
  691.         *****************************************
  692. */
  693. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  694.   LCD_PIXELINDEX pixels;
  695.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  696.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  697. /*
  698. // Jump to right entry point
  699. */
  700.   pixels = *p;
  701.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  702.   case 0:
  703.     switch (Diff&7) {
  704.     case 0:   
  705.       goto WriteBit0;
  706.     case 1:   
  707.       goto WriteBit1;
  708.     case 2:
  709.       goto WriteBit2;
  710.     case 3:
  711.       goto WriteBit3;
  712.     case 4:
  713.       goto WriteBit4;
  714.     case 5:   
  715.       goto WriteBit5;
  716.     case 6:   
  717.       goto WriteBit6;
  718.     case 7:   
  719.       goto WriteBit7;
  720.     }
  721.     break;
  722.   case LCD_DRAWMODE_TRANS:
  723.     switch (Diff&7) {
  724.     case 0:
  725.       goto WriteTBit0;
  726.     case 1:
  727.       goto WriteTBit1;
  728.     case 2:
  729.       goto WriteTBit2;
  730.     case 3:
  731.       goto WriteTBit3;
  732.     case 4:
  733.       goto WriteTBit4;
  734.     case 5:   
  735.       goto WriteTBit5;
  736.     case 6:   
  737.       goto WriteTBit6;
  738.     case 7:   
  739.       goto WriteTBit7;
  740.     }
  741.     break;
  742.   case LCD_DRAWMODE_XOR:
  743.     switch (Diff&7) {
  744.     case 0:   
  745.       goto WriteXBit0;
  746.     case 1:   
  747.       goto WriteXBit1;
  748.     case 2:
  749.       goto WriteXBit2;
  750.     case 3:
  751.       goto WriteXBit3;
  752.     case 4:
  753.       goto WriteXBit4;
  754.     case 5:   
  755.       goto WriteXBit5;
  756.     case 6:   
  757.       goto WriteXBit6;
  758.     case 7:   
  759.       goto WriteXBit7;
  760.     }
  761.   }
  762. /*
  763.         Write with transparency
  764. */
  765.   WriteTBit0:
  766.     if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
  767.     if (!--xsize)
  768.       return;
  769.   WriteTBit1:
  770.     if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
  771.     if (!--xsize)
  772.       return;
  773.   WriteTBit2:
  774.     if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
  775.     if (!--xsize)
  776.       return;
  777.   WriteTBit3:
  778.     if (pixels&(1<<4)) SETPIXEL(x+3, y, Index1);
  779.     if (!--xsize)
  780.       return;
  781.   WriteTBit4:
  782.     if (pixels&(1<<3)) SETPIXEL(x+4, y, Index1);
  783.     if (!--xsize)
  784.       return;
  785.   WriteTBit5:
  786.     if (pixels&(1<<2)) SETPIXEL(x+5, y, Index1);
  787.     if (!--xsize)
  788.       return;
  789.   WriteTBit6:
  790.     if (pixels&(1<<1)) SETPIXEL(x+6, y, Index1);
  791.     if (!--xsize)
  792.       return;
  793.   WriteTBit7:
  794.     if (pixels&(1<<0)) SETPIXEL(x+7, y, Index1);
  795.     if (!--xsize)
  796.       return;
  797.     x+=8;
  798.     pixels = *(++p);
  799.     goto WriteTBit0;
  800. /*
  801.         Write without transparency
  802. */
  803.   WriteBit0:
  804.     SETPIXEL(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
  805.     if (!--xsize)
  806.       return;
  807.   WriteBit1:
  808.     SETPIXEL(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
  809.     if (!--xsize)
  810.       return;
  811.   WriteBit2:
  812.     SETPIXEL(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
  813.     if (!--xsize)
  814.       return;
  815.   WriteBit3:
  816.     SETPIXEL(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
  817.     if (!--xsize)
  818.       return;
  819.   WriteBit4:
  820.     SETPIXEL(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
  821.     if (!--xsize)
  822.       return;
  823.   WriteBit5:
  824.     SETPIXEL(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
  825.     if (!--xsize)
  826.       return;
  827.   WriteBit6:
  828.     SETPIXEL(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
  829.     if (!--xsize)
  830.       return;
  831.   WriteBit7:
  832.     SETPIXEL(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
  833.     if (!--xsize)
  834.       return;
  835.     x+=8;
  836.     pixels = *(++p);
  837.     goto WriteBit0;
  838. /*
  839.         Write XOR mode
  840. */
  841.   WriteXBit0:
  842.     if (pixels&(1<<7))
  843.       XORPIXEL(x+0, y);
  844.     if (!--xsize)
  845.       return;
  846.   WriteXBit1:
  847.     if (pixels&(1<<6))
  848.       XORPIXEL(x+1, y);
  849.     if (!--xsize)
  850.       return;
  851.   WriteXBit2:
  852.     if (pixels&(1<<5))
  853.       XORPIXEL(x+2, y);
  854.     if (!--xsize)
  855.       return;
  856.   WriteXBit3:
  857.     if (pixels&(1<<4))
  858.       XORPIXEL(x+3, y);
  859.     if (!--xsize)
  860.       return;
  861.   WriteXBit4:
  862.     if (pixels&(1<<3))
  863.       XORPIXEL(x+4, y);
  864.     if (!--xsize)
  865.       return;
  866.   WriteXBit5:
  867.     if (pixels&(1<<2))
  868.       XORPIXEL(x+5, y);
  869.     if (!--xsize)
  870.       return;
  871.   WriteXBit6:
  872.     if (pixels&(1<<1))
  873.       XORPIXEL(x+6, y);
  874.     if (!--xsize)
  875.       return;
  876.   WriteXBit7:
  877.     if (pixels&(1<<0))
  878.       XORPIXEL(x+7, y);
  879.     if (!--xsize)
  880.       return;
  881.     x+=8;
  882.     pixels = *(++p);
  883.     goto WriteXBit0;
  884. }
  885. #endif
  886. /*
  887.         *****************************************
  888.         *
  889.         *           Draw Bitmap 2 BPP
  890.         *           optimized
  891.         *
  892.         *****************************************
  893. */
  894. #if (LCD_MAX_LOG_COLORS > 2)
  895. #if  (LCD_OPTIMIZE)  
  896.   && (!LCD_MIRROR_X) 
  897.   && (!LCD_MIRROR_Y) 
  898.   && (!LCD_SWAP_XY)
  899. static void  DrawBitLine2BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  900.   LCD_PIXELINDEX pixels;
  901. /*
  902. // Jump to right entry point
  903. */
  904.   pixels = *p;
  905.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) switch (Diff&3) {
  906.   case 0:
  907.     goto WriteTBit0;
  908.   case 1:
  909.     goto WriteTBit1;
  910.   case 2:
  911.     goto WriteTBit2;
  912.   default:
  913.     goto WriteTBit3;
  914.   } else switch (Diff&3) {
  915.   case 0:
  916.     goto WriteBit0;
  917.   case 1:
  918.     goto WriteBit1;
  919.   case 2:
  920.     goto WriteBit2;
  921.   default:
  922.     goto WriteBit3;
  923.   }
  924. /*
  925.         Write without transparency
  926. */
  927. WriteBit0:
  928.   WRITEDATA_DIRECT(*(pTrans+(pixels>>6)));
  929.   if (!--xsize)
  930.     return;
  931. WriteBit1:
  932.   WRITEDATA_DIRECT(*(pTrans+(3&(pixels>>4))));
  933.   if (!--xsize)
  934.     return;
  935. WriteBit2:
  936.   WRITEDATA_DIRECT(*(pTrans+(3&(pixels>>2))));
  937.   if (!--xsize)
  938.     return;
  939. WriteBit3:
  940.   WRITEDATA_DIRECT(*(pTrans+(3&(pixels))));
  941.   if (!--xsize)
  942.     return;
  943.   pixels = *(++p);
  944.   x+=4;
  945.   goto WriteBit0;
  946. /*
  947.         Write with transparency
  948. */
  949. WriteTBit0:
  950.   if (pixels&(3<<6))
  951.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  952.   if (!--xsize)
  953.     return;
  954. WriteTBit1:
  955.   if (pixels&(3<<4))
  956.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  957.   if (!--xsize)
  958.     return;
  959. WriteTBit2:
  960.   if (pixels&(3<<2))
  961.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  962.   if (!--xsize)
  963.     return;
  964. WriteTBit3:
  965.   if (pixels&(3<<0))
  966.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  967.   if (!--xsize)
  968.     return;
  969.   pixels = *(++p);
  970.   x+=4;
  971.   goto WriteTBit0;
  972. }
  973. #else
  974. /*
  975.         *****************************************
  976.         *
  977.         *           Draw Bitmap 2 BPP
  978.         *           no optimizations
  979.         *
  980.         *****************************************
  981. */
  982. static void  DrawBitLine2BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  983.   LCD_PIXELINDEX pixels;
  984. /*
  985. // Jump to right entry point
  986. */
  987.   pixels = *p;
  988.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) switch (Diff&3) {
  989.   case 0:
  990.     goto WriteTBit0;
  991.   case 1:
  992.     goto WriteTBit1;
  993.   case 2:
  994.     goto WriteTBit2;
  995.   default:
  996.     goto WriteTBit3;
  997.   } else switch (Diff&3) {
  998.   case 0:
  999.     goto WriteBit0;
  1000.   case 1:
  1001.     goto WriteBit1;
  1002.   case 2:
  1003.     goto WriteBit2;
  1004.   default:
  1005.     goto WriteBit3;
  1006.   }
  1007. /*
  1008.         Write without transparency
  1009. */
  1010. WriteBit0:
  1011.   SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1012.   if (!--xsize)
  1013.     return;
  1014. WriteBit1:
  1015.   SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1016.   if (!--xsize)
  1017.     return;
  1018. WriteBit2:
  1019.   SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1020.   if (!--xsize)
  1021.     return;
  1022. WriteBit3:
  1023.   SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1024.   if (!--xsize)
  1025.     return;
  1026.   pixels = *(++p);
  1027.   x+=4;
  1028.   goto WriteBit0;
  1029. /*
  1030.         Write with transparency
  1031. */
  1032. WriteTBit0:
  1033.   if (pixels&(3<<6))
  1034.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1035.   if (!--xsize)
  1036.     return;
  1037. WriteTBit1:
  1038.   if (pixels&(3<<4))
  1039.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1040.   if (!--xsize)
  1041.     return;
  1042. WriteTBit2:
  1043.   if (pixels&(3<<2))
  1044.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1045.   if (!--xsize)
  1046.     return;
  1047. WriteTBit3:
  1048.   if (pixels&(3<<0))
  1049.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1050.   if (!--xsize)
  1051.     return;
  1052.   pixels = *(++p);
  1053.   x+=4;
  1054.   goto WriteTBit0;
  1055. }
  1056. #endif
  1057. #endif
  1058. /*
  1059.         *****************************************
  1060.         *
  1061.         *           Draw Bitmap 4 BPP
  1062.         *           optimized
  1063.         *
  1064.         *****************************************
  1065. */
  1066. #if (LCD_MAX_LOG_COLORS > 4)
  1067. #if  (LCD_OPTIMIZE)  
  1068.   && (!LCD_MIRROR_X) 
  1069.   && (!LCD_MIRROR_Y) 
  1070.   && (!LCD_SWAP_XY)
  1071. static void  DrawBitLine4BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1072.   LCD_PIXELINDEX pixels;
  1073. /*
  1074. // Jump to right entry point
  1075. */
  1076.   pixels = *p;
  1077.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  1078.     if ((Diff&1) ==0)
  1079.       goto WriteTBit0;
  1080.     goto WriteTBit1;
  1081.   } else {
  1082.     if ((Diff&1) ==0)
  1083.       goto WriteBit0;
  1084.     goto WriteBit1;
  1085.   }
  1086. /*
  1087.         Write without transparency
  1088. */
  1089. WriteBit0:
  1090.   WRITEDATA_DIRECT(*(pTrans+(pixels>>4)));
  1091.   if (!--xsize)
  1092.     return;
  1093. WriteBit1:
  1094.   WRITEDATA_DIRECT(*(pTrans+(pixels&0xf)));
  1095.   if (!--xsize)
  1096.     return;
  1097.   x+=2;
  1098.   pixels = *(++p);
  1099.   goto WriteBit0;
  1100. /*
  1101.         Write with transparency
  1102. */
  1103. WriteTBit0:
  1104.   if (pixels>>4)
  1105.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1106.   if (!--xsize)
  1107.     return;
  1108. WriteTBit1:
  1109.   if (pixels&0xf)
  1110.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1111.   if (!--xsize)
  1112.     return;
  1113.   x+=2;
  1114.   pixels = *(++p);
  1115.   goto WriteTBit0;
  1116. }
  1117. #else
  1118. /*
  1119.         *****************************************
  1120.         *
  1121.         *           Draw Bitmap 4 BPP
  1122.         *           no optimizations
  1123.         *
  1124.         *****************************************
  1125. */
  1126. static void  DrawBitLine4BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1127.   LCD_PIXELINDEX pixels;
  1128. /*
  1129. // Jump to right entry point
  1130. */
  1131.   pixels = *p;
  1132.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  1133.     if ((Diff&1) ==0)
  1134.       goto WriteTBit0;
  1135.     goto WriteTBit1;
  1136.   } else {
  1137.     if ((Diff&1) ==0)
  1138.       goto WriteBit0;
  1139.     goto WriteBit1;
  1140.   }
  1141. /*
  1142.         Write without transparency
  1143. */
  1144. WriteBit0:
  1145.   SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1146.   if (!--xsize)
  1147.     return;
  1148. WriteBit1:
  1149.   SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1150.   if (!--xsize)
  1151.     return;
  1152.   x+=2;
  1153.   pixels = *(++p);
  1154.   goto WriteBit0;
  1155. /*
  1156.         Write with transparency
  1157. */
  1158. WriteTBit0:
  1159.   if (pixels>>4)
  1160.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1161.   if (!--xsize)
  1162.     return;
  1163. WriteTBit1:
  1164.   if (pixels&0xf)
  1165.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1166.   if (!--xsize)
  1167.     return;
  1168.   x+=2;
  1169.   pixels = *(++p);
  1170.   goto WriteTBit0;
  1171. }
  1172. #endif
  1173. #endif
  1174. /*
  1175.         *****************************************
  1176.         *
  1177.         *           Draw Bitmap 8 BPP
  1178.         *           optimized
  1179.         *
  1180.         *****************************************
  1181. */
  1182. #if (LCD_MAX_LOG_COLORS > 16)
  1183. #if  (LCD_OPTIMIZE)  
  1184.   && (!LCD_MIRROR_X) 
  1185.   && (!LCD_MIRROR_Y) 
  1186.   && (!LCD_SWAP_XY)
  1187. static void  DrawBitLine8BPP(int x, int y, U8 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  1188.   LCD_PIXELINDEX pixel;
  1189.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  1190.     if (pTrans) {
  1191.       for (;xsize > 0; xsize--,x++,p++) {
  1192.         pixel = *p;
  1193.         WRITEDATA_DIRECT(*(pTrans+pixel));
  1194.       }
  1195.     } else {
  1196.       for (;xsize > 0; xsize--,x++,p++) {
  1197.         WRITEDATA_DIRECT(*p);
  1198.       }
  1199.     }
  1200.   } else {   /* Handle transparent bitmap */
  1201.     if (pTrans) {
  1202.       for (; xsize > 0; xsize--, x++, p++) {
  1203.         pixel = *p;
  1204.         if (pixel) {
  1205.           SETPIXEL(x+0, y, *(pTrans+pixel));
  1206.         }
  1207.       }
  1208.     } else {
  1209.       for (; xsize > 0; xsize--, x++, p++) {
  1210.         pixel = *p;
  1211.         if (pixel) {
  1212.           SETPIXEL(x+0, y, pixel);
  1213.         }
  1214.       }
  1215.     }
  1216.   }
  1217. }
  1218. #else
  1219. /*
  1220.         *****************************************
  1221.         *
  1222.         *           Draw Bitmap 8 BPP
  1223.         *           no optimizations
  1224.         *
  1225.         *****************************************
  1226. */
  1227. static void  DrawBitLine8BPP(int x, int y, U8 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  1228.   LCD_PIXELINDEX pixel;
  1229.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  1230.     if (pTrans) {
  1231.       for (;xsize > 0; xsize--,x++,p++) {
  1232.         pixel = *p;
  1233.         SETPIXEL(x, y, *(pTrans+pixel));
  1234.       }
  1235.     } else {
  1236.       for (;xsize > 0; xsize--,x++,p++) {
  1237.         SETPIXEL(x, y, *p);
  1238.       }
  1239.     }
  1240.   } else {   /* Handle transparent bitmap */
  1241.     if (pTrans) {
  1242.       for (; xsize > 0; xsize--, x++, p++) {
  1243.         pixel = *p;
  1244.         if (pixel) {
  1245.           SETPIXEL(x+0, y, *(pTrans+pixel));
  1246.         }
  1247.       }
  1248.     } else {
  1249.       for (; xsize > 0; xsize--, x++, p++) {
  1250.         pixel = *p;
  1251.         if (pixel) {
  1252.           SETPIXEL(x+0, y, pixel);
  1253.         }
  1254.       }
  1255.     }
  1256.   }
  1257. }
  1258. #endif
  1259. #endif
  1260. /*
  1261.         *********************************************************
  1262.         *
  1263.         *           Universal draw Bitmap routine
  1264.         *
  1265.         *********************************************************
  1266. */
  1267. void LCD_L0_DrawBitmap   (int x0, int y0,
  1268.                        int xsize, int ysize,
  1269.                        int BitsPerPixel, 
  1270.                        int BytesPerLine,
  1271.                        const U8* pData, int Diff,
  1272.                        const LCD_PIXELINDEX* pTrans)
  1273. {
  1274.   int i;
  1275.   #if  (LCD_OPTIMIZE)  
  1276.     && (!LCD_MIRROR_X) 
  1277.     && (!LCD_MIRROR_Y) 
  1278.     && (!LCD_SWAP_XY)
  1279.     SET_RECT(x0 + Diff, y0, x0 + Diff + xsize - 1, y0 + ysize - 1);
  1280.   #endif
  1281.   /*
  1282.      Use DrawBitLineXBPP
  1283.   */
  1284.   for (i=0; i<ysize; i++) {
  1285.     switch (BitsPerPixel) {
  1286.     case 1:
  1287.       DrawBitLine1BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  1288.       break;
  1289.     #if (LCD_MAX_LOG_COLORS > 2)
  1290.       case 2:
  1291.         DrawBitLine2BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  1292.         break;
  1293.     #endif
  1294.     #if (LCD_MAX_LOG_COLORS > 4)
  1295.       case 4:
  1296.         DrawBitLine4BPP(x0, i + y0, pData, Diff, xsize, pTrans);
  1297.         break;
  1298.     #endif
  1299.     #if (LCD_MAX_LOG_COLORS > 16)
  1300.       case 8:
  1301.         DrawBitLine8BPP(x0, i + y0, pData, xsize, pTrans);
  1302.         break;
  1303.     #endif
  1304.     }
  1305.     pData += BytesPerLine;
  1306.   }
  1307. }
  1308. /********************************************************
  1309. *
  1310. *       LCD_L0_SetOrg
  1311. *
  1312. *********************************************************
  1313. Purpose:        Sets the original position of the virtual display.
  1314.                 Has no function at this point with the PC-driver.
  1315. */
  1316. int OrgX, OrgY;
  1317. void LCD_L0_SetOrg(int x, int y) {
  1318.   OrgX = x;
  1319.   OrgY = y;
  1320. }
  1321. /*
  1322.         *****************************************
  1323.         *
  1324.         *           LCD_On, LCD_Off
  1325.         *
  1326.         *****************************************
  1327. Sets the original position of the virtual display.
  1328. Has no function at this point with the PC-driver.
  1329. */
  1330. void LCD_Off          (void) {
  1331. #ifdef LCD_OFF
  1332.   LCD_OFF();
  1333. #endif
  1334. }
  1335. void LCD_On           (void) {
  1336. #ifdef LCD_ON
  1337.   LCD_ON();
  1338. #endif
  1339. }
  1340. /*
  1341.         *****************************************
  1342.         *
  1343.         *           LCD_L0_Init
  1344.         *
  1345.         *****************************************
  1346. */
  1347. int  LCD_L0_Init(void) {
  1348.   int i;
  1349.   GUI_DEBUG_LOG("nLCD_Init()");
  1350.   LCD_INIT_CONTROLLER();
  1351.   /* set cursor to illegal value */
  1352.   CurrentX = CurrentY = 0xfff;
  1353.   /* clear LCD */
  1354.   GOTOXY(0, 0, RAM_WRITE);
  1355.   for (i = 0; i < LCD_XSIZE_PHYS * LCD_YSIZE_PHYS; i++) {
  1356.     LCD_WRITEDATA0(0);
  1357.   }
  1358.   GOTOXY(0, 0, RAM_WRITE);
  1359.   /* clear VRam */
  1360.   #if LCD_CACHE
  1361.     memset(VRam, 0, sizeof(VRam));
  1362.   #endif
  1363.   LCD_Off();
  1364.   return 0;
  1365. }
  1366. /*
  1367.         *****************************************
  1368.         *
  1369.         *           LCD_L0_SetLUTEntry
  1370.         *
  1371.         *****************************************
  1372. This function is only a dummy
  1373. */
  1374. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
  1375.   Pos = Pos;
  1376.   Color = Color;
  1377. }
  1378. #else
  1379. void LCD159A(void) { } /* avoid empty object files */
  1380. #endif  /* (LCD_CONTROLLER == 0x159A) */