1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
|
//
// 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;
}
|