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": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "PERSONAL PROJECTS/PSX code - Load texture from SECTOR!.md",
|
"file": "PERSONAL PROJECTS/PS1 Gamepad.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "PSX code - Load texture from SECTOR!"
|
"title": "PS1 Gamepad"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -207,8 +207,9 @@
|
|||||||
},
|
},
|
||||||
"active": "dd912cc876184c4f",
|
"active": "dd912cc876184c4f",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"PERSONAL PROJECTS/PSX code - Texture show from file.md",
|
|
||||||
"PERSONAL PROJECTS/PSX code - Load texture from SECTOR!.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 Vblank.md",
|
||||||
"PERSONAL PROJECTS/PS1 MDEC.md",
|
"PERSONAL PROJECTS/PS1 MDEC.md",
|
||||||
"PERSONAL PROJECTS/PS1 DMA.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_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_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_ea6f72ceae655889_fromCanvas.md",
|
||||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod_canvas2doc-data/newdoc-node_e7df1d14d6f4f6c0_fromCanvas.md",
|
|
||||||
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod.canvas",
|
"WORK & PROJECTS/Mol/Серверы/Alfa cloud prod.canvas",
|
||||||
"PERSONAL PROJECTS/P2EP/cdRead.canvas",
|
"PERSONAL PROJECTS/P2EP/cdRead.canvas",
|
||||||
"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