mirror of
https://github.com/RaySollium99/picodrive.git
synced 2025-09-06 15:48:05 -04:00
bugfixes, CD swap, autorepeat
git-svn-id: file:///home/notaz/opt/svn/PicoDrive@85 be3aeb3a-fb24-0410-a615-afba39da0efa
This commit is contained in:
parent
d915372968
commit
721cd3963f
17 changed files with 252 additions and 281 deletions
|
@ -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
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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) \
|
||||
{ \
|
||||
|
|
230
Pico/cd/cd_sys.c
230
Pico/cd/cd_sys.c
|
@ -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
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue