Блог    Теги    RSS    Файлопомойка Мой Github Мой Telegram

Блог №200 по адресу 0708:07C7 / Эмуляция древних консолей

21 июня 2010, 20:59
Многие из нас в 90-е годы имели приставку типа Денди или Сега. Не открою америку, если скажу, что на любом компьютере старше 486sx можно путем программной эмуляции погамать в любимые игрушки. Сейчас я хочу рассмотреть эту тему подробнее. Итак, что нам нужно (для определенности будем дальше работать с консолью NES (ака Денди), но аналагично и для других приставок):

Эмулятор
Это - наш главный инструмент, как скальпель для хирурга и как vim для программиста :) От выбора эмулятора зависит то, насколько комфортно нам будет играть и будет ли вообще игра доставлять удовольствие. Для Linux выбор эмуляторов не так широк как хотелось бы, но для неискушенного пользователя вполне хватит. Мною был выбран Mednafen в первую очередь за универсальность. Он поддерживает кучу различных консолей начиная от всеми известной Денди и заканчивая экзотическим Watara Supervision. Но к сожалению в этом списке пока нет Сеги и Супер Нинтендо :( (может быть кто желает помочь автору с этими консолями?). Главной недостаток и в то же время главное достоинство этого эмулятора - отсутствие какого-либо графического интерфейса в стандартной поставке. С данным вопросом мы разберемся во второй части статьи, а пока опробуем его. Запускаем из консоли, параметром указываем РОМ с игрой, скачанный предварительно с любого из сотен сайтов по этой тематике.
thumb.png
Первый вопрос, который хочется задать: а что тут с управлением? По системным кнопкам информацию можно получить через F1. Из интересных комбинаций тут у нас alt+s для включения возможностей прокрутки назад (о! как этого нехватало на железной Денди, особенно в Battletoads!) и alt+shift+1 для настройки кнопок первого джойстика Денди. Нас попросят по очереди нажать на клавиатуре или джойстике кнопки, соответствующие кнопкам джойстика Денди. Всего на одну кнопку Денди можно назначить до четырех кнопок джоя/клавиатуры. Я назначил стрелки на крестовину, Z и X на A и B, Space на Select и Enter на Start, также задал и соответствующие кнопки железно джойстика Денди, подключенного через переходник на LPT.
С управлением разобрались, теперь второй вопрос на повестке дня - графика. Действительно, умолчальные настройки выглядят весьма непривлекательно. Чтобы подкорректировать их нам придется залезть в конфигурационный файл ~/.mednafen/mednafen.cfg. Пару слов о формате файла: большинство настроек задается отдельно для каждой консоли в виде "консоль.подсистема.параметр значение". Я рассмотрю настройку для Денди(NES), но для других консолей все аналогично. Нас интересует один блок настроек, далее я его приведу с комментариями?

;Разрешение в полноэкранном режиме - ширина
nes.xres 1280
;Разрешение в полноэкранном режиме - высота
nes.yres 800
;Ширина в оконном режиме = 256*это_число
nes.xscale 2.2
;высота в оконном режиме = 240*это_число (или 224 в зависимости от игры)
nes.yscale 2
;Ширина в полноэкранном режиме = 256*это_число
nes.xscalefs 3.4
;высота в полноэкранном режиме = 240*это_число (или 224 в зависимости от игры)
nes.yscalefs 3
;Использовать т.н. scanlines - число - это их процент на экране. Эмулирует вид как на старых телевизорах. вобщем легче посмотреть чем объяснить.
nes.scanlines 8
;Растягивать на весь экран в полноэкранном режиме - тогда параметры nes.xscalefs и nes.yscalefs не используются. ИМХО - на ЖК мониторах лучше смотрится нерастянутое изображение.
nes.stretch 0
;Биллинейная интерполяция - сильно замыливает изображение, рекомендуется только если программные фильтры процессор не вытягивает а scanlines не нравятся
nes.videoip 0
;Программные фильтры. Тут на вкус и цвет. В ассортименте none, scale2x, hq2x, nn2x, nny2x. вместо 2х можно 3х и 4х - тогда изображение будет контрастнее на больших разрешениях и загрузка процессора больше.
nes.special scale2x
;Фильтр OpenGL, чтобы работало нужно параметр "video sdl" заменить на "video gl". варианты: ipxnoty, ipynotx, ipsharper, ipxnotysharper, ipynotxsharper, scale2x (3x/4х/6х/8х)
nes.pixshader none
Все, можно было бы играть, но через консоль запускать неудобно. Нужен комфорт :) И в этом нам поможет...


Каталог
Я бы выделил две категории эмуляторщиков - первые долго бродят по различным онлайн каталогам игр, затем скачивают и запускают понравившуюся игру. С этим все понятно - кликнул на игре, запустился эмулятор и играй. Вторые же как правило скачивают полный набор Good* (реже No-Intro) с целью получить все и сразу. Вот тут здорово помогут каталогизаторы. В свое время я использовал QuickPlay - всем он хорош, но только для Windows. Отсутствие каталога в любимой ОС здорово усложнило задачу - нужно было зайти в папку с архивами, найти нужный, найти файл в нем и наконец запустить игру. Но вскоре чудом (учитывая неразрекламированность проекта) был найден Gelide.
thumb.png
На офсайте можно скачать готовые пакеты под Debian, хотя не так давно мне приходилось компилировать вручную.
Итак, главное его умение - показывать список игр, разделенный по консолям (есть и другие фильтры). Как дополнительные плюшки - он может показывать некоторую полезную информацию о ROM'е и фотки картриджа. Последних у меня не оказалось, поэтому все кроме списка игр, консолей эмуляторов было благополучно убрано. Дальше нам надо добавить наш GoodNES (предварительно найденный и скачанный на просторах сети) в каталог. Тут есть несколько вариантов - в контекстном меню пункта "Nintendo NES" выбираем "Edit" и в открывшемся окне поле "Roms Directory" задаем путь до нашего распакованного ГудНЕСа. Другой вариант - распаковываем прямо в ~/.gelide/Nintendo Nes/roms/. Но так как у меня была необходимость играть и в других ОС, то я выбрал вариант символических ссылок (замечу, что это удобно еще и при перемещении нашей коллекции в другое место - достаточно обновить симлинки и не надо беспокоиться о настройках Gelide).
Итак, GoodNES распакован, теперь нужно в контекстном меню нашей приставки выбрать пункт "Refresh" и вауля - в основной части окна появились наши заветные игры. Однако тут нас ждет большой облом - Mednafen не понимает архивы! Тут можно опустить руки, бросить все и пойти старым путем - запускать игры через файловый менеджер. Но нас-то такими мелочами не остановишь :) По-быстрому был написан скрипт-оболочка для наших эмуляторов:
(Маленькое отступление: в архивах GoodNES с игрой кладется куча разных версий РОМа в т.ч. графических хаков, овердампов , бэддампов и т.д. Естественно, брать первый попавшийся не получится т.к. вполне можем запустить нерабочий РОМ о чем узнаем при зависании где нибудь на последнем уровне :) )

#!/bin/sh

# Name: emu-arc
# Author: Uzix (uzix@jabber.org)
# Description: Script for run ROM's from GoodMerged-archives

sel_rom () {
IFS="" ARC_ALLFILES=`7z l -slt "$ARC_PATH" | grep 'Path = ' | gawk -F ' = ' '{print $2}'`
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '(Beta)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | grep -v '(VS)' | grep -v '\test -z "$ARC_FILE" &&\
ARC_FILE=`echo $ARC_ALLFILES | head -n1`
test -z "$ARC_FILE" &&\
echo E: Could not find any file in archive. &&\
exit 4
}

ARC_PATH=$1
ARC_EMU=$2
ARC_NAME=`echo "${ARC_PATH}" | gawk -F'/' '{print $NF}'`
ARC_TYPE=`echo "${ARC_NAME}" | gawk -F'.' '{print $NF}'`
ARC_FILE='/dev/null'
echo I: Archive patch: ${ARC_PATH}
echo I: Archive name: ${ARC_NAME}
echo I: Archive type: ${ARC_TYPE}

if [ ! -r "${ARC_PATH}" ]; then
echo E: Archive not readable
exit 1
fi

case "${ARC_TYPE}" in
7z|zip|rar)
if [ ! -x "`which 7z`" ]; then
echo E: 7z archiver not found. Please, install it.
exit 2
fi
sel_rom
7z e -y -o"${HOME}" "${ARC_PATH}" "${ARC_FILE}"
;;
*)
echo E: Unrecognized archive type
ARC_FILE="${ARC_NAME}"
ln -fs "`pwd`/${ARC_PATH}" "${HOME}/${ARC_FILE}"
;;
esac

ARC_FTYPE=`echo "${ARC_FILE}" | gawk -F'.' '{print $NF}'`
echo I: Selected file: ${ARC_FILE}
echo I: Selected file type: ${ARC_FTYPE}
if [ ! -x "`which "${ARC_EMU}"`" ]; then
case "${ARC_FTYPE}" in
nes|fds|sms|gg|gb|gbc|gba|ws|wsc|pce|ngp|ngc)
for i in mednafen; do
test -x "`which $i`" && ARC_EMU="$i"
done
;;
bin|smd)
for i in dgen gens; do
test -x "`which $i`" && ARC_EMU="$i"
done
;;
smc)
for i in bsnes snes9x zsnes; do
test -x "`which $i`" && ARC_EMU="$i"
done
;;
esac
fi
if [ -z "${ARC_EMU}" ]; then
echo E: Could not find suitable emulator
exit 3
fi
echo I: Selected emulator: ${ARC_EMU}
xdg-screensaver suspend `xwininfo -root |grep id\: | awk '{print $4}'`
"${ARC_EMU}" "${HOME}/${ARC_FILE}"
xdg-screensaver resume `xwininfo -root |grep id\: | awk '{print $4}'`
rm "${HOME}/${ARC_FILE}"
exit 0



Что он делает? Он смотрит содержимое архива с помощью 7z, выбирает наилучший РОМ (функция sel_rom), распаковывает его, ищет подходящий эмулятор и запускает все это. Помещаем скрипт в /usr/local/bin/ и даем ему +x. Теперь нужно добавить скрипт в Gelide в качестве эмулятора. Для этого вызываем контекстное меню во фрейме с эмуляторами и жмем "Add". Заполняем примерно так:
thumb.png
Готово! Теперь можно и поиграть! выбираем любимую игру, выбираем скрипт emu-arc и... В БОЙ! :-)



P.S. Не злоупотребляйте сохранениями :)

P.P.S. Если будет необходимость, добавлю описание настройки dgen (эмулятор сеги) и zsnes (супер нинтендо)

P.P.P.S. Первый пост.

Пост был написан для блога welinux.ru
Теги: #nix   #денди   #игры   #эмуляция  

Комментарии RSS

Ваше имя:

E-mail (будет скрыт):

Текст: