A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita audio rust zig deno mpris rockbox mpd
at master 1190 lines 39 kB view raw
1/* Emacs style mode select -*- C++ -*- 2 *----------------------------------------------------------------------------- 3 * 4 * $Id$ 5 * 6 * Copyright (C) 1993-1996 by id Software, Inc. 7 * 8 * This program is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU General Public License 10 * as published by the Free Software Foundation; either version 2 11 * of the License, or (at your option) any later version. 12 * 13 * This program is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 * GNU General Public License for more details. 17 * 18 * $Log: i_video.c,v $ 19 * Revision 1.26 2006-12-13 04:44:17 kkurbjun 20 * Dehacked and BEX support for Doom - currently only supports a DEHACKED file in a WAD (not as a standalone file yet). 21 * 22 * Revision 1.25 2006-10-26 13:38:04 barrywardell 23 * Allow the Sansa e200 UI simulator to be built. Thanks to Andre Smith for the nice image of the Sansa. Lots more to be done including testing and tweaking the keymaps and modifying the plugins for the Sansa's 176x220 LCD. 24 * 25 * Revision 1.24 2006-09-05 00:23:06 barrywardell 26 * Fix not being able to exit Doom on the H10. 27 * 28 * Revision 1.23 2006-08-10 18:34:43 amiconn 29 * Correct calculation of necessary buffer size to give maximum number of shades on iPod Mini. 30 * 31 * Revision 1.22 2006-08-07 02:44:18 amiconn 32 * Use striped buffering for grayscale targets to make the buffer fit on iPod g3/g4. Also slightly faster (at least on H1x0) with the buffer in IRAM. 33 * 34 * Revision 1.21 2006-08-07 01:57:29 amiconn 35 * Fix red iPod g3 build. 36 * 37 * Revision 1.20 2006-08-07 01:46:41 amiconn 38 * Grayscale library ported to the grayscale iPods, first version. Added C reference versions of gray_update_rect() for both horizontal and vertical pixel packing. gray_update_rect() and gray_ub_gray_bitmap_part() not yet assembler optimised. Grayscale screendump doesn't work yet. * Fixed button assignments for iPod in grayscale.c 39 * 40 * Revision 1.19 2006-08-03 20:17:22 bagder 41 * Barry Wardell's keymappings for H10 42 * 43 * Revision 1.18 2006-08-02 00:21:59 amiconn 44 * Grayscale library: LCD linearisation and gamma correction. 45 * 46 * Revision 1.17 2006-04-22 03:48:15 kkurbjun 47 * Better video update, add options to startup menu, change default screensize 48 * 49 * Revision 1.16 2006-04-20 19:39:56 kkurbjun 50 * Optimizations for doom: coldfire asm drawspan routine = not much, fixed point multiply changes = not much, H300 asm lcd update = some, IRAM sound updates and simplifications = more 51 * 52 * Revision 1.15 2006-04-16 23:14:04 kkurbjun 53 * Fix run so that it stays enabled across level loads. Removed some unused code and added some back in for hopeful future use. 54 * 55 * Revision 1.14 2006-04-15 22:08:36 kkurbjun 56 * Slight code cleanups, fixed sound parameter - now it saves. Old configurations will be reset. 57 * 58 * Revision 1.13 2006-04-06 21:31:49 kkurbjun 59 * Scaling code fixed by clamping down the width to a max of SCREENWIDTH. Removed some #ifdefs for glprboom 60 * 61 * Revision 1.12 2006-04-05 06:37:37 kkurbjun 62 * Fix finale text and try and prevent some data corruption due to the scaling code. Also allows the non-standard GP32 mods to work with some bounds checking. More comments are in v_video.c 63 * 64 * Revision 1.11 2006-04-04 19:39:31 amiconn 65 * Doom on H1x0: Don't waste memory, the grayscale lib doesn't need that much, but properly tell the lib how much memory it may use. 66 * 67 * Revision 1.10 2006-04-04 12:00:53 dave 68 * iPod: Make the hold switch bring up the in-game menu. 69 * 70 * Revision 1.9 2006-04-03 20:03:02 kkurbjun 71 * Updates doom menu w/ new graphics, now requires rockdoom.wad: http://alamode.mines.edu/~kkurbjun/rockdoom.wad 72 * 73 * Revision 1.8 2006-04-03 17:11:42 kkurbjun 74 * Finishing touches 75 * 76 * Revision 1.7 2006-04-03 16:30:12 kkurbjun 77 * Fix #if 78 * 79 * Revision 1.5 2006-04-03 08:51:08 bger 80 * Patch #4864 by Jonathan Gordon: text editor plugin, with some changes by me. 81 * Also correct a var clash between the rockbox's gui api and doom plugin 82 * 83 * Revision 1.4 2006-04-02 20:45:24 kkurbjun 84 * Properly ifdef H300 video code, fix commented line handling rockbox volume 85 * 86 * Revision 1.3 2006-04-02 01:52:44 kkurbjun 87 * Update adds prboom's high resolution support, also makes the scaling for 88 * platforms w/ resolution less then 320x200 much nicer. IDoom's lookup table 89 * code has been removed. Also fixed a pallete bug. Some graphic errors are 90 * present in menu and status bar. Also updates some headers and output 91 * formatting. 92 * 93 * Revision 1.2 2006-03-28 17:20:49 christian 94 * added good (tm) button mappings for x5, and added ifdef for HAS_BUTTON_HOLD 95 * 96 * Revision 1.1 2006-03-28 15:44:01 dave 97 * Patch #2969 - Doom! Currently only working on the H300. 98 * 99 * 100 * DESCRIPTION: 101 * DOOM graphics and buttons. H300 Port by Karl Kurbjun 102 * H100 Port by Dave Chapman, Karl Kurbjun and Jens Arnold 103 * IPOD port by Dave Chapman and Paul Louden 104 * Additional work by Thom Johansen 105 * 106 *----------------------------------------------------------------------------- 107 */ 108 109#include "doomstat.h" 110#include "i_system.h" 111#include "v_video.h" 112#include "m_argv.h" 113#include "d_main.h" 114 115#include "doomdef.h" 116 117#include "rockmacros.h" 118 119#ifndef HAVE_LCD_COLOR 120#include "lib/grey.h" 121GREY_INFO_STRUCT_IRAM 122static unsigned char greybuffer[LCD_WIDTH] IBSS_ATTR; /* off screen buffer */ 123static unsigned char *gbuf; 124#if LCD_PIXELFORMAT == HORIZONTAL_PACKING 125#define GREYBUFSIZE (((LCD_WIDTH+7)/8)*LCD_HEIGHT*16+200) 126#else 127#define GREYBUFSIZE (LCD_WIDTH*((LCD_HEIGHT+7)/8)*16+200) 128#endif 129#endif 130 131#if defined(CPU_COLDFIRE) 132static char fastscreen[LCD_WIDTH*LCD_HEIGHT] IBSS_ATTR; 133#endif 134 135static fb_data palette[256] IBSS_ATTR; 136static fb_data *paldata=NULL; 137 138// 139// I_ShutdownGraphics 140// 141void I_ShutdownGraphics(void) 142{ 143#if defined(HAVE_LCD_MODES) 144#if (HAVE_LCD_MODES & LCD_MODE_PAL256) 145 rb->lcd_set_mode(LCD_MODE_RGB565); 146#endif 147#endif 148 149#ifndef HAVE_LCD_COLOR 150 grey_release(); 151#endif 152 noprintf=0; 153} 154 155// 156// I_StartTic 157// 158 159#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 160 (CONFIG_KEYPAD == IPOD_1G2G_PAD) 161#define DOOMBUTTON_SCROLLWHEEL 162#define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK 163#define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD 164#define DOOMBUTTON_UP BUTTON_MENU 165#define DOOMBUTTON_WEAPON BUTTON_SELECT 166#define DOOMBUTTON_LEFT BUTTON_LEFT 167#define DOOMBUTTON_RIGHT BUTTON_RIGHT 168#define DOOMBUTTON_SHOOT BUTTON_PLAY 169#define DOOMBUTTON_ENTER BUTTON_SELECT 170#define DOOMBUTTON_OPEN BUTTON_MENU 171 172#elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD 173#define DOOMBUTTON_UP BUTTON_UP 174#define DOOMBUTTON_DOWN BUTTON_DOWN 175#define DOOMBUTTON_LEFT BUTTON_LEFT 176#define DOOMBUTTON_RIGHT BUTTON_RIGHT 177#define DOOMBUTTON_SHOOT BUTTON_SELECT 178#define DOOMBUTTON_OPEN BUTTON_PLAY 179#define DOOMBUTTON_ESC BUTTON_POWER 180#define DOOMBUTTON_ENTER BUTTON_SELECT 181#define DOOMBUTTON_WEAPON BUTTON_REC 182 183#elif CONFIG_KEYPAD == IRIVER_H10_PAD 184#define DOOMBUTTON_UP BUTTON_SCROLL_UP 185#define DOOMBUTTON_DOWN BUTTON_SCROLL_DOWN 186#define DOOMBUTTON_LEFT BUTTON_LEFT 187#define DOOMBUTTON_RIGHT BUTTON_RIGHT 188#define DOOMBUTTON_SHOOT BUTTON_REW 189#define DOOMBUTTON_OPEN BUTTON_PLAY 190#define DOOMBUTTON_ESC BUTTON_POWER 191#define DOOMBUTTON_ENTER BUTTON_REW 192#define DOOMBUTTON_WEAPON BUTTON_FF 193 194#elif CONFIG_KEYPAD == SANSA_E200_PAD 195#define DOOMBUTTON_SCROLLWHEEL 196#define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK 197#define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD 198#define DOOMBUTTON_UP BUTTON_UP 199#define DOOMBUTTON_DOWN BUTTON_DOWN 200#define DOOMBUTTON_LEFT BUTTON_LEFT 201#define DOOMBUTTON_RIGHT BUTTON_RIGHT 202#define DOOMBUTTON_SHOOT BUTTON_SELECT 203#define DOOMBUTTON_OPEN BUTTON_REC 204#define DOOMBUTTON_ESC BUTTON_POWER 205#define DOOMBUTTON_ENTER BUTTON_SELECT 206#define DOOMBUTTON_WEAPON DOOMBUTTON_SCROLLWHEEL_CW 207 208#elif CONFIG_KEYPAD == SANSA_FUZE_PAD 209#define DOOMBUTTON_SCROLLWHEEL 210#define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK 211#define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD 212#define DOOMBUTTON_UP BUTTON_UP 213#define DOOMBUTTON_DOWN BUTTON_DOWN 214#define DOOMBUTTON_LEFT BUTTON_LEFT 215#define DOOMBUTTON_RIGHT BUTTON_RIGHT 216#define DOOMBUTTON_SHOOT BUTTON_SELECT 217#define DOOMBUTTON_OPEN BUTTON_POWER 218#define DOOMBUTTON_ESC BUTTON_HOME 219#define DOOMBUTTON_ENTER BUTTON_SELECT 220#define DOOMBUTTON_WEAPON DOOMBUTTON_SCROLLWHEEL_CW 221 222#elif CONFIG_KEYPAD == SANSA_C200_PAD 223#define DOOMBUTTON_UP BUTTON_UP 224#define DOOMBUTTON_DOWN BUTTON_DOWN 225#define DOOMBUTTON_LEFT BUTTON_LEFT 226#define DOOMBUTTON_RIGHT BUTTON_RIGHT 227#define DOOMBUTTON_SHOOT BUTTON_SELECT 228#define DOOMBUTTON_OPEN BUTTON_REC 229#define DOOMBUTTON_ESC BUTTON_POWER 230#define DOOMBUTTON_ENTER BUTTON_SELECT 231#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 232 233#elif CONFIG_KEYPAD == SANSA_CLIP_PAD 234#define DOOMBUTTON_UP BUTTON_UP 235#define DOOMBUTTON_DOWN BUTTON_DOWN 236#define DOOMBUTTON_LEFT BUTTON_LEFT 237#define DOOMBUTTON_RIGHT BUTTON_RIGHT 238#define DOOMBUTTON_SHOOT BUTTON_SELECT 239#define DOOMBUTTON_OPEN BUTTON_HOME 240#define DOOMBUTTON_ESC BUTTON_POWER 241#define DOOMBUTTON_ENTER BUTTON_SELECT 242#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 243 244#elif CONFIG_KEYPAD == GIGABEAT_PAD 245#define DOOMBUTTON_UP BUTTON_UP 246#define DOOMBUTTON_DOWN BUTTON_DOWN 247#define DOOMBUTTON_LEFT BUTTON_LEFT 248#define DOOMBUTTON_RIGHT BUTTON_RIGHT 249#define DOOMBUTTON_SHOOT BUTTON_A 250#define DOOMBUTTON_OPEN BUTTON_MENU 251#define DOOMBUTTON_ESC BUTTON_POWER 252#define DOOMBUTTON_ENTER BUTTON_SELECT 253#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 254#define DOOMBUTTON_MAP BUTTON_VOL_UP 255 256#elif CONFIG_KEYPAD == GIGABEAT_S_PAD 257#define DOOMBUTTON_UP BUTTON_UP 258#define DOOMBUTTON_DOWN BUTTON_DOWN 259#define DOOMBUTTON_LEFT BUTTON_LEFT 260#define DOOMBUTTON_RIGHT BUTTON_RIGHT 261#define DOOMBUTTON_SHOOT BUTTON_PLAY 262#define DOOMBUTTON_OPEN BUTTON_MENU 263#define DOOMBUTTON_ESC BUTTON_POWER 264#define DOOMBUTTON_ENTER BUTTON_SELECT 265#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 266#define DOOMBUTTON_MAP BUTTON_VOL_UP 267 268#elif CONFIG_KEYPAD == MROBE500_PAD 269#define DOOMBUTTON_ESC BUTTON_POWER 270#define DOOMBUTTON_UP BUTTON_RC_PLAY 271#define DOOMBUTTON_DOWN BUTTON_RC_DOWN 272#define DOOMBUTTON_LEFT BUTTON_RC_REW 273#define DOOMBUTTON_RIGHT BUTTON_RC_FF 274#define DOOMBUTTON_OPEN BUTTON_RC_VOL_DOWN 275#define DOOMBUTTON_SHOOT BUTTON_RC_VOL_UP 276#define DOOMBUTTON_ENTER BUTTON_RC_MODE 277#define DOOMBUTTON_WEAPON BUTTON_RC_HEART 278 279#elif CONFIG_KEYPAD == IRIVER_H100_PAD || \ 280 CONFIG_KEYPAD == IRIVER_H300_PAD 281#define DOOMBUTTON_UP BUTTON_UP 282#define DOOMBUTTON_DOWN BUTTON_DOWN 283#define DOOMBUTTON_LEFT BUTTON_LEFT 284#define DOOMBUTTON_RIGHT BUTTON_RIGHT 285#define DOOMBUTTON_SHOOT BUTTON_REC 286#define DOOMBUTTON_OPEN BUTTON_MODE 287#define DOOMBUTTON_ESC BUTTON_OFF 288#define DOOMBUTTON_ENTER BUTTON_SELECT 289#define DOOMBUTTON_WEAPON BUTTON_ON 290 291#elif CONFIG_KEYPAD == IAUDIO_M3_PAD 292#define DOOMBUTTON_ESC BUTTON_RC_REC 293#define DOOMBUTTON_UP BUTTON_RC_VOL_UP 294#define DOOMBUTTON_DOWN BUTTON_RC_VOL_DOWN 295#define DOOMBUTTON_LEFT BUTTON_RC_REW 296#define DOOMBUTTON_RIGHT BUTTON_RC_FF 297#define DOOMBUTTON_OPEN BUTTON_RC_PLAY 298#define DOOMBUTTON_SHOOT BUTTON_RC_MODE 299#define DOOMBUTTON_ENTER BUTTON_RC_PLAY 300#define DOOMBUTTON_WEAPON BUTTON_RC_MENU 301 302#elif CONFIG_KEYPAD == COWON_D2_PAD 303#define DOOMBUTTON_ESC BUTTON_POWER 304#define DOOMBUTTON_SHOOT BUTTON_PLUS 305#define DOOMBUTTON_WEAPON BUTTON_MINUS 306#define DOOMBUTTON_MAP BUTTON_MENU 307 308#elif CONFIG_KEYPAD == MROBE100_PAD 309#define DOOMBUTTON_UP BUTTON_UP 310#define DOOMBUTTON_DOWN BUTTON_DOWN 311#define DOOMBUTTON_LEFT BUTTON_LEFT 312#define DOOMBUTTON_RIGHT BUTTON_RIGHT 313#define DOOMBUTTON_SHOOT BUTTON_SELECT 314#define DOOMBUTTON_OPEN BUTTON_PLAY 315#define DOOMBUTTON_ESC BUTTON_POWER 316#define DOOMBUTTON_ENTER BUTTON_MENU 317#define DOOMBUTTON_WEAPON BUTTON_DISPLAY 318 319#elif CONFIG_KEYPAD == CREATIVEZVM_PAD 320#define DOOMBUTTON_UP BUTTON_UP 321#define DOOMBUTTON_DOWN BUTTON_DOWN 322#define DOOMBUTTON_LEFT BUTTON_LEFT 323#define DOOMBUTTON_RIGHT BUTTON_RIGHT 324#define DOOMBUTTON_SHOOT BUTTON_SELECT 325#define DOOMBUTTON_OPEN BUTTON_PLAY 326#define DOOMBUTTON_ESC BUTTON_BACK 327#define DOOMBUTTON_ENTER BUTTON_PLAY 328#define DOOMBUTTON_WEAPON BUTTON_MENU 329#define DOOMBUTTON_MAP BUTTON_CUSTOM 330 331#elif CONFIG_KEYPAD == CREATIVE_ZENXFI3_PAD 332#define DOOMBUTTON_UP BUTTON_UP 333#define DOOMBUTTON_DOWN BUTTON_DOWN 334#define DOOMBUTTON_LEFT BUTTON_BACK 335#define DOOMBUTTON_RIGHT BUTTON_MENU 336#define DOOMBUTTON_SHOOT BUTTON_PLAY 337#define DOOMBUTTON_OPEN BUTTON_UP 338#define DOOMBUTTON_ESC BUTTON_POWER 339#define DOOMBUTTON_ENTER BUTTON_PLAY 340#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 341#define DOOMBUTTON_MAP BUTTON_VOL_DOWN 342 343#elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD 344#define DOOMBUTTON_UP BUTTON_UP 345#define DOOMBUTTON_DOWN BUTTON_DOWN 346#define DOOMBUTTON_LEFT BUTTON_LEFT 347#define DOOMBUTTON_RIGHT BUTTON_RIGHT 348#define DOOMBUTTON_SHOOT BUTTON_PLAYLIST 349#define DOOMBUTTON_OPEN BUTTON_MENU 350#define DOOMBUTTON_ESC BUTTON_POWER 351#define DOOMBUTTON_ENTER BUTTON_VIEW 352#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 353#define DOOMBUTTON_MAP BUTTON_VOL_UP 354 355#elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD 356#define DOOMBUTTON_UP BUTTON_UP 357#define DOOMBUTTON_DOWN BUTTON_DOWN 358#define DOOMBUTTON_LEFT BUTTON_LEFT 359#define DOOMBUTTON_RIGHT BUTTON_RIGHT 360#define DOOMBUTTON_SHOOT BUTTON_NEXT 361#define DOOMBUTTON_OPEN BUTTON_MENU 362#define DOOMBUTTON_ESC BUTTON_POWER 363#define DOOMBUTTON_ENTER BUTTON_PLAY 364#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 365#define DOOMBUTTON_MAP BUTTON_VOL_UP 366 367#elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD 368#define DOOMBUTTON_UP BUTTON_UP 369#define DOOMBUTTON_DOWN BUTTON_DOWN 370#define DOOMBUTTON_LEFT BUTTON_PREV 371#define DOOMBUTTON_RIGHT BUTTON_NEXT 372#define DOOMBUTTON_SHOOT BUTTON_RIGHT 373#define DOOMBUTTON_OPEN BUTTON_MENU 374#define DOOMBUTTON_ESC BUTTON_POWER 375#define DOOMBUTTON_ENTER BUTTON_LEFT 376#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 377#define DOOMBUTTON_MAP BUTTON_VOL_UP 378 379#elif CONFIG_KEYPAD == ONDAVX747_PAD 380#define DOOMBUTTON_ESC BUTTON_POWER 381#define DOOMBUTTON_SHOOT BUTTON_VOL_UP 382#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 383#define DOOMBUTTON_MAP BUTTON_MENU 384 385#elif CONFIG_KEYPAD == ONDAVX777_PAD 386#define DOOMBUTTON_ESC BUTTON_POWER 387 388#elif CONFIG_KEYPAD == SAMSUNG_YH92X_PAD 389#define DOOMBUTTON_UP BUTTON_UP 390#define DOOMBUTTON_DOWN BUTTON_DOWN 391#define DOOMBUTTON_LEFT BUTTON_LEFT 392#define DOOMBUTTON_RIGHT BUTTON_RIGHT 393#define DOOMBUTTON_SHOOT BUTTON_PLAY 394#define DOOMBUTTON_OPEN BUTTON_REW 395#define DOOMBUTTON_ENTER BUTTON_PLAY 396#define DOOMBUTTON_WEAPON BUTTON_FFWD 397#define DOOMBUTTON_REC_SWITCH /* record switch toggles run mode; in game menu via hold switch */ 398 399#elif CONFIG_KEYPAD == SAMSUNG_YH820_PAD 400#define DOOMBUTTON_UP BUTTON_UP 401#define DOOMBUTTON_DOWN BUTTON_DOWN 402#define DOOMBUTTON_LEFT BUTTON_LEFT 403#define DOOMBUTTON_RIGHT BUTTON_RIGHT 404#define DOOMBUTTON_SHOOT BUTTON_PLAY 405#define DOOMBUTTON_OPEN BUTTON_REW 406#define DOOMBUTTON_ESC BUTTON_REC 407#define DOOMBUTTON_ENTER BUTTON_PLAY 408#define DOOMBUTTON_WEAPON BUTTON_FFWD 409 410#elif CONFIG_KEYPAD == PBELL_VIBE500_PAD 411#define DOOMBUTTON_UP BUTTON_OK 412#define DOOMBUTTON_DOWN BUTTON_CANCEL 413#define DOOMBUTTON_LEFT BUTTON_PREV 414#define DOOMBUTTON_RIGHT BUTTON_NEXT 415#define DOOMBUTTON_SHOOT BUTTON_MENU 416#define DOOMBUTTON_OPEN BUTTON_OK 417#define DOOMBUTTON_ESC BUTTON_REC 418#define DOOMBUTTON_ENTER BUTTON_POWER 419#define DOOMBUTTON_WEAPON BUTTON_PLAY 420 421#elif CONFIG_KEYPAD == MPIO_HD200_PAD 422#define DOOMBUTTON_UP BUTTON_REW 423#define DOOMBUTTON_DOWN BUTTON_FF 424#define DOOMBUTTON_LEFT BUTTON_VOL_DOWN 425#define DOOMBUTTON_RIGHT BUTTON_VOL_UP 426#define DOOMBUTTON_SHOOT BUTTON_FUNC 427#define DOOMBUTTON_OPEN (BUTTON_FUNC|BUTTON_PLAY) 428#define DOOMBUTTON_ESC BUTTON_REC 429#define DOOMBUTTON_ENTER BUTTON_PLAY 430#define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_REPEAT) 431 432#elif CONFIG_KEYPAD == MPIO_HD300_PAD 433#define DOOMBUTTON_UP BUTTON_UP 434#define DOOMBUTTON_DOWN BUTTON_DOWN 435#define DOOMBUTTON_LEFT BUTTON_REW 436#define DOOMBUTTON_RIGHT BUTTON_FF 437#define DOOMBUTTON_SHOOT BUTTON_ENTER 438#define DOOMBUTTON_OPEN BUTTON_MENU 439#define DOOMBUTTON_ESC BUTTON_REC 440#define DOOMBUTTON_ENTER (BUTTON_PLAY|BUTTON_REPEAT) 441#define DOOMBUTTON_WEAPON BUTTON_PLAY 442 443#elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD 444#define DOOMBUTTON_UP BUTTON_UP 445#define DOOMBUTTON_DOWN BUTTON_DOWN 446#define DOOMBUTTON_LEFT BUTTON_LEFT 447#define DOOMBUTTON_RIGHT BUTTON_RIGHT 448#define DOOMBUTTON_OPEN BUTTON_PLAYPAUSE 449#define DOOMBUTTON_ESC BUTTON_BACK 450#define DOOMBUTTON_ENTER BUTTON_SELECT 451#define DOOMBUTTON_SHOOT BUTTON_SELECT 452#define DOOMBUTTON_WEAPON BUTTON_BOTTOMLEFT 453#define DOOMBUTTON_MAP BUTTON_BOTTOMRIGHT 454 455#elif CONFIG_KEYPAD == SANSA_CONNECT_PAD 456#define DOOMBUTTON_SCROLLWHEEL 457#define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK 458#define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD 459#define DOOMBUTTON_UP BUTTON_UP 460#define DOOMBUTTON_DOWN BUTTON_DOWN 461#define DOOMBUTTON_LEFT BUTTON_LEFT 462#define DOOMBUTTON_RIGHT BUTTON_RIGHT 463#define DOOMBUTTON_SHOOT BUTTON_SELECT 464#define DOOMBUTTON_OPEN BUTTON_VOL_DOWN 465#define DOOMBUTTON_ESC BUTTON_VOL_UP 466#define DOOMBUTTON_ENTER BUTTON_NEXT 467#define DOOMBUTTON_WEAPON BUTTON_PREV 468 469#elif CONFIG_KEYPAD == SAMSUNG_YPR0_PAD 470#define DOOMBUTTON_UP BUTTON_UP 471#define DOOMBUTTON_DOWN BUTTON_DOWN 472#define DOOMBUTTON_LEFT BUTTON_LEFT 473#define DOOMBUTTON_RIGHT BUTTON_RIGHT 474#define DOOMBUTTON_SHOOT BUTTON_SELECT 475#define DOOMBUTTON_OPEN BUTTON_MENU 476#define DOOMBUTTON_ESC BUTTON_BACK 477#define DOOMBUTTON_ENTER BUTTON_POWER 478#define DOOMBUTTON_WEAPON BUTTON_USER 479 480#elif CONFIG_KEYPAD == HM60X_PAD 481#define DOOMBUTTON_UP BUTTON_UP 482#define DOOMBUTTON_DOWN BUTTON_DOWN 483#define DOOMBUTTON_LEFT BUTTON_LEFT 484#define DOOMBUTTON_RIGHT BUTTON_RIGHT 485#define DOOMBUTTON_OPEN (BUTTON_POWER | BUTTON_SELECT) 486#define DOOMBUTTON_ESC (BUTTON_POWER | BUTTON_UP) 487#define DOOMBUTTON_ENTER BUTTON_SELECT 488#define DOOMBUTTON_SHOOT BUTTON_SELECT 489#define DOOMBUTTON_WEAPON (BUTTON_POWER | BUTTON_LEFT) 490#define DOOMBUTTON_MAP (BUTTON_POWER | BUTTON_RIGHT) 491 492#elif CONFIG_KEYPAD == HM801_PAD 493#define DOOMBUTTON_UP BUTTON_UP 494#define DOOMBUTTON_DOWN BUTTON_DOWN 495#define DOOMBUTTON_LEFT BUTTON_LEFT 496#define DOOMBUTTON_RIGHT BUTTON_RIGHT 497#define DOOMBUTTON_OPEN BUTTON_PLAY 498#define DOOMBUTTON_ESC (BUTTON_POWER | BUTTON_SELECT) 499#define DOOMBUTTON_ENTER BUTTON_SELECT 500#define DOOMBUTTON_SHOOT BUTTON_SELECT 501#define DOOMBUTTON_WEAPON BUTTON_PREV 502#define DOOMBUTTON_MAP BUTTON_NEXT 503 504#elif CONFIG_KEYPAD == SONY_NWZ_PAD 505#define DOOMBUTTON_UP BUTTON_UP 506#define DOOMBUTTON_DOWN BUTTON_DOWN 507#define DOOMBUTTON_LEFT BUTTON_LEFT 508#define DOOMBUTTON_RIGHT BUTTON_RIGHT 509#define DOOMBUTTON_OPEN BUTTON_BACK 510#define DOOMBUTTON_ESC (BUTTON_BACK|BUTTON_REPEAT) 511#define DOOMBUTTON_ENTER BUTTON_PLAY 512#define DOOMBUTTON_SHOOT BUTTON_PLAY 513#define DOOMBUTTON_WEAPON BUTTON_POWER 514#define DOOMBUTTON_MAP (BUTTON_POWER|BUTTON_REPEAT) 515 516#elif CONFIG_KEYPAD == CREATIVE_ZEN_PAD 517#define DOOMBUTTON_UP BUTTON_UP 518#define DOOMBUTTON_DOWN BUTTON_DOWN 519#define DOOMBUTTON_LEFT BUTTON_LEFT 520#define DOOMBUTTON_RIGHT BUTTON_RIGHT 521#define DOOMBUTTON_OPEN BUTTON_PLAYPAUSE 522#define DOOMBUTTON_ESC BUTTON_BACK 523#define DOOMBUTTON_ENTER BUTTON_SELECT 524#define DOOMBUTTON_SHOOT BUTTON_SELECT 525#define DOOMBUTTON_WEAPON BUTTON_SHORTCUT 526#define DOOMBUTTON_MAP BUTTON_MENU 527 528#elif CONFIG_KEYPAD == DX50_PAD 529#define DOOMBUTTON_ESC BUTTON_POWER 530#define DOOMBUTTON_SHOOT BUTTON_VOL_UP 531#define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN 532#define DOOMBUTTON_MAP BUTTON_PLAY 533 534#elif CONFIG_KEYPAD == CREATIVE_ZENXFI2_PAD 535#define DOOMBUTTON_ESC BUTTON_POWER 536#define DOOMBUTTON_SHOOT BUTTON_MENU 537#define DOOMBUTTON_MAP BUTTON_TOPLEFT 538 539#elif CONFIG_KEYPAD == AGPTEK_ROCKER_PAD 540#define DOOMBUTTON_UP BUTTON_UP 541#define DOOMBUTTON_DOWN BUTTON_DOWN 542#define DOOMBUTTON_LEFT BUTTON_LEFT 543#define DOOMBUTTON_RIGHT BUTTON_RIGHT 544#define DOOMBUTTON_OPEN BUTTON_VOLDOWN 545#define DOOMBUTTON_ESC (BUTTON_POWER|BUTTON_REPEAT) 546#define DOOMBUTTON_ENTER BUTTON_SELECT 547#define DOOMBUTTON_SHOOT BUTTON_SELECT 548#define DOOMBUTTON_WEAPON BUTTON_VOLUP 549#define DOOMBUTTON_MAP (BUTTON_VOLUP|BUTTON_REPEAT) 550 551#elif CONFIG_KEYPAD == XDUOO_X3_PAD 552#define DOOMBUTTON_UP BUTTON_HOME 553#define DOOMBUTTON_DOWN BUTTON_OPTION 554#define DOOMBUTTON_LEFT BUTTON_PREV 555#define DOOMBUTTON_RIGHT BUTTON_NEXT 556#define DOOMBUTTON_SHOOT BUTTON_PLAY 557#define DOOMBUTTON_OPEN (BUTTON_HOME | BUTTON_PWRALT) 558#define DOOMBUTTON_ESC BUTTON_POWER 559#define DOOMBUTTON_ENTER BUTTON_PLAY 560#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 561 562#elif CONFIG_KEYPAD == XDUOO_X3II_PAD || CONFIG_KEYPAD == XDUOO_X20_PAD 563#define DOOMBUTTON_UP BUTTON_HOME 564#define DOOMBUTTON_DOWN BUTTON_OPTION 565#define DOOMBUTTON_LEFT BUTTON_PREV 566#define DOOMBUTTON_RIGHT BUTTON_NEXT 567#define DOOMBUTTON_SHOOT BUTTON_PLAY 568#define DOOMBUTTON_OPEN (BUTTON_HOME | BUTTON_POWER) 569#define DOOMBUTTON_ESC BUTTON_POWER 570#define DOOMBUTTON_ENTER BUTTON_PLAY 571#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 572 573#elif CONFIG_KEYPAD == FIIO_M3K_LINUX_PAD 574#define DOOMBUTTON_UP BUTTON_UP 575#define DOOMBUTTON_DOWN BUTTON_DOWN 576#define DOOMBUTTON_LEFT BUTTON_PREV 577#define DOOMBUTTON_RIGHT BUTTON_NEXT 578#define DOOMBUTTON_SHOOT BUTTON_PLAY 579#define DOOMBUTTON_OPEN BUTTON_OPTION 580#define DOOMBUTTON_ESC BUTTON_HOME 581#define DOOMBUTTON_ENTER BUTTON_PLAY 582#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 583 584#elif CONFIG_KEYPAD == IHIFI_770_PAD || CONFIG_KEYPAD == IHIFI_800_PAD 585#define DOOMBUTTON_UP BUTTON_PREV 586#define DOOMBUTTON_DOWN BUTTON_NEXT 587#define DOOMBUTTON_LEFT BUTTON_HOME 588#define DOOMBUTTON_RIGHT BUTTON_VOL_DOWN 589#define DOOMBUTTON_OPEN BUTTON_PLAY 590#define DOOMBUTTON_ESC BUTTON_POWER 591#define DOOMBUTTON_ENTER BUTTON_VOL_UP 592#define DOOMBUTTON_SHOOT BUTTON_VOL_UP 593#define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_REPEAT) 594#define DOOMBUTTON_MAP (BUTTON_POWER|BUTTON_REPEAT) 595 596#elif CONFIG_KEYPAD == EROSQ_PAD 597#define DOOMBUTTON_UP BUTTON_PREV 598#define DOOMBUTTON_DOWN BUTTON_NEXT 599#define DOOMBUTTON_LEFT BUTTON_SCROLL_BACK 600#define DOOMBUTTON_RIGHT BUTTON_SCROLL_FWD 601#define DOOMBUTTON_SHOOT BUTTON_PLAY 602#define DOOMBUTTON_OPEN BUTTON_BACK 603#define DOOMBUTTON_ESC BUTTON_MENU 604#define DOOMBUTTON_ENTER BUTTON_PLAY 605#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 606#define DOOMBUTTON_MAP BUTTON_VOL_DOWN 607 608#elif CONFIG_KEYPAD == FIIO_M3K_PAD 609#define DOOMBUTTON_UP BUTTON_UP 610#define DOOMBUTTON_DOWN BUTTON_DOWN 611#define DOOMBUTTON_LEFT BUTTON_LEFT 612#define DOOMBUTTON_RIGHT BUTTON_RIGHT 613#define DOOMBUTTON_SHOOT BUTTON_SELECT 614#define DOOMBUTTON_OPEN BUTTON_PLAY 615#define DOOMBUTTON_ESC BUTTON_POWER 616#define DOOMBUTTON_ENTER BUTTON_SELECT 617#define DOOMBUTTON_WEAPON BUTTON_VOL_UP 618#define DOOMBUTTON_MAP BUTTON_VOL_DOWN 619 620#elif CONFIG_KEYPAD == MA_PAD 621#define DOOMBUTTON_UP BUTTON_UP 622#define DOOMBUTTON_DOWN BUTTON_DOWN 623#define DOOMBUTTON_LEFT BUTTON_LEFT 624#define DOOMBUTTON_RIGHT BUTTON_RIGHT 625#define DOOMBUTTON_SHOOT BUTTON_PLAY 626#define DOOMBUTTON_OPEN (BUTTON_PLAY|BUTTON_REPEAT) 627#define DOOMBUTTON_ESC (BUTTON_BACK|BUTTON_REPEAT) 628#define DOOMBUTTON_ENTER BUTTON_MENU 629#define DOOMBUTTON_WEAPON BUTTON_BACK 630#define DOOMBUTTON_MAP (BUTTON_BACK|BUTTON_REPEAT) 631 632#elif CONFIG_KEYPAD == SHANLING_Q1_PAD 633#define DOOMBUTTON_ESC BUTTON_POWER 634#define DOOMBUTTON_MAP BUTTON_PREV 635 636#elif CONFIG_KEYPAD == RG_NANO_PAD 637#define DOOMBUTTON_UP BUTTON_UP 638#define DOOMBUTTON_DOWN BUTTON_DOWN 639#define DOOMBUTTON_LEFT BUTTON_LEFT 640#define DOOMBUTTON_RIGHT BUTTON_RIGHT 641#define DOOMBUTTON_SHOOT BUTTON_R 642#define DOOMBUTTON_OPEN BUTTON_B 643#define DOOMBUTTON_ESC BUTTON_START 644#define DOOMBUTTON_ENTER BUTTON_A 645#define DOOMBUTTON_WEAPON BUTTON_X 646#define DOOMBUTTON_MAP BUTTON_Y 647 648#else 649#error Keymap not defined! 650#endif 651 652#ifdef HAVE_TOUCHSCREEN 653#ifndef DOOMBUTTON_UP 654#define DOOMBUTTON_UP BUTTON_TOPMIDDLE 655#endif 656#ifndef DOOMBUTTON_DOWN 657#define DOOMBUTTON_DOWN BUTTON_BOTTOMMIDDLE 658#endif 659#ifndef DOOMBUTTON_LEFT 660#define DOOMBUTTON_LEFT BUTTON_MIDLEFT 661#endif 662#ifndef DOOMBUTTON_RIGHT 663#define DOOMBUTTON_RIGHT BUTTON_MIDRIGHT 664#endif 665#ifndef DOOMBUTTON_SHOOT 666#define DOOMBUTTON_SHOOT BUTTON_BOTTOMRIGHT 667#endif 668#ifndef DOOMBUTTON_OPEN 669#define DOOMBUTTON_OPEN BUTTON_TOPRIGHT 670#endif 671#ifndef DOOMBUTTON_ESC 672#define DOOMBUTTON_ESC BUTTON_TOPLEFT 673#endif 674#ifndef DOOMBUTTON_ENTER 675#define DOOMBUTTON_ENTER BUTTON_CENTER 676#endif 677#ifndef DOOMBUTTON_WEAPON 678#define DOOMBUTTON_WEAPON BUTTON_BOTTOMLEFT 679#endif 680#endif 681 682#ifdef DOOMBUTTON_SCROLLWHEEL 683/* Scrollwheel events are posted directly and not polled by the button 684 driver - synthesize polling */ 685static inline unsigned int read_scroll_wheel(void) 686{ 687 unsigned int buttons = BUTTON_NONE; 688 unsigned int btn; 689 690 /* Empty out the button queue and see if any scrollwheel events were 691 posted */ 692 do 693 { 694 btn = rb->button_get_w_tmo(0); 695 buttons |= btn; 696 } 697 while (btn != BUTTON_NONE); 698 699 return buttons & (DOOMBUTTON_SCROLLWHEEL_CC | DOOMBUTTON_SCROLLWHEEL_CW); 700} 701#endif 702 703static inline void getkey() 704{ 705 event_t event; 706 /* Same button handling as rockboy */ 707 static unsigned int oldbuttonstate IDATA_ATTR = 0; 708 709 unsigned int released, pressed, newbuttonstate; 710 711#ifdef HAS_BUTTON_HOLD 712 static unsigned int holdbutton IDATA_ATTR=0; 713 static bool hswitch IDATA_ATTR=0; 714 if (rb->button_hold()&~holdbutton) 715 { 716 if(hswitch==0) 717 { 718 event.type = ev_keydown; 719 hswitch=1; 720 } 721 else 722 { 723 event.type = ev_keyup; 724 hswitch=0; 725 } 726#if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \ 727 (CONFIG_KEYPAD == IPOD_1G2G_PAD) || (CONFIG_KEYPAD == SAMSUNG_YH92X_PAD) 728 /* Bring up the menu */ 729 event.data1=KEY_ESCAPE; 730#else 731 /* Enable run */ 732 event.data1=KEY_CAPSLOCK; 733#endif 734 D_PostEvent(&event); 735 } 736 holdbutton=rb->button_hold(); 737#endif 738 739#if defined(DOOMBUTTON_SCROLLWHEEL) || defined(DOOMBUTTON_REC_SWITCH) 740 /* use button_get(false) for clickwheel checks */ 741 int button; /* move me */ 742 button = rb->button_get(false); 743 744#ifdef DOOMBUTTON_SCROLLWHEEL 745 switch(button){ 746 case DOOMBUTTON_SCROLLWHEEL_CC | BUTTON_REPEAT: 747 case DOOMBUTTON_SCROLLWHEEL_CC: 748 event.type = ev_scroll; 749 event.data1=-1; 750 D_PostEvent(&event); 751 break; 752 case DOOMBUTTON_SCROLLWHEEL_CW | BUTTON_REPEAT: 753 case DOOMBUTTON_SCROLLWHEEL_CW: 754 event.type = ev_scroll; 755 //event.data1=KEY_LEFTARROW; 756 event.data1=1; 757 D_PostEvent(&event); 758 break; 759 } 760#endif 761#ifdef DOOMBUTTON_REC_SWITCH 762 if (button==BUTTON_REC_SW_ON || button==BUTTON_REC_SW_OFF) { 763 event.type = ev_keydown; 764 event.data1=KEY_CAPSLOCK; /* Enable run */ 765 D_PostEvent(&event); 766 event.type = ev_keyup; 767 D_PostEvent(&event); 768 } 769#endif 770#endif 771 newbuttonstate = rb->button_status(); 772#ifdef DOOMBUTTON_SCROLLWHEEL 773 newbuttonstate |= read_scroll_wheel(); 774#endif 775 776 if(newbuttonstate==oldbuttonstate) /* Don't continue, nothing left to do */ 777 return; 778 released = ~newbuttonstate & oldbuttonstate; 779 pressed = newbuttonstate & ~oldbuttonstate; 780 oldbuttonstate = newbuttonstate; 781 if(released) 782 { 783 event.type = ev_keyup; 784 if(released & DOOMBUTTON_LEFT) 785 { 786 event.data1=KEY_LEFTARROW; 787 D_PostEvent(&event); 788 } 789 if(released & DOOMBUTTON_RIGHT) 790 { 791 event.data1=KEY_RIGHTARROW; 792 D_PostEvent(&event); 793 } 794#ifdef DOOMBUTTON_DOWN 795 if(released & DOOMBUTTON_DOWN) 796 { 797 event.data1=KEY_DOWNARROW; 798 D_PostEvent(&event); 799 } 800#endif 801 if(released & DOOMBUTTON_UP) 802 { 803 event.data1=KEY_UPARROW; 804 D_PostEvent(&event); 805 } 806 if(released & DOOMBUTTON_SHOOT) 807 { 808 event.data1=KEY_RCTRL; 809 D_PostEvent(&event); 810 } 811 if(released & DOOMBUTTON_OPEN) 812 { 813 event.data1=' '; 814 D_PostEvent(&event); 815 } 816#ifdef DOOMBUTTON_ESC 817 if(released & DOOMBUTTON_ESC) 818 { 819 event.data1=KEY_ESCAPE; 820 D_PostEvent(&event); 821 } 822#endif 823 if(released & DOOMBUTTON_ENTER) 824 { 825 event.data1=KEY_ENTER; 826 D_PostEvent(&event); 827 } 828#ifdef DOOMBUTTON_WEAPON 829 if(released & DOOMBUTTON_WEAPON) 830 { 831 event.data1 ='w'; 832 D_PostEvent(&event); 833 } 834#endif 835#ifdef DOOMBUTTON_MAP 836 if(released & DOOMBUTTON_MAP) 837 { 838 event.data1 =KEY_TAB; 839 D_PostEvent(&event); 840 } 841#endif 842 } 843 if(pressed) 844 { 845 event.type = ev_keydown; 846 if(pressed & DOOMBUTTON_LEFT) 847 { 848 event.data1=KEY_LEFTARROW; 849 D_PostEvent(&event); 850 } 851 if(pressed & DOOMBUTTON_RIGHT) 852 { 853 event.data1=KEY_RIGHTARROW; 854 D_PostEvent(&event); 855 } 856#ifdef DOOMBUTTON_DOWN 857 if(pressed & DOOMBUTTON_DOWN) 858 { 859 event.data1=KEY_DOWNARROW; 860 D_PostEvent(&event); 861 } 862#endif 863 if(pressed & DOOMBUTTON_UP) 864 { 865 event.data1=KEY_UPARROW; 866 D_PostEvent(&event); 867 } 868 if(pressed & DOOMBUTTON_SHOOT) 869 { 870 event.data1=KEY_RCTRL; 871 D_PostEvent(&event); 872 } 873 if(pressed & DOOMBUTTON_OPEN) 874 { 875 event.data1=' '; 876 D_PostEvent(&event); 877 } 878#ifdef DOOMBUTTON_ESC 879 if(pressed & DOOMBUTTON_ESC) 880 { 881 event.data1=KEY_ESCAPE; 882 D_PostEvent(&event); 883 } 884#endif 885#ifdef DOOMBUTTON_ENTER 886 if(pressed & DOOMBUTTON_ENTER) 887 { 888 event.data1=KEY_ENTER; 889 D_PostEvent(&event); 890 } 891#endif 892#ifdef DOOMBUTTON_WEAPON 893 if(pressed & DOOMBUTTON_WEAPON) 894 { 895 event.data1='w'; 896 D_PostEvent(&event); 897 } 898#endif 899#ifdef DOOMBUTTON_MAP 900 if(pressed & DOOMBUTTON_MAP) 901 { 902 event.data1 =KEY_TAB; 903 D_PostEvent(&event); 904 } 905#endif 906 } 907} 908 909void I_StartTic (void) 910{ 911 getkey(); 912} 913 914 915/////////////////////////////////////////////////////////// 916// Palette stuff. 917// 918static void I_UploadNewPalette(int pal) 919{ 920 // This is used to replace the current 256 colour cmap with a new one 921 // Used by 256 colour PseudoColor modes 922 static int cachedgamma; 923 static size_t num_pals; 924 925 if ((paldata == NULL) || (cachedgamma != usegamma)) { 926 int lump = W_GetNumForName("PLAYPAL"); 927 const byte *pall = W_CacheLumpNum(lump); 928 register const byte *const gtable = gammatable[cachedgamma = usegamma]; 929 register int i; 930 931 num_pals = W_LumpLength(lump) / (3*256); 932 num_pals *= 256; 933 934 if (!paldata) { 935 // First call - allocate and prepare colour array 936 paldata = malloc(sizeof(*paldata)*num_pals); 937 } 938 939 // set the colormap entries 940 for (i=0 ; (size_t)i<num_pals ; i++) { 941 int r = gtable[pall[0]]; 942 int g = gtable[pall[1]]; 943 int b = gtable[pall[2]]; 944 pall+=3; 945#ifndef HAVE_LCD_COLOR 946 paldata[i]=(3*r+6*g+b)/10; 947#else 948 paldata[i] = FB_RGBPACK(r,g,b); 949#endif 950 } 951 952 W_UnlockLumpNum(lump); 953 num_pals/=256; 954 } 955 956#ifdef RANGECHECK 957 if ((size_t)pal >= num_pals) 958 I_Error("I_UploadNewPalette: Palette number out of range (%d>=%d)", 959 pal, num_pals); 960#endif 961 962 memcpy(palette,paldata+256*pal,256*sizeof(fb_data)); 963 964#if defined(HAVE_LCD_MODES) 965#if (HAVE_LCD_MODES & LCD_MODE_PAL256) 966 rb->lcd_pal256_update_pal(paldata+256*pal); 967#endif 968#endif 969} 970 971// 972// I_FinishUpdate 973// 974 975void I_FinishUpdate (void) 976{ 977 int count; 978 byte *src = d_screens[0]; 979 980#if (CONFIG_LCD == LCD_H300) && !defined(SIMULATOR) 981 count = SCREENWIDTH*SCREENHEIGHT; 982 983 /* ASM screen update (drops ~300 tics) */ 984 asm volatile ( 985 "move.w #33, (%[LCD]) \n" /* Setup the LCD controller */ 986 "nop \n" 987 "clr.w (%[LCD2]) \n" 988 "nop \n" 989 "move.w #34, (%[LCD]) \n" /* End LCD controller setup */ 990 "clr.l %%d1 \n" 991 ".loop: \n" 992 "move.l (%[scrp])+, %%d0 \n" 993 "swap.w %%d0 \n" 994 "move.w %%d0, %%d1 \n" 995 "lsr.l #8,%%d1 \n" 996 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n" 997 "move.b %%d0,%%d1 \n" 998 "swap.w %%d0 \n" 999 "nop \n" 1000 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n" 1001 "move.w %%d0, %%d1 \n" 1002 "lsr.l #8,%%d1 \n" 1003 "nop \n" 1004 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n" 1005 "move.b %%d0,%%d1 \n" 1006 "nop \n" 1007 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n" 1008 "subq.l #4,%[cnt] \n" 1009 "bne.b .loop \n" 1010 : /* outputs */ 1011 [scrp]"+a"(src), 1012 [cnt] "+d"(count) 1013 : /* inputs */ 1014 [pal] "a" (palette), 1015 [LCD] "a" (0xf0000000), 1016 [LCD2]"a" (0xf0000002) 1017 : /* clobbers */ 1018 "d0", "d1" 1019 ); 1020#elif (CONFIG_LCD == LCD_X5) && !defined(SIMULATOR) \ 1021 && defined(CPU_COLDFIRE) /* protect from using it on e200 (sic!) */ 1022 count = SCREENWIDTH*SCREENHEIGHT; 1023 1024 /* ASM screen update (drops ~230 tics) */ 1025 asm volatile ( 1026 "clr.w (%[LCD]) \n" /* Setup the LCD controller */ 1027 "move.w #(33<<1), (%[LCD]) \n" 1028 "clr.w (%[LCD2]) \n" 1029 "clr.w (%[LCD2]) \n" 1030 "clr.w (%[LCD]) \n" /* End LCD controller setup */ 1031 "move.w #(34<<1), (%[LCD]) \n" 1032 "clr.l %%d1 \n" 1033 ".loop: \n" 1034 "move.l (%[scrp])+, %%d0 \n" 1035 "swap.w %%d0 \n" 1036 "move.w %%d0, %%d1 \n" 1037 "lsr.l #8,%%d1 \n" 1038 "move.w (%[pal], %%d1.l:2), %%d2 \n" 1039 "move.l %%d2, %%d3 \n" 1040 "lsr.l #7, %%d3 \n" 1041 "move.w %%d3, (%[LCD2]) \n" 1042 "lsl.l #1, %%d2 \n" 1043 "move.w %%d2, (%[LCD2]) \n" 1044 "move.b %%d0,%%d1 \n" 1045 "move.w (%[pal], %%d1.l:2), %%d2 \n" 1046 "move.l %%d2, %%d3 \n" 1047 "lsr.l #7, %%d3 \n" 1048 "move.w %%d3, (%[LCD2]) \n" 1049 "lsl.l #1, %%d2 \n" 1050 "move.w %%d2, (%[LCD2]) \n" 1051 "swap.w %%d0 \n" 1052 "move.w %%d0, %%d1 \n" 1053 "lsr.l #8,%%d1 \n" 1054 "move.w (%[pal], %%d1.l:2), %%d2 \n" 1055 "move.l %%d2, %%d3 \n" 1056 "lsr.l #7, %%d3 \n" 1057 "move.w %%d3, (%[LCD2]) \n" 1058 "lsl.l #1, %%d2 \n" 1059 "move.w %%d2, (%[LCD2]) \n" 1060 "move.b %%d0,%%d1 \n" 1061 "move.w (%[pal], %%d1.l:2), %%d2 \n" 1062 "move.l %%d2, %%d3 \n" 1063 "lsr.l #7, %%d3 \n" 1064 "move.w %%d3, (%[LCD2]) \n" 1065 "lsl.l #1, %%d2 \n" 1066 "move.w %%d2, (%[LCD2]) \n" 1067 "subq.l #4,%[cnt] \n" 1068 "bne.b .loop \n" 1069 : /* outputs */ 1070 [scrp]"+a"(src), 1071 [cnt] "+d"(count) 1072 : /* inputs */ 1073 [pal] "a" (palette), 1074 [LCD] "a" (0xf0008000), 1075 [LCD2]"a" (0xf0008002) 1076 : /* clobbers */ 1077 "d0", "d1", "d2", "d3" 1078 ); 1079#else 1080 1081/* If the hardware has support for a paletted mode it takes precidence */ 1082#if defined(HAVE_LCD_MODES) 1083#if (HAVE_LCD_MODES & LCD_MODE_PAL256) 1084 (void) count; 1085 rb->lcd_blit_pal256(src, 0, 0, 0, 0, LCD_WIDTH, LCD_HEIGHT); 1086#endif 1087#elif defined(HAVE_LCD_COLOR) 1088 static fb_data *lcd_fb = NULL; 1089 if (!lcd_fb) 1090 { 1091 struct viewport *vp_main = *(rb->screens[SCREEN_MAIN]->current_viewport); 1092 lcd_fb = vp_main->buffer->fb_ptr; 1093 } 1094#if(LCD_HEIGHT>LCD_WIDTH) 1095 if(rotate_screen) 1096 { 1097 int y; 1098 1099 for (y = 1; y <= SCREENHEIGHT; y++) 1100 { 1101 fb_data *dst = lcd_fb + LCD_WIDTH - y; 1102 count = SCREENWIDTH; 1103 1104 do 1105 { 1106 *dst = palette[*src++]; 1107 dst += LCD_WIDTH; 1108 } 1109 while (--count); 1110 } 1111 } 1112 else 1113#endif 1114 { 1115 fb_data *dst = lcd_fb; 1116 count = SCREENWIDTH*SCREENHEIGHT; 1117 1118 do 1119 *dst++ = palette[*src++]; 1120 while (--count); 1121 } 1122 rb->lcd_update(); 1123#else /* !HAVE_LCD_COLOR */ 1124 1125 unsigned char *dst; 1126 int y; 1127 1128 for (y = 0; y < SCREENHEIGHT; y++) 1129 { 1130 dst = greybuffer; 1131 count = SCREENWIDTH; 1132 1133 do 1134 *dst++ = palette[*src++]; 1135 while (--count); 1136 1137 grey_ub_gray_bitmap(greybuffer, 0, y, SCREENWIDTH, 1); 1138 } 1139#endif 1140#endif 1141} 1142 1143// 1144// I_ReadScreen 1145// 1146void I_ReadScreen (byte* scr) 1147{ 1148 memcpy (scr, d_screens[0], LCD_WIDTH*LCD_HEIGHT); 1149} 1150 1151// 1152// I_SetPalette 1153// 1154void I_SetPalette (int pal) 1155{ 1156 I_UploadNewPalette(pal); 1157} 1158 1159// 1160// I_InitGraphics 1161// 1162void I_InitGraphics(void) 1163{ 1164 printf("Starting Graphics engine\n"); 1165 1166 noprintf=1; 1167 1168#if defined(HAVE_LCD_MODES) 1169#if (HAVE_LCD_MODES & LCD_MODE_PAL256) 1170 rb->lcd_set_mode(LCD_MODE_PAL256); 1171#endif 1172#endif 1173 1174 /* Note: The other screens are allocated as needed */ 1175 1176#ifndef HAVE_LCD_COLOR 1177 gbuf=malloc(GREYBUFSIZE); 1178 grey_init(gbuf, GREYBUFSIZE, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL); 1179 /* switch on greyscale overlay */ 1180 grey_show(true); 1181#endif 1182 1183#ifdef CPU_COLDFIRE 1184 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE); 1185 d_screens[0] = fastscreen; 1186#else 1187 // Don't know if this will fit in other IRAMs 1188 d_screens[0] = malloc (LCD_WIDTH * LCD_HEIGHT * sizeof(unsigned char)); 1189#endif 1190}