Files
SergObsidian/PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md
2025-04-19 00:01:00 +05:00

123 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Работа с прерываниями 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 предоставляют удобную абстракцию для большинства задач.