4.5 KiB
Работа с прерываниями PS1 в коде C через библиотеки PsyQ
Для работы с прерываниями на PlayStation 1 (PSX) с использованием библиотек PsyQ в C вам нужно понимать несколько ключевых концепций.
Основные шаги для работы с прерываниями
-
Инициализация системы прерываний:
#include <sys/types.h> #include <libetc.h> #include <libgte.h> #include <libgpu.h> #include <libgs.h> #include <libcd.h> #include <libspu.h> #include <libsnd.h> void init_interrupts(void) { // Инициализация системы прерываний EnterCriticalSection(); // Вход в критическую секцию ResetCallback(); // Сброс обработчиков // Установка обработчиков прерываний setVSyncCallback(vsync_handler); // Можно добавить другие обработчики (CD, SPU и т.д.) ExitCriticalSection(); // Выход из критической секции } -
Обработчик вертикальной синхронизации (VSync):
void vsync_handler(void) { // Этот код выполняется каждый кадр (60 раз в секунду на NTSC) // Здесь можно обновлять логику, анимации и т.д. }
Типы прерываний в PS1
Основные типы прерываний, с которыми вы можете работать:
- VBlank (вертикальная синхронизация) - возникает в конце каждого кадра
- CD-ROM - прерывания от CD-привода
- SPU (звуковой процессор) - прерывания от звуковой системы
- GPU - прерывания от графического процессора
Пример работы с VBlank
#include <stdio.h>
#include <psx.h>
volatile int vblank_count = 0;
void vblank_handler(void)
{
vblank_count++;
}
int main()
{
// Инициализация PsyQ
ResetGraph(0);
InitGeom();
// Установка обработчика VBlank
EnterCriticalSection();
setVSyncCallback(vblank_handler);
ExitCriticalSection();
// Основной цикл
while(1)
{
printf("VBlank count: %d\n", vblank_count);
// Ожидание следующего VBlank
VSync(0);
}
return 0;
}
Работа с другими прерываниями
CD-ROM прерывания
void cdrom_handler(void)
{
// Обработка событий CD-ROM
}
// Установка обработчика
CdReadyCallback(cdrom_handler);
SPU прерывания
void spu_handler(void)
{
// Обработка событий звукового процессора
}
// Установка обработчика
SpuSetIRQCallback(spu_handler);
Важные замечания
-
Критические секции: Все операции с прерываниями должны выполняться внутри критических секций (
EnterCriticalSection()/ExitCriticalSection()). -
Ограничения обработчиков: Обработчики прерываний должны быть короткими и быстрыми, не должны вызывать сложные функции.
-
Регистрация обработчиков: Используйте соответствующие функции PsyQ для регистрации обработчиков (
setVSyncCallback,CdReadyCallbackи т.д.). -
Очистка: Перед завершением программы желательно сбросить обработчики прерываний.
-
Совместимость: Убедитесь, что ваша версия PsyQ поддерживает нужные функции.
Для более сложных проектов может потребоваться прямое взаимодействие с регистрами прерываний PS1, но библиотеки PsyQ предоставляют удобную абстракцию для большинства задач.