A modern Music Player Daemon based on Rockbox open source high quality audio player
libadwaita
audio
rust
zig
deno
mpris
rockbox
mpd
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}