vault backup: 2025-04-18 22:20:51
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/PSX code - Load texture from SECTOR!.md",
|
||||
"file": "PERSONAL PROJECTS/PS1 Gamepad.md",
|
||||
"mode": "source",
|
||||
"source": false
|
||||
},
|
||||
"icon": "lucide-file",
|
||||
"title": "PSX code - Load texture from SECTOR!"
|
||||
"title": "PS1 Gamepad"
|
||||
}
|
||||
}
|
||||
],
|
||||
@@ -207,8 +207,9 @@
|
||||
},
|
||||
"active": "dd912cc876184c4f",
|
||||
"lastOpenFiles": [
|
||||
"PERSONAL PROJECTS/PSX code - Texture show from file.md",
|
||||
"PERSONAL PROJECTS/PSX code - Load texture from SECTOR!.md",
|
||||
"PERSONAL PROJECTS/PS1 Gamepad.md",
|
||||
"PERSONAL PROJECTS/PSX code - Texture show from file.md",
|
||||
"PERSONAL PROJECTS/PS1 Vblank.md",
|
||||
"PERSONAL PROJECTS/PS1 MDEC.md",
|
||||
"PERSONAL PROJECTS/PS1 DMA.md",
|
||||
@@ -250,7 +251,6 @@
|
||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod_canvas2doc-data/newdoc-node_f3d0e9a6d4d8e6a7_fromCanvas.md",
|
||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod_canvas2doc-data/newdoc-node_f7aa319103f9c366_fromCanvas.md",
|
||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod_canvas2doc-data/newdoc-node_ea6f72ceae655889_fromCanvas.md",
|
||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod_canvas2doc-data/newdoc-node_e7df1d14d6f4f6c0_fromCanvas.md",
|
||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod.canvas",
|
||||
"PERSONAL PROJECTS/P2EP/cdRead.canvas",
|
||||
"P2EP/cdRead.canvas",
|
||||
|
||||
116
PERSONAL PROJECTS/PS1 Gamepad.md
Normal file
116
PERSONAL PROJECTS/PS1 Gamepad.md
Normal file
@@ -0,0 +1,116 @@
|
||||
В PlayStation 1 (PS1) взаимодействие с контроллерами (геймпадами, мышками, световыми пистолетами и т.д.) осуществляется через **порты ввода-вывода (I/O)** и специализированные **контроллеры SIO (Serial Input/Output)**. Вот детальное объяснение процесса:
|
||||
|
||||
---
|
||||
|
||||
## **1. Аппаратная основа**
|
||||
### **1.1. Порты контроллеров**
|
||||
- PS1 имеет **два порта** для подключения устройств (Multitap позволяет расширить до 4–8 игроков).
|
||||
- Каждый порт использует **протокол SPI** (Serial Peripheral Interface) для обмена данными.
|
||||
|
||||
### **1.2. Регистры управления**
|
||||
Основные регистры для работы с контроллерами:
|
||||
| Адрес | Назначение |
|
||||
|----------------|---------------------------------------------------------------------------|
|
||||
| **0x1F801040** | **SIO_DATA** — Данные для отправки/приёма. |
|
||||
| **0x1F801044** | **SIO_STAT** — Статус операции (готовность, ошибки). |
|
||||
| **0x1F801048** | **SIO_MODE** — Настройка режима (скорость, прерывания). |
|
||||
| **0x1F801050** | **SIO_CTRL** — Управление передачей (старт/стоп). |
|
||||
|
||||
---
|
||||
|
||||
## **2. Протокол обмена данными**
|
||||
### **2.1. Формат команд**
|
||||
Контроллеры PS1 понимают **5-байтовые команды**:
|
||||
1. **Стартовый байт** (`0x01`) — начало передачи.
|
||||
2. **Команда** (например, `0x42` — запрос состояния кнопок).
|
||||
3. **Данные** (зависит от типа устройства).
|
||||
|
||||
### **2.2. Пример запроса состояния кнопок**
|
||||
```asm
|
||||
; 1. Запись команды в SIO_DATA
|
||||
li t0, 0x1F801040
|
||||
li t1, 0x01000042 // Старт (0x01) + команда (0x42)
|
||||
sw t1, 0(t0)
|
||||
|
||||
; 2. Ожидание готовности
|
||||
wait_ready:
|
||||
lw t2, 0x1F801044(SIO_STAT)
|
||||
andi t2, t2, 0x0002 // Проверка бита "Готов к передаче"
|
||||
beqz t2, wait_ready
|
||||
|
||||
; 3. Чтение ответа (5 байт)
|
||||
lw t3, 0x1F801040(SIO_DATA) // Первые 4 байта
|
||||
lw t4, 0x1F801040(SIO_DATA) // Последний байт
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **3. Типы контроллеров и их ответы**
|
||||
### **3.1. Стандартный геймпад (Digital Pad)**
|
||||
- **Команда**: `0x42`.
|
||||
- **Ответ**: 5 байт:
|
||||
```
|
||||
[0x41][0x5A][Кнопки 1][Кнопки 2][Аналоговые данные (если есть)]
|
||||
```
|
||||
- **Распаковка кнопок**:
|
||||
- Байт 3: `SELECT`, `L3`, `R3`, `START`, `UP`, `RIGHT`, `DOWN`, `LEFT`.
|
||||
- Байт 4: `L2`, `R2`, `L1`, `R1`, `TRIANGLE`, `CIRCLE`, `CROSS`, `SQUARE`.
|
||||
|
||||
### **3.2. Аналоговый джойстик (DualShock)**
|
||||
- Поддерживает **вибрацию** и **аналоговые стики**.
|
||||
- **Команды**:
|
||||
- `0x43` — запрос аналоговых данных.
|
||||
- `0x4D` — управление моторчиками.
|
||||
|
||||
---
|
||||
|
||||
## **4. Как игры обрабатывают ввод?**
|
||||
1. **Инициализация порта**:
|
||||
```c
|
||||
InitPad(1, 0, NULL, 0); // Порт 1, без буфера
|
||||
```
|
||||
2. **Чтение состояния**:
|
||||
```c
|
||||
struct PadButtonStatus pad;
|
||||
ReadPadStatus(&pad, 0); // Чтение порта 1
|
||||
```
|
||||
3. **Проверка кнопок**:
|
||||
```c
|
||||
if (pad.buttons & PAD_CROSS) {
|
||||
// Кнопка CROSS нажата
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **5. Прерывания и синхронизация**
|
||||
- **Прерывание IRQ7** используется для обработки ввода.
|
||||
- Игры часто опрашивают контроллеры **во время VBlank**, чтобы избежать задержек.
|
||||
|
||||
---
|
||||
|
||||
## **6. Псевдокод полного цикла**
|
||||
```c
|
||||
while (1) {
|
||||
VSync(0); // Синхронизация с кадром
|
||||
PollPad(); // Опрос контроллера
|
||||
|
||||
if (PAD_PRESSED(PAD_UP)) {
|
||||
player_y--;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## **7. Интересные нюансы**
|
||||
- **Light Gun** (GunCon) требует **строгой синхронизации** с лучом ЭЛТ.
|
||||
- **Multitap** усложняет протокол (нужно переключать устройства).
|
||||
|
||||
---
|
||||
|
||||
## **8. Полезные ссылки**
|
||||
- [PSX Controller Protocol](http://problemkaputt.de/psx-spx.htm#controllersandmemorycards)
|
||||
- [PsyQ SDK Pad Docs](http://psx.arthus.net/sdk/PsyQ/DOCS/PADZ.HTM)
|
||||
|
||||
Это основа для работы с любыми контроллерами PS1 — от классического геймпада до танцевальных ковриков! 🎮
|
||||
Reference in New Issue
Block a user