vault backup: 2025-04-19 00:21:02
This commit is contained in:
6
.obsidian/workspace.json
vendored
6
.obsidian/workspace.json
vendored
@@ -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",
|
||||
|
||||
@@ -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.
|
||||
Reference in New Issue
Block a user