Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/hitachidsp/memory.cpp
2 views
1
#ifdef HITACHIDSP_CPP
2
3
uint8 HitachiDSP::bus_read(unsigned addr) {
4
if((addr & 0x408000) == 0x008000) return bus.read(addr);
5
return 0x00;
6
}
7
8
void HitachiDSP::bus_write(unsigned addr, uint8 data) {
9
if((addr & 0x40e000) == 0x006000) return bus.write(addr, data);
10
}
11
12
uint8 HitachiDSP::rom_read(unsigned addr) {
13
if(co_active() == cpu.thread) {
14
if(state == State::Idle) return cartridge.rom.read(addr);
15
if((addr & 0x40ffe0) == 0x00ffe0) return regs.vector[addr & 0x1f];
16
return cpu.regs.mdr;
17
}
18
if(co_active() == hitachidsp.thread) {
19
return cartridge.rom.read(addr);
20
}
21
return cpu.regs.mdr;
22
}
23
24
void HitachiDSP::rom_write(unsigned addr, uint8 data) {
25
}
26
27
uint8 HitachiDSP::dsp_read(unsigned addr) {
28
addr &= 0x1fff;
29
30
//Data RAM
31
if((addr >= 0x0000 && addr <= 0x0bff) || (addr >= 0x1000 && addr <= 0x1bff)) {
32
return dataRAM[addr & 0x0fff];
33
}
34
35
//MMIO
36
switch(addr) {
37
case 0x1f40: return regs.dma_source >> 0;
38
case 0x1f41: return regs.dma_source >> 8;
39
case 0x1f42: return regs.dma_source >> 16;
40
case 0x1f43: return regs.dma_length >> 0;
41
case 0x1f44: return regs.dma_length >> 8;
42
case 0x1f45: return regs.dma_target >> 0;
43
case 0x1f46: return regs.dma_target >> 8;
44
case 0x1f47: return regs.dma_target >> 16;
45
case 0x1f48: return regs.r1f48;
46
case 0x1f49: return regs.program_offset >> 0;
47
case 0x1f4a: return regs.program_offset >> 8;
48
case 0x1f4b: return regs.program_offset >> 16;
49
case 0x1f4c: return regs.r1f4c;
50
case 0x1f4d: return regs.page_number >> 0;
51
case 0x1f4e: return regs.page_number >> 8;
52
case 0x1f4f: return regs.program_counter;
53
case 0x1f50: return regs.r1f50;
54
case 0x1f51: return regs.r1f51;
55
case 0x1f52: return regs.r1f52;
56
case 0x1f53: case 0x1f54: case 0x1f55: case 0x1f56:
57
case 0x1f57: case 0x1f58: case 0x1f59: case 0x1f5a:
58
case 0x1f5b: case 0x1f5c: case 0x1f5d: case 0x1f5e:
59
case 0x1f5f: return ((state != State::Idle) << 6) | ((state == State::Idle) << 1);
60
}
61
62
//Vector
63
if(addr >= 0x1f60 && addr <= 0x1f7f) {
64
return regs.vector[addr & 0x1f];
65
}
66
67
//GPRs
68
if((addr >= 0x1f80 && addr <= 0x1faf) || (addr >= 0x1fc0 && addr <= 0x1fef)) {
69
unsigned index = (addr & 0x3f) / 3; //0..15
70
unsigned shift = ((addr & 0x3f) % 3) * 8; //0, 8, 16
71
return regs.gpr[index] >> shift;
72
}
73
74
return 0x00;
75
}
76
77
void HitachiDSP::dsp_write(unsigned addr, uint8 data) {
78
addr &= 0x1fff;
79
80
//Data RAM
81
if((addr >= 0x0000 && addr <= 0x0bff) || (addr >= 0x1000 && addr <= 0x1bff)) {
82
dataRAM[addr & 0x0fff] = data;
83
return;
84
}
85
86
//MMIO
87
switch(addr) {
88
case 0x1f40: regs.dma_source = (regs.dma_source & 0xffff00) | (data << 0); return;
89
case 0x1f41: regs.dma_source = (regs.dma_source & 0xff00ff) | (data << 8); return;
90
case 0x1f42: regs.dma_source = (regs.dma_source & 0x00ffff) | (data << 16); return;
91
case 0x1f43: regs.dma_length = (regs.dma_length & 0xff00) | (data << 0); return;
92
case 0x1f44: regs.dma_length = (regs.dma_length & 0x00ff) | (data << 8); return;
93
case 0x1f45: regs.dma_target = (regs.dma_target & 0xffff00) | (data << 0); return;
94
case 0x1f46: regs.dma_target = (regs.dma_target & 0xff00ff) | (data << 8); return;
95
case 0x1f47: regs.dma_target = (regs.dma_target & 0x00ffff) | (data << 16);
96
if(state == State::Idle) state = State::DMA;
97
return;
98
case 0x1f48: regs.r1f48 = data & 0x01; return;
99
case 0x1f49: regs.program_offset = (regs.program_offset & 0xffff00) | (data << 0); return;
100
case 0x1f4a: regs.program_offset = (regs.program_offset & 0xff00ff) | (data << 8); return;
101
case 0x1f4b: regs.program_offset = (regs.program_offset & 0x00ffff) | (data << 16); return;
102
case 0x1f4c: regs.r1f4c = data & 0x03; return;
103
case 0x1f4d: regs.page_number = (regs.page_number & 0x7f00) | ((data & 0xff) << 0); return;
104
case 0x1f4e: regs.page_number = (regs.page_number & 0x00ff) | ((data & 0x7f) << 8); return;
105
case 0x1f4f: regs.program_counter = data;
106
if(state == State::Idle) {
107
regs.pc = regs.page_number * 256 + regs.program_counter;
108
state = State::Execute;
109
}
110
return;
111
case 0x1f50: regs.r1f50 = data & 0x77; return;
112
case 0x1f51: regs.r1f51 = data & 0x01; return;
113
case 0x1f52: regs.r1f52 = data & 0x01; return;
114
}
115
116
//Vector
117
if(addr >= 0x1f60 && addr <= 0x1f7f) {
118
regs.vector[addr & 0x1f] = data;
119
return;
120
}
121
122
//GPRs
123
if((addr >= 0x1f80 && addr <= 0x1faf) || (addr >= 0x1fc0 && addr <= 0x1fef)) {
124
unsigned index = (addr & 0x3f) / 3;
125
switch((addr & 0x3f) % 3) {
126
case 0: regs.gpr[index] = (regs.gpr[index] & 0xffff00) | (data << 0); return;
127
case 1: regs.gpr[index] = (regs.gpr[index] & 0xff00ff) | (data << 8); return;
128
case 2: regs.gpr[index] = (regs.gpr[index] & 0x00ffff) | (data << 16); return;
129
}
130
}
131
}
132
133
#endif
134
135