public release of panzgb
This commit is contained in:
84
lib/gb-memory.c
Executable file
84
lib/gb-memory.c
Executable file
@@ -0,0 +1,84 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user