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

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        : LCDSLin.C
  16. Purpose     : Driver for LCDs using simple bus interface
  17. Currently supported controllers:
  18.               Toshiba T6963
  19.               Epson SED1330
  20.               Epson SED1335
  21. ----------------------------------------------------------------------
  22. Version-Date---Author-Explanation
  23. ----------------------------------------------------------------------
  24. 2.00g   020319 JE     a) Macro changed to fix NC30-error
  25. 2.00f   020204 JE     a) Hardwareinterface routines renamed:
  26.                          ...DATA -> ...A0, ...CMD -> ...A1
  27. 2.00e   011112 JE     a) LCD_INIT_CONTROLLER added to be able to
  28.                          execute LCD_X_Init during init
  29. 2.00d   010926 JE     a) Support for LCD_SWAP_XY added
  30. 2.00c   010706 JE     a) Bugfix in DrawBitLine1BPP
  31. 2.00b   010402 RS     a) LCD_GetDevCaps removed from driver
  32.                          (now LCD.c)
  33. 2.00a   008026 RS     a) Simulation interface changed
  34. 2.00    000525 JE     a) Interface changed
  35. 1.02c   000509 JE     a) Simple bus interface changed for SED133x
  36.                       b) Small changes in DrawBitLine1BPP
  37.                       c) Cache initialisation to SED133x added
  38. 1.02b   000508 JE     a) Simple bus interface changed for T6963
  39. 1.02a   000426 JE     a) Transparent mode in DrawBitLine1BPP changed
  40.                       b) Dummy LCD_L0_SetLUTEntry inserted
  41. 1.02    000426 RS     a) Changes for new LCD-driver interface V1.30
  42. 1.00a   000410 JE     a) LCD_GetDevCap changed
  43.                       b) LCD_GetpCapFunc deleted
  44.                       c) LCD_DrawBitMap changed
  45.                       d) Definition for aColorIndex changed
  46. 1.00    000407 JE     First release
  47. ---------------------------LIST OF CONFIG SWITCHES--------------------
  48. The following is a list of additional configuration switches for this
  49. driver. These switches might not be listed in the manual, because
  50. the manual mainly covers the general config switches which are
  51. supported by all drivers.
  52. ----------------------------------------------------------------------
  53. define ----------------------Explanation------------------------------
  54. LCD_OPTIMIZE                 Controls the use of optimized routines.
  55. ----------------------------------------------------------------------
  56. Known problems or limitations with current version
  57. ----------------------------------------------------------------------
  58. none
  59. ---------------------------END-OF-HEADER------------------------------
  60. */
  61. #include <string.h>             /* for memset */
  62. #include <stddef.h>           /* needed for definition of NULL */
  63. #include "LCD_Private.h"      /* private modul definitions & config */
  64. #include "GUI_Private.h"
  65. #include "GUIDebug.h"
  66. #include "LCD_0.h"            /* Defines for first display */
  67. #if (LCD_CONTROLLER == 6963) || (LCD_CONTROLLER == 1330) || (LCD_CONTROLLER == 1335) 
  68.       && (!defined(WIN32) | defined(LCD_SIMCONTROLLER))
  69. /*
  70.   ********************************************************************
  71.   *                                                                  *
  72.   *                Conversion table
  73.   *                                                                  *
  74.   ********************************************************************
  75. */
  76. static const LCD_PIXELINDEX LCD_ConversionTable[2] = {0, 1};
  77. /*
  78.         *********************************************************
  79.         *                                                       *
  80.         *           Defaults for configuration                  *
  81.         *                                                       *
  82.         *********************************************************
  83. */
  84. #ifndef LCD_OPTIMIZE
  85.   #define LCD_OPTIMIZE                  (1)
  86. #endif
  87. #ifndef LCD_CHECKBUSY
  88.   #define LCD_CHECKBUSY                 (1)
  89. #endif
  90. #ifndef LCD_INIT
  91.   #define LCD_INIT()
  92. #endif
  93. #ifndef LCD_WATCHDOG_TRIGGERCNT
  94.   #define LCD_WATCHDOG_TRIGGERCNT       (0)
  95. #endif
  96. #ifndef LCD_KICK_WATCHDOG
  97.   #define LCD_KICK_WATCHDOG()
  98. #endif
  99. #ifndef LCD_CACHE
  100.   #define  LCD_CACHE                    (1)
  101. #endif
  102. #ifndef LCD_SUPPORT_REFRESH
  103.   #define  LCD_SUPPORT_REFRESH LCD_CACHE
  104. #endif
  105. #ifndef LCD_REVERSEMODE_SUPPORT
  106.   #define LCD_REVERSEMODE_SUPPORT       (0)
  107. #endif
  108. #ifndef LCD_SUPPORT_VERIFY
  109.   #define LCD_SUPPORT_VERIFY            (0)
  110. #endif
  111. /* Switch for support of multiple pages.
  112.  Only available with certain LCD-controllers */
  113. #ifndef LCD_SUPPORT_PAGING
  114.   #define LCD_SUPPORT_PAGING            (0)
  115. #endif
  116. #ifndef LCD_SCHEDULE_CNT
  117.   #define LCD_SCHEDULE_CNT              (0)
  118. #endif
  119. #ifndef LCD_NUM_CONTROLLERS
  120.   #define LCD_NUM_CONTROLLERS           (1)
  121. #endif
  122. #ifndef LCD_SUPPORT_CHECKINIT
  123.   #define LCD_SUPPORT_CHECKINIT         (0)
  124. #endif
  125. /* Switch support for the LCD_CopyRect function of the driver */
  126. #ifndef  LCD_SUPPORT_COPYRECT
  127.   #define  LCD_SUPPORT_COPYRECT         (1)
  128. #endif
  129. #ifndef LCD_INIT_CONTROLLER
  130.   #define LCD_INIT_CONTROLLER()
  131. #endif
  132. /*
  133.         *********************************************************
  134.         *                                                       *
  135.         *          Internal types                               *
  136.         *                                                       *
  137.         *********************************************************
  138. */
  139. #if LCD_BITSPERPIXEL == 1
  140.   #define PIXELCOLOR U8
  141. #else
  142.   #error LCD_BITSPERPIXEL != 1 not supported
  143. #endif
  144. /*
  145.         *********************************************************
  146.         *                                                       *
  147.         *      Configuration switch checking                    *
  148.         *                                                       *
  149.         *********************************************************
  150. Please be aware that not all configuration errors can be captured !
  151. */
  152. /* Check number of controllers */
  153. #if (LCD_NUM_CONTROLLERS != 1)
  154.   #error "Only 1 controller supported by this driver"
  155. #endif
  156. /*
  157.         *********************************************************
  158.         *
  159.         *           Defines for simulation
  160.         *
  161.         *********************************************************
  162. */
  163. #ifdef WIN32
  164.   #undef LCD_WRITE_A0
  165.   #undef LCD_WRITE_A1
  166.   #undef LCD_READ_A0
  167.   #undef LCD_READ_A1
  168.   void SIM_WriteA1C0(U8 Data);
  169.   void SIM_WriteA0C0(U8 cmd);
  170.   U8   SIM_ReadA1C0(void);
  171.   U8   SIM_ReadA0C0(void);
  172.   #define LCD_WRITE_A1(Data) SIM_WriteA1C0(Data) 
  173.   #define LCD_WRITE_A0(cmd)  SIM_WriteA0C0(cmd)
  174.   #define LCD_READ_A1()      SIM_ReadA1C0()
  175.   #define LCD_READ_A0()      SIM_ReadA0C0()
  176. #endif
  177. /*
  178.         *********************************************************
  179.         *                                                       *
  180.         * Standard variables for driver                         *
  181.         *                                                       *
  182.         *********************************************************
  183. */
  184. static U8 Cache[((LCD_XSIZE_PHYS+7)>>3)*LCD_YSIZE_PHYS];
  185. #if LCD_WATCHDOG_TRIGGERCNT
  186.   int WatchdogTriggerCnt;
  187. #endif
  188. #if LCD_SUPPORT_VERIFY
  189.   static int ErrCnt;
  190.   static int ErrStat;
  191. #endif
  192. /*
  193.         *********************************************************
  194.         *                                                       *
  195.         *          Support for Segment/COMLUTs                  *
  196.         *                                                       *
  197.         *********************************************************
  198. */
  199. /* For compatibility with older configs, define defaults */
  200. #ifndef LCD_SUPPORT_COMTRANS
  201.   #define LCD_SUPPORT_COMTRANS 0
  202. #endif
  203. #ifndef LCD_SUPPORT_SEGTRANS
  204.   #define LCD_SUPPORT_SEGTRANS 0
  205. #endif
  206. #if LCD_SUPPORT_COMTRANS
  207.   extern LCD_TYPE_COMTRANS LCD__aLine2Com0[LCD_LASTCOM0-LCD_FIRSTCOM0+1];
  208. #endif
  209. #if LCD_SUPPORT_SEGTRANS
  210.   extern LCD_TYPE_SEGTRANS LCD__aRow2Seg0[LCD_LASTSEG0-LCD_FIRSTSEG0+1];
  211. #endif
  212. /*
  213.         *********************************************************
  214.         *                                                       *
  215.         *       Macros for internal use                         *
  216.         *                                                       *
  217.         *********************************************************
  218. */
  219. #if (LCD_SUPPORT_COMTRANS)
  220.   #if (LCD_MIRROR_Y)
  221.     #error LCD_MIRROR_Y not supported with COMTrans !
  222.   #endif
  223.   #if (LCD_MIRROR_X)
  224.     #error LCD_MIRROR_X not supported with COMTrans !
  225.   #endif
  226. #endif
  227. #if (!LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  228.   #if   (!LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  229.     #define SETPIXEL(x, y, c)  _SetPixel(x, y, c)
  230.     #define GETPIXEL(x, y)     _GetPixel(x,y)
  231.     #define XORPIXEL(x, y)     XorPixel(x,y)
  232.   #elif (!LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  233.     #define SETPIXEL(x, y, c)  _SetPixel(y, x, c)
  234.     #define GETPIXEL(x, y)     _GetPixel(y, x)
  235.     #define XORPIXEL(x, y)      XorPixel(y, x)
  236.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  237.     #define SETPIXEL(x, y, c)  _SetPixel(x, LCD_YSIZE-1-(y), c)
  238.     #define GETPIXEL(x, y)     _GetPixel(x, LCD_YSIZE-1-(y))
  239.     #define XORPIXEL(x, y)     XorPixel (x, LCD_YSIZE-1-(y))
  240.   #elif (!LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  241.     #define SETPIXEL(x, y, c)  _SetPixel(LCD_YSIZE-1-(y), x, c)
  242.     #define GETPIXEL(x, y)     _GetPixel(LCD_YSIZE-1-(y), x)
  243.     #define XORPIXEL(x, y)      XorPixel(LCD_YSIZE-1-(y), x)
  244.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y && !LCD_SWAP_XY) 
  245.     #define SETPIXEL(x, y, c)  _SetPixel(LCD_XSIZE-1-(x), y, c)
  246.     #define GETPIXEL(x, y)     _GetPixel(LCD_XSIZE-1-(x), y)
  247.     #define XORPIXEL(x, y)     XorPixel (LCD_XSIZE-1-(x), y)
  248.   #elif ( LCD_MIRROR_X && !LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  249.     #define SETPIXEL(x, y, c)  _SetPixel(LCD_YSIZE-1-(y), x, c)
  250.     #define GETPIXEL(x, y)     _GetPixel(LCD_YSIZE-1-(y), x)
  251.     #define XORPIXEL(x, y)      XorPixel(LCD_YSIZE-1-(y), x)
  252.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y && !LCD_SWAP_XY) 
  253.     #define SETPIXEL(x, y, c)  _SetPixel(LCD_XSIZE-1-(x), LCD_YSIZE-1-(y), c)
  254.     #define GETPIXEL(x, y)     _GetPixel(LCD_XSIZE-1-(x), LCD_YSIZE-1-(y))
  255.     #define XORPIXEL(x, y)     XorPixel (LCD_XSIZE-1-(x), LCD_YSIZE-1-(y))
  256.   #elif ( LCD_MIRROR_X &&  LCD_MIRROR_Y &&  LCD_SWAP_XY) 
  257.     #error This combination of mirroring/swapping not yet supported
  258.   #endif
  259. #elif (LCD_SUPPORT_COMTRANS && !LCD_SUPPORT_SEGTRANS)
  260.   #if (!LCD_SWAP_XY)
  261.     #define SETPIXEL(x, y, c)  _SetPixel(x,LCD__aLine2Com0[y], c)
  262.     #define GETPIXEL(x, y)     _GetPixel(x,LCD__aLine2Com0[y])
  263.     #define XORPIXEL(x, y)      XorPixel(x,LCD__aLine2Com0[y])
  264.   #else
  265.     #define SETPIXEL(x, y, c)  _SetPixel(y,LCD__aLine2Com0[x], c)
  266.     #define GETPIXEL(x, y)     _GetPixel(y,LCD__aLine2Com0[x])
  267.     #define XORPIXEL(x, y)      XorPixel(y,LCD__aLine2Com0[x])
  268.   #endif
  269. #elif (!LCD_SUPPORT_COMTRANS && LCD_SUPPORT_SEGTRANS)
  270.   #if (!LCD_SWAP_XY)
  271.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[x],y, c)
  272.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[x],y)
  273.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[x],y)
  274.   #else
  275.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[y],x, c)
  276.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[y],x)
  277.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[y],x)
  278.   #endif
  279. #elif (LCD_SUPPORT_COMTRANS && LCD_SUPPORT_SEGTRANS)
  280.   #if (!LCD_SWAP_XY)
  281.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y], c)
  282.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y])
  283.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[x],LCD__aLine2Com0[y])
  284.   #else
  285.     #define SETPIXEL(x, y, c)  _SetPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x], c)
  286.     #define GETPIXEL(x, y)     _GetPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x])
  287.     #define XORPIXEL(x, y)      XorPixel(LCD__aRow2Seg0[y],LCD__aLine2Com0[x])
  288.   #endif
  289. #else
  290.   #error This combination of switches not yet supported
  291. #endif
  292. #define XY2OFF(x,y) ((x>>3)+y*((LCD_XSIZE_PHYS+7)>>3))
  293. #define BKCOLOR LCD_BKCOLORINDEX
  294. #define   COLOR LCD_COLORINDEX
  295. /*
  296.         *********************************************************
  297.         *                                                       *
  298.         *       ID translation table                            *
  299.         *                                                       *
  300.         *********************************************************
  301. This table contains 0, 1, 2, ... and serves as translation table for DDBs
  302. */
  303. static const U8 TransId[] = { 0,1 };
  304. /*
  305.         *********************************************************
  306.         *                                                       *
  307.         *       LCD Access                                      *
  308.         *                                                       *
  309.         *********************************************************
  310. */
  311. int LCD_Adr;
  312. #if (!LCD_CHECKBUSY)
  313.   #define LCD_WAIT()
  314. #endif
  315. static U8 result; /* Possibly needed for access macro */
  316. /*
  317.         *********************************************************
  318.         *                                                       *
  319.         *       LCD Access Controller SED133x                   *
  320.         *                                                       *
  321.         *********************************************************
  322. */
  323. #if (LCD_CONTROLLER == 1330) 
  324.   ||(LCD_CONTROLLER == 1335)
  325. /* Remap ...A0, ...A1 -> ...CMD, ...DATA */
  326. #define LCD_READCMD0    LCD_READ_A0
  327. #define LCD_READDATA0   LCD_READ_A1
  328. #define LCD_WRITECMD0   LCD_WRITE_A1
  329. #define LCD_WRITEDATA0  LCD_WRITE_A0
  330. #ifndef LCD_EXTENDED_WAIT
  331.   #define LCD_EXTENDED_WAIT 1
  332. #endif
  333. #ifndef LCD_WAIT
  334.   #define LCD_WAIT()                
  335.     while (!(LCD_READCMD0()&0x40)); 
  336.     while (  LCD_READCMD0()&0x40) ;
  337. #endif
  338. #if LCD_EXTENDED_WAIT
  339.   #define LCD_WRITECMD(cmd)      { LCD_WAIT(); LCD_WRITECMD0(cmd);  }
  340.   #define LCD_WRITEDATA(Data)    { LCD_WAIT(); LCD_WRITEDATA0(Data);}
  341. #else
  342.   #define LCD_WRITECMD(cmd)      { LCD_WRITECMD0(cmd);  }
  343.   #define LCD_WRITEDATA(Data)    { LCD_WRITEDATA0(Data);}
  344. #endif
  345. #define GSTART (0x0)
  346. #if (LCD_YSIZE_PHYS >128)
  347.   #define TSTART 30000
  348. #else
  349.   #define TSTART 7000
  350. #endif
  351. static void LCD_SetSystem(void) {
  352.   LCD_WRITECMD (0x40);
  353.   LCD_WRITEDATA(0x30);                 /* P1                                    */
  354.   LCD_WRITEDATA(0x87);                 /* P2 : FX : hor. char size-1            */
  355.   LCD_WRITEDATA(0x7);                  /* P3 : FY : ver. char size-1 (not imp.) */
  356.   LCD_WRITEDATA(((LCD_XSIZE_PHYS+7)>>3)-1); /* P4 : Characters per row               */
  357.   LCD_WRITEDATA(0x4a);                 /* P5 : Timing charcters per row         */
  358.   LCD_WRITEDATA(LCD_YSIZE_PHYS-1);          /* P6 : Number of lines per screen       */
  359.   LCD_WRITEDATA((LCD_XSIZE_PHYS+7)>>3);     /* P7 : Address pitch low                */
  360.   LCD_WRITEDATA(0x00);                 /* P8 : Address pitch high               */
  361. }
  362. static void LCD_SetScroll(int Adr) {
  363.   LCD_WRITECMD(0x44);
  364.   LCD_WRITEDATA(TSTART&255);               /* address of screen 1 (text)            */
  365.   LCD_WRITEDATA(TSTART>>8);
  366.   LCD_WRITEDATA((LCD_YSIZE_PHYS)-1);
  367.   LCD_WRITEDATA(Adr);                  /* address of screen 2 (graphic)         */
  368.   LCD_WRITEDATA(Adr>>8);
  369.   LCD_WRITEDATA((LCD_YSIZE_PHYS)-1);
  370. }
  371. static void LCD_SetAdr(int Off) {
  372.   LCD_Adr=Off;
  373.   #if (!LCD_EXTENDED_WAIT)
  374.     LCD_WAIT();
  375.   #endif
  376.   LCD_WRITECMD (0x46);
  377.   LCD_WRITEDATA(Off&255);
  378.   LCD_WRITEDATA(Off>>8);
  379. }
  380. #define LCD_SETADR(Off) LCD_SetAdr(Off)
  381. static void LCD_Write1(char Byte) {
  382.   #if (!LCD_EXTENDED_WAIT)
  383.     LCD_WAIT();
  384.   #endif
  385.   LCD_WRITECMD (0x42);
  386.   LCD_WRITEDATA(Byte);
  387.   LCD_Adr++;
  388. }
  389. #define LCD_WRITE1(Byte) LCD_Write1(Byte)
  390. /* LCD_L0_ReInit */
  391. void LCD_L0_ReInit(void) {
  392.   int i;
  393.   LCD_INIT_CONTROLLER();
  394.   LCD_SetSystem();
  395.   LCD_SetScroll(GSTART) ;
  396.   LCD_WRITECMD (0x4c);                 /* Set cursor move direction             */
  397.   LCD_WRITECMD (0x5a);                 /* HDOT SCR : Set horiz. scroll position */
  398.   LCD_WRITEDATA(0);
  399.   LCD_WRITECMD (0x5b);                 /* OVLAY                                 */
  400.   LCD_WRITEDATA(1);
  401.   /* Clear display memory */
  402.   LCD_SETADR(0);
  403.   LCD_WRITECMD (0x42);
  404.   #if (LCD_YSIZE_PHYS >128)
  405.     for (i=0; i<32000; i++)
  406.   #else
  407.     for (i=0; i<8000; i++)
  408.   #endif
  409.       LCD_WRITEDATA(0);
  410.   #if (LCD_REVERSE)
  411.     LCD_SETADR(GSTART);
  412.     LCD_WRITECMD (0x42);
  413.     for (i=GSTART; i<GSTART+((LCD_XSIZE_PHYS+7)>>3)*LCD_YSIZE_PHYS; i++)
  414.       LCD_WRITEDATA(0xff);
  415.   #endif
  416.   if(COLOR)
  417.     memset(Cache,0xff,sizeof(Cache));
  418.   else
  419.     memset(Cache,0x0,sizeof(Cache));
  420.   LCD_WRITECMD (0x59);                 /* Display on                            */
  421.   LCD_WRITEDATA(0x14);                 /* All screens on, curosr off            */
  422. }
  423. /* LCD_FirstInit */
  424. static void LCD_FirstInit(void) {
  425.   LCD_L0_ReInit();
  426. }
  427. #endif /* SED133x */
  428. /*
  429.         *********************************************************
  430.         *                                                       *
  431.         *       LCD Access Controller T6963                     *
  432.         *                                                       *
  433.         *********************************************************
  434. */
  435. #if (LCD_CONTROLLER == 6963)
  436. /* Remap ...A0, ...A1 -> ...CMD, ...DATA */
  437. #define LCD_READCMD0    LCD_READ_A1
  438. #define LCD_READDATA0   LCD_READ_A0
  439. #define LCD_WRITECMD0   LCD_WRITE_A1
  440. #define LCD_WRITEDATA0  LCD_WRITE_A0
  441. #ifndef LCD_WAIT
  442.   #define LCD_WAIT() while ((LCD_READ_A1()&3)!=3) /* Do not use LCD_READCMD0 to fix NC30-problem (JE) */
  443. #endif
  444. #define LCD_WRITECMD(cmd)      { LCD_WAIT(); LCD_WRITECMD0(cmd);  }
  445. #define LCD_WRITEDATA(Data)    { LCD_WAIT(); LCD_WRITEDATA0(Data);}
  446. /* Access Macros */
  447. #define LCD_READDATA()        
  448.   LCD_WRITECMD(0xC5);         
  449.   return LCD_DATA0;
  450. #define LCD_SETADR(Adr)       
  451.   LCD_WRITEDATA((U8)Adr);     
  452.   LCD_WRITEDATA((U8)(Adr>>8));
  453.   LCD_WRITECMD(0x24);         
  454.   LCD_Adr=Adr;
  455. #define LCD_WRITE1(Byte)      
  456.   LCD_WRITEDATA(Byte);        
  457.   LCD_WRITECMD(0xC0);         
  458.   LCD_Adr++;
  459. /* LCD_L0_ReInit */
  460. #define LCD_RAMSIZE (0x2000)
  461. #define LCD_GSTART  (0x0)
  462. #define LCD_XSIZEB  ((LCD_XSIZE_PHYS+7)>>3)
  463. #define LCD_TSTART  (LCD_RAMSIZE-(LCD_XSIZEB)-(LCD_YSIZE_PHYS>>3))
  464. void LCD_L0_ReInit(void) {
  465.   LCD_WRITECMD(0x81);           /* SetModeXor */
  466.   LCD_WRITEDATA((U8)LCD_TSTART);/* SetTextAdr */
  467.   LCD_WRITEDATA((U8)(LCD_TSTART>>8));
  468.   LCD_WRITECMD(0x40);
  469.   LCD_WRITEDATA(1);             /* SetTextArea */
  470.   LCD_WRITEDATA(1>>8);
  471.   LCD_WRITECMD(0x41);
  472.   LCD_WRITECMD(0x9C);           /* SetTextGraph */
  473.   LCD_WRITEDATA(LCD_GSTART);    /* SetGraphAdr */
  474.   LCD_WRITEDATA(LCD_GSTART>>8);
  475.   LCD_WRITECMD(0x42);
  476.   LCD_WRITEDATA(LCD_XSIZEB);    /* SetGraphArea */
  477.   LCD_WRITEDATA(LCD_XSIZEB>>8);
  478.   LCD_WRITECMD(0x43);
  479. }
  480. /* LCD_FirstInit */
  481. void LCD_FirstInit(void) {
  482.   int i;
  483.   LCD_INIT_CONTROLLER();
  484.   LCD_SETADR(0);
  485.   for (i=0; i<100; i++) {
  486.     LCD_WRITE1(0xff);
  487.   }
  488.   LCD_SETADR(0);
  489.   for (i=0;i<LCD_RAMSIZE;i++) {
  490.     LCD_WRITE1(0x0);
  491.   }
  492. }
  493. #endif /* T6963 */
  494. /*
  495.         *********************************************************
  496.         *                                                       *
  497.         *       Write 1 byte and manage cache                   *
  498.         *                                                       *
  499.         *********************************************************
  500. */
  501. static void LCD_Write(int Adr, U8 Byte) {
  502.   if (Cache[Adr]!=Byte) {
  503.     Cache[Adr]=Byte;
  504.     if (LCD_Adr!=Adr) {
  505.       LCD_SETADR(Adr);
  506.     }
  507.     LCD_WRITE1(Byte);
  508.   }
  509. }
  510. #define LCD_WRITE(Adr,Byte) LCD_Write(Adr,Byte);
  511. /*
  512.         *********************************************************
  513.         *                                                       *
  514.         *       Internal set pixel routines                     *
  515.         *                                                       *
  516.         *********************************************************
  517. */
  518. static void _SetPixel(int x, int y, LCD_PIXELINDEX c) {
  519.   U8 Mask=1<<(7-(x&7));
  520.   int Adr=XY2OFF(x,y);
  521.   U8 CacheByte=Cache[Adr];
  522.   if (c)
  523.     CacheByte|= Mask;
  524.   else
  525.     CacheByte&=~Mask;
  526.   LCD_WRITE(Adr,CacheByte)
  527. }
  528. static PIXELCOLOR _GetPixel(int x, int y) {
  529.   int Adr=XY2OFF(x,y);
  530.   U8 Mask=1<<(7-(x&7));
  531.   return (Cache[Adr]&Mask) ? 1 : 0;
  532. }
  533. static void XorPixel   (int x, int y) {
  534.   LCD_PIXELINDEX Index = _GetPixel(x,y);
  535.   _SetPixel(x,y, LCD_NUM_COLORS-1-Index);
  536. }
  537. /*
  538.         *********************************************************
  539.         *                                                       *
  540.         *       LCD_L0_SetPixelIndex                            *
  541.         *                                                       *
  542.         *********************************************************
  543. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  544.           display.
  545. */
  546. void LCD_L0_SetPixelIndex(int x, int y, int ColorIndex) {
  547.   SETPIXEL(x, y, ColorIndex);
  548. }
  549. /*
  550.         *********************************************************
  551.         *                                                       *
  552.         *       LCD_L0_XorPixel                                 *
  553.         *                                                       *
  554.         *********************************************************
  555. Purpose:  This routine is called by emWin. It writes 1 pixel into the
  556.           display.
  557. */
  558. void LCD_L0_XorPixel(int x, int y) {
  559.   XORPIXEL(x, y);
  560. }
  561. /*
  562.         *********************************************************
  563.         *                                                       *
  564.         *          LCD_L0_DrawHLine optimized                   *
  565.         *                                                       *
  566.         *********************************************************
  567. */
  568. #if (LCD_OPTIMIZE)               
  569.       && (!LCD_SWAP_XY)          
  570.       && (!LCD_MIRROR_X)         
  571.       && (!LCD_MIRROR_Y)         
  572.       && (!LCD_SUPPORT_COMTRANS) 
  573.       && (!LCD_SUPPORT_SEGTRANS)
  574. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  575.   register int Off = XY2OFF(x0,y);
  576.   int iByte = x0>>3;
  577.   int Byte1 = x1>>3;
  578.   U8 Mask =    0xff   >> (x0&7);
  579.   U8 EndMask = 0xff80 >> (x1&7);
  580.   U8 Data;
  581.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  582.     for (; iByte<Byte1; iByte++) {
  583.       Data = Cache[Off];
  584.       Data ^= Mask; 
  585.       LCD_WRITE(Off++,Data);
  586.       Mask = 0xff;
  587.     }
  588.     Mask &= EndMask;
  589.     Data = Cache[Off];
  590.     Data ^= Mask; 
  591.     LCD_WRITE(Off++,Data);
  592.   } else {                                  /* Clear pixels in line */
  593.     int NumBytes = Byte1-iByte;
  594.     if (COLOR==0) {
  595.       if (NumBytes) {
  596.         Data = Cache[Off] & (~Mask);
  597.         LCD_WRITE(Off++,Data);
  598.         NumBytes--;
  599.       /* Fill bytes in 2 loops for speed reasons ... */
  600.         for (; NumBytes>=4; NumBytes-=4) {
  601.           LCD_WRITE(Off++,0);
  602.           LCD_WRITE(Off++,0);
  603.           LCD_WRITE(Off++,0);
  604.           LCD_WRITE(Off++,0);
  605.         }
  606.         for (; NumBytes; NumBytes--) {
  607.           LCD_WRITE(Off++,0);
  608.         }
  609.         Mask = 0xff;
  610.       }
  611.       Mask &= EndMask;
  612.       Data = Cache[Off];
  613.       Data &= ~Mask; 
  614.       LCD_WRITE(Off++,Data);
  615.     } else {                                  /* Set pixels in line */
  616.       if (NumBytes) {
  617.         Data = Cache[Off] | Mask; 
  618.         LCD_WRITE(Off++,Data);
  619.         NumBytes--;
  620.       /* Fill bytes in 2 loops for speed reasons ... */
  621.         for (; NumBytes>=4; NumBytes-=4) {
  622.           LCD_WRITE(Off++,0xff);
  623.           LCD_WRITE(Off++,0xff);
  624.           LCD_WRITE(Off++,0xff);
  625.           LCD_WRITE(Off++,0xff);
  626.         }
  627.         for (; NumBytes; NumBytes--) {
  628.           LCD_WRITE(Off++,0xff);
  629.         }
  630.         Mask = 0xff;
  631.       }
  632.       Mask &= EndMask;
  633.       Data = Cache[Off] | Mask; 
  634.       LCD_WRITE(Off++,Data);
  635.     }
  636.   }
  637. }
  638. #else
  639. /*
  640.         *********************************************************
  641.         *                                                       *
  642.         *          LCD_L0_DrawHLine unoptimized                 *
  643.         *                                                       *
  644.         *********************************************************
  645. */
  646. void LCD_L0_DrawHLine  (int x0, int y,  int x1) {
  647.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  648.     while (x0 <= x1) {
  649.       XORPIXEL(x0, y);
  650.       x0++;
  651.     }
  652.   } else {
  653.     while (x0 <= x1) {
  654.       SETPIXEL(x0, y, COLOR);
  655.       x0++;
  656.     }
  657.   }
  658. }
  659. #endif
  660. /*
  661.         *********************************************************
  662.         *                                                       *
  663.         *          LCD_L0_DrawVLine                             *
  664.         *                                                       *
  665.         *********************************************************
  666. */
  667. void LCD_L0_DrawVLine  (int x, int y0,  int y1) {
  668.   if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
  669.     while (y0 <= y1) {
  670.       XORPIXEL(x, y0);
  671.       y0++;
  672.     }
  673.   } else {
  674.     while (y0 <= y1) {
  675.       SETPIXEL(x, y0, COLOR);
  676.       y0++;
  677.     }
  678.   }
  679. }
  680. /*
  681.         *********************************************************
  682.         *                                                       *
  683.         *          LCD_FillRect, unoptimized                    *
  684.         *                                                       *
  685.         *********************************************************
  686. */
  687. void LCD_L0_FillRect(int x0, int y0, int x1, int y1) {
  688.   for (; y0 <= y1; y0++) {
  689.     LCD_L0_DrawHLine(x0,y0, x1);
  690.   }
  691. }
  692. /*
  693.         *********************************************************
  694.         *                                                       *
  695.         *    Support for dynamic inversion of entire LCD        *
  696.         *                                                       *
  697.         *********************************************************
  698. */
  699. #if LCD_REVERSEMODE_SUPPORT
  700. void LCD_SetNormalDispMode    (void) {
  701. }
  702. void LCD_SetReverseDispMode   (void) {
  703. }
  704. #endif
  705. /*
  706.         *********************************************************
  707.         *                                                       *
  708.         *          Draw Bitmap 1 BPP, optimized                 *
  709.         *                                                       *
  710.         *********************************************************
  711. */
  712. #if (LCD_OPTIMIZE)               
  713.       && (!LCD_SWAP_XY)          
  714.       && (!LCD_MIRROR_X)         
  715.       && (!LCD_MIRROR_Y)         
  716.       && (!LCD_SUPPORT_COMTRANS) 
  717.       && (!LCD_SUPPORT_SEGTRANS)
  718. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  719.   LCD_PIXELINDEX Index0 = *(pTrans+0);
  720.   LCD_PIXELINDEX Index1 = *(pTrans+1);
  721.   x+=Diff;
  722.   if ((Index0==Index1) & (!(GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)))) {
  723.     LCD_PIXELINDEX ColorIndexOld= COLOR;
  724.     COLOR = Index0;
  725.     LCD_L0_DrawHLine(x,y,x+xsize-1);
  726.     COLOR = ColorIndexOld;
  727.     return;
  728.   }
  729.   {
  730.     int Adr=XY2OFF(x,y);
  731.     int x1 = x+xsize-1;
  732.     U8 Mask    = 0xff   >> (x &7);
  733.     U8 EndMask = 0xff80 >> (x1&7);
  734.     U8 CacheByte;
  735.     U16 PixelData;
  736.     int NumBytes = (x1>>3) - (x>>3);
  737.     if (NumBytes) {
  738.       CacheByte=Cache[Adr];
  739.       PixelData   = (*(p+1) | ((*p)<<8));
  740.       PixelData >>= (8+(x&7)-(Diff&7));
  741.       switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  742.       case 0:
  743.         if (!COLOR)
  744.           PixelData ^= 255;
  745.         CacheByte = (CacheByte&~Mask)|(PixelData&Mask);
  746.         break;
  747.       case LCD_DRAWMODE_TRANS:
  748.         if (COLOR)
  749.           CacheByte |= (PixelData&Mask);
  750.         else
  751.           CacheByte &= ~(PixelData&Mask);
  752.         break;
  753.       case LCD_DRAWMODE_XOR:
  754.         CacheByte ^= (PixelData&Mask);
  755.         break;
  756.       }
  757.       LCD_WRITE(Adr++,CacheByte);
  758.       { 
  759.         int DiffOld = Diff;
  760.         Diff+= 8-(x&7); 
  761.         if ((DiffOld&~7) != (Diff&~7))
  762.           p++;
  763.       }
  764.       x=0;
  765.       NumBytes--;
  766.       for (; NumBytes; NumBytes--) {
  767.         PixelData   = (*(p+1) | ((*p)<<8));
  768.         PixelData >>= (8-(Diff&7));
  769.         p++;
  770.         switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  771.         case 0:
  772.           if (!COLOR)
  773.             PixelData ^= 255;
  774.           CacheByte=PixelData&255;
  775.           break;
  776.         case LCD_DRAWMODE_TRANS:
  777.           CacheByte=Cache[Adr];
  778.           if (COLOR)
  779.             CacheByte |= PixelData;
  780.           else
  781.             CacheByte &= ~PixelData;
  782.           break;
  783.         case LCD_DRAWMODE_XOR:
  784.           CacheByte=Cache[Adr] ^ PixelData;
  785.           break;
  786.         }
  787.         LCD_WRITE(Adr++,CacheByte);
  788.       }
  789.       Mask = 0xff;
  790.     }
  791.     PixelData   = (*(p+1) | ((*p)<<8));
  792.     PixelData >>= (8+(x&7)-(Diff&7));
  793.     Mask &= EndMask;
  794.     CacheByte = Cache[Adr];
  795.     switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  796.     case 0:
  797.       if (!COLOR)
  798.         PixelData ^= 255;
  799.       CacheByte = (CacheByte&~Mask)|(PixelData&Mask);
  800.       break;
  801.     case LCD_DRAWMODE_TRANS:
  802.       if (COLOR)
  803.         CacheByte |= (PixelData&Mask);
  804.       else
  805.         CacheByte &= ~(PixelData&Mask);
  806.       break;
  807.     case LCD_DRAWMODE_XOR:
  808.       CacheByte ^= (PixelData&Mask);
  809.       break;
  810.     }
  811.     LCD_WRITE(Adr++,CacheByte);
  812.   }
  813. }
  814. #else
  815. /*
  816.         *********************************************************
  817.         *                                                       *
  818.         *          Draw Bitmap 1 BPP, no optimization           *
  819.         *                                                       *
  820.         *********************************************************
  821. */
  822. static void  DrawBitLine1BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  823.   PIXELCOLOR pixels;
  824.   PIXELCOLOR Index0 = *(pTrans+0);
  825.   PIXELCOLOR Index1 = *(pTrans+1);
  826. /*
  827.         Jump to right entry point
  828. */
  829.   pixels = *p;
  830.   switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS|LCD_DRAWMODE_XOR)) {
  831.   case 0:
  832.     switch (Diff&7) {
  833.     case 0:   
  834.       goto WriteBit0;
  835.     case 1:   
  836.       goto WriteBit1;
  837.     case 2:
  838.       goto WriteBit2;
  839.     case 3:
  840.       goto WriteBit3;
  841.     case 4:
  842.       goto WriteBit4;
  843.     case 5:   
  844.       goto WriteBit5;
  845.     case 6:   
  846.       goto WriteBit6;
  847.     case 7:   
  848.       goto WriteBit7;
  849.     }
  850.     break;
  851.   case LCD_DRAWMODE_TRANS:
  852.     switch (Diff&7) {
  853.     case 0:
  854.       goto WriteTBit0;
  855.     case 1:
  856.       goto WriteTBit1;
  857.     case 2:
  858.       goto WriteTBit2;
  859.     case 3:
  860.       goto WriteTBit3;
  861.     case 4:
  862.       goto WriteTBit4;
  863.     case 5:   
  864.       goto WriteTBit5;
  865.     case 6:   
  866.       goto WriteTBit6;
  867.     case 7:   
  868.       goto WriteTBit7;
  869.     }
  870.     break;
  871.   case LCD_DRAWMODE_XOR:
  872.     switch (Diff&7) {
  873.     case 0:   
  874.       goto WriteXBit0;
  875.     case 1:   
  876.       goto WriteXBit1;
  877.     case 2:
  878.       goto WriteXBit2;
  879.     case 3:
  880.       goto WriteXBit3;
  881.     case 4:
  882.       goto WriteXBit4;
  883.     case 5:   
  884.       goto WriteXBit5;
  885.     case 6:   
  886.       goto WriteXBit6;
  887.     case 7:   
  888.       goto WriteXBit7;
  889.     }
  890.   }
  891. /*
  892.         Write with transparency
  893. */
  894.   WriteTBit0:
  895.     if (pixels&(1<<7)) SETPIXEL(x+0, y, Index1);
  896.     if (!--xsize)
  897.       return;
  898.   WriteTBit1:
  899.     if (pixels&(1<<6)) SETPIXEL(x+1, y, Index1);
  900.     if (!--xsize)
  901.       return;
  902.   WriteTBit2:
  903.     if (pixels&(1<<5)) SETPIXEL(x+2, y, Index1);
  904.     if (!--xsize)
  905.       return;
  906.   WriteTBit3:
  907.     if (pixels&(1<<4)) SETPIXEL(x+3, y, Index1);
  908.     if (!--xsize)
  909.       return;
  910.   WriteTBit4:
  911.     if (pixels&(1<<3)) SETPIXEL(x+4, y, Index1);
  912.     if (!--xsize)
  913.       return;
  914.   WriteTBit5:
  915.     if (pixels&(1<<2)) SETPIXEL(x+5, y, Index1);
  916.     if (!--xsize)
  917.       return;
  918.   WriteTBit6:
  919.     if (pixels&(1<<1)) SETPIXEL(x+6, y, Index1);
  920.     if (!--xsize)
  921.       return;
  922.   WriteTBit7:
  923.     if (pixels&(1<<0)) SETPIXEL(x+7, y, Index1);
  924.     if (!--xsize)
  925.       return;
  926.     x+=8;
  927.     pixels = *(++p);
  928.     goto WriteTBit0;
  929. /*
  930.         Write without transparency
  931. */
  932.   WriteBit0:
  933.     SETPIXEL(x+0, y, (pixels&(1<<7)) ? Index1 : Index0);
  934.     if (!--xsize)
  935.       return;
  936.   WriteBit1:
  937.     SETPIXEL(x+1, y, (pixels&(1<<6)) ? Index1 : Index0);
  938.     if (!--xsize)
  939.       return;
  940.   WriteBit2:
  941.     SETPIXEL(x+2, y, (pixels&(1<<5)) ? Index1 : Index0);
  942.     if (!--xsize)
  943.       return;
  944.   WriteBit3:
  945.     SETPIXEL(x+3, y, (pixels&(1<<4)) ? Index1 : Index0);
  946.     if (!--xsize)
  947.       return;
  948.   WriteBit4:
  949.     SETPIXEL(x+4, y, (pixels&(1<<3)) ? Index1 : Index0);
  950.     if (!--xsize)
  951.       return;
  952.   WriteBit5:
  953.     SETPIXEL(x+5, y, (pixels&(1<<2)) ? Index1 : Index0);
  954.     if (!--xsize)
  955.       return;
  956.   WriteBit6:
  957.     SETPIXEL(x+6, y, (pixels&(1<<1)) ? Index1 : Index0);
  958.     if (!--xsize)
  959.       return;
  960.   WriteBit7:
  961.     SETPIXEL(x+7, y, (pixels&(1<<0)) ? Index1 : Index0);
  962.     if (!--xsize)
  963.       return;
  964.     x+=8;
  965.     pixels = *(++p);
  966.     goto WriteBit0;
  967. /*
  968.         Write XOR mode
  969. */
  970.   WriteXBit0:
  971.     if (pixels&(1<<7))
  972.       XORPIXEL(x+0, y);
  973.     if (!--xsize)
  974.       return;
  975.   WriteXBit1:
  976.     if (pixels&(1<<6))
  977.       XORPIXEL(x+1, y);
  978.     if (!--xsize)
  979.       return;
  980.   WriteXBit2:
  981.     if (pixels&(1<<5))
  982.       XORPIXEL(x+2, y);
  983.     if (!--xsize)
  984.       return;
  985.   WriteXBit3:
  986.     if (pixels&(1<<4))
  987.       XORPIXEL(x+3, y);
  988.     if (!--xsize)
  989.       return;
  990.   WriteXBit4:
  991.     if (pixels&(1<<3))
  992.       XORPIXEL(x+4, y);
  993.     if (!--xsize)
  994.       return;
  995.   WriteXBit5:
  996.     if (pixels&(1<<2))
  997.       XORPIXEL(x+5, y);
  998.     if (!--xsize)
  999.       return;
  1000.   WriteXBit6:
  1001.     if (pixels&(1<<1))
  1002.       XORPIXEL(x+6, y);
  1003.     if (!--xsize)
  1004.       return;
  1005.   WriteXBit7:
  1006.     if (pixels&(1<<0))
  1007.       XORPIXEL(x+7, y);
  1008.     if (!--xsize)
  1009.       return;
  1010.     x+=8;
  1011.     pixels = *(++p);
  1012.     goto WriteXBit0;
  1013. }
  1014. #endif
  1015. /*
  1016.         *********************************************************
  1017.         *                                                       *
  1018.         *  Draw Bitmap 2 BPP                                    *
  1019.         *                                                       *
  1020.         *********************************************************
  1021. */
  1022. #if (LCD_MAX_LOG_COLORS > 2)
  1023. static void  DrawBitLine2BPP(int x, int y, U8 const*p, int Diff, int xsize, const LCD_PIXELINDEX*pTrans) {
  1024.   PIXELCOLOR pixels;
  1025. /*
  1026.         Jump to right entry point
  1027. */
  1028.   pixels = *p;
  1029.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) switch (Diff&3) {
  1030.   case 0:
  1031.     goto WriteTBit0;
  1032.   case 1:
  1033.     goto WriteTBit1;
  1034.   case 2:
  1035.     goto WriteTBit2;
  1036.   default:
  1037.     goto WriteTBit3;
  1038.   } else switch (Diff&3) {
  1039.   case 0:
  1040.     goto WriteBit0;
  1041.   case 1:
  1042.     goto WriteBit1;
  1043.   case 2:
  1044.     goto WriteBit2;
  1045.   default:
  1046.     goto WriteBit3;
  1047.   }
  1048. /*
  1049.         Write without transparency
  1050. */
  1051. WriteBit0:
  1052.   SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1053.   if (!--xsize)
  1054.     return;
  1055. WriteBit1:
  1056.   SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1057.   if (!--xsize)
  1058.     return;
  1059. WriteBit2:
  1060.   SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1061.   if (!--xsize)
  1062.     return;
  1063. WriteBit3:
  1064.   SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1065.   if (!--xsize)
  1066.     return;
  1067.   pixels = *(++p);
  1068.   x+=4;
  1069.   goto WriteBit0;
  1070. /*
  1071.         Write with transparency
  1072. */
  1073. WriteTBit0:
  1074.   if (pixels&(3<<6))
  1075.     SETPIXEL(x+0, y, *(pTrans+(pixels>>6)));
  1076.   if (!--xsize)
  1077.     return;
  1078. WriteTBit1:
  1079.   if (pixels&(3<<4))
  1080.     SETPIXEL(x+1, y, *(pTrans+(3&(pixels>>4))));
  1081.   if (!--xsize)
  1082.     return;
  1083. WriteTBit2:
  1084.   if (pixels&(3<<2))
  1085.     SETPIXEL(x+2, y, *(pTrans+(3&(pixels>>2))));
  1086.   if (!--xsize)
  1087.     return;
  1088. WriteTBit3:
  1089.   if (pixels&(3<<0))
  1090.     SETPIXEL(x+3, y, *(pTrans+(3&(pixels))));
  1091.   if (!--xsize)
  1092.     return;
  1093.   pixels = *(++p);
  1094.   x+=4;
  1095.   goto WriteTBit0;
  1096. }
  1097. #endif
  1098. /*
  1099.         *********************************************************
  1100.         *                                                       *
  1101.         *  Draw Bitmap 4 BPP                                    *
  1102.         *                                                       *
  1103.         *********************************************************
  1104. */
  1105. #if (LCD_MAX_LOG_COLORS > 4)
  1106. static void  DrawBitLine4BPP(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.   if (GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) {
  1113.     if ((Diff&1) ==0)
  1114.       goto WriteTBit0;
  1115.     goto WriteTBit1;
  1116.   } else {
  1117.     if ((Diff&1) ==0)
  1118.       goto WriteBit0;
  1119.     goto WriteBit1;
  1120.   }
  1121. /*
  1122.         Write without transparency
  1123. */
  1124. WriteBit0:
  1125.   SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1126.   if (!--xsize)
  1127.     return;
  1128. WriteBit1:
  1129.   SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1130.   if (!--xsize)
  1131.     return;
  1132.   x+=2;
  1133.   pixels = *(++p);
  1134.   goto WriteBit0;
  1135. /*
  1136.         Write with transparency
  1137. */
  1138. WriteTBit0:
  1139.   if (pixels>>4)
  1140.     SETPIXEL(x+0, y, *(pTrans+(pixels>>4)));
  1141.   if (!--xsize)
  1142.     return;
  1143. WriteTBit1:
  1144.   if (pixels&0xf)
  1145.     SETPIXEL(x+1, y, *(pTrans+(pixels&0xf)));
  1146.   if (!--xsize)
  1147.     return;
  1148.   x+=2;
  1149.   pixels = *(++p);
  1150.   goto WriteTBit0;
  1151. }
  1152. #endif
  1153. /*
  1154.         *********************************************************
  1155.         *                                                       *
  1156.         *  Draw Bitmap 8 BPP  (256 colors)                      *
  1157.         *                                                       *
  1158.         *      Default (no optimization)                        *
  1159.         *                                                       *
  1160.         *********************************************************
  1161. */
  1162. #if (LCD_MAX_LOG_COLORS > 16)
  1163. static void  DrawBitLine8BPP(int x, int y, U8 const*p, int xsize, const LCD_PIXELINDEX*pTrans) {
  1164.   LCD_PIXELINDEX pixel;
  1165. /*  
  1166.         Do x-Clipping
  1167. */
  1168.   if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS)==0) {
  1169.     while (xsize > 0) {
  1170.       pixel = *p;
  1171.       SETPIXEL(x+0, y, *(pTrans+pixel));
  1172.       xsize--;
  1173.       x++;
  1174.       p++;
  1175.     }
  1176.   } else {   /* Handle transparent bitmap */
  1177.     while (xsize > 0) {
  1178.       pixel = *p;
  1179.       if (pixel)
  1180.         SETPIXEL(x+0, y, *(pTrans+pixel));
  1181.       xsize--;
  1182.       x++;
  1183.       p++;
  1184.     }
  1185.   }
  1186. }
  1187. #endif
  1188. /*
  1189.         *********************************************************
  1190.         *                                                       *
  1191.         *         Universal draw Bitmap routine                 *
  1192.         *                                                       *
  1193.         *********************************************************
  1194. */
  1195. void LCD_L0_DrawBitmap   (int x0, int y0,
  1196.                        int xsize, int ysize,
  1197.                        int BitsPerPixel, 
  1198.                        int BytesPerLine,
  1199.                        const U8* pData, int Diff,
  1200.                        const LCD_PIXELINDEX* pTrans)
  1201. {
  1202.   int i;
  1203.   if (!pTrans)
  1204.     pTrans = LCD_ConversionTable;
  1205.   /*
  1206.      Use DrawBitLineXBPP
  1207.   */
  1208.   for (i=0; i<ysize; i++) {
  1209.     switch (BitsPerPixel) {
  1210.     case 1:
  1211.       DrawBitLine1BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1212.       break;
  1213.     #if (LCD_MAX_LOG_COLORS > 2)
  1214.       case 2:
  1215.         DrawBitLine2BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1216.         break;
  1217.     #endif
  1218.     #if (LCD_MAX_LOG_COLORS > 4)
  1219.       case 4:
  1220.         DrawBitLine4BPP(x0, i+y0, pData, Diff, xsize, pTrans);
  1221.         break;
  1222.     #endif
  1223.     #if (LCD_MAX_LOG_COLORS > 16)
  1224.       case 8:
  1225.         DrawBitLine8BPP(x0, i+y0, pData, xsize, pTrans);
  1226.         break;
  1227.     #endif
  1228.     }
  1229.     pData += BytesPerLine;
  1230.   }
  1231. }
  1232. /********************************************************
  1233. *
  1234. *       LCD_L0_SetOrg
  1235. *
  1236. *********************************************************
  1237. Purpose:        Sets the original position of the virtual display.
  1238.                 Has no function at this point with the PC-driver.
  1239. */
  1240. int OrgX, OrgY;
  1241. void LCD_L0_SetOrg(int x, int y) {
  1242.   OrgX = x;
  1243.   OrgY = y;
  1244. }
  1245. /*
  1246.         *********************************************************
  1247.         *                                                       *
  1248.         *           Support for verification                    *
  1249.         *                                                       *
  1250.         *********************************************************
  1251. The following routines are implemented, but have no functionility
  1252. at this point. The reason is that these functions are supposed
  1253. to supervise the hardware, which for obvious reasons can not be
  1254. done in a simulation.
  1255. */
  1256. #if LCD_SUPPORT_VERIFY
  1257. int  LCD_GetErrStat(void) {
  1258.   return 0;
  1259. }
  1260. void LCD_ClrErrStat(void) {
  1261. }
  1262. int  LCD_GetErrCnt (void) {
  1263.   return 0;
  1264. }
  1265. #endif  
  1266. /*
  1267.         *********************************************************
  1268.         *                                                       *
  1269.         *               Copy rectangle                          *
  1270.         *                                                       *
  1271.         *********************************************************
  1272. This function is used for scrolling. If scrolling is not required
  1273. (as is sometimes the case) this routine can be eliminated via
  1274. configuration switch.
  1275. */
  1276. #if  LCD_SUPPORT_COPYRECT
  1277. static void Copy_Line (int y,int x0,int x1,int dx,int dy) {
  1278.   if (dy >=0) {
  1279.     int x;
  1280.     for (x=x0; x<=x1; x++) {
  1281.       _SetPixel(x+dx, y+dy, _GetPixel(x,y));
  1282.     }
  1283.   } else {
  1284.     int x;
  1285.     for (x=x1; x>=x0; x--) {
  1286.       _SetPixel(x+dx, y+dy, _GetPixel(x,y));
  1287.     }
  1288.   }
  1289. }
  1290. void LCD_CopyRect     (int x0, int y0, int x1, int y1, int dx, int dy) {
  1291.   if (dy >=0) {
  1292.     int y;
  1293.     for (y=y0; y<=y1; y++) {
  1294.       Copy_Line (y,x0,x1,dx,dy);
  1295.     }
  1296.   } else {
  1297.     int y;
  1298.     for (y=y1; y>=y0; y--) {
  1299.       Copy_Line (y,x0,x1,dx,dy);
  1300.     }
  1301.   }
  1302. }
  1303. #endif
  1304. /*
  1305.         *********************************************************
  1306.         *                                                       *
  1307.         *                   LCD_SetPaletteEntry                 *
  1308.         *                                                       *
  1309.         *********************************************************
  1310. */
  1311. void LCD_L0_SetLUTEntry(U8 Pos, LCD_COLOR color) {
  1312.   Pos=Pos;
  1313.   color=color;
  1314. }
  1315. /*
  1316.         *********************************************************
  1317.         *                                                       *
  1318.         *       LCD_On                                          *
  1319.         *       LCD_Off                                         *
  1320.         *                                                       *
  1321.         *********************************************************
  1322. */
  1323. void LCD_Off          (void) {
  1324. #ifdef LCD_OFF
  1325.   LCD_OFF();
  1326. #endif
  1327. }
  1328. void LCD_On           (void) {
  1329. #ifdef LCD_ON
  1330.   LCD_ON();
  1331. #endif
  1332. }
  1333. unsigned int LCD_L0_GetPixelIndex(int x, int y) {
  1334.   return GETPIXEL(x,y);
  1335. }
  1336. /*
  1337.         *********************************************************
  1338.         *                                                       *
  1339.         *       LCD_Init : Init the display                     *
  1340.         *                                                       *
  1341.         *********************************************************
  1342. */
  1343. int  LCD_L0_Init(void) {
  1344.   /* Controller independent */
  1345.   #if LCD_WATCHDOG_TRIGGERCNT
  1346.     WatchdogTriggerCnt =0;
  1347.   #endif
  1348.   /* Controller initialisation */
  1349.   LCD_FirstInit();
  1350.   LCD_L0_ReInit();
  1351.   LCD_Adr=0xffff;
  1352.   /* Init successfull */
  1353.   return 0;
  1354. }
  1355. #else
  1356. void LCDSLin(void) { } /* avoid empty object files */
  1357. #endif