vault backup: 2025-04-19 00:01:00

This commit is contained in:
sShemet
2025-04-19 00:01:00 +05:00
parent f72bc1285d
commit d273c5bb12
3 changed files with 126 additions and 3 deletions

View File

@@ -41,12 +41,12 @@
"state": {
"type": "markdown",
"state": {
"file": "PERSONAL PROJECTS/PS1 DOCS/Untitled.md",
"file": "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "Untitled"
"title": "PS1 IRQ"
}
}
],
@@ -207,8 +207,8 @@
},
"active": "dd912cc876184c4f",
"lastOpenFiles": [
"PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md",
"PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md",
"PERSONAL PROJECTS/PS1 DOCS/Untitled.md",
"PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md",
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
"PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md",

View File

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