HD300 - plugins keymaps
[kugel-rb.git] / apps / plugins / doom / i_video.c
blobd9472663c455bef1d788573e83086badb25827c5
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_UP BUTTON_MENU
163 #define DOOMBUTTON_WEAPON BUTTON_SELECT
164 #define DOOMBUTTON_LEFT BUTTON_LEFT
165 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
166 #define DOOMBUTTON_SHOOT BUTTON_PLAY
167 #define DOOMBUTTON_ENTER BUTTON_SELECT
168 #define DOOMBUTTON_OPEN BUTTON_MENU
169 #elif CONFIG_KEYPAD == IAUDIO_X5M5_PAD
170 #define DOOMBUTTON_UP BUTTON_UP
171 #define DOOMBUTTON_DOWN BUTTON_DOWN
172 #define DOOMBUTTON_LEFT BUTTON_LEFT
173 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
174 #define DOOMBUTTON_SHOOT BUTTON_SELECT
175 #define DOOMBUTTON_OPEN BUTTON_PLAY
176 #define DOOMBUTTON_ESC BUTTON_POWER
177 #define DOOMBUTTON_ENTER BUTTON_SELECT
178 #define DOOMBUTTON_WEAPON BUTTON_REC
179 #elif CONFIG_KEYPAD == IRIVER_H10_PAD
180 #define DOOMBUTTON_UP BUTTON_SCROLL_UP
181 #define DOOMBUTTON_DOWN BUTTON_SCROLL_DOWN
182 #define DOOMBUTTON_LEFT BUTTON_LEFT
183 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
184 #define DOOMBUTTON_SHOOT BUTTON_REW
185 #define DOOMBUTTON_OPEN BUTTON_PLAY
186 #define DOOMBUTTON_ESC BUTTON_POWER
187 #define DOOMBUTTON_ENTER BUTTON_REW
188 #define DOOMBUTTON_WEAPON BUTTON_FF
189 #elif CONFIG_KEYPAD == SANSA_E200_PAD
190 #define DOOMBUTTON_SCROLLWHEEL
191 #define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
192 #define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
193 #define DOOMBUTTON_UP BUTTON_UP
194 #define DOOMBUTTON_DOWN BUTTON_DOWN
195 #define DOOMBUTTON_LEFT BUTTON_LEFT
196 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
197 #define DOOMBUTTON_SHOOT BUTTON_SELECT
198 #define DOOMBUTTON_OPEN BUTTON_REC
199 #define DOOMBUTTON_ESC BUTTON_POWER
200 #define DOOMBUTTON_ENTER BUTTON_SELECT
201 #define DOOMBUTTON_WEAPON DOOMBUTTON_SCROLLWHEEL_CW
202 #elif CONFIG_KEYPAD == SANSA_FUZE_PAD
203 #define DOOMBUTTON_SCROLLWHEEL
204 #define DOOMBUTTON_SCROLLWHEEL_CC BUTTON_SCROLL_BACK
205 #define DOOMBUTTON_SCROLLWHEEL_CW BUTTON_SCROLL_FWD
206 #define DOOMBUTTON_UP BUTTON_UP
207 #define DOOMBUTTON_DOWN BUTTON_DOWN
208 #define DOOMBUTTON_LEFT BUTTON_LEFT
209 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
210 #define DOOMBUTTON_SHOOT BUTTON_SELECT
211 #define DOOMBUTTON_OPEN BUTTON_POWER
212 #define DOOMBUTTON_ESC BUTTON_HOME
213 #define DOOMBUTTON_ENTER BUTTON_SELECT
214 #define DOOMBUTTON_WEAPON DOOMBUTTON_SCROLLWHEEL_CW
215 #elif CONFIG_KEYPAD == SANSA_C200_PAD
216 #define DOOMBUTTON_UP BUTTON_UP
217 #define DOOMBUTTON_DOWN BUTTON_DOWN
218 #define DOOMBUTTON_LEFT BUTTON_LEFT
219 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
220 #define DOOMBUTTON_SHOOT BUTTON_SELECT
221 #define DOOMBUTTON_OPEN BUTTON_REC
222 #define DOOMBUTTON_ESC BUTTON_POWER
223 #define DOOMBUTTON_ENTER BUTTON_SELECT
224 #define DOOMBUTTON_WEAPON BUTTON_VOL_UP
225 #elif CONFIG_KEYPAD == SANSA_CLIP_PAD
226 #define DOOMBUTTON_UP BUTTON_UP
227 #define DOOMBUTTON_DOWN BUTTON_DOWN
228 #define DOOMBUTTON_LEFT BUTTON_LEFT
229 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
230 #define DOOMBUTTON_SHOOT BUTTON_SELECT
231 #define DOOMBUTTON_OPEN BUTTON_HOME
232 #define DOOMBUTTON_ESC BUTTON_POWER
233 #define DOOMBUTTON_ENTER BUTTON_SELECT
234 #define DOOMBUTTON_WEAPON BUTTON_VOL_UP
235 #elif CONFIG_KEYPAD == GIGABEAT_PAD
236 #define DOOMBUTTON_UP BUTTON_UP
237 #define DOOMBUTTON_DOWN BUTTON_DOWN
238 #define DOOMBUTTON_LEFT BUTTON_LEFT
239 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
240 #define DOOMBUTTON_SHOOT BUTTON_A
241 #define DOOMBUTTON_OPEN BUTTON_MENU
242 #define DOOMBUTTON_ESC BUTTON_POWER
243 #define DOOMBUTTON_ENTER BUTTON_SELECT
244 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
245 #define DOOMBUTTON_MAP BUTTON_VOL_UP
246 #elif CONFIG_KEYPAD == GIGABEAT_S_PAD
247 #define DOOMBUTTON_UP BUTTON_UP
248 #define DOOMBUTTON_DOWN BUTTON_DOWN
249 #define DOOMBUTTON_LEFT BUTTON_LEFT
250 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
251 #define DOOMBUTTON_SHOOT BUTTON_PLAY
252 #define DOOMBUTTON_OPEN BUTTON_MENU
253 #define DOOMBUTTON_ESC BUTTON_POWER
254 #define DOOMBUTTON_ENTER BUTTON_SELECT
255 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
256 #define DOOMBUTTON_MAP BUTTON_VOL_UP
257 #elif CONFIG_KEYPAD == MROBE500_PAD
258 #define DOOMBUTTON_ESC BUTTON_POWER
259 #define DOOMBUTTON_UP BUTTON_RC_PLAY
260 #define DOOMBUTTON_DOWN BUTTON_RC_DOWN
261 #define DOOMBUTTON_LEFT BUTTON_RC_REW
262 #define DOOMBUTTON_RIGHT BUTTON_RC_FF
263 #define DOOMBUTTON_OPEN BUTTON_RC_VOL_DOWN
264 #define DOOMBUTTON_SHOOT BUTTON_RC_VOL_UP
265 #define DOOMBUTTON_ENTER BUTTON_RC_MODE
266 #define DOOMBUTTON_WEAPON BUTTON_RC_HEART
267 #elif CONFIG_KEYPAD == IRIVER_H100_PAD || \
268 CONFIG_KEYPAD == IRIVER_H300_PAD
269 #define DOOMBUTTON_UP BUTTON_UP
270 #define DOOMBUTTON_DOWN BUTTON_DOWN
271 #define DOOMBUTTON_LEFT BUTTON_LEFT
272 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
273 #define DOOMBUTTON_SHOOT BUTTON_REC
274 #define DOOMBUTTON_OPEN BUTTON_MODE
275 #define DOOMBUTTON_ESC BUTTON_OFF
276 #define DOOMBUTTON_ENTER BUTTON_SELECT
277 #define DOOMBUTTON_WEAPON BUTTON_ON
278 #elif CONFIG_KEYPAD == IAUDIO_M3_PAD
279 #define DOOMBUTTON_ESC BUTTON_RC_REC
280 #define DOOMBUTTON_UP BUTTON_RC_VOL_UP
281 #define DOOMBUTTON_DOWN BUTTON_RC_VOL_DOWN
282 #define DOOMBUTTON_LEFT BUTTON_RC_REW
283 #define DOOMBUTTON_RIGHT BUTTON_RC_FF
284 #define DOOMBUTTON_OPEN BUTTON_RC_PLAY
285 #define DOOMBUTTON_SHOOT BUTTON_RC_MODE
286 #define DOOMBUTTON_ENTER BUTTON_RC_PLAY
287 #define DOOMBUTTON_WEAPON BUTTON_RC_MENU
288 #elif CONFIG_KEYPAD == COWON_D2_PAD
289 #define DOOMBUTTON_ESC BUTTON_POWER
290 #define DOOMBUTTON_SHOOT BUTTON_PLUS
291 #define DOOMBUTTON_WEAPON BUTTON_MINUS
292 #define DOOMBUTTON_MAP BUTTON_MENU
293 #elif CONFIG_KEYPAD == MROBE100_PAD
294 #define DOOMBUTTON_UP BUTTON_UP
295 #define DOOMBUTTON_DOWN BUTTON_DOWN
296 #define DOOMBUTTON_LEFT BUTTON_LEFT
297 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
298 #define DOOMBUTTON_SHOOT BUTTON_SELECT
299 #define DOOMBUTTON_OPEN BUTTON_PLAY
300 #define DOOMBUTTON_ESC BUTTON_POWER
301 #define DOOMBUTTON_ENTER BUTTON_MENU
302 #define DOOMBUTTON_WEAPON BUTTON_DISPLAY
303 #elif CONFIG_KEYPAD == IAUDIO67_PAD
304 #define DOOMBUTTON_ESC BUTTON_POWER
305 #define DOOMBUTTON_UP BUTTON_STOP
306 #define DOOMBUTTON_DOWN BUTTON_PLAY
307 #define DOOMBUTTON_LEFT BUTTON_LEFT
308 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
309 #define DOOMBUTTON_SHOOT BUTTON_VOLUP
310 #define DOOMBUTTON_OPEN BUTTON_VOLDOWN
311 #define DOOMBUTTON_ENTER BUTTON_MENU
312 #elif CONFIG_KEYPAD == CREATIVEZVM_PAD
313 #define DOOMBUTTON_UP BUTTON_UP
314 #define DOOMBUTTON_DOWN BUTTON_DOWN
315 #define DOOMBUTTON_LEFT BUTTON_LEFT
316 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
317 #define DOOMBUTTON_SHOOT BUTTON_SELECT
318 #define DOOMBUTTON_OPEN BUTTON_PLAY
319 #define DOOMBUTTON_ESC BUTTON_BACK
320 #define DOOMBUTTON_ENTER BUTTON_PLAY
321 #define DOOMBUTTON_WEAPON BUTTON_MENU
322 #define DOOMBUTTON_MAP BUTTON_CUSTOM
323 #elif CONFIG_KEYPAD == PHILIPS_HDD1630_PAD
324 #define DOOMBUTTON_UP BUTTON_UP
325 #define DOOMBUTTON_DOWN BUTTON_DOWN
326 #define DOOMBUTTON_LEFT BUTTON_LEFT
327 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
328 #define DOOMBUTTON_SHOOT BUTTON_PLAYLIST
329 #define DOOMBUTTON_OPEN BUTTON_MENU
330 #define DOOMBUTTON_ESC BUTTON_POWER
331 #define DOOMBUTTON_ENTER BUTTON_VIEW
332 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
333 #define DOOMBUTTON_MAP BUTTON_VOL_UP
334 #elif CONFIG_KEYPAD == PHILIPS_HDD6330_PAD
335 #define DOOMBUTTON_UP BUTTON_UP
336 #define DOOMBUTTON_DOWN BUTTON_DOWN
337 #define DOOMBUTTON_LEFT BUTTON_LEFT
338 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
339 #define DOOMBUTTON_SHOOT BUTTON_NEXT
340 #define DOOMBUTTON_OPEN BUTTON_MENU
341 #define DOOMBUTTON_ESC BUTTON_POWER
342 #define DOOMBUTTON_ENTER BUTTON_PLAY
343 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
344 #define DOOMBUTTON_MAP BUTTON_VOL_UP
345 #elif CONFIG_KEYPAD == PHILIPS_SA9200_PAD
346 #define DOOMBUTTON_UP BUTTON_UP
347 #define DOOMBUTTON_DOWN BUTTON_DOWN
348 #define DOOMBUTTON_LEFT BUTTON_PREV
349 #define DOOMBUTTON_RIGHT BUTTON_NEXT
350 #define DOOMBUTTON_SHOOT BUTTON_RIGHT
351 #define DOOMBUTTON_OPEN BUTTON_MENU
352 #define DOOMBUTTON_ESC BUTTON_POWER
353 #define DOOMBUTTON_ENTER BUTTON_LEFT
354 #define DOOMBUTTON_WEAPON BUTOTN_VOL_DOWN
355 #define DOOMBUTTON_MAP BUTTON_VOL_UP
356 #elif CONFIG_KEYPAD == ONDAVX747_PAD
357 #define DOOMBUTTON_ESC BUTTON_POWER
358 #define DOOMBUTTON_SHOOT BUTTON_VOL_UP
359 #define DOOMBUTTON_WEAPON BUTTON_VOL_DOWN
360 #define DOOMBUTTON_MAP BUTTON_MENU
361 #elif CONFIG_KEYPAD == ONDAVX777_PAD
362 #define DOOMBUTTON_ESC BUTTON_POWER
363 #elif CONFIG_KEYPAD == SAMSUNG_YH_PAD
364 #define DOOMBUTTON_UP BUTTON_UP
365 #define DOOMBUTTON_DOWN BUTTON_DOWN
366 #define DOOMBUTTON_LEFT BUTTON_LEFT
367 #define DOOMBUTTON_RIGHT BUTTON_RIGHT
368 #define DOOMBUTTON_SHOOT BUTTON_PLAY
369 #define DOOMBUTTON_OPEN (BUTTON_PLAY|BUTTON_LEFT)
370 #define DOOMBUTTON_ESC BUTTON_REC
371 #define DOOMBUTTON_ENTER (BUTTON_PLAY|BUTTON_RIGHT)
372 #define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_UP)
373 #define DOOMBUTTON_MAP (BUTTON_PLAY|BUTTON_DOWN)
374 #elif CONFIG_KEYPAD == PBELL_VIBE500_PAD
375 #define DOOMBUTTON_UP BUTTON_OK
376 #define DOOMBUTTON_DOWN BUTTON_CANCEL
377 #define DOOMBUTTON_LEFT BUTTON_PREV
378 #define DOOMBUTTON_RIGHT BUTTON_NEXT
379 #define DOOMBUTTON_SHOOT BUTTON_MENU
380 #define DOOMBUTTON_OPEN BUTTON_OK
381 #define DOOMBUTTON_ESC BUTTON_REC
382 #define DOOMBUTTON_ENTER BUTTON_POWER
383 #define DOOMBUTTON_WEAPON BUTTON_PLAY
384 #elif CONFIG_KEYPAD == MPIO_HD200_PAD
385 #define DOOMBUTTON_UP BUTTON_REW
386 #define DOOMBUTTON_DOWN BUTTON_FF
387 #define DOOMBUTTON_LEFT BUTTON_VOL_DOWN
388 #define DOOMBUTTON_RIGHT BUTTON_VOL_UP
389 #define DOOMBUTTON_SHOOT BUTTON_FUNC
390 #define DOOMBUTTON_OPEN (BUTTON_FUNC|BUTTON_PLAY)
391 #define DOOMBUTTON_ESC BUTTON_REC
392 #define DOOMBUTTON_ENTER BUTTON_PLAY
393 #define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_REPEAT)
394 #elif CONFIG_KEYPAD == MPIO_HD300_PAD
395 #define DOOMBUTTON_UP BUTTON_UP
396 #define DOOMBUTTON_DOWN BUTTON_DOWN
397 #define DOOMBUTTON_LEFT BUTTON_REW
398 #define DOOMBUTTON_RIGHT BUTTON_FF
399 #define DOOMBUTTON_SHOOT BUTTON_ENTER
400 #define DOOMBUTTON_OPEN BUTTON_MENU
401 #define DOOMBUTTON_ESC BUTTON_REC
402 #define DOOMBUTTON_ENTER BUTTON_PLAY
403 #define DOOMBUTTON_WEAPON (BUTTON_PLAY|BUTTON_REPEAT)
405 #else
406 #error Keymap not defined!
407 #endif
409 #ifdef HAVE_TOUCHSCREEN
410 #ifndef DOOMBUTTON_UP
411 #define DOOMBUTTON_UP BUTTON_TOPMIDDLE
412 #endif
413 #ifndef DOOMBUTTON_DOWN
414 #define DOOMBUTTON_DOWN BUTTON_BOTTOMMIDDLE
415 #endif
416 #ifndef DOOMBUTTON_LEFT
417 #define DOOMBUTTON_LEFT BUTTON_MIDLEFT
418 #endif
419 #ifndef DOOMBUTTON_RIGHT
420 #define DOOMBUTTON_RIGHT BUTTON_MIDRIGHT
421 #endif
422 #ifndef DOOMBUTTON_SHOOT
423 #define DOOMBUTTON_SHOOT BUTTON_BOTTOMRIGHT
424 #endif
425 #ifndef DOOMBUTTON_OPEN
426 #define DOOMBUTTON_OPEN BUTTON_TOPRIGHT
427 #endif
428 #ifndef DOOMBUTTON_ESC
429 #define DOOMBUTTON_ESC BUTTON_TOPLEFT
430 #endif
431 #ifndef DOOMBUTTON_ENTER
432 #define DOOMBUTTON_ENTER BUTTON_CENTER
433 #endif
434 #ifndef DOOMBUTTON_WEAPON
435 #define DOOMBUTTON_WEAPON BUTTON_BOTTOMLEFT
436 #endif
437 #endif
439 #ifdef DOOMBUTTON_SCROLLWHEEL
440 /* Scrollwheel events are posted directly and not polled by the button
441 driver - synthesize polling */
442 static inline unsigned int read_scroll_wheel(void)
444 unsigned int buttons = BUTTON_NONE;
445 unsigned int btn;
447 /* Empty out the button queue and see if any scrollwheel events were
448 posted */
451 btn = rb->button_get_w_tmo(0);
452 buttons |= btn;
454 while (btn != BUTTON_NONE);
456 return buttons & (DOOMBUTTON_SCROLLWHEEL_CC | DOOMBUTTON_SCROLLWHEEL_CW);
458 #endif
460 static inline void getkey()
462 event_t event;
463 /* Same button handling as rockboy */
464 static unsigned int oldbuttonstate IDATA_ATTR = 0;
466 unsigned int released, pressed, newbuttonstate;
468 #ifdef HAS_BUTTON_HOLD
469 static unsigned int holdbutton IDATA_ATTR=0;
470 static bool hswitch IDATA_ATTR=0;
471 if (rb->button_hold()&~holdbutton)
473 if(hswitch==0)
475 event.type = ev_keydown;
476 hswitch=1;
478 else
480 event.type = ev_keyup;
481 hswitch=0;
483 #if (CONFIG_KEYPAD == IPOD_4G_PAD) || (CONFIG_KEYPAD == IPOD_3G_PAD) || \
484 (CONFIG_KEYPAD == IPOD_1G2G_PAD)
485 /* Bring up the menu */
486 event.data1=KEY_ESCAPE;
487 #else
488 /* Enable run */
489 event.data1=KEY_CAPSLOCK;
490 #endif
491 D_PostEvent(&event);
493 holdbutton=rb->button_hold();
494 #endif
496 newbuttonstate = rb->button_status();
497 #ifdef DOOMBUTTON_SCROLLWHEEL
498 newbuttonstate |= read_scroll_wheel();
499 #endif
501 if(newbuttonstate==oldbuttonstate) /* Don't continue, nothing left to do */
502 return;
503 released = ~newbuttonstate & oldbuttonstate;
504 pressed = newbuttonstate & ~oldbuttonstate;
505 oldbuttonstate = newbuttonstate;
506 if(released)
508 event.type = ev_keyup;
509 if(released & DOOMBUTTON_LEFT)
511 event.data1=KEY_LEFTARROW;
512 D_PostEvent(&event);
514 if(released & DOOMBUTTON_RIGHT)
516 event.data1=KEY_RIGHTARROW;
517 D_PostEvent(&event);
519 #ifdef DOOMBUTTON_DOWN
520 if(released & DOOMBUTTON_DOWN)
522 event.data1=KEY_DOWNARROW;
523 D_PostEvent(&event);
525 #endif
526 if(released & DOOMBUTTON_UP)
528 event.data1=KEY_UPARROW;
529 D_PostEvent(&event);
531 if(released & DOOMBUTTON_SHOOT)
533 event.data1=KEY_RCTRL;
534 D_PostEvent(&event);
536 if(released & DOOMBUTTON_OPEN)
538 event.data1=' ';
539 D_PostEvent(&event);
541 #ifdef DOOMBUTTON_ESC
542 if(released & DOOMBUTTON_ESC)
544 event.data1=KEY_ESCAPE;
545 D_PostEvent(&event);
547 #endif
548 if(released & DOOMBUTTON_ENTER)
550 event.data1=KEY_ENTER;
551 D_PostEvent(&event);
553 #ifdef DOOMBUTTON_WEAPON
554 if(released & DOOMBUTTON_WEAPON)
556 event.data1 ='w';
557 D_PostEvent(&event);
559 #endif
560 #ifdef DOOMBUTTON_MAP
561 if(released & DOOMBUTTON_MAP)
563 event.data1 =KEY_TAB;
564 D_PostEvent(&event);
566 #endif
568 if(pressed)
570 event.type = ev_keydown;
571 if(pressed & DOOMBUTTON_LEFT)
573 event.data1=KEY_LEFTARROW;
574 D_PostEvent(&event);
576 if(pressed & DOOMBUTTON_RIGHT)
578 event.data1=KEY_RIGHTARROW;
579 D_PostEvent(&event);
581 #ifdef DOOMBUTTON_DOWN
582 if(pressed & DOOMBUTTON_DOWN)
584 event.data1=KEY_DOWNARROW;
585 D_PostEvent(&event);
587 #endif
588 if(pressed & DOOMBUTTON_UP)
590 event.data1=KEY_UPARROW;
591 D_PostEvent(&event);
593 if(pressed & DOOMBUTTON_SHOOT)
595 event.data1=KEY_RCTRL;
596 D_PostEvent(&event);
598 if(pressed & DOOMBUTTON_OPEN)
600 event.data1=' ';
601 D_PostEvent(&event);
603 #ifdef DOOMBUTTON_ESC
604 if(pressed & DOOMBUTTON_ESC)
606 event.data1=KEY_ESCAPE;
607 D_PostEvent(&event);
609 #endif
610 #ifdef DOOMBUTTON_ENTER
611 if(pressed & DOOMBUTTON_ENTER)
613 event.data1=KEY_ENTER;
614 D_PostEvent(&event);
616 #endif
617 #ifdef DOOMBUTTON_WEAPON
618 if(pressed & DOOMBUTTON_WEAPON)
620 event.data1='w';
621 D_PostEvent(&event);
623 #endif
624 #ifdef DOOMBUTTON_MAP
625 if(pressed & DOOMBUTTON_MAP)
627 event.data1 =KEY_TAB;
628 D_PostEvent(&event);
630 #endif
634 void I_StartTic (void)
636 getkey();
640 ///////////////////////////////////////////////////////////
641 // Palette stuff.
643 static void I_UploadNewPalette(int pal)
645 // This is used to replace the current 256 colour cmap with a new one
646 // Used by 256 colour PseudoColor modes
647 static int cachedgamma;
648 static size_t num_pals;
650 if ((paldata == NULL) || (cachedgamma != usegamma)) {
651 int lump = W_GetNumForName("PLAYPAL");
652 const byte *pall = W_CacheLumpNum(lump);
653 register const byte *const gtable = gammatable[cachedgamma = usegamma];
654 register int i;
656 num_pals = W_LumpLength(lump) / (3*256);
657 num_pals *= 256;
659 if (!paldata) {
660 // First call - allocate and prepare colour array
661 paldata = malloc(sizeof(*paldata)*num_pals);
664 // set the colormap entries
665 for (i=0 ; (size_t)i<num_pals ; i++) {
666 int r = gtable[pall[0]];
667 int g = gtable[pall[1]];
668 int b = gtable[pall[2]];
669 pall+=3;
670 #ifndef HAVE_LCD_COLOR
671 paldata[i]=(3*r+6*g+b)/10;
672 #else
673 paldata[i] = LCD_RGBPACK(r,g,b);
674 #endif
677 W_UnlockLumpNum(lump);
678 num_pals/=256;
681 #ifdef RANGECHECK
682 if ((size_t)pal >= num_pals)
683 I_Error("I_UploadNewPalette: Palette number out of range (%d>=%d)",
684 pal, num_pals);
685 #endif
687 memcpy(palette,paldata+256*pal,256*sizeof(fb_data));
689 #if defined(HAVE_LCD_MODES)
690 #if (HAVE_LCD_MODES & LCD_MODE_PAL256)
691 rb->lcd_pal256_update_pal(paldata+256*pal);
692 #endif
693 #endif
697 // I_FinishUpdate
700 void I_FinishUpdate (void)
702 int count;
703 byte *src = d_screens[0];
705 #if (CONFIG_LCD == LCD_H300) && !defined(SIMULATOR)
706 count = SCREENWIDTH*SCREENHEIGHT;
708 /* ASM screen update (drops ~300 tics) */
709 asm volatile (
710 "move.w #33, (%[LCD]) \n" /* Setup the LCD controller */
711 "nop \n"
712 "clr.w (%[LCD2]) \n"
713 "nop \n"
714 "move.w #34, (%[LCD]) \n" /* End LCD controller setup */
715 "clr.l %%d1 \n"
716 ".loop: \n"
717 "move.l (%[scrp])+, %%d0 \n"
718 "swap.w %%d0 \n"
719 "move.w %%d0, %%d1 \n"
720 "lsr.l #8,%%d1 \n"
721 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
722 "move.b %%d0,%%d1 \n"
723 "swap.w %%d0 \n"
724 "nop \n"
725 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
726 "move.w %%d0, %%d1 \n"
727 "lsr.l #8,%%d1 \n"
728 "nop \n"
729 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
730 "move.b %%d0,%%d1 \n"
731 "nop \n"
732 "move.w (%[pal], %%d1.l:2), (%[LCD2]) \n"
733 "subq.l #4,%[cnt] \n"
734 "bne.b .loop \n"
735 : /* outputs */
736 [scrp]"+a"(src),
737 [cnt] "+d"(count)
738 : /* inputs */
739 [pal] "a" (palette),
740 [LCD] "a" (0xf0000000),
741 [LCD2]"a" (0xf0000002)
742 : /* clobbers */
743 "d0", "d1"
745 #elif (CONFIG_LCD == LCD_X5) && !defined(SIMULATOR) \
746 && defined(CPU_COLDFIRE) /* protect from using it on e200 (sic!) */
747 count = SCREENWIDTH*SCREENHEIGHT;
749 /* ASM screen update (drops ~230 tics) */
750 asm volatile (
751 "clr.w (%[LCD]) \n" /* Setup the LCD controller */
752 "move.w #(33<<1), (%[LCD]) \n"
753 "clr.w (%[LCD2]) \n"
754 "clr.w (%[LCD2]) \n"
755 "clr.w (%[LCD]) \n" /* End LCD controller setup */
756 "move.w #(34<<1), (%[LCD]) \n"
757 "clr.l %%d1 \n"
758 ".loop: \n"
759 "move.l (%[scrp])+, %%d0 \n"
760 "swap.w %%d0 \n"
761 "move.w %%d0, %%d1 \n"
762 "lsr.l #8,%%d1 \n"
763 "move.w (%[pal], %%d1.l:2), %%d2 \n"
764 "move.l %%d2, %%d3 \n"
765 "lsr.l #7, %%d3 \n"
766 "move.w %%d3, (%[LCD2]) \n"
767 "lsl.l #1, %%d2 \n"
768 "move.w %%d2, (%[LCD2]) \n"
769 "move.b %%d0,%%d1 \n"
770 "move.w (%[pal], %%d1.l:2), %%d2 \n"
771 "move.l %%d2, %%d3 \n"
772 "lsr.l #7, %%d3 \n"
773 "move.w %%d3, (%[LCD2]) \n"
774 "lsl.l #1, %%d2 \n"
775 "move.w %%d2, (%[LCD2]) \n"
776 "swap.w %%d0 \n"
777 "move.w %%d0, %%d1 \n"
778 "lsr.l #8,%%d1 \n"
779 "move.w (%[pal], %%d1.l:2), %%d2 \n"
780 "move.l %%d2, %%d3 \n"
781 "lsr.l #7, %%d3 \n"
782 "move.w %%d3, (%[LCD2]) \n"
783 "lsl.l #1, %%d2 \n"
784 "move.w %%d2, (%[LCD2]) \n"
785 "move.b %%d0,%%d1 \n"
786 "move.w (%[pal], %%d1.l:2), %%d2 \n"
787 "move.l %%d2, %%d3 \n"
788 "lsr.l #7, %%d3 \n"
789 "move.w %%d3, (%[LCD2]) \n"
790 "lsl.l #1, %%d2 \n"
791 "move.w %%d2, (%[LCD2]) \n"
792 "subq.l #4,%[cnt] \n"
793 "bne.b .loop \n"
794 : /* outputs */
795 [scrp]"+a"(src),
796 [cnt] "+d"(count)
797 : /* inputs */
798 [pal] "a" (palette),
799 [LCD] "a" (0xf0008000),
800 [LCD2]"a" (0xf0008002)
801 : /* clobbers */
802 "d0", "d1", "d2", "d3"
804 #else
806 /* If the hardware has support for a paletted mode it takes precidence */
807 #if defined(HAVE_LCD_MODES)
808 #if (HAVE_LCD_MODES & LCD_MODE_PAL256)
809 (void) count;
810 rb->lcd_blit_pal256(src, 0, 0, 0, 0, LCD_WIDTH, LCD_HEIGHT);
811 #endif
812 #elif defined(HAVE_LCD_COLOR)
813 #if(LCD_HEIGHT>LCD_WIDTH)
814 if(rotate_screen)
816 int y;
818 for (y = 1; y <= SCREENHEIGHT; y++)
820 fb_data *dst = rb->lcd_framebuffer + LCD_WIDTH - y;
821 count = SCREENWIDTH;
825 *dst = palette[*src++];
826 dst += LCD_WIDTH;
828 while (--count);
831 else
832 #endif
834 fb_data *dst = rb->lcd_framebuffer;
835 count = SCREENWIDTH*SCREENHEIGHT;
838 *dst++ = palette[*src++];
839 while (--count);
841 rb->lcd_update();
842 #else /* !HAVE_LCD_COLOR */
844 unsigned char *dst;
845 int y;
847 for (y = 0; y < SCREENHEIGHT; y++)
849 dst = greybuffer;
850 count = SCREENWIDTH;
853 *dst++ = palette[*src++];
854 while (--count);
856 grey_ub_gray_bitmap(greybuffer, 0, y, SCREENWIDTH, 1);
858 #endif
859 #endif
863 // I_ReadScreen
865 void I_ReadScreen (byte* scr)
867 memcpy (scr, d_screens[0], LCD_WIDTH*LCD_HEIGHT);
871 // I_SetPalette
873 void I_SetPalette (int pal)
875 I_UploadNewPalette(pal);
879 // I_InitGraphics
881 void I_InitGraphics(void)
883 printf("Starting Graphics engine\n");
885 noprintf=1;
887 #if defined(HAVE_LCD_MODES)
888 #if (HAVE_LCD_MODES & LCD_MODE_PAL256)
889 rb->lcd_set_mode(LCD_MODE_PAL256);
890 #endif
891 #endif
893 /* Note: The other screens are allocated as needed */
895 #ifndef HAVE_LCD_COLOR
896 gbuf=malloc(GREYBUFSIZE);
897 grey_init(gbuf, GREYBUFSIZE, GREY_ON_COP, LCD_WIDTH, LCD_HEIGHT, NULL);
898 /* switch on greyscale overlay */
899 grey_show(true);
900 #endif
902 #ifdef CPU_COLDFIRE
903 coldfire_set_macsr(EMAC_FRACTIONAL | EMAC_SATURATE);
904 d_screens[0] = fastscreen;
905 #else
906 // Don't know if this will fit in other IRAMs
907 d_screens[0] = malloc (LCD_WIDTH * LCD_HEIGHT * sizeof(unsigned char));
908 #endif