fast dma
authornotaz <notasas@gmail.com>
Fri, 9 Feb 2007 23:39:03 +0000 (23:39 +0000)
committernotaz <notasas@gmail.com>
Fri, 9 Feb 2007 23:39:03 +0000 (23:39 +0000)
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@35 be3aeb3a-fb24-0410-a615-afba39da0efa

Pico/Misc.c
Pico/PicoInt.h
Pico/VideoPort.c
Pico/sound/mix.c
Pico/sound/mix.h
Pico/sound/mix.s
Pico/sound/ym2612.c
platform/gp2x/Makefile
platform/gp2x/emu.c
platform/linux/940ctl_ym2612.c

index 887e90c..12fe7c4 100644 (file)
@@ -85,7 +85,7 @@ const unsigned char hcounts_32[] = {
 0x0a,0x0b,0x0b,0x0b,0x0c,0x0c,0x0c,0x0d,\r
 };\r
 \r
-// vcounter values for PicoFrameSimple \r
+// vcounter values for PicoFrameSimple\r
 const unsigned short vcounts[] = {\r
   0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,\r
   8,  8,  9,  9, 10, 11, 11, 12, 12, 13, 13, 14, 14, 15, 15, 16,\r
@@ -303,3 +303,27 @@ void SRAMUpdPending(unsigned int a, unsigned int d)
 \r
   Pico.m.sram_reg = (unsigned char) sreg;\r
 }\r
+\r
+\r
+#ifndef _ASM_MISC_C\r
+void memcpy16(unsigned short *dest, unsigned short *src, int count)\r
+{\r
+       while (count--)\r
+               *dest++ = *src++;\r
+}\r
+\r
+\r
+void memcpy32(int *dest, int *src, int count)\r
+{\r
+       while (count--)\r
+               *dest++ = *src++;\r
+}\r
+\r
+\r
+void memset32(int *dest, int c, int count)\r
+{\r
+       while (count--)\r
+               *dest++ = c;\r
+}\r
+#endif\r
+\r
index b17277f..6168a7b 100644 (file)
@@ -289,6 +289,9 @@ unsigned int PicoVideoRead(unsigned int a);
 void SRAMWriteEEPROM(unsigned int d);\r
 unsigned int SRAMReadEEPROM();\r
 void SRAMUpdPending(unsigned int a, unsigned int d);\r
+void memcpy16(unsigned short *dest, unsigned short *src, int count);\r
+void memcpy32(int *dest, int *src, int count);\r
+void memset32(int *dest, int c, int count);\r
 \r
 \r
 #ifdef __cplusplus\r
index b7a05f0..e3643df 100644 (file)
@@ -139,15 +139,24 @@ static void DmaSlow(int len)
   {\r
     case 1: // vram\r
       r = Pico.vram;\r
-      for(; len; len--)\r
+      if (inc == 2 && !(a&1) && a+len*2 < 0x10000)\r
       {\r
-        d=*pd++;\r
-        if(a&1) d=(d<<8)|(d>>8);\r
-        r[a>>1] = (u16)d; // will drop the upper bits\r
-        // AutoIncrement\r
-        a=(u16)(a+inc);\r
-        // didn't src overlap?\r
-        //if(pd >= pdend) pd-=0x8000; // should be good for RAM, bad for ROM\r
+        // most used DMA mode\r
+       memcpy16(r + (a>>1), pd, len);\r
+       a += len*2;\r
+      }\r
+      else\r
+      {\r
+        for(; len; len--)\r
+        {\r
+          d=*pd++;\r
+          if(a&1) d=(d<<8)|(d>>8);\r
+          r[a>>1] = (u16)d; // will drop the upper bits\r
+          // AutoIncrement\r
+          a=(u16)(a+inc);\r
+          // didn't src overlap?\r
+          //if(pd >= pdend) pd-=0x8000; // should be good for RAM, bad for ROM\r
+        }\r
       }\r
       rendstatus|=0x10;\r
       break;\r
index 8e4a631..4d68f1d 100644 (file)
@@ -8,22 +8,6 @@
 }
 
 
-
-
-void memcpy32(int *dest, int *src, int count)
-{
-       while (count--)
-               *dest++ = *src++;
-}
-
-
-void memset32(int *dest, int c, int count)
-{
-       while (count--)
-               *dest++ = c;
-}
-
-
 void mix_32_to_16l_stereo(short *dest, int *src, int count)
 {
        int l, r;
@@ -55,3 +39,16 @@ void mix_32_to_16_mono(short *dest, int *src, int count)
 }
 
 
+/* unimplemented... */
+void mix_16h_to_32(int *dest_buf, short *mp3_buf, int count)
+{
+}
+
+void mix_16h_to_32_s1(int *dest_buf, short *mp3_buf, int count)
+{
+}
+
+void mix_16h_to_32_s2(int *dest_buf, short *mp3_buf, int count)
+{
+}
+
index 752cfb6..be1b43b 100644 (file)
@@ -1,6 +1,4 @@
 
-void memcpy32(int *dest, int *src, int count);
-void memset32(int *dest, int c, int count);
 //void mix_32_to_32(int *dest, int *src, int count);
 void mix_16h_to_32(int *dest, short *src, int count);
 void mix_16h_to_32_s1(int *dest, short *src, int count);
index d34a273..bc35027 100644 (file)
@@ -1,63 +1,5 @@
 @ vim:filetype=armasm
 
-.global memcpy32 @ int *dest, int *src, int count
-
-memcpy32:
-    stmfd   sp!, {r4,lr}
-
-    subs    r2, r2, #4
-    bmi     mcp32_fin
-
-mcp32_loop:
-    ldmia   r1!, {r3,r4,r12,lr}
-    subs    r2, r2, #4
-    stmia   r0!, {r3,r4,r12,lr}
-    bpl     mcp32_loop
-
-mcp32_fin:
-    tst     r2, #3
-    ldmeqfd sp!, {r4,pc}
-    tst     r2, #1
-    ldrne   r3, [r1], #4
-    strne   r3, [r0], #4
-
-mcp32_no_unal1:
-    tst     r2, #2
-    ldmneia r1!, {r3,r12}
-    ldmfd   sp!, {r4,lr}
-    stmneia r0!, {r3,r12}
-    bx      lr
-
-
-
-.global memset32 @ int *dest, int c, int count
-
-memset32:
-    stmfd   sp!, {lr}
-
-    mov     r3, r1
-    subs    r2, r2, #4
-    bmi     mst32_fin
-
-    mov     r12,r1
-    mov     lr, r1
-
-mst32_loop:
-    subs    r2, r2, #4
-    stmia   r0!, {r1,r3,r12,lr}
-    bpl     mst32_loop
-
-mst32_fin:
-    tst     r2, #1
-    strne   r1, [r0], #4
-
-    tst     r2, #2
-    stmneia r0!, {r1,r3}
-
-    ldmfd   sp!, {lr}
-    bx      lr
-
-
 
 @ this assumes src is word aligned
 .global mix_16h_to_32 @ int *dest, short *src, int count
index 75d5ad3..3c3b17e 100644 (file)
 #include <math.h>\r
 \r
 #include "ym2612.h"\r
-#include "mix.h"\r
 \r
 #ifndef EXTERNAL_YM2612\r
 #include <stdlib.h>\r
@@ -125,6 +124,8 @@ extern YM2612 *ym2612_940;
 \r
 #endif\r
 \r
+void memset32(int *dest, int c, int count);\r
+\r
 \r
 #ifndef __GNUC__\r
 #pragma warning (disable:4100) // unreferenced formal parameter\r
index d4de0ec..899f05f 100644 (file)
@@ -11,6 +11,7 @@ dprint = 1
 asm_memory = 0 # TODO\r
 asm_render = 1\r
 asm_ym2612 = 1\r
+asm_misc = 1\r
 #profile = 1\r
 #use_musashi = 1\r
 #up = 1\r
@@ -55,6 +56,10 @@ ifeq "$(asm_ym2612)" "1"
 DEFINC += -D_ASM_YM2612_C\r
 OBJS += ../../Pico/sound/ym2612_asm.o\r
 endif\r
+ifeq "$(asm_misc)" "1"\r
+DEFINC += -D_ASM_MISC_C\r
+OBJS += ../../Pico/misc_asm.o\r
+endif\r
 # Pico - sound\r
 OBJS += ../../Pico/sound/mix_asm.o\r
 OBJS += ../../Pico/sound/sound.o ../../Pico/sound/sn76496.o ../../Pico/sound/ym2612.o\r
@@ -128,6 +133,9 @@ testrefr.gpe : test.o gp2x.o asmutils.o
 ../../Pico/sound/mix_asm.o : ../../Pico/sound/mix.s\r
        @echo $<\r
        @$(AS) $(ASOPT) $< -o $@\r
+../../Pico/misc_asm.o : ../../Pico/misc.s\r
+       @echo $<\r
+       @$(AS) $(ASOPT) $< -o $@\r
 \r
 # build Cyclone\r
 ../../cpu/Cyclone/proj/Cyclone.s :\r
index 36408f4..a5a46ea 100644 (file)
@@ -1232,6 +1232,7 @@ if (Pico.m.frame_count == 31563) {
        // if in 16bit mode, generate 8it image for menu background\r
        if (!(PicoOpt&0x10) && (currentConfig.EmuOpt&0x80)) {\r
                PicoOpt |= 0x10;\r
+               Pico.m.dirtyPal = 1;\r
                PicoFrameFull();\r
                blit("", NULL); blit("", NULL); blit("", NULL); blit("", NULL); // be sure buffer3 gets updated\r
                PicoOpt &= ~0x10;\r
index 86435e4..451c942 100644 (file)
@@ -224,16 +224,3 @@ int mp3_get_offset(void)
 }
 
 
-/* unimplemented... */
-void mix_16h_to_32(int *dest_buf, short *mp3_buf, int count)
-{
-}
-
-void mix_16h_to_32_s1(int *dest_buf, short *mp3_buf, int count)
-{
-}
-
-void mix_16h_to_32_s2(int *dest_buf, short *mp3_buf, int count)
-{
-}
-