better completely wrong cd timings, fix some bad risc opcodes, fixes FMVs in jag cd games

This commit is contained in:
CasualPokePlayer 2022-09-26 21:49:33 -07:00
parent b84ef509ec
commit 94bb881d00
5 changed files with 29 additions and 41 deletions

Binary file not shown.

View File

@ -111,7 +111,7 @@ void CDHLEInit(void)
cd_boot_lba = startLba + i;
cd_boot_off = j + 32 + 4 + 4;
cd_byte_swapped = false;
cd_word_alignment = (4 - j) & 3;
cd_word_alignment = -j & 3;
foundHeader = true;
break;
}
@ -124,7 +124,7 @@ void CDHLEInit(void)
cd_boot_lba = startLba + i;
cd_boot_off = j + 32 + 4 + 4;
cd_byte_swapped = true;
cd_word_alignment = (4 - j) & 3;
cd_word_alignment = -j & 3;
foundHeader = true;
break;
}
@ -244,10 +244,10 @@ static void CDSendBlock(void)
cd_buf_rm += 2352;
}
// send one block of data
for (uint32_t i = 0; i < 64; i++)
// send one block of data, one long at a time
for (uint32_t i = 0; i < 64; i += 4)
{
JaguarWriteByte(cd_read_addr_start + i, cd_buf2352[cd_buf_pos + i], GPU);
GPUWriteLong(cd_read_addr_start + i, GET32(cd_buf2352, cd_buf_pos + i), GPU);
}
cd_read_addr_start += 64;
@ -258,8 +258,7 @@ static void CDSendBlock(void)
{
cd_is_reading = false;
}
if (cd_buf_circular_size && (cd_read_addr_end - cd_read_addr_start) >= cd_buf_circular_size)
else if (cd_buf_circular_size && (cd_read_addr_start - cd_read_orig_addr_start) >= cd_buf_circular_size)
{
cd_read_addr_start = cd_read_orig_addr_start;
}
@ -270,12 +269,15 @@ static void CDHLECallback(void)
RemoveCallback(CDHLECallback);
if (cd_is_reading)
{
if (!cd_paused)
if (!GPURunning())
fprintf(stderr, "CDHLECallback called with GPU inactive\n");
if (GPURunning() && !cd_paused)
{
CDSendBlock();
//GPUSetIRQLine(GPUIRQ_DSP, ASSERT_LINE);
}
//GPUSetIRQLine(GPUIRQ_DSP, ASSERT_LINE);
SetCallbackTime(CDHLECallback, 240 >> (cd_mode & 1));
SetCallbackTime(CDHLECallback, 285 >> (cd_mode & 1));
}
}
@ -366,14 +368,6 @@ static void CD_mode(void)
static void CD_ack(void)
{
if (!cd_paused)
{
while (cd_is_reading)
{
CDSendBlock();
}
}
NO_ERR();
}
@ -521,8 +515,9 @@ static void CD_read(void)
cd_buf_rm = bufRm;
cd_buf_circular_size = circBufSz ? (1 << circBufSz) : 0;
RemoveCallback(CDHLECallback);
SetCallbackTime(CDHLECallback, 240 >> (cd_mode & 1));
SetCallbackTime(CDHLECallback, 285 >> (cd_mode & 1));
JERRYWriteWord(0xF10020, 0, M68K);
//GPUWriteLong(0xF02100, GPUReadLong(0xF02100, M68K) | 0x20, M68K);
break;
}
}
@ -542,8 +537,9 @@ static void CD_read(void)
cd_buf_rm = 0;
cd_buf_circular_size = 0;
RemoveCallback(CDHLECallback);
SetCallbackTime(CDHLECallback, 240 >> (cd_mode & 1));
SetCallbackTime(CDHLECallback, 285 >> (cd_mode & 1));
JERRYWriteWord(0xF10020, 0, M68K);
//GPUWriteLong(0xF02100, GPUReadLong(0xF02100, M68K) | 0x20, M68K);
}
}

View File

@ -784,7 +784,7 @@ static void dsp_opcode_nop(void)
static void dsp_opcode_storeb(void)
{
if (RM >= DSP_WORK_RAM_BASE && RM <= (DSP_WORK_RAM_BASE + 0x1FFF))
DSPWriteLong(RM, RN & 0xFF, DSP);
DSPWriteLong(RM & 0xFFFFFFFC, RN, DSP);
else
JaguarWriteByte(RM, RN, DSP);
}
@ -792,7 +792,7 @@ static void dsp_opcode_storeb(void)
static void dsp_opcode_storew(void)
{
if (RM >= DSP_WORK_RAM_BASE && RM <= (DSP_WORK_RAM_BASE + 0x1FFF))
DSPWriteLong(RM, RN & 0xFFFF, DSP);
DSPWriteLong(RM & 0xFFFFFFFC, RN, DSP);
else
JaguarWriteWord(RM, RN, DSP);
}
@ -805,7 +805,7 @@ static void dsp_opcode_store(void)
static void dsp_opcode_loadb(void)
{
if (RM >= DSP_WORK_RAM_BASE && RM <= (DSP_WORK_RAM_BASE + 0x1FFF))
RN = DSPReadLong(RM, DSP) & 0xFF;
RN = DSPReadLong(RM & 0xFFFFFFFC, DSP);
else
RN = JaguarReadByte(RM, DSP);
}
@ -813,7 +813,7 @@ static void dsp_opcode_loadb(void)
static void dsp_opcode_loadw(void)
{
if (RM >= DSP_WORK_RAM_BASE && RM <= (DSP_WORK_RAM_BASE + 0x1FFF))
RN = DSPReadLong(RM & 0xFFFFFFFE, DSP) & 0xFFFF;
RN = DSPReadLong(RM & 0xFFFFFFFC, DSP);
else
RN = JaguarReadWord(RM & 0xFFFFFFFE, DSP);
}

View File

@ -216,9 +216,9 @@ uint32_t gpu_convert_zero[32] =
uint8_t * branch_condition_table = 0;
#define BRANCH_CONDITION(x) branch_condition_table[(x) + ((jaguar_flags & 7) << 5)]
uint32_t GPUGetPC(void)
bool GPURunning(void)
{
return gpu_pc;
return GPU_RUNNING;
}
void build_branch_condition_table(void)
@ -609,11 +609,6 @@ void GPUReset(void)
*((uint32_t *)(&gpu_ram_8[i])) = rand();
}
uint32_t GPUReadPC(void)
{
return gpu_pc;
}
void GPUDone(void)
{
}
@ -865,7 +860,7 @@ static void gpu_opcode_pack(void)
static void gpu_opcode_storeb(void)
{
if ((RM >= 0xF03000) && (RM <= 0xF03FFF))
GPUWriteLong(RM, RN & 0xFF, GPU);
GPUWriteLong(RM & 0xFFFFFFFC, RN, GPU);
else
JaguarWriteByte(RM, RN, GPU);
}
@ -873,7 +868,7 @@ static void gpu_opcode_storeb(void)
static void gpu_opcode_storew(void)
{
if ((RM >= 0xF03000) && (RM <= 0xF03FFF))
GPUWriteLong(RM & 0xFFFFFFFE, RN & 0xFFFF, GPU);
GPUWriteLong(RM & 0xFFFFFFFC, RN, GPU);
else
JaguarWriteWord(RM, RN, GPU);
}
@ -890,8 +885,7 @@ static void gpu_opcode_storep(void)
{
if ((RM >= 0xF03000) && (RM <= 0xF03FFF))
{
GPUWriteLong((RM & 0xFFFFFFF8) + 0, gpu_hidata, GPU);
GPUWriteLong((RM & 0xFFFFFFF8) + 4, RN, GPU);
GPUWriteLong(RM & 0xFFFFFFFC, RN, GPU);
}
else
{
@ -903,7 +897,7 @@ static void gpu_opcode_storep(void)
static void gpu_opcode_loadb(void)
{
if ((RM >= 0xF03000) && (RM <= 0xF03FFF))
RN = GPUReadLong(RM, GPU) & 0xFF;
RN = GPUReadLong(RM & 0xFFFFFFFC, GPU);
else
RN = JaguarReadByte(RM, GPU);
}
@ -911,7 +905,7 @@ static void gpu_opcode_loadb(void)
static void gpu_opcode_loadw(void)
{
if ((RM >= 0xF03000) && (RM <= 0xF03FFF))
RN = GPUReadLong(RM & 0xFFFFFFFE, GPU) & 0xFFFF;
RN = GPUReadLong(RM & 0xFFFFFFFC, GPU);
else
RN = JaguarReadWord(RM, GPU);
}
@ -925,8 +919,7 @@ static void gpu_opcode_loadp(void)
{
if ((RM >= 0xF03000) && (RM <= 0xF03FFF))
{
gpu_hidata = GPUReadLong((RM & 0xFFFFFFF8) + 0, GPU);
RN = GPUReadLong((RM & 0xFFFFFFF8) + 4, GPU);
RN = GPUReadLong(RM & 0xFFFFFFFC, GPU);
}
else
{

View File

@ -25,8 +25,7 @@ void GPUWriteByte(uint32_t offset, uint8_t data, uint32_t who = UNKNOWN);
void GPUWriteWord(uint32_t offset, uint16_t data, uint32_t who = UNKNOWN);
void GPUWriteLong(uint32_t offset, uint32_t data, uint32_t who = UNKNOWN);
uint32_t GPUGetPC(void);
uint32_t GPUReadPC(void);
bool GPURunning(void);
// GPU interrupt numbers (from $F00100, bits 4-8)