vault backup: 2025-04-20 00:25:47
This commit is contained in:
@@ -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` демонстрируют использование
|
||||
|
||||
Reference in New Issue
Block a user