vault backup: 2025-04-19 01:51:11
This commit is contained in:
8
.obsidian/workspace.json
vendored
8
.obsidian/workspace.json
vendored
@@ -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",
|
||||
|
||||
@@ -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" контроллеров.
|
||||
@@ -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 и требуют точной настройки для оптимальной работы.
|
||||
Reference in New Issue
Block a user