mirror of
https://github.com/n64dev/cen64.git
synced 2024-06-22 14:02:41 -04:00
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.
85 lines
2.3 KiB
C
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;
|
|
}
|
|
|