vault backup: 2025-04-19 00:11:01
This commit is contained in:
@@ -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 для управления конкретными типами прерываний.
|
||||
Reference in New Issue
Block a user