diff --git a/PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md b/PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md index f973f93..b34ef5f 100644 --- a/PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md +++ b/PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md @@ -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 newline at end of file +Для отладки в 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 для управления конкретными типами прерываний. \ No newline at end of file