Skip to content

Instantly share code, notes, and snippets.

@holub
Last active July 26, 2025 02:59
Show Gist options
  • Save holub/4d04606f09c7e1816adbdf902d91ed91 to your computer and use it in GitHub Desktop.
Save holub/4d04606f09c7e1816adbdf902d91ed91 to your computer and use it in GitHub Desktop.

MAME в Хауту (неофициальный гайд для Спектрумодов) v25.02

Исторически MAME ассоциируется с эмулятором для Arcade машин, но на сегоднешний день имеет приличную поддержку широкого спектра различных ПК в том числе ZX Spectrum (тайминги, вэйт память, устройства порта расширений) и его клонов: 48, 128, +2, +3, Pentagon, ATM, Scorpion, Sprinter, Evo TsConf, Evo BASECONF, Байт, и.т.д.

Установка

Телеграм: https://t.me/zx_mame

Оффициальные сборки здесь: https://www.mamedev.org/release.html

Документация: https://docs.mamedev.org/

Еще понадобятся ROMы под интересующие системы (в терминах MAME driver). Актульный торрент можно взять здесь: https://pleasuredome.github.io/pleasuredome/mame/index.html

Можно сделать так:

  • Скачать торрент 'MAME 0.XXX ROMs (split)'
  • Отменить загрузку всех файлов в настройках
  • Добавить папку в mame.ini: rompath roms;~/.mame/pleasuredome/roms
  • Когда Эмулятор 'ругается' на отсутвиие ROM для driver. Зайти в трекер и поставить галочку на интересующем.

Если Вы добыли ROMы из других источников, их необходимо скопировать в паку roms прямо в архивах не расспаковывая.

Настройка

TAB - меню эмулируемой системы

Настройки для конкретной системы можно менят из меню, либо в mame.ini
см. mame -showconfig

Для TSConfig, и Pentevo(BASECONF) активируйте AT клавиатуру: TAB > Input Settings > Keyboard Selection > AT Keyboard [root:pc_keyboard] Enabled
Для Sprinter: TAB > Input Settings > Keyboard Selection > Microsoft Natural Keyboard [root:ms_naturl] Enabled

Использование

Многого можно добится используя UI, но удобнее из коммандной строки
mame spec128 -listmedia
mame spec128 -skip_gameinfo -cassette path/dizzy8.tap
mame pentagon -flop1 path/shock.trd
mame tsconf -hard path/wc.img

Добавить слоты расширений. Если слот имеет свой ностель, то (скорее всего) он получит приоритет над основным.
mame spectrum -exp musicmachine -cassette path/Music\ Machine.tzx
mame sprinter -skip_gameinfo -hard1 path/sprinter.img -isa0 zxbus_adapter -isa0:zxbus_adapter:card neogs -hard5 path/gs.img
mame tsconf -skip_gameinfo -zxbus1 neogs -hard1 path/gs.img -hard2 path/wc.img
mame sprinter -listslots

Больше параметров

-window оконный режим
-mouse_device none помогает когда основной курсор захватывается окном эмулятора
-ui_active Запускать с активными клавишами эмулятора
-nofilter отключить фильтры рендера и сделать картинку 'не размытой'
-skip_gameinfo не отоброжать окно с информацией при старте
-screen0 \\.\DISPLAY2 стартовать на втором мониторе
-hard1 \\.\PHYSICALDRIVE3 Win: подключение физического диска
... еща больше здесь

Горячие клавиши

ScrLk - отключение горячих клавиш эмулятора
Esc - выход
PgDn - максимальное ускорение эмуляции
F3 - soft reset
Shift+F3 - hard reset
F4 - просмотр палитры, шрифтов, тайлов. (Enter, [, ])

Образы носителей

Из неприятного: форматы *.scl не поддерживается.
Для конвертирования scl в trd можно воспользоваться внешней программой scl2trd.

chd внутренний формат образов дисков, который позволяет хранить одновременно данные и медиа слои. Ковертируется во внутренний формат chd так:

chdman createhd -i games.img -o games.chd -c none           # без сжатия данных
chdman createhd -i my.vhd -o my.chd -c zstd,zlib,huff,flac  # 7zip сжатие данных

Отладка

Матчасть

mame ... -d запустить с включенным отладчиком
mame ... -d -debugger imgui с альтернативным отладчиком

Debug > New Memory Window (Ctrl+M) - Основной источник о эмулируемой системы (таких окон можно открыть сколько угодно). Далее в выподающем списке окана нужно выброть интересующее значение. Например:

  • Zilog Z80 ':maincpu' program space memory - 64K памяти, как ее адрессует Z80
  • RAM/:ram/0/m_pointer - все страницы ОЗУ
  • ZX Spectrum 128/:/0/m_port_7ffd_data - состояние порта #7FFD

Так же можно использовать комманды в окне: help, help Watchpoints, help Memory, ...

Рецепты

Основные

history      ;История последних комманд

bc=#1234     ;Присвоить BC 1234 (dec)
c=1a         ;Присвоить C 1a (hex)

b@9f0e=3     ;Записать байт по адрессу 9f0e
w@9f0e=34bc  ;Записать слово по адрессу 9f0e

ib@7ffd=4    ;Запись в порт 7ffd

Прервать исполнение при ...

bp 7cd3                              ; выполнении инструкции в #7СВ3
wp 5ffc,2,w                          ; записи в адресса #5FFC, #5FFD
wpi 0,ffff,w,{(wpaddr & 00FF) == 82} ; записи в порт #xx82

Записать в лог 1сек исполнения

trace run.asm,,noloop,{tracelog "sp:%04X r:%04X r':%04X | ", sp, af, af2}
gt #1000

Импорт breakpoints из sjasmplus (спасибо Sergei Smirnov)

  1. Добавить в sjasmplus в после сборки проекта команду: bplist "bin/bpx.ini" unreal

  2. sjasmplus создаст на диске файл, содержащий адреса точек останова. Кол-во строк в этом файле равно кол-ву точек останова:

x0=0x8847
x0=0x884E
  1. Любым способом (автозаменой, или shell-скриптом, или программой из пары строк на любом языке) нужно сконвертировать эти строки в формат, понятный МАМЕ. Hint: /^x0=0x([0-9A-F]{4})$/
    Чтобы получилось так:
bp 8847
bp 884F
  1. Чтобы МАМЕ при запуске не встал колом на адресе 0000, нужно добавить в конец команду "g". Должно получиться так:
bp 8847
bp 884F
g
  1. Сохранить это в файл debugscript.txt

  2. Далее, можно запускать МАМЕ либо с параметром debug, либо без него, в зависимости от физического существования файла debugscript.txt:

if exist debugscript.txt (
    mame.exe ... ...  -debug -debugscript debugscript.txt
) else (
    mame.exe ... ...
)

Подсчет тактов выполняемого кода

  1. Для этого понадобится доступ к lua console:
mame spectrum -console -d
  1. Подходим к началу интересующего отрезка и запоминаем исходное состояние:
[MAME]> t = manager.machine.time:as_ticks(3500000)

Здесь: 3500000 - текущая частота процессора

  1. Останавливаем исполнение в конце отрезка:
[MAME]> print(manager.machine.time:as_ticks(3500000)-t)

Онлайн версии

Ссылки

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment