2025-01-31 17:07:09 -07:00
|
|
|
#include <io.h>
|
2025-02-01 00:48:49 -07:00
|
|
|
#include <timer.h>
|
|
|
|
#include <cpu.h>
|
|
|
|
#include <dma.h>
|
|
|
|
#include <lcd.h>
|
2025-02-01 19:05:25 -07:00
|
|
|
#include <gamepad.h>
|
2025-02-02 20:36:32 -07:00
|
|
|
#include <audio.h>
|
2025-01-31 17:07:09 -07:00
|
|
|
|
|
|
|
static char serial_data[2];
|
|
|
|
|
|
|
|
u8 io_read(u16 address){
|
2025-02-01 19:05:25 -07:00
|
|
|
if(address == 0xFF00) {
|
|
|
|
return gamepad_get_output();
|
|
|
|
}
|
2025-01-31 17:07:09 -07:00
|
|
|
if(address == 0xFF01) {
|
|
|
|
return serial_data[0];
|
|
|
|
}
|
|
|
|
|
|
|
|
if(address == 0xFF02) {
|
|
|
|
return serial_data[1];
|
|
|
|
}
|
|
|
|
|
2025-02-01 00:48:49 -07:00
|
|
|
if(BETWEEN(address, 0xFF04, 0xFF07)){
|
|
|
|
return timer_read(address);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(BETWEEN(address, 0xFF40, 0xFF4B)){
|
|
|
|
return lcd_read(address);
|
|
|
|
}
|
|
|
|
|
|
|
|
if(address == 0xFF0F) {
|
|
|
|
return cpu_get_int_flags();
|
|
|
|
}
|
|
|
|
|
2025-02-01 19:05:25 -07:00
|
|
|
if(BETWEEN(address, 0xFF10, 0xFF3F)) {
|
2025-02-02 20:36:32 -07:00
|
|
|
return audio_read(address);
|
2025-02-01 19:05:25 -07:00
|
|
|
}
|
|
|
|
|
2025-01-31 17:07:09 -07:00
|
|
|
printf("UNSUPPORTED io_read(%04X)\n", address);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void io_write(u16 address, u8 value){
|
2025-02-01 19:05:25 -07:00
|
|
|
if(address == 0xFF00) {
|
|
|
|
gamepad_set_sel(value);
|
|
|
|
return;
|
|
|
|
}
|
2025-01-31 17:07:09 -07:00
|
|
|
if(address == 0xFF01) {
|
|
|
|
serial_data[0] = value;
|
2025-02-02 22:56:07 -07:00
|
|
|
//printf("%c", value);
|
2025-01-31 17:07:09 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(address == 0xFF02) {
|
|
|
|
serial_data[1] = value;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2025-02-01 00:48:49 -07:00
|
|
|
if(BETWEEN(address, 0xFF04, 0xFF07)){
|
|
|
|
timer_write(address, value);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(address == 0xFF0F) {
|
|
|
|
cpu_set_int_flags(value);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if(BETWEEN(address, 0xFF40, 0xFF4B)){
|
|
|
|
lcd_write(address, value);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2025-02-01 19:05:25 -07:00
|
|
|
if(BETWEEN(address, 0xFF10, 0xFF3F)) {
|
2025-02-02 20:36:32 -07:00
|
|
|
audio_write(address, value);
|
2025-02-01 19:05:25 -07:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2025-02-02 20:36:32 -07:00
|
|
|
|
2025-01-31 17:07:09 -07:00
|
|
|
printf("UNSUPPORTED io_write(%04X)\n", address);
|
|
|
|
}
|
|
|
|
|