85 lines
2.3 KiB
C
Executable File
85 lines
2.3 KiB
C
Executable File
#include "gb-impl.h"
|
|
|
|
/*This function assumes that the ROM is already loaded*/
|
|
|
|
void setGbBanking(gb *cpu) {
|
|
switch (cpu->cartridge[0x147]) {
|
|
case 1:
|
|
case 2:
|
|
case 3:
|
|
cpu->ROMType = 1;
|
|
cpu->currentROMBank = 1;
|
|
cpu->changeBank = mbc1_changeBank;
|
|
break;
|
|
|
|
case 0x13:
|
|
cpu->ROMType = 3;
|
|
cpu->currentROMBank = 1;
|
|
cpu->changeBank = mbc3_changeBank;
|
|
break;
|
|
}
|
|
cpu->currentRAMBank = 0;
|
|
}
|
|
|
|
BYTE readMemory(gb *cpu, WORD addr) {
|
|
if ((addr >= 0x0000) && (addr <= 0x3FFF)) {
|
|
return cpu->cartridge[addr];
|
|
}
|
|
if ((addr >= 0x4000) && (addr <= 0x7FFF)) {
|
|
WORD t = addr - 0x4000;
|
|
return cpu->cartridge[t + (cpu->currentROMBank * 0x4000)];
|
|
}
|
|
|
|
else if ((addr >= 0xA000) && (addr <= 0xBFFF)) {
|
|
WORD t = addr - 0xA000;
|
|
return cpu->RAMBank[t + (cpu->currentRAMBank * 0x2000)];
|
|
} else if (addr == 0xFF00)
|
|
return getKeypad(cpu);
|
|
|
|
return cpu->memory[addr];
|
|
}
|
|
|
|
/*This function is necessary for replicate the ECHO (E000-FDFF) area*/
|
|
|
|
void writeMemory(gb *cpu, WORD addr, BYTE data) {
|
|
/*This part is mapped on the rom, so read-only*/
|
|
if (addr < 0x8000) {
|
|
cpu->changeBank(cpu, addr, data);
|
|
}
|
|
|
|
else if ((addr >= 0xA000) && (addr < 0xC000)) {
|
|
if (cpu->isRAMEnable != 0) {
|
|
WORD t = addr - 0xA000;
|
|
cpu->RAMBank[t + (cpu->currentRAMBank * 0x2000)] = data;
|
|
}
|
|
}
|
|
|
|
else if ((addr >= 0xE000) && (addr < 0xFE00)) {
|
|
cpu->memory[addr] = data;
|
|
writeMemory(cpu, addr - 0x2000, data);
|
|
}
|
|
|
|
/*Not usable */
|
|
else if ((addr >= 0xFEA0) && (addr < 0xFEFF)) {
|
|
}
|
|
|
|
else if (addr == TIMER_CONTROLLER) {
|
|
BYTE freq = readMemory(cpu, TIMER_CONTROLLER) & 0x3;
|
|
cpu->memory[TIMER_CONTROLLER] = data;
|
|
BYTE newfreq = readMemory(cpu, TIMER_CONTROLLER) & 0x3;
|
|
|
|
if (freq != newfreq)
|
|
setTimerFreq(cpu);
|
|
} else if (addr == DIVIDER_TIMER)
|
|
cpu->memory[DIVIDER_TIMER] = 0;
|
|
else if (addr == LCD_SCANLINE_ADRR)
|
|
cpu->memory[LCD_SCANLINE_ADRR] = 0;
|
|
else if (addr == DMA_ADRR)
|
|
DMATransfert(cpu, data);
|
|
else if((addr >= 0xFF10) && (addr <= 0xFF3F)){
|
|
writeSoundRegistry(cpu, addr, data);
|
|
}
|
|
else
|
|
cpu->memory[addr] = data;
|
|
}
|