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": {
|
||||
"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",
|
||||
|
||||
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