mirror of
https://github.com/bsnes-emu/bsnes.git
synced 2025-10-04 09:22:01 +02:00
- Major source code cleanup - Completely rewrote memory mapper to support runtime MMCs - Updated S-DD1 MMC to use new memory mapping interface - Improved S-DD1 emulation, thanks to information from orwannon - Added support for SameGame -- load via "Load Special -> Load BS-X Slotted Cart" menu option - Completely rewrote cartridge loader to support BS-X, BS-X slotted carts and ST carts - Created custom dialog windows for multicart loading - Improved generic memory mapper, which eliminates the need for cart.db [Nach] - Added BS-X slotted cart detection to generic memory mapper [Nach] - Linux port will now ignore keypresses when window is inactive - Linux port will use much less CPU power when idle - Added detailed compilation instructions to Makefile for Linux port - Added "make install" target and PNG program icon for Linux port - Switched Windows compiler to MinGW/GCC4 - Windows executable is now packed with UPX to decrease filesize - Removed .ufo, .gd7 and .078 ROM extensions; added .bs extension - Added preliminary support for the BS-X base unit, BS-X base cartridge + MMC, and BS-X flash I/O
122 lines
3.0 KiB
C++
122 lines
3.0 KiB
C++
/*****
|
|
* These 3 functions control bus timing for the CPU.
|
|
* cpu_io is an I/O cycle, and always 6 clock cycles long.
|
|
* mem_read / mem_write indicate memory access bus cycles.
|
|
* they are either 6, 8, or 12 bus cycles long, depending
|
|
* both on location and the $420d.d0 FastROM enable bit.
|
|
*****/
|
|
|
|
void sCPU::op_io() {
|
|
status.clock_count = 6;
|
|
precycle_edge();
|
|
add_clocks(6);
|
|
cycle_edge();
|
|
}
|
|
|
|
uint8 sCPU::op_read(uint32 addr) {
|
|
status.clock_count = bus.speed(addr);
|
|
precycle_edge();
|
|
add_clocks(status.clock_count - 4);
|
|
regs.mdr = bus.read(addr);
|
|
add_clocks(4);
|
|
cycle_edge();
|
|
return regs.mdr;
|
|
}
|
|
|
|
void sCPU::op_write(uint32 addr, uint8 data) {
|
|
status.clock_count = bus.speed(addr);
|
|
precycle_edge();
|
|
add_clocks(status.clock_count);
|
|
regs.mdr = data;
|
|
bus.write(addr, regs.mdr);
|
|
cycle_edge();
|
|
}
|
|
|
|
//
|
|
|
|
alwaysinline uint8 sCPU::op_readpc() {
|
|
return op_read((regs.pc.b << 16) + regs.pc.w++);
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readstack() {
|
|
if(regs.e) {
|
|
regs.s.l++;
|
|
} else {
|
|
regs.s.w++;
|
|
}
|
|
return op_read(regs.s.w);
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readstackn() {
|
|
return op_read(++regs.s.w);
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readaddr(uint32 addr) {
|
|
return op_read(addr & 0xffff);
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readlong(uint32 addr) {
|
|
return op_read(addr & 0xffffff);
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readdbr(uint32 addr) {
|
|
return op_read(((regs.db << 16) + addr) & 0xffffff);
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readpbr(uint32 addr) {
|
|
return op_read((regs.pc.b << 16) + (addr & 0xffff));
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readdp(uint32 addr) {
|
|
if(regs.e && regs.d.l == 0x00) {
|
|
return op_read((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff));
|
|
} else {
|
|
return op_read((regs.d + (addr & 0xffff)) & 0xffff);
|
|
}
|
|
}
|
|
|
|
alwaysinline uint8 sCPU::op_readsp(uint32 addr) {
|
|
return op_read((regs.s + (addr & 0xffff)) & 0xffff);
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writestack(uint8 data) {
|
|
op_write(regs.s.w, data);
|
|
if(regs.e) {
|
|
regs.s.l--;
|
|
} else {
|
|
regs.s.w--;
|
|
}
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writestackn(uint8 data) {
|
|
op_write(regs.s.w--, data);
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writeaddr(uint32 addr, uint8 data) {
|
|
op_write(addr & 0xffff, data);
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writelong(uint32 addr, uint8 data) {
|
|
op_write(addr & 0xffffff, data);
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writedbr(uint32 addr, uint8 data) {
|
|
op_write(((regs.db << 16) + addr) & 0xffffff, data);
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writepbr(uint32 addr, uint8 data) {
|
|
op_write((regs.pc.b << 16) + (addr & 0xffff), data);
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writedp(uint32 addr, uint8 data) {
|
|
if(regs.e && regs.d.l == 0x00) {
|
|
op_write((regs.d & 0xff00) + ((regs.d + (addr & 0xffff)) & 0xff), data);
|
|
} else {
|
|
op_write((regs.d + (addr & 0xffff)) & 0xffff, data);
|
|
}
|
|
}
|
|
|
|
alwaysinline void sCPU::op_writesp(uint32 addr, uint8 data) {
|
|
op_write((regs.s + (addr & 0xffff)) & 0xffff, data);
|
|
}
|