xm_player/src/main.cpp

156 lines
3.9 KiB
C++

#include "aica/aica.hpp"
#include "interrupt.hpp"
#include "graphics.hpp"
#include "interpreter.hpp"
#include "sound.hpp"
#include "scene/scene.hpp"
#include "scene/logo/sound.hpp"
#include "scene/emulator/sound.hpp"
#include "cursor.hpp"
#include "input.hpp"
#include "detect_emulator.hpp"
void vbr100()
{
serial::string("vbr100\n");
interrupt_exception();
}
void vbr400()
{
serial::string("vbr400\n");
interrupt_exception();
}
static bool inside_interrupt = false;
void vbr600()
{
assert(inside_interrupt == false);
inside_interrupt = true;
uint32_t sr;
asm volatile ("stc sr,%0" : "=r" (sr));
sr |= sh::sr::imask(15);
asm volatile ("ldc %0,sr" : : "r" (sr));
if (sh7091.CCN.EXPEVT == 0 && sh7091.CCN.INTEVT == 0x320) { // Holly
uint32_t istnrm = system.ISTNRM;
uint32_t isterr = system.ISTERR;
if (isterr) {
serial::string("isterr: ");
serial::integer<uint32_t>(system.ISTERR);
}
graphics_interrupt(istnrm);
} else if (sh7091.CCN.EXPEVT == 0 && sh7091.CCN.INTEVT == 0x360) { // AICA
wait(); aica_sound.common.mcire = (1 << 6); // interrupt timer A
if (scene::current_scene == &scene::scenes[scene::id::tracker]) {
wait(); aica_sound.common.tactl_tima
= aica::tactl_tima::TACTL(0) // increment once every sample
| aica::tactl_tima::TIMA(0xfffd) // interrupt after 3 counts
;
} else {
wait(); aica_sound.common.tactl_tima
= aica::tactl_tima::TACTL(0) // increment once every sample
| aica::tactl_tima::TIMA(0xfff0) // interrupt after 4 counts
;
}
assert(scene::current_scene->interrupt != nullptr);
scene::current_scene->interrupt();
} else {
serial::string("vbr600\n");
interrupt_exception();
}
sr &= ~sh::sr::imask(15);
asm volatile ("ldc %0,sr" : : "r" (sr));
inside_interrupt = false;
}
#include "memorymap.hpp"
#include "holly/texture_memory_alloc9.hpp"
#include "holly/holly.hpp"
static inline uint16_t rgb565(uint8_t r, uint8_t g, uint8_t b)
{
int r5 = r & 31;
int g6 = g & 63;
int b5 = b & 31;
return (r5 << 11) | (g6 << 5) | (b5 << 0);
}
void test_pattern()
{
uint16_t * framebuffer = (uint16_t *)&texture_memory32[texture_memory_alloc.framebuffer[0].start / 4];
for (int y = 0; y < 480; y++) {
for (int x = 0; x < 720; x++) {
if (x == 0 || y == 0 || y == 479)
framebuffer[y * 720 + x] = rgb565(31, 0, 0);
else if (x == 719)
framebuffer[y * 720 + x] = rgb565(0, 0, 31);
else
framebuffer[y * 720 + x] = rgb565(0, 31 * (x & 1), 0);
}
}
holly.FB_R_SOF1 = texture_memory_alloc.framebuffer[0].start;
}
void main()
{
printf("main\n");
serial::init(0);
printf("main\n");
sound::init();
//bool emulator = detect_emulator();
//printf("emulator %d\n", emulator);
graphics_init();
scene::scene_init(scene::id::logo);
input::state_init();
cursor::init();
//test_pattern();
interrupt_init();
system.IML6NRM = istnrm::end_of_render_tsp
| istnrm::v_blank_in
| istnrm::end_of_transferring_punch_through_list
| istnrm::end_of_transferring_opaque_list;
system.IML4EXT = istext::aica;
static uint8_t op_buf[1024 * 1024] __attribute__((aligned(32)));
static uint8_t pt_buf[1024 * 1024] __attribute__((aligned(32)));
ta_multiwriter multi(ta_parameter_writer(op_buf, (sizeof (op_buf))),
ta_parameter_writer(pt_buf, (sizeof (pt_buf))));
static uint8_t send_buf[1024] __attribute__((aligned(32)));
static uint8_t recv_buf[1024] __attribute__((aligned(32)));
input::state_update(send_buf, recv_buf);
while (1) {
cursor::update();
input::state_update(send_buf, recv_buf);
graphics_event(multi);
int count = 0;
while (next_frame == 0) {
if (count++ > 1000000) {
printf("timeout\n");
}
};
next_frame = 0;
scene::transition();
}
}