summaryrefslogtreecommitdiffstats
path: root/uisimulator
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2006-01-09 11:22:36 +0000
committerDaniel Stenberg <daniel@haxx.se>2006-01-09 11:22:36 +0000
commit0e419987e48b006104748118fa28161484b7dfa1 (patch)
tree45c1c1fe81309615e1e6d239183b677be90feb41 /uisimulator
parentd2a10f5676a4ab53aec437bd5976e2aef6bde0a4 (diff)
downloadrockbox-0e419987e48b006104748118fa28161484b7dfa1.tar.gz
rockbox-0e419987e48b006104748118fa28161484b7dfa1.tar.bz2
rockbox-0e419987e48b006104748118fa28161484b7dfa1.zip
SDL simulator brought by Nathan Hand and Nick Lanham. This is added as a third
simulator with the hope that once it works fine, we can remove the other two and only have one unified simulator. git-svn-id: svn://svn.rockbox.org/rockbox/trunk@8312 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'uisimulator')
-rw-r--r--uisimulator/FILES3
-rw-r--r--uisimulator/sdl/Makefile60
-rw-r--r--uisimulator/sdl/README6
-rw-r--r--uisimulator/sdl/SOURCES7
-rw-r--r--uisimulator/sdl/button-x11.c307
-rw-r--r--uisimulator/sdl/kernel.c160
-rw-r--r--uisimulator/sdl/lcd-x11.c210
-rw-r--r--uisimulator/sdl/lcd-x11.h26
-rw-r--r--uisimulator/sdl/screenhack.c228
-rw-r--r--uisimulator/sdl/screenhack.h33
-rw-r--r--uisimulator/sdl/sound.c119
-rw-r--r--uisimulator/sdl/sound.h22
-rw-r--r--uisimulator/sdl/sprintf.h12
-rw-r--r--uisimulator/sdl/thread.c148
-rw-r--r--uisimulator/sdl/timefuncs.h7
-rw-r--r--uisimulator/sdl/uisdl.c226
-rw-r--r--uisimulator/sdl/uisw32.c344
-rw-r--r--uisimulator/sdl/uisw32.h156
-rw-r--r--uisimulator/sdl/version.h1
19 files changed, 2075 insertions, 0 deletions
diff --git a/uisimulator/FILES b/uisimulator/FILES
index 85b1dbe850..95318c010a 100644
--- a/uisimulator/FILES
+++ b/uisimulator/FILES
@@ -18,3 +18,6 @@ x11/archos/rockbox112.bmp
common/SOURCES
win32/SOURCES
x11/SOURCES
+sdl/*.[ch]
+sdl/Makefile
+sdl/SOURCES
diff --git a/uisimulator/sdl/Makefile b/uisimulator/sdl/Makefile
new file mode 100644
index 0000000000..989ac65223
--- /dev/null
+++ b/uisimulator/sdl/Makefile
@@ -0,0 +1,60 @@
+############################################################################
+# __________ __ ___.
+# Open \______ \ ____ ____ | | _\_ |__ _______ ___
+# Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+# Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+# Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+# \/ \/ \/ \/ \/
+# $Id$
+#
+# Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+#
+# All files in this archive are subject to the GNU General Public License.
+# See the file COPYING in the source tree root for full license agreement.
+#
+# This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+# KIND, either express or implied.
+#
+############################################################################
+
+SIMCOMMON = ../common
+
+DEPFILE = $(OBJDIR)/dep-sim
+
+RM = rm -f
+DEBUG = -g
+
+# Use this for simulator-only files
+INCLUDES = -I. -I$(SIMCOMMON) -I$(OBJDIR) -I$(FIRMDIR)/export -I$(APPSDIR) \
+ -I$(BUILDDIR)
+
+# This sets up 'SRC' based on the files mentioned in SOURCES
+include $(TOOLSDIR)/makesrc.inc
+
+OBJS := $(SRC:%.c=$(OBJDIR)/%.o)
+
+DEFINES := -DHAVE_CONFIG_H -DGETTIMEOFDAY_TWO_ARGS -DSIMULATOR \
+$(TARGET) -DAPPSVERSION=\"$(VERSION)\" -DMEM=${MEMORYSIZE} $(EXTRA_DEFINES)
+
+SOURCES = $(SRC)
+
+DIRS = .
+
+CFLAGS = $(DEBUG) $(DEFINES) $(INCLUDES) $(GCCOPTS)
+
+OUTFILE = $(BUILDDIR)/libsim.a
+
+all: $(OUTFILE)
+
+include $(TOOLSDIR)/make.inc
+
+clean:
+ @echo "cleaning sim"
+ @$(RM) $(OBJS) *~ core $(OUTFILE) $(DEPFILE)
+ @$(MAKE) -C $(SIMCOMMON) clean
+
+$(OUTFILE): $(OBJS)
+ @echo "AR $@"
+ @$(AR) ruv $@ $(OBJS) >/dev/null 2>&1
+
+-include $(DEPFILE)
diff --git a/uisimulator/sdl/README b/uisimulator/sdl/README
new file mode 100644
index 0000000000..0a293f6ad2
--- /dev/null
+++ b/uisimulator/sdl/README
@@ -0,0 +1,6 @@
+To build:
+
+ $ ../tools/configure
+ [answer questions]
+ $ make
+ $ ./rockboxui
diff --git a/uisimulator/sdl/SOURCES b/uisimulator/sdl/SOURCES
new file mode 100644
index 0000000000..32d70b50bf
--- /dev/null
+++ b/uisimulator/sdl/SOURCES
@@ -0,0 +1,7 @@
+button-x11.c
+kernel.c
+lcd-x11.c
+screenhack.c
+thread.c
+uisdl.c
+sound.c
diff --git a/uisimulator/sdl/button-x11.c b/uisimulator/sdl/button-x11.c
new file mode 100644
index 0000000000..5fda7cf45a
--- /dev/null
+++ b/uisimulator/sdl/button-x11.c
@@ -0,0 +1,307 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Björn Stenberg
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include <stdlib.h>
+#include "config.h"
+#include "button.h"
+#include "kernel.h"
+#include "debug.h"
+#include "backlight.h"
+#include "misc.h"
+#include <SDL.h>
+
+extern int screenhack_handle_events(bool *release);
+
+struct event_queue button_queue;
+
+static int button_state = 0; /* keeps track of pressed keys */
+static long lastbtn; /* Last valid button status */
+
+/* how often we check to see if a button is pressed */
+#define POLL_FREQUENCY HZ/25
+
+/* how long until repeat kicks in */
+#define REPEAT_START 8
+
+/* the speed repeat starts at */
+#define REPEAT_INTERVAL_START 4
+
+/* speed repeat finishes at */
+#define REPEAT_INTERVAL_FINISH 2
+
+/* mostly copied from real button.c */
+void button_read (void);
+
+static void button_tick(void)
+{
+ static int tick = 0;
+ static int count = 0;
+ static int repeat_speed = REPEAT_INTERVAL_START;
+ static int repeat_count = 0;
+ static bool repeat = false;
+ int diff;
+ int btn;
+
+ /* only poll every X ticks */
+ if ( ++tick >= POLL_FREQUENCY )
+ {
+ bool post = false;
+ button_read();
+ btn = button_state;
+
+ /* Find out if a key has been released */
+ diff = btn ^ lastbtn;
+ if(diff && (btn & diff) == 0)
+ {
+ queue_post(&button_queue, BUTTON_REL | diff, NULL);
+ }
+ else
+ {
+ if ( btn )
+ {
+ /* normal keypress */
+ if ( btn != lastbtn )
+ {
+ post = true;
+ repeat = false;
+ repeat_speed = REPEAT_INTERVAL_START;
+
+ }
+ else /* repeat? */
+ {
+ if ( repeat )
+ {
+ count--;
+ if (count == 0) {
+ post = true;
+ /* yes we have repeat */
+ repeat_speed--;
+ if (repeat_speed < REPEAT_INTERVAL_FINISH)
+ repeat_speed = REPEAT_INTERVAL_FINISH;
+ count = repeat_speed;
+
+ repeat_count++;
+
+ }
+ }
+ else
+ {
+ if (count++ > REPEAT_START)
+ {
+ post = true;
+ repeat = true;
+ repeat_count = 0;
+ /* initial repeat */
+ count = REPEAT_INTERVAL_START;
+ }
+ }
+ }
+ if ( post )
+ {
+ if (repeat)
+ queue_post(&button_queue, BUTTON_REPEAT | btn, NULL);
+ else
+ queue_post(&button_queue, btn, NULL);
+#ifdef HAVE_REMOTE_LCD
+ if(btn & BUTTON_REMOTE)
+ remote_backlight_on();
+ else
+#endif
+ backlight_on();
+
+ }
+ }
+ else
+ {
+ repeat = false;
+ count = 0;
+ }
+ }
+ lastbtn = btn & ~(BUTTON_REL | BUTTON_REPEAT);
+ tick = 0;
+ }
+}
+
+/*
+ * Read SDL keys and translate to rockbox buttons
+ */
+
+void button_read (void)
+{
+ int k;
+ bool release = false; /* is this a release event */
+ int ev = screenhack_handle_events(&release);
+
+ switch (ev)
+ {
+ case SDLK_KP4:
+ case SDLK_LEFT:
+ case SDLK_4:
+ k = BUTTON_LEFT;
+ break;
+
+ case SDLK_KP6:
+ case SDLK_RIGHT:
+ case SDLK_6:
+ k = BUTTON_RIGHT;
+ break;
+
+ case SDLK_KP8:
+ case SDLK_UP:
+ case SDLK_8:
+#ifdef BUTTON_UP
+ k = BUTTON_UP;
+#elif defined BUTTON_PLAY
+ k = BUTTON_PLAY;
+#endif
+ break;
+
+ case SDLK_KP2:
+ case SDLK_DOWN:
+ case SDLK_2:
+#ifdef BUTTON_DOWN
+ k = BUTTON_DOWN;
+#elif defined BUTTON_STOP
+ k = BUTTON_STOP;
+#endif
+ break;
+
+#ifdef BUTTON_ON
+ case SDLK_KP_PLUS:
+ case SDLK_q:
+ k = BUTTON_ON;
+ break;
+#endif
+
+#ifdef BUTTON_OFF
+ case SDLK_KP_ENTER:
+ case SDLK_a:
+ k = BUTTON_OFF;
+ break;
+#endif
+
+#ifdef BUTTON_F1
+ case SDLK_KP_DIVIDE:
+ case SDLK_F1:
+ k = BUTTON_F1;
+ break;
+
+ case SDLK_KP_MULTIPLY:
+ case SDLK_F2:
+ k = BUTTON_F2;
+ break;
+
+ case SDLK_KP_MINUS:
+ case SDLK_F3:
+ k = BUTTON_F3;
+ break;
+#elif defined(BUTTON_REC)
+ case SDLK_KP_DIVIDE:
+ case SDLK_F1:
+ k = BUTTON_REC;
+ break;
+#endif
+
+ case SDLK_KP5:
+ case SDLK_5:
+ case SDLK_SPACE:
+#ifdef BUTTON_PLAY
+ k = BUTTON_PLAY;
+#elif defined(BUTTON_SELECT)
+ k = BUTTON_SELECT;
+#endif
+ break;
+
+#ifdef HAVE_LCD_BITMAP
+ case SDLK_7:
+ if(!release)
+ screen_dump();
+ break;
+#endif
+
+ case SDLK_KP_PERIOD:
+ case SDLK_INSERT:
+#ifdef BUTTON_MENU
+ k = BUTTON_MENU;
+#elif defined(BUTTON_MODE)
+ k = BUTTON_MODE;
+#endif
+ break;
+
+ default:
+ k = 0;
+ if(ev)
+ DEBUGF("received ev %d\n", ev);
+ break;
+ }
+
+ if (release)
+ button_state &= ~k;
+ else
+ button_state |= k;
+}
+
+/* Again copied from real button.c... */
+
+long button_get(bool block)
+{
+ struct event ev;
+
+ if ( block || !queue_empty(&button_queue) )
+ {
+ queue_wait(&button_queue, &ev);
+ return ev.id;
+ }
+ return BUTTON_NONE;
+}
+
+long button_get_w_tmo(int ticks)
+{
+ struct event ev;
+ queue_wait_w_tmo(&button_queue, &ev, ticks);
+ return (ev.id != SYS_TIMEOUT)? ev.id: BUTTON_NONE;
+}
+
+void button_init(void)
+{
+ tick_add_task(button_tick);
+}
+
+int button_status(void)
+{
+ return lastbtn;
+}
+
+void button_clear_queue(void)
+{
+ queue_clear(&button_queue);
+}
+
+#ifdef HAS_BUTTON_HOLD
+bool button_hold(void) {
+ /* temp fix for hold button on irivers */
+ return false;
+}
+#endif
+
+#ifdef HAS_REMOTE_BUTTON_HOLD
+bool remote_button_hold(void) {
+ /* temp fix for hold button on irivers */
+ return false;
+}
+#endif
diff --git a/uisimulator/sdl/kernel.c b/uisimulator/sdl/kernel.c
new file mode 100644
index 0000000000..25f2df220c
--- /dev/null
+++ b/uisimulator/sdl/kernel.c
@@ -0,0 +1,160 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2005 by Jens Arnold
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <stddef.h>
+#include "kernel.h"
+#include "thread.h"
+#include "debug.h"
+
+static void (*tick_funcs[MAX_NUM_TICK_TASKS])(void);
+
+int set_irq_level (int level)
+{
+ static int _lv = 0;
+ return (_lv = level);
+}
+
+void queue_init(struct event_queue *q)
+{
+ q->read = 0;
+ q->write = 0;
+}
+
+void queue_wait(struct event_queue *q, struct event *ev)
+{
+ while(q->read == q->write)
+ {
+ switch_thread();
+ }
+
+ *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK];
+}
+
+void queue_wait_w_tmo(struct event_queue *q, struct event *ev, int ticks)
+{
+ unsigned int timeout = current_tick + ticks;
+
+ while(q->read == q->write && TIME_BEFORE( current_tick, timeout ))
+ {
+ sleep(1);
+ }
+
+ if(q->read != q->write)
+ {
+ *ev = q->events[(q->read++) & QUEUE_LENGTH_MASK];
+ }
+ else
+ {
+ ev->id = SYS_TIMEOUT;
+ }
+}
+
+void queue_post(struct event_queue *q, long id, void *data)
+{
+ int wr;
+ int oldlevel;
+
+ oldlevel = set_irq_level(15<<4);
+ wr = (q->write++) & QUEUE_LENGTH_MASK;
+
+ q->events[wr].id = id;
+ q->events[wr].data = data;
+ set_irq_level(oldlevel);
+}
+
+bool queue_empty(const struct event_queue* q)
+{
+ return ( q->read == q->write );
+}
+
+void queue_clear(struct event_queue* q)
+{
+ /* fixme: This is potentially unsafe in case we do interrupt-like processing */
+ q->read = 0;
+ q->write = 0;
+}
+
+void switch_thread (void)
+{
+ yield ();
+}
+
+void sim_tick_tasks(void)
+{
+ int i;
+
+ /* Run through the list of tick tasks */
+ for(i = 0;i < MAX_NUM_TICK_TASKS;i++)
+ {
+ if(tick_funcs[i])
+ {
+ tick_funcs[i]();
+ }
+ }
+}
+
+int tick_add_task(void (*f)(void))
+{
+ int i;
+
+ /* Add a task if there is room */
+ for(i = 0;i < MAX_NUM_TICK_TASKS;i++)
+ {
+ if(tick_funcs[i] == NULL)
+ {
+ tick_funcs[i] = f;
+ return 0;
+ }
+ }
+ DEBUGF("Error! tick_add_task(): out of tasks");
+ return -1;
+}
+
+int tick_remove_task(void (*f)(void))
+{
+ int i;
+
+ /* Remove a task if it is there */
+ for(i = 0;i < MAX_NUM_TICK_TASKS;i++)
+ {
+ if(tick_funcs[i] == f)
+ {
+ tick_funcs[i] = NULL;
+ return 0;
+ }
+ }
+
+ return -1;
+}
+
+void mutex_init(struct mutex *m)
+{
+ (void)m;
+}
+
+void mutex_lock(struct mutex *m)
+{
+ (void)m;
+}
+
+void mutex_unlock(struct mutex *m)
+{
+ (void)m;
+}
+
diff --git a/uisimulator/sdl/lcd-x11.c b/uisimulator/sdl/lcd-x11.c
new file mode 100644
index 0000000000..3ab5bc0e16
--- /dev/null
+++ b/uisimulator/sdl/lcd-x11.c
@@ -0,0 +1,210 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <errno.h>
+#include <ctype.h>
+#include <time.h>
+
+#include "screenhack.h"
+#include "config.h"
+
+/*
+ * Specific implementations for X11, using the generic LCD API and data.
+ */
+
+#include "lcd-x11.h"
+#include "lcd-playersim.h"
+
+#include <SDL.h>
+
+extern SDL_Surface *surface;
+
+extern void screen_resized(int width, int height);
+extern bool lcd_display_redraw;
+
+#ifdef HAVE_LCD_BITMAP
+#if LCD_DEPTH==16
+fb_data lcd_framebuffer_copy[LCD_HEIGHT][LCD_WIDTH*2];
+#else
+fb_data lcd_framebuffer_copy[LCD_HEIGHT][LCD_WIDTH];
+#endif
+
+void lcd_update (void)
+{
+ /* update a full screen rect */
+ lcd_update_rect(0, 0, LCD_WIDTH, LCD_HEIGHT);
+}
+
+void lcd_update_rect(int x_start, int y_start,
+ int width, int height)
+{
+ int x;
+ int y;
+ int p=0;
+ int xmax;
+ int ymax;
+ int colors[LCD_WIDTH * LCD_HEIGHT];
+ struct coordinate points[LCD_WIDTH * LCD_HEIGHT];
+
+#if 0
+ fprintf(stderr, "%04d: lcd_update_rect(%d, %d, %d, %d)\n",
+ counter++, x_start, y_start, width, height);
+#endif
+ ymax = y_start + height;
+ xmax = x_start + width;
+
+ if(xmax > LCD_WIDTH)
+ xmax = LCD_WIDTH;
+ if(ymax >= LCD_HEIGHT)
+ ymax = LCD_HEIGHT;
+
+ for (x = x_start; x < xmax; x++)
+ for (y = y_start; y < ymax; y++)
+ {
+#if LCD_DEPTH == 1
+ Uint32 sdl_white = SDL_MapRGB(surface->format, 255, 255, 255);
+ Uint32 sdl_black = SDL_MapRGB(surface->format, 0, 0, 0);
+ points[p].x = x + MARGIN_X;
+ points[p].y = y + MARGIN_Y;
+ colors[p] = ((lcd_framebuffer[y/8][x] >> (y & 7)) & 1) ? sdl_black : sdl_white;
+#elif LCD_DEPTH == 2
+ unsigned gray = ((lcd_framebuffer[y/4][x] >> (2 * (y & 3))) & 3) << 6;
+ points[p].x = x + MARGIN_X;
+ points[p].y = y + MARGIN_Y;
+ colors[p] = SDL_MapRGB(surface->format, 255-gray, 255-gray, 255-gray);
+#elif LCD_DEPTH == 16
+#if LCD_PIXELFORMAT == RGB565SWAPPED
+ unsigned b = ((lcd_framebuffer[y][x] >> 11) & 0x1f) << 3;
+ unsigned g = ((lcd_framebuffer[y][x] >> 5) & 0x3f) << 2;
+ unsigned r = ((lcd_framebuffer[y][x]) & 0x1f) << 3;
+ points[p].x = x + MARGIN_X;
+ points[p].y = y + MARGIN_Y;
+ colors[p] = SDL_MapRGB(surface->format, r, g, b);
+#else
+ unsigned r = ((lcd_framebuffer[y][x] >> 11) & 0x1f) << 3;
+ unsigned g = ((lcd_framebuffer[y][x] >> 5) & 0x3f) << 2;
+ unsigned b = ((lcd_framebuffer[y][x]) & 0x1f) << 3;
+ points[p].x = x + MARGIN_X;
+ points[p].y = y + MARGIN_Y;
+ colors[p] = SDL_MapRGB(surface->format, r, g, b);
+#endif
+#endif
+ p++;
+ }
+
+ dots(colors, &points[0], p);
+ /* printf("lcd_update_rect: Draws %d pixels, clears %d pixels\n", p, cp);*/
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+ lcd_display_redraw=false;
+}
+
+#ifdef LCD_REMOTE_HEIGHT
+extern unsigned char lcd_remote_framebuffer[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH];
+unsigned char lcd_remote_framebuffer_copy[LCD_REMOTE_HEIGHT/8][LCD_REMOTE_WIDTH];
+
+#define REMOTE_START_Y (LCD_HEIGHT + 2*MARGIN_Y)
+
+void lcd_remote_update (void)
+{
+ lcd_remote_update_rect(0, 0, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT);
+}
+
+void lcd_remote_update_rect(int x_start, int y_start,
+ int width, int height)
+{
+ int x;
+ int y;
+ int p=0;
+ int xmax;
+ int ymax;
+ struct coordinate points[LCD_REMOTE_WIDTH * LCD_REMOTE_HEIGHT];
+ int colors[LCD_REMOTE_WIDTH * LCD_REMOTE_HEIGHT];
+ Uint32 sdl_white = SDL_MapRGB(surface->format, 255, 255, 255);
+ Uint32 sdl_black = SDL_MapRGB(surface->format, 0, 0, 0);
+
+#if 0
+ fprintf(stderr, "%04d: lcd_update_rect(%d, %d, %d, %d)\n",
+ counter++, x_start, y_start, width, height);
+#endif
+ ymax = y_start + height;
+ xmax = x_start + width;
+
+ if(xmax > LCD_REMOTE_WIDTH)
+ xmax = LCD_REMOTE_WIDTH;
+ if(ymax >= LCD_REMOTE_HEIGHT)
+ ymax = LCD_REMOTE_HEIGHT;
+
+ for (x = x_start; x < xmax; x++)
+ for (y = y_start; y < ymax; y++) {
+ colors[p] = ((lcd_remote_framebuffer[y/8][x] >> (y & 7)) & 1) ? sdl_black : sdl_white;
+ points[p].x = x + MARGIN_X;
+ points[p].y = y + MARGIN_Y + REMOTE_START_Y;
+ p++;
+ }
+
+ dots(colors, &points[0], p);
+ /* printf("lcd_update_rect: Draws %d pixels, clears %d pixels\n", p, cp);*/
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+ lcd_display_redraw=false;
+}
+
+
+#endif
+
+#endif
+#ifdef HAVE_LCD_CHARCELLS
+
+/* Defined in lcd-playersim.c */
+extern void lcd_print_char(int x, int y);
+extern unsigned char lcd_buffer[2][11];
+
+extern unsigned char hardware_buffer_lcd[11][2];
+static unsigned char lcd_buffer_copy[11][2];
+
+void lcd_update (void)
+{
+ bool changed=false;
+ int x, y;
+ for (y=0; y<2; y++) {
+ for (x=0; x<11; x++) {
+ if (lcd_display_redraw ||
+ lcd_buffer_copy[x][y] != hardware_buffer_lcd[x][y]) {
+ lcd_buffer_copy[x][y] = hardware_buffer_lcd[x][y];
+ lcd_print_char(x, y);
+ changed=true;
+ }
+ }
+ }
+ if (changed)
+ {
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+ }
+ lcd_display_redraw=false;
+}
+
+#endif
diff --git a/uisimulator/sdl/lcd-x11.h b/uisimulator/sdl/lcd-x11.h
new file mode 100644
index 0000000000..07911b2530
--- /dev/null
+++ b/uisimulator/sdl/lcd-x11.h
@@ -0,0 +1,26 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#define MARGIN_X 3
+#define MARGIN_Y 3
+
+/* include the "real" lcd.h file here */
+#include <lcd.h>
+
+
diff --git a/uisimulator/sdl/screenhack.c b/uisimulator/sdl/screenhack.c
new file mode 100644
index 0000000000..c77cb575e4
--- /dev/null
+++ b/uisimulator/sdl/screenhack.c
@@ -0,0 +1,228 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * And remember: X Windows is to graphics hacking as roman numerals are to
+ * the square root of pi.
+ */
+
+/* This file contains simple code to open a window or draw on the root.
+ The idea being that, when writing a graphics hack, you can just link
+ with this .o to get all of the uninteresting junk out of the way.
+
+ - create a procedure `screenhack(dpy, window)'
+
+ - create a variable `char *progclass' which names this program's
+ resource class.
+
+ - create a variable `char defaults []' for the default resources, and
+ null-terminate it.
+
+ - create a variable `XrmOptionDescRec options[]' for the command-line,
+ and null-terminate it.
+
+ And that's it...
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <SDL.h>
+#include "lcd-x11.h"
+#include "screenhack.h"
+#include "version.h"
+
+#include "debug.h"
+#include "config.h"
+
+#ifndef isupper
+# define isupper(c) ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c) ((c) - 'A' + 'a')
+#endif
+
+#define KEYBOARD_GENERIC \
+ "Keyboard Rockbox\n" \
+ "-------- ------------\n" \
+ "4, Left LEFT\n" \
+ "6, Right RIGHT\n"
+
+#if CONFIG_KEYPAD == PLAYER_PAD
+#define KEYBOARD_SPECIFIC \
+ "8, Up PLAY\n" \
+ "2, Down STOP\n" \
+ "+, Q ON\n" \
+ "., INS MENU\n"
+
+#elif CONFIG_KEYPAD == RECORDER_PAD
+#define KEYBOARD_SPECIFIC \
+ "8, Up UP\n" \
+ "2, Down DOWN\n" \
+ "5, Space PLAY\n" \
+ "+, Q ON\n" \
+ "Enter, A OFF\n" \
+ "/, (F1) F1\n" \
+ "*, (F2) F2\n" \
+ "-, (F3) F3\n"
+
+#elif CONFIG_KEYPAD == ONDIO_PAD
+#define KEYBOARD_SPECIFIC \
+ "8, Up UP\n" \
+ "2, Down DOWN\n" \
+ "., INS MENU\n" \
+ "Enter, A OFF\n"
+
+#elif CONFIG_KEYPAD == IRIVER_H100_PAD
+#define KEYBOARD_SPECIFIC \
+ "8, Up UP\n" \
+ "2, Down DOWN\n" \
+ "5, Space SELECT\n" \
+ "+, Q ON\n" \
+ "Enter, A OFF\n" \
+ "., INS MODE\n" \
+ "/, (F1) RECORD\n"
+
+#elif CONFIG_KEYPAD == IRIVER_H300_PAD
+#define KEYBOARD_SPECIFIC \
+ "8, Up UP\n" \
+ "2, Down DOWN\n" \
+ "4, Left LEFT\n" \
+ "6, Right RIGHT\n" \
+ "5, Space SELECT\n" \
+ "+, Q ON\n" \
+ "Enter, A OFF\n" \
+ "., INS MODE\n" \
+ "/, (F1) RECORD\n"
+
+#elif CONFIG_KEYPAD == GMINI100_PAD
+#define KEYBOARD_SPECIFIC \
+ "8, Up UP\n" \
+ "2, Down DOWN\n" \
+ "5, Space PLAY\n" \
+ "+, Q ON\n" \
+ "Enter, A OFF\n" \
+ "., INS MENU\n"
+
+#elif (CONFIG_KEYPAD == IPOD_4G_PAD)
+#define KEYBOARD_SPECIFIC \
+ "[not written yet]"
+
+#endif
+
+
+SDL_Surface *surface;
+
+char having_new_lcd = true;
+
+extern int display_zoom;
+
+/* Dead-trivial event handling.
+ */
+int screenhack_handle_event(SDL_Event *event, bool *release)
+{
+ int key = 0;
+
+ *release = false;
+
+ switch (event->type) {
+ case SDL_KEYDOWN:
+ {
+ key = event->key.keysym.sym;
+ *release = false;
+ }
+ break;
+ case SDL_KEYUP:
+ {
+ key = event->key.keysym.sym;
+ *release = true;
+ }
+ break;
+ case SDL_QUIT:
+ {
+ SDL_Quit();
+ exit(0);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return key;
+}
+
+int screenhack_handle_events(bool *release)
+{
+ int key = 0;
+ SDL_Event event;
+
+ if (SDL_PollEvent(&event)) {
+ key = screenhack_handle_event(&event, release);
+ }
+
+ return key;
+}
+
+
+int main (int argc, char **argv)
+{
+ int window_width;
+ int window_height;
+
+ if (argc > 1)
+ {
+ int x;
+ for (x=1; x<argc; x++) {
+ if (!strcmp("--old_lcd", argv[x])) {
+ having_new_lcd=false;
+ printf("Using old LCD layout.\n");
+ } else if (!strcmp("--zoom", argv[x])) {
+ if (++x < argc) {
+ display_zoom=atoi(argv[x]);
+ printf("Window zoom is %d\n", display_zoom);
+ if (display_zoom < 1 || display_zoom > 5) {
+ printf("fatal: --zoom argument must be between 1 and 5\n");
+ exit(0);
+ }
+ } else {
+ printf("fatal: --zoom requires an integer argument\n");
+ exit(0);
+ }
+ } else {
+ printf("rockboxui\n");
+ printf("Arguments:\n");
+ printf(" --old_lcd \t [Player] simulate old playermodel (ROM version<4.51)\n");
+ printf(" --zoom [1-5]\t window zoom\n");
+ printf(KEYBOARD_GENERIC KEYBOARD_SPECIFIC);
+ exit(0);
+ }
+ }
+ }
+
+ window_width = (LCD_WIDTH + 2*MARGIN_X) * display_zoom;
+ window_height = (LCD_HEIGHT + 2*MARGIN_Y) * display_zoom;
+#ifdef LCD_REMOTE_HEIGHT
+ window_height += (LCD_REMOTE_HEIGHT + 2*MARGIN_Y) * display_zoom;
+#endif
+
+ if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO)) {
+ fprintf(stderr, "fatal: %s", SDL_GetError());
+ exit(-1);
+ }
+
+ atexit(SDL_Quit);
+
+ if ((surface = SDL_SetVideoMode(window_width, window_height, 24, 0)) == NULL) {
+ fprintf(stderr, "fatal: %s", SDL_GetError());
+ exit(-1);
+ }
+
+ screenhack(); /* doesn't return */
+ return 0;
+}
diff --git a/uisimulator/sdl/screenhack.h b/uisimulator/sdl/screenhack.h
new file mode 100644
index 0000000000..4c7a8307a4
--- /dev/null
+++ b/uisimulator/sdl/screenhack.h
@@ -0,0 +1,33 @@
+/* xscreensaver, Copyright (c) 1992-1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software and its
+ * documentation for any purpose is hereby granted without fee, provided that
+ * the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation. No representations are made about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ */
+
+#ifndef __SCREENHACK_H__
+#define __SCREENHACK_H__
+
+#include <stdlib.h>
+#include <stdbool.h>
+
+#ifdef __hpux
+ /* Which of the ten billion standards does values.h belong to?
+ What systems always have it? */
+# include <values.h>
+#endif
+
+#include <stdio.h>
+#include <SDL.h>
+
+extern void screenhack();
+extern int screenhack_handle_event(SDL_Event*, bool *);
+extern int screenhack_handle_events(bool *);
+extern void screen_redraw();
+extern void screen_resized();
+
+#endif /* __SCREENHACK_H__ */
diff --git a/uisimulator/sdl/sound.c b/uisimulator/sdl/sound.c
new file mode 100644
index 0000000000..6068fb3863
--- /dev/null
+++ b/uisimulator/sdl/sound.c
@@ -0,0 +1,119 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2005 by Nick Lanham
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "autoconf.h"
+
+#ifdef ROCKBOX_HAS_SIMSOUND /* play sound in sim enabled */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <string.h>
+#include <SDL.h>
+
+#include "sound.h"
+
+//static Uint8 *audio_chunk;
+static int audio_len;
+static char *audio_pos;
+SDL_sem* sem;
+
+/* The audio function callback takes the following parameters:
+ stream: A pointer to the audio buffer to be filled
+ len: The length (in bytes) of the audio buffer
+*/
+void mixaudio(void *udata, Uint8 *stream, int len)
+{
+ (void)udata;
+
+ /* Only play if we have data left */
+ if ( audio_len == 0 )
+ return;
+
+ len = (len > audio_len) ? audio_len : len;
+ memcpy(stream, audio_pos, len);
+ audio_pos += len;
+ audio_len -= len;
+
+ if(audio_len == 0) {
+ if(SDL_SemPost(sem))
+ fprintf(stderr,"Couldn't post: %s",SDL_GetError());
+
+ }
+}
+
+
+
+int sim_sound_init(void)
+{
+ SDL_AudioSpec fmt;
+
+ /* Set 16-bit stereo audio at 44Khz */
+ fmt.freq = 44100;
+ fmt.format = AUDIO_S16SYS;
+ fmt.channels = 2;
+ fmt.samples = 512; /* A good value for games */
+ fmt.callback = mixaudio;
+ fmt.userdata = NULL;
+
+ sem = SDL_CreateSemaphore(0);
+
+ /* Open the audio device and start playing sound! */
+ if(SDL_OpenAudio(&fmt, NULL) < 0) {
+ fprintf(stderr, "Unable to open audio: %s\n", SDL_GetError());
+ return -1;
+ }
+ SDL_PauseAudio(0);
+ return 0;
+
+ //...
+
+ //SDL_CloseAudio();
+}
+
+void sound_playback_thread(void)
+{
+ int sndret = sim_sound_init();
+ unsigned char *buf;
+ long size;
+
+ while(sndret)
+ sleep(100000); /* wait forever, can't play sound! */
+
+ do {
+ while(!sound_get_pcm)
+ /* TODO: fix a fine thread-synch mechanism here */
+ usleep(10000);
+ do {
+ sound_get_pcm(&buf, &size);
+ if(!size) {
+ sound_get_pcm = NULL;
+ break;
+ }
+ audio_pos = buf; // TODO: is this safe?
+ audio_len = size;
+ //printf("len: %i\n",audio_len);
+ if(SDL_SemWait(sem))
+ fprintf(stderr,"Couldn't wait: %s",SDL_GetError());
+ } while(size);
+ } while(1);
+}
+
+#endif /* ROCKBOX_HAS_SIMSOUND */
diff --git a/uisimulator/sdl/sound.h b/uisimulator/sdl/sound.h
new file mode 100644
index 0000000000..87499cac8e
--- /dev/null
+++ b/uisimulator/sdl/sound.h
@@ -0,0 +1,22 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2005 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+void sound_playback_thread(void);
+
+extern void (*sound_get_pcm)(unsigned char** start, long* size);
diff --git a/uisimulator/sdl/sprintf.h b/uisimulator/sdl/sprintf.h
new file mode 100644
index 0000000000..64a22f3c6e
--- /dev/null
+++ b/uisimulator/sdl/sprintf.h
@@ -0,0 +1,12 @@
+#include <stdarg.h>
+#include <stdio.h>
+
+int rockbox_snprintf (char *buf, size_t size, const char *fmt, ...);
+int rockbox_vsnprintf (char *buf, int size, const char *fmt, va_list ap);
+int rockbox_fprintf (int fd, const char *fmt, ...);
+
+#ifndef NO_REDEFINES_PLEASE
+#define snprintf rockbox_snprintf
+#define vsnprintf rockbox_vsnprintf
+#define fprintf rockbox_fprintf
+#endif
diff --git a/uisimulator/sdl/thread.c b/uisimulator/sdl/thread.c
new file mode 100644
index 0000000000..6d9139c35d
--- /dev/null
+++ b/uisimulator/sdl/thread.c
@@ -0,0 +1,148 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 Daniel Stenberg
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include "autoconf.h"
+
+#include <stdio.h>
+#include <pthread.h>
+
+#include "kernel.h"
+#include <sys/time.h>
+
+#ifdef ROCKBOX_HAS_SIMSOUND
+#include "sound.h"
+#endif
+
+long current_tick = 0;
+extern void sim_tick_tasks(void);
+
+static void msleep(int msec)
+{
+ struct timeval delay;
+
+ delay.tv_sec = msec / 1000;
+ delay.tv_usec = (msec % 1000) * 1000;
+ select(0, NULL, NULL, NULL, &delay); /* portable sub-second sleep */
+}
+
+/*
+ * This is not a target thread, so it does not fall under the 1 thread at a
+ * time thing.
+ */
+static void update_tick_thread()
+{
+ struct timeval start, now;
+ long new_tick;
+
+ gettimeofday(&start, NULL);
+ while (1)
+ {
+ msleep(5); /* check twice per simulated target tick */
+ gettimeofday(&now, NULL);
+ new_tick = (now.tv_sec - start.tv_sec) * HZ
+ + (now.tv_usec - start.tv_usec) / (1000000/HZ);
+ if (new_tick > current_tick)
+ {
+ sim_tick_tasks();
+ current_tick = new_tick;
+ }
+ }
+}
+
+/*
+ * We emulate the target threads by using pthreads. We have a mutex that only
+ * allows one thread at a time to execute. It forces each thread to yield()
+ * for the other(s) to run.
+ */
+
+pthread_mutex_t mp;
+
+void init_threads(void)
+{
+ pthread_t tick_tid;
+
+ pthread_mutex_init(&mp, NULL);
+ /* get mutex to only allow one thread running at a time */
+ pthread_mutex_lock(&mp);
+
+ /* start a tick thread */
+ pthread_create(&tick_tid, NULL, (void *(*)(void *)) update_tick_thread,
+ NULL);
+
+#ifdef ROCKBOX_HAS_SIMSOUND /* start thread that plays PCM data */
+ {
+ pthread_t sound_tid;
+ pthread_create(&sound_tid, NULL,
+ (void *(*)(void *)) sound_playback_thread,
+ NULL);
+ }
+#endif
+
+}
+/*
+ int pthread_create(pthread_t *new_thread_ID,
+ const pthread_attr_t *attr,
+ void * (*start_func)(void *), void *arg);
+*/
+
+void yield(void)
+{
+ pthread_mutex_unlock(&mp); /* return */
+ msleep(1); /* prevent busy loop */
+ pthread_mutex_lock(&mp); /* get it again */
+}
+
+void newfunc(void (*func)(void))
+{
+ pthread_mutex_lock(&mp);
+ func();
+ pthread_mutex_unlock(&mp);
+}
+
+
+int create_thread(void (*fp)(void), void* sp, int stk_size)
+{
+ pthread_t tid;
+ int i;
+ int error;
+
+ /* we really don't care about these arguments */
+ (void)sp;
+ (void)stk_size;
+ error = pthread_create(&tid,
+ NULL, /* default attributes please */
+ (void *(*)(void *)) newfunc, /* function to start */
+ fp /* start argument */);
+ if(0 != error)
+ fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
+ else
+ fprintf(stderr, "Thread %ld is running\n", (long)tid);
+
+ yield();
+
+ return error;
+}
+
+void sim_sleep(int ticks)
+{
+ pthread_mutex_unlock(&mp); /* return */
+ msleep((1000/HZ) * ticks);
+ pthread_mutex_lock(&mp); /* get it again */
+}
+
diff --git a/uisimulator/sdl/timefuncs.h b/uisimulator/sdl/timefuncs.h
new file mode 100644
index 0000000000..de17fcdc73
--- /dev/null
+++ b/uisimulator/sdl/timefuncs.h
@@ -0,0 +1,7 @@
+#include <time.h>
+#include <stdbool.h>
+
+/* struct tm defined */
+struct tm *get_time(void);
+int set_time(const struct tm *tm);
+bool valid_time(const struct tm *tm);
diff --git a/uisimulator/sdl/uisdl.c b/uisimulator/sdl/uisdl.c
new file mode 100644
index 0000000000..e17a925313
--- /dev/null
+++ b/uisimulator/sdl/uisdl.c
@@ -0,0 +1,226 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Daniel Stenberg <daniel@haxx.se>
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+#include <stdio.h>
+#include <string.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
+#include <errno.h>
+#include <ctype.h>
+#include <time.h>
+
+#include <SDL.h>
+
+#include "config.h"
+#include "screenhack.h"
+
+#include "version.h"
+
+#include "lcd-x11.h"
+#include "lcd-playersim.h"
+
+#define MAX(x,y) ((x)>(y)?(x):(y))
+#define MIN(x,y) ((x)<(y)?(x):(y))
+
+#define PROGNAME "rockboxui"
+
+/* -- -- */
+
+extern SDL_Surface *surface;
+
+int display_zoom=2;
+
+bool lcd_display_redraw=true;
+
+char *progclass = "rockboxui";
+
+void init_window ()
+{
+ /* stub */
+}
+
+/* used for the player sim */
+void drawdots(int color, struct coordinate *points, int count)
+{
+ SDL_Rect rect;
+
+ while (count--) {
+ rect.x = points[count].x * display_zoom;
+ rect.y = points[count].y * display_zoom;
+ rect.w = display_zoom;
+ rect.h = display_zoom;
+
+ SDL_FillRect(surface, &rect, color);
+ }
+}
+
+void drawrect(int color, int x1, int y1, int x2, int y2)
+{
+ SDL_Rect rect;
+
+ rect.x = x1 * display_zoom;
+ rect.y = y1 * display_zoom;
+ rect.w = (x2-x1) * display_zoom;
+ rect.h = (y2-y1) * display_zoom;
+
+ SDL_FillRect(surface, &rect, color);
+}
+
+#if 0
+static void help(void)
+{
+ printf(PROGNAME " " ROCKBOXUI_VERSION " " __DATE__ "\n"
+ "usage: " PROGNAME "\n");
+}
+#endif
+
+void dots(int *colors, struct coordinate *points, int count)
+{
+ int bpp = surface->format->BytesPerPixel;
+
+ if (SDL_MUSTLOCK(surface)) {
+ if (SDL_LockSurface(surface)) {
+ fprintf(stderr, "cannot lock surface: %s", SDL_GetError());
+ exit(-1);
+ }
+ }
+
+ while (count--) {
+ int x_off, y_off;
+
+ for (x_off = 0; x_off < display_zoom; x_off++) {
+ for (y_off = 0; y_off < display_zoom; y_off++) {
+ int x = points[count].x*display_zoom + x_off;
+ int y = points[count].y*display_zoom + y_off;
+
+ Uint8 *p = (Uint8 *) surface->pixels + y * surface->pitch + x * bpp;
+
+ switch (bpp) {
+ case 1:
+ *p = colors[count];
+ break;
+
+ case 2:
+ *(Uint16 *)p = colors[count];
+ break;
+
+ case 3:
+ if (SDL_BYTEORDER == SDL_BIG_ENDIAN) {
+ p[0] = (colors[count] >> 16) & 0xff;
+ p[1] = (colors[count] >> 8) & 0xff;
+ p[2] = (colors[count]) & 0xff;
+ } else {
+ p[2] = (colors[count] >> 16) & 0xff;
+ p[1] = (colors[count] >> 8) & 0xff;
+ p[0] = (colors[count]) & 0xff;
+ }
+ break;
+
+ case 4:
+ *(Uint32 *)p = colors[count];
+ break;
+ }
+ }
+ }
+ }
+
+ if (SDL_MUSTLOCK(surface)) {
+ SDL_UnlockSurface(surface);
+ }
+
+ SDL_UpdateRect(surface, 0, 0, 0, 0);
+}
+
+/* this is where the applicaton starts */
+extern void app_main(void);
+
+void screenhack()
+{
+#if 0
+ Bool helpme;
+
+ /* This doesn't work, but I don't know why (Daniel 1999-12-01) */
+ helpme = get_boolean_resource ("help", "Boolean");
+ if(helpme)
+ help();
+#endif
+
+ printf(PROGNAME " " ROCKBOXUI_VERSION " (" __DATE__ ")\n");
+
+ init_window();
+
+ screen_redraw();
+
+ app_main();
+}
+
+/* used for the player sim */
+void drawrectangles(int color, struct rectangle *points, int count)
+{
+ SDL_Rect rect;
+ Uint32 sdl_white = SDL_MapRGB(surface->format, 255, 255, 255);
+ Uint32 sdl_black = SDL_MapRGB(surface->format, 0, 0, 0);
+
+ while (count--) {
+ rect.x = points[count].x * display_zoom;
+ rect.y = points[count].y * display_zoom;
+ rect.w = points[count].width * display_zoom;
+ rect.h = points[count].height * display_zoom;
+
+ SDL_FillRect(surface, &rect, color ? sdl_white : sdl_black);
+ }
+}
+
+
+void screen_redraw()
+{
+ /* draw a border around the screen */
+ int X1 = 0;
+ int Y1 = 0;
+ int X2 = LCD_WIDTH + 2*MARGIN_X - 1;
+ int Y2 = LCD_HEIGHT + 2*MARGIN_Y - 1;
+
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X1, Y1, X2, Y1+1);
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X2, Y1, X2+1, Y2);
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X1, Y2, X2, Y2+1);
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), X1, Y1, X1+1, Y2);
+
+ lcd_display_redraw = true;
+ lcd_update();
+
+#ifdef LCD_REMOTE_HEIGHT
+ /* draw a border around the remote LCD screen */
+ int RX1 = 0;
+ int RY1 = Y2 + 1;
+ int RX2 = LCD_REMOTE_WIDTH + 2*MARGIN_X - 1;
+ int RY2 = RY1 + LCD_REMOTE_HEIGHT + 2*MARGIN_Y - 1;
+
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX1, RY1, RX2, RY1+1);
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX2, RY1, RX2+1, RY2);
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX1, RY2, RX2, RY2+1);
+ drawrect(SDL_MapRGB(surface->format, 255, 255, 255), RX1, RY1, RX1+1, RY2);
+
+ lcd_display_redraw = true;
+ lcd_remote_update();
+#endif
+}
diff --git a/uisimulator/sdl/uisw32.c b/uisimulator/sdl/uisw32.c
new file mode 100644
index 0000000000..1b4dbbd410
--- /dev/null
+++ b/uisimulator/sdl/uisw32.c
@@ -0,0 +1,344 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Felix Arends
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#include <windows.h>
+#include <process.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include "autoconf.h"
+#include "uisw32.h"
+#include "resource.h"
+#include "button.h"
+#include "thread.h"
+#include "thread-win32.h"
+#include "kernel.h"
+#include "sound.h"
+
+#ifndef LR_VGACOLOR /* Should be under MINGW32 builds? */
+#define LR_VGACOLOR LR_COLOR
+#endif
+
+// extern functions
+extern void app_main (void *); // mod entry point
+extern void new_key(int key);
+extern void sim_tick_tasks(void);
+
+void button_event(int key, bool pressed);
+
+// variables
+HWND hGUIWnd; // the GUI window handle
+unsigned int uThreadID; // id of mod thread
+PBYTE lpKeys;
+bool bActive; // window active?
+HANDLE hGUIThread; // thread for GUI
+#ifdef ROCKBOX_HAS_SIMSOUND
+HANDLE hSoundThread; // thread for sound
+#endif
+bool bIsWinNT; // Windows NT derivate?
+
+bool lcd_display_redraw=true; // Used for player simulator
+char having_new_lcd=true; // Used for player simulator
+
+// GUIWndProc
+// window proc for GUI simulator
+LRESULT CALLBACK GUIWndProc (
+ HWND hWnd,
+ UINT uMsg,
+ WPARAM wParam,
+ LPARAM lParam
+ )
+{
+ static HBITMAP hBkgnd;
+ static HDC hMemDc;
+
+ static LARGE_INTEGER persec, tick1, ticknow;
+ long new_tick;
+
+ switch (uMsg)
+ {
+ case WM_TIMER:
+ QueryPerformanceCounter(&ticknow);
+ new_tick = ((ticknow.QuadPart-tick1.QuadPart)*HZ)/persec.QuadPart;
+ if (new_tick != current_tick)
+ {
+ long i;
+ for (i = new_tick - current_tick; i > 0; i--)
+ sim_tick_tasks();
+ current_tick = new_tick;
+ }
+ return TRUE;
+ case WM_ACTIVATE:
+ if (LOWORD(wParam) == WA_ACTIVE || LOWORD(wParam) == WA_CLICKACTIVE)
+ bActive = true;
+ else
+ bActive = false;
+ return TRUE;
+ case WM_CREATE:
+ QueryPerformanceFrequency(&persec);
+ QueryPerformanceCounter(&tick1);
+ SetTimer (hWnd, TIMER_EVENT, 1, NULL);
+
+ // load background image
+ hBkgnd = (HBITMAP)LoadImage (GetModuleHandle (NULL),
+ MAKEINTRESOURCE(IDB_UI), IMAGE_BITMAP, 0, 0, LR_VGACOLOR);
+ hMemDc = CreateCompatibleDC (GetDC (hWnd));
+ SelectObject (hMemDc, hBkgnd);
+ return TRUE;
+ case WM_SIZING:
+ {
+ LPRECT r = (LPRECT)lParam;
+ char s[256];
+ int v;
+ int h_add = GetSystemMetrics (SM_CXSIZEFRAME) * 2 + 4;
+ int v_add = GetSystemMetrics (SM_CYSIZEFRAME) * 2
+ + GetSystemMetrics (SM_CYCAPTION) + 4;
+
+ switch (wParam)
+ {
+ case WMSZ_BOTTOM:
+ v = (r->bottom - r->top) / (UI_HEIGHT / 5);
+ r->bottom = r->top + v * UI_HEIGHT / 5 + v_add;
+ r->right = r->left + v * UI_WIDTH / 5 + h_add;
+ break;
+ case WMSZ_RIGHT:
+ v = (r->right - r->left) / (UI_WIDTH / 5);
+ r->bottom = r->top + v * UI_HEIGHT / 5 + v_add;
+ r->right = r->left + v * UI_WIDTH / 5 + h_add;
+ break;
+ case WMSZ_TOP:
+ v = (r->bottom - r->top) / (UI_HEIGHT / 5);
+ r->top = r->bottom - v * UI_HEIGHT / 5 - v_add;
+ r->right = r->left + v * UI_WIDTH / 5 + h_add;
+ break;
+ case WMSZ_LEFT:
+ v = (r->right - r->left) / (UI_WIDTH / 5);
+ r->bottom = r->top + v * UI_HEIGHT / 5 + v_add;
+ r->left = r->right - v * UI_WIDTH / 5 - h_add;
+ break;
+ case WMSZ_BOTTOMRIGHT:
+ v = ((r->right - r->left) * UI_HEIGHT
+ +(r->bottom - r->top) * UI_WIDTH)
+ / (2 * UI_WIDTH * UI_HEIGHT / 5);
+ r->bottom = r->top + v * UI_HEIGHT / 5 + v_add;
+ r->right = r->left + v * UI_WIDTH / 5 + h_add;
+ break;
+ case WMSZ_BOTTOMLEFT:
+ v = ((r->right - r->left) * UI_HEIGHT
+ +(r->bottom - r->top) * UI_WIDTH)
+ / (2 * UI_WIDTH * UI_HEIGHT / 5);
+ r->bottom = r->top + v * UI_HEIGHT / 5 + v_add;
+ r->left = r->right - v * UI_WIDTH / 5 - h_add;
+ break;
+ case WMSZ_TOPRIGHT:
+ v = ((r->right - r->left) * UI_HEIGHT
+ +(r->bottom - r->top) * UI_WIDTH)
+ / (2 * UI_WIDTH * UI_HEIGHT / 5);
+ r->top = r->bottom - v * UI_HEIGHT / 5 - v_add;
+ r->right = r->left + v * UI_WIDTH / 5 + h_add;
+ break;
+ case WMSZ_TOPLEFT:
+ v = ((r->right - r->left) * UI_HEIGHT
+ +(r->bottom - r->top) * UI_WIDTH)
+ / (2 * UI_WIDTH * UI_HEIGHT / 5);
+ r->top = r->bottom - v * UI_HEIGHT / 5 - v_add;
+ r->left = r->right - v * UI_WIDTH / 5 - h_add;
+ break;
+ }
+
+ wsprintf (s, UI_TITLE " @%d%%",
+ (r->right - r->left - h_add + 1) * 100 / UI_WIDTH);
+ SetWindowText (hWnd, s);
+
+ return TRUE;
+ }
+ case WM_ERASEBKGND:
+ {
+ HDC hDc = (HDC) wParam;
+ RECT r;
+
+ GetClientRect (hWnd, &r);
+ // blit background image to screen
+ SetStretchBltMode(hDc, bIsWinNT ? HALFTONE : COLORONCOLOR);
+ StretchBlt (hDc, 0, 0, r.right, r.bottom,
+ hMemDc, 0, 0, UI_WIDTH, UI_HEIGHT, SRCCOPY);
+ return TRUE;
+ }
+ case WM_PAINT:
+ {
+ PAINTSTRUCT ps;
+ RECT r;
+ HDC hDc = BeginPaint (hWnd, &ps);
+
+ GetClientRect (hWnd, &r);
+ // draw lcd screen
+ SetStretchBltMode(hDc, bIsWinNT ? HALFTONE : COLORONCOLOR);
+ StretchDIBits (hDc,
+ UI_LCD_POSX * r.right / UI_WIDTH,
+ UI_LCD_POSY * r.bottom / UI_HEIGHT,
+ UI_LCD_WIDTH * r.right / UI_WIDTH,
+ UI_LCD_HEIGHT * r.bottom / UI_HEIGHT,
+ 0, 0, LCD_WIDTH, LCD_HEIGHT,
+ bitmap, (BITMAPINFO *) &bmi, DIB_RGB_COLORS,
+ SRCCOPY);
+#ifdef HAVE_REMOTE_LCD
+ StretchDIBits (hDc,
+ UI_REMOTE_POSX * r.right / UI_WIDTH,
+ UI_REMOTE_POSY * r.bottom / UI_HEIGHT,
+ UI_REMOTE_WIDTH * r.right / UI_WIDTH,
+ UI_REMOTE_HEIGHT * r.bottom / UI_HEIGHT,
+ 0, 0, LCD_REMOTE_WIDTH, LCD_REMOTE_HEIGHT,
+ remote_bitmap, (BITMAPINFO *) &remote_bmi,
+ DIB_RGB_COLORS, SRCCOPY);
+#endif
+ EndPaint (hWnd, &ps);
+ return TRUE;
+ }
+ case WM_CLOSE:
+ // close simulator
+ KillTimer (hWnd, TIMER_EVENT);
+ hGUIWnd = NULL;
+ PostQuitMessage (0);
+ break;
+ case WM_DESTROY:
+ // close simulator
+ hGUIWnd = NULL;
+ PostQuitMessage (0);
+ break;
+ case WM_KEYDOWN:
+ button_event(wParam, true);
+ break;
+ case WM_KEYUP:
+ button_event(wParam, false);
+ break;
+ }
+
+ return DefWindowProc (hWnd, uMsg, wParam, lParam);
+}
+
+// GUIStartup
+// register window class, show window, init GUI
+BOOL GUIStartup ()
+{
+ WNDCLASS wc;
+
+ // create window class
+ ZeroMemory (&wc, sizeof(wc));
+ wc.hbrBackground = GetSysColorBrush (COLOR_WINDOW);
+ wc.hCursor = LoadCursor (NULL, IDC_ARROW);
+ wc.hInstance = GetModuleHandle (NULL);
+ wc.lpfnWndProc = GUIWndProc;
+ wc.lpszClassName = "RockBoxUISimulator";
+ wc.style = CS_HREDRAW | CS_VREDRAW;
+
+ if (RegisterClass (&wc) == 0)
+ return FALSE;
+
+ // create window
+ hGUIWnd = CreateWindowEx (
+ WS_EX_OVERLAPPEDWINDOW,
+ "RockBoxUISimulator", UI_TITLE,
+ WS_VISIBLE | WS_SYSMENU | WS_OVERLAPPEDWINDOW,
+ CW_USEDEFAULT, CW_USEDEFAULT,
+ UI_WIDTH + GetSystemMetrics (SM_CXSIZEFRAME) * 2 +4,
+ UI_HEIGHT + GetSystemMetrics (SM_CYSIZEFRAME) * 2 +
+ GetSystemMetrics (SM_CYCAPTION) +4,
+ NULL, NULL, GetModuleHandle (NULL), NULL);
+
+ if (hGUIWnd == NULL)
+ return FALSE;
+
+ simlcdinit();
+
+ return TRUE;
+}
+
+// GUIDown
+// destroy window, unregister window class
+int GUIDown ()
+{
+ int i;
+
+ DestroyWindow (hGUIWnd);
+ CloseHandle (hGUIThread);
+#ifdef ROCKBOX_HAS_SIMSOUND
+ CloseHandle (hSoundThread);
+#endif
+
+ for (i = 0; i < nThreads; i++)
+ {
+ CloseHandle (lpThreads[i]);
+ }
+ return 0;
+}
+
+// GUIMessageLoop
+// standard message loop for GUI window
+void GUIMessageLoop ()
+{
+ MSG msg;
+ while (GetMessage (&msg, NULL, 0, 0))
+ {
+ TranslateMessage (&msg);
+ DispatchMessage (&msg);
+ }
+}
+
+
+// WinMain
+// program entry point
+int WINAPI WinMain (
+ HINSTANCE hInstance, // current instance
+ HINSTANCE hPrevInstance, // previous instance
+ LPSTR lpCmd, // command line
+ int nShowCmd // show command
+ )
+{
+ DWORD dwThreadID;
+
+ (void)hInstance;
+ (void)hPrevInstance;
+ (void)lpCmd;
+ (void)nShowCmd;
+
+ /* default file mode should be O_BINARY to be consistent with rockbox */
+ _fmode = _O_BINARY;
+
+ bIsWinNT = ((GetVersion() & 0x80000000) == 0);
+
+ if (!GUIStartup ())
+ return 0;
+
+ hGUIThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)app_main,
+ NULL, 0, &dwThreadID);
+
+ if (hGUIThread == NULL)
+ return MessageBox (NULL, "Error creating gui thread!", "Error", MB_OK);
+
+#ifdef ROCKBOX_HAS_SIMSOUND
+ hSoundThread = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)
+ sound_playback_thread, NULL, 0, &dwThreadID);
+
+ if (hSoundThread == NULL)
+ MessageBox (NULL, "Error creating sound thread!", "Warning", MB_OK);
+#endif
+
+ GUIMessageLoop ();
+
+ return GUIDown ();
+}
diff --git a/uisimulator/sdl/uisw32.h b/uisimulator/sdl/uisw32.h
new file mode 100644
index 0000000000..7b393a761b
--- /dev/null
+++ b/uisimulator/sdl/uisw32.h
@@ -0,0 +1,156 @@
+/***************************************************************************
+ * __________ __ ___.
+ * Open \______ \ ____ ____ | | _\_ |__ _______ ___
+ * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
+ * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
+ * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
+ * \/ \/ \/ \/ \/
+ * $Id$
+ *
+ * Copyright (C) 2002 by Felix Arends
+ *
+ * All files in this archive are subject to the GNU General Public License.
+ * See the file COPYING in the source tree root for full license agreement.
+ *
+ * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
+ * KIND, either express or implied.
+ *
+ ****************************************************************************/
+
+#ifndef __UISW32_H__
+#define __UISW32_H__
+
+#ifdef _MSC_VER
+typedef unsigned short wchar_t;
+#define _WCHAR_T_DEFINED
+#endif
+#include <windows.h>
+#include "lcd-win32.h"
+
+#if defined(ARCHOS_RECORDER)
+#define UI_TITLE "Jukebox Recorder"
+#define UI_WIDTH 270 // width of GUI window
+#define UI_HEIGHT 406 // height of GUI window
+#define UI_LCD_BGCOLOR 90, 145, 90 // bkgnd color of LCD (no backlight)
+#define UI_LCD_BGCOLORLIGHT 126, 229, 126 // bkgnd color of LCD (backlight)
+#define UI_LCD_BLACK 0, 0, 0 // black
+#define UI_LCD_POSX 80 // x position of lcd
+#define UI_LCD_POSY 104 // y position of lcd (96 for real aspect)
+#define UI_LCD_WIDTH 112
+#define UI_LCD_HEIGHT 64 // (80 for real aspect)
+
+#elif defined(ARCHOS_PLAYER)
+#define UI_TITLE "Jukebox Player"
+#define UI_WIDTH 284 // width of GUI window
+#define UI_HEIGHT 420 // height of GUI window
+#define UI_LCD_BGCOLOR 90, 145, 90 // bkgnd color of LCD (no backlight)
+#define UI_LCD_BGCOLORLIGHT 126, 229, 126 // bkgnd color of LCD (backlight)
+#define UI_LCD_BLACK 0, 0, 0 // black
+#define UI_LCD_POSX 75 // x position of lcd
+#define UI_LCD_POSY 111 // y position of lcd
+#define UI_LCD_WIDTH 132
+#define UI_LCD_HEIGHT 75
+
+#elif defined(ARCHOS_FMRECORDER) || defined(ARCHOS_RECORDERV2)
+#define UI_TITLE "Jukebox FM Recorder"
+#define UI_WIDTH 285 // width of GUI window
+#define UI_HEIGHT 414 // height of GUI window
+#define UI_LCD_BGCOLOR 90, 145, 90 // bkgnd color of LCD (no backlight)
+#define UI_LCD_BGCOLORLIGHT 126, 229, 126 // bkgnd color of LCD (backlight)
+#define UI_LCD_BLACK 0, 0, 0 // black
+#define UI_LCD_POSX 87 // x position of lcd
+#define UI_LCD_POSY 77 // y position of lcd (69 for real aspect)
+#define UI_LCD_WIDTH 112
+#define UI_LCD_HEIGHT 64 // (80 for real aspect)
+
+#elif defined(ARCHOS_ONDIOSP) || defined(ARCHOS_ONDIOFM)
+#define UI_TITLE "Ondio"
+#define UI_WIDTH 155 // width of GUI window
+#define UI_HEIGHT 334 // height of GUI window
+#define UI_LCD_BGCOLOR 90, 145, 90 // bkgnd color of LCD (no backlight)
+#define UI_LCD_BGCOLORLIGHT 90, 145, 90 // bkgnd color of LCD (backlight)
+#define UI_LCD_BLACK 0, 0, 0 // black
+#define UI_LCD_POSX 21 // x position of lcd
+#define UI_LCD_POSY 82 // y position of lcd (74 for real aspect)
+#define UI_LCD_WIDTH 112
+#define UI_LCD_HEIGHT 64 // (80 for real aspect)
+
+#elif defined(IRIVER_H100_SERIES)
+#define UI_TITLE "iriver H1x0"
+#define UI_WIDTH 379 // width of GUI window
+#define UI_HEIGHT 508 // height of GUI window
+#define UI_LCD_BGCOLOR 90, 145, 90 // bkgnd color of LCD (no backlight)
+#define UI_LCD_BGCOLORLIGHT 230, 216, 173 // bkgnd color of LCD (backlight)
+#define UI_LCD_BLACK 0, 0, 0 // black
+#define UI_LCD_POSX 109 // x position of lcd
+#define UI_LCD_POSY 23 // y position of lcd
+#define UI_LCD_WIDTH 160
+#define UI_LCD_HEIGHT 128
+#define UI_REMOTE_BGCOLOR 90, 145, 90 // bkgnd of remote lcd (no bklight)
+#define UI_REMOTE_BGCOLORLIGHT 250, 180, 130 // bkgnd of remote lcd (bklight)
+#define UI_REMOTE_POSX 50 // x position of remote lcd
+#define UI_REMOTE_POSY 403 // y position of remote lcd
+#define UI_REMOTE_WIDTH 128
+#define UI_REMOTE_HEIGHT 64
+
+#elif defined(IRIVER_H300_SERIES)
+#define UI_TITLE "iriver H300"
+#define UI_WIDTH 288 // width of GUI window
+#define UI_HEIGHT 581 // height of GUI window
+/* high-colour */
+#define UI_LCD_POSX 26 // x position of lcd
+#define UI_LCD_POSY 36 // y position of lcd
+#define UI_LCD_WIDTH 220
+#define UI_LCD_HEIGHT 176
+#define UI_REMOTE_BGCOLOR 90, 145, 90 // bkgnd of remote lcd (no bklight)
+#define UI_REMOTE_BGCOLORLIGHT 250, 180, 130 // bkgnd of remote lcd (bklight)
+#define UI_REMOTE_POSX 12 // x position of remote lcd
+#define UI_REMOTE_POSY 478 // y position of remote lcd
+#define UI_REMOTE_WIDTH 128
+#define UI_REMOTE_HEIGHT 64
+
+#elif defined(IPOD_COLOR)
+#define UI_TITLE "iPod Color"
+#define UI_WIDTH 261 // width of GUI window
+#define UI_HEIGHT 493 // height of GUI window
+/* high-colour */
+#define UI_LCD_POSX 21 // x position of lcd
+#define UI_LCD_POSY 16 // y position of lcd
+#define UI_LCD_WIDTH 220
+#define UI_LCD_HEIGHT 176
+
+#elif defined(IPOD_NANO)
+#define UI_TITLE "iPod Nano"
+#define UI_WIDTH 199 // width of GUI window
+#define UI_HEIGHT 421 // height of GUI window
+/* high-colour */
+#define UI_LCD_POSX 13 // x position of lcd
+#define UI_LCD_POSY 14 // y position of lcd
+#define UI_LCD_WIDTH 176
+#define UI_LCD_HEIGHT 132
+
+#elif defined(ARCHOS_GMINI120)
+#define UI_TITLE "Gmini 120"
+#define UI_WIDTH 370 // width of GUI window
+#define UI_HEIGHT 264 // height of GUI window
+#define UI_LCD_BGCOLOR 90, 145, 90 // bkgnd color of LCD (no backlight)
+#define UI_LCD_BGCOLORLIGHT 230, 160, 60 // bkgnd color of LCD (backlight)
+#define UI_LCD_BLACK 0, 0, 0 // black
+#define UI_LCD_POSX 85 // x position of lcd
+#define UI_LCD_POSY 61 // y position of lcd (74 for real aspect)
+#define UI_LCD_WIDTH 192 // * 1.5
+#define UI_LCD_HEIGHT 96 // * 1.5
+
+#endif
+
+#define TIMER_EVENT 0x34928340
+
+extern HWND hGUIWnd; // the GUI window handle
+extern unsigned int uThreadID; // id of mod thread
+extern bool bActive;
+
+// typedefs
+typedef unsigned char uchar;
+typedef unsigned int uint32;
+
+#endif // #ifndef __UISW32_H__
diff --git a/uisimulator/sdl/version.h b/uisimulator/sdl/version.h
new file mode 100644
index 0000000000..1d40c08781
--- /dev/null
+++ b/uisimulator/sdl/version.h
@@ -0,0 +1 @@
+#define ROCKBOXUI_VERSION "0.2"