vault backup: 2025-04-19 00:01:00
This commit is contained in:
6
.obsidian/workspace.json
vendored
6
.obsidian/workspace.json
vendored
@@ -41,12 +41,12 @@
|
|||||||
"state": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "PERSONAL PROJECTS/PS1 DOCS/Untitled.md",
|
"file": "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "Untitled"
|
"title": "PS1 IRQ"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -207,8 +207,8 @@
|
|||||||
},
|
},
|
||||||
"active": "dd912cc876184c4f",
|
"active": "dd912cc876184c4f",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
|
"PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.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/PS1 Geometry Transformation Engine.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
|
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md",
|
"PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md",
|
||||||
|
|||||||
123
PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md
Normal file
123
PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md
Normal 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 предоставляют удобную абстракцию для большинства задач.
|
||||||
Reference in New Issue
Block a user