vault backup: 2025-04-18 22:20:51

This commit is contained in:
sShemet
2025-04-18 22:20:51 +05:00
parent 5bf77a63e8
commit aef99484d1
2 changed files with 120 additions and 4 deletions

View File

@@ -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",

View File

@@ -0,0 +1,116 @@
В PlayStation 1 (PS1) взаимодействие с контроллерами (геймпадами, мышками, световыми пистолетами и т.д.) осуществляется через **порты ввода-вывода (I/O)** и специализированные **контроллеры SIO (Serial Input/Output)**. Вот детальное объяснение процесса:
---
## **1. Аппаратная основа**
### **1.1. Порты контроллеров**
- PS1 имеет **два порта** для подключения устройств (Multitap позволяет расширить до 48 игроков).
- Каждый порт использует **протокол 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 — от классического геймпада до танцевальных ковриков! 🎮