2025-01-30 16:27:27 -07:00
|
|
|
#include <bus.h>
|
2025-01-30 21:59:05 -07:00
|
|
|
#include <common.h>
|
|
|
|
#include <cart.h>
|
|
|
|
#include <cpu.h>
|
|
|
|
#include <ram.h>
|
2025-01-31 17:07:09 -07:00
|
|
|
#include <io.h>
|
2025-01-30 16:27:27 -07:00
|
|
|
|
|
|
|
// 0x0000 - 0x3FFF : ROM Bank 0
|
|
|
|
// 0x4000 - 0x7FFF : ROM Bank 1 - Switchable
|
|
|
|
// 0x8000 - 0x97FF : CHR RAM
|
|
|
|
// 0x9800 - 0x9BFF : BG Map 1
|
|
|
|
// 0x9C00 - 0x9FFF : BG Map 2
|
|
|
|
// 0xA000 - 0xBFFF : Cartridge RAM
|
|
|
|
// 0xC000 - 0xCFFF : RAM Bank 0
|
|
|
|
// 0xD000 - 0xDFFF : RAM Bank 1-7 - switchable - Color only
|
|
|
|
// 0xE000 - 0xFDFF : Reserved - Echo RAM
|
|
|
|
// 0xFE00 - 0xFE9F : Object Attribute Memory
|
|
|
|
// 0xFEA0 - 0xFEFF : Reserved - Unusable
|
|
|
|
// 0xFF00 - 0xFF7F : I/O Registers
|
|
|
|
// 0xFF80 - 0xFFFE : Zero Page
|
|
|
|
|
|
|
|
u8 bus_read(u16 address) {
|
|
|
|
if(address < 0x8000) {
|
|
|
|
return cart_read(address);
|
2025-01-30 21:59:05 -07:00
|
|
|
} else if (address < 0xA000) {
|
|
|
|
//Char/Map Data
|
|
|
|
//TODO
|
|
|
|
printf("UNSUPPORTED bus_read(%04X)\n", address);
|
2025-01-31 14:39:38 -07:00
|
|
|
//NO_IMPL
|
|
|
|
return 0;
|
2025-01-30 21:59:05 -07:00
|
|
|
} else if (address < 0xC000) {
|
|
|
|
//Cartridge RAM
|
|
|
|
return cart_read(address);
|
|
|
|
} else if (address < 0xE000) {
|
|
|
|
//WRAM (Working RAM)
|
|
|
|
return wram_read(address);
|
|
|
|
} else if (address < 0xFE00) {
|
|
|
|
//reserved echo ram...
|
|
|
|
return 0;
|
|
|
|
} else if (address < 0xFEA0) {
|
|
|
|
//OAM
|
|
|
|
//TODO
|
|
|
|
printf("UNSUPPORTED bus_read(%04X)\n", address);
|
2025-01-31 14:39:38 -07:00
|
|
|
//NO_IMPL
|
|
|
|
return 0;
|
2025-01-30 21:59:05 -07:00
|
|
|
} else if (address < 0xFF00) {
|
|
|
|
//reserved unusable
|
|
|
|
return 0;
|
|
|
|
} else if (address < 0xFF80) {
|
|
|
|
//IO registers
|
|
|
|
//TODO
|
|
|
|
//NO_IMPL
|
2025-01-31 17:07:09 -07:00
|
|
|
return io_read(address);
|
2025-01-30 21:59:05 -07:00
|
|
|
} else if (address == 0xFFFF) {
|
|
|
|
//CPU ENABLE REGISTER
|
|
|
|
//TODO
|
|
|
|
return cpu_get_ie_register();
|
2025-01-30 16:27:27 -07:00
|
|
|
}
|
|
|
|
|
2025-01-30 21:59:05 -07:00
|
|
|
return hram_read(address);
|
2025-01-30 16:27:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
void bus_write(u16 address, u8 value) {
|
|
|
|
if(address < 0x8000) {
|
2025-01-30 21:59:05 -07:00
|
|
|
cart_write(address, value);
|
|
|
|
return;
|
|
|
|
} else if (address < 0xA000) {
|
|
|
|
//Char/Map Data
|
|
|
|
//TODO
|
|
|
|
printf("UNSUPPORTED bus_write(%04X)\n", address);
|
2025-01-31 17:07:09 -07:00
|
|
|
return;
|
2025-01-31 14:39:38 -07:00
|
|
|
//NO_IMPL
|
2025-01-30 21:59:05 -07:00
|
|
|
} else if (address < 0xC000) {
|
|
|
|
//Cartridge RAM
|
|
|
|
cart_write(address, value);
|
|
|
|
return;
|
|
|
|
} else if (address < 0xE000) {
|
|
|
|
//WRAM (Working RAM)
|
|
|
|
wram_write(address, value);
|
|
|
|
return;
|
|
|
|
} else if (address < 0xFE00) {
|
|
|
|
//reserved echo ram...
|
|
|
|
return;
|
|
|
|
} else if (address < 0xFEA0) {
|
|
|
|
//OAM
|
|
|
|
//TODO
|
|
|
|
printf("UNSUPPORTED bus_write(%04X)\n", address);
|
2025-01-31 17:07:09 -07:00
|
|
|
return;
|
2025-01-31 14:39:38 -07:00
|
|
|
//NO_IMPL
|
2025-01-30 21:59:05 -07:00
|
|
|
} else if (address < 0xFF00) {
|
|
|
|
//reserved unusable
|
|
|
|
return;
|
|
|
|
} else if (address < 0xFF80) {
|
|
|
|
//IO registers
|
|
|
|
//TODO
|
2025-01-31 17:07:09 -07:00
|
|
|
io_write(address, value);
|
2025-01-30 21:59:05 -07:00
|
|
|
//NO_IMPL
|
|
|
|
return;
|
|
|
|
} else if (address == 0xFFFF) {
|
|
|
|
//CPU ENABLE REGISTER
|
|
|
|
cpu_set_ie_register(value);
|
2025-01-30 16:27:27 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2025-01-30 21:59:05 -07:00
|
|
|
hram_write(address, value);
|
|
|
|
}
|
|
|
|
|
|
|
|
u16 bus_read16(u16 address) {
|
|
|
|
u16 lo = bus_read(address);
|
|
|
|
u16 hi = bus_read(address+1);
|
|
|
|
return lo | (hi << 8);
|
|
|
|
}
|
|
|
|
|
|
|
|
void bus_write16(u16 address, u16 value) {
|
|
|
|
bus_write(address+1, (value >> 8) & 0xFF);
|
2025-01-31 12:24:55 -07:00
|
|
|
bus_write(address, value & 0xFF);
|
2025-01-30 16:27:27 -07:00
|
|
|
}
|