bugfixes, CD swap, autorepeat

git-svn-id: file:///home/notaz/opt/svn/PicoDrive@85 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
notaz 2007-04-01 18:10:07 +00:00
parent d915372968
commit 721cd3963f
17 changed files with 252 additions and 281 deletions

View file

@ -112,12 +112,12 @@ void Update_CDC_TRansfer(int which)
memcpy16bswap(dest, src, length);
{ // debug
/*{ // debug
unsigned char *b1 = Pico_mcd->word_ram1M[bank] + dep;
unsigned char *b2 = (unsigned char *)(dest+length) - 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
{
@ -128,12 +128,12 @@ void Update_CDC_TRansfer(int which)
memcpy16bswap(dest, src, length);
{ // debug
/*{ // debug
unsigned char *b1 = Pico_mcd->word_ram2M + dep;
unsigned char *b2 = (unsigned char *)(dest+length) - 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 (check: popful Mail)
@ -156,12 +156,12 @@ void Update_CDC_TRansfer(int which)
memcpy16bswap(dest, src, length);
{ // debug
/*{ // debug
unsigned char *b1 = Pico_mcd->prg_ram + dep;
unsigned char *b2 = (unsigned char *)(dest+length) - 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;
@ -227,20 +227,6 @@ unsigned short Read_CDC_Host(int is_sub)
(Pico_mcd->cdc.Buffer[addr]<<8) | Pico_mcd->cdc.Buffer[addr+1], Pico_mcd->cdc.DAC.N, Pico_mcd->cdc.DBC.N);
return (Pico_mcd->cdc.Buffer[addr]<<8) | Pico_mcd->cdc.Buffer[addr+1];
#if 0
__asm
{
mov esi, Pico_mcd->cdc.DAC.N
lea ebx, Pico_mcd->cdc.Buffer
// and esi, 0x3FFF
mov ax, [ebx + esi]
add esi, 2
rol ax, 8
mov Pico_mcd->cdc.DAC.N, esi
mov val, ax
}
#endif
}

View file

@ -26,12 +26,12 @@ typedef unsigned int u32;
//#define __debug_io
//#define __debug_io2
//#define rdprintf dprintf
#define rdprintf(...)
#define rdprintf dprintf
//#define rdprintf(...)
//#define wrdprintf dprintf
#define wrdprintf(...)
//#define plprintf dprintf
#define plprintf(...)
#define plprintf dprintf
//#define plprintf(...)
// -----------------------------------------------------------------
@ -118,6 +118,7 @@ void m68k_reg_write8(u32 a, u32 d)
Pico_mcd->m.busreq = d;
return;
case 2:
dprintf("m68k: prg wp=%02x", d);
Pico_mcd->s68k_regs[2] = d; // really use s68k side register
return;
case 3: {
@ -405,7 +406,7 @@ static void OtherWrite8End(u32 a, u32 d, int realsize)
{
if ((a&0xffffc0)==0xa12000) { m68k_reg_write8(a, d); return; }
dprintf("m68k FIXME: strange w%i: %06x, %08x @%06x", realsize, a&0xffffff, d, SekPc);
dprintf("m68k FIXME: strange w%i: [%06x], %08x @%06x", realsize, a&0xffffff, d, SekPc);
}
@ -433,7 +434,7 @@ static u8 PicoReadM68k8(u32 a)
if (a < 0x20000) { d = *(u8 *)(Pico_mcd->bios+(a^1)); goto end; } // bios
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&3)!=1) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
d = *(prg_bank+((a^1)&0x1ffff));
goto end;
@ -490,7 +491,7 @@ static u16 PicoReadM68k16(u32 a)
if (a < 0x20000) { d = *(u16 *)(Pico_mcd->bios+a); goto end; } // bios
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&3)!=1) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
wrdprintf("m68k_prgram r16: [%i,%06x] @%06x", Pico_mcd->s68k_regs[3]>>6, a, SekPc);
d = *(u16 *)(prg_bank+(a&0x1fffe));
@ -547,7 +548,7 @@ static u32 PicoReadM68k32(u32 a)
if (a < 0x20000) { u16 *pm=(u16 *)(Pico_mcd->bios+a); d = (pm[0]<<16)|pm[1]; goto end; } // bios
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&3)!=1) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
u16 *pm=(u16 *)(prg_bank+(a&0x1fffe));
d = (pm[0]<<16)|pm[1];
@ -595,7 +596,6 @@ static u32 PicoReadM68k32(u32 a)
// -----------------------------------------------------------------
// Write Ram
#ifdef _ASM_CD_MEMORY_C
void PicoWriteM68k8(u32 a,u8 d);
@ -617,7 +617,7 @@ static void PicoWriteM68k8(u32 a,u8 d)
a&=0xffffff;
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&3)!=1) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
*(u8 *)(prg_bank+((a^1)&0x1ffff))=d;
return;
@ -668,7 +668,7 @@ static void PicoWriteM68k16(u32 a,u16 d)
a&=0xfffffe;
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&3)!=1) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
wrdprintf("m68k_prgram w16: [%i,%06x] %04x @%06x", Pico_mcd->s68k_regs[3]>>6, a, d, SekPc);
*(u16 *)(prg_bank+(a&0x1fffe))=d;
@ -734,7 +734,7 @@ static void PicoWriteM68k32(u32 a,u32 d)
a&=0xfffffe;
// prg RAM
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&2)) {
if ((a&0xfe0000)==0x020000 && (Pico_mcd->m.busreq&3)!=1) {
u8 *prg_bank = Pico_mcd->prg_ram_b[Pico_mcd->s68k_regs[3]>>6];
u16 *pm=(u16 *)(prg_bank+(a&0x1fffe));
pm[0]=(u16)(d>>16); pm[1]=(u16)d;
@ -777,6 +777,8 @@ static void PicoWriteM68k32(u32 a,u32 d)
#endif
// -----------------------------------------------------------------
// S68k
// -----------------------------------------------------------------
#ifdef _ASM_CD_MEMORY_C
@ -1139,7 +1141,7 @@ static void PicoWriteS68k8(u32 a,u8 d)
// prg RAM
if (a < 0x80000) {
u8 *pm=(u8 *)(Pico_mcd->prg_ram+(a^1));
*pm=d;
if (a >= (Pico_mcd->s68k_regs[2]<<8)) *pm=d;
return;
}
@ -1215,7 +1217,8 @@ static void PicoWriteS68k16(u32 a,u16 d)
// prg RAM
if (a < 0x80000) {
wrdprintf("s68k_prgram w16: [%06x] %04x @%06x", a, d, SekPcS68k);
*(u16 *)(Pico_mcd->prg_ram+a)=d;
if (a >= (Pico_mcd->s68k_regs[2]<<8)) // needed for Dungeon Explorer
*(u16 *)(Pico_mcd->prg_ram+a)=d;
return;
}
@ -1299,8 +1302,10 @@ static void PicoWriteS68k32(u32 a,u32 d)
// prg RAM
if (a < 0x80000) {
u16 *pm=(u16 *)(Pico_mcd->prg_ram+a);
pm[0]=(u16)(d>>16); pm[1]=(u16)d;
if (a >= (Pico_mcd->s68k_regs[2]<<8)) {
u16 *pm=(u16 *)(Pico_mcd->prg_ram+a);
pm[0]=(u16)(d>>16); pm[1]=(u16)d;
}
return;
}

View file

@ -390,7 +390,8 @@ m_m68k_read8_prgbank:
orr r3, r2, #0x002200
ldr r3, [r1, r3]
ldr r2, [r1, r2]
tst r3, #0x00020000 @ have bus?
and r3, r3, #0x00030000
cmp r3, #0x00010000 @ have bus or in reset state?
moveq r0, #0
bxeq lr
and r2, r2, #0xc0000000 @ r3 & 0xC0
@ -596,7 +597,8 @@ m_m68k_read16_prgbank:
orr r3, r2, #0x002200
ldr r3, [r1, r3]
ldr r2, [r1, r2]
tst r3, #0x00020000 @ have bus?
and r3, r3, #0x00030000
cmp r3, #0x00010000 @ have bus or in reset state?
moveq r0, #0
bxeq lr
and r2, r2, #0xc0000000 @ r3 & 0xC0
@ -766,7 +768,8 @@ m_m68k_read32_prgbank:
orr r3, r2, #0x002200
ldr r3, [r1, r3]
ldr r2, [r1, r2]
tst r3, #0x00020000 @ have bus?
and r3, r3, #0x00030000
cmp r3, #0x00010000 @ have bus or in reset state?
moveq r0, #0
bxeq lr
and r2, r2, #0xc0000000 @ r3 & 0xC0
@ -924,7 +927,8 @@ m_m68k_write8_prgbank:
orr r3, r12, #0x002200
ldr r3, [r2, r3]
ldr r12,[r2, r12]
tst r3, #0x00020000 @ have bus?
and r3, r3, #0x00030000
cmp r3, #0x00010000 @ have bus or in reset state?
bxeq lr
and r12,r12,#0xc0000000 @ r3 & 0xC0
add r2, r2, r12, lsr #12
@ -1027,7 +1031,8 @@ m_m68k_write16_prgbank:
orr r3, r12, #0x002200
ldr r3, [r2, r3]
ldr r12,[r2, r12]
tst r3, #0x00020000 @ have bus?
and r3, r3, #0x00030000
cmp r3, #0x00010000 @ have bus or in reset state?
bxeq lr
and r12,r12,#0xc0000000 @ r3 & 0xC0
add r2, r2, r12, lsr #12
@ -1159,7 +1164,8 @@ m_m68k_write32_prgbank:
orr r3, r12, #0x002200
ldr r3, [r2, r3]
ldr r12,[r2, r12]
tst r3, #0x00020000 @ have bus?
and r3, r3, #0x00030000
cmp r3, #0x00010000 @ have bus or in reset state?
bxeq lr
and r12,r12,#0xc0000000 @ r3 & 0xC0
add r2, r2, r12, lsr #12
@ -1687,6 +1693,18 @@ m_s68k_read32_regs_gfx:
m_s68k_write8_prg: @ 0x000000 - 0x07ffff
ldr r2, =(Pico+0x22200)
eor r0, r0, #1
ldr r2, [r2]
add r3, r0, #0x020000 @ map to our address
add r12,r2, #0x110000
ldr r12,[r12]
and r12,r12,#0x00ff0000 @ wp
cmp r0, r12, lsr #8
strgeb r1, [r2, r3]
bx lr
m_s68k_write8_wordram_2M: @ 0x080000 - 0x0bffff
m_s68k_write8_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
m_s68k_write8_ram 0x020000
@ -1837,6 +1855,18 @@ m_s68k_write8_regs:
m_s68k_write16_prg: @ 0x000000 - 0x07ffff
ldr r2, =(Pico+0x22200)
bic r0, r0, #1
ldr r2, [r2]
add r3, r0, #0x020000 @ map to our address
add r12,r2, #0x110000
ldr r12,[r12]
and r12,r12,#0x00ff0000 @ wp
cmp r0, r12, lsr #8
strgeh r1, [r2, r3]
bx lr
m_s68k_write16_wordram_2M: @ 0x080000 - 0x0bffff
m_s68k_write16_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
m_s68k_write16_ram 0x020000
@ -2010,6 +2040,21 @@ m_s68k_write16_regs_spec: @ special case
m_s68k_write32_prg: @ 0x000000 - 0x07ffff
ldr r2, =(Pico+0x22200)
bic r0, r0, #1
ldr r2, [r2]
add r3, r0, #0x020000 @ map to our address
add r12,r2, #0x110000
ldr r12,[r12]
and r12,r12,#0x00ff0000 @ wp
cmp r0, r12, lsr #8
bxlt lr
mov r0, r1, lsr #16
strh r0, [r2, r3]!
strh r1, [r2, #2]
bx lr
m_s68k_write32_wordram_2M: @ 0x080000 - 0x0bffff
m_s68k_write32_wordram_1M_b1: @ 0x0c0000 - 0x0dffff, maps to 0x0e0000
m_s68k_write32_ram 0x020000

View file

@ -14,6 +14,8 @@
extern unsigned char formatted_bram[4*0x10];
extern unsigned int s68k_poll_adclk;
void (*PicoMCDopenTray)(void) = NULL;
int (*PicoMCDcloseTray)(void) = NULL;
#define dump_ram(ram,fname) \
{ \

View file

@ -209,7 +209,7 @@ void Reset_CD(void)
Pico_mcd->scd.Cur_Track = 0;
Pico_mcd->scd.Cur_LBA = -150;
Pico_mcd->scd.Status_CDC &= ~1;
Pico_mcd->scd.Status_CDD = READY;
Pico_mcd->scd.Status_CDD = CD_Present ? READY : NOCD;
Pico_mcd->scd.CDD_Complete = 0;
Pico_mcd->scd.File_Add_Delay = 0;
}
@ -223,12 +223,15 @@ int Insert_CD(char *iso_name, int is_bin)
// memset(CD_Audio_Buffer_R, 0, 4096 * 4);
CD_Present = 0;
Pico_mcd->scd.Status_CDD = NOCD;
if (iso_name != NULL)
{
ret = Load_ISO(iso_name, is_bin);
if (ret == 0)
if (ret == 0) {
CD_Present = 1;
Pico_mcd->scd.Status_CDD = READY;
}
}
return ret;
@ -671,31 +674,23 @@ int Fast_Rewind_CDD_c9(void)
int Close_Tray_CDD_cC(void)
{
CD_Present = 0;
//Clear_Sound_Buffer();
Pico_mcd->scd.Status_CDC &= ~1; // Stop CDC read
{
#if 0 // TODO
char new_iso[1024];
printf("tray close\n");
memset(new_iso, 0, 1024);
if (PicoMCDcloseTray != NULL)
CD_Present = PicoMCDcloseTray();
while (!Change_File_L(new_iso, Rom_Dir, "Load SegaCD image file", "SegaCD image file\0*.bin;*.iso;*.raw\0All files\0*.*\0\0", ""));
Reload_SegaCD(new_iso);
Pico_mcd->scd.Status_CDD = CD_Present ? STOPPED : NOCD;
Pico_mcd->cdd.Status = 0x0000;
CD_Present = 1;
#else
CD_Present = 0;
#endif
Pico_mcd->scd.Status_CDD = STOPPED;
Pico_mcd->cdd.Status = 0x0000;
Pico_mcd->cdd.Minute = 0;
Pico_mcd->cdd.Seconde = 0;
Pico_mcd->cdd.Frame = 0;
Pico_mcd->cdd.Ext = 0;
}
Pico_mcd->cdd.Minute = 0;
Pico_mcd->cdd.Seconde = 0;
Pico_mcd->cdd.Frame = 0;
Pico_mcd->cdd.Ext = 0;
Pico_mcd->scd.CDD_Complete = 1;
@ -709,9 +704,14 @@ int Open_Tray_CDD_cD(void)
Pico_mcd->scd.Status_CDC &= ~1; // Stop CDC read
printf("tray open\n");
Unload_ISO();
CD_Present = 0;
if (PicoMCDopenTray != NULL)
PicoMCDopenTray();
Pico_mcd->scd.Status_CDD = TRAY_OPEN;
Pico_mcd->cdd.Status = 0x0E00;
@ -760,193 +760,3 @@ int CDD_Def(void)
}
/***************************
* Others CD functions *
**************************/
// do we need them?
#if 0
void Write_CD_Audio(short *Buf, int rate, int channel, int lenght)
{
unsigned int lenght_src, lenght_dst;
unsigned int pos_src, pas_src;
if (rate == 0) return;
if (Sound_Rate == 0) return;
if (CD_Audio_Starting)
{
CD_Audio_Starting = 0;
memset(CD_Audio_Buffer_L, 0, 4096 * 4);
memset(CD_Audio_Buffer_R, 0, 4096 * 4);
CD_Audio_Buffer_Write_Pos = (CD_Audio_Buffer_Read_Pos + 2000) & 0xFFF;
}
lenght_src = rate / 75; // 75th of a second
lenght_dst = Sound_Rate / 75; // 75th of a second
pas_src = (lenght_src << 16) / lenght_dst;
pos_src = 0;
#ifdef DEBUG_CD
fprintf(debug_SCD_file, "\n********* Write Pos = %d ", CD_Audio_Buffer_Write_Pos);
#endif
if (channel == 2)
{
__asm
{
mov edi, CD_Audio_Buffer_Write_Pos
mov ebx, Buf
xor esi, esi
mov ecx, lenght_dst
xor eax, eax
mov edx, pas_src
dec ecx
jmp short loop_stereo
align 16
loop_stereo:
movsx eax, word ptr [ebx + esi * 4]
mov CD_Audio_Buffer_L[edi * 4], eax
movsx eax, word ptr [ebx + esi * 4 + 2]
mov CD_Audio_Buffer_R[edi * 4], eax
mov esi, dword ptr pos_src
inc edi
add esi, edx
and edi, 0xFFF
mov dword ptr pos_src, esi
shr esi, 16
dec ecx
jns short loop_stereo
mov CD_Audio_Buffer_Write_Pos, edi
}
}
else
{
__asm
{
mov edi, CD_Audio_Buffer_Write_Pos
mov ebx, Buf
xor esi, esi
mov ecx, lenght_dst
xor eax, eax
mov edx, pas_src
dec ecx
jmp short loop_mono
align 16
loop_mono:
movsx eax, word ptr [ebx + esi * 2]
mov CD_Audio_Buffer_L[edi * 4], eax
mov CD_Audio_Buffer_R[edi * 4], eax
mov esi, dword ptr pos_src
inc edi
add esi, edx
and edi, 0xFFF
mov dword ptr pos_src, esi
shr esi, 16
dec ecx
jns short loop_mono
mov CD_Audio_Buffer_Write_Pos, edi
}
}
#ifdef DEBUG_CD
fprintf(debug_SCD_file, "Write Pos 2 = %d\n\n", CD_Audio_Buffer_Write_Pos);
#endif
}
void Update_CD_Audio(int **buf, int lenght)
{
int *Buf_L, *Buf_R;
int diff;
Buf_L = buf[0];
Buf_R = buf[1];
if (Pico_mcd->s68k_regs[0x36] & 0x01) return;
if (!(Pico_mcd->scd.Status_CDC & 1)) return;
if (CD_Audio_Starting) return;
#ifdef DEBUG_CD
fprintf(debug_SCD_file, "\n********* Read Pos Normal = %d ", CD_Audio_Buffer_Read_Pos);
#endif
if (CD_Audio_Buffer_Write_Pos < CD_Audio_Buffer_Read_Pos)
{
diff = CD_Audio_Buffer_Write_Pos + (4096) - CD_Audio_Buffer_Read_Pos;
}
else
{
diff = CD_Audio_Buffer_Write_Pos - CD_Audio_Buffer_Read_Pos;
}
if (diff < 500) CD_Audio_Buffer_Read_Pos -= 2000;
else if (diff > 3500) CD_Audio_Buffer_Read_Pos += 2000;
#ifdef DEBUG_CD
else fprintf(debug_SCD_file, " pas de modifs ");
#endif
CD_Audio_Buffer_Read_Pos &= 0xFFF;
#ifdef DEBUG_CD
fprintf(debug_SCD_file, "Read Pos = %d ", CD_Audio_Buffer_Read_Pos);
#endif
if (CDDA_Enable)
{
__asm
{
mov ecx, lenght
mov esi, CD_Audio_Buffer_Read_Pos
mov edi, Buf_L
dec ecx
loop_L:
mov eax, CD_Audio_Buffer_L[esi * 4]
add [edi], eax
inc esi
add edi, 4
and esi, 0xFFF
dec ecx
jns short loop_L
mov ecx, lenght
mov esi, CD_Audio_Buffer_Read_Pos
mov edi, Buf_R
dec ecx
loop_R:
mov eax, CD_Audio_Buffer_R[esi * 4]
add [edi], eax
inc esi
add edi, 4
and esi, 0xFFF
dec ecx
jns short loop_R
mov CD_Audio_Buffer_Read_Pos, esi
}
}
else
{
CD_Audio_Buffer_Read_Pos += lenght;
CD_Audio_Buffer_Read_Pos &= 0xFFF;
}
#ifdef DEBUG_CD
fprintf(debug_SCD_file, "Read Pos 2 = %d\n\n", CD_Audio_Buffer_Read_Pos);
#endif
}
#endif