X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=gp2x%2F940ctl.c;h=ee250f8a14476d63e1e6c37226b1a4ef27ec5dc4;hb=ac3494f42e030f50c5fe1fa35de684c2c3055af4;hp=8c8b18b1b16871ab89f301e0e6fe5f571fa9ffa1;hpb=7481dd3a117922274a69040085644ce388a7aab9;p=libpicofe.git diff --git a/gp2x/940ctl.c b/gp2x/940ctl.c index 8c8b18b..ee250f8 100644 --- a/gp2x/940ctl.c +++ b/gp2x/940ctl.c @@ -33,7 +33,7 @@ _940_ctl_t *shared_ctl = 0; unsigned char *mp3_mem = 0; #define MP3_SIZE_MAX (0x400000 + 0x800000) // 12M -#define CODE940_FILE "pico940_v2.bin" +#define CODE940_FILE "pico940_v3.bin" int crashed_940 = 0; @@ -69,7 +69,8 @@ int YM2612Write_940(unsigned int a, unsigned int v, int scanline) //printf("%05i:%03i: ym w ([%i] %02x)\n", Pico.m.frame_count, Pico.m.scanline, a, v); - switch (a) { + switch (a) + { case 0: /* address port 0 */ if (addr_A1 == 0 && ST_address == v) return 0; /* address already selected, don't send this command to 940 */ @@ -81,10 +82,6 @@ int YM2612Write_940(unsigned int a, unsigned int v, int scanline) upd = 0; break; - case 1: /* data port 0 */ - if (ST_address == 0x2b) upd = 0; /* DAC sel */ - break; - case 2: /* address port 1 */ if (addr_A1 == 1 && ST_address == v) return 0; @@ -178,25 +175,67 @@ void YM2612PicoStateLoad_940(void) { UINT8 *REGS = YM2612GetRegs(); - int i; - /* make sure JOB940_PICOSTATELOAD gets done before next JOB940_YM2612UPDATEONE */ add_job_940(JOB940_PICOSTATELOAD); if (CHECK_BUSY(JOB940_PICOSTATELOAD)) wait_busy_940(JOB940_PICOSTATELOAD); writebuff_ptr = 0; + addr_A1 = *(INT32 *) (REGS + 0x200); +} - // feed all the registers and update internal state - for(i = 0; i < 0x100; i++) { - YM2612Write_940(0, i, -1); - YM2612Write_940(1, REGS[i], -1); +void YM2612PicoStateSave2_940(int tat, int tbt) +{ + UINT8 *ym_remote_regs, *ym_local_regs; + add_job_940(JOB940_PICOSTATESAVE2); + if (CHECK_BUSY(JOB940_PICOSTATESAVE2)) wait_busy_940(JOB940_PICOSTATESAVE2); + + ym_remote_regs = (UINT8 *) shared_ctl->writebuff0; + ym_local_regs = YM2612GetRegs(); + if (*(UINT32 *)(ym_remote_regs + 0x100) != 0x41534d59) { + printf("code940 didn't return valid save data\n"); + return; } - for(i = 0; i < 0x100; i++) { - YM2612Write_940(2, i, -1); - YM2612Write_940(3, REGS[i|0x100], -1); + + /* copy addin data only */ + memcpy(ym_local_regs, ym_remote_regs, 0x20); + memcpy(ym_local_regs + 0x100, ym_remote_regs + 0x100, 0x30); + memcpy(ym_local_regs + 0x0b8, ym_remote_regs + 0x0b8, 0x48); + memcpy(ym_local_regs + 0x1b8, ym_remote_regs + 0x1b8, 0x48); + *(INT32 *)(ym_local_regs + 0x108) = tat; + *(INT32 *)(ym_local_regs + 0x10c) = tbt; +} + +int YM2612PicoStateLoad2_940(int *tat, int *tbt) +{ + UINT8 *ym_remote_regs, *ym_local_regs; + ym_local_regs = YM2612GetRegs(); + ym_remote_regs = (UINT8 *) shared_ctl->writebuff0; + + if (*(UINT32 *)(ym_local_regs + 0x100) != 0x41534d59) + return -1; + + *tat = *(INT32 *)(ym_local_regs + 0x108); + *tbt = *(INT32 *)(ym_local_regs + 0x10c); + + if (CHECK_BUSY(JOB940_YM2612UPDATEONE)) wait_busy_940(JOB940_YM2612UPDATEONE); + + /* flush writes */ + if (shared_ctl->writebuffsel == 1) { + shared_ctl->writebuff0[writebuff_ptr & 0xffff] = 0xffff; + } else { + shared_ctl->writebuff1[writebuff_ptr & 0xffff] = 0xffff; } + shared_ctl->writebuffsel ^= 1; + writebuff_ptr = 0; + add_job_940(JOB940_PICOSTATELOAD2_PREP); + if (CHECK_BUSY(JOB940_PICOSTATELOAD2_PREP)) wait_busy_940(JOB940_PICOSTATELOAD2_PREP); - addr_A1 = *(INT32 *) (REGS + 0x200); + memcpy(ym_remote_regs, ym_local_regs, 0x200); + + add_job_940(JOB940_PICOSTATELOAD2); + if (CHECK_BUSY(JOB940_PICOSTATELOAD2)) wait_busy_940(JOB940_PICOSTATELOAD2); + + return 0; } @@ -213,7 +252,7 @@ void sharedmem_init(void) if (shared_mem != NULL) return; shared_mem = (unsigned char *) mmap(0, 0x210000, PROT_READ|PROT_WRITE, MAP_SHARED, memdev, 0x2000000); - if(shared_mem == MAP_FAILED) + if (shared_mem == MAP_FAILED) { printf("mmap(shared_data) failed with %i\n", errno); exit(1); @@ -243,7 +282,6 @@ void sharedmem_deinit(void) extern char **g_argv; -/* none of the functions in this file should be called before this one */ void YM2612Init_940(int baseclock, int rate) { printf("YM2612Init_940()\n"); @@ -361,8 +399,8 @@ int YM2612UpdateOne_940(int *buffer, int length, int stereo, int is_buf_empty) /* predict sample counter for next frame */ if (PsndLen_exc_add) { - if (PsndLen_exc_cnt + PsndLen_exc_add >= 0x10000) length = PsndLen + 1; - else length = PsndLen; + length = PsndLen; + if (PsndLen_exc_cnt + PsndLen_exc_add >= 0x10000) length++; } /* give 940 ym job */