From 8f4ceebaf3cb4a11ddf1bc2e74491dbbc2165413 Mon Sep 17 00:00:00 2001 From: sShemet Date: Fri, 18 Apr 2025 23:00:55 +0500 Subject: [PATCH] vault backup: 2025-04-18 23:00:55 --- .../PSX code - modules load and exec.md | 178 +++++++++++++++++- 1 file changed, 177 insertions(+), 1 deletion(-) diff --git a/PERSONAL PROJECTS/PSX code - modules load and exec.md b/PERSONAL PROJECTS/PSX code - modules load and exec.md index 0bbf5ec..2956f1b 100644 --- a/PERSONAL PROJECTS/PSX code - modules load and exec.md +++ b/PERSONAL PROJECTS/PSX code - modules load and exec.md @@ -190,4 +190,180 @@ ccpsx MAIN.C -o MAIN.EXE --- -Теперь модули могут **полноценно взаимодействовать** с основной программой, проверяя и изменяя глобальное состояние игры! 🎮 \ No newline at end of file +Теперь модули могут **полноценно взаимодействовать** с основной программой, проверяя и изменяя глобальное состояние игры! 🎮 + + +------- + +Да, вы правильно поняли! В этой архитектуре **основная программа** и **модули** компилируются по-разному: + +--- + +### **1. Основная программа (MAIN.EXE)** +- **Не требует** явного указания библиотек PsyQ (если не использует их напрямую). +- Её задача — только **загружать модули** и **управлять общим состоянием** (`GameState`). +- Пример компиляции: + ```bash + ccpsx MAIN.C -o MAIN.EXE # Без -lpsxetc, -lpsxgpu и т.д. + ``` + +--- + +### **2. Дополнительные модули (MODULE_*.BIN)** +- **Должны включать** нужные библиотеки PsyQ, так как: + - Каждый модуль — **самодостаточный** исполняемый код. + - PsyQ не загружается глобально для модулей (они работают в изолированном контексте). +- Пример компиляции: + ```bash + # Модуль для GPU + ccpsx MODULE_GPU.C -o MODULE_GPU.BIN -lpsxgpu -lpsxgte + + # Модуль для MDEC + ccpsx MODULE_MDEC.C -o MODULE_MDEC.BIN -lpsxmdec + ``` + +--- + +### **3. Почему такая разница?** +| Компонент | Библиотеки PsyQ | Причина | +|--------------------|----------------|-------------------------------------------------------------------------| +| **Основная программа** | Не нужны | Только загружает модули и передаёт `GameState`. Не использует GPU/MDEC. | +| **Модули** | Обязательны | Каждый модуль — независимый код, требующий свои библиотеки. | + +--- + +### **4. Как это работает в памяти?** +1. Основная программа: + - Занимает **нижнюю часть RAM** (например, `0x80010000`). + - Не знает о существовании PsyQ-функций. + +2. Модули: + - Загружаются в **фиксированный адрес** (`0x80030000`). + - Содержат **свои копии библиотек** (например, `libgpu`). + - Получают доступ к `GameState` через указатель. + +--- + +### **5. Пример: вызов функций** +- В модуле `MODULE_GPU.C`: + ```c + #include // Библиотека внутри модуля + + void module_entry(GameState *state) { + // Использует свою копию LoadImage + RECT rect = {0, 0, 256, 256}; + LoadImage(&rect, (uint32_t*)texture); // Функция из libgpu + } + ``` + +- В основной программе (`MAIN.C`): + ```c + // Нет #include ! + void load_module() { + // Только загрузка бинарника + CdRead(sector, (uint32_t*)0x80030000, size); + } + ``` + +--- + +### **6. Ограничения** +- **Дублирование кода**: Каждый модуль содержит свои библиотеки → увеличивает размер. +- **Нет глобального состояния**: Если `libgpu` хранит внутренние переменные, они будут разными для каждого модуля. +- **Только последовательное выполнение**: Модули не могут работать одновременно (перезаписывают один регион памяти). + +--- + +### **7. Оптимизация** +Если модули используют **одни и те же библиотеки**, можно: +1. Вынести общие библиотеки в **отдельный загружаемый модуль**. +2. Передавать **указатели на функции** (как в предыдущих примерах). + +--- + +### **8. Итог** +- **Основная программа** — минималистична, без зависимостей. +- **Модули** — самодостаточные бинарники со своими библиотеками. +- **Общение** через общую структуру `GameState`. + +Это архитектурно напоминает **плагины в современных движках**, где каждый плагин собирается со своими зависимостями. + + + + + + +------------------ + + +Да, вы абсолютно правы! Моя ошибка — **основная программа действительно использует `libcd.h` (и другие библиотеки PsyQ для базовых операций)**, но **ключевое различие** в следующем: + +--- + +### **1. Уточнение архитектуры** +| Компонент | Библиотеки PsyQ | Почему? | +|--------------------|------------------------------------|-------------------------------------------------------------------------| +| **Основная программа** | `libcd.h`, `libetc.h`, `libgte.h` | Только для **загрузки модулей**, управления памятью и отладки (FntPrint). Не использует GPU/MDEC/SPU. | +| **Модули** | Свои специфичные библиотеки (`libgpu`, `libmdec`) | Каждый модуль — самостоятельный код, требующий **все свои зависимости**. | + +--- + +### **2. Исправленный пример компиляции** +#### **Основная программа (MAIN.C)** +```bash +# Нужны только базовые библиотеки для загрузки модулей +ccpsx MAIN.C -o MAIN.EXE -lpsxcd -lpsxetc -lpsxgte +``` + +#### **Модули** +```bash +# GPU-модуль (со своим libgpu) +ccpsx MODULE_GPU.C -o MODULE_GPU.BIN -lpsxgpu -lpsxgte + +# MDEC-модуль (со своим libmdec) +ccpsx MODULE_MDEC.C -o MODULE_MDEC.BIN -lpsxmdec +``` + +--- + +### **3. Почему основная программа не включает `libgpu`/`libmdec`?** +- Она **не вызывает** функции вроде `LoadImage()` или `MDEC_Decode()`. +- Её задача — лишь: + - Чтение секторов с диска (`libcd`). + - Вывод текста (`libetc`). + - Передача управления модулям. + +--- + +### **4. Аналогия с операционной системой** +- **Основная программа** — как **ядро ОС**, которое: + - Умеет загружать драйверы (модули). + - Не содержит код для работы с графикой/звуком. +- **Модули** — как **драйверы**, которые: + - Содержат весь специфичный код (например, для GPU). + - Получают доступ к «ядру» через общие структуры (`GameState`). + +--- + +### **5. Полный список зависимостей** +#### Для **MAIN.C**: +```c +#include // CdRead(), CdInit() +#include // FntPrint(), VSync() +#include // Базовая математика (если используется) +``` + +#### Для **MODULE_GPU.C**: +```c +#include // LoadImage(), DrawPrim() +#include // FntPrint() (если нужно) +``` + +--- + +### **6. Итог** +- **Основная программа** использует **минимальный набор PsyQ** (`libcd`, `libetc`). +- **Модули** включают **все необходимые им библиотеки** (`libgpu`, `libmdec` и т.д.). +- **Общение** между ними происходит через **общую структуру** `GameState`. + +Спасибо за замечание! Теперь архитектура стала ещё понятнее 😊. \ No newline at end of file