Prepare new maemo release
[maemo-rb.git] / apps / plugins / doom / i_video.c
blobe04713d1328d0e4e8d32d7cdc2486592f3487a96
1 /* Emacs style mode select -*- C++ -*-
2 *-----------------------------------------------------------------------------
4 * $Id$
6 * Copyright (C) 1993-1996 by id Software, Inc.
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.
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.
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).
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.
25 * Revision 1.24 2006-09-05 00:23:06 barrywardell
26 * Fix not being able to exit Doom on the H10.
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.
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.
34 * Revision 1.21 2006-08-07 01:57:29 amiconn
35 * Fix red iPod g3 build.
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
40 * Revision 1.19 2006-08-03 20:17:22 bagder
41 * Barry Wardell's keymappings for H10
43 * Revision 1.18 2006-08-02 00:21:59 amiconn
44 * Grayscale library: LCD linearisation and gamma correction.
46 * Revision 1.17 2006-04-22 03:48:15 kkurbjun
47 * Better video update, add options to startup menu, change default screensize
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
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.
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.
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
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
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.
67 * Revision 1.10 2006-04-04 12:00:53 dave
68 * iPod: Make the hold switch bring up the in-game menu.
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
73 * Revision 1.8 2006-04-03 17:11:42 kkurbjun
74 * Finishing touches
76 * Revision 1.7 2006-04-03 16:30:12 kkurbjun
77 * Fix #if
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
83 * Revision 1.4 2006-04-02 20:45:24 kkurbjun
84 * Properly ifdef H300 video code, fix commented line handling rockbox volume
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.
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
96 * Revision 1.1 2006-03-28 15:44:01 dave
97 * Patch #2969 - Doom! Currently only working on the H300.
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
106 *-----------------------------------------------------------------------------
109 #include "doomstat.h"
110 #include "i_system.h"
111 #include "v_video.h"
112 #include "m_argv.h"
113 #include "d_main.h"
115 #include "doomdef.h"
117 #include "rockmacros.h"
119 #ifndef HAVE_LCD_COLOR
120 #include "lib/grey.h"
121 GREY_INFO_STRUCT_IRAM
122 static unsigned char greybuffer[LCD_WIDTH] IBSS_ATTR; /* off screen buffer */
123 static 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
131 #if defined(CPU_COLDFIRE)
132 static char fastscreen[LCD_WIDTH*LCD_HEIGHT] IBSS_ATTR;
133 #endif
135 static fb_data palette[256] IBSS_ATTR;
136 static fb_data *paldata=NULL;
139 // I_ShutdownGraphics
141 void I_ShutdownGraphics(void)
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
149 #ifndef HAVE_LCD_COLOR
150 grey_release();
151 #endif
152 noprintf=0;
156 // I_StartTic
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
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
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
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
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
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
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
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
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
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
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
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
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
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
319 #elif CONFIG_KEYPAD == IAUDIO67_PAD
320 #define DOOMBUTTON_ESC BUTTON_POWER
321 #define DOOMBUTTON_UP BUTTON_STOP
322 #define DOOMBUTTON_DOWN BUTTON_PLAY
323 #define DOOMBUTTON_LEFT BUTTON_LEFT
324 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
325 #define DOOMBUTTON_SHOOT BUTTON_VOLUP
326 #define DOOMBUTTON_OPEN BUTTON_VOLDOWN
327 #define DOOMBUTTON_ENTER BUTTON_MENU
329 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
330 #define DOOMBUTTON_UP BUTTON_UP
331 #define DOOMBUTTON_DOWN BUTTON_DOWN
332 #define DOOMBUTTON_LEFT BUTTON_LEFT
333 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
334 #define DOOMBUTTON_SHOOT BUTTON_SELECT
335 #define DOOMBUTTON_OPEN BUTTON_PLAY
336 #define DOOMBUTTON_ESC BUTTON_BACK
337 #define DOOMBUTTON_ENTER BUTTON_PLAY
338 #define DOOMBUTTON_WEAPON BUTTON_MENU
339 #define DOOMBUTTON_MAP BUTTON_CUSTOM
341 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
342 #define DOOMBUTTON_UP BUTTON_UP
343 #define DOOMBUTTON_DOWN BUTTON_DOWN
344 #define DOOMBUTTON_LEFT BUTTON_LEFT
345 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
346 #define DOOMBUTTON_SHOOT BUTTON_PLAYLIST
347 #define DOOMBUTTON_OPEN BUTTON_MENU
348 #define DOOMBUTTON_ESC BUTTON_POWER
349 #define DOOMBUTTON_ENTER BUTTON_VIEW
350 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
351 #define DOOMBUTTON_MAP BUTTON_VOL_UP
353 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
354 #define DOOMBUTTON_UP BUTTON_UP
355 #define DOOMBUTTON_DOWN BUTTON_DOWN
356 #define DOOMBUTTON_LEFT BUTTON_LEFT
357 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
358 #define DOOMBUTTON_SHOOT BUTTON_NEXT
359 #define DOOMBUTTON_OPEN BUTTON_MENU
360 #define DOOMBUTTON_ESC BUTTON_POWER
361 #define DOOMBUTTON_ENTER BUTTON_PLAY
362 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
363 #define DOOMBUTTON_MAP BUTTON_VOL_UP
365 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
366 #define DOOMBUTTON_UP BUTTON_UP
367 #define DOOMBUTTON_DOWN BUTTON_DOWN
368 #define DOOMBUTTON_LEFT BUTTON_PREV
369 #define DOOMBUTTON_RIGHT BUTTON_NEXT
370 #define DOOMBUTTON_SHOOT BUTTON_RIGHT
371 #define DOOMBUTTON_OPEN BUTTON_MENU
372 #define DOOMBUTTON_ESC BUTTON_POWER
373 #define DOOMBUTTON_ENTER BUTTON_LEFT
374 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
375 #define DOOMBUTTON_MAP BUTTON_VOL_UP
377 #elif CONFIG_KEYPAD == ONDAVX747_PAD
378 #define DOOMBUTTON_ESC BUTTON_POWER
379 #define DOOMBUTTON_SHOOT BUTTON_VOL_UP
380 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
381 #define DOOMBUTTON_MAP BUTTON_MENU
383 #elif CONFIG_KEYPAD == ONDAVX777_PAD
384 #define DOOMBUTTON_ESC BUTTON_POWER
386 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
387 #define DOOMBUTTON_UP BUTTON_UP
388 #define DOOMBUTTON_DOWN BUTTON_DOWN
389 #define DOOMBUTTON_LEFT BUTTON_LEFT
390 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
391 #define DOOMBUTTON_SHOOT BUTTON_PLAY
392 #define DOOMBUTTON_OPEN (BUTTON_PLAY|BUTTON_LEFT)
393 #define DOOMBUTTON_ESC BUTTON_REC
394 #define DOOMBUTTON_ENTER (BUTTON_PLAY|BUTTON_RIGHT)
395 #define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_UP)
396 #define DOOMBUTTON_MAP (BUTTON_PLAY|BUTTON_DOWN)
398 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
399 #define DOOMBUTTON_UP BUTTON_OK
400 #define DOOMBUTTON_DOWN BUTTON_CANCEL
401 #define DOOMBUTTON_LEFT BUTTON_PREV
402 #define DOOMBUTTON_RIGHT BUTTON_NEXT
403 #define DOOMBUTTON_SHOOT BUTTON_MENU
404 #define DOOMBUTTON_OPEN BUTTON_OK
405 #define DOOMBUTTON_ESC BUTTON_REC
406 #define DOOMBUTTON_ENTER BUTTON_POWER
407 #define DOOMBUTTON_WEAPON BUTTON_PLAY
409 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
410 #define DOOMBUTTON_UP BUTTON_REW
411 #define DOOMBUTTON_DOWN BUTTON_FF
412 #define DOOMBUTTON_LEFT BUTTON_VOL_DOWN
413 #define DOOMBUTTON_RIGHT BUTTON_VOL_UP
414 #define DOOMBUTTON_SHOOT BUTTON_FUNC
415 #define DOOMBUTTON_OPEN (BUTTON_FUNC|BUTTON_PLAY)
416 #define DOOMBUTTON_ESC BUTTON_REC
417 #define DOOMBUTTON_ENTER BUTTON_PLAY
418 #define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_REPEAT)
420 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
421 #define DOOMBUTTON_UP BUTTON_UP
422 #define DOOMBUTTON_DOWN BUTTON_DOWN
423 #define DOOMBUTTON_LEFT BUTTON_REW
424 #define DOOMBUTTON_RIGHT BUTTON_FF
425 #define DOOMBUTTON_SHOOT BUTTON_ENTER
426 #define DOOMBUTTON_OPEN BUTTON_MENU
427 #define DOOMBUTTON_ESC BUTTON_REC
428 #define DOOMBUTTON_ENTER (BUTTON_PLAY|BUTTON_REPEAT)
429 #define DOOMBUTTON_WEAPON BUTTON_PLAY
431 #elif CONFIG_KEYPAD == SANSA_FUZEPLUS_PAD
432 #define DOOMBUTTON_UP BUTTON_UP
433 #define DOOMBUTTON_DOWN BUTTON_DOWN
434 #define DOOMBUTTON_LEFT BUTTON_LEFT
435 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
436 #define DOOMBUTTON_OPEN BUTTON_PLAYPAUSE
437 #define DOOMBUTTON_QUIT BUTTON_POWER
438 #define DOOMBUTTON_ESC BUTTON_BACK
439 #define DOOMBUTTON_ENTER BUTTON_SELECT
440 #define DOOMBUTTON_SHOOT BUTTON_SELECT
441 #define DOOMBUTTON_WEAPON BUTTON_BOTTOMLEFT
442 #define DOOMBUTTON_MAP BUTTON_BOTTOMRIGHT
444 #elif CONFIG_KEYPAD == SANSA_CONNECT_PAD
445 #define DOOMBUTTON_UP BUTTON_UP
446 #define DOOMBUTTON_DOWN BUTTON_DOWN
447 #define DOOMBUTTON_LEFT BUTTON_LEFT
448 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
449 #define DOOMBUTTON_SHOOT BUTTON_SELECT
450 #define DOOMBUTTON_OPEN BUTTON_VOL_DOWN
451 #define DOOMBUTTON_ESC BUTTON_VOL_UP
452 #define DOOMBUTTON_ENTER BUTTON_NEXT
453 #define DOOMBUTTON_WEAPON BUTTON_PREV
455 #elif CONFIG_KEYPAD == SAMSUNG_YPR0_PAD
456 #define DOOMBUTTON_UP BUTTON_UP
457 #define DOOMBUTTON_DOWN BUTTON_DOWN
458 #define DOOMBUTTON_LEFT BUTTON_LEFT
459 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
460 #define DOOMBUTTON_SHOOT BUTTON_SELECT
461 #define DOOMBUTTON_OPEN BUTTON_MENU
462 #define DOOMBUTTON_ESC BUTTON_BACK
463 #define DOOMBUTTON_ENTER BUTTON_POWER
464 #define DOOMBUTTON_WEAPON BUTTON_USER
466 #elif CONFIG_KEYPAD == HM60X_PAD
467 #define DOOMBUTTON_UP BUTTON_UP
468 #define DOOMBUTTON_DOWN BUTTON_DOWN
469 #define DOOMBUTTON_LEFT BUTTON_LEFT
470 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
471 #define DOOMBUTTON_OPEN (BUTTON_POWER | BUTTON_SELECT)
472 #define DOOMBUTTON_QUIT BUTTON_POWER
473 #define DOOMBUTTON_ESC (BUTTON_POWER | BUTTON_UP)
474 #define DOOMBUTTON_ENTER BUTTON_SELECT
475 #define DOOMBUTTON_SHOOT BUTTON_SELECT
476 #define DOOMBUTTON_WEAPON (BUTTON_POWER | BUTTON_LEFT)
477 #define DOOMBUTTON_MAP (BUTTON_POWER | BUTTON_RIGHT)
479 #elif CONFIG_KEYPAD == HM801_PAD
480 #define DOOMBUTTON_UP BUTTON_UP
481 #define DOOMBUTTON_DOWN BUTTON_DOWN
482 #define DOOMBUTTON_LEFT BUTTON_LEFT
483 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
484 #define DOOMBUTTON_OPEN BUTTON_PLAY
485 #define DOOMBUTTON_QUIT BUTTON_POWER
486 #define DOOMBUTTON_ESC (BUTTON_POWER | BUTTON_SELECT)
487 #define DOOMBUTTON_ENTER BUTTON_SELECT
488 #define DOOMBUTTON_SHOOT BUTTON_SELECT
489 #define DOOMBUTTON_WEAPON BUTTON_PREV
490 #define DOOMBUTTON_MAP BUTTON_NEXT
492 #else
493 #error Keymap not defined!
494 #endif
496 #ifdef HAVE_TOUCHSCREEN
497 #ifndef DOOMBUTTON_UP
498 #define DOOMBUTTON_UP BUTTON_TOPMIDDLE
499 #endif
500 #ifndef DOOMBUTTON_DOWN
501 #define DOOMBUTTON_DOWN BUTTON_BOTTOMMIDDLE
502 #endif
503 #ifndef DOOMBUTTON_LEFT
504 #define DOOMBUTTON_LEFT BUTTON_MIDLEFT
505 #endif
506 #ifndef DOOMBUTTON_RIGHT
507 #define DOOMBUTTON_RIGHT BUTTON_MIDRIGHT
508 #endif
509 #ifndef DOOMBUTTON_SHOOT
510 #define DOOMBUTTON_SHOOT BUTTON_BOTTOMRIGHT
511 #endif
512 #ifndef DOOMBUTTON_OPEN
513 #define DOOMBUTTON_OPEN BUTTON_TOPRIGHT
514 #endif
515 #ifndef DOOMBUTTON_ESC
516 #define DOOMBUTTON_ESC BUTTON_TOPLEFT
517 #endif
518 #ifndef DOOMBUTTON_ENTER
519 #define DOOMBUTTON_ENTER BUTTON_CENTER
520 #endif
521 #ifndef DOOMBUTTON_WEAPON
522 #define DOOMBUTTON_WEAPON BUTTON_BOTTOMLEFT
523 #endif
524 #endif
526 #ifdef DOOMBUTTON_SCROLLWHEEL
527 /* Scrollwheel events are posted directly and not polled by the button
528 driver - synthesize polling */
529 static inline unsigned int read_scroll_wheel(void)
531 unsigned int buttons = BUTTON_NONE;
532 unsigned int btn;
534 /* Empty out the button queue and see if any scrollwheel events were
535 posted */
538 btn = rb->button_get_w_tmo(0);
539 buttons |= btn;
541 while (btn != BUTTON_NONE);
543 return buttons & (DOOMBUTTON_SCROLLWHEEL_CC | DOOMBUTTON_SCROLLWHEEL_CW);
545 #endif
547 static inline void getkey()
549 event_t event;
550 /* Same button handling as rockboy */
551 static unsigned int oldbuttonstate IDATA_ATTR = 0;
553 unsigned int released, pressed, newbuttonstate;
555 #ifdef HAS_BUTTON_HOLD
556 static unsigned int holdbutton IDATA_ATTR=0;
557 static bool hswitch IDATA_ATTR=0;
558 if (rb->button_hold()&~holdbutton)
560 if(hswitch==0)
562 event.type = ev_keydown;
563 hswitch=1;
565 else
567 event.type = ev_keyup;
568 hswitch=0;
570 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
571 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
572 /* Bring up the menu */
573 event.data1=KEY_ESCAPE;
574 #else
575 /* Enable run */
576 event.data1=KEY_CAPSLOCK;
577 #endif
578 D_PostEvent(&event);
580 holdbutton=rb->button_hold();
581 #endif
583 #ifdef DOOMBUTTON_SCROLLWHEEL
584 /* use button_get(false) for clickwheel checks */
585 int button; /* move me */
586 button = rb->button_get(false);
587 switch(button){
588 case DOOMBUTTON_SCROLLWHEEL_CC | BUTTON_REPEAT:
589 case DOOMBUTTON_SCROLLWHEEL_CC:
590 event.type = ev_scroll;
591 event.data1=-1;
592 D_PostEvent(&event);
593 break;
594 case DOOMBUTTON_SCROLLWHEEL_CW | BUTTON_REPEAT:
595 case DOOMBUTTON_SCROLLWHEEL_CW:
596 event.type = ev_scroll;
597 //event.data1=KEY_LEFTARROW;
598 event.data1=1;
599 D_PostEvent(&event);
600 break;
602 #endif
603 newbuttonstate = rb->button_status();
604 #ifdef DOOMBUTTON_SCROLLWHEEL
605 newbuttonstate |= read_scroll_wheel();
606 #endif
608 if(newbuttonstate==oldbuttonstate) /* Don't continue, nothing left to do */
609 return;
610 released = ~newbuttonstate & oldbuttonstate;
611 pressed = newbuttonstate & ~oldbuttonstate;
612 oldbuttonstate = newbuttonstate;
613 if(released)
615 event.type = ev_keyup;
616 if(released & DOOMBUTTON_LEFT)
618 event.data1=KEY_LEFTARROW;
619 D_PostEvent(&event);
621 if(released & DOOMBUTTON_RIGHT)
623 event.data1=KEY_RIGHTARROW;
624 D_PostEvent(&event);
626 #ifdef DOOMBUTTON_DOWN
627 if(released & DOOMBUTTON_DOWN)
629 event.data1=KEY_DOWNARROW;
630 D_PostEvent(&event);
632 #endif
633 if(released & DOOMBUTTON_UP)
635 event.data1=KEY_UPARROW;
636 D_PostEvent(&event);
638 if(released & DOOMBUTTON_SHOOT)
640 event.data1=KEY_RCTRL;
641 D_PostEvent(&event);
643 if(released & DOOMBUTTON_OPEN)
645 event.data1=' ';
646 D_PostEvent(&event);
648 #ifdef DOOMBUTTON_ESC
649 if(released & DOOMBUTTON_ESC)
651 event.data1=KEY_ESCAPE;
652 D_PostEvent(&event);
654 #endif
655 if(released & DOOMBUTTON_ENTER)
657 event.data1=KEY_ENTER;
658 D_PostEvent(&event);
660 #ifdef DOOMBUTTON_WEAPON
661 if(released & DOOMBUTTON_WEAPON)
663 event.data1 ='w';
664 D_PostEvent(&event);
666 #endif
667 #ifdef DOOMBUTTON_MAP
668 if(released & DOOMBUTTON_MAP)
670 event.data1 =KEY_TAB;
671 D_PostEvent(&event);
673 #endif
675 if(pressed)
677 event.type = ev_keydown;
678 if(pressed & DOOMBUTTON_LEFT)
680 event.data1=KEY_LEFTARROW;
681 D_PostEvent(&event);
683 if(pressed & DOOMBUTTON_RIGHT)
685 event.data1=KEY_RIGHTARROW;
686 D_PostEvent(&event);
688 #ifdef DOOMBUTTON_DOWN
689 if(pressed & DOOMBUTTON_DOWN)
691 event.data1=KEY_DOWNARROW;
692 D_PostEvent(&event);
694 #endif
695 if(pressed & DOOMBUTTON_UP)
697 event.data1=KEY_UPARROW;
698 D_PostEvent(&event);
700 if(pressed & DOOMBUTTON_SHOOT)
702 event.data1=KEY_RCTRL;
703 D_PostEvent(&event);
705 if(pressed & DOOMBUTTON_OPEN)
707 event.data1=' ';
708 D_PostEvent(&event);
710 #ifdef DOOMBUTTON_ESC
711 if(pressed & DOOMBUTTON_ESC)
713 event.data1=KEY_ESCAPE;
714 D_PostEvent(&event);
716 #endif
717 #ifdef DOOMBUTTON_ENTER
718 if(pressed & DOOMBUTTON_ENTER)
720 event.data1=KEY_ENTER;
721 D_PostEvent(&event);
723 #endif
724 #ifdef DOOMBUTTON_WEAPON
725 if(pressed & DOOMBUTTON_WEAPON)
727 event.data1='w';
728 D_PostEvent(&event);
730 #endif
731 #ifdef DOOMBUTTON_MAP
732 if(pressed & DOOMBUTTON_MAP)
734 event.data1 =KEY_TAB;
735 D_PostEvent(&event);
737 #endif
741 void I_StartTic (void)
743 getkey();
747 ///////////////////////////////////////////////////////////
748 // Palette stuff.
750 static void I_UploadNewPalette(int pal)
752 // This is used to replace the current 256 colour cmap with a new one
753 // Used by 256 colour PseudoColor modes
754 static int cachedgamma;
755 static size_t num_pals;
757 if ((paldata == NULL) || (cachedgamma != usegamma)) {
758 int lump = W_GetNumForName("PLAYPAL");
759 const byte *pall = W_CacheLumpNum(lump);
760 register const byte *const gtable = gammatable[cachedgamma = usegamma];
761 register int i;
763 num_pals = W_LumpLength(lump) / (3*256);
764 num_pals *= 256;
766 if (!paldata) {
767 // First call - allocate and prepare colour array
768 paldata = malloc(sizeof(*paldata)*num_pals);
771 // set the colormap entries
772 for (i=0 ; (size_t)i<num_pals ; i++) {
773 int r = gtable[pall[0]];
774 int g = gtable[pall[1]];
775 int b = gtable[pall[2]];
776 pall+=3;
777 #ifndef HAVE_LCD_COLOR
778 paldata[i]=(3*r+6*g+b)/10;
779 #else
780 paldata[i] = LCD_RGBPACK(r,g,b);
781 #endif
784 W_UnlockLumpNum(lump);
785 num_pals/=256;
788 #ifdef RANGECHECK
789 if ((size_t)pal >= num_pals)
790 I_Error("I_UploadNewPalette: Palette number out of range (%d>=%d)",
791 pal, num_pals);
792 #endif
794 memcpy(palette,paldata+256*pal,256*sizeof(fb_data));
796 #if defined(HAVE_LCD_MODES)
797 #if (HAVE_LCD_MODES & LCD_MODE_PAL256)
798 rb->lcd_pal256_update_pal(paldata+256*pal);
799 #endif
800 #endif
804 // I_FinishUpdate
807 void I_FinishUpdate (void)
809 int count;
810 byte *src = d_screens[0];
812 #if (CONFIG_LCD == LCD_H300) && !defined(SIMULATOR)
813 count = SCREENWIDTH*SCREENHEIGHT;
815 /* ASM screen update (drops ~300 tics) */
816 asm volatile (
817 "move.w #33, (%[LCD]) \n" /* Setup the LCD controller */
818 "nop \n"
819 "clr.w (%[LCD2]) \n"
820 "nop \n"
821 "move.w #34, (%[LCD]) \n" /* End LCD controller setup */
822 "clr.l %%d1 \n"
823 ".loop: \n"
824 "move.l (%[scrp])+, %%d0 \n"
825 "swap.w %%d0 \n"
826 "move.w %%d0, %%d1 \n"
827 "lsr.l #8,%%d1 \n"
828 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
829 "move.b %%d0,%%d1 \n"
830 "swap.w %%d0 \n"
831 "nop \n"
832 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
833 "move.w %%d0, %%d1 \n"
834 "lsr.l #8,%%d1 \n"
835 "nop \n"
836 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
837 "move.b %%d0,%%d1 \n"
838 "nop \n"
839 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
840 "subq.l #4,%[cnt] \n"
841 "bne.b .loop \n"
842 : /* outputs */
843 [scrp]"+a"(src),
844 [cnt] "+d"(count)
845 : /* inputs */
846 [pal] "a" (palette),
847 [LCD] "a" (0xf0000000),
848 [LCD2]"a" (0xf0000002)
849 : /* clobbers */
850 "d0", "d1"
852 #elif (CONFIG_LCD == LCD_X5) && !defined(SIMULATOR) \
853 && defined(CPU_COLDFIRE) /* protect from using it on e200 (sic!) */
854 count = SCREENWIDTH*SCREENHEIGHT;
856 /* ASM screen update (drops ~230 tics) */
857 asm volatile (
858 "clr.w (%[LCD]) \n" /* Setup the LCD controller */
859 "move.w #(33<<1), (%[LCD]) \n"
860 "clr.w (%[LCD2]) \n"
861 "clr.w (%[LCD2]) \n"
862 "clr.w (%[LCD]) \n" /* End LCD controller setup */
863 "move.w #(34<<1), (%[LCD]) \n"
864 "clr.l %%d1 \n"
865 ".loop: \n"
866 "move.l (%[scrp])+, %%d0 \n"
867 "swap.w %%d0 \n"
868 "move.w %%d0, %%d1 \n"
869 "lsr.l #8,%%d1 \n"
870 "move.w (%[pal], %%d1.l:2), %%d2 \n"
871 "move.l %%d2, %%d3 \n"
872 "lsr.l #7, %%d3 \n"
873 "move.w %%d3, (%[LCD2]) \n"
874 "lsl.l #1, %%d2 \n"
875 "move.w %%d2, (%[LCD2]) \n"
876 "move.b %%d0,%%d1 \n"
877 "move.w (%[pal], %%d1.l:2), %%d2 \n"
878 "move.l %%d2, %%d3 \n"
879 "lsr.l #7, %%d3 \n"
880 "move.w %%d3, (%[LCD2]) \n"
881 "lsl.l #1, %%d2 \n"
882 "move.w %%d2, (%[LCD2]) \n"
883 "swap.w %%d0 \n"
884 "move.w %%d0, %%d1 \n"
885 "lsr.l #8,%%d1 \n"
886 "move.w (%[pal], %%d1.l:2), %%d2 \n"
887 "move.l %%d2, %%d3 \n"
888 "lsr.l #7, %%d3 \n"
889 "move.w %%d3, (%[LCD2]) \n"
890 "lsl.l #1, %%d2 \n"
891 "move.w %%d2, (%[LCD2]) \n"
892 "move.b %%d0,%%d1 \n"
893 "move.w (%[pal], %%d1.l:2), %%d2 \n"
894 "move.l %%d2, %%d3 \n"
895 "lsr.l #7, %%d3 \n"
896 "move.w %%d3, (%[LCD2]) \n"
897 "lsl.l #1, %%d2 \n"
898 "move.w %%d2, (%[LCD2]) \n"
899 "subq.l #4,%[cnt] \n"
900 "bne.b .loop \n"
901 : /* outputs */
902 [scrp]"+a"(src),
903 [cnt] "+d"(count)
904 : /* inputs */
905 [pal] "a" (palette),
906 [LCD] "a" (0xf0008000),
907 [LCD2]"a" (0xf0008002)
908 : /* clobbers */
909 "d0", "d1", "d2", "d3"
911 #else
913 /* If the hardware has support for a paletted mode it takes precidence */
914 #if defined(HAVE_LCD_MODES)
915 #if (HAVE_LCD_MODES & LCD_MODE_PAL256)
916 (void) count;
917 rb->lcd_blit_pal256(src, 0, 0, 0, 0, LCD_WIDTH, LCD_HEIGHT);
918 #endif
919 #elif defined(HAVE_LCD_COLOR)
920 #if(LCD_HEIGHT>LCD_WIDTH)
921 if(rotate_screen)
923 int y;
925 for (y = 1; y <= SCREENHEIGHT; y++)
927 fb_data *dst = rb->lcd_framebuffer + LCD_WIDTH - y;
928 count = SCREENWIDTH;
932 *dst = palette[*src++];
933 dst += LCD_WIDTH;
935 while (--count);
938 else
939 #endif
941 fb_data *dst = rb->lcd_framebuffer;
942 count = SCREENWIDTH*SCREENHEIGHT;
945 *dst++ = palette[*src++];
946 while (--count);
948 rb->lcd_update();
949 #else /* !HAVE_LCD_COLOR */
951 unsigned char *dst;
952 int y;
954 for (y = 0; y < SCREENHEIGHT; y++)
956 dst = greybuffer;
957 count = SCREENWIDTH;
960 *dst++ = palette[*src++];
961 while (--count);
963 grey_ub_gray_bitmap(greybuffer, 0, y, SCREENWIDTH, 1);
965 #endif
966 #endif
970 // I_ReadScreen
972 void I_ReadScreen (byte* scr)
974 memcpy (scr, d_screens[0], LCD_WIDTH*LCD_HEIGHT);
978 // I_SetPalette
980 void I_SetPalette (int pal)
982 I_UploadNewPalette(pal);
986 // I_InitGraphics
988 void I_InitGraphics(void)
990 printf("Starting Graphics engine\n");
992 noprintf=1;
994 #if defined(HAVE_LCD_MODES)
995 #if (HAVE_LCD_MODES & LCD_MODE_PAL256)
996 rb->lcd_set_mode(LCD_MODE_PAL256);
997 #endif
998 #endif
1000 /* Note: The other screens are allocated as needed */
1002 #ifndef HAVE_LCD_COLOR
1003 gbuf=malloc(GREYBUFSIZE);
1004 grey_init(gbuf, GREYBUFSIZE, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL);
1005 /* switch on greyscale overlay */
1006 grey_show(true);
1007 #endif
1009 #ifdef CPU_COLDFIRE
1010 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
1011 d_screens[0] = fastscreen;
1012 #else
1013 // Don't know if this will fit in other IRAMs
1014 d_screens[0] = malloc (LCD_WIDTH * LCD_HEIGHT * sizeof(unsigned char));
1015 #endif