123 lines
4.5 KiB
Markdown
123 lines
4.5 KiB
Markdown
# Работа с прерываниями PS1 в коде C через библиотеки PsyQ
|
||
|
||
Для работы с прерываниями на PlayStation 1 (PSX) с использованием библиотек PsyQ в C вам нужно понимать несколько ключевых концепций.
|
||
|
||
## Основные шаги для работы с прерываниями
|
||
|
||
1. **Инициализация системы прерываний**:
|
||
```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(); // Выход из критической секции
|
||
}
|
||
```
|
||
|
||
2. **Обработчик вертикальной синхронизации (VSync)**:
|
||
```c
|
||
void vsync_handler(void)
|
||
{
|
||
// Этот код выполняется каждый кадр (60 раз в секунду на NTSC)
|
||
// Здесь можно обновлять логику, анимации и т.д.
|
||
}
|
||
```
|
||
|
||
## Типы прерываний в PS1
|
||
|
||
Основные типы прерываний, с которыми вы можете работать:
|
||
|
||
1. **VBlank (вертикальная синхронизация)** - возникает в конце каждого кадра
|
||
2. **CD-ROM** - прерывания от CD-привода
|
||
3. **SPU (звуковой процессор)** - прерывания от звуковой системы
|
||
4. **GPU** - прерывания от графического процессора
|
||
|
||
## Пример работы с VBlank
|
||
|
||
```c
|
||
#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 прерывания
|
||
```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 предоставляют удобную абстракцию для большинства задач. |