vault backup: 2025-04-20 00:25:47

This commit is contained in:
sShemet
2025-04-20 00:25:47 +05:00
parent 703f40a528
commit 9913ce8b27
3 changed files with 285 additions and 5 deletions

View File

@@ -9,6 +9,7 @@
### **1.2. Регистры управления**
Основные регистры для работы с контроллерами:
| Адрес | Назначение |
|----------------|---------------------------------------------------------------------------|
| **0x1F801040** | **SIO_DATA** — Данные для отправки/приёма. |
@@ -260,4 +261,90 @@ int main() {
3. Рекомендуется вызывать эту функцию один раз за кадр
4. В отличие от `PadRead()`, `PadChkVsync` не очищает буфер ввода
Функция `PadChkVsync` особенно полезна в играх, где важно точно определять момент подключения/отключения контроллеров во время gameplay, например, в multiplayer-играх с возможностью "hot-plug" контроллеров.
Функция `PadChkVsync` особенно полезна в играх, где важно точно определять момент подключения/отключения контроллеров во время gameplay, например, в multiplayer-играх с возможностью "hot-plug" контроллеров.
-------
Да, функция **`PadInitDirect`** действительно существует в библиотеке PsyQ и является важной частью системы обработки ввода для PlayStation 1. Вот подробное объяснение:
---
### 🔍 **Назначение PadInitDirect**
Функция **инициализирует систему обработки геймпадов** в режиме прямого доступа (Direct Access). Она:
1. **Настраивает аппаратные порты контроллеров** (до 2-х геймпадов)
2. **Подготавливает буферы** для чтения состояния кнопок
3. **Активирует низкоуровневый доступ** к данным геймпадов
4. **Возвращает статус** инициализации (`1` = успех, `0` = ошибка)
---
### 📜 **Синтаксис в PsyQ**
```c
#include <libpad.h>
int PadInitDirect(unsigned char *padBuf1, unsigned char *padBuf2);
```
- **`padBuf1`** - буфер для геймпада на порту 1 (размер ≥ 34 байт)
- **`padBuf2`** - буфер для геймпада на порту 2 (может быть `NULL`)
---
### 💻 **Пример использования**
```c
#define BUF_SIZE 34
int main() {
unsigned char pad1Buf[BUF_SIZE] __attribute__((aligned(64))); // Выравнивание для DMA
if(PadInitDirect(pad1Buf, NULL)) {
printf("Геймпад 1 инициализирован!\n");
} else {
printf("Ошибка инициализации!\n");
return 1;
}
// Далее можно использовать PadRead()
}
```
---
### 🔧 **Особенности работы**
1. **Требования к буферам**:
- Минимальный размер: **34 байта**
- Должны быть **64-байтно выровнены** (для DMA)
- Пример объявления:
```c
unsigned char padBuf[34] __attribute__((aligned(64)));
```
2. **Режимы работы**:
- Прямой доступ (`PadInitDirect`) - ручное управление
- Стандартный режим (`PadInit`) - автоматическое управление
3. **Совместимость**:
- Поддерживает все типы контроллеров PS1:
- Обычные геймпады (Digital)
- Аналоговые джойстики (DualShock)
- Мышь PlayStation
---
### ⚠️ **Важные нюансы**
1. **Перед использованием** необходимо вызвать `PadStartCom()` для начала обмена данными
2. **Для чтения** используется `PadRead()` после инициализации
3. **В мультиплеерных играх** нужно инициализировать оба порта:
```c
PadInitDirect(pad1Buf, pad2Buf);
```
---
### 📚 **Документация PsyQ**
В официальном **PsyQ SDK** функция описана в файлах:
- `libpad.h` - заголовочный файл
- `libpad.doc` - документация
- Примеры в `Samples/PAD` демонстрируют использование