Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/core/gba/gba.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@
#define strdup _strdup
#endif

MGBALog mgba_log;

extern int emulating;
bool debugger = false;

Expand Down Expand Up @@ -3742,6 +3744,7 @@ void CPUInit(const char* biosFileName, bool useBiosFile)
} else {
agbPrintEnable(false);
}
mgba_log.message.fill(0);
}

void SetSaveType(int st)
Expand Down
16 changes: 16 additions & 0 deletions src/core/gba/gba.h
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#ifndef VBAM_CORE_GBA_GBA_H_
#define VBAM_CORE_GBA_GBA_H_

#include <array>
#include <cstdint>

#include "core/base/system.h"
Expand Down Expand Up @@ -407,4 +408,19 @@ enum ioRegs {
IO_REG_END,
};

enum mgba_log_enum {
LOG_STRING_LO = 0x04FFF600,
LOG_STRING_HI = 0x04FFF700,
LOG_SEND = 0x04FFF700,
LOG_ENABLE = 0x04FFF780,
LOG_BUFFER_SIZE = 256,
};

typedef struct MGBALog {
uint16_t enable = 0;
std::array<char, LOG_BUFFER_SIZE + 1> message;
} MGBALog;

extern MGBALog mgba_log;

#endif // VBAM_CORE_GBA_GBA_H_
52 changes: 43 additions & 9 deletions src/core/gba/gbaInline.h
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ static inline uint32_t CPUReadMemory(uint32_t address)
case REGION_ROM1EX:
case REGION_ROM2:
if (IsEEPROM(address))
return 0; // ignore reads from eeprom region outside 0x0D page reads
return 0; // ignore reads from eeprom region outside 0x0D page reads
else if ((address & 0x01FFFFFC) <= (gbaGetRomSize() - 4))
value = READ32LE(((uint32_t *)&g_rom[address & 0x01FFFFFC]));
else {
Expand Down Expand Up @@ -356,8 +356,12 @@ static inline uint32_t CPUReadHalfWord(uint32_t address)
}
} else if ((address < 0x4000400) && ioReadable[address & 0x3fc]) {
value = 0;
} else
} else {
if ((address & 0xFFFFFFE) == LOG_ENABLE) {
return mgba_log.enable;
}
goto unreadable;
}
break;
case REGION_PRAM:
value = READ16LE(((uint16_t*)&g_paletteRAM[address & 0x3fe]));
Expand Down Expand Up @@ -490,8 +494,13 @@ static inline uint8_t CPUReadByte(uint32_t address)
case REGION_IO:
if ((address < 0x4000400) && ioReadable[address & 0x3ff])
return g_ioMem[address & 0x3ff];
else
goto unreadable;
else {
switch (address) {
case LOG_ENABLE: return (uint8_t)(mgba_log.enable >> 0);
case LOG_ENABLE + 1: return (uint8_t)(mgba_log.enable >> 8);
}
}
goto unreadable;
case REGION_PRAM:
return g_paletteRAM[address & 0x3ff];
case REGION_VRAM:
Expand All @@ -512,7 +521,7 @@ static inline uint8_t CPUReadByte(uint32_t address)
return 0; // ignore reads from eeprom region outside 0x0D page reads
else if ((address & 0x01FFFFFF) <= gbaGetRomSize())
return g_rom[address & 0x01FFFFFF];
else
else
return (uint8_t)ROMReadOOB(address & 0x01FFFFFE);
case REGION_ROM2EX:
if (cpuEEPROMEnabled)
Expand Down Expand Up @@ -598,6 +607,8 @@ static inline void CPUWriteMemory(uint32_t address, uint32_t value)
if (address < 0x4000400) {
CPUUpdateRegister((address & 0x3FC), value & 0xFFFF);
CPUUpdateRegister((address & 0x3FC) + 2, (value >> 16));
} else if (address >= LOG_STRING_LO && address < LOG_STRING_HI) {
WRITE32LE((uint32_t*)&mgba_log.message[(address - LOG_STRING_LO) & 0xFFFFFFC], value);
} else
goto unwritable;
break;
Expand Down Expand Up @@ -712,8 +723,27 @@ static inline void CPUWriteHalfWord(uint32_t address, uint16_t value)
case REGION_IO:
if (address < 0x4000400)
CPUUpdateRegister(address & 0x3fe, value);
else
else {
switch (address) {
case LOG_SEND:
if (mgba_log.enable && (value & 0x100) != 0) {
log("%s\n", mgba_log.message.data());
mgba_log.message.fill(0);
}
break;
case LOG_ENABLE:
if (value == 0xC0DE) {
mgba_log.enable = 0x1DEA;
}
break;
default:
if(address >= LOG_STRING_LO && address < LOG_STRING_HI) {
WRITE16LE((uint16_t*)&mgba_log.message[(address - LOG_STRING_LO) & 0xFFFFFFE], value);
break;
}
}
goto unwritable;
}
break;
case REGION_PRAM:
#ifdef VBAM_ENABLE_DEBUGGER
Expand Down Expand Up @@ -888,9 +918,13 @@ static inline void CPUWriteByte(uint32_t address, uint8_t b)
}
}
break;
} else
goto unwritable;
break;
} else {
if(address >= LOG_STRING_LO && address < LOG_STRING_HI) {
mgba_log.message[address - LOG_STRING_LO] = b;
break;
}
}
goto unwritable;
case REGION_PRAM:
// no need to switch
*((uint16_t*)&g_paletteRAM[address & 0x3FE]) = (b << 8) | b;
Expand Down
Loading