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": {
|
"state": {
|
||||||
"type": "markdown",
|
"type": "markdown",
|
||||||
"state": {
|
"state": {
|
||||||
"file": "PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.md",
|
"file": "PERSONAL PROJECTS/PS1 DOCS/PS1 DMA.md",
|
||||||
"mode": "source",
|
"mode": "source",
|
||||||
"source": false
|
"source": false
|
||||||
},
|
},
|
||||||
"icon": "lucide-file",
|
"icon": "lucide-file",
|
||||||
"title": "PS1 IRQ"
|
"title": "PS1 DMA"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
@@ -207,8 +207,8 @@
|
|||||||
},
|
},
|
||||||
"active": "dd912cc876184c4f",
|
"active": "dd912cc876184c4f",
|
||||||
"lastOpenFiles": [
|
"lastOpenFiles": [
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PSX code IRQ handling.md",
|
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 IRQ.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/PS1 Geometry Transformation Engine.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
|
"PERSONAL PROJECTS/PS1 DOCS/LZSS C++ Lib.md",
|
||||||
"PERSONAL PROJECTS/PS1 DOCS/PS1 Ordering table.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)
|
- [PSX DMA Hardware Specs](http://problemkaputt.de/psx-spx.htm#dmacontroller)
|
||||||
- [PsyQ SDK Docs](http://psx.arthus.net/sdk/PsyQ/DOCS/)
|
- [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