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

This commit is contained in:
sShemet
2025-04-19 00:11:01 +05:00
parent d273c5bb12
commit 9c7658427e

View File

@@ -6,15 +6,15 @@
## **1. Основные типы прерываний**
В PS1 есть несколько аппаратных прерываний, каждое обслуживает свою задачу:
| Прерывание | Источник | Задача |
|------------|---------------------------|-----------------------------------------------------------------------|
| **IRQ0** | VBlank (вертикальная синхронизация) | Оповещает о завершении рендеринга кадра. Используется для обновления графики. |
| **IRQ1** | GPU | Генерируется при ошибках GPU (например, переполнение буфера команд). |
| **IRQ2** | CD-ROM | Сигнализирует о завершении чтения данных с диска. |
| **IRQ3** | DMA | Уведомляет о завершении передачи данных (например, в VRAM). |
| **IRQ4** | Timer (таймер) | Используется для точного измерения времени. |
| **IRQ5** | Контроллеры (геймпады) | Обработка ввода игрока. |
| **IRQ6** | SPU (звук) | Прерывание от звукового процессора (например, окончание воспроизведения сэмпла). |
| Прерывание | Источник | Задача |
| ---------- | ----------------------------------- | -------------------------------------------------------------------------------- |
| **IRQ0** | VBlank (вертикальная синхронизация) | Оповещает о завершении рендеринга кадра. Используется для обновления графики. |
| **IRQ1** | GPU | Генерируется при ошибках GPU (например, переполнение буфера команд). |
| **IRQ2** | CD-ROM | Сигнализирует о завершении чтения данных с диска. |
| **IRQ3** | DMA | Уведомляет о завершении передачи данных (например, в VRAM). |
| **IRQ4** | Timer (таймер) | Используется для точного измерения времени. |
| **IRQ5** | Контроллеры (геймпады) | Обработка ввода игрока. |
| **IRQ6** | SPU (звук) | Прерывание от звукового процессора (например, окончание воспроизведения сэмпла). |
---
@@ -218,4 +218,81 @@ not_vblank:
- **Минимальное сохранение**: Только используемые регистры
- **Аппаратное ускорение**: Для DMA используйте **D_ICR (0x1F8010F4)**
Для отладки в no$psx используйте точки останова на записи в **I_STAT**!
Для отладки в no$psx используйте точки останова на записи в **I_STAT**!
-------------
# Команда `SetIntrMask` в PS1 (PlayStation 1)
`SetIntrMask` — это низкоуровневая функция в SDK PlayStation 1 (как в официальном Sony SDK, так и в PsyQ), которая управляет маской прерываний процессора R3000.
## Основное назначение
Функция `SetIntrMask` устанавливает битовую маску, определяющую, какие прерывания будут обрабатываться процессором. Она позволяет включать/выключать определенные типы прерываний.
## Синтаксис (в PsyQ)
```c
void SetIntrMask(unsigned int mask);
```
## Битовая маска прерываний
Маска прерываний обычно определяется следующими флагами (конкретные значения могут отличаться в разных версиях SDK):
```
0x0001 - VBLANK (вертикальное гашение)
0x0002 - GPU
0x0004 - CD-ROM
0x0008 - DMA
0x0010 - TIMER0 (таймер 0)
0x0020 - TIMER1 (таймер 1)
0x0040 - TIMER2 (таймер 2)
0x0080 - Периферийные устройства (контроллеры, память карт)
0x0400 - SPU (звуковой процессор)
```
## Примеры использования
1. **Разрешить все прерывания**:
```c
SetIntrMask(0xFFFF);
```
2. **Разрешить только VBLANK и CD-ROM**:
```c
SetIntrMask(0x0005); // 0x0001 (VBLANK) | 0x0004 (CD-ROM)
```
3. **Запретить все прерывания**:
```c
SetIntrMask(0x0000);
```
## Типичное использование в сочетании с другими функциями
```c
// Сохраняем текущую маску
unsigned int old_mask = GetIntrMask();
// Запрещаем все прерывания
SetIntrMask(0x0000);
// Выполняем критический код, который не должен прерываться
// Восстанавливаем предыдущую маску
SetIntrMask(old_mask);
```
## Важные замечания
1. **Альтернативы**: В PsyQ часто используют `EnterCriticalSection()` и `ExitCriticalSection()`, которые internally работают с `SetIntrMask`.
2. **Влияние на производительность**: Неправильное управление маской прерываний может привести к пропуску важных событий (например, VBLANK).
3. **GPU синхронизация**: При работе с GPU часто требуется временно отключать прерывания для атомарных операций.
4. **Сочетание с обработчиками**: Даже если прерывание разрешено маской, для него должен быть установлен обработчик через соответствующие функции PsyQ.
Эта функция предоставляет низкоуровневый контроль над прерываниями и обычно используется в сочетании с более высокоуровневыми API PsyQ для управления конкретными типами прерываний.