diff -Nru SDL-1.2.5-Agawa030622/src/video/qtopia/SDL_QWin.cc SDL-1.2.5/src/video/qtopia/SDL_QWin.cc
--- SDL-1.2.5-Agawa030622/src/video/qtopia/SDL_QWin.cc	2003-06-22 22:21:39.000000000 +0900
+++ SDL-1.2.5/src/video/qtopia/SDL_QWin.cc	2003-06-22 22:17:16.000000000 +0900
@@ -122,6 +122,10 @@
 
   int borderWidth = (fbSize_.width() - my_image->width()) >> 1;
   int borderHeight = (fbSize_.height() - my_image->height()) >> 1;
+  if ( rotation_ & 1 ){
+    borderWidth = (fbSize_.height() - my_image->width()) >> 1;
+    borderHeight = (fbSize_.width() - my_image->height()) >> 1;
+  }
   realPos.setX(realPos.x() - borderWidth);
   realPos.setY(realPos.y() - borderHeight);
 
@@ -229,27 +233,41 @@
   int dstBorderTopBottom = (dstSize.height() - srcSize.height()) >>1;
   int dstStartOffsetX = dstSize.width() - dstBorderLeftRight - 2;
   int dstStartOffsetY = dstSize.height() - dstBorderTopBottom - 1;
-  srcBits += srcBlitRect.left() + srcBlitRect.top() * srcSize.width();
+  int left = srcBlitRect.left() & ~(int)1; // to be 32bit aligned
+  srcBits += left + srcBlitRect.top() * srcSize.width();
   dstBits += dstStartOffsetY * dstSize.width() + dstStartOffsetX;
-  dstBits -= srcBlitRect.left();
+  dstBits -= left;
   dstBits -= srcBlitRect.top() * dstSize.width();
 
   Uint32 *pSrc = (Uint32 *)srcBits;
   Uint32 *pDst = (Uint32 *)dstBits;
 
-  int width = srcBlitRect.width() >> 1, w;
+  int width = srcBlitRect.width(), width2 = srcBlitRect.width(), w;
+  if ( srcBlitRect.left() & 1 ){
+    width--; width2++;
+  }
+  if ( (srcBlitRect.left()+srcBlitRect.width()) & 1 ){
+    width--; width2++;
+  }
+  width >>= 1;
   int height = srcBlitRect.height();
-  int srcYAdd = srcSize.width() - srcBlitRect.width();
-  int dstYSub = dstSize.width() - srcBlitRect.width();
+  int srcYAdd = srcSize.width() - width2;
+  int dstYSub = dstSize.width() - width2;
 
   while (height--) {
     w = width;
+    if (srcBlitRect.left() & 1){
+      *((Uint16 *)pDst) = *(((Uint16 *)pSrc) + 1);
+      pDst--; pSrc++;
+    }
     while (w--) {
       *pDst-- = (*pSrc << 16) | (*pSrc >> 16);
       ++pSrc;
     }
-//     if (srcBlitRect.width() & 1)
-//       *(((Uint16 *)pDst)--) = *(((Uint16 *)pSrc)++);
+    if ((srcBlitRect.left()+srcBlitRect.width()) & 1){
+      *(((Uint16 *)pDst) + 1) = *((Uint16 *)pSrc);
+      pDst--; pSrc++;
+    }
     (Uint16 *)pSrc += srcYAdd;
     (Uint16 *)pDst -= dstYSub;
   }
diff -Nru SDL-1.2.5-Agawa030622/src/video/qtopia/SDL_sysmouse.cc SDL-1.2.5/src/video/qtopia/SDL_sysmouse.cc
--- SDL-1.2.5-Agawa030622/src/video/qtopia/SDL_sysmouse.cc	2003-06-22 22:21:39.000000000 +0900
+++ SDL-1.2.5/src/video/qtopia/SDL_sysmouse.cc	2003-06-22 22:18:03.000000000 +0900
@@ -60,7 +60,7 @@
 void QT_WarpWMCursor(_THIS, Uint16 x, Uint16 y)
 {
   SDL_Win->setMousePos(QPoint(x, y));
-  SDL_PrivateMouseMotion( 0, 0, SDL_Win->mousePos().x(), SDL_Win->mousePos().y());
+  SDL_PrivateMouseMotion( 0, 0, x, y );
 }
 
 }; /* Extern C */
diff -Nru SDL-1.2.5-Agawa030622/src/video/qtopia/SDL_sysvideo.cc SDL-1.2.5/src/video/qtopia/SDL_sysvideo.cc
--- SDL-1.2.5-Agawa030622/src/video/qtopia/SDL_sysvideo.cc	2003-06-22 22:21:39.000000000 +0900
+++ SDL-1.2.5/src/video/qtopia/SDL_sysvideo.cc	2003-06-22 22:19:06.000000000 +0900
@@ -352,6 +352,8 @@
         LOG("QT_GetMachine: /proc/deviceinfo/product is '%s'\n", buf);
         if (strncmp(buf, "SL-A300", 7) == 0)
           machine = MACHINE_SHARP_SLA300;
+        else if (strncmp(buf, "SL-5500", 7) == 0)
+          machine = MACHINE_SHARP_SL5500;
         else if (strncmp(buf, "SL-B500", 7) == 0)
           machine = MACHINE_SHARP_SLB500;
         else if (strncmp(buf, "SL-C700", 7) == 0)
@@ -433,6 +435,10 @@
     // qte での回転角度を取得
     QT_GetQteServerSpec(_this, &qteRotation, &isQteQvga);
 
+    // hack for SL-5500
+    if (machine == MACHINE_SHARP_SL5500)
+      qteRotation = 3;
+
     // SL-B500 用ハック(とりあえず、ね)
     if (machine == MACHINE_SHARP_SLB500)
       qteRotation = 3;
