Only in supertux-0.1.3: aclocal.m4
diff -ur supertux-0.1.3/AUTHORS supertux-0.1.3-gp2x/AUTHORS
--- supertux-0.1.3/AUTHORS	2005-07-02 14:37:30.000000000 +0300
+++ supertux-0.1.3-gp2x/AUTHORS	2006-04-13 06:11:02.000000000 +0300
@@ -91,6 +91,12 @@
 
     Royalty free CDROMs and FTP sites sounds
 
+Port to GP2X
+-----------
+    Ingo Arndt
+    scachi@gmx.de
+    http://www.bitmage.de
+
 More information and contacts
 =============================
 
Only in supertux-0.1.3: autom4te.cache
Only in supertux-0.1.3-gp2x: autoscan.log
Only in supertux-0.1.3-gp2x: COMPILE4GP2X
Only in supertux-0.1.3: config.guess
Only in supertux-0.1.3: config.log
Only in supertux-0.1.3: config.status
Only in supertux-0.1.3: config.sub
Only in supertux-0.1.3: configure
diff -ur supertux-0.1.3/configure.ac supertux-0.1.3-gp2x/configure.ac
--- supertux-0.1.3/configure.ac	2005-07-06 12:26:15.000000000 +0300
+++ supertux-0.1.3-gp2x/configure.ac	2006-04-19 22:29:05.000000000 +0300
@@ -76,13 +76,33 @@
 CFLAGS="$CFLAGS $SDL_CFLAGS"
 LIBS="$LIBS $SDL_LIBS"
 
+AM_PATH_LIBMIKMOD(,
+            :,
+	    AC_MSG_ERROR([*** mikmod not found!]))
+CXXFLAGS="$CXXFLAGS $LIBMIKMOD_CFLAGS"
+CFLAGS="$CFLAGS $LIBMIKMOD_CFLAGS"
+LIBS="$LIBS $LIBMIKMOD_LIBS"
+
 dnl Checks for additional libraries.
+AC_CHECK_LIB(smpeg, SMPEG_status)
+
+AC_CHECK_LIB(mikmod, MikMod_Init)
+
 AC_CHECK_LIB(SDL_mixer, Mix_OpenAudio,,
 	AC_MSG_ERROR([SDL_mixer library required]))
 
+AC_CHECK_LIB(jpeg,jpeg_abort)
+
+AC_CHECK_LIB(z,compress)
+
+AC_CHECK_LIB(png,png_free)
+
 AC_CHECK_LIB(SDL_image, IMG_Load,,
 	AC_MSG_ERROR([SDL_image library required]))
 
+AC_CHECK_LIB(SDL_gfx, rotozoomSurface,,
+	AC_MSG_ERROR([SDL_gfx library required]))
+
 if test "x${enable_opengl}" != "xno"; then
   AX_CHECK_GL
 fi
@@ -95,7 +115,30 @@
   LIBS="$LIBS $GL_LIBS"
 fi
 
-AC_CHECK_LIB(z, gzopen,, AC_MSG_ERROR([*** zlib is missing]))
+# compile for the testing the 320x240 resolution
+# compile for the gp2x
+AC_ARG_ENABLE(gp2x,
+[  --enable-gp2x          Build the gp2x version [default=no]],
+              , enable_gp2x=no)
+if test x$enable_gp2x = xyes; then
+    CXXFLAGS="$CXXFLAGS -DGP2X"
+fi
+
+AC_ARG_ENABLE(320x240,
+[  --enable-320x240          Test the 320x240 resolution [default=no]],
+              , enable_320x240=no)
+if test x$enable_320x240 = xyes; then
+    CXXFLAGS="$CXXFLAGS -DRES320X240"
+fi
+
+# compile static
+AC_ARG_ENABLE(static,
+[  --enable-static          Build the static version [default=no]],
+              , enable_static=no)
+if test x$enable_static = xyes; then
+    CXXFLAGS="$CXXFLAGS -static"
+fi
+
 
 CXXFLAGS="$CXXFLAGS -DDATA_PREFIX='\"$datadir/supertux\"'" 
 
@@ -110,6 +153,9 @@
 echo " Profile Mode:   $enable_gprof"
 echo " Debug Mode:     $enable_debug"
 echo " OpenGL Support: $enable_opengl"
+echo " 320x240 Resolution:    $enable_320x240"
+echo " GP2X Build (+320x240): $enable_gp2x"
+echo " Static Build:          $enable_static"
 echo ""
 
 # EOF #
Only in supertux-0.1.3/data: CREDITS
Only in supertux-0.1.3/data: extro-bonus2.txt
Only in supertux-0.1.3/data: extro-bonus.txt
Only in supertux-0.1.3/data: extro.txt
Only in supertux-0.1.3/data: images
Only in supertux-0.1.3/data: intro.txt
Only in supertux-0.1.3/data: levels
Only in supertux-0.1.3/data: Makefile
Only in supertux-0.1.3/data: Makefile.in
Only in supertux-0.1.3/data: music
Only in supertux-0.1.3/data: sounds
Only in supertux-0.1.3/data: supertux.strf
Only in supertux-0.1.3: depcomp
Only in supertux-0.1.3: install-sh
Only in supertux-0.1.3: m4
Only in supertux-0.1.3: Makefile
Only in supertux-0.1.3: Makefile.in
Only in supertux-0.1.3: missing
Only in supertux-0.1.3: mkinstalldirs
Only in supertux-0.1.3: patches
diff -ur supertux-0.1.3/src/badguy.cpp supertux-0.1.3-gp2x/src/badguy.cpp
--- supertux-0.1.3/src/badguy.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/badguy.cpp	2006-04-20 21:32:23.000000000 +0300
@@ -250,7 +250,11 @@
           tux.kick_timer.start(KICKING_TIME);
           set_sprite(img_mriceblock_flat_left, img_mriceblock_flat_right);
           physic.set_velocity_x((dir == LEFT) ? -3.5 : 3.5);
+#ifndef GP2X
           play_sound(sounds[SND_KICK],SOUND_CENTER_SPEAKER);
+#else
+          play_chunk(SND_KICK);
+#endif
         }
     }
 
@@ -260,6 +264,7 @@
       check_horizontal_bump();
       if(mode == KICK && changed != dir)
         {
+#ifndef GP2X
           /* handle stereo sound (number 10 should be tweaked...)*/
           if (base.x < scroll_x + screen->w/2 - 10)
             play_sound(sounds[SND_RICOCHET], SOUND_LEFT_SPEAKER);
@@ -267,6 +272,9 @@
             play_sound(sounds[SND_RICOCHET], SOUND_RIGHT_SPEAKER);
           else
             play_sound(sounds[SND_RICOCHET], SOUND_CENTER_SPEAKER);
+#else
+          play_chunk(SND_RICOCHET);
+#endif
         }
     }
 
@@ -455,11 +463,15 @@
 
       /* play explosion sound */  // FIXME: is the stereo all right? maybe we should use player cordinates...
       if (base.x < scroll_x + screen->w/2 - 10)
+#ifndef GP2X
         play_sound(sounds[SND_EXPLODE], SOUND_LEFT_SPEAKER);
       else if (base.x > scroll_x + screen->w/2 + 10)
         play_sound(sounds[SND_EXPLODE], SOUND_RIGHT_SPEAKER);
       else
         play_sound(sounds[SND_EXPLODE], SOUND_CENTER_SPEAKER);
+#else
+	play_chunk(SND_EXPLODE);
+#endif
 
     } else if(mode == BOMB_EXPLODE) {
       remove_me();
@@ -677,13 +689,21 @@
     }
 
   // BadGuy fall below the ground
+#ifndef RES320X240
   if (base.y > screen->h) {
+#else
+  if (base.y > 640) {
+#endif
     remove_me();
     return;
   }
 
   // Once it's on screen, it's activated!
+#ifndef RES320X240
   if (base.x <= scroll_x + screen->w + OFFSCREEN_DISTANCE)
+#else
+  if (base.x <= scroll_x + 640 + OFFSCREEN_DISTANCE)
+#endif
     seen = true;
 
   if(!seen)
@@ -743,7 +763,11 @@
 BadGuy::draw()
 {
   // Don't try to draw stuff that is outside of the screen
+#ifndef RES320X240
   if(base.x <= scroll_x - base.width || base.x >= scroll_x + screen->w)
+#else
+  if(base.x <= scroll_x - base.width || base.x >= scroll_x + 640)
+#endif
     return;
   
   if(sprite_left == 0 || sprite_right == 0)
@@ -811,7 +835,11 @@
     
   World::current()->add_score(base.x - scroll_x,
                               base.y, 50 * player_status.score_multiplier);
+#ifndef GP2X
   play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
+#else
+  play_chunk(SND_SQUISH);
+#endif
   player_status.score_multiplier++;
 
   dying = DYING_SQUISHED;
@@ -830,7 +858,11 @@
    
     player->jump_of_badguy(this);
     World::current()->add_score(base.x - scroll_x, base.y, 50 * player_status.score_multiplier);
+#ifndef GP2X
     play_sound(sounds[SND_SQUISH], SOUND_CENTER_SPEAKER);
+#else
+    play_chunk(SND_SQUISH);
+#endif
     player_status.score_multiplier++;
     remove_me();
     return;
@@ -839,7 +871,11 @@
     if (mode == NORMAL || mode == KICK)
       {
         /* Flatten! */
+#ifndef GP2X
         play_sound(sounds[SND_STOMP], SOUND_CENTER_SPEAKER);
+#else
+	play_chunk(SND_STOMP);
+#endif
         mode = FLAT;
         set_sprite(img_mriceblock_flat_left, img_mriceblock_flat_right);
         physic.set_velocity_x(0);
@@ -847,7 +883,11 @@
         timer.start(4000);
       } else if (mode == FLAT) {
         /* Kick! */
+#ifndef GP2X
         play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
+#else
+	play_chunk(SND_KICK);
+#endif
 
         if (player->base.x < base.x + (base.width/2)) {
           physic.set_velocity_x(5);
@@ -925,7 +965,11 @@
                     score * player_status.score_multiplier);
 
   /* Play death sound: */
+#ifndef GP2X
   play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
+#else
+	play_chunk(SND_FALL);
+#endif
 }
 
 void BadGuy::explode(BadGuy *badguy)
@@ -1053,7 +1097,11 @@
       /* Get kicked if were flat */
       if (mode == FLAT && !dying)
       {
+#ifndef GP2X
         play_sound(sounds[SND_KICK], SOUND_CENTER_SPEAKER);
+#else
+	play_chunk(SND_KICK);
+#endif
 
         // Hit from left side
         if (player->base.x < base.x) {
diff -ur supertux-0.1.3/src/configfile.cpp supertux-0.1.3-gp2x/src/configfile.cpp
--- supertux-0.1.3/src/configfile.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/configfile.cpp	2006-04-10 13:32:19.000000000 +0300
@@ -92,12 +92,22 @@
   else
     use_joystick = true;
 
+#ifndef GP2X
   reader.read_int ("joystick-x", &joystick_keymap.x_axis);
   reader.read_int ("joystick-y", &joystick_keymap.y_axis);
   reader.read_int ("joystick-a", &joystick_keymap.a_button);
   reader.read_int ("joystick-b", &joystick_keymap.b_button);
   reader.read_int ("joystick-start", &joystick_keymap.start_button);
   reader.read_int ("joystick-deadzone", &joystick_keymap.dead_zone);
+#else
+  reader.read_int ("joystick-up", &joystick_keymap.up_button);
+  reader.read_int ("joystick-down", &joystick_keymap.down_button);
+  reader.read_int ("joystick-right", &joystick_keymap.right_button);
+  reader.read_int ("joystick-left", &joystick_keymap.left_button);
+  reader.read_int ("joystick-a", &joystick_keymap.a_button);
+  reader.read_int ("joystick-b", &joystick_keymap.b_button);
+  reader.read_int ("joystick-start", &joystick_keymap.start_button);
+#endif
 
   reader.read_int ("keyboard-jump", &keymap.jump);
   reader.read_int ("keyboard-duck", &keymap.duck);
@@ -130,12 +140,22 @@
       fprintf(config, "\n\t;; joystick number (-1 means no joystick):\n");
       fprintf(config, "\t(joystick   %d)\n", use_joystick ? joystick_num : -1);
 
+#ifndef GP2X
       fprintf(config, "\t(joystick-x   %d)\n", joystick_keymap.x_axis);
       fprintf(config, "\t(joystick-y   %d)\n", joystick_keymap.y_axis);
       fprintf(config, "\t(joystick-a   %d)\n", joystick_keymap.a_button);
       fprintf(config, "\t(joystick-b   %d)\n", joystick_keymap.b_button);
       fprintf(config, "\t(joystick-start  %d)\n", joystick_keymap.start_button);
       fprintf(config, "\t(joystick-deadzone  %d)\n", joystick_keymap.dead_zone);
+#else
+      fprintf(config, "\t(joystick-up   %d)\n", joystick_keymap.up_button);
+      fprintf(config, "\t(joystick-down   %d)\n", joystick_keymap.down_button);
+      fprintf(config, "\t(joystick-right   %d)\n", joystick_keymap.right_button);
+      fprintf(config, "\t(joystick-left   %d)\n", joystick_keymap.left_button);
+      fprintf(config, "\t(joystick-a   %d)\n", joystick_keymap.a_button);
+      fprintf(config, "\t(joystick-b   %d)\n", joystick_keymap.b_button);
+      fprintf(config, "\t(joystick-start  %d)\n", joystick_keymap.start_button);
+#endif
 
       fprintf(config, "\t(keyboard-jump  %d)\n", keymap.jump);
       fprintf(config, "\t(keyboard-duck  %d)\n", keymap.duck);
diff -ur supertux-0.1.3/src/defines.h supertux-0.1.3-gp2x/src/defines.h
--- supertux-0.1.3/src/defines.h	2005-07-07 02:05:03.000000000 +0300
+++ supertux-0.1.3-gp2x/src/defines.h	2006-04-11 22:02:05.000000000 +0300
@@ -91,7 +91,11 @@
 
 /* Scrolling text speed */
 
+#ifndef RES320X240
 #define SCROLL_SPEED_CREDITS 1.2
+#else
+#define SCROLL_SPEED_CREDITS 2.4
+#endif
 #define SCROLL_SPEED_MESSAGE 1.0
 
 /* Debugging */
Only in supertux-0.1.3/src: .deps
diff -ur supertux-0.1.3/src/gameloop.cpp supertux-0.1.3-gp2x/src/gameloop.cpp
--- supertux-0.1.3/src/gameloop.cpp	2005-07-02 15:16:08.000000000 +0300
+++ supertux-0.1.3-gp2x/src/gameloop.cpp	2006-05-05 23:22:58.000000000 +0300
@@ -288,6 +288,7 @@
   
               switch(event.type)
                 {
+#ifndef GP2X
                 case SDL_QUIT:        /* Quit event - quit: */
                   st_abort("Received window close", "");
                   break;
@@ -434,22 +435,60 @@
                         tux.input.down = UP;
                     }
                   break;
-            
+#endif            
                 case SDL_JOYBUTTONDOWN:
+#ifndef GP2X
+                  if (event.jbutton.button == joystick_keymap.a_button)
+                    tux.input.up = DOWN;
+                  else if (event.jbutton.button == joystick_keymap.b_button)
+                    tux.input.fire = DOWN;
+                  else if (event.jbutton.button == joystick_keymap.start_button)
+                    on_escape_press();
+                  break;
+#else
                   if (event.jbutton.button == joystick_keymap.a_button)
                     tux.input.up = DOWN;
                   else if (event.jbutton.button == joystick_keymap.b_button)
                     tux.input.fire = DOWN;
                   else if (event.jbutton.button == joystick_keymap.start_button)
                     on_escape_press();
+                  else if (event.jbutton.button == joystick_keymap.up_button)
+                    tux.input.up = DOWN;
+                  else if (event.jbutton.button == joystick_keymap.down_button)
+                    tux.input.down = DOWN;
+                  else if (event.jbutton.button == joystick_keymap.right_button)
+                    tux.input.right = DOWN;
+                  else if (event.jbutton.button == joystick_keymap.left_button)
+                    tux.input.left = DOWN;
+                  else if (event.jbutton.button == joystick_keymap.voldown_button)
+		    decreaseSoundVolume();
+                  else if (event.jbutton.button == joystick_keymap.volup_button)
+		    increaseSoundVolume();
                   break;
+#endif
+
                 case SDL_JOYBUTTONUP:
+#ifndef GP2X
                   if (event.jbutton.button == joystick_keymap.a_button)
                     tux.input.up = UP;
                   else if (event.jbutton.button == joystick_keymap.b_button)
                     tux.input.fire = UP;
                   break;
-
+#else
+                  if (event.jbutton.button == joystick_keymap.a_button)
+                    tux.input.up = UP;
+                  else if (event.jbutton.button == joystick_keymap.b_button)
+                    tux.input.fire = UP;
+                  else if (event.jbutton.button == joystick_keymap.up_button)
+                    tux.input.up = UP;
+                  else if (event.jbutton.button == joystick_keymap.down_button)
+                    tux.input.down = UP;
+                  else if (event.jbutton.button == joystick_keymap.right_button)
+                    tux.input.right = UP;
+                  else if (event.jbutton.button == joystick_keymap.left_button)
+                    tux.input.left = UP;
+                  break;
+#endif
                 default:
                   break;
                 }  /* switch */
@@ -464,7 +503,7 @@
   Player* tux = world->get_tux();
 
   /* End of level? */
-  int endpos = (World::current()->get_level()->width-5) * 32;
+  int endpos = (World::current()->get_level()->width-5) * (32);
   Tile* endtile = collision_goal(tux->base);
 
   // fallback in case the other endpositions don't trigger
@@ -545,7 +584,7 @@
       Menu::current()->draw();
       mouse_cursor->draw();
     }
-
+  //updateSound();
   updatescreen();
 }
 
@@ -599,6 +638,7 @@
 
   while (exit_status == ES_NONE)
     {
+      SDL_Delay(10);
       /* Calculate the movement-factor */
       double frame_ratio = ((double)(update_time-last_update_time))/((double)FRAME_RATE);
 
@@ -686,6 +726,7 @@
               fps_cnt = 0;
             }
         }
+	//updateSound();
     }
   
   return exit_status;
@@ -694,21 +735,32 @@
 /* Bounce a brick: */
 void bumpbrick(float x, float y)
 {
-  World::current()->add_bouncy_brick(((int)(x + 1) / 32) * 32,
-                         (int)(y / 32) * 32);
+  World::current()->add_bouncy_brick(((int)(x + 1) / (32)) * (32),
+                         (int)(y / (32)) * (32));
 
+#ifndef GP2X
   play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
+#else
+  play_chunk(SND_BRICK);
+#endif
 }
 
 /* (Status): */
 void
 GameSession::drawstatus()
 {
+ int xdiv;
+#ifdef RES320X240
+ xdiv=2;
+#else
+ xdiv=1;
+#endif
+
   char str[60];
 
   sprintf(str, "%d", player_status.score);
   white_text->draw("SCORE", 0, 0, 1);
-  gold_text->draw(str, 96, 0, 1);
+  gold_text->draw(str, 96/xdiv, 0, 1);
 
   if(st_gl_mode == ST_GL_TEST)
     {
@@ -716,28 +768,33 @@
     }
 
   if(!time_left.check()) {
-    white_text->draw("TIME'S UP", 224, 0, 1);
+    white_text->draw("TIME'S UP", 224/xdiv, 0, 1);
   } else if (time_left.get_left() > TIME_WARNING || (global_frame_counter % 10) < 5) {
     sprintf(str, "%d", time_left.get_left() / 1000 );
-    white_text->draw("TIME", 224, 0, 1);
-    gold_text->draw(str, 304, 0, 1);
+    white_text->draw("TIME", 224/xdiv, 0, 1);
+    gold_text->draw(str, 304/xdiv, 0, 1);
   }
 
   sprintf(str, "%d", player_status.distros);
   white_text->draw("COINS", screen->h, 0, 1);
-  gold_text->draw(str, 608, 0, 1);
+  gold_text->draw(str, 608/xdiv, 0, 1);
 
-  white_text->draw("LIVES", 480, 20);
+  white_text->draw("LIVES", 480/xdiv, 20);
   if (player_status.lives >= 5)
     {
       sprintf(str, "%dx", player_status.lives);
+#ifdef RES320X240
+      gold_text->draw_align(str, 617/xdiv-5, 20, A_RIGHT, A_TOP);
+      tux_life->draw(565+(18*3)/xdiv+10, 20);
+#else
       gold_text->draw_align(str, 617, 20, A_RIGHT, A_TOP);
       tux_life->draw(565+(18*3), 20);
+#endif
     }
   else
     {
       for(int i= 0; i < player_status.lives; ++i)
-        tux_life->draw(565+(18*i),20);
+        tux_life->draw(565+(18*i)/xdiv,20);
     }
 
   if(show_fps)
@@ -746,6 +803,7 @@
       white_text->draw("FPS", screen->h, 40, 1);
       gold_text->draw(str, screen->h + 60, 40, 1);
     }
+//    updateSound();
 }
 
 void
@@ -824,4 +882,3 @@
   return tmp;
 }
 
-
diff -ur supertux-0.1.3/src/gameobjs.cpp supertux-0.1.3-gp2x/src/gameobjs.cpp
--- supertux-0.1.3/src/gameobjs.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/gameobjs.cpp	2006-04-11 21:52:52.000000000 +0300
@@ -98,6 +98,9 @@
   src.h = 16;
 
   dest.x = (int)(base.x - scroll_x);
+#ifdef RES320X240
+  dest.x=dest.x/2;
+#endif
   dest.y = (int)base.y;
   dest.w = 16;
   dest.h = 16;
@@ -143,8 +146,13 @@
 {
   SDL_Rect dest;
   
+#ifndef RES320X240
   if (base.x >= scroll_x - 32 &&
       base.x <= scroll_x + screen->w)
+#else
+  if (base.x >= scroll_x - 32 &&
+      base.x <= scroll_x + 640)
+#endif
     {
       dest.x = (int)(base.x - scroll_x);
       dest.y = (int)base.y;
@@ -165,8 +173,14 @@
       else
         {
           int s = ((int)scroll_x / 2)%640;
+
+#ifdef RES320X240
+          plevel->img_bkgd->draw_part(dest.x/2 + s/2, dest.y/2, 
+                                      dest.x/2, dest.y,dest.w/2,dest.h/2);
+#else
           plevel->img_bkgd->draw_part(dest.x + s, dest.y, 
                                       dest.x, dest.y,dest.w,dest.h);
+#endif
         }
 
       Tile::draw(base.x - scroll_x,
diff -ur supertux-0.1.3/src/globals.cpp supertux-0.1.3-gp2x/src/globals.cpp
--- supertux-0.1.3/src/globals.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/globals.cpp	2006-04-11 22:39:03.000000000 +0300
@@ -25,6 +25,7 @@
 
 JoystickKeymap::JoystickKeymap()
 {
+#ifndef GP2X
   a_button     = 0;
   b_button     = 1;
   start_button = 2;
@@ -33,6 +34,17 @@
   y_axis = 1;
     
   dead_zone = 4096;
+#else
+  a_button     = GP2X_BUTTON_A;
+  b_button     = GP2X_BUTTON_X;
+  start_button = GP2X_BUTTON_START;
+  up_button    = GP2X_BUTTON_UP;
+  down_button  = GP2X_BUTTON_DOWN;
+  left_button  = GP2X_BUTTON_LEFT;
+  right_button = GP2X_BUTTON_RIGHT;
+  volup_button  = GP2X_BUTTON_VOLUP;
+  voldown_button = GP2X_BUTTON_VOLDOWN;
+#endif
 }
 
 JoystickKeymap joystick_keymap;
diff -ur supertux-0.1.3/src/globals.h supertux-0.1.3-gp2x/src/globals.h
--- supertux-0.1.3/src/globals.h	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/globals.h	2006-04-11 23:45:27.000000000 +0300
@@ -28,10 +28,33 @@
 #include "menu.h"
 #include "mousecursor.h"
 
+#ifdef GP2X
+#define GP2X_BUTTON_UP              (0)
+#define GP2X_BUTTON_DOWN            (4)
+#define GP2X_BUTTON_LEFT            (2)
+#define GP2X_BUTTON_RIGHT           (6)
+#define GP2X_BUTTON_UPLEFT          (1)
+#define GP2X_BUTTON_UPRIGHT         (7)
+#define GP2X_BUTTON_DOWNLEFT        (3)
+#define GP2X_BUTTON_DOWNRIGHT       (5)
+#define GP2X_BUTTON_CLICK           (18)
+#define GP2X_BUTTON_A               (12)
+#define GP2X_BUTTON_B               (13)
+#define GP2X_BUTTON_X               (15)
+#define GP2X_BUTTON_Y               (14)
+#define GP2X_BUTTON_L               (10)
+#define GP2X_BUTTON_R               (11)
+#define GP2X_BUTTON_START           (8)
+#define GP2X_BUTTON_SELECT          (9)
+#define GP2X_BUTTON_VOLUP           (16)
+#define GP2X_BUTTON_VOLDOWN         (17)
+#endif
+
 extern std::string datadir;
 
 struct JoystickKeymap
 {
+#ifndef GP2X
   int a_button;
   int b_button;
   int start_button;
@@ -42,6 +65,19 @@
   int dead_zone;
 
   JoystickKeymap();
+#else
+  int a_button;
+  int b_button;
+  int start_button;
+  int up_button;
+  int down_button;
+  int left_button;
+  int right_button;
+  int volup_button;
+  int voldown_button;
+
+  JoystickKeymap();
+#endif
 };
 
 extern JoystickKeymap joystick_keymap;
diff -ur supertux-0.1.3/src/lispreader.h supertux-0.1.3-gp2x/src/lispreader.h
Only in supertux-0.1.3/src: Makefile
diff -ur supertux-0.1.3/src/Makefile.am supertux-0.1.3-gp2x/src/Makefile.am
--- supertux-0.1.3/src/Makefile.am	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/Makefile.am	2006-04-19 21:55:54.000000000 +0300
@@ -77,3 +77,5 @@
 musicref.h
 
 # EOF #
+
+#supertux_LDADD = libmikmod
Only in supertux-0.1.3/src: Makefile.in
diff -ur supertux-0.1.3/src/menu.cpp supertux-0.1.3-gp2x/src/menu.cpp
--- supertux-0.1.3/src/menu.cpp	2005-06-29 15:44:13.000000000 +0300
+++ supertux-0.1.3-gp2x/src/menu.cpp	2006-05-04 23:59:29.000000000 +0300
@@ -53,6 +53,8 @@
 Menu* options_menu   = 0;
 Menu* options_keys_menu     = 0;
 Menu* options_joystick_menu = 0;
+Menu* options_joystick_axis_menu = 0;
+Menu* options_joystick_button_menu = 0;
 Menu* highscore_menu = 0;
 Menu* load_game_menu = 0;
 Menu* save_game_menu = 0;
@@ -240,8 +242,10 @@
 }
 
 /* Set ControlField a key */
+//TODO: get joystick in here somehow
 void Menu::get_controlfield_key_into_input(MenuItem *item)
 {
+#ifndef GP2X
   switch(*item->int_p)
   {
   case SDLK_UP:
@@ -288,6 +292,11 @@
     }
     break;
   }
+#else
+      char tmp[64];
+      snprintf(tmp, 64, "%d", *item->int_p);
+      item->change_input(tmp);    
+#endif
 }
 
 /* Free a menu and all its items */
@@ -497,8 +506,13 @@
                 int menu_height)
 {
   MenuItem& pitem = item[index];
-
+  
+#ifndef RES320X240
   int font_width  = 16;
+#else
+  int font_width  = 16/2;
+#endif
+  
   int effect_offset = 0;
   {
     int effect_time = 0;
@@ -510,7 +524,7 @@
   }
 
   int x_pos       = pos_x;
-  int y_pos       = pos_y + 24*index - menu_height/2 + 12 + effect_offset;
+  int y_pos       = pos_y + (int)(24)*index - menu_height/2 + 12 + effect_offset;
   int shadow_size = 2;
   int text_width  = strlen(pitem.text) * font_width;
   int input_width = (strlen(pitem.input)+ 1) * font_width;
@@ -518,7 +532,7 @@
   Text* text_font = white_text;
 
   if (arrange_left)
-    x_pos += 24 - menu_width/2 + (text_width + input_width + list_width)/2;
+    x_pos += (int)(24) - menu_width/2 + (text_width + input_width + list_width)/2;
 
   if(index == active_item)
   {
@@ -538,7 +552,11 @@
 
   case MN_HL:
     {
+#ifndef RES320X240
       int x = pos_x - menu_width/2;
+#else
+      int x = pos_x - menu_width/4;
+#endif
       int y = y_pos - 12 - effect_offset;
       /* Draw a horizontal line with a little 3d effect */
       fillrect(x, y + 6,
@@ -551,9 +569,15 @@
     }
   case MN_LABEL:
     {
+#ifndef RES320X240
       white_big_text->draw_align(pitem.text,
                                  x_pos, y_pos,
                                  A_HMIDDLE, A_VMIDDLE, 2);
+#else
+      white_text->draw_align(pitem.text,
+                                 x_pos, y_pos,
+                                 A_HMIDDLE, A_VMIDDLE, 2);
+#endif
       break;
     }
   case MN_TEXTFIELD:
@@ -570,8 +594,9 @@
                input_width + font_width, 18,
                0,0,0,128);
 
-      if(pitem.kind == MN_CONTROLFIELD)
+      if(pitem.kind == MN_CONTROLFIELD) {
         get_controlfield_key_into_input(&pitem);
+      }
 
       if(pitem.kind == MN_TEXTFIELD || pitem.kind == MN_NUMFIELD)
       {
@@ -663,7 +688,7 @@
         menu_width += 2;
     }
   }
-
+  
   return (menu_width * 16 + 24);
 }
 
@@ -680,10 +705,17 @@
   int menu_width  = get_width();
 
   /* Draw a transparent background */
+#ifndef RES320X240
   fillrect(pos_x - menu_width/2,
            pos_y - 24*item.size()/2 - 10,
            menu_width,menu_height + 20,
            150,180,200,125);
+#else
+  fillrect(pos_x - menu_width/4,
+           pos_y - 24*item.size()/2 - 10,
+           menu_width,menu_height + 20,
+           150,180,200,125);
+#endif
 
   for(unsigned int i = 0; i < item.size(); ++i)
   {
@@ -723,6 +755,8 @@
   SDLKey key;
   switch(event.type)
   {
+
+#ifndef GP2X
   case SDL_KEYDOWN:
     key = event.key.keysym.sym;
     SDLMod keymod;
@@ -754,7 +788,6 @@
       return;
     }
 
-
     switch(key)
     {
     case SDLK_UP:		/* Menu Up */
@@ -800,12 +833,14 @@
       break;
     }
     break;
+    
   case  SDL_JOYHATMOTION:
       if(event.jhat.value == SDL_HAT_UP)
            menuaction = MENU_ACTION_UP;
       if(event.jhat.value == SDL_HAT_DOWN)
            menuaction = MENU_ACTION_DOWN;
        break;
+       
   case  SDL_JOYAXISMOTION:
     if(event.jaxis.axis == joystick_keymap.y_axis)
     {
@@ -815,9 +850,88 @@
         menuaction = MENU_ACTION_UP;
     }
     break;
+#endif
+
   case  SDL_JOYBUTTONDOWN:
+#ifndef GP2X
     menuaction = MENU_ACTION_HIT;
     break;
+#else
+
+    if(item[active_item].kind == MN_CONTROLFIELD)
+    {
+      if( event.jbutton.button == joystick_keymap.start_button )
+      {
+        Menu::pop_current();
+        return;
+      }
+
+       static int save[8]={-1,-1,-1,-1,-1,-1,-1,-1};
+       int itemid=get_active_item_id();
+       int inputkey;
+       switch ( itemid ) {
+    	    case 11 : inputkey=joystick_keymap.up_button;
+		      break;
+    	    case 12 : inputkey=joystick_keymap.down_button;
+		      break;
+    	    case 13 : inputkey=joystick_keymap.left_button;
+		      break;
+    	    case 14 : inputkey=joystick_keymap.right_button;
+		      break;
+    	    case 15 : inputkey=joystick_keymap.a_button;
+		      break;
+    	    case 16 : inputkey=joystick_keymap.b_button;
+		      break;
+	    default : break;
+       }
+
+        *item[active_item].int_p = event.jbutton.button;
+	
+	bool okay=true;
+	
+	save[itemid-11]=event.jbutton.button;
+	
+	int i;
+	for ( i=0;i<itemid-11;i++ ) {
+	    if ( save[i] == event.jbutton.button ) okay=false;
+	}
+	if ( okay == true ) menuaction = MENU_ACTION_DOWN;
+	else menuaction = MENU_ACTION_NONE;
+
+      return;
+    } 
+    
+      if (event.jbutton.button == joystick_keymap.a_button)
+        menuaction = MENU_ACTION_HIT;
+      else if (event.jbutton.button == joystick_keymap.b_button)
+        menuaction = MENU_ACTION_HIT;
+      else if (event.jbutton.button == joystick_keymap.start_button)
+        menuaction = MENU_ACTION_HIT;
+      else if (event.jbutton.button == joystick_keymap.up_button)
+        menuaction = MENU_ACTION_UP;
+      else if (event.jbutton.button == joystick_keymap.down_button)
+        menuaction = MENU_ACTION_DOWN;
+      else if (event.jbutton.button == joystick_keymap.right_button)
+        menuaction = MENU_ACTION_RIGHT;
+      else if (event.jbutton.button == joystick_keymap.left_button)
+        menuaction = MENU_ACTION_LEFT;
+      else if (event.jbutton.button == joystick_keymap.volup_button)
+#ifdef GP2X
+	increaseSoundVolume();
+#else
+        sound_volume(2);
+#endif
+      else if (event.jbutton.button == joystick_keymap.voldown_button)
+#ifdef GP2X
+	decreaseSoundVolume();
+#else
+        sound_volume(1);
+#endif
+    break;
+    
+#endif
+
+#ifndef GP2X
   case SDL_MOUSEBUTTONDOWN:
     x = event.motion.x;
     y = event.motion.y;
@@ -847,6 +961,7 @@
     break;
   default:
     break;
+#endif
   }
 }
 
diff -ur supertux-0.1.3/src/menu.h supertux-0.1.3-gp2x/src/menu.h
--- supertux-0.1.3/src/menu.h	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/menu.h	2006-05-04 23:48:30.000000000 +0300
@@ -236,6 +236,8 @@
 extern Menu* options_menu;
 extern Menu* options_keys_menu;
 extern Menu* options_joystick_menu;
+extern Menu* options_joystick_axis_menu;
+extern Menu* options_joystick_button_menu;
 extern Menu* highscore_menu;
 extern Menu* load_game_menu;
 extern Menu* save_game_menu;
diff -ur supertux-0.1.3/src/music_manager.cpp supertux-0.1.3-gp2x/src/music_manager.cpp
--- supertux-0.1.3/src/music_manager.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/music_manager.cpp	2006-04-22 13:16:32.000000000 +0300
@@ -59,7 +59,14 @@
     return true;                                      
   }
   
+#ifndef GP2X
   Mix_Music* song = Mix_LoadMUS(file.c_str());
+#else
+  char mfile[100];
+  snprintf(mfile,sizeof(mfile),"%s",file.c_str());
+  MODULE *song=Player_Load(mfile, 64, 0);
+#endif
+        
   if(song == 0)
     return false;
 
@@ -84,6 +91,8 @@
 void
 MusicManager::play_music(const MusicRef& musicref, int loops)
 {
+// printf("loop: %d, musicref: %d\n",loops,musicref.music);
+  
   if(!audio_device)
     return;
 
@@ -97,7 +106,16 @@
   current_music->refcount++;
   
   if(music_enabled)
+#ifndef GP2X
     Mix_PlayMusic(current_music->music, loops);
+#else
+  {
+    if ( loops == -1 ) current_music->music->wrap=1;
+    Player_Stop();
+    Player_Start(current_music->music);
+    Player_SetPosition(0);
+  }
+#endif
 }
 
 void
@@ -106,13 +124,17 @@
   if(!audio_device)
     return;
   
+#ifndef GP2X
   Mix_HaltMusic();
+#else
+  Player_Stop();
+#endif
   
   if(current_music) {
     current_music->refcount--;
     if(current_music->refcount == 0)
       free_music(current_music);
-    current_music = 0;
+      current_music = 0;
   }
 }
 
@@ -127,9 +149,17 @@
   
   music_enabled = enable;
   if(music_enabled == false) {
+#ifndef GP2X
     Mix_HaltMusic();
+#else
+    Player_Stop();
+#endif
   } else {
+#ifndef GP2X
     Mix_PlayMusic(current_music->music, -1);
+#else
+    Player_Start(current_music->music);
+#endif
   }
 }
 
diff -ur supertux-0.1.3/src/music_manager.h supertux-0.1.3-gp2x/src/music_manager.h
--- supertux-0.1.3/src/music_manager.h	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/music_manager.h	2006-04-22 04:51:32.000000000 +0300
@@ -20,6 +20,10 @@
 #ifndef HEADER_MUSIC_MANAGER_H
 #define HEADER_MUSIC_MANAGER_H
 
+#ifdef GP2X
+#include "mikmod.h"
+#endif
+
 #include <SDL_mixer.h>
 #include <string>
 #include <map>
@@ -51,7 +55,12 @@
     ~MusicResource();
 
     MusicManager* manager;
+#ifndef GP2X
     Mix_Music* music;
+#else
+    MODULE *music;
+#endif
+    
     int refcount;
   };
 
diff -ur supertux-0.1.3/src/particlesystem.cpp supertux-0.1.3-gp2x/src/particlesystem.cpp
--- supertux-0.1.3/src/particlesystem.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/particlesystem.cpp	2006-04-12 22:20:41.000000000 +0300
@@ -28,8 +28,13 @@
 
 ParticleSystem::ParticleSystem()
 {
+#ifndef RES320X240
     virtual_width = screen->w;
     virtual_height = screen->h;
+#else
+    virtual_width = 640;
+    virtual_height = 480;
+#endif
 }
 
 ParticleSystem::~ParticleSystem()
@@ -57,13 +62,24 @@
         float ymax = fmodf(y + particle->texture->h, virtual_height);
 
         // particle on screen
+#ifndef RES320X240
         if(x >= screen->w && xmax >= screen->w)
             continue;
         if(y >= screen->h && ymax >= screen->h)
             continue;
-        
+
         if(x > screen->w) x -= virtual_width;
         if(y > screen->h) y -= virtual_height;
+#else
+        if(x >= 640 && xmax >= 640)
+            continue;
+        if(y >= 480 && ymax >= 480)
+            continue;
+
+        if(x > 640) x -= virtual_width;
+        if(y > 480) y -= virtual_height;
+#endif
+        
         particle->texture->draw(x, y);
     }
 }
@@ -74,14 +90,21 @@
     snowimages[1] = new Surface(datadir+"/images/shared/snow1.png", USE_ALPHA);
     snowimages[2] = new Surface(datadir+"/images/shared/snow2.png", USE_ALPHA);
 
+#ifndef RES320X240
     virtual_width = screen->w * 2;
-
+#else
+    virtual_width = 640 * 2;
+#endif
     // create some random snowflakes
     size_t snowflakecount = size_t(virtual_width/10.0);
     for(size_t i=0; i<snowflakecount; ++i) {
         SnowParticle* particle = new SnowParticle;
         particle->x = rand() % int(virtual_width);
+#ifndef RES320X240
         particle->y = rand() % screen->h;
+#else
+        particle->y = rand() % 480;
+#endif
         particle->layer = i % 2;
         int snowsize = rand() % 3;
         particle->texture = snowimages[snowsize];
@@ -106,7 +129,11 @@
     for(i = particles.begin(); i != particles.end(); ++i) {
         SnowParticle* particle = (SnowParticle*) *i;
         particle->y += particle->speed * elapsed_time;
+#ifndef RES320X240
         if(particle->y > screen->h) {
+#else
+        if(particle->y > 480) {
+#endif
             particle->y = fmodf(particle->y , virtual_height);
             particle->x = rand() % int(virtual_width);
         }
diff -ur supertux-0.1.3/src/player.cpp supertux-0.1.3-gp2x/src/player.cpp
--- supertux-0.1.3/src/player.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/player.cpp	2006-05-05 22:59:52.000000000 +0300
@@ -261,6 +261,7 @@
             }
         }
     }
+//	updateSound();
 
   /* ---- DONE HANDLING TUX! --- */
 
@@ -337,7 +338,11 @@
   if(on_ground() && ((vx < 0 && dirsign >0) || (vx>0 && dirsign<0))) {
       if(fabs(vx)>SKID_XM && !skidding_timer.check()) {
           skidding_timer.start(SKID_TIME);
+#ifndef GP2X
           play_sound(sounds[SND_SKID], SOUND_CENTER_SPEAKER);
+#else
+	  play_chunk(SND_SKID);
+#endif
           ax *= 2.5;
       } else {
           ax *= 2;
@@ -391,9 +396,17 @@
           jumping = true;
           can_jump = false;
           if (size == SMALL)
+#ifndef GP2X
             play_sound(sounds[SND_JUMP], SOUND_CENTER_SPEAKER);
+#else
+	    play_chunk(SND_JUMP);
+#endif
           else
+#ifndef GP2X
             play_sound(sounds[SND_BIGJUMP], SOUND_CENTER_SPEAKER);
+#else
+	    play_chunk(SND_BIGJUMP);
+#endif
         }
     }
   // Let go of jump key
@@ -533,7 +546,11 @@
       if(player_status.lives < MAX_LIVES)
         ++player_status.lives;
       /*We want to hear the sound even, if MAX_LIVES is reached*/
+#ifndef GP2X
       play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER);
+#else
+      play_chunk(SND_LIFEUP);
+#endif
     }
 }
 
@@ -665,7 +682,11 @@
               else
                 {
                    pbad_c->dying = DYING_FALLING;
+#ifndef GP2X
                    play_sound(sounds[SND_FALL], SOUND_CENTER_SPEAKER);
+#else
+		   play_chunk(SND_FALL);
+#endif
                    World::current()->add_score(pbad_c->base.x - scroll_x,
                                                pbad_c->base.y,
                                                25 * player_status.score_multiplier);
@@ -696,7 +717,12 @@
 void
 Player::kill(HurtMode mode)
 {
+#ifndef GP2X
   play_sound(sounds[SND_HURT], SOUND_CENTER_SPEAKER);
+#else
+  play_chunk(SND_HURT);
+  updateSound();
+#endif
 
   physic.set_velocity_x(0);
 
@@ -734,7 +760,11 @@
 
 bool Player::is_dead()
 {
+#ifndef RES320X240
   if(base.y > screen->h || base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL)  // last condition can happen in auto-scrolling
+#else
+  if(base.y > 640 || base.x < scroll_x - AUTOSCROLL_DEAD_INTERVAL)  // last condition can happen in auto-scrolling
+#endif
     return true;
   else
     return false;
@@ -760,9 +790,20 @@
     }
 
   /* Keep in-bounds, vertically: */
+#ifndef RES320X240
   if (base.y > screen->h)
+#else
+  if (base.y > 640)
+#endif
     {
       kill(KILL);
+#ifdef GP2X    
+      float wait=SDL_GetTicks()+800;
+      while ( wait > SDL_GetTicks()) {
+         updateSound();
+      }
+#endif
+
     }
 
   if(base.x < scroll_x && (!back_scrolling || hor_autoscroll))  // can happen if back scrolling is disabled
@@ -777,7 +818,6 @@
     if(base.x + base.width > scroll_x + screen->w)
       base.x = scroll_x + screen->w - base.width;
     }
-    
 }
 
 // EOF //
diff -ur supertux-0.1.3/src/resources.cpp supertux-0.1.3-gp2x/src/resources.cpp
--- supertux-0.1.3/src/resources.cpp	2005-07-02 15:20:14.000000000 +0300
+++ supertux-0.1.3-gp2x/src/resources.cpp	2006-04-22 13:14:01.000000000 +0300
@@ -18,6 +18,7 @@
 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 
 #include "globals.h"
+#include "sound.h"
 #include "scene.h"
 #include "player.h"
 #include "badguy.h"
@@ -187,11 +188,13 @@
                     // This is also true with if (use_music)
                     Send a mail to me: neoneurone@users.sf.net, if you have another opinion. :)
   */
+#ifndef GP2X
   for (i = 0; i < NUM_SOUNDS; i++)
     sounds[i] = load_sound(datadir + soundfilenames[i]);
+#endif
 
   /* Herring song */
-  herring_song = music_manager->load_music(datadir + "/music/SALCON.MOD");
+  herring_song = music_manager->load_music(datadir + "/music/SALCON.MOD");
   level_end_song = music_manager->load_music(datadir + "/music/leveldone.mod");
 }
 
@@ -223,8 +226,10 @@
 
   delete tux_life;
 
+#ifndef GP2X
   for (i = 0; i < NUM_SOUNDS; i++)
     free_chunk(sounds[i]);
+#endif
 
   delete sprite_manager;
   sprite_manager = 0;
diff -ur supertux-0.1.3/src/screen.cpp supertux-0.1.3-gp2x/src/screen.cpp
--- supertux-0.1.3/src/screen.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/screen.cpp	2006-04-14 18:18:47.000000000 +0300
@@ -81,7 +81,6 @@
   else
   {
 #endif
-
     for(float y = 0; y < 480; y += 2)
       fillrect(0, (int)y, 640, 2,
                      (int)(((float)(top_clr.red-bot_clr.red)/(0-480)) * y + top_clr.red),
@@ -199,11 +198,23 @@
       SDL_UnlockSurface(screen);
     }
   /* Update just the part of the display that we've changed */
+#ifndef RES320X240
   SDL_UpdateRect(screen, x, y, 1, 1);
+#else
+  SDL_UpdateRect(screen, x/2, y/2, 1, 1);
+#endif
 }
 
 void drawline(int x1, int y1, int x2, int y2, int r, int g, int b, int a)
 {
+
+#ifdef RES320X240
+ x1=x1/2;
+ x2=x2/2;
+ y1=y1/2;
+ y2=y2/2;
+#endif
+
 #ifndef NOOPENGL
   if(use_gl)
     {
@@ -280,6 +291,13 @@
 	y += h;
 	h = -h;
 	}
+	
+#ifdef RES320X240
+    x=x;
+    y=y/2;
+    w=w/2;
+    h=h/2;
+#endif
 
 #ifndef NOOPENGL
   if(use_gl)
@@ -367,6 +385,9 @@
 void update_rect(SDL_Surface *scr, Sint32 x, Sint32 y, Sint32 w, Sint32 h)
 {
   if(!use_gl)
+#ifndef RES320X240
+    SDL_UpdateRect(scr, x, y, w, h);
+#else
     SDL_UpdateRect(scr, x, y, w, h);
+#endif
 }
-
diff -ur supertux-0.1.3/src/setup.cpp supertux-0.1.3-gp2x/src/setup.cpp
--- supertux-0.1.3/src/setup.cpp	2005-07-08 15:19:17.000000000 +0300
+++ supertux-0.1.3-gp2x/src/setup.cpp	2006-05-03 23:32:49.000000000 +0300
@@ -62,10 +62,19 @@
 #define DATA_PREFIX "./data/"
 #endif
 
-/* Screen proprities: */
+/* Screen properties: */
 /* Don't use this to test for the actual screen sizes. Use screen->w/h instead! */
+#ifndef RES320X240
 #define SCREEN_W 640
 #define SCREEN_H 480
+#else
+#define SCREEN_W 320
+#define SCREEN_H 240
+#endif
+
+#ifdef GP2X
+#define DATA_PREFIX "data/"
+#endif
 
 /* Local function prototypes: */
 
@@ -308,10 +317,14 @@
   char str[1024];
   /* Get home directory (from $HOME variable)... if we can't determine it,
      use the current directory ("."): */
+#ifndef GP2X
   if (getenv("HOME") != NULL)
     home = getenv("HOME");
   else
     home = ".";
+#else
+    home = ".";
+#endif
 
   st_dir = (char *) malloc(sizeof(char) * (strlen(home) +
                                            strlen("/.supertux") + 1));
@@ -340,9 +353,10 @@
   // User has not that a datadir, so we try some magic
   if (datadir.empty())
     {
-#ifndef WIN32
       // Detect datadir
       char exe_file[PATH_MAX];
+
+#ifndef WIN32
       if (readlink("/proc/self/exe", exe_file, PATH_MAX) < 0)
         {
           puts("Couldn't read /proc/self/exe, using default path: " DATA_PREFIX);
@@ -358,7 +372,12 @@
               datadir = exedir + "../share/supertux"; // SuperTux run from PATH
               if (access(datadir.c_str(), F_OK) != 0) 
                 { // If all fails, fall back to compiled path
-                  datadir = DATA_PREFIX; 
+        	  datadir = exedir + "./data"; // SuperTux run with data in same path as executable
+        	    if (access(datadir.c_str(), F_OK) != 0)
+        	    {
+			 // If all fails, fall back to compiled path
+                	datadir = DATA_PREFIX; 
+		    }
                 }
             }
         }
@@ -375,7 +394,8 @@
   main_menu      = new Menu();
   options_menu   = new Menu();
   options_keys_menu     = new Menu();
-  options_joystick_menu = new Menu();
+  options_joystick_axis_menu = new Menu();
+  options_joystick_button_menu = new Menu();
   load_game_menu = new Menu();
   save_game_menu = new Menu();
   game_menu      = new Menu();
@@ -384,22 +404,27 @@
   contrib_subset_menu   = new Menu();
   worldmap_menu  = new Menu();
 
-  main_menu->set_pos(screen->w/2, 335);
+  main_menu->set_pos(screen->w/2, (int)(335)+20);
   main_menu->additem(MN_GOTO, "Start Game",0,load_game_menu, MNID_STARTGAME);
   main_menu->additem(MN_GOTO, "Bonus Levels",0,contrib_menu, MNID_CONTRIB);
   main_menu->additem(MN_GOTO, "Options",0,options_menu, MNID_OPTIONMENU);
+  
+#ifndef GP2X
   main_menu->additem(MN_ACTION,"Level Editor",0,0, MNID_LEVELEDITOR);
+#endif
   main_menu->additem(MN_ACTION,"Credits",0,0, MNID_CREDITS);
   main_menu->additem(MN_ACTION,"Quit",0,0, MNID_QUITMAINMENU);
 
   options_menu->additem(MN_LABEL,"Options",0,0);
   options_menu->additem(MN_HL,"",0,0);
+#ifndef GP2X
 #ifndef NOOPENGL
   options_menu->additem(MN_TOGGLE,"OpenGL",use_gl,0, MNID_OPENGL);
 #else
   options_menu->additem(MN_DEACTIVE,"OpenGL (not supported)",use_gl, 0, MNID_OPENGL);
 #endif
   options_menu->additem(MN_TOGGLE,"Fullscreen",use_fullscreen,0, MNID_FULLSCREEN);
+#endif
   if(audio_device)
     {
       options_menu->additem(MN_TOGGLE,"Sound     ", use_sound,0, MNID_SOUND);
@@ -411,10 +436,15 @@
       options_menu->additem(MN_DEACTIVE,"Music     ", false,0, MNID_MUSIC);
     }
   options_menu->additem(MN_TOGGLE,"Show FPS  ",show_fps,0, MNID_SHOWFPS);
+#ifndef GP2X
   options_menu->additem(MN_GOTO,"Keyboard Setup",0,options_keys_menu);
+#endif
 
   //if(use_joystick)
-  //  options_menu->additem(MN_GOTO,"Joystick Setup",0,options_joystick_menu);
+#ifdef GP2X
+  options_menu->additem(MN_GOTO,"Joystick Move Setup",0,options_joystick_axis_menu);
+  options_menu->additem(MN_GOTO,"Joystick Action Setup",0,options_joystick_button_menu);
+#endif
 
   options_menu->additem(MN_HL,"",0,0);
   options_menu->additem(MN_BACK,"Back",0,0);
@@ -429,6 +459,7 @@
   options_keys_menu->additem(MN_HL,"",0,0);
   options_keys_menu->additem(MN_BACK,"Back",0,0);
 
+#ifndef GP2X
   if(use_joystick)
     {
     options_joystick_menu->additem(MN_LABEL,"Joystick Setup",0,0);
@@ -442,6 +473,20 @@
     options_joystick_menu->additem(MN_HL,"",0,0);
     options_joystick_menu->additem(MN_BACK,"Back",0,0);
     }
+#else
+    options_joystick_axis_menu->additem(MN_LABEL,"Joystick Move Setup",0,0);
+    options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Up", 0,0, 11,&joystick_keymap.up_button);
+    options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Down", 0,0, 12,&joystick_keymap.down_button);
+    options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Left", 0,0, 13,&joystick_keymap.left_button);
+    options_joystick_axis_menu->additem(MN_CONTROLFIELD,"Right", 0,0, 14,&joystick_keymap.right_button);
+    options_joystick_axis_menu->additem(MN_BACK,"Back",0,0);
+
+    options_joystick_button_menu->additem(MN_LABEL,"Joystick Action Setup",0,0);
+    options_joystick_button_menu->additem(MN_CONTROLFIELD,"Jump", 0,0, 15,&joystick_keymap.a_button);
+    options_joystick_button_menu->additem(MN_CONTROLFIELD,"Shoot/Run", 0,0, 16,&joystick_keymap.b_button);
+    options_joystick_button_menu->additem(MN_BACK,"Back",0,0);
+#endif
+
   
   load_game_menu->additem(MN_LABEL,"Start Game",0,0);
   load_game_menu->additem(MN_HL,"",0,0);
@@ -576,9 +621,10 @@
 
   srand(SDL_GetTicks());
 
+#ifndef GP2X
   /* Set icon image: */
-
   seticon();
+#endif
 
   /* Unicode needed for input handling: */
 
@@ -586,13 +632,32 @@
 
   /* Load global images: */
 
+#ifndef RES320X240
+  white_text  = new Text(datadir + "/images/status/letters-white.png", TEXT_TEXT, 16,18);
+#else
+  white_text  = new Text(datadir + "/images/status/letters-white-small.png", TEXT_TEXT, 8,9);
+  fadeout();
+#endif
+
+
+#ifndef RES320X240
   black_text  = new Text(datadir + "/images/status/letters-black.png", TEXT_TEXT, 16,18);
+#else
+  black_text  = new Text(datadir + "/images/status/letters-black.png", TEXT_TEXT, 8,9);
+#endif
+#ifndef RES320X240
   gold_text   = new Text(datadir + "/images/status/letters-gold.png", TEXT_TEXT, 16,18);
+#else
+  gold_text   = new Text(datadir + "/images/status/letters-gold.png", TEXT_TEXT, 8,9);
+#endif
   silver_text = new Text(datadir + "/images/status/letters-silver.png", TEXT_TEXT, 16,18);
+#ifndef RES320X240
   blue_text   = new Text(datadir + "/images/status/letters-blue.png", TEXT_TEXT, 16,18);
+#else
+  blue_text   = new Text(datadir + "/images/status/letters-blue.png", TEXT_TEXT, 8,9);
+#endif
   red_text    = new Text(datadir + "/images/status/letters-red.png", TEXT_TEXT, 16,18);
   green_text  = new Text(datadir + "/images/status/letters-green.png", TEXT_TEXT, 16,18);
-  white_text  = new Text(datadir + "/images/status/letters-white.png", TEXT_TEXT, 16,18);
   white_small_text = new Text(datadir + "/images/status/letters-white-small.png", TEXT_TEXT, 8,9);
   white_big_text   = new Text(datadir + "/images/status/letters-white-big.png", TEXT_TEXT, 20,22);
   yellow_nums = new Text(datadir + "/images/status/numbers.png", TEXT_NUM, 32,32);
@@ -665,14 +736,22 @@
   Surface::reload_all();
 
   /* Set window manager stuff: */
+#ifndef GP2X_VERSION
   SDL_WM_SetCaption("SuperTux " VERSION, "SuperTux");
+#endif
 }
 
 void st_video_setup_sdl(void)
 {
   if (use_fullscreen)
     {
+#ifndef GP2X
       screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 0, SDL_FULLSCREEN ) ; /* | SDL_HWSURFACE); */
+#else
+//      screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_HWSURFACE | SDL_DOUBLEBUF ) ; /* GP2X */
+      printf("screen width: %d, height: %d\n",SCREEN_W, SCREEN_H);
+      screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_SWSURFACE ) ; /* GP2X */
+#endif
       if (screen == NULL)
         {
           fprintf(stderr,
@@ -685,14 +764,22 @@
     }
   else
     {
+#ifndef GP2X
       screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 0, SDL_HWSURFACE | SDL_DOUBLEBUF );
-
+#else
+//      screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_HWSURFACE | SDL_DOUBLEBUF ) ; /* GP2X */
+      screen = SDL_SetVideoMode(SCREEN_W, SCREEN_H, 16, SDL_SWSURFACE ) ; /* GP2X */
+#endif
       if (screen == NULL)
         {
           fprintf(stderr,
                   "\nError: I could not set up video for 640x480 mode.\n"
                   "The Simple DirectMedia error that occured was:\n"
                   "%s\n\n", SDL_GetError());
+#ifdef GP2X_VERSION
+    chdir("/usr/gp2x");
+    execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);    
+#endif
           exit(1);
         }
     }
@@ -790,6 +877,7 @@
 
               use_joystick = false;
             }
+#ifndef GP2X
           else
             {
               if (SDL_JoystickNumAxes(js) < 2)
@@ -811,6 +899,7 @@
                     }
                 }
             }
+#endif
         }
     }
 }
@@ -844,12 +933,17 @@
         }
     }
 
-
+    audio_device = true;
+    
   /* Open sound silently regarless the value of "use_sound": */
 
   if (audio_device)
     {
+#ifndef GP2X    
       if (open_audio(44100, AUDIO_S16, 2, 2048) < 0)
+#else
+      if (open_audio(44100, AUDIO_S16, 1, 1024) < 0)
+#endif      
         {
           /* only print out message if sound or music
              was not disabled at command-line
@@ -878,6 +972,12 @@
   close_audio();
   SDL_Quit();
   saveconfig();
+
+#ifdef GP2X
+    chdir("/usr/gp2x");
+    execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);    
+#endif
+
 }
 
 /* --- ABORT! --- */
@@ -893,6 +993,7 @@
 
 void seticon(void)
 {
+#ifndef GP2X
 //  int masklen;
 //  Uint8 * mask;
   SDL_Surface * icon;
@@ -927,6 +1028,7 @@
 
 //  free(mask);
   SDL_FreeSurface(icon);
+#endif
 }
 
 
@@ -956,6 +1058,7 @@
         }
       else if (strcmp(argv[i], "--joymap") == 0)
         {
+#ifndef GP2X
           assert(i+1 < argc);
           if (sscanf(argv[++i],
                      "%d:%d:%d:%d:%d", 
@@ -976,6 +1079,7 @@
                         << "  B-Button:     " << joystick_keymap.b_button << "\n"
                         << "  Start-Button: " << joystick_keymap.start_button << std::endl;
             }
+#endif
         }
       else if (strcmp(argv[i], "--leveleditor") == 0)
         {
diff -ur supertux-0.1.3/src/sound.cpp supertux-0.1.3-gp2x/src/sound.cpp
--- supertux-0.1.3/src/sound.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/sound.cpp	2006-04-22 02:07:57.000000000 +0300
@@ -22,6 +22,9 @@
 #include "globals.h"
 #include "sound.h"
 #include "setup.h"
+#ifdef GP2X
+#include <string.h>
+#endif
 
 /*global variable*/
 bool use_sound = true;    /* handle sound on/off menu and command-line option */
@@ -54,12 +57,21 @@
 
 #include <SDL_mixer.h>
 
+#ifndef GP2X
 Mix_Chunk * sounds[NUM_SOUNDS];
+#else
 
-/* --- OPEN THE AUDIO DEVICE --- */
+#include <mikmod.h>
+static MODULE *music=NULL;
+static SAMPLE *chunk[NUM_SOUNDS];
+static int chunkFlag[NUM_SOUNDS];
+#endif
 
+/* --- OPEN THE AUDIO DEVICE --- */
 int open_audio (int frequency, Uint16 format, int channels, int chunksize)
 {
+//  close_audio();
+#ifndef GP2X
   if (Mix_OpenAudio( frequency, format, channels, chunksize ) < 0)
     return -1;
 
@@ -74,20 +86,93 @@
   /* prepare the spanning effects */
   Mix_SetPanning( SOUND_LEFT_SPEAKER, 230, 24 );
   Mix_SetPanning( SOUND_RIGHT_SPEAKER, 24, 230 );
+#else
+  if (drv_oss.Name)  // Valid OSS driver
+  {
+    if (drv_oss.CommandLine)  // Valid Commandline
+    {
+      drv_oss.CommandLine("buffer=14,count=2");
+    }
+    MikMod_RegisterDriver(&drv_oss);
+  }
+  if (drv_alsa.Name)  // Valid ALSA driver
+  {
+    if (drv_alsa.CommandLine)  // Valid Commandline
+    {
+      drv_alsa.CommandLine("buffer=14");
+    }
+    MikMod_RegisterDriver(&drv_alsa);
+  }
+  MikMod_RegisterDriver(&drv_nos);
+
+  // register standard tracker
+  MikMod_RegisterAllLoaders();
+
+  // Note, the md_mode flags are already set by default
+  md_mode |= DMODE_SOFT_SNDFX | DMODE_SOFT_MUSIC;
+
+   if (MikMod_Init(""))  // Command paramenters are ignored as all drivers are registered
+  {
+    printf("mikmod init war f�rn arsch\n");
+    return 1;
+  }
+
+  load_sounds();
+
+  // get ready to play
+  MikMod_EnableOutput();
+  md_volume =64;
+  md_sndfxvolume = 64;
+  //md_musicvolume = md_sndfxvolume = 64;
+
+  use_sound = true;
+  audio_device=true;
+
+#endif
   return 0;
-}
 
+}
 
 /* --- CLOSE THE AUDIO DEVICE --- */
 
 void close_audio( void )
 {
+#ifndef GP2X
   if (audio_device) {
     Mix_UnregisterAllEffects( SOUND_LEFT_SPEAKER );
     Mix_UnregisterAllEffects( SOUND_RIGHT_SPEAKER );
     Mix_CloseAudio();
   }
+#else
+  int i;
+  if (! audio_device) return;
+
+  MikMod_DisableOutput();
+  Player_Stop();
+  MikMod_Update();
+
+  if (music) {
+	  Player_Free(music);
+	  music = NULL;
+  }
+
+  for ( i=0 ; i<NUM_SOUNDS ; i++ ) {
+    if ( chunk[i] ) {
+      Sample_Free(chunk[i]);
+	}
+  }
+
+  MikMod_Update();
+  MikMod_Exit();
+#endif
+}
+
+#ifdef GP2X
+void updateSound ( void ) {
+  if (! audio_device) return;
+  MikMod_Update();
 }
+#endif
 
 
 /* --- LOAD A SOUND --- */
@@ -105,6 +190,30 @@
   return(snd);
 }
 
+#ifdef GP2X
+static void load_sounds() {
+  int i;
+  std::string name;
+  char file[100];
+
+  for ( i=0 ; i<NUM_SOUNDS ; i++ ) {
+    name = datadir + soundfilenames[i];
+    printf("loading: %s\n",name.c_str());
+    snprintf(file,sizeof(file),"%s",name.c_str());
+    if ( NULL == (chunk[i] = Sample_Load(file)) ) {
+      fprintf(stderr, "Couldn't load: %s\n", file);
+      use_sound = 0;
+      return;
+    }
+    chunkFlag[i] = 0;
+  }
+
+  // reserve voices for sound effects
+  MikMod_SetNumVoices(-1, 4);
+}
+#endif
+
+
 /* --- PLAY A SOUND ON LEFT OR RIGHT OR CENTER SPEAKER --- */
 
 void play_sound(Mix_Chunk * snd, enum Sound_Speaker whichSpeaker)
@@ -130,8 +239,45 @@
   }
 }
 
+
+#ifdef GP2X
+void play_chunk(int idx) 
+{
+    int cid;
+//  if (use_sound) return;
+     cid = Sample_Play (chunk[idx], 0, 0);
+  Voice_SetPanning(cid, PAN_CENTER);
+  Voice_SetVolume(cid, 1000);
+}
+#endif
+
+
 void free_chunk(Mix_Chunk *chunk)
 {
   Mix_FreeChunk( chunk );
 }
 
+void sound_volume ( int vol )
+{
+#ifndef GP2X
+    static int volume = 10;
+    
+    if ( vol == 1 ) volume-=5;
+    else if ( vol == 2 ) volume+=5;
+    Mix_Volume(-1,volume);
+#endif
+}
+
+#ifdef GP2X
+void increaseSoundVolume(void)
+{
+	if (md_volume > (256 - 13)) md_volume =  256;
+	else md_volume += 13;
+}
+
+void decreaseSoundVolume(void)
+{
+	if (md_volume < 13) md_volume = 0;
+	else md_volume -= 13;
+}
+#endif
diff -ur supertux-0.1.3/src/sound.h supertux-0.1.3-gp2x/src/sound.h
--- supertux-0.1.3/src/sound.h	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/sound.h	2006-04-21 00:17:09.000000000 +0300
@@ -75,14 +75,27 @@
 #include <SDL_mixer.h>
 
 /* variables for stocking the sound and music */
+#ifndef GP2X
 extern Mix_Chunk* sounds[NUM_SOUNDS];
+#endif
 
 /* functions handling the sound and music */
 int open_audio(int frequency, Uint16 format, int channels, int chunksize);
 void close_audio( void );
 
+#ifndef GP2X
 Mix_Chunk * load_sound(const std::string& file);
+#endif
 void free_chunk(Mix_Chunk*chunk);
 void play_sound(Mix_Chunk * snd, enum Sound_Speaker whichSpeaker);
+void sound_volume ( int vol );
 
 #endif /*SUPERTUX_SOUND_H*/
+
+#ifdef GP2X
+void play_chunk(int idx);
+static void load_sounds();
+void updateSound ( void );
+void increaseSoundVolume(void);
+void decreaseSoundVolume(void);
+#endif
diff -ur supertux-0.1.3/src/special.cpp supertux-0.1.3-gp2x/src/special.cpp
--- supertux-0.1.3/src/special.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/special.cpp	2006-04-20 21:39:41.000000000 +0300
@@ -105,12 +105,21 @@
 
   base.ym = base.ym + 0.5 * frame_ratio;
 
+#ifndef RES320X240  
   if (base.x < scroll_x ||
       base.x > scroll_x + screen->w ||
       base.y > screen->h ||
       issolid(base.x + 4, base.y + 2) ||
       issolid(base.x, base.y + 2) ||
       life_count <= 0)
+#else
+  if (base.x < scroll_x ||
+      base.x > scroll_x + 640 ||
+      base.y > 480 ||
+      issolid(base.x + 4, base.y + 2) ||
+      issolid(base.x, base.y + 2) ||
+      life_count <= 0)
+#endif
     {
       remove_me();
     }
@@ -120,8 +129,13 @@
 void 
 Bullet::draw()
 {
+#ifndef RES320X240
   if (base.x >= scroll_x - base.width &&
       base.x <= scroll_x + screen->w)
+#else
+  if (base.x >= scroll_x - base.width &&
+      base.x <= scroll_x + 640)
+#endif
     {
       img_bullet->draw(base.x - scroll_x, base.y);
     }
@@ -140,7 +154,7 @@
 {
   kind = kind_;
   dir = dir_;
-
+  
   base.width = 32;
   base.height = 0;
   base.x = x_;
@@ -197,7 +211,11 @@
       remove_me();
       return;
   }
+#ifndef RES320X240
   if(base.y > screen->h) {
+#else
+  if(base.y > 640) {
+#endif
     remove_me();
     return;
   }
@@ -252,7 +270,12 @@
     {
       /* Rising up... */
 
+
+#ifndef RES320X240
       dest.x = (int)(base.x - scroll_x);
+#else
+      dest.x = (int)(base.x - scroll_x)/2;
+#endif
       dest.y = (int)(base.y + 32 - base.height);
       dest.w = 32;
       dest.h = (int)base.height;
@@ -297,7 +320,11 @@
   if(kind != UPGRADE_GROWUP)
     return;
 
+#ifndef GP2X
   play_sound(sounds[SND_BUMP_UPGRADE], SOUND_CENTER_SPEAKER);
+#else
+    play_chunk(SND_BUMP_UPGRADE);
+#endif
   
   // do a little jump and change direction
   physic.set_velocity(-physic.get_velocity_x(), 3);
@@ -329,18 +356,30 @@
 
       if (kind == UPGRADE_GROWUP)
         {
+#ifndef GP2X
           play_sound(sounds[SND_EXCELLENT], SOUND_CENTER_SPEAKER);
+#else
+	    play_chunk(SND_EXCELLENT);
+#endif
           pplayer->grow();
         }
       else if (kind == UPGRADE_ICEFLOWER)
         {
+#ifndef GP2X
           play_sound(sounds[SND_COFFEE], SOUND_CENTER_SPEAKER);
+#else
+	  play_chunk(SND_COFFEE);
+#endif
           pplayer->grow();
           pplayer->got_coffee = true;
         }
       else if (kind == UPGRADE_HERRING)
         {
+#ifndef GP2X
           play_sound(sounds[SND_HERRING], SOUND_CENTER_SPEAKER);
+#else
+	  play_chunk(SND_HERRING);
+#endif
           pplayer->invincible_timer.start(TUX_INVINCIBLE_TIME);
           World::current()->play_music(HERRING_MUSIC);
         }
@@ -348,7 +387,11 @@
         {
           if(player_status.lives < MAX_LIVES) {
             player_status.lives++;
+#ifndef GP2X
             play_sound(sounds[SND_LIFEUP], SOUND_CENTER_SPEAKER);
+#else
+	    play_chunk(SND_LIFEUP);
+#endif
           }
         }
 
diff -ur supertux-0.1.3/src/text.cpp supertux-0.1.3-gp2x/src/text.cpp
--- supertux-0.1.3/src/text.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/text.cpp	2006-04-22 01:59:36.000000000 +0300
@@ -24,6 +24,7 @@
 #include "defines.h"
 #include "screen.h"
 #include "text.h"
+#include "sound.h"
 
 Text::Text(const std::string& file, int kind_, int w_, int h_)
 {
@@ -79,6 +80,7 @@
 void
 Text::draw(const  char* text, int x, int y, int shadowsize, int update)
 {
+
   if(text != NULL)
     {
       if(shadowsize != 0)
@@ -116,6 +118,9 @@
           else if ( text[i] == '\n')
             {
               y += h + 2;
+#ifdef RES320X240
+	    y+=6;
+#endif
               j = 0;
             }
         }
@@ -129,6 +134,9 @@
           else if ( text[i] == '\n')
             {
               y += h + 2;
+#ifdef RES320X240
+	    y+=6;
+#endif
               j = 0;
             }
         }
@@ -306,6 +314,24 @@
                 break;
               }
             break;
+
+#ifdef GP2X
+	  case SDL_JOYBUTTONDOWN:
+	    if ( event.jbutton.button == joystick_keymap.down_button ) {
+            	    speed += SPEED_INC;
+	    }
+	    if ( event.jbutton.button == joystick_keymap.up_button ) {
+            	    speed -= SPEED_INC;
+	    }	    
+	    if ( event.jbutton.button == joystick_keymap.b_button ) {
+            	    done = 1;
+	    }	    
+	    if ( event.jbutton.button == joystick_keymap.a_button ) {
+            	    scroll += SCROLL;
+	    }
+	  break;
+#endif
+
           case SDL_QUIT:
             done = 1;
             break;
@@ -330,21 +356,36 @@
             white_small_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll),
                 A_HMIDDLE, A_TOP, 1);
             y += white_small_text->h+ITEMS_SPACE;
+#ifdef RES320X240
+	    y += 6;
+#endif
             break;
           case '	':
             white_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll),
                 A_HMIDDLE, A_TOP, 1);
             y += white_text->h+ITEMS_SPACE;
+#ifdef RES320X240
+	    y += 6;
+#endif
             break;
           case '-':
-            white_big_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll),
-                A_HMIDDLE, A_TOP, 3);
+#ifdef RES320X240
+            white_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll), A_HMIDDLE, A_TOP, 3);
+#else
+            white_big_text->drawf(names.item[i]+1, 0, screen->h+y-int(scroll), A_HMIDDLE, A_TOP, 3);
+#endif
             y += white_big_text->h+ITEMS_SPACE;
+#ifdef RES320X240
+	    y += 6;
+#endif
             break;
           default:
             blue_text->drawf(names.item[i], 0, screen->h+y-int(scroll),
                 A_HMIDDLE, A_TOP, 1);
             y += blue_text->h+ITEMS_SPACE;
+#ifdef RES320X240
+	    y += 6;
+#endif
             break;
           }
         }
@@ -360,7 +401,13 @@
       if(scroll < 0)
         scroll = 0;
 
-      SDL_Delay(10);
+#ifndef GP2X
+    SDL_Delay(10);
+#else
+    SDL_Delay(2);
+    updateSound();
+#endif
+
     }
   string_list_free(&names);
 
diff -ur supertux-0.1.3/src/texture.cpp supertux-0.1.3-gp2x/src/texture.cpp
--- supertux-0.1.3/src/texture.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/texture.cpp	2006-04-10 14:29:03.000000000 +0300
@@ -211,7 +211,8 @@
 {
   if (impl)
   {
-    if (impl->draw(x, y, alpha, update) == -2)
+//    if (impl->draw(x, y, alpha, update) == -2)
+    if (impl->draw(x/2, y/2, alpha, update) == -2)
       reload();
   }
 }
@@ -231,7 +232,8 @@
 {
   if (impl)
   {
-    if (impl->draw_part(sx, sy, x, y, w, h, alpha, update) == -2)
+//    if (impl->draw_part(sx, sy, x, y, w, h, alpha, update) == -2)
+    if (impl->draw_part(sx, sy, x, y/2, w, h, alpha, update) == -2)
       reload();
   }
 }
@@ -241,7 +243,8 @@
 {
   if (impl)
   {
-    if (impl->draw_stretched(x, y, w, h, alpha, update) == -2)
+//    if (impl->draw_stretched(x, y, w, h, alpha, update) == -2)
+    if (impl->draw_stretched(x/2, y/2, w, h, alpha, update) == -2)
       reload();
   }
 }
diff -ur supertux-0.1.3/src/title.cpp supertux-0.1.3-gp2x/src/title.cpp
--- supertux-0.1.3/src/title.cpp	2005-07-08 15:19:17.000000000 +0300
+++ supertux-0.1.3-gp2x/src/title.cpp	2006-04-22 01:29:08.000000000 +0300
@@ -51,6 +51,7 @@
 #include "tile.h"
 #include "resources.h"
 #include "worldmap.h"
+#include "sound.h"
 
 static Surface* bkg_title;
 static Surface* logo;
@@ -80,6 +81,10 @@
 
 void generate_contrib_menu()
 {
+#ifdef RES320X240
+  fadeout();
+#endif
+
   string_list_type level_subsets = dsubdirs("/levels", "info");
 
   free_contrib_menu();
@@ -208,7 +213,7 @@
     }
 
   // Wrap around at the end of the level back to the beginnig
-  if(plevel->width * 32 - 320 < tux->base.x)
+  if((plevel->width * 32) - 320 < tux->base.x)
     {
       tux->level_begin();
       scroll_x = 0;
@@ -226,7 +231,6 @@
     {
       walking = false;
     }
-
   world->draw();
 }
 
@@ -301,13 +305,26 @@
       
       if (Menu::current() == main_menu)
         logo->draw( 160, 30);
-
+	
+#ifndef RES320X240
       white_small_text->draw(" SuperTux " VERSION "\n"
                              "Copyright (c) 2003 SuperTux Devel Team\n"
                              "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n"
                              "are welcome to redistribute it under certain conditions; see the file COPYING\n"
                              "for details.\n",
                              0, 420, 0);
+#else
+      white_small_text->draw(" SuperTux " VERSION "\n"
+                             "Copyright (c) 2003 SuperTux Devel Team\n"
+                             "This game comes with ABSOLUTELY NO \n"
+			     "WARRANTY. This is free software, and\n"
+                             "you are welcome to redistribute it\n"
+			     "under certain conditions; see the file\n"
+			     "COPYING for details.\n",
+                             0, 360, 0);
+#endif
+
+    //updateSound();
 
       /* Don't draw menu, if quit is true */
       Menu* menu = Menu::current();
@@ -337,10 +354,10 @@
                   break;
                 case MNID_CREDITS:
                   music_manager = new MusicManager();
-                  menu_song  = music_manager->load_music(datadir + "/music/credits.ogg");
+                  menu_song  = music_manager->load_music(datadir + "/music/credits.mod");
                   music_manager->halt_music();
                   music_manager->play_music(menu_song,0);
-                  display_text_file("CREDITS", bkg_title, SCROLL_SPEED_CREDITS);
+                  display_text_file("CREDITS", bkg_title, SCROLL_SPEED_CREDITS);
                   music_manager->halt_music();
                   menu_song = music_manager->load_music(datadir + "/music/theme.mod");
                   music_manager->play_music(menu_song);
diff -ur supertux-0.1.3/src/world.cpp supertux-0.1.3-gp2x/src/world.cpp
--- supertux-0.1.3/src/world.cpp	2005-06-22 00:16:07.000000000 +0300
+++ supertux-0.1.3-gp2x/src/world.cpp	2006-05-05 23:16:47.000000000 +0300
@@ -206,6 +206,7 @@
         }
     }
 
+
   /* Draw interactive tiles: */
   for (y = 0; y < 15; ++y)
     {
@@ -255,6 +256,8 @@
     {
       (*p)->draw(scroll_x, 0, 1);
     }
+    
+    //updateSound();
 }
 
 void
@@ -312,7 +315,12 @@
 
 // the space that it takes for the screen to start scrolling, regarding
 // screen bounds (in pixels)
+#ifndef RES320X240
 #define X_SPACE (400-16)
+#else
+#define X_SPACE (80-16)
+#endif
+
 // the time it takes to move the camera (in ms)
 #define CHANGE_DIR_SCROLL_SPEED 2000
 
@@ -388,8 +396,13 @@
   // this code prevent the screen to scroll before the start or after the level's end
   if(scroll_x < 0)
     scroll_x = 0;
+#ifndef RES320X240
   if(scroll_x > level->width * 32 - screen->w)
     scroll_x = level->width * 32 - screen->w;
+#else
+  if(scroll_x > level->width * 32 - 640)
+    scroll_x = level->width * 32 - 640;
+#endif
 }
 
 void
@@ -481,6 +494,10 @@
 void
 World::add_score(float x, float y, int s)
 {
+#ifdef RES320X240
+  x=x/2;
+#endif
+
   player_status.score += s;
 
   FloatingScore* new_floating_score = new FloatingScore();
@@ -547,8 +564,11 @@
   Bullet new_bullet;
   new_bullet.init(x,y,xm,dir);
   bullets.push_back(new_bullet);
-  
+#ifndef GP2X  
   play_sound(sounds[SND_SHOOT], SOUND_CENTER_SPEAKER);
+#else
+  play_chunk(SND_SHOOT);
+#endif
 }
 
 void
@@ -608,8 +628,11 @@
               counting_distros = false;
               plevel->change(x, y, TM_IA, tile->next_tile);
             }
-
+#ifndef GP2X
           play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
+#else
+	  play_chunk(SND_DISTRO);
+#endif
           player_status.score = player_status.score + SCORE_DISTRO;
           player_status.distros++;
         }
@@ -622,9 +645,13 @@
           add_broken_brick(tile, 
                                  ((int)(x + 1) / 32) * 32,
                                  (int)(y / 32) * 32);
-          
+
           /* Get some score: */
+#ifndef GP2X
           play_sound(sounds[SND_BRICK], SOUND_CENTER_SPEAKER);
+#else
+	  play_chunk(SND_BRICK);
+#endif
           player_status.score = player_status.score + SCORE_BRICK;
         }
     }
@@ -652,7 +679,11 @@
     {
     case 1: // Box with a distro!
       add_bouncy_distro(posx, posy);
+#ifndef GP2X
       play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
+#else
+      play_chunk(SND_DISTRO);
+#endif
       player_status.score = player_status.score + SCORE_DISTRO;
       player_status.distros++;
       break;
@@ -662,7 +693,11 @@
         add_upgrade(posx, posy, col_side, UPGRADE_GROWUP);
       else     /* Tux is big, add an iceflower: */
         add_upgrade(posx, posy, col_side, UPGRADE_ICEFLOWER);
+#ifndef GP2X
       play_sound(sounds[SND_UPGRADE], SOUND_CENTER_SPEAKER);
+#else
+      play_chunk(SND_UPGRADE);
+#endif
       break;
 
     case 3: // Add a golden herring
@@ -688,7 +723,11 @@
   if (tile && tile->distro)
     {
       level->change(x, y, TM_IA, tile->next_tile);
+#ifndef GP2X
       play_sound(sounds[SND_DISTRO], SOUND_CENTER_SPEAKER);
+#else
+      play_chunk(SND_DISTRO);
+#endif
 
       if (bounciness == BOUNCE)
         {
diff -ur supertux-0.1.3/src/worldmap.cpp supertux-0.1.3-gp2x/src/worldmap.cpp
--- supertux-0.1.3/src/worldmap.cpp	2005-07-08 15:19:17.000000000 +0300
+++ supertux-0.1.3-gp2x/src/worldmap.cpp	2006-05-05 22:54:04.000000000 +0300
@@ -376,11 +376,11 @@
 {
   tile_manager = new TileManager();
 
-  width  = 20;
-  height = 15;
+  width  = (int)(20);
+  height = (int)(15);
   
-  start_x = 4;
-  start_y = 5;
+  start_x = int(4);
+  start_y = int(5);
 
   passive_message_timer.init(true);
 
@@ -395,7 +395,7 @@
   enter_level = false;
 
   name = "<no file>";
-  music = "SALCON.MOD";
+  music = "salcon.mod";
 }
 
 WorldMap::~WorldMap()
@@ -589,7 +589,8 @@
                   break;
                 }
               break;
-          
+
+#ifndef GP2X      
             case SDL_JOYAXISMOTION:
               if (event.jaxis.axis == joystick_keymap.x_axis)
                 {
@@ -617,13 +618,29 @@
 	      if (event.jhat.value == SDL_HAT_RIGHT)
                     input_direction = D_EAST;
 	      break;
-
+#endif
             case SDL_JOYBUTTONDOWN:
+#ifndef GP2X
               if (event.jbutton.button == joystick_keymap.b_button)
                 enter_level = true;
               else if (event.jbutton.button == joystick_keymap.start_button)
                 on_escape_press();
               break;
+#else
+              if (event.jbutton.button == joystick_keymap.a_button)
+                enter_level = true;
+              else if (event.jbutton.button == joystick_keymap.start_button)
+                on_escape_press();
+              else if (event.jbutton.button == joystick_keymap.up_button)
+                input_direction = D_NORTH;
+              else if (event.jbutton.button == joystick_keymap.down_button)
+                input_direction = D_SOUTH;
+              else if (event.jbutton.button == joystick_keymap.right_button)
+                input_direction = D_EAST;
+              else if (event.jbutton.button == joystick_keymap.left_button)
+                input_direction = D_WEST;
+              break;
+#endif
 
             default:
               break;
@@ -769,13 +786,13 @@
                       { 
                         MusicRef theme =
                           music_manager->load_music(datadir + "/music/theme.mod");
-                        MusicRef credits = music_manager->load_music(datadir + "/music/credits.ogg");
+                        MusicRef credits = music_manager->load_music(datadir + "/music/credits.xm");
                         music_manager->play_music(theme);
                         // Display final credits and go back to the main menu
                         display_text_file(level->extro_filename,
                                           "/images/background/extro.jpg", SCROLL_SPEED_MESSAGE);
 			music_manager->play_music(credits,0);
-			display_text_file("CREDITS",
+			display_text_file("CREDITS",
                                           "/images/background/oiltux.jpg", SCROLL_SPEED_CREDITS);
                         music_manager->play_music(theme);
                         quit = true;
@@ -812,7 +829,12 @@
 			if (level->x == tux->get_tile_pos().x && 
               level->y == tux->get_tile_pos().y)
 				{
+#ifndef GP2X
 					play_sound(sounds[SND_TELEPORT], SOUND_CENTER_SPEAKER);
+#else
+					play_chunk(SND_TELEPORT);
+					updateSound();
+#endif
 					tux->back_direction = D_NONE;
 					tux->set_tile_pos(Point(level->teleport_dest_x, level->teleport_dest_y));
 					SDL_Delay(1000);
@@ -914,26 +936,39 @@
 void
 WorldMap::draw_status()
 {
+  int xdiv;
+  
+#ifdef RES320X240
+  xdiv=2;
+#else
+  xdiv=1;
+#endif
+
   char str[80];
   sprintf(str, "%d", player_status.score);
   white_text->draw("SCORE", 0, 0);
-  gold_text->draw(str, 96, 0);
+  gold_text->draw(str, (int)(96)/xdiv, 0);
 
   sprintf(str, "%d", player_status.distros);
-  white_text->draw_align("COINS", 320-64, 0,  A_LEFT, A_TOP);
-  gold_text->draw_align(str, 320+64, 0, A_RIGHT, A_TOP);
+  white_text->draw_align("COINS", (int)(320-64)/xdiv, 0,  A_LEFT, A_TOP);
+  gold_text->draw_align(str, (int)(320+64)/xdiv, 0, A_RIGHT, A_TOP);
 
-  white_text->draw("LIVES", 480, 0);
+  white_text->draw("LIVES", (int)(480)/xdiv, 0);
   if (player_status.lives >= 5)
     {
       sprintf(str, "%dx", player_status.lives);
-      gold_text->draw_align(str, 617, 0, A_RIGHT, A_TOP);
-      tux_life->draw(565+(18*3), 0);
+#ifdef RES320X240
+      gold_text->draw_align(str, (int)(617)/xdiv-5, 0, A_RIGHT, A_TOP);
+      tux_life->draw((int)((565-12+(18*3))), 0);
+#else
+      gold_text->draw_align(str, (int)(617), 0, A_RIGHT, A_TOP);
+      tux_life->draw((int)((565+(18*3))), 0);
+#endif
     }
   else
     {
       for(int i= 0; i < player_status.lives; ++i)
-        tux_life->draw(565+(18*i),0);
+        tux_life->draw((565+(18/xdiv*i)),0);
     }
 
   if (!tux->is_moving())
@@ -945,7 +980,11 @@
             {
               if(!i->name.empty())
                 {
+#ifndef RES320X240
               white_text->draw_align(i->title.c_str(), screen->w/2, screen->h,  A_HMIDDLE, A_BOTTOM);
+#else
+              white_text->draw_align(i->title.c_str(), screen->w/2, 470,  A_HMIDDLE, A_BOTTOM);
+#endif
                 }
 				  else if (i->teleport_dest_x != -1) {
 				  	if(!i->teleport_message.empty())
@@ -955,7 +994,7 @@
               /* Display a message in the map, if any as been selected */
               if(!i->display_map_message.empty() && !i->passive_message)
                 gold_text->draw_align(i->display_map_message.c_str(),
-                     screen->w/2, screen->h - 30,A_HMIDDLE, A_BOTTOM);
+                     screen->w/2, screen->h - (int)(30),A_HMIDDLE, A_BOTTOM);
               break;
             }
         }
@@ -964,7 +1003,7 @@
   /* Display a passive message in the map, if needed */
   if(passive_message_timer.check())
     gold_text->draw_align(passive_message.c_str(),
-                          screen->w/2, screen->h - 30,A_HMIDDLE, A_BOTTOM);
+                          screen->w/2, screen->h - (int)(30),A_HMIDDLE, A_BOTTOM);
 }
 
 void
@@ -997,6 +1036,7 @@
       Point tux_pos = tux->get_pos();
       if (1)
         {
+#ifndef GP2X
           offset.x = -tux_pos.x + screen->w/2;
           offset.y = -tux_pos.y + screen->h/2;
 
@@ -1005,6 +1045,16 @@
 
           if (offset.x < screen->w - width*32) offset.x = screen->w - width*32;
           if (offset.y < screen->h - height*32) offset.y = screen->h - height*32;
+#else
+          offset.x = -tux_pos.x + 640/2;
+          offset.y = -tux_pos.y + 480/2;
+
+          if (offset.x > 0) offset.x = 0;
+          if (offset.y > 0) offset.y = 0;
+
+          if (offset.x < 640 - width*32) offset.x = 640 - width*32;
+          if (offset.y < 480 - height*32) offset.y = 480 - height*32;
+#endif
         } 
 
       draw(offset);