| Line No. | Rev | Author | Line | 
|---|---|---|---|
| 1 | 32 | kaklik | /***************************************************************************** | 
| 2 |  *  Module for Microchip Graphics Library | ||
| 3 |  *  Solomon Systech. SSD1926 LCD controller driver | ||
| 4 |  *  to be used with GFX 3 PICtail board | ||
| 5 |  ***************************************************************************** | ||
| 6 |  * FileName:        SSD1926.c | ||
| 7 |  * Dependencies:    Graphics.h | ||
| 8 |  * Processor:       PIC24, PIC32 | ||
| 9 |  * Compiler:       	MPLAB C30, MPLAB C32 | ||
| 10 |  * Linker:          MPLAB LINK30, MPLAB LINK32 | ||
| 11 |  * Company:         Microchip Technology Incorporated | ||
| 12 |  * | ||
| 13 |  * Software License Agreement | ||
| 14 |  * | ||
| 15 |  * Copyright © 2008 Microchip Technology Inc.  All rights reserved. | ||
| 16 |  * Microchip licenses to you the right to use, modify, copy and distribute | ||
| 17 |  * Software only when embedded on a Microchip microcontroller or digital | ||
| 18 |  * signal controller, which is integrated into your product or third party | ||
| 19 |  * product (pursuant to the sublicense terms in the accompanying license | ||
| 20 |  * agreement).   | ||
| 21 |  * | ||
| 22 |  * You should refer to the license agreement accompanying this Software | ||
| 23 |  * for additional information regarding your rights and obligations. | ||
| 24 |  * | ||
| 25 |  * SOFTWARE AND DOCUMENTATION ARE PROVIDED AS IS WITHOUT WARRANTY OF ANY | ||
| 26 |  * KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION, ANY WARRANTY | ||
| 27 |  * OF MERCHANTABILITY, TITLE, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR | ||
| 28 |  * PURPOSE. IN NO EVENT SHALL MICROCHIP OR ITS LICENSORS BE LIABLE OR | ||
| 29 |  * OBLIGATED UNDER CONTRACT, NEGLIGENCE, STRICT LIABILITY, CONTRIBUTION, | ||
| 30 |  * BREACH OF WARRANTY, OR OTHER LEGAL EQUITABLE THEORY ANY DIRECT OR INDIRECT | ||
| 31 |  * DAMAGES OR EXPENSES INCLUDING BUT NOT LIMITED TO ANY INCIDENTAL, SPECIAL, | ||
| 32 |  * INDIRECT, PUNITIVE OR CONSEQUENTIAL DAMAGES, LOST PROFITS OR LOST DATA, | ||
| 33 |  * COST OF PROCUREMENT OF SUBSTITUTE GOODS, TECHNOLOGY, SERVICES, OR ANY | ||
| 34 |  * CLAIMS BY THIRD PARTIES (INCLUDING BUT NOT LIMITED TO ANY DEFENSE THEREOF), | ||
| 35 |  * OR OTHER SIMILAR COSTS. | ||
| 36 |  * | ||
| 37 |  * Author               Date        Comment | ||
| 38 |  *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | ||
| 39 |  * Anton Alkhimenok     08/27/08 | ||
| 40 |  * Jayanth Murthy       06/25/09    dsPIC & PIC24H support  | ||
| 41 |  * Pradeep Budagutta	07/30/09	Added Palette Support | ||
| 42 |  * PAT					02/05/10	Fixed GetPixel() bug | ||
| 43 |  * PAT					03/03/10	Fixed Circle() bug  | ||
| 44 |  * PAT					03/26/10	Fixed Line2D() bug  | ||
| 45 |  *****************************************************************************/ | ||
| 46 | #include "Graphics\Graphics.h" | ||
| 47 | |||
| 48 | // Color | ||
| 49 | WORD    _color; | ||
| 50 | |||
| 51 | // Clipping region control | ||
| 52 | SHORT   _clipRgn; | ||
| 53 | |||
| 54 | // Clipping region borders | ||
| 55 | SHORT   _clipLeft; | ||
| 56 | SHORT   _clipTop; | ||
| 57 | SHORT   _clipRight; | ||
| 58 | SHORT   _clipBottom; | ||
| 59 | |||
| 60 | #define RED8(color16)   (BYTE) ((color16 & 0xF800) >> 8) | ||
| 61 | #define GREEN8(color16) (BYTE) ((color16 & 0x07E0) >> 3) | ||
| 62 | #define BLUE8(color16)  (BYTE) ((color16 & 0x001F) << 3) | ||
| 63 | |||
| 64 | /////////////////////// LOCAL FUNCTIONS PROTOTYPES //////////////////////////// | ||
| 65 | void        SetAddress(DWORD address); | ||
| 66 | void        SetReg(WORD index, BYTE value); | ||
| 67 | BYTE        GetReg(WORD index); | ||
| 68 | |||
| 69 | void        PutImage1BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch); | ||
| 70 | void        PutImage4BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch); | ||
| 71 | void        PutImage8BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch); | ||
| 72 | void        PutImage16BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch); | ||
| 73 | |||
| 74 | void        PutImage1BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch); | ||
| 75 | void        PutImage4BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch); | ||
| 76 | void        PutImage8BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch); | ||
| 77 | void        PutImage16BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch); | ||
| 78 | |||
| 79 | #if (DISPLAY_PANEL == TFT_G240320LTSW_118W_E) | ||
| 80 |     #include "TCON_SSD1289.c" | ||
| 81 | |||
| 82 | #elif (DISPLAY_PANEL == TFT_G320240DTSW_69W_TP_E) | ||
| 83 |     #include "TCON_HX8238.c" | ||
| 84 | |||
| 85 | #elif (DISPLAY_PANEL == PH480272T_005_I06Q) | ||
| 86 |     #include "TCON_HX8257.c" | ||
| 87 | |||
| 88 | #else | ||
| 89 |     #include "TCON_Custom.c" | ||
| 90 | #endif | ||
| 91 | |||
| 92 | #ifdef USE_PALETTE | ||
| 93 | extern void *_palette; | ||
| 94 | static BYTE PaletteBpp = 16; | ||
| 95 | extern BYTE blPaletteChangeError; | ||
| 96 | extern void *pPendingPalette; | ||
| 97 | extern WORD PendingStartEntry; | ||
| 98 | extern WORD PendingLength; | ||
| 99 | #endif | ||
| 100 | |||
| 101 | /********************************************************************* | ||
| 102 | * Macro:  WritePixel(color) | ||
| 103 | * | ||
| 104 | * PreCondition: none | ||
| 105 | * | ||
| 106 | * Input: color  | ||
| 107 | * | ||
| 108 | * Output: none | ||
| 109 | * | ||
| 110 | * Side Effects: none | ||
| 111 | * | ||
| 112 | * Overview: writes pixel at the current address | ||
| 113 | * | ||
| 114 | * Note: chip select should be enabled | ||
| 115 | * | ||
| 116 | ********************************************************************/ | ||
| 117 | #ifdef USE_16BIT_PMP | ||
| 118 | #define WritePixel(color)	DeviceWrite(color) | ||
| 119 | #else | ||
| 120 | #ifdef USE_PALETTE | ||
| 121 | #define WritePixel(color)	DeviceWrite(color) | ||
| 122 | #else | ||
| 123 | #define WritePixel(color)	{ DeviceWrite(((WORD_VAL)color).v[1]); DeviceWrite(((WORD_VAL)color).v[0]);} | ||
| 124 | #endif | ||
| 125 | #endif | ||
| 126 | |||
| 127 | /********************************************************************* | ||
| 128 | * Function:  void SetAddress(DWORD address) | ||
| 129 | * | ||
| 130 | * PreCondition: none | ||
| 131 | * | ||
| 132 | * Input: address - address  | ||
| 133 | * | ||
| 134 | * Output: none | ||
| 135 | * | ||
| 136 | * Side Effects: none | ||
| 137 | * | ||
| 138 | * Overview: sets the address for read/write operations | ||
| 139 | * | ||
| 140 | * Note: chip select should be enabled | ||
| 141 | * | ||
| 142 | ********************************************************************/ | ||
| 143 | void SetAddress(DWORD address) | ||
| 144 | { | ||
| 145 |     #ifdef USE_16BIT_PMP | ||
| 146 | 	WORD_VAL    temp; | ||
| 147 | |||
| 148 |     DeviceSetCommand(); // set RS line to low for command | ||
| 149 | |||
| 150 |     temp.v[0] = ((DWORD_VAL) address).v[1]; | ||
| 151 |     temp.v[1] = ((DWORD_VAL) address).v[2] | 0x80; | ||
| 152 | 	DeviceWrite(temp.Val); | ||
| 153 | 	temp.v[0] = 0x01; | ||
| 154 |     temp.v[1] = ((DWORD_VAL) address).v[0]; | ||
| 155 | 	DeviceWrite(temp.Val); | ||
| 156 | |||
| 157 | 	DeviceSetData();    // set RS line to high for data | ||
| 158 | |||
| 159 |     #else | ||
| 160 | |||
| 161 |     DeviceSetCommand(); // set RS line to low for command | ||
| 162 | |||
| 163 |     DeviceWrite(((DWORD_VAL) address).v[2] | 0x80); | ||
| 164 |     DeviceWrite(((DWORD_VAL) address).v[1]); | ||
| 165 |     DeviceWrite(((DWORD_VAL) address).v[0]); | ||
| 166 | |||
| 167 |     DeviceSetData();    // set RS line to high for data | ||
| 168 | |||
| 169 |     #endif | ||
| 170 | } | ||
| 171 | |||
| 172 | /********************************************************************* | ||
| 173 | * Function:  void  SetReg(WORD index, BYTE value) | ||
| 174 | * | ||
| 175 | * PreCondition: none | ||
| 176 | * | ||
| 177 | * Input: index - register number | ||
| 178 | *        value - value to be set | ||
| 179 | * | ||
| 180 | * Output: none | ||
| 181 | * | ||
| 182 | * Side Effects: none | ||
| 183 | * | ||
| 184 | * Overview: sets graphics controller register (byte access) | ||
| 185 | * | ||
| 186 | * Note: none | ||
| 187 | * | ||
| 188 | ********************************************************************/ | ||
| 189 | void SetReg(WORD index, BYTE value) | ||
| 190 | { | ||
| 191 |     #ifdef USE_16BIT_PMP | ||
| 192 | |||
| 193 |     DeviceSetCommand(); // set RS line to low for command | ||
| 194 |     DeviceSelect();     // enable SSD1926 | ||
| 195 | |||
| 196 |     DeviceWrite(((WORD_VAL) index).v[1]); | ||
| 197 |     DeviceWrite(index << 8); | ||
| 198 | |||
| 199 | 	DeviceSetData();    // set RS line to high for data | ||
| 200 | |||
| 201 |     if(index & 0x0001) | ||
| 202 | 		DeviceWrite(value); | ||
| 203 |     else | ||
| 204 | 		DeviceWrite(value << 8); | ||
| 205 | |||
| 206 | 	DeviceDeselect();   // disable SSD1926 | ||
| 207 | |||
| 208 | 	#else | ||
| 209 | |||
| 210 |     DeviceSetCommand(); // set RS line to low for command | ||
| 211 |     DeviceSelect();     // enable SSD1926 | ||
| 212 | |||
| 213 |     DeviceWrite(0x00);    // register access | ||
| 214 |     DeviceWrite(((WORD_VAL) index).v[1]); | ||
| 215 |     DeviceWrite(((WORD_VAL) index).v[0]); | ||
| 216 | |||
| 217 | 	DeviceSetData();    // set RS line to high for data | ||
| 218 | 	DeviceWrite(value); | ||
| 219 | |||
| 220 | 	DeviceDeselect();   // disable SSD1926 | ||
| 221 |     #endif | ||
| 222 | } | ||
| 223 | |||
| 224 | /********************************************************************* | ||
| 225 | * Function:  BYTE GetReg(WORD index) | ||
| 226 | * | ||
| 227 | * PreCondition: none | ||
| 228 | * | ||
| 229 | * Input: index - register number | ||
| 230 | * | ||
| 231 | * Output: none | ||
| 232 | * | ||
| 233 | * Side Effects: none | ||
| 234 | * | ||
| 235 | * Overview: returns graphics controller register value (byte access) | ||
| 236 | * | ||
| 237 | * Note: none | ||
| 238 | * | ||
| 239 | ********************************************************************/ | ||
| 240 | BYTE GetReg(WORD index) | ||
| 241 | { | ||
| 242 | #ifdef USE_16BIT_PMP | ||
| 243 | |||
| 244 | 	WORD    value; | ||
| 245 | |||
| 246 |     DeviceSetCommand(); // set RS line to low for command | ||
| 247 |     DeviceSelect();     // enable SSD1926 | ||
| 248 | |||
| 249 |     DeviceWrite(((WORD_VAL) index).v[1]); | ||
| 250 |     DeviceWrite(index << 8); | ||
| 251 | |||
| 252 | 	DeviceSetData();    // set RS line to high for data | ||
| 253 | |||
| 254 | 	value = DeviceRead(); | ||
| 255 | 	value = DeviceRead(); | ||
| 256 | |||
| 257 | 	DeviceDeselect();   // disable SSD1926 | ||
| 258 | |||
| 259 |     if(index & 0x0001) | ||
| 260 |         value &= 0x00ff; | ||
| 261 |     else | ||
| 262 |         value = (value >> 8) & 0x00ff; | ||
| 263 | |||
| 264 | #else | ||
| 265 |     BYTE   value; | ||
| 266 | |||
| 267 | 	DeviceSetCommand(); // set RS line to low for command | ||
| 268 |     DeviceSelect();     // enable SSD1926 | ||
| 269 | |||
| 270 |     DeviceWrite(0x00);    // register access | ||
| 271 |     DeviceWrite(((WORD_VAL) index).v[1]); | ||
| 272 |     DeviceWrite(((WORD_VAL) index).v[0]); | ||
| 273 | |||
| 274 | 	DeviceSetData();    // set RS line to high for data | ||
| 275 | |||
| 276 | 	value = DeviceRead(); | ||
| 277 | 	value = DeviceRead(); | ||
| 278 | |||
| 279 | 	DeviceDeselect();   // disable SSD1926 | ||
| 280 | #endif | ||
| 281 | |||
| 282 | 	return (value); | ||
| 283 | } | ||
| 284 | |||
| 285 | /********************************************************************* | ||
| 286 | * Function:  void ResetDevice() | ||
| 287 | * | ||
| 288 | * PreCondition: none | ||
| 289 | * | ||
| 290 | * Input: none | ||
| 291 | * | ||
| 292 | * Output: none | ||
| 293 | * | ||
| 294 | * Side Effects: none | ||
| 295 | * | ||
| 296 | * Overview: resets LCD, initializes PMP | ||
| 297 | * | ||
| 298 | * Note: none | ||
| 299 | * | ||
| 300 | ********************************************************************/ | ||
| 301 | void ResetDevice(void) | ||
| 302 | { | ||
| 303 |     ///////////////////////////////////////////////////////////////////// | ||
| 304 |     // Initialize the device | ||
| 305 |     ///////////////////////////////////////////////////////////////////// | ||
| 306 | 	DeviceInit(); | ||
| 307 | |||
| 308 |     ///////////////////////////////////////////////////////////////////// | ||
| 309 |     // PLL SETUP | ||
| 310 |     // Crystal frequency x M / N = 80 MHz | ||
| 311 |     // for 4 MHz crystal: | ||
| 312 |     ///////////////////////////////////////////////////////////////////// | ||
| 313 |     SetReg(REG_PLL_CONFIG_0, 0x0a);         // set N = 10 | ||
| 314 |     SetReg(REG_PLL_CONFIG_1, 0xc8);         // set M = 200 | ||
| 315 |     SetReg(REG_PLL_CONFIG_2, 0xae);         // must be programmed to 0xAE | ||
| 316 |     SetReg(REG_PLL_CONFIG_0, 0x8a);         // enable PLL | ||
| 317 | |||
| 318 |     ///////////////////////////////////////////////////////////////////// | ||
| 319 |     // VIDEO BUFFER MEMORY CLOCK SETUP | ||
| 320 |     // Memory frequency = PLL frequency / (MCLK + 1) | ||
| 321 |     ///////////////////////////////////////////////////////////////////// | ||
| 322 |     SetReg(REG_MEMCLK_CONFIG, 0x00);        // set MCLK = 0 (80 MHz) | ||
| 323 | |||
| 324 |     ///////////////////////////////////////////////////////////////////// | ||
| 325 | |||
| 326 |     // PIXEL OUTPUT CLOCK SETUP (LCD_SHIFT SIGNAL) | ||
| 327 |     // Pixel clock = Memory frequency * (PCLK + 1) / 0x100000 | ||
| 328 |     ///////////////////////////////////////////////////////////////////// | ||
| 329 |     SetReg(REG_PCLK_FREQ_RATIO_0, 0x00);    // set PCLK = 0x020000 | ||
| 330 |     SetReg(REG_PCLK_FREQ_RATIO_1, 0x00);    // Pixel clock = 10 MHz | ||
| 331 |     SetReg(REG_PCLK_FREQ_RATIO_2, 0x02); | ||
| 332 | |||
| 333 |     ///////////////////////////////////////////////////////////////////// | ||
| 334 |     // Panel Configuration (reg 10h) | ||
| 335 |     // TFT display with 18 bit or 24-bit RGB parallel interface. | ||
| 336 |     ///////////////////////////////////////////////////////////////////// | ||
| 337 |     #if (DISP_DATA_WIDTH == 18) | ||
| 338 |     SetReg(REG_PANEL_TYPE, 0x61); | ||
| 339 |     #else | ||
| 340 |     SetReg(REG_PANEL_TYPE, 0x71); | ||
| 341 |     #endif | ||
| 342 | |||
| 343 |     ///////////////////////////////////////////////////////////////////// | ||
| 344 |     // Horizontal total HT (reg 12h) | ||
| 345 |     ///////////////////////////////////////////////////////////////////// | ||
| 346 |     #define HT  (DISP_HOR_PULSE_WIDTH + DISP_HOR_BACK_PORCH + DISP_HOR_FRONT_PORCH + DISP_HOR_RESOLUTION) | ||
| 347 |     SetReg(REG_HORIZ_TOTAL_0, HT / 8); | ||
| 348 |     SetReg(REG_HORIZ_TOTAL_1, HT % 8); | ||
| 349 | |||
| 350 |     ///////////////////////////////////////////////////////////////////// | ||
| 351 |     // Horizontal display period HDP (reg 14h) | ||
| 352 |     ///////////////////////////////////////////////////////////////////// | ||
| 353 |     SetReg(REG_HDP, DISP_HOR_RESOLUTION / 8 - 1); | ||
| 354 | |||
| 355 |     ///////////////////////////////////////////////////////////////////// | ||
| 356 |     // Horizontal display period start HDPS (regs 16h, 17h) | ||
| 357 |     ///////////////////////////////////////////////////////////////////// | ||
| 358 | 	#define HDPS (DISP_HOR_PULSE_WIDTH + DISP_HOR_BACK_PORCH)     | ||
| 359 | 	SetReg(REG_HDP_START_POS0, HDPS & 0x00FF); | ||
| 360 |     SetReg(REG_HDP_START_POS1, (HDPS >> 8) & 0x00FF); | ||
| 361 | |||
| 362 |     ///////////////////////////////////////////////////////////////////// | ||
| 363 |     // Horizontal syncronization pulse width HPW (reg 20h) | ||
| 364 |     ///////////////////////////////////////////////////////////////////// | ||
| 365 |     SetReg(REG_HSYNC_PULSE_WIDTH, DISP_HOR_PULSE_WIDTH - 1); | ||
| 366 | |||
| 367 |     ///////////////////////////////////////////////////////////////////// | ||
| 368 |     // Vertical total VT (regs 18h, 19h) | ||
| 369 |     ///////////////////////////////////////////////////////////////////// | ||
| 370 |     #define VT  (DISP_VER_PULSE_WIDTH + DISP_VER_BACK_PORCH + DISP_VER_FRONT_PORCH + DISP_VER_RESOLUTION) | ||
| 371 |     SetReg(REG_VERT_TOTAL0, VT & 0x00FF); | ||
| 372 |     SetReg(REG_VERT_TOTAL1, (VT >> 8) & 0x00FF); | ||
| 373 | |||
| 374 |     ///////////////////////////////////////////////////////////////////// | ||
| 375 |     // Vertical display period VDP (regs 1ch, 1dh) | ||
| 376 |     ///////////////////////////////////////////////////////////////////// | ||
| 377 |     #define VDP (DISP_VER_RESOLUTION - 1) | ||
| 378 |     SetReg(REG_VDP0, VDP & 0x00FF); | ||
| 379 |     SetReg(REG_VDP1, (VDP >> 8) & 0x00FF); | ||
| 380 | |||
| 381 |     ///////////////////////////////////////////////////////////////////// | ||
| 382 |     // Vertical display period start VDPS (regs 1eh, 1fh) | ||
| 383 |     ///////////////////////////////////////////////////////////////////// | ||
| 384 | 	#define VDPS  (DISP_VER_PULSE_WIDTH + DISP_VER_BACK_PORCH)     | ||
| 385 | 	SetReg(REG_VDP_START_POS0, VDPS & 0x00FF); | ||
| 386 |     SetReg(REG_VDP_START_POS1, (VDPS >> 8) & 0x00FF); | ||
| 387 | |||
| 388 |     ///////////////////////////////////////////////////////////////////// | ||
| 389 |     // Vertical syncronization pulse width VPW (reg 24h) | ||
| 390 |     ///////////////////////////////////////////////////////////////////// | ||
| 391 |     SetReg(REG_VSYNC_PULSE_WIDTH, DISP_VER_PULSE_WIDTH - 1); | ||
| 392 | |||
| 393 |     ///////////////////////////////////////////////////////////////////// | ||
| 394 |     // PALETTE INIT | ||
| 395 |     #ifdef USE_PALETTE | ||
| 396 |     PaletteInit(); | ||
| 397 |     #endif | ||
| 398 | |||
| 399 |     ///////////////////////////////////////////////////////////////////// | ||
| 400 |     // ROTATION MODE | ||
| 401 |     #if (DISP_ORIENTATION == 0) | ||
| 402 |         #define WIN_START_ADDR  0ul | ||
| 403 |         #define ROTATION        0 | ||
| 404 | |||
| 405 |     #elif (DISP_ORIENTATION == 90) | ||
| 406 |         #ifndef USE_PALETTE | ||
| 407 |             #define WIN_START_ADDR  ((((DWORD) GetMaxX() + 1) >> 1) - 1) | ||
| 408 |         #else | ||
| 409 |             #define WIN_START_ADDR  (((((DWORD) GetMaxX() + 1) * PaletteBpp) >> 5) - 1) | ||
| 410 |         #endif | ||
| 411 |         #define ROTATION    1 | ||
| 412 | |||
| 413 |     #elif (DISP_ORIENTATION == 180) | ||
| 414 |         #ifndef USE_PALETTE | ||
| 415 |             #define WIN_START_ADDR  (((((DWORD) GetMaxX() + 1) * (GetMaxY() + 1)) >> 1) - 1) | ||
| 416 |         #else | ||
| 417 |             #define WIN_START_ADDR  (((((DWORD) GetMaxX() + 1) * (GetMaxY() + 1) * PaletteBpp) >> 5) - 1) | ||
| 418 |         #endif | ||
| 419 |         #define ROTATION    2 | ||
| 420 | |||
| 421 |     #elif (DISP_ORIENTATION == 270) | ||
| 422 |         #ifndef USE_PALETTE | ||
| 423 |             #define WIN_START_ADDR  ((((DWORD) GetMaxX() + 1) * GetMaxY()) >> 1) | ||
| 424 |         #else | ||
| 425 |             #define WIN_START_ADDR  ((((DWORD) GetMaxX() + 1) * GetMaxY() * PaletteBpp) >> 5) | ||
| 426 |         #endif | ||
| 427 |         #define ROTATION    3 | ||
| 428 |     #endif | ||
| 429 | |||
| 430 |     ///////////////////////////////////////////////////////////////////// | ||
| 431 |     // Special Effects Register (reg 71h) | ||
| 432 |     ///////////////////////////////////////////////////////////////////// | ||
| 433 |     #ifndef USE_PALETTE | ||
| 434 |     SetReg(REG_SPECIAL_EFFECTS, 0x40 | ROTATION); | ||
| 435 |     #else | ||
| 436 |     SetReg(REG_SPECIAL_EFFECTS, 0x00 | ROTATION); | ||
| 437 |     #endif | ||
| 438 | |||
| 439 |     ///////////////////////////////////////////////////////////////////// | ||
| 440 |     // Main Window Display Start Address (regs 74h, 75h, 76h) | ||
| 441 |     ///////////////////////////////////////////////////////////////////// | ||
| 442 |     SetReg(REG_MAIN_WIN_DISP_START_ADDR0, WIN_START_ADDR & 0x00FF); | ||
| 443 |     SetReg(REG_MAIN_WIN_DISP_START_ADDR1, (WIN_START_ADDR >> 8) & 0x00FF); | ||
| 444 |     SetReg(REG_MAIN_WIN_DISP_START_ADDR2, (WIN_START_ADDR >> 16) & 0x00FF); | ||
| 445 | |||
| 446 |     ///////////////////////////////////////////////////////////////////// | ||
| 447 |     // Main Window Display Offset (regs 78h, 79h) | ||
| 448 |     ///////////////////////////////////////////////////////////////////// | ||
| 449 |     #ifndef USE_PALETTE | ||
| 450 |         #define WIN_OFFSET  ((GetMaxX() + 1) >> 1) | ||
| 451 |     #else | ||
| 452 |         #define WIN_OFFSET  (((GetMaxX() + 1) * PaletteBpp) >> 5) | ||
| 453 |     #endif | ||
| 454 |     SetReg(REG_MAIN_WIN_ADDR_OFFSET0, WIN_OFFSET & 0x00FF); | ||
| 455 |     SetReg(REG_MAIN_WIN_ADDR_OFFSET1, (WIN_OFFSET >> 8) & 0x00FF); | ||
| 456 | |||
| 457 |     ///////////////////////////////////////////////////////////////////// | ||
| 458 |     // Display Mode Register (reg 70h) | ||
| 459 |     ///////////////////////////////////////////////////////////////////// | ||
| 460 |     SetReg(REG_DISPLAY_MODE, 0x04);         // 16 BPP, enable RAM content to screen | ||
| 461 | |||
| 462 |     ///////////////////////////////////////////////////////////////////// | ||
| 463 | |||
| 464 |     // RGB Settings Register (reg 1a4h) | ||
| 465 |     ///////////////////////////////////////////////////////////////////// | ||
| 466 |     SetReg(REG_RGB_SETTING, 0xc0);          // RGB format | ||
| 467 | |||
| 468 |     ///////////////////////////////////////////////////////////////////// | ||
| 469 | |||
| 470 |     // Power Saving Configuration Register (reg a0h) | ||
| 471 |     ///////////////////////////////////////////////////////////////////// | ||
| 472 |     SetReg(REG_POWER_SAVE_CONFIG, 0x00);    //  wake up | ||
| 473 | |||
| 474 |     ///////////////////////////////////////////////////////////////////// | ||
| 475 | |||
| 476 |     // LSHIFT Polarity Register (reg 38h) | ||
| 477 |     ///////////////////////////////////////////////////////////////////// | ||
| 478 |     #ifdef DISP_INV_LSHIFT | ||
| 479 |     SetReg(REG_LSHIFT_POLARITY, 0x01);      // 1 means falling trigger | ||
| 480 |     #endif | ||
| 481 | |||
| 482 |     ///////////////////////////////////////////////////////////////////// | ||
| 483 |     // LCD Power Control Register (reg adh) | ||
| 484 |     // If LCD_POWER is connected to the glass DISPON or RESET | ||
| 485 |     ///////////////////////////////////////////////////////////////////// | ||
| 486 |     SetReg(REG_GPIO_STATUS_CONTROL1, 0x80); // release the glass from reset | ||
| 487 | |||
| 488 |     ///////////////////////////////////////////////////////////////////// | ||
| 489 |     // Panel TCON Programming | ||
| 490 |     ///////////////////////////////////////////////////////////////////// | ||
| 491 |     TCON_Init(); | ||
| 492 | } | ||
| 493 | |||
| 494 | /********************************************************************* | ||
| 495 | * Function: void PutPixel(SHORT x, SHORT y) | ||
| 496 | * | ||
| 497 | * PreCondition: none | ||
| 498 | * | ||
| 499 | * Input: x,y - pixel coordinates | ||
| 500 | * | ||
| 501 | * Output: none | ||
| 502 | * | ||
| 503 | * Side Effects: none | ||
| 504 | * | ||
| 505 | * Overview: puts pixel | ||
| 506 | * | ||
| 507 | * Note: none | ||
| 508 | * | ||
| 509 | ********************************************************************/ | ||
| 510 | void PutPixel(SHORT x, SHORT y) | ||
| 511 | { | ||
| 512 |     DWORD   address; | ||
| 513 | |||
| 514 |     if(_clipRgn) | ||
| 515 |     { | ||
| 516 |         if(x < _clipLeft) | ||
| 517 |             return; | ||
| 518 |         if(x > _clipRight) | ||
| 519 |             return; | ||
| 520 |         if(y < _clipTop) | ||
| 521 |             return; | ||
| 522 |         if(y > _clipBottom) | ||
| 523 |             return; | ||
| 524 |     } | ||
| 525 | |||
| 526 |     #ifndef USE_PALETTE | ||
| 527 |     address = (((DWORD) (GetMaxX() + 1)) * y + x) << 1; | ||
| 528 |     #else | ||
| 529 |     address = ((((DWORD) (GetMaxX() + 1)) * y + x) * PaletteBpp) >> 3; | ||
| 530 |     #endif | ||
| 531 |     DeviceSelect();      // enable SSD1926 | ||
| 532 |     SetAddress(address); | ||
| 533 |     WritePixel(_color); | ||
| 534 |     DeviceDeselect();    // disable SSD1926 | ||
| 535 | } | ||
| 536 | |||
| 537 | /********************************************************************* | ||
| 538 | * Function: WORD GetPixel(SHORT x, SHORT y) | ||
| 539 | * | ||
| 540 | * PreCondition: none | ||
| 541 | * | ||
| 542 | * Input: x,y - pixel coordinates  | ||
| 543 | * | ||
| 544 | * Output: pixel color | ||
| 545 | * | ||
| 546 | * Side Effects: none | ||
| 547 | * | ||
| 548 | * Overview: returns pixel color at x,y position | ||
| 549 | * | ||
| 550 | * Note: none | ||
| 551 | * | ||
| 552 | ********************************************************************/ | ||
| 553 | WORD GetPixel(SHORT x, SHORT y) | ||
| 554 | { | ||
| 555 |     DWORD   address; | ||
| 556 | |||
| 557 |     address = (((DWORD) (GetMaxX() + 1)) * y + x) << 1; | ||
| 558 | |||
| 559 |     #ifdef USE_16BIT_PMP | ||
| 560 | |||
| 561 |     WORD    value; | ||
| 562 | |||
| 563 |     DeviceSelect(); | ||
| 564 | |||
| 565 |     SetAddress(address); | ||
| 566 |     value = DeviceRead(); | ||
| 567 |     value = DeviceRead(); | ||
| 568 | |||
| 569 |     DeviceDeselect(); | ||
| 570 | |||
| 571 |     return (value); | ||
| 572 |     #else | ||
| 573 | |||
| 574 |     WORD_VAL    value; | ||
| 575 | |||
| 576 |     DeviceSelect(); | ||
| 577 | |||
| 578 |     SetAddress(address); | ||
| 579 | |||
| 580 |     #if defined(USE_GFX_PMP) | ||
| 581 | 	    // this first two reads are a dummy reads | ||
| 582 | 	    value.Val = SingleDeviceRead(); | ||
| 583 | 	    value.Val = SingleDeviceRead(); | ||
| 584 | 	    // these are the reads that will get the actual pixel data | ||
| 585 | 	    value.v[1] = SingleDeviceRead(); | ||
| 586 | 	    value.v[0] = SingleDeviceRead(); | ||
| 587 |     #endif | ||
| 588 | |||
| 589 |     #if defined(USE_GFX_EPMP) | ||
| 590 | 	    value.Val = DeviceRead(); | ||
| 591 | 	    value.v[1] = DeviceRead(); | ||
| 592 | 	    value.v[0] = DeviceRead(); | ||
| 593 |     #endif | ||
| 594 |     DeviceDeselect(); | ||
| 595 | |||
| 596 |     return (value.Val); | ||
| 597 |     #endif | ||
| 598 | } | ||
| 599 | |||
| 600 | #ifdef USE_DRV_LINE | ||
| 601 | |||
| 602 | /********************************************************************* | ||
| 603 | * Function: WORD Line2D(SHORT x1, SHORT y1, SHORT x2, SHORT y2) | ||
| 604 | * | ||
| 605 | * PreCondition: none | ||
| 606 | * | ||
| 607 | * Input: x1,y1 - starting coordinates, x2,y2 - ending coordinates | ||
| 608 | * | ||
| 609 | * Output: For NON-Blocking configuration: | ||
| 610 | *         - Returns 0 when device is busy and the shape is not yet completely drawn. | ||
| 611 | *         - Returns 1 when the shape is completely drawn. | ||
| 612 | *         For Blocking configuration: | ||
| 613 | *         - Always return 1. | ||
| 614 | * | ||
| 615 | * Side Effects: none | ||
| 616 | * | ||
| 617 | * Overview: draws solid line | ||
| 618 | * | ||
| 619 | * Note: none | ||
| 620 | * | ||
| 621 | ********************************************************************/ | ||
| 622 | static WORD Line2D(SHORT x1, SHORT y1, SHORT x2, SHORT y2) | ||
| 623 | { | ||
| 624 |         #ifndef USE_NONBLOCKING_CONFIG | ||
| 625 |     while(IsDeviceBusy() != 0); | ||
| 626 | |||
| 627 |     /* Ready */ | ||
| 628 |         #else | ||
| 629 |     if(IsDeviceBusy() != 0) | ||
| 630 |         return (0); | ||
| 631 |         #endif | ||
| 632 | |||
| 633 |     /* Line Boundaries */ | ||
| 634 |     SetReg(REG_2D_1e4, x1 & 0xFF); | ||
| 635 |     SetReg(REG_2D_1e5, (x1 >> 8) & 0xFF); | ||
| 636 |     SetReg(REG_2D_1e8, y1 & 0xFF); | ||
| 637 |     SetReg(REG_2D_1e9, (y1 >> 8) & 0xFF); | ||
| 638 |     SetReg(REG_2D_1ec, x2 & 0xFF); | ||
| 639 |     SetReg(REG_2D_1ed, (x2 >> 8) & 0xFF); | ||
| 640 |     SetReg(REG_2D_1f0, y2 & 0xFF); | ||
| 641 |     SetReg(REG_2D_1f1, (y2 >> 8) & 0xFF); | ||
| 642 | |||
| 643 |     /* Source & Destination Window Start Addresses */ | ||
| 644 |     SetReg(REG_2D_1d4, 0); | ||
| 645 |     SetReg(REG_2D_1d5, 0); | ||
| 646 |     SetReg(REG_2D_1d6, 0); | ||
| 647 |     SetReg(REG_2D_1f4, 0); | ||
| 648 |     SetReg(REG_2D_1f5, 0); | ||
| 649 |     SetReg(REG_2D_1f6, 0); | ||
| 650 | |||
| 651 |     /* Display width */ | ||
| 652 |     SetReg(REG_2D_1f8, (GetMaxX() + 1) & 0xFF); | ||
| 653 |     SetReg(REG_2D_1f9, ((GetMaxX() + 1) >> 8) & 0xFF); | ||
| 654 | |||
| 655 |     /* Display 2d width */ | ||
| 656 |     SetReg(REG_2D_1d8, (GetMaxY() + 1) & 0xFF); | ||
| 657 |     SetReg(REG_2D_1d9, ((GetMaxY() + 1) >> 8) & 0xFF); | ||
| 658 | |||
| 659 |     /* Set Color */ | ||
| 660 |     SetReg(REG_2D_1fe, RED8(_color)); | ||
| 661 |     SetReg(REG_2D_1fd, GREEN8(_color)); | ||
| 662 |     SetReg(REG_2D_1fc, BLUE8(_color)); | ||
| 663 | |||
| 664 |     /* 16bpp */ | ||
| 665 |     SetReg(REG_2D_1dd, 0x00); | ||
| 666 | |||
| 667 |     /* Line command */ | ||
| 668 |     SetReg(REG_2D_1d1, 0x01); | ||
| 669 | |||
| 670 |     /* Draw2d command */ | ||
| 671 |     SetReg(REG_2D_1d2, 0x01); | ||
| 672 | |||
| 673 |         #ifndef USE_NONBLOCKING_CONFIG | ||
| 674 |     while(IsDeviceBusy() != 0); | ||
| 675 | |||
| 676 |     /* Ready */ | ||
| 677 |         #endif | ||
| 678 |     return (1); | ||
| 679 | } | ||
| 680 | |||
| 681 | /********************************************************************* | ||
| 682 | * Function: WORD Line(SHORT x1, SHORT y1, SHORT x2, SHORT y2) | ||
| 683 | * | ||
| 684 | * PreCondition: none | ||
| 685 | * | ||
| 686 | * Input: x1,y1 - starting coordinates, x2,y2 - ending coordinates | ||
| 687 | * | ||
| 688 | * Output: For NON-Blocking configuration: | ||
| 689 | *         - Returns 0 when device is busy and the shape is not yet completely drawn. | ||
| 690 | *         - Returns 1 when the shape is completely drawn. | ||
| 691 | *         For Blocking configuration: | ||
| 692 | *         - Always return 1. | ||
| 693 | * | ||
| 694 | * Side Effects: none | ||
| 695 | * | ||
| 696 | * Overview: draws line | ||
| 697 | * | ||
| 698 | * Note: none | ||
| 699 | * | ||
| 700 | ********************************************************************/ | ||
| 701 | WORD Line(SHORT x1, SHORT y1, SHORT x2, SHORT y2) | ||
| 702 | { | ||
| 703 |         #ifdef USE_PALETTE | ||
| 704 |             #error "In SSD1926 2D-Acceleration is not supported in Palette mode. Use Line function of Primitive layer" | ||
| 705 |         #endif | ||
| 706 | |||
| 707 |     SHORT   deltaX, deltaY; | ||
| 708 |     SHORT   error, stepErrorLT, stepErrorGE; | ||
| 709 |     SHORT   stepX, stepY; | ||
| 710 |     SHORT   steep; | ||
| 711 |     SHORT   temp; | ||
| 712 |     SHORT   style, type; | ||
| 713 | |||
| 714 |     stepX = 0; | ||
| 715 |     deltaX = x2 - x1; | ||
| 716 |     if(deltaX < 0) | ||
| 717 |     { | ||
| 718 |         deltaX = -deltaX; | ||
| 719 |         --stepX; | ||
| 720 |     } | ||
| 721 |     else | ||
| 722 |     { | ||
| 723 |         ++stepX; | ||
| 724 |     } | ||
| 725 | |||
| 726 |     stepY = 0; | ||
| 727 |     deltaY = y2 - y1; | ||
| 728 |     if(deltaY < 0) | ||
| 729 |     { | ||
| 730 |         deltaY = -deltaY; | ||
| 731 |         --stepY; | ||
| 732 |     } | ||
| 733 |     else | ||
| 734 |     { | ||
| 735 |         ++stepY; | ||
| 736 |     } | ||
| 737 | |||
| 738 |     steep = 0; | ||
| 739 |     if(deltaX < deltaY) | ||
| 740 |     { | ||
| 741 |         ++steep; | ||
| 742 |     } | ||
| 743 | |||
| 744 |         #ifndef USE_NONBLOCKING_CONFIG | ||
| 745 |     while(IsDeviceBusy() != 0); | ||
| 746 | |||
| 747 |     /* Ready */ | ||
| 748 |         #else | ||
| 749 |     if(IsDeviceBusy() != 0) | ||
| 750 |         return (0); | ||
| 751 |         #endif | ||
| 752 |     if(_lineType == 0) | ||
| 753 |     { | ||
| 754 |         if(!Line2D(x1, y1, x2, y2)) | ||
| 755 |             return (0); | ||
| 756 |         if(_lineThickness) | ||
| 757 |         { | ||
| 758 |             if(steep) | ||
| 759 |             { | ||
| 760 |                 while(!Line2D(x1 + 1, y1, x2 + 1, y2)); | ||
| 761 |                 while(!Line2D(x1 - 1, y1, x2 - 1, y2)); | ||
| 762 |             } | ||
| 763 |             else | ||
| 764 |             { | ||
| 765 |                 while(!Line2D(x1, y1 + 1, x2, y2 + 1)); | ||
| 766 |                 while(!Line2D(x1, y1 - 1, x2, y2 - 1)); | ||
| 767 |             } | ||
| 768 |         } | ||
| 769 | |||
| 770 |         return (1); | ||
| 771 |     } | ||
| 772 | |||
| 773 |     // Move cursor | ||
| 774 |     MoveTo(x2, y2); | ||
| 775 | |||
| 776 |     if(x1 == x2) | ||
| 777 |     { | ||
| 778 |         if(y1 > y2) | ||
| 779 |         { | ||
| 780 |             temp = y1; | ||
| 781 |             y1 = y2; | ||
| 782 |             y2 = temp; | ||
| 783 |         } | ||
| 784 | |||
| 785 |         style = 0; | ||
| 786 |         type = 1; | ||
| 787 |         for(temp = y1; temp < y2 + 1; temp++) | ||
| 788 |         { | ||
| 789 |             if((++style) == _lineType) | ||
| 790 |             { | ||
| 791 |                 type ^= 1; | ||
| 792 |                 style = 0; | ||
| 793 |             } | ||
| 794 | |||
| 795 |             if(type) | ||
| 796 |             { | ||
| 797 |                 PutPixel(x1, temp); | ||
| 798 |                 if(_lineThickness) | ||
| 799 |                 { | ||
| 800 |                     PutPixel(x1 + 1, temp); | ||
| 801 |                     PutPixel(x1 - 1, temp); | ||
| 802 |                 } | ||
| 803 |             } | ||
| 804 |         } | ||
| 805 | |||
| 806 |         return (1); | ||
| 807 |     } | ||
| 808 | |||
| 809 |     if(y1 == y2) | ||
| 810 |     { | ||
| 811 |         if(x1 > x2) | ||
| 812 |         { | ||
| 813 |             temp = x1; | ||
| 814 |             x1 = x2; | ||
| 815 |             x2 = temp; | ||
| 816 |         } | ||
| 817 | |||
| 818 |         style = 0; | ||
| 819 |         type = 1; | ||
| 820 |         for(temp = x1; temp < x2 + 1; temp++) | ||
| 821 |         { | ||
| 822 |             if((++style) == _lineType) | ||
| 823 |             { | ||
| 824 |                 type ^= 1; | ||
| 825 |                 style = 0; | ||
| 826 |             } | ||
| 827 | |||
| 828 |             if(type) | ||
| 829 |             { | ||
| 830 |                 PutPixel(temp, y1); | ||
| 831 |                 if(_lineThickness) | ||
| 832 |                 { | ||
| 833 |                     PutPixel(temp, y1 + 1); | ||
| 834 |                     PutPixel(temp, y1 - 1); | ||
| 835 |                 } | ||
| 836 |             } | ||
| 837 |         } | ||
| 838 | |||
| 839 |         return (1); | ||
| 840 |     } | ||
| 841 | |||
| 842 |     if(deltaX < deltaY) | ||
| 843 |     { | ||
| 844 |         temp = deltaX; | ||
| 845 |         deltaX = deltaY; | ||
| 846 |         deltaY = temp; | ||
| 847 |         temp = x1; | ||
| 848 |         x1 = y1; | ||
| 849 |         y1 = temp; | ||
| 850 |         temp = stepX; | ||
| 851 |         stepX = stepY; | ||
| 852 |         stepY = temp; | ||
| 853 |         PutPixel(y1, x1); | ||
| 854 |     } | ||
| 855 |     else | ||
| 856 |     { | ||
| 857 |         PutPixel(x1, y1); | ||
| 858 |     } | ||
| 859 | |||
| 860 |     // If the current error greater or equal zero | ||
| 861 |     stepErrorGE = deltaX << 1; | ||
| 862 | |||
| 863 |     // If the current error less than zero | ||
| 864 |     stepErrorLT = deltaY << 1; | ||
| 865 | |||
| 866 |     // Error for the first pixel | ||
| 867 |     error = stepErrorLT - deltaX; | ||
| 868 | |||
| 869 |     style = 0; | ||
| 870 |     type = 1; | ||
| 871 | |||
| 872 |     while(--deltaX >= 0) | ||
| 873 |     { | ||
| 874 |         if(error >= 0) | ||
| 875 |         { | ||
| 876 |             y1 += stepY; | ||
| 877 |             error -= stepErrorGE; | ||
| 878 |         } | ||
| 879 | |||
| 880 |         x1 += stepX; | ||
| 881 |         error += stepErrorLT; | ||
| 882 | |||
| 883 |         if((++style) == _lineType) | ||
| 884 |         { | ||
| 885 |             type ^= 1; | ||
| 886 |             style = 0; | ||
| 887 |         } | ||
| 888 | |||
| 889 |         if(type) | ||
| 890 |         { | ||
| 891 |             if(steep) | ||
| 892 |             { | ||
| 893 |                 PutPixel(y1, x1); | ||
| 894 |                 if(_lineThickness) | ||
| 895 |                 { | ||
| 896 |                     PutPixel(y1 + 1, x1); | ||
| 897 |                     PutPixel(y1 - 1, x1); | ||
| 898 |                 } | ||
| 899 |             } | ||
| 900 |             else | ||
| 901 |             { | ||
| 902 |                 PutPixel(x1, y1); | ||
| 903 |                 if(_lineThickness) | ||
| 904 |                 { | ||
| 905 |                     PutPixel(x1, y1 + 1); | ||
| 906 |                     PutPixel(x1, y1 - 1); | ||
| 907 |                 } | ||
| 908 |             } | ||
| 909 |         } | ||
| 910 |     }   // end of while | ||
| 911 | |||
| 912 |     return (1); | ||
| 913 | } | ||
| 914 | |||
| 915 | #endif | ||
| 916 | #ifdef USE_DRV_BAR | ||
| 917 | |||
| 918 | /********************************************************************* | ||
| 919 | * Function: WORD Bar(SHORT left, SHORT top, SHORT right, SHORT bottom) | ||
| 920 | * | ||
| 921 | * PreCondition: none | ||
| 922 | * | ||
| 923 | * Input: left,top - top left corner coordinates, | ||
| 924 | *        right,bottom - bottom right corner coordinates | ||
| 925 | * | ||
| 926 | * Output: For NON-Blocking configuration: | ||
| 927 | *         - Returns 0 when device is busy and the shape is not yet completely drawn. | ||
| 928 | *         - Returns 1 when the shape is completely drawn. | ||
| 929 | *         For Blocking configuration: | ||
| 930 | *         - Always return 1. | ||
| 931 | * | ||
| 932 | * Side Effects: none | ||
| 933 | * | ||
| 934 | * Overview: draws rectangle filled with current color | ||
| 935 | * | ||
| 936 | * Note: none | ||
| 937 | * | ||
| 938 | ********************************************************************/ | ||
| 939 | WORD Bar(SHORT left, SHORT top, SHORT right, SHORT bottom) | ||
| 940 | { | ||
| 941 |         #ifdef USE_PALETTE | ||
| 942 | |||
| 943 |     DWORD           address; | ||
| 944 |     register SHORT  x, y; | ||
| 945 | |||
| 946 |     if(_clipRgn) | ||
| 947 |     { | ||
| 948 |         if(left < _clipLeft) | ||
| 949 |             left = _clipLeft; | ||
| 950 |         if(right > _clipRight) | ||
| 951 |             right = _clipRight; | ||
| 952 |         if(top < _clipTop) | ||
| 953 |             top = _clipTop; | ||
| 954 |         if(bottom > _clipBottom) | ||
| 955 |             bottom = _clipBottom; | ||
| 956 |     } | ||
| 957 | |||
| 958 |             #ifndef USE_PALETTE | ||
| 959 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 960 |             #else | ||
| 961 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 962 |             #endif | ||
| 963 |     CS_LAT_BIT = 0; | ||
| 964 |     for(y = top; y < bottom + 1; y++) | ||
| 965 |     { | ||
| 966 |         SetAddress(address); | ||
| 967 |         for(x = left; x < right + 1; x++) | ||
| 968 |         { | ||
| 969 |             WritePixel(_color); | ||
| 970 |         } | ||
| 971 | |||
| 972 |                 #ifndef USE_PALETTE | ||
| 973 |         address += (GetMaxX() + 1) << 1; | ||
| 974 |                 #else | ||
| 975 |         address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 976 |                 #endif | ||
| 977 |     } | ||
| 978 | |||
| 979 |     CS_LAT_BIT = 1; | ||
| 980 | |||
| 981 |         #else | ||
| 982 | |||
| 983 |     DWORD   address; | ||
| 984 |     SHORT   width, height; | ||
| 985 | |||
| 986 |             #ifndef USE_NONBLOCKING_CONFIG | ||
| 987 |     while(IsDeviceBusy() != 0); | ||
| 988 | |||
| 989 |     /* Ready */ | ||
| 990 |             #else | ||
| 991 |     if(IsDeviceBusy() != 0) | ||
| 992 |         return (0); | ||
| 993 |             #endif | ||
| 994 |     if(left > right) | ||
| 995 |     { | ||
| 996 |         return (1); /* Don't draw but return 1 */ | ||
| 997 |     } | ||
| 998 | |||
| 999 |     if(top > bottom) | ||
| 1000 |     { | ||
| 1001 |         return (1); /* Don't draw but return 1 */ | ||
| 1002 |     } | ||
| 1003 | |||
| 1004 |     if(_clipRgn) | ||
| 1005 |     { | ||
| 1006 |         if(left < _clipLeft) | ||
| 1007 |             left = _clipLeft; | ||
| 1008 |         if(right > _clipRight) | ||
| 1009 |             right = _clipRight; | ||
| 1010 |         if(top < _clipTop) | ||
| 1011 |             top = _clipTop; | ||
| 1012 |         if(bottom > _clipBottom) | ||
| 1013 |             bottom = _clipBottom; | ||
| 1014 |     } | ||
| 1015 | |||
| 1016 |     width = right - left + 1; | ||
| 1017 |     height = bottom - top + 1; | ||
| 1018 | |||
| 1019 |     address = top * (GetMaxX() + (DWORD) 1) + left; | ||
| 1020 | |||
| 1021 |     PutPixel(left, top); | ||
| 1022 | |||
| 1023 |     /* Source, Destination & Brush Window Start Addresses */ | ||
| 1024 |     SetReg(REG_2D_1d4, address & 0xFF); | ||
| 1025 |     SetReg(REG_2D_1d5, (address >> 8) & 0xFF); | ||
| 1026 |     SetReg(REG_2D_1d6, (address >> 16) & 0xFF); | ||
| 1027 |     SetReg(REG_2D_1f4, address & 0xFF); | ||
| 1028 |     SetReg(REG_2D_1f5, (address >> 8) & 0xFF); | ||
| 1029 |     SetReg(REG_2D_1f6, (address >> 16) & 0xFF); | ||
| 1030 |     SetReg(REG_2D_204, address & 0xFF); | ||
| 1031 |     SetReg(REG_2D_205, (address >> 8) & 0xFF); | ||
| 1032 |     SetReg(REG_2D_206, (address >> 16) & 0xFF); | ||
| 1033 | |||
| 1034 |     /* Source & Destination Window Width */ | ||
| 1035 |     SetReg(REG_2D_1ec, width & 0xFF); | ||
| 1036 |     SetReg(REG_2D_1ed, (width >> 8) & 0xFF); | ||
| 1037 |     SetReg(REG_2D_1e4, width & 0xFF); | ||
| 1038 |     SetReg(REG_2D_1e5, (width >> 8) & 0xFF); | ||
| 1039 | |||
| 1040 |     /* Source & Destination Window Height */ | ||
| 1041 |     SetReg(REG_2D_1f0, height & 0xFF); | ||
| 1042 |     SetReg(REG_2D_1f1, (height >> 8) & 0xFF); | ||
| 1043 |     SetReg(REG_2D_1e8, height & 0xFF); | ||
| 1044 |     SetReg(REG_2D_1e9, (height >> 8) & 0xFF); | ||
| 1045 | |||
| 1046 |     /* Brush width */ | ||
| 1047 |     SetReg(REG_2D_214, 1); | ||
| 1048 |     SetReg(REG_2D_215, 0); | ||
| 1049 | |||
| 1050 |     /* Brush height */ | ||
| 1051 |     SetReg(REG_2D_218, 1); | ||
| 1052 |     SetReg(REG_2D_219, 0); | ||
| 1053 | |||
| 1054 |     /* Display width */ | ||
| 1055 |     SetReg(REG_2D_1f8, (GetMaxX() + 1) & 0xFF); | ||
| 1056 |     SetReg(REG_2D_1f9, ((GetMaxX() + 1) >> 8) & 0xFF); | ||
| 1057 | |||
| 1058 |     /* Display 2d width */ | ||
| 1059 |     SetReg(REG_2D_1d8, (GetMaxX() + 1) & 0xFF); | ||
| 1060 |     SetReg(REG_2D_1d9, ((GetMaxX() + 1) >> 8) & 0xFF); | ||
| 1061 | |||
| 1062 |     /* ROP3 Command */ | ||
| 1063 |     SetReg(REG_2D_1fc, 0xF0); | ||
| 1064 | |||
| 1065 |     /* 16bpp */ | ||
| 1066 |     SetReg(REG_2D_1dd, 0x00); | ||
| 1067 | |||
| 1068 |     /* ROP command */ | ||
| 1069 |     SetReg(REG_2D_1d1, 0x09); | ||
| 1070 | |||
| 1071 |     /* Draw2d command */ | ||
| 1072 |     SetReg(REG_2D_1d2, 0x01); | ||
| 1073 | |||
| 1074 |             #ifndef USE_NONBLOCKING_CONFIG | ||
| 1075 |     while(IsDeviceBusy() != 0); | ||
| 1076 | |||
| 1077 |     /* Ready */ | ||
| 1078 |             #endif | ||
| 1079 |     return (1); | ||
| 1080 |         #endif | ||
| 1081 | } | ||
| 1082 | |||
| 1083 | #endif | ||
| 1084 | |||
| 1085 | #ifdef USE_DRV_CIRCLE | ||
| 1086 | |||
| 1087 | /*************************************************************************** | ||
| 1088 | * Function: WORD Circle(SHORT x, SHORT y, SHORT radius) | ||
| 1089 | * | ||
| 1090 | * Overview: This macro draws a circle with the given center and radius. | ||
| 1091 | * | ||
| 1092 | * Input: x - Center x position.  | ||
| 1093 | *		 y - Center y position. | ||
| 1094 | *		 radius - the radius of the circle. | ||
| 1095 | * | ||
| 1096 | * Output: For NON-Blocking configuration: | ||
| 1097 | *         - Returns 0 when device is busy and the shape is not yet completely drawn. | ||
| 1098 | *         - Returns 1 when the shape is completely drawn. | ||
| 1099 | *         For Blocking configuration: | ||
| 1100 | *         - Always return 1. | ||
| 1101 | * | ||
| 1102 | * Side Effects: none | ||
| 1103 | * | ||
| 1104 | ********************************************************************/ | ||
| 1105 | WORD Circle(SHORT x, SHORT y, SHORT radius) | ||
| 1106 | { | ||
| 1107 |         #define Rx      (WORD) radius | ||
| 1108 |         #define Ry      (WORD) radius | ||
| 1109 |         #define Angle1  (WORD) 0 | ||
| 1110 |         #define Angle2  (WORD) 0x0200 | ||
| 1111 | |||
| 1112 |         #ifndef USE_NONBLOCKING_CONFIG | ||
| 1113 |     while(IsDeviceBusy() != 0); | ||
| 1114 | |||
| 1115 |     /* Ready */ | ||
| 1116 |         #else | ||
| 1117 |     if(IsDeviceBusy() != 0) | ||
| 1118 |         return (0); | ||
| 1119 |         #endif | ||
| 1120 | |||
| 1121 |     /* Ellipse Parameters & Y-Limit */ | ||
| 1122 |     SetReg(REG_2D_1d4, x & 0xFF); | ||
| 1123 |     SetReg(REG_2D_1d5, ((((GetMaxY() + (WORD) 1) << 1) & 0xFE) + ((x >> 8) & 0x01))); | ||
| 1124 |     SetReg(REG_2D_1d6, ((GetMaxY() + (WORD) 1) >> 7) & 0x03); | ||
| 1125 | |||
| 1126 |     SetReg(REG_2D_1e4, y & 0xFF); | ||
| 1127 |     SetReg(REG_2D_1e5, (y >> 8) & 0xFF); | ||
| 1128 | |||
| 1129 |     SetReg(REG_2D_1e8, Rx & 0xFF); | ||
| 1130 |     SetReg(REG_2D_1e9, (Rx >> 8) & 0xFF); | ||
| 1131 | |||
| 1132 |     SetReg(REG_2D_1d8, Ry & 0xFF); | ||
| 1133 |     SetReg(REG_2D_1d9, (Ry >> 8) & 0xFF); | ||
| 1134 | |||
| 1135 |     SetReg(REG_2D_1ec, Angle1 & 0xFF); | ||
| 1136 |     SetReg(REG_2D_1ed, (Angle1 >> 8) & 0xFF); | ||
| 1137 | |||
| 1138 |     SetReg(REG_2D_1f0, Angle2 & 0xFF); | ||
| 1139 |     SetReg(REG_2D_1f1, (Angle2 >> 8) & 0xFF); | ||
| 1140 | |||
| 1141 |     /* Destination Window Start Addresses */ | ||
| 1142 |     SetReg(REG_2D_1f4, 0); | ||
| 1143 |     SetReg(REG_2D_1f5, 0); | ||
| 1144 |     SetReg(REG_2D_1f6, 0); | ||
| 1145 | |||
| 1146 |     /* Destination Window Width */ | ||
| 1147 |     SetReg(REG_2D_1f8, (GetMaxX() + 1) & 0xFF); | ||
| 1148 |     SetReg(REG_2D_1f9, ((GetMaxX() + 1) >> 8) & 0xFF); | ||
| 1149 | |||
| 1150 |     /* Set Color */ | ||
| 1151 |     SetReg(REG_2D_1fe, RED8(_color)); | ||
| 1152 |     SetReg(REG_2D_1fd, GREEN8(_color)); | ||
| 1153 |     SetReg(REG_2D_1fc, BLUE8(_color)); | ||
| 1154 | |||
| 1155 |     /* 16bpp */ | ||
| 1156 |     SetReg(REG_2D_1dd, 0x00); | ||
| 1157 | |||
| 1158 |     /* Ellipse command */ | ||
| 1159 |     SetReg(REG_2D_1d1, 0x03); | ||
| 1160 | |||
| 1161 |     /* Draw2d command */ | ||
| 1162 |     SetReg(REG_2D_1d2, 0x01); | ||
| 1163 | |||
| 1164 |         #ifndef USE_NONBLOCKING_CONFIG | ||
| 1165 |     while(IsDeviceBusy() != 0); | ||
| 1166 | |||
| 1167 |     /* Ready */ | ||
| 1168 |         #endif | ||
| 1169 |     return (1); | ||
| 1170 | } | ||
| 1171 | |||
| 1172 | #endif | ||
| 1173 | #ifdef USE_DRV_CLEARDEVICE | ||
| 1174 | |||
| 1175 | /********************************************************************* | ||
| 1176 | * Function: void ClearDevice(void) | ||
| 1177 | * | ||
| 1178 | * PreCondition: none | ||
| 1179 | * | ||
| 1180 | * Input: none | ||
| 1181 | * | ||
| 1182 | * Output: none | ||
| 1183 | * | ||
| 1184 | * Side Effects: none | ||
| 1185 | * | ||
| 1186 | * Overview: clears screen with current color  | ||
| 1187 | * | ||
| 1188 | * Note: none | ||
| 1189 | * | ||
| 1190 | ********************************************************************/ | ||
| 1191 | void ClearDevice(void) | ||
| 1192 | { | ||
| 1193 |         #ifdef USE_PALETTE | ||
| 1194 | |||
| 1195 |     DWORD   counter; | ||
| 1196 | |||
| 1197 |     CS_LAT_BIT = 0; | ||
| 1198 |     SetAddress(0); | ||
| 1199 |     SetAddress(0); | ||
| 1200 |     for(counter = 0; counter < (DWORD) (GetMaxX() + 1) * (GetMaxY() + 1); counter++) | ||
| 1201 |     { | ||
| 1202 |         WritePixel(_color); | ||
| 1203 |     } | ||
| 1204 | |||
| 1205 |     CS_LAT_BIT = 1; | ||
| 1206 | |||
| 1207 |         #else | ||
| 1208 |     while(GetReg(REG_2D_220) == 0); | ||
| 1209 |     while(!Bar(0, 0, GetMaxX(), GetMaxY())); | ||
| 1210 |     while(GetReg(REG_2D_220) == 0); | ||
| 1211 | |||
| 1212 |     /* Ready */ | ||
| 1213 |         #endif | ||
| 1214 | } | ||
| 1215 | |||
| 1216 | #endif | ||
| 1217 | |||
| 1218 | /********************************************************************* | ||
| 1219 | * Function: WORD PutImage(SHORT left, SHORT top, void* bitmap, BYTE stretch) | ||
| 1220 | * | ||
| 1221 | * PreCondition: none | ||
| 1222 | * | ||
| 1223 | * Input: left,top - left top image corner, | ||
| 1224 | *        bitmap - image pointer, | ||
| 1225 | *        stretch - image stretch factor | ||
| 1226 | * | ||
| 1227 | * Output: For NON-Blocking configuration: | ||
| 1228 | *         - Returns 0 when device is busy and the image is not yet completely drawn. | ||
| 1229 | *         - Returns 1 when the image is completely drawn. | ||
| 1230 | *         For Blocking configuration: | ||
| 1231 | *         - Always return 1. | ||
| 1232 | * | ||
| 1233 | * Side Effects: none | ||
| 1234 | * | ||
| 1235 | * Overview: outputs image starting from left,top coordinates | ||
| 1236 | * | ||
| 1237 | * Note: image must be located in flash | ||
| 1238 | * | ||
| 1239 | ********************************************************************/ | ||
| 1240 | WORD PutImage(SHORT left, SHORT top, void *bitmap, BYTE stretch) | ||
| 1241 | { | ||
| 1242 | #if defined (USE_BITMAP_FLASH) || defined (USE_BITMAP_EXTERNAL) | ||
| 1243 |     FLASH_BYTE  *flashAddress; | ||
| 1244 |     BYTE        colorDepth; | ||
| 1245 | #endif | ||
| 1246 |     WORD        colorTemp; | ||
| 1247 | |||
| 1248 |     #ifndef USE_NONBLOCKING_CONFIG | ||
| 1249 |     while(IsDeviceBusy() != 0); | ||
| 1250 | |||
| 1251 |     /* Ready */ | ||
| 1252 |     #else | ||
| 1253 |     if(IsDeviceBusy() != 0) | ||
| 1254 |         return (0); | ||
| 1255 |     #endif | ||
| 1256 | |||
| 1257 |     // Save current color | ||
| 1258 |     colorTemp = _color; | ||
| 1259 | |||
| 1260 |     switch(*((SHORT *)bitmap)) | ||
| 1261 |     { | ||
| 1262 |             #ifdef USE_BITMAP_FLASH | ||
| 1263 | |||
| 1264 |         case FLASH: | ||
| 1265 | |||
| 1266 |             // Image address | ||
| 1267 |             flashAddress = ((BITMAP_FLASH *)bitmap)->address; | ||
| 1268 | |||
| 1269 |             // Read color depth | ||
| 1270 |             colorDepth = *(flashAddress + 1); | ||
| 1271 | |||
| 1272 |             // Draw picture | ||
| 1273 |             switch(colorDepth) | ||
| 1274 |             { | ||
| 1275 |                 case 1:     PutImage1BPP(left, top, flashAddress, stretch); break; | ||
| 1276 |                 case 4:     PutImage4BPP(left, top, flashAddress, stretch); break; | ||
| 1277 |                 case 8:     PutImage8BPP(left, top, flashAddress, stretch); break; | ||
| 1278 |                 case 16:    PutImage16BPP(left, top, flashAddress, stretch); break; | ||
| 1279 |             } | ||
| 1280 | |||
| 1281 |             break; | ||
| 1282 |             #endif | ||
| 1283 |             #ifdef USE_BITMAP_EXTERNAL | ||
| 1284 | |||
| 1285 |         case EXTERNAL: | ||
| 1286 | |||
| 1287 |             // Get color depth | ||
| 1288 |             ExternalMemoryCallback(bitmap, 1, 1, &colorDepth); | ||
| 1289 | |||
| 1290 |             // Draw picture | ||
| 1291 |             switch(colorDepth) | ||
| 1292 |             { | ||
| 1293 |                 case 1:     PutImage1BPPExt(left, top, bitmap, stretch); break; | ||
| 1294 |                 case 4:     PutImage4BPPExt(left, top, bitmap, stretch); break; | ||
| 1295 |                 case 8:     PutImage8BPPExt(left, top, bitmap, stretch); break; | ||
| 1296 |                 case 16:    PutImage16BPPExt(left, top, bitmap, stretch); break; | ||
| 1297 |                 default:    break; | ||
| 1298 |             } | ||
| 1299 | |||
| 1300 |             break; | ||
| 1301 |             #endif | ||
| 1302 | |||
| 1303 |         default: | ||
| 1304 |             break; | ||
| 1305 |     } | ||
| 1306 | |||
| 1307 |     // Restore current color | ||
| 1308 |     _color = colorTemp; | ||
| 1309 |     return (1); | ||
| 1310 | } | ||
| 1311 | |||
| 1312 | #ifdef USE_BITMAP_FLASH | ||
| 1313 | |||
| 1314 | /********************************************************************* | ||
| 1315 | * Function: void PutImage1BPP(SHORT left, SHORT top, FLASH_BYTE* bitmap, BYTE stretch) | ||
| 1316 | * | ||
| 1317 | * PreCondition: none | ||
| 1318 | * | ||
| 1319 | * Input: left,top - left top image corner, | ||
| 1320 | *        bitmap - image pointer, | ||
| 1321 | *        stretch - image stretch factor | ||
| 1322 | * | ||
| 1323 | * Output: none | ||
| 1324 | * | ||
| 1325 | * Side Effects: none | ||
| 1326 | * | ||
| 1327 | * Overview: outputs monochrome image starting from left,top coordinates | ||
| 1328 | * | ||
| 1329 | * Note: image must be located in flash | ||
| 1330 | * | ||
| 1331 | ********************************************************************/ | ||
| 1332 | void PutImage1BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch) | ||
| 1333 | { | ||
| 1334 |     register DWORD      address; | ||
| 1335 |     register FLASH_BYTE *flashAddress; | ||
| 1336 |     register FLASH_BYTE *tempFlashAddress; | ||
| 1337 |     BYTE                temp = 0; | ||
| 1338 |     WORD                sizeX, sizeY; | ||
| 1339 |     WORD                x, y; | ||
| 1340 |     BYTE                stretchX, stretchY; | ||
| 1341 |     WORD                pallete[2]; | ||
| 1342 |     BYTE                mask; | ||
| 1343 | |||
| 1344 |     // Move pointer to size information | ||
| 1345 |     flashAddress = bitmap + 2; | ||
| 1346 | |||
| 1347 |     // Set start address | ||
| 1348 |         #ifndef USE_PALETTE | ||
| 1349 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 1350 |         #else | ||
| 1351 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 1352 |         #endif | ||
| 1353 | |||
| 1354 |     // Read image size | ||
| 1355 |     sizeY = *((FLASH_WORD *)flashAddress); | ||
| 1356 |     flashAddress += 2; | ||
| 1357 |     sizeX = *((FLASH_WORD *)flashAddress); | ||
| 1358 |     flashAddress += 2; | ||
| 1359 |     pallete[0] = *((FLASH_WORD *)flashAddress); | ||
| 1360 |     flashAddress += 2; | ||
| 1361 |     pallete[1] = *((FLASH_WORD *)flashAddress); | ||
| 1362 |     flashAddress += 2; | ||
| 1363 | |||
| 1364 |     CS_LAT_BIT = 0; | ||
| 1365 |     for(y = 0; y < sizeY; y++) | ||
| 1366 |     { | ||
| 1367 |         tempFlashAddress = flashAddress; | ||
| 1368 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 1369 |         { | ||
| 1370 |             flashAddress = tempFlashAddress; | ||
| 1371 |             SetAddress(address); | ||
| 1372 |             mask = 0; | ||
| 1373 |             for(x = 0; x < sizeX; x++) | ||
| 1374 |             { | ||
| 1375 | |||
| 1376 |                 // Read 8 pixels from flash | ||
| 1377 |                 if(mask == 0) | ||
| 1378 |                 { | ||
| 1379 |                     temp = *flashAddress; | ||
| 1380 |                     flashAddress++; | ||
| 1381 |                     mask = 0x80; | ||
| 1382 |                 } | ||
| 1383 | |||
| 1384 |                 // Set color | ||
| 1385 |                 if(mask & temp) | ||
| 1386 |                 { | ||
| 1387 |                     #ifdef USE_PALETTE | ||
| 1388 |                     if(IsPaletteEnabled()) | ||
| 1389 |                     { | ||
| 1390 |                         SetColor(1); | ||
| 1391 |                     } | ||
| 1392 |                     else | ||
| 1393 |                     #endif | ||
| 1394 |                     { | ||
| 1395 |                         SetColor(pallete[1]); | ||
| 1396 |                     } | ||
| 1397 |                 } | ||
| 1398 |                 else | ||
| 1399 |                 { | ||
| 1400 |                     #ifdef USE_PALETTE | ||
| 1401 |                     if(IsPaletteEnabled()) | ||
| 1402 |                     { | ||
| 1403 |                         SetColor(0); | ||
| 1404 |                     } | ||
| 1405 |                     else | ||
| 1406 |                     #endif | ||
| 1407 |                     { | ||
| 1408 |                         SetColor(pallete[0]); | ||
| 1409 |                     } | ||
| 1410 |                 } | ||
| 1411 | |||
| 1412 |                 // Write pixel to screen | ||
| 1413 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 1414 |                 { | ||
| 1415 |                     WritePixel(_color); | ||
| 1416 |                 } | ||
| 1417 | |||
| 1418 |                 // Shift to the next pixel | ||
| 1419 |                 mask >>= 1; | ||
| 1420 |             } | ||
| 1421 | |||
| 1422 |                 #ifndef USE_PALETTE | ||
| 1423 |             address += (GetMaxX() + 1) << 1; | ||
| 1424 |                 #else | ||
| 1425 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 1426 |                 #endif | ||
| 1427 |         } | ||
| 1428 |     } | ||
| 1429 | |||
| 1430 |     CS_LAT_BIT = 1; | ||
| 1431 | } | ||
| 1432 | |||
| 1433 | /********************************************************************* | ||
| 1434 | * Function: void PutImage4BPP(SHORT left, SHORT top, FLASH_BYTE* bitmap, BYTE stretch) | ||
| 1435 | * | ||
| 1436 | * PreCondition: none | ||
| 1437 | * | ||
| 1438 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 1439 | *        stretch - image stretch factor | ||
| 1440 | * | ||
| 1441 | * Output: none | ||
| 1442 | * | ||
| 1443 | * Side Effects: none | ||
| 1444 | * | ||
| 1445 | * Overview: outputs 16 color image starting from left,top coordinates | ||
| 1446 | * | ||
| 1447 | * Note: image must be located in flash | ||
| 1448 | * | ||
| 1449 | ********************************************************************/ | ||
| 1450 | void PutImage4BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch) | ||
| 1451 | { | ||
| 1452 |     register DWORD      address; | ||
| 1453 |     register FLASH_BYTE *flashAddress; | ||
| 1454 |     register FLASH_BYTE *tempFlashAddress; | ||
| 1455 |     WORD                sizeX, sizeY; | ||
| 1456 |     register WORD       x, y; | ||
| 1457 |     BYTE                temp = 0; | ||
| 1458 |     register BYTE       stretchX, stretchY; | ||
| 1459 |     WORD                pallete[16]; | ||
| 1460 |     WORD                counter; | ||
| 1461 | |||
| 1462 |     // Move pointer to size information | ||
| 1463 |     flashAddress = bitmap + 2; | ||
| 1464 | |||
| 1465 |     // Set start address | ||
| 1466 |         #ifndef USE_PALETTE | ||
| 1467 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 1468 |         #else | ||
| 1469 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 1470 |         #endif | ||
| 1471 | |||
| 1472 |     // Read image size | ||
| 1473 |     sizeY = *((FLASH_WORD *)flashAddress); | ||
| 1474 |     flashAddress += 2; | ||
| 1475 |     sizeX = *((FLASH_WORD *)flashAddress); | ||
| 1476 |     flashAddress += 2; | ||
| 1477 | |||
| 1478 |     // Read pallete | ||
| 1479 |     for(counter = 0; counter < 16; counter++) | ||
| 1480 |     { | ||
| 1481 |         pallete[counter] = *((FLASH_WORD *)flashAddress); | ||
| 1482 |         flashAddress += 2; | ||
| 1483 |     } | ||
| 1484 | |||
| 1485 |     CS_LAT_BIT = 0; | ||
| 1486 |     for(y = 0; y < sizeY; y++) | ||
| 1487 |     { | ||
| 1488 |         tempFlashAddress = flashAddress; | ||
| 1489 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 1490 |         { | ||
| 1491 |             flashAddress = tempFlashAddress; | ||
| 1492 |             SetAddress(address); | ||
| 1493 |             for(x = 0; x < sizeX; x++) | ||
| 1494 |             { | ||
| 1495 | |||
| 1496 |                 // Read 2 pixels from flash | ||
| 1497 |                 if(x & 0x0001) | ||
| 1498 |                 { | ||
| 1499 | |||
| 1500 |                     // second pixel in byte | ||
| 1501 |                     #ifdef USE_PALETTE | ||
| 1502 |                     if(IsPaletteEnabled()) | ||
| 1503 |                     { | ||
| 1504 |                         SetColor(temp >> 4); | ||
| 1505 |                     } | ||
| 1506 |                     else | ||
| 1507 |                     #endif | ||
| 1508 |                     { | ||
| 1509 |                         SetColor(pallete[temp >> 4]); | ||
| 1510 |                     } | ||
| 1511 |                 } | ||
| 1512 |                 else | ||
| 1513 |                 { | ||
| 1514 |                     temp = *flashAddress; | ||
| 1515 |                     flashAddress++; | ||
| 1516 | |||
| 1517 |                     // first pixel in byte | ||
| 1518 |                     #ifdef USE_PALETTE | ||
| 1519 |                     if(IsPaletteEnabled()) | ||
| 1520 |                     { | ||
| 1521 |                         SetColor(temp & 0x0f); | ||
| 1522 |                     } | ||
| 1523 |                     else | ||
| 1524 |                     #endif | ||
| 1525 |                     { | ||
| 1526 |                         SetColor(pallete[temp & 0x0f]); | ||
| 1527 |                     } | ||
| 1528 |                 } | ||
| 1529 | |||
| 1530 |                 // Write pixel to screen | ||
| 1531 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 1532 |                 { | ||
| 1533 |                     WritePixel(_color); | ||
| 1534 |                 } | ||
| 1535 | |||
| 1536 |                 // Shift to the next pixel | ||
| 1537 |                 //temp >>= 4; | ||
| 1538 |             } | ||
| 1539 | |||
| 1540 |                 #ifndef USE_PALETTE | ||
| 1541 |             address += (GetMaxX() + 1) << 1; | ||
| 1542 |                 #else | ||
| 1543 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 1544 |                 #endif | ||
| 1545 |         } | ||
| 1546 |     } | ||
| 1547 | |||
| 1548 |     CS_LAT_BIT = 1; | ||
| 1549 | } | ||
| 1550 | |||
| 1551 | /********************************************************************* | ||
| 1552 | * Function: void PutImage8BPP(SHORT left, SHORT top, FLASH_BYTE* bitmap, BYTE stretch) | ||
| 1553 | * | ||
| 1554 | * PreCondition: none | ||
| 1555 | * | ||
| 1556 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 1557 | *        stretch - image stretch factor | ||
| 1558 | * | ||
| 1559 | * Output: none | ||
| 1560 | * | ||
| 1561 | * Side Effects: none | ||
| 1562 | * | ||
| 1563 | * Overview: outputs 256 color image starting from left,top coordinates | ||
| 1564 | * | ||
| 1565 | * Note: image must be located in flash | ||
| 1566 | * | ||
| 1567 | ********************************************************************/ | ||
| 1568 | void PutImage8BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch) | ||
| 1569 | { | ||
| 1570 |     register DWORD      address; | ||
| 1571 |     register FLASH_BYTE *flashAddress; | ||
| 1572 |     register FLASH_BYTE *tempFlashAddress; | ||
| 1573 |     WORD                sizeX, sizeY; | ||
| 1574 |     WORD                x, y; | ||
| 1575 |     BYTE                temp; | ||
| 1576 |     BYTE                stretchX, stretchY; | ||
| 1577 |     WORD                pallete[256]; | ||
| 1578 |     WORD                counter; | ||
| 1579 | |||
| 1580 |     // Move pointer to size information | ||
| 1581 |     flashAddress = bitmap + 2; | ||
| 1582 | |||
| 1583 |     // Set start address | ||
| 1584 |         #ifndef USE_PALETTE | ||
| 1585 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 1586 |         #else | ||
| 1587 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 1588 |         #endif | ||
| 1589 | |||
| 1590 |     // Read image size | ||
| 1591 |     sizeY = *((FLASH_WORD *)flashAddress); | ||
| 1592 |     flashAddress += 2; | ||
| 1593 |     sizeX = *((FLASH_WORD *)flashAddress); | ||
| 1594 |     flashAddress += 2; | ||
| 1595 | |||
| 1596 |     // Read pallete | ||
| 1597 |     for(counter = 0; counter < 256; counter++) | ||
| 1598 |     { | ||
| 1599 |         pallete[counter] = *((FLASH_WORD *)flashAddress); | ||
| 1600 |         flashAddress += 2; | ||
| 1601 |     } | ||
| 1602 | |||
| 1603 |     CS_LAT_BIT = 0; | ||
| 1604 |     for(y = 0; y < sizeY; y++) | ||
| 1605 |     { | ||
| 1606 |         tempFlashAddress = flashAddress; | ||
| 1607 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 1608 |         { | ||
| 1609 |             flashAddress = tempFlashAddress; | ||
| 1610 |             SetAddress(address); | ||
| 1611 |             for(x = 0; x < sizeX; x++) | ||
| 1612 |             { | ||
| 1613 | |||
| 1614 |                 // Read pixels from flash | ||
| 1615 |                 temp = *flashAddress; | ||
| 1616 |                 flashAddress++; | ||
| 1617 | |||
| 1618 |                 // Set color | ||
| 1619 |                 #ifdef USE_PALETTE | ||
| 1620 |                 if(IsPaletteEnabled()) | ||
| 1621 |                 { | ||
| 1622 |                     SetColor(temp); | ||
| 1623 |                 } | ||
| 1624 |                 else | ||
| 1625 |                 #endif | ||
| 1626 |                 { | ||
| 1627 |                     SetColor(pallete[temp]); | ||
| 1628 |                 } | ||
| 1629 | |||
| 1630 |                 // Write pixel to screen | ||
| 1631 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 1632 |                 { | ||
| 1633 |                     WritePixel(_color); | ||
| 1634 |                 } | ||
| 1635 |             } | ||
| 1636 | |||
| 1637 |                 #ifndef USE_PALETTE | ||
| 1638 |             address += (GetMaxX() + 1) << 1; | ||
| 1639 |                 #else | ||
| 1640 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 1641 |                 #endif | ||
| 1642 |         } | ||
| 1643 |     } | ||
| 1644 | |||
| 1645 |     CS_LAT_BIT = 1; | ||
| 1646 | } | ||
| 1647 | |||
| 1648 | /********************************************************************* | ||
| 1649 | * Function: void PutImage16BPP(SHORT left, SHORT top, FLASH_BYTE* bitmap, BYTE stretch) | ||
| 1650 | * | ||
| 1651 | * PreCondition: none | ||
| 1652 | * | ||
| 1653 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 1654 | *        stretch - image stretch factor | ||
| 1655 | * | ||
| 1656 | * Output: none | ||
| 1657 | * | ||
| 1658 | * Side Effects: none | ||
| 1659 | * | ||
| 1660 | * Overview: outputs hicolor image starting from left,top coordinates | ||
| 1661 | * | ||
| 1662 | * Note: image must be located in flash | ||
| 1663 | * | ||
| 1664 | ********************************************************************/ | ||
| 1665 | void PutImage16BPP(SHORT left, SHORT top, FLASH_BYTE *bitmap, BYTE stretch) | ||
| 1666 | { | ||
| 1667 |     register DWORD      address; | ||
| 1668 |     register FLASH_WORD *flashAddress; | ||
| 1669 |     register FLASH_WORD *tempFlashAddress; | ||
| 1670 |     WORD                sizeX, sizeY; | ||
| 1671 |     register WORD       x, y; | ||
| 1672 |     WORD                temp; | ||
| 1673 |     register BYTE       stretchX, stretchY; | ||
| 1674 | |||
| 1675 |     // Move pointer to size information | ||
| 1676 |     flashAddress = (FLASH_WORD *)bitmap + 1; | ||
| 1677 | |||
| 1678 |     // Set start address | ||
| 1679 |         #ifndef USE_PALETTE | ||
| 1680 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 1681 |         #else | ||
| 1682 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 1683 |         #endif | ||
| 1684 | |||
| 1685 |     // Read image size | ||
| 1686 |     sizeY = *flashAddress; | ||
| 1687 |     flashAddress++; | ||
| 1688 |     sizeX = *flashAddress; | ||
| 1689 |     flashAddress++; | ||
| 1690 | |||
| 1691 |     CS_LAT_BIT = 0; | ||
| 1692 |     for(y = 0; y < sizeY; y++) | ||
| 1693 |     { | ||
| 1694 |         tempFlashAddress = flashAddress; | ||
| 1695 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 1696 |         { | ||
| 1697 |             flashAddress = tempFlashAddress; | ||
| 1698 |             SetAddress(address); | ||
| 1699 |             for(x = 0; x < sizeX; x++) | ||
| 1700 |             { | ||
| 1701 | |||
| 1702 |                 // Read pixels from flash | ||
| 1703 |                 temp = *flashAddress; | ||
| 1704 |                 flashAddress++; | ||
| 1705 | |||
| 1706 |                 // Set color | ||
| 1707 |                 #ifdef USE_PALETTE | ||
| 1708 |                 if(IsPaletteEnabled()) | ||
| 1709 |                 { | ||
| 1710 |                     SetColor(0); /* Paint first value of Palette instead of junk */ | ||
| 1711 |                 } | ||
| 1712 |                 else | ||
| 1713 |                 #endif | ||
| 1714 |                 { | ||
| 1715 |                     SetColor(temp); | ||
| 1716 |                 } | ||
| 1717 | |||
| 1718 |                 // Write pixel to screen | ||
| 1719 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 1720 |                 { | ||
| 1721 |                     WritePixel(_color); | ||
| 1722 |                 } | ||
| 1723 |             } | ||
| 1724 | |||
| 1725 |                 #ifndef USE_PALETTE | ||
| 1726 |             address += (GetMaxX() + 1) << 1; | ||
| 1727 |                 #else | ||
| 1728 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 1729 |                 #endif | ||
| 1730 |         } | ||
| 1731 |     } | ||
| 1732 | |||
| 1733 |     CS_LAT_BIT = 1; | ||
| 1734 | } | ||
| 1735 | |||
| 1736 | #endif | ||
| 1737 | #ifdef USE_BITMAP_EXTERNAL | ||
| 1738 | |||
| 1739 | /********************************************************************* | ||
| 1740 | * Function: void PutImage1BPPExt(SHORT left, SHORT top, void* bitmap, BYTE stretch) | ||
| 1741 | * | ||
| 1742 | * PreCondition: none | ||
| 1743 | * | ||
| 1744 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 1745 | *        stretch - image stretch factor | ||
| 1746 | * | ||
| 1747 | * Output: none | ||
| 1748 | * | ||
| 1749 | * Side Effects: none | ||
| 1750 | * | ||
| 1751 | * Overview: outputs monochrome image starting from left,top coordinates | ||
| 1752 | * | ||
| 1753 | * Note: image must be located in external memory | ||
| 1754 | * | ||
| 1755 | ********************************************************************/ | ||
| 1756 | void PutImage1BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch) | ||
| 1757 | { | ||
| 1758 |     register DWORD  address; | ||
| 1759 |     register DWORD  memOffset; | ||
| 1760 |     BITMAP_HEADER   bmp; | ||
| 1761 |     WORD            pallete[2]; | ||
| 1762 |     BYTE            lineBuffer[((GetMaxX() + 1) / 8) + 1]; | ||
| 1763 |     BYTE            *pData; | ||
| 1764 |     SHORT           byteWidth; | ||
| 1765 | |||
| 1766 |     BYTE            temp = 0; | ||
| 1767 |     BYTE            mask; | ||
| 1768 |     WORD            sizeX, sizeY; | ||
| 1769 |     WORD            x, y; | ||
| 1770 |     BYTE            stretchX, stretchY; | ||
| 1771 | |||
| 1772 |     // Set start address | ||
| 1773 |         #ifndef USE_PALETTE | ||
| 1774 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 1775 |         #else | ||
| 1776 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 1777 |         #endif | ||
| 1778 | |||
| 1779 |     // Get bitmap header | ||
| 1780 |     ExternalMemoryCallback(bitmap, 0, sizeof(BITMAP_HEADER), &bmp); | ||
| 1781 | |||
| 1782 |     // Get pallete (2 entries) | ||
| 1783 |     ExternalMemoryCallback(bitmap, sizeof(BITMAP_HEADER), 2 * sizeof(WORD), pallete); | ||
| 1784 | |||
| 1785 |     // Set offset to the image data | ||
| 1786 |     memOffset = sizeof(BITMAP_HEADER) + 2 * sizeof(WORD); | ||
| 1787 | |||
| 1788 |     // Line width in bytes | ||
| 1789 |     byteWidth = bmp.width >> 3; | ||
| 1790 |     if(bmp.width & 0x0007) | ||
| 1791 |         byteWidth++; | ||
| 1792 | |||
| 1793 |     // Get size | ||
| 1794 |     sizeX = bmp.width; | ||
| 1795 |     sizeY = bmp.height; | ||
| 1796 | |||
| 1797 |     for(y = 0; y < sizeY; y++) | ||
| 1798 |     { | ||
| 1799 | |||
| 1800 |         // Get line | ||
| 1801 |         ExternalMemoryCallback(bitmap, memOffset, byteWidth, lineBuffer); | ||
| 1802 |         memOffset += byteWidth; | ||
| 1803 | |||
| 1804 |         CS_LAT_BIT = 0; | ||
| 1805 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 1806 |         { | ||
| 1807 |             pData = lineBuffer; | ||
| 1808 |             SetAddress(address); | ||
| 1809 |             mask = 0; | ||
| 1810 |             for(x = 0; x < sizeX; x++) | ||
| 1811 |             { | ||
| 1812 | |||
| 1813 |                 // Read 8 pixels from flash | ||
| 1814 |                 if(mask == 0) | ||
| 1815 |                 { | ||
| 1816 |                     temp = *pData++; | ||
| 1817 |                     mask = 0x80; | ||
| 1818 |                 } | ||
| 1819 | |||
| 1820 |                 // Set color | ||
| 1821 |                 if(mask & temp) | ||
| 1822 |                 { | ||
| 1823 |                     #ifdef USE_PALETTE | ||
| 1824 |                     if(IsPaletteEnabled()) | ||
| 1825 |                     { | ||
| 1826 |                         SetColor(1); | ||
| 1827 |                     } | ||
| 1828 |                     else | ||
| 1829 |                     #endif | ||
| 1830 |                     { | ||
| 1831 |                         SetColor(pallete[1]); | ||
| 1832 |                     } | ||
| 1833 |                 } | ||
| 1834 |                 else | ||
| 1835 |                 { | ||
| 1836 |                     #ifdef USE_PALETTE | ||
| 1837 |                     if(IsPaletteEnabled()) | ||
| 1838 |                     { | ||
| 1839 |                         SetColor(0); | ||
| 1840 |                     } | ||
| 1841 |                     else | ||
| 1842 |                     #endif | ||
| 1843 |                     { | ||
| 1844 |                         SetColor(pallete[0]); | ||
| 1845 |                     } | ||
| 1846 |                 } | ||
| 1847 | |||
| 1848 |                 // Write pixel to screen | ||
| 1849 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 1850 |                 { | ||
| 1851 |                     WritePixel(_color); | ||
| 1852 |                 } | ||
| 1853 | |||
| 1854 |                 // Shift to the next pixel | ||
| 1855 |                 mask >>= 1; | ||
| 1856 |             } | ||
| 1857 | |||
| 1858 |                 #ifndef USE_PALETTE | ||
| 1859 |             address += (GetMaxX() + 1) << 1; | ||
| 1860 |                 #else | ||
| 1861 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 1862 |                 #endif | ||
| 1863 |         } | ||
| 1864 | |||
| 1865 |         CS_LAT_BIT = 1; | ||
| 1866 |     } | ||
| 1867 | } | ||
| 1868 | |||
| 1869 | /********************************************************************* | ||
| 1870 | * Function: void PutImage4BPPExt(SHORT left, SHORT top, void* bitmap, BYTE stretch) | ||
| 1871 | * | ||
| 1872 | * PreCondition: none | ||
| 1873 | * | ||
| 1874 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 1875 | *        stretch - image stretch factor | ||
| 1876 | * | ||
| 1877 | * Output: none | ||
| 1878 | * | ||
| 1879 | * Side Effects: none | ||
| 1880 | * | ||
| 1881 | * Overview: outputs monochrome image starting from left,top coordinates | ||
| 1882 | * | ||
| 1883 | * Note: image must be located in external memory | ||
| 1884 | * | ||
| 1885 | ********************************************************************/ | ||
| 1886 | void PutImage4BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch) | ||
| 1887 | { | ||
| 1888 |     register DWORD  address; | ||
| 1889 |     register DWORD  memOffset; | ||
| 1890 |     BITMAP_HEADER   bmp; | ||
| 1891 |     WORD            pallete[16]; | ||
| 1892 |     BYTE            lineBuffer[((GetMaxX() + 1) / 2) + 1]; | ||
| 1893 |     BYTE            *pData; | ||
| 1894 |     SHORT           byteWidth; | ||
| 1895 | |||
| 1896 |     BYTE            temp = 0; | ||
| 1897 |     WORD            sizeX, sizeY; | ||
| 1898 |     WORD            x, y; | ||
| 1899 |     BYTE            stretchX, stretchY; | ||
| 1900 | |||
| 1901 |     // Set start address | ||
| 1902 |         #ifndef USE_PALETTE | ||
| 1903 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 1904 |         #else | ||
| 1905 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 1906 |         #endif | ||
| 1907 | |||
| 1908 |     // Get bitmap header | ||
| 1909 |     ExternalMemoryCallback(bitmap, 0, sizeof(BITMAP_HEADER), &bmp); | ||
| 1910 | |||
| 1911 |     // Get pallete (16 entries) | ||
| 1912 |     ExternalMemoryCallback(bitmap, sizeof(BITMAP_HEADER), 16 * sizeof(WORD), pallete); | ||
| 1913 | |||
| 1914 |     // Set offset to the image data | ||
| 1915 |     memOffset = sizeof(BITMAP_HEADER) + 16 * sizeof(WORD); | ||
| 1916 | |||
| 1917 |     // Line width in bytes | ||
| 1918 |     byteWidth = bmp.width >> 1; | ||
| 1919 |     if(bmp.width & 0x0001) | ||
| 1920 |         byteWidth++; | ||
| 1921 | |||
| 1922 |     // Get size | ||
| 1923 |     sizeX = bmp.width; | ||
| 1924 |     sizeY = bmp.height; | ||
| 1925 | |||
| 1926 |     for(y = 0; y < sizeY; y++) | ||
| 1927 |     { | ||
| 1928 | |||
| 1929 |         // Get line | ||
| 1930 |         ExternalMemoryCallback(bitmap, memOffset, byteWidth, lineBuffer); | ||
| 1931 |         memOffset += byteWidth; | ||
| 1932 |         CS_LAT_BIT = 0; | ||
| 1933 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 1934 |         { | ||
| 1935 |             pData = lineBuffer; | ||
| 1936 |             SetAddress(address); | ||
| 1937 | |||
| 1938 |             for(x = 0; x < sizeX; x++) | ||
| 1939 |             { | ||
| 1940 | |||
| 1941 |                 // Read 2 pixels from flash | ||
| 1942 |                 if(x & 0x0001) | ||
| 1943 |                 { | ||
| 1944 |                     // second pixel in byte | ||
| 1945 |                     #ifdef USE_PALETTE | ||
| 1946 |                     if(IsPaletteEnabled()) | ||
| 1947 |                     { | ||
| 1948 |                         SetColor(temp >> 4); | ||
| 1949 |                     } | ||
| 1950 |                     else | ||
| 1951 |                     #endif | ||
| 1952 |                     { | ||
| 1953 |                         SetColor(pallete[temp >> 4]); | ||
| 1954 |                     } | ||
| 1955 |                 } | ||
| 1956 |                 else | ||
| 1957 |                 { | ||
| 1958 |                     temp = *pData++; | ||
| 1959 | |||
| 1960 |                     // first pixel in byte | ||
| 1961 |                     #ifdef USE_PALETTE | ||
| 1962 |                     if(IsPaletteEnabled()) | ||
| 1963 |                     { | ||
| 1964 |                         SetColor(temp & 0x0f); | ||
| 1965 |                     } | ||
| 1966 |                     else | ||
| 1967 |                     #endif | ||
| 1968 |                     { | ||
| 1969 |                         SetColor(pallete[temp & 0x0f]); | ||
| 1970 |                     } | ||
| 1971 |                 } | ||
| 1972 | |||
| 1973 |                 // Write pixel to screen | ||
| 1974 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 1975 |                 { | ||
| 1976 |                     WritePixel(_color); | ||
| 1977 |                 } | ||
| 1978 |             } | ||
| 1979 | |||
| 1980 |                 #ifndef USE_PALETTE | ||
| 1981 |             address += (GetMaxX() + 1) << 1; | ||
| 1982 |                 #else | ||
| 1983 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 1984 |                 #endif | ||
| 1985 |         } | ||
| 1986 | |||
| 1987 |         CS_LAT_BIT = 1; | ||
| 1988 |     } | ||
| 1989 | } | ||
| 1990 | |||
| 1991 | /********************************************************************* | ||
| 1992 | * Function: void PutImage8BPPExt(SHORT left, SHORT top, void* bitmap, BYTE stretch) | ||
| 1993 | * | ||
| 1994 | * PreCondition: none | ||
| 1995 | * | ||
| 1996 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 1997 | *        stretch - image stretch factor | ||
| 1998 | * | ||
| 1999 | * Output: none | ||
| 2000 | * | ||
| 2001 | * Side Effects: none | ||
| 2002 | * | ||
| 2003 | * Overview: outputs monochrome image starting from left,top coordinates | ||
| 2004 | * | ||
| 2005 | * Note: image must be located in external memory | ||
| 2006 | * | ||
| 2007 | ********************************************************************/ | ||
| 2008 | void PutImage8BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch) | ||
| 2009 | { | ||
| 2010 |     register DWORD  address; | ||
| 2011 |     register DWORD  memOffset; | ||
| 2012 |     BITMAP_HEADER   bmp; | ||
| 2013 |     WORD            pallete[256]; | ||
| 2014 |     BYTE            lineBuffer[(GetMaxX() + 1)]; | ||
| 2015 |     BYTE            *pData; | ||
| 2016 | |||
| 2017 |     BYTE            temp; | ||
| 2018 |     WORD            sizeX, sizeY; | ||
| 2019 |     WORD            x, y; | ||
| 2020 |     BYTE            stretchX, stretchY; | ||
| 2021 | |||
| 2022 |     // Set start address | ||
| 2023 |         #ifndef USE_PALETTE | ||
| 2024 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 2025 |         #else | ||
| 2026 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 2027 |         #endif | ||
| 2028 | |||
| 2029 |     // Get bitmap header | ||
| 2030 |     ExternalMemoryCallback(bitmap, 0, sizeof(BITMAP_HEADER), &bmp); | ||
| 2031 | |||
| 2032 |     // Get pallete (256 entries) | ||
| 2033 |     ExternalMemoryCallback(bitmap, sizeof(BITMAP_HEADER), 256 * sizeof(WORD), pallete); | ||
| 2034 | |||
| 2035 |     // Set offset to the image data | ||
| 2036 |     memOffset = sizeof(BITMAP_HEADER) + 256 * sizeof(WORD); | ||
| 2037 | |||
| 2038 |     // Get size | ||
| 2039 |     sizeX = bmp.width; | ||
| 2040 |     sizeY = bmp.height; | ||
| 2041 | |||
| 2042 |     for(y = 0; y < sizeY; y++) | ||
| 2043 |     { | ||
| 2044 | |||
| 2045 |         // Get line | ||
| 2046 |         ExternalMemoryCallback(bitmap, memOffset, sizeX, lineBuffer); | ||
| 2047 |         memOffset += sizeX; | ||
| 2048 |         CS_LAT_BIT = 0; | ||
| 2049 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 2050 |         { | ||
| 2051 |             pData = lineBuffer; | ||
| 2052 |             SetAddress(address); | ||
| 2053 | |||
| 2054 |             for(x = 0; x < sizeX; x++) | ||
| 2055 |             { | ||
| 2056 |                 temp = *pData++; | ||
| 2057 | |||
| 2058 |                 #ifdef USE_PALETTE | ||
| 2059 |                 if(IsPaletteEnabled()) | ||
| 2060 |                 { | ||
| 2061 |                     SetColor(temp); | ||
| 2062 |                 } | ||
| 2063 |                 else | ||
| 2064 |                 #endif | ||
| 2065 |                 { | ||
| 2066 |                     SetColor(pallete[temp]); | ||
| 2067 |                 } | ||
| 2068 | |||
| 2069 |                 // Write pixel to screen | ||
| 2070 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 2071 |                 { | ||
| 2072 |                     WritePixel(_color); | ||
| 2073 |                 } | ||
| 2074 |             } | ||
| 2075 | |||
| 2076 |                 #ifndef USE_PALETTE | ||
| 2077 |             address += (GetMaxX() + 1) << 1; | ||
| 2078 |                 #else | ||
| 2079 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 2080 |                 #endif | ||
| 2081 |         } | ||
| 2082 | |||
| 2083 |         CS_LAT_BIT = 1; | ||
| 2084 |     } | ||
| 2085 | } | ||
| 2086 | |||
| 2087 | /********************************************************************* | ||
| 2088 | * Function: void PutImage16BPPExt(SHORT left, SHORT top, void* bitmap, BYTE stretch) | ||
| 2089 | * | ||
| 2090 | * PreCondition: none | ||
| 2091 | * | ||
| 2092 | * Input: left,top - left top image corner, bitmap - image pointer, | ||
| 2093 | *        stretch - image stretch factor | ||
| 2094 | * | ||
| 2095 | * Output: none | ||
| 2096 | * | ||
| 2097 | * Side Effects: none | ||
| 2098 | * | ||
| 2099 | * Overview: outputs monochrome image starting from left,top coordinates | ||
| 2100 | * | ||
| 2101 | * Note: image must be located in external memory | ||
| 2102 | * | ||
| 2103 | ********************************************************************/ | ||
| 2104 | void PutImage16BPPExt(SHORT left, SHORT top, void *bitmap, BYTE stretch) | ||
| 2105 | { | ||
| 2106 |     register DWORD  address; | ||
| 2107 |     register DWORD  memOffset; | ||
| 2108 |     BITMAP_HEADER   bmp; | ||
| 2109 |     WORD            lineBuffer[(GetMaxX() + 1)]; | ||
| 2110 |     WORD            *pData; | ||
| 2111 |     WORD            byteWidth; | ||
| 2112 | |||
| 2113 |     WORD            temp; | ||
| 2114 |     WORD            sizeX, sizeY; | ||
| 2115 |     WORD            x, y; | ||
| 2116 |     BYTE            stretchX, stretchY; | ||
| 2117 | |||
| 2118 |     // Set start address | ||
| 2119 |         #ifndef USE_PALETTE | ||
| 2120 |     address = ((DWORD) (GetMaxX() + 1) * top + left) << 1; | ||
| 2121 |         #else | ||
| 2122 |     address = (((DWORD) (GetMaxX() + 1) * top + left) * PaletteBpp) >> 3; | ||
| 2123 |         #endif | ||
| 2124 | |||
| 2125 |     // Get bitmap header | ||
| 2126 |     ExternalMemoryCallback(bitmap, 0, sizeof(BITMAP_HEADER), &bmp); | ||
| 2127 | |||
| 2128 |     // Set offset to the image data | ||
| 2129 |     memOffset = sizeof(BITMAP_HEADER); | ||
| 2130 | |||
| 2131 |     // Get size | ||
| 2132 |     sizeX = bmp.width; | ||
| 2133 |     sizeY = bmp.height; | ||
| 2134 | |||
| 2135 |     byteWidth = sizeX << 1; | ||
| 2136 | |||
| 2137 |     for(y = 0; y < sizeY; y++) | ||
| 2138 |     { | ||
| 2139 | |||
| 2140 |         // Get line | ||
| 2141 |         ExternalMemoryCallback(bitmap, memOffset, byteWidth, lineBuffer); | ||
| 2142 |         memOffset += byteWidth; | ||
| 2143 |         CS_LAT_BIT = 0; | ||
| 2144 |         for(stretchY = 0; stretchY < stretch; stretchY++) | ||
| 2145 |         { | ||
| 2146 |             pData = lineBuffer; | ||
| 2147 |             SetAddress(address); | ||
| 2148 | |||
| 2149 |             for(x = 0; x < sizeX; x++) | ||
| 2150 |             { | ||
| 2151 |                 temp = *pData++; | ||
| 2152 | |||
| 2153 |                 #ifdef USE_PALETTE | ||
| 2154 |                 if(IsPaletteEnabled()) | ||
| 2155 |                 { | ||
| 2156 |                     SetColor(0); /* Paint first value of Palette instead of junk */ | ||
| 2157 |                 } | ||
| 2158 |                 else | ||
| 2159 |                 #endif | ||
| 2160 |                 { | ||
| 2161 |                     SetColor(temp); | ||
| 2162 |                 } | ||
| 2163 | |||
| 2164 |                 // Write pixel to screen | ||
| 2165 |                 for(stretchX = 0; stretchX < stretch; stretchX++) | ||
| 2166 |                 { | ||
| 2167 |                     WritePixel(_color); | ||
| 2168 |                 } | ||
| 2169 |             } | ||
| 2170 | |||
| 2171 |                 #ifndef USE_PALETTE | ||
| 2172 |             address += (GetMaxX() + 1) << 1; | ||
| 2173 |                 #else | ||
| 2174 |             address += ((GetMaxX() + 1) * PaletteBpp) >> 3; | ||
| 2175 |                 #endif | ||
| 2176 |         } | ||
| 2177 | |||
| 2178 |         CS_LAT_BIT = 1; | ||
| 2179 |     } | ||
| 2180 | } | ||
| 2181 | |||
| 2182 | #endif | ||
| 2183 | #ifdef USE_PALETTE | ||
| 2184 | |||
| 2185 | /********************************************************************* | ||
| 2186 | * Function: void PaletteInit(void) | ||
| 2187 | * | ||
| 2188 | * Overview: Initializes the CLUT. | ||
| 2189 | * | ||
| 2190 | * PreCondition: none | ||
| 2191 | * | ||
| 2192 | * Input: none | ||
| 2193 | * | ||
| 2194 | * Output: none | ||
| 2195 | * | ||
| 2196 | * Side Effects: Drawing mode will change to support palettes | ||
| 2197 | * | ||
| 2198 | ********************************************************************/ | ||
| 2199 | void PaletteInit(void) | ||
| 2200 | { | ||
| 2201 |     PaletteBpp = 16; | ||
| 2202 |     blPaletteChangeError = 0; | ||
| 2203 |     pPendingPalette = NULL; | ||
| 2204 |     PendingStartEntry = 0; | ||
| 2205 |     PendingLength = 0; | ||
| 2206 | } | ||
| 2207 | |||
| 2208 | /********************************************************************* | ||
| 2209 | * Function: BYTE SetPaletteBpp(BYTE bpp) | ||
| 2210 | * | ||
| 2211 | * Overview: Sets the CLUT's number of valid entries. | ||
| 2212 | * | ||
| 2213 | * PreCondition: PaletteInit() must be called before. | ||
| 2214 | * | ||
| 2215 | * Input: bpp -> Bits per pixel | ||
| 2216 | * | ||
| 2217 | * Output: Status: Zero -> Success, Non-zero -> Error. | ||
| 2218 | * | ||
| 2219 | * Side Effects: Drawing mode will change to support palettes | ||
| 2220 | * | ||
| 2221 | ********************************************************************/ | ||
| 2222 | BYTE SetPaletteBpp(BYTE bpp) | ||
| 2223 | { | ||
| 2224 |     switch(bpp) | ||
| 2225 |     { | ||
| 2226 |         /*case 1: SetReg(REG_DISPLAY_MODE,0x00); | ||
| 2227 |                 break; | ||
| 2228 | |||
| 2229 |         case 2: SetReg(REG_DISPLAY_MODE,0x01); | ||
| 2230 |                 break; | ||
| 2231 | |||
| 2232 |         case 4: SetReg(REG_DISPLAY_MODE,0x02); | ||
| 2233 |                 break;*/ | ||
| 2234 |         case 8:     SetReg(REG_DISPLAY_MODE, 0x03); break; | ||
| 2235 |         case 16:    SetReg(REG_DISPLAY_MODE, 0x04); break; | ||
| 2236 |         default:    SetReg(REG_DISPLAY_MODE, 0x04); PaletteBpp = 16; return (-1); | ||
| 2237 |     } | ||
| 2238 | |||
| 2239 |     PaletteBpp = bpp; | ||
| 2240 | |||
| 2241 |     ///////////////////////////////////////////////////////////////////// | ||
| 2242 |     // ROTATION MODE | ||
| 2243 |         ///////////////////////////////////////////////////////////////////// | ||
| 2244 |         #if (DISP_ORIENTATION == 0) | ||
| 2245 |             #define WIN_START_ADDR  0ul | ||
| 2246 |             #define ROTATION        0 | ||
| 2247 | |||
| 2248 |         #elif (DISP_ORIENTATION == 90) | ||
| 2249 |             #ifndef USE_PALETTE | ||
| 2250 |                 #define WIN_START_ADDR  ((((DWORD) GetMaxX() + 1) >> 1) - 1) | ||
| 2251 |             #else | ||
| 2252 |                 #define WIN_START_ADDR  (((((DWORD) GetMaxX() + 1) * PaletteBpp) >> 5) - 1) | ||
| 2253 |             #endif | ||
| 2254 |             #define ROTATION    1 | ||
| 2255 | |||
| 2256 |         #elif (DISP_ORIENTATION == 180) | ||
| 2257 |             #ifndef USE_PALETTE | ||
| 2258 |                 #define WIN_START_ADDR  (((((DWORD) GetMaxX() + 1) * (GetMaxY() + 1)) >> 1) - 1) | ||
| 2259 |             #else | ||
| 2260 |                 #define WIN_START_ADDR  (((((DWORD) GetMaxX() + 1) * (GetMaxY() + 1) * PaletteBpp) >> 5) - 1) | ||
| 2261 |             #endif | ||
| 2262 |             #define ROTATION    2 | ||
| 2263 | |||
| 2264 |         #elif (DISP_ORIENTATION == 270) | ||
| 2265 |             #ifndef USE_PALETTE | ||
| 2266 |                 #define WIN_START_ADDR  ((((DWORD) GetMaxX() + 1) * GetMaxY()) >> 1) | ||
| 2267 |             #else | ||
| 2268 |                 #define WIN_START_ADDR  ((((DWORD) GetMaxX() + 1) * GetMaxY() * PaletteBpp) >> 5) | ||
| 2269 |             #endif | ||
| 2270 |             #define ROTATION    3 | ||
| 2271 |         #endif | ||
| 2272 | |||
| 2273 |     ///////////////////////////////////////////////////////////////////// | ||
| 2274 |     // Special Effects Register (reg 71h) | ||
| 2275 |     ///////////////////////////////////////////////////////////////////// | ||
| 2276 |         #ifndef USE_PALETTE | ||
| 2277 |     SetReg(REG_SPECIAL_EFFECTS, 0x40 | ROTATION); | ||
| 2278 |         #else | ||
| 2279 |     SetReg(REG_SPECIAL_EFFECTS, 0x00 | ROTATION); | ||
| 2280 |         #endif | ||
| 2281 | |||
| 2282 |     ///////////////////////////////////////////////////////////////////// | ||
| 2283 |     // Main Window Display Start Address (regs 74h, 75h, 76h) | ||
| 2284 |     ///////////////////////////////////////////////////////////////////// | ||
| 2285 |     SetReg(REG_MAIN_WIN_DISP_START_ADDR0, WIN_START_ADDR & 0x00FF); | ||
| 2286 |     SetReg(REG_MAIN_WIN_DISP_START_ADDR1, (WIN_START_ADDR >> 8) & 0x00FF); | ||
| 2287 |     SetReg(REG_MAIN_WIN_DISP_START_ADDR2, (WIN_START_ADDR >> 16) & 0x00FF); | ||
| 2288 | |||
| 2289 |     ///////////////////////////////////////////////////////////////////// | ||
| 2290 |     // Main Window Display Offset (regs 78h, 79h) | ||
| 2291 |     ///////////////////////////////////////////////////////////////////// | ||
| 2292 |         #ifndef USE_PALETTE | ||
| 2293 |             #define WIN_OFFSET  ((GetMaxX() + 1) >> 1) | ||
| 2294 |         #else | ||
| 2295 |             #define WIN_OFFSET  (((GetMaxX() + 1) * PaletteBpp) >> 5) | ||
| 2296 |         #endif | ||
| 2297 |     SetReg(REG_MAIN_WIN_ADDR_OFFSET0, WIN_OFFSET & 0x00FF); | ||
| 2298 |     SetReg(REG_MAIN_WIN_ADDR_OFFSET1, (WIN_OFFSET >> 8) & 0x00FF); | ||
| 2299 | |||
| 2300 |     return (0); | ||
| 2301 | } | ||
| 2302 | |||
| 2303 | /********************************************************************* | ||
| 2304 | * Function: void EnablePalette(void) | ||
| 2305 | * | ||
| 2306 | * Overview: Enables the Palette mode | ||
| 2307 | * | ||
| 2308 | * PreCondition: none | ||
| 2309 | * | ||
| 2310 | * Input: none | ||
| 2311 | * | ||
| 2312 | * Output: none | ||
| 2313 | * | ||
| 2314 | * Side Effects: | ||
| 2315 | * | ||
| 2316 | ********************************************************************/ | ||
| 2317 | void EnablePalette(void) | ||
| 2318 | { | ||
| 2319 |     SetPaletteBpp(PaletteBpp); | ||
| 2320 | } | ||
| 2321 | |||
| 2322 | /********************************************************************* | ||
| 2323 | * Function: void DisablePalette(void) | ||
| 2324 | * | ||
| 2325 | * Overview: Disables the Palette mode | ||
| 2326 | * | ||
| 2327 | * PreCondition: none | ||
| 2328 | * | ||
| 2329 | * Input: none | ||
| 2330 | * | ||
| 2331 | * Output: none | ||
| 2332 | * | ||
| 2333 | * Side Effects: | ||
| 2334 | * | ||
| 2335 | ********************************************************************/ | ||
| 2336 | void DisablePalette(void) | ||
| 2337 | { | ||
| 2338 |     SetPaletteBpp(16); | ||
| 2339 | } | ||
| 2340 | |||
| 2341 | /********************************************************************* | ||
| 2342 | * Function: BYTE IsPaletteEnabled(void) | ||
| 2343 | * | ||
| 2344 | * Overview: Returns if the Palette mode is enabled or not | ||
| 2345 | * | ||
| 2346 | * PreCondition: none | ||
| 2347 | * | ||
| 2348 | * Input: none | ||
| 2349 | * | ||
| 2350 | * Output: Enabled -> 1, Disabled -> 0 | ||
| 2351 | * | ||
| 2352 | * Side Effects: | ||
| 2353 | * | ||
| 2354 | ********************************************************************/ | ||
| 2355 | BYTE IsPaletteEnabled(void) | ||
| 2356 | { | ||
| 2357 |     return ((PaletteBpp == 16) ? 0 : 1); | ||
| 2358 | } | ||
| 2359 | |||
| 2360 | /********************************************************************* | ||
| 2361 | * Function: void StartVBlankInterrupt(void) | ||
| 2362 | * | ||
| 2363 | * Overview: Sets up the Vertical Blanking Interrupt | ||
| 2364 | * | ||
| 2365 | * PreCondition: Interrupts must be enabled | ||
| 2366 | * | ||
| 2367 | * Input: none | ||
| 2368 | * | ||
| 2369 | * Output: none | ||
| 2370 | * | ||
| 2371 | * Side Effects: none | ||
| 2372 | * | ||
| 2373 | ********************************************************************/ | ||
| 2374 | void StartVBlankInterrupt(void) | ||
| 2375 | { | ||
| 2376 | |||
| 2377 |     /* We don't use Vertical Blanking Interrupt in SSD1926 */ | ||
| 2378 |     if(pPendingPalette != NULL) | ||
| 2379 |     { | ||
| 2380 |         blPaletteChangeError = SetPalette(pPendingPalette, PendingStartEntry, PendingLength); | ||
| 2381 |         if(!blPaletteChangeError) | ||
| 2382 |         { | ||
| 2383 |             _palette = pPendingPalette; | ||
| 2384 |         } | ||
| 2385 |     } | ||
| 2386 | } | ||
| 2387 | |||
| 2388 | /********************************************************************* | ||
| 2389 | * Function: BYTE SetPaletteFlash(PALETTE_ENTRY *pPaletteEntry, WORD startEntry, WORD length) | ||
| 2390 | * | ||
| 2391 | * Overview: Loads the palettes from the flash immediately. | ||
| 2392 | * | ||
| 2393 | * PreCondition: PaletteInit() must be called before. | ||
| 2394 | * | ||
| 2395 | * Input: pPaletteEntry   - Pointer to the palette table in ROM | ||
| 2396 | *        startEntry      - Start entry to load (inclusive) | ||
| 2397 | *        length          - Number of entries | ||
| 2398 | * | ||
| 2399 | * Output: Status: Zero -> Success, Non-zero -> Error. | ||
| 2400 | * | ||
| 2401 | * Side Effects: There may be a slight flicker when the Palette entries | ||
| 2402 | *               are getting loaded one by one. | ||
| 2403 | * | ||
| 2404 | ********************************************************************/ | ||
| 2405 | BYTE SetPaletteFlash(PALETTE_ENTRY *pPaletteEntry, WORD startEntry, WORD length) | ||
| 2406 | { | ||
| 2407 |     WORD    counter; | ||
| 2408 | |||
| 2409 |     if((pPaletteEntry == NULL) || ((startEntry + length) > 256)) | ||
| 2410 |     { | ||
| 2411 |         return (-1); | ||
| 2412 |     } | ||
| 2413 | |||
| 2414 |     for(counter = 0; counter < length; counter++) | ||
| 2415 |     { | ||
| 2416 |         SetReg(REG_LUT_RED_WRITE_DATA, RED8(pPaletteEntry[counter].value)); | ||
| 2417 |         SetReg(REG_LUT_GREEN_WRITE_DATA, GREEN8(pPaletteEntry[counter].value)); | ||
| 2418 |         SetReg(REG_LUT_BLUE_WRITE_DATA, BLUE8(pPaletteEntry[counter].value)); | ||
| 2419 |         SetReg(REG_LUT_WRITE_ADDR, startEntry + counter); | ||
| 2420 |     } | ||
| 2421 | |||
| 2422 |     return (0); | ||
| 2423 | } | ||
| 2424 | |||
| 2425 | #endif | 
Powered by WebSVN v2.8.3