Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alexbevi
GitHub Repository: alexbevi/BizHawk
Path: blob/master/libsnes/bsnes/snes/chip/armdsp/memory.cpp
2 views
1
#ifdef ARMDSP_CPP
2
3
uint8 ArmDSP::bus_read(uint32 addr) {
4
switch(addr & 0xe0000000) {
5
case 0x00000000: return programROM[addr & 0x0001ffff];
6
case 0x20000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);
7
case 0x40000000: break; //MMIO
8
case 0x60000000: return 0x40404001 >> ((addr & 3) << 3);
9
case 0x80000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);
10
case 0xa0000000: return dataROM[addr & 0x00007fff];
11
case 0xc0000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);
12
case 0xe0000000: return programRAM[addr & 0x00003fff];
13
}
14
15
addr &= 0xe000003f;
16
17
if(addr == 0x40000010) {
18
if(bridge.cputoarm.ready) {
19
bridge.cputoarm.ready = false;
20
return bridge.cputoarm.data;
21
}
22
}
23
24
if(addr == 0x40000020) {
25
return bridge.status();
26
}
27
28
return 0x00;
29
}
30
31
void ArmDSP::bus_write(uint32 addr, uint8 data) {
32
switch(addr & 0xe0000000) {
33
case 0x40000000: break; //MMIO
34
case 0xe0000000: programRAM[addr & 0x00003fff] = data; return;
35
default: return;
36
}
37
38
addr &= 0xe000003f;
39
40
if(addr == 0x40000000) {
41
bridge.armtocpu.ready = true;
42
bridge.armtocpu.data = data;
43
return;
44
}
45
46
if(addr == 0x40000020) bridge.timerlatch = (bridge.timerlatch & 0xffff00) | (data << 0);
47
if(addr == 0x40000024) bridge.timerlatch = (bridge.timerlatch & 0xff00ff) | (data << 8);
48
if(addr == 0x40000028) bridge.timerlatch = (bridge.timerlatch & 0x00ffff) | (data << 16);
49
50
if(addr == 0x40000028) {
51
bridge.timer = bridge.timerlatch;
52
bridge.busy = !bridge.timer;
53
}
54
}
55
56
uint32 ArmDSP::bus_readbyte(uint32 addr) {
57
tick();
58
return bus_read(addr);
59
}
60
61
void ArmDSP::bus_writebyte(uint32 addr, uint32 data) {
62
tick();
63
return bus_write(addr, data);
64
}
65
66
uint32 ArmDSP::bus_readword(uint32 addr) {
67
tick();
68
addr &= ~3;
69
return (
70
(bus_read(addr + 0) << 0)
71
| (bus_read(addr + 1) << 8)
72
| (bus_read(addr + 2) << 16)
73
| (bus_read(addr + 3) << 24)
74
);
75
}
76
77
void ArmDSP::bus_writeword(uint32 addr, uint32 data) {
78
tick();
79
addr &= ~3;
80
bus_write(addr + 0, data >> 0);
81
bus_write(addr + 1, data >> 8);
82
bus_write(addr + 2, data >> 16);
83
bus_write(addr + 3, data >> 24);
84
}
85
86
#endif
87
88