From b0a9dc562840d842ace27ed039f85ec9c38c98cc Mon Sep 17 00:00:00 2001 From: sShemet Date: Sat, 19 Apr 2025 01:51:11 +0500 Subject: [PATCH] vault backup: 2025-04-19 01:51:11 --- .obsidian/workspace.json | 8 +- PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md | 76 +++++++++++++- PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md | 115 +++++++++++++++++++++- 3 files changed, 192 insertions(+), 7 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 38cd6dc..1afa53f 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -41,12 +41,12 @@ "state": { "type": "markdown", "state": { - "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md", + "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "PS1 Ordering table" + "title": "PS1 Gamepad" } } ], @@ -207,6 +207,8 @@ }, "active": "dd912cc876184c4f", "lastOpenFiles": [ + "PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md", + "PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 MDEC.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", @@ -214,7 +216,6 @@ "PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.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", "PERSONAL PROJECTS/PS1 DOCS", "PERSONAL PROJECTS/PS1 DOCS/PSX code texture load unpack show and fade.md", "PERSONAL PROJECTS/PS1 DOCS/PSX code inline asm.md", @@ -222,7 +223,6 @@ "PERSONAL PROJECTS/PS1 DOCS/PSX code - modules load and exec.md", "PERSONAL PROJECTS/PS1 DOCS/PSX code - Load texture from SECTOR!.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Vblank.md", - "PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA CD-ROM.md", "WORK & PROJECTS/Mol/Ideas/Все идеи для Моли.md", "WORK & PROJECTS/Mol/Серверы/mail.mol-soft.ru.md", diff --git a/PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md b/PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md index 55c7f31..f7e6735 100644 --- a/PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md +++ b/PERSONAL PROJECTS/PS1 DOCS/PS1 Gamepad.md @@ -186,6 +186,78 @@ int main() { 5. Функция работает с обоими портами контроллера (0 и 1) -## Совместимость +----- -`ChangeClearPad` является частью библиотеки `libpad.h` в PsyQ SDK и доступна во всех версиях. Аналогичная функциональность присутствует и в официальном Sony SDK для PS1. \ No newline at end of file +# Функция `PadChkVsync` в библиотеке PsyQ для PlayStation 1 + +Функция `PadChkVsync` используется для проверки состояния геймпада (контроллера) с синхронизацией по вертикальному гашению (VSync). Это важная функция для обработки ввода в играх на PS1. + +## Основное назначение + +`PadChkVsync` выполняет две ключевые задачи: +1. Проверяет состояние подключенных контроллеров +2. Синхронизирует чтение состояния с вертикальной синхронизацией (VSync) + +## Синтаксис + +```c +int PadChkVsync(void); +``` + +## Возвращаемое значение + +Функция возвращает битовую маску, указывающую на состояние подключения контроллеров: +- Бит 0: Состояние порта 1 (0 - контроллер подключен, 1 - не подключен) +- Бит 1: Состояние порта 2 +- Бит 2: Состояние мемори-карты в порту 1 +- Бит 3: Состояние мемори-карты в порту 2 + +## Особенности работы + +1. **Синхронизация с VSync** - чтение состояния происходит во время вертикального гашения, что предотвращает "разрывы" изображения +2. **Определение подключенных устройств** - позволяет определить, какие контроллеры/мемори-карты подключены +3. **Работа в паре с другими функциями Pad** - обычно используется вместе с `PadRead()` + +## Пример использования + +```c +#include + +int main() { + PadInit(0); // Инициализация системы контроллеров + + while(1) { + // Проверка состояния подключения + int connected = PadChkVsync(); + + if (!(connected & 1)) { // Если контроллер в порту 1 подключен + u_long pad = PadRead(0); // Чтение состояния + + if (pad & PAD_UP) { + // Обработка нажатия UP + } + // Другие проверки кнопок... + } + + VSync(0); // Ожидание следующего VBlank + } + + return 0; +} +``` + +## Типичный сценарий использования + +1. В начале кадра вызывается `PadChkVsync()` для проверки подключенных устройств +2. Если контроллер подключен, вызывается `PadRead()` для получения состояния кнопок +3. Состояние кнопок обрабатывается в игровой логике +4. Цикл повторяется после `VSync(0)` + +## Важные нюансы + +1. Функция не возвращает состояние кнопок - только информацию о подключении +2. Для фактического чтения кнопок нужно использовать `PadRead()` +3. Рекомендуется вызывать эту функцию один раз за кадр +4. В отличие от `PadRead()`, `PadChkVsync` не очищает буфер ввода + +Функция `PadChkVsync` особенно полезна в играх, где важно точно определять момент подключения/отключения контроллеров во время gameplay, например, в multiplayer-играх с возможностью "hot-plug" контроллеров. \ No newline at end of file diff --git a/PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md b/PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md index 355b3dd..dc0ce3d 100644 --- a/PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md +++ b/PERSONAL PROJECTS/PS1 DOCS/PS1 Gpu-DMA.md @@ -131,4 +131,117 @@ void DrawFrame() { - **VRAM** используется только для хранения текстур и кадрового буфера. - **Оптимизация DMA-передач** критична для производительности. -Это объясняет, почему в демосценах PS1 так важны **оптимизированные DMA-цепочки** и ручное управление памятью. Для глубокого понимания изучите **документацию PsyQ SDK** или исходники open-source движков (например, [PSn00bSDK](https://github.com/Lameguy64/psn00bsdk)). \ No newline at end of file +Это объясняет, почему в демосценах PS1 так важны **оптимизированные DMA-цепочки** и ручное управление памятью. Для глубокого понимания изучите **документацию PsyQ SDK** или исходники open-source движков (например, [PSn00bSDK](https://github.com/Lameguy64/psn00bsdk)). + + + +---------- + + +# Функции `PutDispEnv` и `PutDrawEnv` в библиотеке PsyQ для PlayStation 1 + +Эти функции управляют графическим окружением (display и drawing environment) и являются ключевыми для работы с двойной буферизацией на PS1. + +## `PutDispEnv` - Установка параметров отображения + +```c +void PutDispEnv(DISPENV *env); +``` + +### Назначение: +Устанавливает параметры **области вывода изображения** на экран: +- Позиция и размер выводимой области +- Режимы интерлейсинга +- Цвет фона за пределами игровой области + +### Структура DISPENV: +```c +typedef struct { + u_short disp; // Настройки дисплея + u_short screen; // Размер экрана + u_short isrgb24; // RGB24 режим (0/1) + u_short pad; // Выравнивание +} DISPENV; +``` + +### Пример использования: +```c +DISPENV dispEnv; +SetDefDispEnv(&dispEnv, 0, 0, 320, 240); // Установка параметров по умолчанию +dispEnv.screen.w = 320; // Ширина выводимой области +dispEnv.screen.h = 240; // Высота выводимой области +PutDispEnv(&dispEnv); // Применение настроек +``` + +## `PutDrawEnv` - Установка параметров рендеринга + +```c +void PutDrawEnv(DRAWENV *env); +``` + +### Назначение: +Конфигурирует параметры **области рисования**: +- Область отсечения (clipping) +- Смещение рисования +- Цвет фона +- Флаги отрисовки + +### Структура DRAWENV: +```c +typedef struct { + RECT clip; // Область отсечения + short ofs[2]; // Смещение рисования + RECT tw; // Область текстуры (если используется) + u_short tpage; // Страница текстуры + u_short dtd; // Флаги (dither, draw background) +} DRAWENV; +``` + +### Пример использования: +```c +DRAWENV drawEnv; +SetDefDrawEnv(&drawEnv, 0, 0, 320, 240); +drawEnv.clip.x = 0; // Область отсечения +drawEnv.clip.y = 0; +drawEnv.clip.w = 320; +drawEnv.clip.h = 240; +drawEnv.isbg = 1; // Включить очистку фона +setRGB0(&drawEnv, 0, 0, 0); // Черный фон +PutDrawEnv(&drawEnv); +``` + +## Совместное использование в двойной буферизации + +Типичный цикл рендеринга с двойной буферизацией: + +```c +DB db[2]; // Double buffer структура +int active = 0; + +while(1) { + // Очистка и подготовка OT + ClearOTagR(db[active].ot, OT_LENGTH); + + // Добавление примитивов + // ... (код рендеринга) + + // Отправка команд на отрисовку + DrawOTag(db[active].ot); + + // Переключение буферов + PutDispEnv(&db[active].disp); + PutDrawEnv(&db[active].draw); + + active ^= 1; // Смена активного буфера + VSync(0); // Ожидание VBlank +} +``` + +## Ключевые особенности: + +1. **Двойная буферизация** - обычно используют два набора DISPENV/DRAWENV +2. **VSync синхронизация** - переключение лучше делать во время VBlank +3. **Размеры областей** - должны соответствовать выбранному разрешению +4. **Производительность** - правильная настройка уменьшает артефакты + +Эти функции являются фундаментальными для управления графическим конвейером PS1 и требуют точной настройки для оптимальной работы. \ No newline at end of file