From ca00c6bcd7b54abf642f54c75cc6dc53a9a4c49d Mon Sep 17 00:00:00 2001 From: sShemet Date: Sat, 19 Apr 2025 00:21:02 +0500 Subject: [PATCH] vault backup: 2025-04-19 00:21:02 --- .obsidian/workspace.json | 6 +- PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md | 104 +++++++++++++++++++++++++- 2 files changed, 106 insertions(+), 4 deletions(-) diff --git a/.obsidian/workspace.json b/.obsidian/workspace.json index 9282804..e477656 100644 --- a/.obsidian/workspace.json +++ b/.obsidian/workspace.json @@ -41,12 +41,12 @@ "state": { "type": "markdown", "state": { - "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", + "file": "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md", "mode": "source", "source": false }, "icon": "lucide-file", - "title": "PS1 IRQ" + "title": "PS1 DMA" } } ], @@ -207,8 +207,8 @@ }, "active": "dd912cc876184c4f", "lastOpenFiles": [ - "PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md", + "PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md", "PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md", "PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.md", diff --git a/PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md b/PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md index 3906dd7..ec29410 100644 --- a/PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md +++ b/PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md @@ -145,4 +145,106 @@ sw a1, 0(a0) - [PSX DMA Hardware Specs](http://problemkaputt.de/psx-spx.htm#dmacontroller) - [PsyQ SDK Docs](http://psx.arthus.net/sdk/PsyQ/DOCS/) -Это основа для создания плавных игр вроде *Crash Bandicoot* или *Tekken 3*! 🚀 \ No newline at end of file +------------------- + + + +# Команда `DMACallback` в PS1 (PlayStation 1) + +`DMACallback` — это функция в библиотеках PsyQ для PlayStation 1, которая позволяет установить пользовательский обработчик прерываний DMA (Direct Memory Access). DMA используется для высокоскоростной передачи данных между компонентами системы без участия основного процессора. + +## Основное назначение + +Функция `DMACallback` регистрирует callback-функцию, которая будет вызываться при завершении DMA-передачи. Это позволяет: +- Уведомлять программу о завершении передачи данных +- Обрабатывать ошибки DMA +- Запускать следующие операции передачи данных по цепочке + +## Синтаксис + +```c +void DMACallback(void (*callback)(void)); +``` + +## Пример использования + +```c +#include +#include +#include +#include +#include + +void my_dma_callback(void) +{ + printf("DMA transfer completed!\n"); +} + +int main() +{ + // Установка callback-функции для DMA + DMACallback(my_dma_callback); + + // Пример DMA-передачи (условный) + DmaCopy(0, dest_addr, src_addr, size); + + while(1) + { + // Главный цикл программы + } + + return 0; +} +``` + +## Типы DMA в PS1 + +В PS1 существует несколько DMA-каналов, для которых можно устанавливать обработчики: + +1. **GPU DMA** - для передачи данных в графический процессор +2. **CD-ROM DMA** - для чтения данных с CD +3. **SPU DMA** - для передачи звуковых данных +4. **OTC DMA** - для очистки ordering tables + +## Важные особенности + +1. **Асинхронность**: DMA работает независимо от CPU, callback вызывается по завершении передачи. + +2. **Критические секции**: Обработчик DMA должен быть коротким и быстрым, без сложных операций. + +3. **Регистрация**: Обработчик нужно регистрировать перед началом DMA-передачи. + +4. **Сброс обработчика**: По завершении можно сбросить обработчик, если он больше не нужен: + ```c + DMACallback(NULL); + ``` + +5. **Сочетание с другими функциями**: Часто используется вместе с `DmaReady()` для проверки состояния DMA. + +## Пример с GPU DMA + +```c +void gpu_dma_complete(void) +{ + // Разблокировать ресурсы или начать следующую передачу + printf("GPU DMA completed\n"); +} + +void send_data_to_gpu(void *data, u_long size) +{ + // Установка обработчика + DMACallback(gpu_dma_complete); + + // Начало DMA-передачи в GPU + LoadImage((RECT*)data, (u_long*)(data + sizeof(RECT))); +} +``` + +## Альтернативные функции + +В разных версиях PsyQ могут быть аналогичные функции с другими именами: +- `DMACallBack()` (с заглавной B) +- `SetDMACallback()` +- Для конкретных каналов: `SetGPUCompleteCallback()`, `SetCDROMCallback()` и т.д. + +`DMACallback` предоставляет удобный механизм для асинхронной обработки завершения DMA-операций, что особенно важно для эффективного использования аппаратных возможностей PS1. \ No newline at end of file