Refactor ROM class; introduce snes.h for address conversion utilities, enhancing code organization and maintainability.
This commit is contained in:
51
src/app/snes.h
Normal file
51
src/app/snes.h
Normal file
@@ -0,0 +1,51 @@
|
||||
#ifndef YAZE_SNES_H_
|
||||
#define YAZE_SNES_H_
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
namespace yaze {
|
||||
|
||||
inline uint32_t SnesToPc(uint32_t addr) noexcept {
|
||||
constexpr uint32_t kFastRomRegion = 0x808000;
|
||||
if (addr >= kFastRomRegion) {
|
||||
addr -= kFastRomRegion;
|
||||
}
|
||||
uint32_t temp = (addr & 0x7FFF) + ((addr / 2) & 0xFF8000);
|
||||
return (temp + 0x0);
|
||||
}
|
||||
|
||||
inline uint32_t PcToSnes(uint32_t addr) {
|
||||
uint8_t* b = reinterpret_cast<uint8_t*>(&addr);
|
||||
b[2] = static_cast<uint8_t>(b[2] * 2);
|
||||
|
||||
if (b[1] >= 0x80) {
|
||||
b[2] += 1;
|
||||
} else {
|
||||
b[1] += 0x80;
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
||||
|
||||
inline uint32_t Get24LocalFromPC(uint8_t* data, int addr, bool pc = true) {
|
||||
uint32_t ret =
|
||||
(PcToSnes(addr) & 0xFF0000) | (data[addr + 1] << 8) | data[addr];
|
||||
if (pc) {
|
||||
return SnesToPc(ret);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
inline int AddressFromBytes(uint8_t bank, uint8_t high, uint8_t low) noexcept {
|
||||
return (bank << 16) | (high << 8) | low;
|
||||
}
|
||||
|
||||
inline uint32_t MapBankToWordAddress(uint8_t bank, uint16_t addr) noexcept {
|
||||
uint32_t result = 0;
|
||||
result = (bank << 16) | addr;
|
||||
return result;
|
||||
}
|
||||
|
||||
} // namespace yaze
|
||||
|
||||
#endif // YAZE_SNES_H_
|
||||
Reference in New Issue
Block a user