(27.06.2025 20:12)Elgor4uk писал(а): Похоже есть одно решение для NTSC приставок, которые испытывают трудности в PAL играх при принудительном багнутом изображении в 50Hz (актуально для игр, где отсутствует переключение в 60Hz). Мне помог выбор Behind the loader. Отсюда пару вопросов ведающим:
1. Может ли навредить включение Behind the loader игре? Мне допустим не трудно включить VGA для нормальной картинки PAL игр. Но если нету VGA, то Behind the loader как альтернатива будет ухудшать другие параметры игры?
2. Что вообще такое этот Behind the loader?
Эта настройка влияет косвенно и я кажется знаю почему. Забегая вперед скажу что ты таким образом просто затираешь другими данным область памяти для метаданных IP.BIN. И это не страшно.
Ну а вообще ты оторвал от контекста этот параметр. На какой вкладке он находится? Он находится на вкладке Heap (она же куча), а это в свою очередь область памяти, в которой загрузчик размещает динамические данные, например буфер для CDDA, служебная информация для файловой системы и т.п., что изначально не заложено внутри бинарника загрузчика.
По умолчанию загрузчик пытается автоматически подобрать место для этого, там есть ряд критериев, но обычно если в игре нет CDDA и не используется запуск с IP.BIN, то он размещается за метаданными из IP.BIN, при этом из IP.BIN эти самые метаданные загружаются в нужную область памяти.
Если же вручную выставить "Behind the loader", а это в контексте памяти для "кучи" должно говорить само за себя, типа разместить ее сразу за загрузчиком.
Если используется CDDA, но не используется запуск с IP.BIN, то загрузчик автоматически за собой размещает, потому что нет места для метаданных из IP.BIN. А если загрузчик размещается в конце оперативной памяти, то там работают другие правила...
В общем я понял что я буду очень долго разъяснять как это работает на самом деле и решил попросить нейросеть сгенерировать подробное описание на основе кода в загрузчике, вот что получилось:
Цитата:Анализ условий размещения памяти для malloc в DreamShell ISO Loader
Типы управления памятью
1. KATANA malloc (игровая память)
- Используется только если IsoInfo->heap == HEAP_MODE_INGAME
- Работает только с играми типа BIN_TYPE_KATANA
- Активируется только после загрузки игры (first == 0)
- Если инициализация KATANA malloc не удалась, переключается на внутренний malloc
2. Internal malloc (собственная реализация)
- Используется во всех остальных случаях
- Имеет несколько режимов размещения памяти
Режимы размещения памяти (Internal malloc)
Режим HEAP_MODE_SPECIFY (≥ заданного значения)
- Память размещается по адресу, указанному в IsoInfo->heap
- Пользователь сам задает адрес
Режим HEAP_MODE_AUTO (автоматический)
Сложная логика выбора адреса в функции internal_malloc_init_auto():
Области памяти Dreamcast:
- APP_BIN_ADDR = 0x8c010000 (область загрузки исполняемых файлов)
- IP_BIN_ADDR = 0x8c008000 (область IP.BIN)
- ISOLDR_DEFAULT_ADDR_LOW = 0x8c004000 (низкий адрес загрузчика)
- ISOLDR_DEFAULT_ADDR_HIGH = 0x8cfe8000 (высокий адрес загрузчика)
- ISOLDR_DEFAULT_ADDR_MIN = 0x8c000100 (минимальный адрес)
Условие 1: Loader ниже APP_BIN_ADDR И НЕ WinCE
if (loader_addr < 0x8c010000 && exec.type != BIN_TYPE_WINCE)
Подусловие 1.1 - Размещение в верхней памяти:
Адрес: 0x8cfe0000 (ISOLDR_DEFAULT_ADDR_HIGH - 0x8000)
- Loader в области 0x8c004000+ И включена эмуляция CDDA
(loader_addr >= ISOLDR_DEFAULT_ADDR_LOW && emu_cdda)
- ИЛИ: Эмуляция CDDA включена И IRQ отключены
(emu_cdda && use_irq == 0)
- ИЛИ: Режим загрузки НЕ прямой
(boot_mode != BOOT_MODE_DIRECT)
- BOOT_MODE_IPBIN = Bootstrap 1
- BOOT_MODE_IPBIN_TRUNC = Bootstrap 2
Подусловие 1.2 - Размещение после IP.BIN:
Адрес: 0x8c008800 (IP_BIN_ADDR + 0x800)
- Loader заканчивается до IP_BIN_ADDR
(loader_end < 0x8c008000)
- И: Эмуляция CDDA выключена ИЛИ IRQ включены
(emu_cdda == 0 || use_irq)
Условие 2: Loader выше APP_BIN_ADDR
if (loader_addr > 0x8c010000)
- Адрес: 0x8c001100 (ISOLDR_DEFAULT_ADDR_MIN + 0x1000)
Условие 3: WinCE исполняемые файлы
if (exec.type == BIN_TYPE_WINCE)
- Если loader заканчивается до IP_BIN_ADDR:
Адрес: 0x8c008800 (IP_BIN_ADDR + 0x800)
Режим HEAP_MODE_MAPLE
Функция internal_malloc_init_maple(int first):
После загрузки игры (first == 0):
- Базовый адрес: MAPLE_REG(MAPLE_DMA_ADDR) (адрес Maple DMA)
- Смещения зависят от условий:
Условие: CSO образы ИЛИ эмуляция CDDA
if (image_type == ISOFS_IMAGE_TYPE_CSO || emu_cdda)
Иначе: Зависит от типа исполняемого файла
- KOS исполняемые: BIN_TYPE_KOS - смещение +0x3000
- Остальные типы: BIN_TYPE_KATANA/WINCE - смещение +0x5000
При первом запуске (first != 0):
- Используется автоматический режим internal_malloc_init_auto()
Режим по умолчанию
- Адрес: ALIGN32_ADDR(loader_end) (сразу после загрузчика)
Эта сложная система позволяет DreamShell ISO Loader адаптироваться под конкретные условия запуска и обеспечивать стабильную работу различных игр и homebrew приложений на Dreamcast.
Возможно тут есть ошибки в нюансах, но в целом примерно так и есть.