cen64/rdp/interface.c
Tyler J. Stachecki 61afc41641 Ignore DP freeze setting.
Thanks to simer and Happy for pointing out something that
also cropped up in MAME: http://forums.bannister.org/
ubbthreads.php?ubb=showflat&Number=94626#Post94626

This hack fixes Banjo-Kazooie.
2016-06-19 10:24:42 -04:00

85 lines
2.3 KiB
C

//
// rdp/interface.c: RDP interface.
//
// CEN64: Cycle-Accurate Nintendo 64 Emulator.
// Copyright (C) 2015, Tyler J. Stachecki.
//
// This file is subject to the terms and conditions defined in
// 'LICENSE', which is part of this source code package.
//
#include "common.h"
#include "bus/address.h"
#include "rdp/cpu.h"
#include "rdp/interface.h"
#define DP_XBUS_DMEM_DMA 0x00000001
#define DP_FREEZE 0x00000002
#define DP_FLUSH 0x00000004
#define DP_CLEAR_XBUS_DMEM_DMA 0x00000001
#define DP_SET_XBUS_DMEM_DMA 0x00000002
#define DP_CLEAR_FREEZE 0x00000004
#define DP_SET_FREEZE 0x00000008
#define DP_CLEAR_FLUSH 0x00000010
#define DP_SET_FLUSH 0x00000020
void rdp_process_list(void);
// Reads a word from the DP MMIO register space.
int read_dp_regs(void *opaque, uint32_t address, uint32_t *word) {
struct rdp *rdp = (struct rdp *) opaque;
uint32_t offset = address - DP_REGS_BASE_ADDRESS;
enum dp_register reg = (offset >> 2);
*word = rdp->regs[reg];
debug_mmio_read(dp, dp_register_mnemonics[reg], *word);
return 0;
}
// Writes a word to the DP MMIO register space.
int write_dp_regs(void *opaque, uint32_t address, uint32_t word, uint32_t dqm) {
struct rdp *rdp = (struct rdp *) opaque;
uint32_t offset = address - DP_REGS_BASE_ADDRESS;
enum dp_register reg = (offset >> 2);
debug_mmio_write(dp, dp_register_mnemonics[reg], word, dqm);
switch (reg) {
case DPC_START_REG:
rdp->regs[DPC_CURRENT_REG] = word;
rdp->regs[DPC_START_REG] = word;
break;
case DPC_END_REG:
rdp->regs[DPC_END_REG] = word;
rdp_process_list();
break;
case DPC_STATUS_REG:
if (word & DP_CLEAR_XBUS_DMEM_DMA)
rdp->regs[DPC_STATUS_REG] &= ~DP_XBUS_DMEM_DMA;
else if (word & DP_SET_XBUS_DMEM_DMA)
rdp->regs[DPC_STATUS_REG] |= DP_XBUS_DMEM_DMA;
if (word & DP_CLEAR_FREEZE)
rdp->regs[DPC_STATUS_REG] &= ~DP_FREEZE;
// else if (word & DP_SET_FREEZE)
// rdp->regs[DPC_STATUS_REG] |= DP_FREEZE;
if (word & DP_CLEAR_FLUSH)
rdp->regs[DPC_STATUS_REG] &= ~DP_FLUSH;
else if (word & DP_SET_FLUSH)
rdp->regs[DPC_STATUS_REG] |= DP_FLUSH;
break;
default:
rdp->regs[reg] &= ~dqm;
rdp->regs[reg] |= word;
break;
}
return 0;
}