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

This commit is contained in:
sShemet
2025-04-19 01:51:11 +05:00
parent e31580b849
commit b0a9dc5628
3 changed files with 192 additions and 7 deletions

View File

@@ -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",

View File

@@ -186,6 +186,78 @@ int main() {
5. Функция работает с обоими портами контроллера (0 и 1)
## Совместимость
-----
`ChangeClearPad` является частью библиотеки `libpad.h` в PsyQ SDK и доступна во всех версиях. Аналогичная функциональность присутствует и в официальном Sony SDK для PS1.
# Функция `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 <libpad.h>
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" контроллеров.

View File

@@ -131,4 +131,117 @@ void DrawFrame() {
- **VRAM** используется только для хранения текстур и кадрового буфера.
- **Оптимизация DMA-передач** критична для производительности.
Это объясняет, почему в демосценах PS1 так важны **оптимизированные DMA-цепочки** и ручное управление памятью. Для глубокого понимания изучите **документацию PsyQ SDK** или исходники open-source движков (например, [PSn00bSDK](https://github.com/Lameguy64/psn00bsdk)).
Это объясняет, почему в демосценах 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 и требуют точной настройки для оптимальной работы.