Files
SergObsidian/PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md
2025-04-19 00:01:00 +05:00

4.5 KiB
Raw Permalink Blame History

Работа с прерываниями PS1 в коде C через библиотеки PsyQ

Для работы с прерываниями на PlayStation 1 (PSX) с использованием библиотек PsyQ в C вам нужно понимать несколько ключевых концепций.

Основные шаги для работы с прерываниями

  1. Инициализация системы прерываний:

    #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):

    void vsync_handler(void)
    {
        // Этот код выполняется каждый кадр (60 раз в секунду на NTSC)
        // Здесь можно обновлять логику, анимации и т.д.
    }
    

Типы прерываний в PS1

Основные типы прерываний, с которыми вы можете работать:

  1. VBlank (вертикальная синхронизация) - возникает в конце каждого кадра
  2. CD-ROM - прерывания от CD-привода
  3. SPU (звуковой процессор) - прерывания от звуковой системы
  4. GPU - прерывания от графического процессора

Пример работы с VBlank

#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 прерывания

void cdrom_handler(void)
{
    // Обработка событий CD-ROM
}

// Установка обработчика
CdReadyCallback(cdrom_handler);

SPU прерывания

void spu_handler(void)
{
    // Обработка событий звукового процессора
}

// Установка обработчика
SpuSetIRQCallback(spu_handler);

Важные замечания

  1. Критические секции: Все операции с прерываниями должны выполняться внутри критических секций (EnterCriticalSection()/ExitCriticalSection()).

  2. Ограничения обработчиков: Обработчики прерываний должны быть короткими и быстрыми, не должны вызывать сложные функции.

  3. Регистрация обработчиков: Используйте соответствующие функции PsyQ для регистрации обработчиков (setVSyncCallback, CdReadyCallback и т.д.).

  4. Очистка: Перед завершением программы желательно сбросить обработчики прерываний.

  5. Совместимость: Убедитесь, что ваша версия PsyQ поддерживает нужные функции.

Для более сложных проектов может потребоваться прямое взаимодействие с регистрами прерываний PS1, но библиотеки PsyQ предоставляют удобную абстракцию для большинства задач.