From aef99484d1fe82b6dfc525265fa8f9fcb0ba121d Mon Sep 17 00:00:00 2001 From: sShemet Date: Fri, 18 Apr 2025 22:20:51 +0500 Subject: [PATCH] vault backup: 2025-04-18 22:20:51 --- .obsidian/workspace.json | 8 +-- PERSONAL PROJECTS/PS1 Gamepad.md | 116 +++++++++++++++++++++++++++++++ 2 files changed, 120 insertions(+), 4 deletions(-) create mode 100644 PERSONAL PROJECTS/PS1 Gamepad.md diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 2af532b..bea8f5f 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -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", diff --git a/PERSONAL PROJECTS/PS1 Gamepad.md b/PERSONAL PROJECTS/PS1 Gamepad.md new file mode 100644 index 0000000..cdcdc7c --- /dev/null +++ b/PERSONAL PROJECTS/PS1 Gamepad.md @@ -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 — от классического геймпада до танцевальных ковриков! 🎮 \ No newline at end of file