#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
_940_ctl_t *shared_ctl = 0;\r
unsigned char *mp3_mem = 0;\r
\r
-#define MP3_SIZE_MAX (0x1000000 - 4*640*480)\r
+#define MP3_SIZE_MAX (0x400000 + 0x800000) // 12M\r
+#define CODE940_FILE "pico940.bin"\r
\r
int crashed_940 = 0;\r
\r
/* 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
\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
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
\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
+ if (CHECK_BUSY(JOB940_PICOSTATELOAD)) wait_busy_940(JOB940_PICOSTATELOAD);\r
+\r
+ writebuff_ptr = 0;\r
\r
// feed all the registers and update internal state\r
for(i = 0; i < 0x100; i++) {\r
YM2612Write_940(3, REGS[i|0x100]);\r
}\r
\r
- addr_A1 = old_A1;\r
-\r
-// add_job_940(JOB940_PICOSTATELOAD);\r
+ *addr_A1 = old_A1;\r
}\r
\r
\r
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
shared_data = (_940_data_t *) (shared_mem+0x100000);\r
/* this area must not get buffered on either side */\r
shared_ctl = (_940_ctl_t *) (shared_mem+0x200000);\r
- mp3_mem = (unsigned char *) mmap(0, MP3_SIZE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x3000000);\r
+ mp3_mem = (unsigned char *) mmap(0, MP3_SIZE_MAX, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x2400000);\r
if (mp3_mem == MAP_FAILED)\r
{\r
printf("mmap(mp3_mem) failed with %i\n", errno);\r
binpath[1023] = 0;\r
for (i = strlen(binpath); i > 0; i--)\r
if (binpath[i] == '/') { binpath[i] = 0; break; }\r
- strcat(binpath, "/code940.bin");\r
+ strcat(binpath, "/" CODE940_FILE);\r
\r
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.bin");\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
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
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
\r
if (loaded_mp3 != f)\r
{\r
- // printf("loading mp3... "); fflush(stdout);\r
if (PicoMessage != NULL)\r
{\r
fseek(f, 0, SEEK_END);\r
}\r
fseek(f, 0, SEEK_SET);\r
fread(mp3_mem, 1, MP3_SIZE_MAX, f);\r
- // if (feof(f)) printf("done.\n");\r
- // else printf("done. mp3 too large, not all data loaded.\n");\r
+ if (!feof(f)) printf("Warning: mp3 was too large, not all data loaded.\n");\r
shared_ctl->mp3_len = ftell(f);\r
loaded_mp3 = f;\r
\r
\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
\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