X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=Pico%2Fcd%2FLC89510.c;h=1f00607392d7dffd031c00a286422ecd8e247cf7;hb=fa1e5e2948e9b06dec3353081081173f7ae4d742;hp=de11f90ee5ab329ed6f5fe412c8c5047615ca1f0;hpb=c459aefdad169c97b6fb93a20c1219a76aa07505;p=picodrive.git diff --git a/Pico/cd/LC89510.c b/Pico/cd/LC89510.c index de11f90..1f00607 100644 --- a/Pico/cd/LC89510.c +++ b/Pico/cd/LC89510.c @@ -15,8 +15,6 @@ #define CDC_DMA_SPEED 256 -int CDC_Decode_Reg_Read; // 2 context? - static void CDD_Reset(void) { @@ -55,7 +53,7 @@ static void CDC_Reset(void) Pico_mcd->cdc.IFCTRL = 0; Pico_mcd->cdc.CTRL.N = 0; - CDC_Decode_Reg_Read = 0; + Pico_mcd->cdc.Decode_Reg_Read = 0; Pico_mcd->scd.Status_CDC &= ~0x08; } @@ -65,15 +63,14 @@ void LC89510_Reset(void) CDD_Reset(); CDC_Reset(); - Pico_mcd->cdc.Host_Data = 0; - Pico_mcd->cdc.DMA_Adr = 0; - Pico_mcd->cdc.Stop_Watch = 0; + // clear DMA_Adr & Stop_Watch + memset(Pico_mcd->s68k_regs + 0xA, 0, 4); } void Update_CDC_TRansfer(int which) { - unsigned int dep, length, len; + unsigned int DMA_Adr, dep, length, len; unsigned short *dest; unsigned char *src; @@ -101,58 +98,87 @@ void Update_CDC_TRansfer(int which) // TODO: dst bounds checking? DAC.N alignment? src = Pico_mcd->cdc.Buffer + Pico_mcd->cdc.DAC.N; - + DMA_Adr = (Pico_mcd->s68k_regs[0xA]<<8) | Pico_mcd->s68k_regs[0xB]; if (which == 7) // WORD RAM { if (Pico_mcd->s68k_regs[3] & 4) { - dep = ((Pico_mcd->cdc.DMA_Adr & 0x3FFF) << 3); + // test: Final Fight + int bank = !(Pico_mcd->s68k_regs[3]&1); + dep = ((DMA_Adr & 0x3FFF) << 3); cdprintf("CD DMA # %04x -> word_ram1M # %06x, len=%i", Pico_mcd->cdc.DAC.N, dep, length); - dep = ((Pico_mcd->cdc.DMA_Adr & 0x3FFF) << 4); - if (!(Pico_mcd->s68k_regs[3]&1)) dep += 2; - dest = (unsigned short *) (Pico_mcd->word_ram + dep); + dest = (unsigned short *) (Pico_mcd->word_ram1M[bank] + dep); - for (len = length; len > 0; len--, src+=2, dest+=2) + // TODO: bswapcpy + for (len = length; len > 0; len--, src+=2, dest++) *dest = (src[0]<<8) | src[1]; + + { // debug + unsigned char *b1 = Pico_mcd->word_ram1M[bank] + dep; + unsigned char *b2 = (unsigned char *)dest - 8; + dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x", + b1[0], b1[1], b1[4], b1[5], b2[0], b2[1], b2[4], b2[5]); + } } else { - dep = ((Pico_mcd->cdc.DMA_Adr & 0x7FFF) << 3); + dep = ((DMA_Adr & 0x7FFF) << 3); cdprintf("CD DMA # %04x -> word_ram2M # %06x, len=%i", Pico_mcd->cdc.DAC.N, dep, length); - dest = (unsigned short *) (Pico_mcd->word_ram + dep); + dest = (unsigned short *) (Pico_mcd->word_ram2M + dep); for (len = length; len > 0; len--, src+=2, dest++) *dest = (src[0]<<8) | src[1]; + + { // debug + unsigned char *b1 = Pico_mcd->word_ram2M + dep; + unsigned char *b2 = (unsigned char *)dest - 4; + dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x", + b1[0], b1[1], b1[2], b1[3], b2[0], b2[1], b2[2], b2[3]); + } } } else if (which == 4) // PCM RAM { #if 0 dest = (unsigned char *) Ram_PCM; - dep = ((Pico_mcd->cdc.DMA_Adr & 0x03FF) << 2) + PCM_Chip.Bank; + dep = ((DMA_Adr & 0x03FF) << 2) + PCM_Chip.Bank; #else - cdprintf("TODO: PCM Dma"); + dprintf("FIXME: CD DMA # %04x -> PCM", Pico_mcd->cdc.DAC.N); #endif } else if (which == 5) // PRG RAM { - dep = (Pico_mcd->cdc.DMA_Adr & 0xFFFF) << 3; + dep = DMA_Adr << 3; dest = (unsigned short *) (Pico_mcd->prg_ram + dep); cdprintf("CD DMA # %04x -> prg_ram # %06x, len=%i", Pico_mcd->cdc.DAC.N, dep, length); for (len = length; len > 0; len--, src+=2, dest++) *dest = (src[0]<<8) | src[1]; + + { // debug + unsigned char *b1 = Pico_mcd->prg_ram + dep; + unsigned char *b2 = (unsigned char *)dest - 4; + dprintf("%02x %02x %02x %02x .. %02x %02x %02x %02x", + b1[0], b1[1], b1[2], b1[3], b2[0], b2[1], b2[2], b2[3]); + } } length <<= 1; Pico_mcd->cdc.DAC.N = (Pico_mcd->cdc.DAC.N + length) & 0xFFFF; if (Pico_mcd->scd.Status_CDC & 0x08) Pico_mcd->cdc.DBC.N -= length; else Pico_mcd->cdc.DBC.N = 0; + + // update DMA_Adr + length >>= 2; + if (which != 4) length >>= 1; + DMA_Adr += length; + Pico_mcd->s68k_regs[0xA] = DMA_Adr >> 8; + Pico_mcd->s68k_regs[0xB] = DMA_Adr; } @@ -163,7 +189,7 @@ unsigned short Read_CDC_Host(int is_sub) if (!(Pico_mcd->scd.Status_CDC & 0x08)) { // Transfer data disabled - cdprintf("Read_CDC_Host: Transfer data disabled"); + cdprintf("Read_CDC_Host FIXME: Transfer data disabled"); return 0; } @@ -171,7 +197,7 @@ unsigned short Read_CDC_Host(int is_sub) (!is_sub && (Pico_mcd->s68k_regs[4] & 7) != 2)) { // Wrong setting - cdprintf("Read_CDC_Host: Wrong setting"); + cdprintf("Read_CDC_Host FIXME: Wrong setting"); return 0; } @@ -260,7 +286,7 @@ unsigned char CDC_Read_Reg(void) case 0x1: // IFSTAT cdprintf("CDC read reg 01 = %.2X", Pico_mcd->cdc.IFSTAT); - CDC_Decode_Reg_Read |= (1 << 1); // Reg 1 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 1); // Reg 1 (decoding) Pico_mcd->s68k_regs[5] = 0x2; return Pico_mcd->cdc.IFSTAT; @@ -279,42 +305,42 @@ unsigned char CDC_Read_Reg(void) case 0x4: // HEAD0 cdprintf("CDC read reg 04 = %.2X", Pico_mcd->cdc.HEAD.B.B0); - CDC_Decode_Reg_Read |= (1 << 4); // Reg 4 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 4); // Reg 4 (decoding) Pico_mcd->s68k_regs[5] = 0x5; return Pico_mcd->cdc.HEAD.B.B0; case 0x5: // HEAD1 cdprintf("CDC read reg 05 = %.2X", Pico_mcd->cdc.HEAD.B.B1); - CDC_Decode_Reg_Read |= (1 << 5); // Reg 5 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 5); // Reg 5 (decoding) Pico_mcd->s68k_regs[5] = 0x6; return Pico_mcd->cdc.HEAD.B.B1; case 0x6: // HEAD2 cdprintf("CDC read reg 06 = %.2X", Pico_mcd->cdc.HEAD.B.B2); - CDC_Decode_Reg_Read |= (1 << 6); // Reg 6 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 6); // Reg 6 (decoding) Pico_mcd->s68k_regs[5] = 0x7; return Pico_mcd->cdc.HEAD.B.B2; case 0x7: // HEAD3 cdprintf("CDC read reg 07 = %.2X", Pico_mcd->cdc.HEAD.B.B3); - CDC_Decode_Reg_Read |= (1 << 7); // Reg 7 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 7); // Reg 7 (decoding) Pico_mcd->s68k_regs[5] = 0x8; return Pico_mcd->cdc.HEAD.B.B3; case 0x8: // PTL cdprintf("CDC read reg 08 = %.2X", Pico_mcd->cdc.PT.B.L); - CDC_Decode_Reg_Read |= (1 << 8); // Reg 8 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 8); // Reg 8 (decoding) Pico_mcd->s68k_regs[5] = 0x9; return Pico_mcd->cdc.PT.B.L; case 0x9: // PTH cdprintf("CDC read reg 09 = %.2X", Pico_mcd->cdc.PT.B.H); - CDC_Decode_Reg_Read |= (1 << 9); // Reg 9 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 9); // Reg 9 (decoding) Pico_mcd->s68k_regs[5] = 0xA; return Pico_mcd->cdc.PT.B.H; @@ -333,21 +359,21 @@ unsigned char CDC_Read_Reg(void) case 0xC: // STAT0 cdprintf("CDC read reg 12 = %.2X", Pico_mcd->cdc.STAT.B.B0); - CDC_Decode_Reg_Read |= (1 << 12); // Reg 12 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 12); // Reg 12 (decoding) Pico_mcd->s68k_regs[5] = 0xD; return Pico_mcd->cdc.STAT.B.B0; case 0xD: // STAT1 cdprintf("CDC read reg 13 = %.2X", Pico_mcd->cdc.STAT.B.B1); - CDC_Decode_Reg_Read |= (1 << 13); // Reg 13 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 13); // Reg 13 (decoding) Pico_mcd->s68k_regs[5] = 0xE; return Pico_mcd->cdc.STAT.B.B1; case 0xE: // STAT2 cdprintf("CDC read reg 14 = %.2X", Pico_mcd->cdc.STAT.B.B2); - CDC_Decode_Reg_Read |= (1 << 14); // Reg 14 (decoding) + Pico_mcd->cdc.Decode_Reg_Read |= (1 << 14); // Reg 14 (decoding) Pico_mcd->s68k_regs[5] = 0xF; return Pico_mcd->cdc.STAT.B.B2; @@ -358,7 +384,7 @@ unsigned char CDC_Read_Reg(void) Pico_mcd->cdc.IFSTAT |= 0x20; // decoding interrupt flag cleared if ((Pico_mcd->cdc.CTRL.B.B0 & 0x80) && (Pico_mcd->cdc.IFCTRL & 0x20)) { - if ((CDC_Decode_Reg_Read & 0x73F2) == 0x73F2) + if ((Pico_mcd->cdc.Decode_Reg_Read & 0x73F2) == 0x73F2) Pico_mcd->cdc.STAT.B.B3 = 0x80; } return ret; @@ -425,7 +451,7 @@ void CDC_Write_Reg(unsigned char Data) cdprintf("************** Starting Data Transfer ***********"); cdprintf("RS0 = %.4X DAC = %.4X DBC = %.4X DMA adr = %.4X\n\n", Pico_mcd->s68k_regs[4]<<8, - Pico_mcd->cdc.DAC.N, Pico_mcd->cdc.DBC.N, Pico_mcd->cdc.DMA_Adr); + Pico_mcd->cdc.DAC.N, Pico_mcd->cdc.DBC.N, (Pico_mcd->s68k_regs[0xA]<<8) | Pico_mcd->s68k_regs[0xB]); } break;