# Работа с прерываниями PS1 в коде C через библиотеки PsyQ Для работы с прерываниями на PlayStation 1 (PSX) с использованием библиотек PsyQ в C вам нужно понимать несколько ключевых концепций. ## Основные шаги для работы с прерываниями 1. **Инициализация системы прерываний**: ```c #include #include #include #include #include #include #include #include void init_interrupts(void) { // Инициализация системы прерываний EnterCriticalSection(); // Вход в критическую секцию ResetCallback(); // Сброс обработчиков // Установка обработчиков прерываний setVSyncCallback(vsync_handler); // Можно добавить другие обработчики (CD, SPU и т.д.) ExitCriticalSection(); // Выход из критической секции } ``` 2. **Обработчик вертикальной синхронизации (VSync)**: ```c void vsync_handler(void) { // Этот код выполняется каждый кадр (60 раз в секунду на NTSC) // Здесь можно обновлять логику, анимации и т.д. } ``` ## Типы прерываний в PS1 Основные типы прерываний, с которыми вы можете работать: 1. **VBlank (вертикальная синхронизация)** - возникает в конце каждого кадра 2. **CD-ROM** - прерывания от CD-привода 3. **SPU (звуковой процессор)** - прерывания от звуковой системы 4. **GPU** - прерывания от графического процессора ## Пример работы с VBlank ```c #include #include 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 прерывания ```c void cdrom_handler(void) { // Обработка событий CD-ROM } // Установка обработчика CdReadyCallback(cdrom_handler); ``` ### SPU прерывания ```c void spu_handler(void) { // Обработка событий звукового процессора } // Установка обработчика SpuSetIRQCallback(spu_handler); ``` ## Важные замечания 1. **Критические секции**: Все операции с прерываниями должны выполняться внутри критических секций (`EnterCriticalSection()`/`ExitCriticalSection()`). 2. **Ограничения обработчиков**: Обработчики прерываний должны быть короткими и быстрыми, не должны вызывать сложные функции. 3. **Регистрация обработчиков**: Используйте соответствующие функции PsyQ для регистрации обработчиков (`setVSyncCallback`, `CdReadyCallback` и т.д.). 4. **Очистка**: Перед завершением программы желательно сбросить обработчики прерываний. 5. **Совместимость**: Убедитесь, что ваша версия PsyQ поддерживает нужные функции. Для более сложных проектов может потребоваться прямое взаимодействие с регистрами прерываний PS1, но библиотеки PsyQ предоставляют удобную абстракцию для большинства задач.