dualcore integration in famc, bram cart C code, psp bugfixes
[libpicofe.git] / gp2x / 940ctl.c
index 54b83b6..a927913 100644 (file)
 #include "gp2x.h"\r
 #include "emu.h"\r
 #include "menu.h"\r
-#include "asmutils.h"\r
-#include "mp3.h"\r
+#include "../common/mp3.h"\r
+#include "../common/arm_utils.h"\r
+#include "../common/menu.h"\r
+#include "../common/emu.h"\r
 #include "../../Pico/PicoInt.h"\r
+#include "../../Pico/sound/ym2612.h"\r
 #include "../../Pico/sound/mix.h"\r
 \r
 /* we will need some gp2x internals here */\r
@@ -50,11 +53,10 @@ static FILE *loaded_mp3 = 0;
 /* these will be managed locally on our side */\r
 extern int   *ym2612_dacen;\r
 extern INT32 *ym2612_dacout;\r
-extern void  *ym2612_regs;\r
-\r
 static UINT8 *REGS = 0;                /* we will also keep local copy of regs for savestates and such */\r
-static INT32 addr_A1;          /* address line A1      */\r
-static int      dacen;\r
+static INT32 *addr_A1;         /* address line A1      */\r
+\r
+static int   dacen;\r
 static INT32 dacout;\r
 static UINT8 ST_address;       /* address register     */\r
 static UINT8 ST_status;                /* status flag          */\r
@@ -112,19 +114,19 @@ int YM2612Write_940(unsigned int a, unsigned int v)
 \r
        switch( a ) {\r
        case 0: /* address port 0 */\r
-               if (!addr_A1 && ST_address == v)\r
+               if (!*addr_A1 && ST_address == v)\r
                        return 0;       /* address already selected, don't send this command to 940 */\r
                ST_address = v;\r
                /* don't send DAC or timer related address changes to 940 */\r
-               if (!addr_A1 && (v & 0xf0) == 0x20 &&\r
+               if (!*addr_A1 && (v & 0xf0) == 0x20 &&\r
                        (v == 0x24 || v == 0x25 || v == 0x26 || v == 0x2a))\r
                                return 0;\r
-               addr_A1 = 0;\r
+               *addr_A1 = 0;\r
                upd = 0;\r
                break;\r
 \r
        case 1: /* data port 0    */\r
-               if (addr_A1 != 0) {\r
+               if (*addr_A1 != 0) {\r
                        return 0;       /* verified on real YM2608 */\r
                }\r
 \r
@@ -183,15 +185,15 @@ int YM2612Write_940(unsigned int a, unsigned int v)
                break;\r
 \r
        case 2: /* address port 1 */\r
-               if (addr_A1 && ST_address == v)\r
+               if (*addr_A1 && ST_address == v)\r
                        return 0;\r
                ST_address = v;\r
-               addr_A1 = 1;\r
+               *addr_A1 = 1;\r
                upd = 0;\r
                break;\r
 \r
        case 3: /* data port 1    */\r
-               if (addr_A1 != 1) {\r
+               if (*addr_A1 != 1) {\r
                        return 0;       /* verified on real YM2608 */\r
                }\r
 \r
@@ -312,7 +314,7 @@ static void add_job_940(int job)
 \r
 void YM2612PicoStateLoad_940(void)\r
 {\r
-       int i, old_A1 = addr_A1;\r
+       int i, old_A1 = *addr_A1;\r
 \r
        /* make sure JOB940_PICOSTATELOAD gets done before next JOB940_YM2612UPDATEONE */\r
        add_job_940(JOB940_PICOSTATELOAD);\r
@@ -330,7 +332,7 @@ void YM2612PicoStateLoad_940(void)
                YM2612Write_940(3, REGS[i|0x100]);\r
        }\r
 \r
-       addr_A1 = old_A1;\r
+       *addr_A1 = old_A1;\r
 }\r
 \r
 \r
@@ -343,7 +345,9 @@ static void internal_reset(void)
        ST_TAC    = 0;\r
        ST_TB     = 0;\r
        ST_TBC    = 0;\r
-       dacen = 0;\r
+       dacen     = 0;\r
+       dacout    = 0;\r
+       ST_address= 0;\r
 }\r
 \r
 \r
@@ -415,10 +419,10 @@ void YM2612Init_940(int baseclock, int rate)
                fp = fopen(binpath, "rb");\r
                if(!fp)\r
                {\r
-                       memset(gp2x_screen, 0, 320*240);\r
-                       gp2x_text_out8(10, 100, "failed to open required file:");\r
-                       gp2x_text_out8(10, 110, CODE940_FILE);\r
-                       gp2x_video_flip();\r
+                       memset(gp2x_screen, 0, 320*240*2);\r
+                       text_out16(10, 100, "failed to open required file:");\r
+                       text_out16(10, 110, CODE940_FILE);\r
+                       gp2x_video_flip2();\r
                        printf("failed to open %s\n", binpath);\r
                        exit(1);\r
                }\r
@@ -438,7 +442,11 @@ void YM2612Init_940(int baseclock, int rate)
        memset(shared_data, 0, sizeof(*shared_data));\r
        memset(shared_ctl,  0, sizeof(*shared_ctl));\r
 \r
+       /* cause local ym2612 to init REGS */\r
+       YM2612Init_(baseclock, rate);\r
+\r
        REGS = YM2612GetRegs();\r
+       addr_A1 = (INT32 *) (REGS + 0x200);\r
 \r
        ym2612_dacen  = &dacen;\r
        ym2612_dacout = &dacout;\r
@@ -525,9 +533,8 @@ void mp3_update(int *buffer, int length, int stereo)
        int length_mp3;\r
        int cdda_on;\r
 \r
-       // not data track, CDC is reading, playback was started, track not ended\r
-       cdda_on = !(Pico_mcd->s68k_regs[0x36] & 1) && (Pico_mcd->scd.Status_CDC & 1) &&\r
-                       loaded_mp3 && shared_ctl->mp3_offs < shared_ctl->mp3_len;\r
+       // playback was started, track not ended\r
+       cdda_on = loaded_mp3 && shared_ctl->mp3_offs < shared_ctl->mp3_len;\r
 \r
        if (!cdda_on) return;\r
 \r
@@ -641,7 +648,7 @@ void mp3_start_play(FILE *f, int pos) // pos is 0-1023
 \r
 int mp3_get_offset(void)\r
 {\r
-       int offs1024 = 0;\r
+       unsigned int offs1024 = 0;\r
        int cdda_on;\r
 \r
        cdda_on = (PicoMCD & 1) && (PicoOpt&0x800) && !(Pico_mcd->s68k_regs[0x36] & 1) &&\r
@@ -649,10 +656,9 @@ int mp3_get_offset(void)
 \r
        if (cdda_on) {\r
                offs1024  = shared_ctl->mp3_offs << 7;\r
-               offs1024 /= shared_ctl->mp3_len;\r
-               offs1024 <<= 3;\r
+               offs1024 /= shared_ctl->mp3_len  >> 3;\r
        }\r
-       printf("offs1024=%i (%i/%i)\n", offs1024, shared_ctl->mp3_offs, shared_ctl->mp3_len);\r
+       printf("offs1024=%u (%i/%i)\n", offs1024, shared_ctl->mp3_offs, shared_ctl->mp3_len);\r
 \r
        return offs1024;\r
 }\r