vault backup: 2025-04-19 00:21:02

This commit is contained in:
sShemet
2025-04-19 00:21:02 +05:00
parent 9c7658427e
commit ca00c6bcd7
2 changed files with 106 additions and 4 deletions

View File

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

View File

@@ -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*! 🚀
-------------------
# Команда `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 <sys/types.h>
#include <libetc.h>
#include <libgte.h>
#include <libgpu.h>
#include <libdma.h>
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.