FAME + some random stuff added
[picodrive.git] / Pico / Misc.c
index 38c381d..a458f4d 100644 (file)
@@ -316,8 +316,30 @@ PICO_INTERNAL void SRAMUpdPending(unsigned int a, unsigned int d)
 \r
 \r
 #ifndef _ASM_MISC_C\r
+typedef struct\r
+{\r
+       int b0;\r
+       int b1;\r
+       int b2;\r
+       int b3;\r
+       int b4;\r
+       int b5;\r
+       int b6;\r
+       int b7;\r
+} intblock;\r
+\r
 PICO_INTERNAL_ASM void memcpy16(unsigned short *dest, unsigned short *src, int count)\r
 {\r
+       if (((int)dest & (int)src & 3) == 0)\r
+       {\r
+               if (count >= 32) {\r
+                       memcpy32((int *)dest, (int *)src, count/2);\r
+                       count&=1;\r
+               } else {\r
+                       for (; count >= 2; count -= 2, dest+=2, src+=2)\r
+                               *(int *)dest = *(int *)src;\r
+               }\r
+       }\r
        while (count--)\r
                *dest++ = *src++;\r
 }\r
@@ -334,6 +356,12 @@ PICO_INTERNAL_ASM void memcpy16bswap(unsigned short *dest, void *src, int count)
 \r
 PICO_INTERNAL_ASM void memcpy32(int *dest, int *src, int count)\r
 {\r
+       intblock *bd = (intblock *) dest, *bs = (intblock *) src;\r
+\r
+       for (; count >= sizeof(*bd)/4; count -= sizeof(*bd)/4)\r
+               *bd++ = *bs++;\r
+\r
+       dest = (int *)bd; src = (int *)bs;\r
        while (count--)\r
                *dest++ = *src++;\r
 }\r
@@ -341,6 +369,10 @@ PICO_INTERNAL_ASM void memcpy32(int *dest, int *src, int count)
 \r
 PICO_INTERNAL_ASM void memset32(int *dest, int c, int count)\r
 {\r
+       for (; count >= 8; count -= 8, dest += 8)\r
+               dest[0] = dest[1] = dest[2] = dest[3] =\r
+               dest[4] = dest[5] = dest[6] = dest[7] = c;\r
+\r
        while (count--)\r
                *dest++ = c;\r
 }\r