87 lines
2.1 KiB
C++
87 lines
2.1 KiB
C++
#ifdef ARMDSP_CPP
|
|
|
|
uint8 ArmDSP::bus_read(uint32 addr) {
|
|
switch(addr & 0xe0000000) {
|
|
case 0x00000000: return programROM[addr & 0x0001ffff];
|
|
case 0x20000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);
|
|
case 0x40000000: break; //MMIO
|
|
case 0x60000000: return 0x40404001 >> ((addr & 3) << 3);
|
|
case 0x80000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);
|
|
case 0xa0000000: return dataROM[addr & 0x00007fff];
|
|
case 0xc0000000: return pipeline.mdr.opcode >> ((addr & 3) << 3);
|
|
case 0xe0000000: return programRAM[addr & 0x00003fff];
|
|
}
|
|
|
|
addr &= 0xe000003f;
|
|
|
|
if(addr == 0x40000010) {
|
|
if(bridge.cputoarm.ready) {
|
|
bridge.cputoarm.ready = false;
|
|
return bridge.cputoarm.data;
|
|
}
|
|
}
|
|
|
|
if(addr == 0x40000020) {
|
|
return bridge.status();
|
|
}
|
|
|
|
return 0x00;
|
|
}
|
|
|
|
void ArmDSP::bus_write(uint32 addr, uint8 data) {
|
|
switch(addr & 0xe0000000) {
|
|
case 0x40000000: break; //MMIO
|
|
case 0xe0000000: programRAM[addr & 0x00003fff] = data; return;
|
|
default: return;
|
|
}
|
|
|
|
addr &= 0xe000003f;
|
|
|
|
if(addr == 0x40000000) {
|
|
bridge.armtocpu.ready = true;
|
|
bridge.armtocpu.data = data;
|
|
return;
|
|
}
|
|
|
|
if(addr == 0x40000020) bridge.timerlatch = (bridge.timerlatch & 0xffff00) | (data << 0);
|
|
if(addr == 0x40000024) bridge.timerlatch = (bridge.timerlatch & 0xff00ff) | (data << 8);
|
|
if(addr == 0x40000028) bridge.timerlatch = (bridge.timerlatch & 0x00ffff) | (data << 16);
|
|
|
|
if(addr == 0x40000028) {
|
|
bridge.timer = bridge.timerlatch;
|
|
bridge.busy = !bridge.timer;
|
|
}
|
|
}
|
|
|
|
uint32 ArmDSP::bus_readbyte(uint32 addr) {
|
|
tick();
|
|
return bus_read(addr);
|
|
}
|
|
|
|
void ArmDSP::bus_writebyte(uint32 addr, uint32 data) {
|
|
tick();
|
|
return bus_write(addr, data);
|
|
}
|
|
|
|
uint32 ArmDSP::bus_readword(uint32 addr) {
|
|
tick();
|
|
addr &= ~3;
|
|
return (
|
|
(bus_read(addr + 0) << 0)
|
|
| (bus_read(addr + 1) << 8)
|
|
| (bus_read(addr + 2) << 16)
|
|
| (bus_read(addr + 3) << 24)
|
|
);
|
|
}
|
|
|
|
void ArmDSP::bus_writeword(uint32 addr, uint32 data) {
|
|
tick();
|
|
addr &= ~3;
|
|
bus_write(addr + 0, data >> 0);
|
|
bus_write(addr + 1, data >> 8);
|
|
bus_write(addr + 2, data >> 16);
|
|
bus_write(addr + 3, data >> 24);
|
|
}
|
|
|
|
#endif
|