PDA

Просмотр полной версии : Exolon на Специалисте + задача для спектрумистов



CityAceE
22.01.2019, 06:30
Посмотрите на эти скриншоты, снятые из эмулятора ПК Специалист Emu80 (ищите exolon.rks во вложении):

https://pic.maxiol.com/images/1548124336.3254906935.exolon18.png https://pic.maxiol.com/images/1548124378.3254906935.exolon28.png

Нравится? Вот и мне тоже! А теперь чуть подробнее.

Специалист (в варианте ЛИК (https://ru.wikipedia.org/wiki/%D0%9B%D0%B8%D0%BA_(%D0%BA%D0%BE%D0%BC%D0%BF%D1%8C %D1%8E%D1%82%D0%B5%D1%80))) был моим первым компьютером. Я и до сих пор бережно храню его. Недавно отдав дань памяти, я написал эмулятор Специалиста на языке Python (https://zx-pk.ru/threads/29897-spycialist-emulyator-pk-spetsialist-na-python.html). Но это лишь подстегнуло ещё больший интерес к платформе, вытащив наружу из памяти мои старые идеи. Когда я был владельцем только лишь Специалиста, я с завистью поглядывал на такие хиты ZX Spectrum’а, как Batty и Exolon. Совершенно не разбираясь в программировании, тогда мне казалось, что такие игры попросту не реальны на Специалисте. В итоге приходилось довольствоваться тем, что было. А было совсем не много, да и качество этого оставляло желать лучшего. Но спустя годы, стало понятно, что даже на Специалисте можно было воплотить многое из того, выходило на ZX Spectrum. Проблема была в том, что попросту некому было всё это писать.

Вообще, до сих пор моей заветной мечтой является возможность поиграть в Batty на Специалисте. Но наработок в этой области вообще нет. Видимо, не так много людей испытывают такие же чувства к этой игре. Зато с Exolon’ом всё в порядке. Благодаря благословению автора и упорству esl у нас имеются полные исходные тексты игры (https://zx-pk.ru/threads/24083-nuzhno-exolon-code-source.html?p=758275&viewfull=1#post758275), готовые к портированию куда угодно. Помимо собственно наличия исходников Exolon’а, к портированию игры на Специалист предрасполагают следующие факторы:


Игра не использует прерывания
Игра не использует процедур ПЗУ
Код написан так, что портирование на другую платформу не вызывает проблем. Автор в своё время переносил Exolon на Amstrad CPC и это заняло у него всего несколько дней вместе с рисованием новой графики.


Как я себе представляю этапы переноса Exolon’а на Специалист с учётом современных средств разработки:


Переписываем процедуры вывода графики, опроса клавиатуры и вывода звука под Специалист. При этом отлаживаем всё под эмулятором Специалиста с процессором Z80.
Избавляемся от специфических инструкций Z80, заменяя такие инструкции конструкциями, состоящими из инструкций Intel 8080, либо полностью переписывая процедуры.


Мне кажется, что серьёзных проблем возникнуть не должно. Возможно, может не хватить быстродействия. Однако порт Exolon’а для ПК Вектор-06Ц (http://sensi.org/scalar/ware/405/) говорит о том, что КР580ВМ80А, работающий на частоте 2 MHz, вполне способен переварить это дело.


https://www.youtube.com/watch?v=GTXcP9Hu50s

На моём Специалисте была лишь однобитная чёрно-белая графика и мне приходилось лишь облизываться на статьи в Моделисте-Конструкторе, где описывался контроллер цветности, вначале 4-х цветный, а потом 8-ми цветный. Поэтому я подумал, что Exolon на Специалисте вполне мог бы быть чёрно-белым. Но потом мне стало любопытно, а что же там с цветами на Специалисте? Для этого я решил написать загрузчик Спектрумовских картинок в Специалист. Но, во-первых, у меня не было средств разработки под Специалист. А, во-вторых, мнемоники i8080 мне сейчас уже почти ни о чём не говорят. Собственно, долго думать не пришлось. В качестве компилятора я задействовал привычный мне кросс-ассемблер Z80 SjASMPlus (https://zx-pk.ru/threads/447-sjasmplus-z80-kross-assembler.html) и настроил всё так, чтобы после компиляции я получал готовый к загрузке в эмулятор Специалиста файл c расширением RKS. Конечно, приходится быть предельно внимательным и чётко понимать какие инструкции есть у i8080, а каких нет. Так, можно совершенно машинально вместо JP LABEL написать JR LABEL, а потом долго искать почему правильно написанная программа благополучно скомпилировалась, но не работает на эмуляторе.

Спектрумовские картинки на экране Специалиста впечатлили. Несмотря на серьёзные ограничения в цветах и метод их отображения, многие картинки со Спектрума выглядят практически так же. Судите сами:

https://pic.maxiol.com/images/1548124560.3254906935.exolon21.png https://pic.maxiol.com/images/1548124585.3254906935.exolon24.png https://pic.maxiol.com/images/1548124378.3254906935.exolon28.png

Даже чётырёх-цветная графика выглядит неплохо!

С графикой поэксперементировал. Дальше решил попробовать звук, а вместе с ним и адаптацию кода Z80 к i8080. Для экспериментов я выбрал sound_beeper_music.asm из пакета исходников Exolon.

И вот тут у меня случился затык. Я уткнулся в нехватку регистров, команд и быстродействия. В итоге мне всё-таки удалось заставить Специалист хоть как-то воспроизводить мелодию из Exolon’а, но происходит это ооооочень медленно. Чтобы услышать мелодию так, как она звучит на Спектруме, нужно включить в эмуляторе Специалиста режим максимальной скорости:

https://pic.maxiol.com/images/1548124835.3254906935.emu80.png


Это происходит, во-первых, из-за того, что сам процессор Специалиста работает почти вдвое медленнее Z80. А, во-вторых, я конвертировал процедуру, что называется «в лоб» с ужасно тормозной конструкцией заменяющей команду EX AF,AF’. Чтобы всё зазвучало как нужно, требуется переписать плеер с чистого листа. А то, что i8080 способен потянуть эту мелодию подтверждает порт Exolon’а на Вектор-06Ц (см. видео). Да, там мелодия играет чуть медленнее, но при этом она играет почти как же, как в оригинале.

Написание такого плеера может явиться интересной задачей для скучающих спектрумовских кодеров. Процедура проигрывания довольно короткая, но при этом очень критичная ко времени исполнения. Задача вполне себе тянет на, так любимый многими, этюд. К тому же всё написано в привычной для спектрумистов мнемонике Z80.

Всё необходимое для решения задачи (компилятор, настроенные файлы и исходники) приложено к этому сообщению. Вам остаётся лишь скачать и распаковать это, запустить exolon.bat и получить на выходе exolon.rks, который можно загрузить в эмулятор Специалиста. А самую свежую версию эмулятора Специалиста можно взять здесь (https://zx-pk.ru/threads/27488-emu80-v-4.html).

Ещё на всякий случай упомяну, как формируется звук на Специалисте. Чтобы динамик зазвучал, необходимо с определённой частотой чередовать запись чисел #0A и #0B в ячейку по адресу #FF03 (на самом деле в любую ячейку по маске #F803). Вообще, за вывод звука отвечает только один нулевой бит, но системный загрузчик для вывода звука засылает в порт не #00 и #01, а именно #0A и #0B. Я не стал разбираться с чем это связано.

В приложении к этому сообщению вы найдёте демку exolon.rks, которая выводит две картинки из игры Exolon и воспроизводит две «мелодии» оттуда же. Смена картинки вместе мелодией осуществляется нажатием на любую кнопку.

Ну а для тех, кому интересно покопаться внутри, я прилагаю исходный текст с компилятором - exolon_src.zip. Не судите строго мой код - там оптимизировать и оптимизировать. Но зато всё работает так, как было задумано.

P.S. Заменил exolon.rks во вложении на вариант с плеером от ivagor - там музыка играет почти как в оригинале.

ivagor
22.01.2019, 09:27
CityAceE, насчет звука. За звук отвечает 5й бит порта C ВВ55 (FF02), можно и в него напрямую писать для получения звука. Но корректнее как раз программировать его через регистр управляющего слова (FF03):
Ah=1010b=(5<<1)+0 - записываем 0 в 5й бит C
Bh=1011b=(5<<1)+1 - записываем 1 в 5й бит C

ivagor
22.01.2019, 18:55
Задача для спектрумистов, но я все же попробую. Взял за основу векторовскую версию, с которой давно разбирался, и сильно переделал под специалист. Получилось не идеально, но слушать (особенно если абсолютного слуха нет) можно. В спектрумовском оригинале, честно говоря, тоже не все ноты точные, но там, конечно, лучше.

tnt23
22.01.2019, 21:04
ivagor, я правильно понимаю, что оно рассчитано на доступ к портам как памяти? что куда копнуть для альтернативных систем, где бипер доступен через out?

Простите меня, я слоупок.

goodboy
22.01.2019, 21:07
В спектрумовском оригинале, честно говоря, тоже не все ноты точные
изначально Nick Jones создал мелодию на/под c64, а дальше уже примерно адаптировали

ivagor
22.01.2019, 21:58
tnt23, в векторовском эксолоне с outами, с ними чуть хуже получается, меньше диапазон в высокую область.

- - - Добавлено - - -

На всякий случай уточню, что когда писал про неточности нот в спековской версии, я говорил о биперном варианте музыки, не об AY.

CityAceE
23.01.2019, 07:00
Задача для спектрумистов, но я все же попробую.
Иван, в очередной раз спасибо! А спектрумистам, похоже, уже вообще ничего не нужно...

Перевёл мнемонику в привычную мне (z80) и добавил твой плеер в свои исходники. Теперь получилась почти что полноценная дема для Специалиста уровня начала 90-х. Только бегущей строки не хватает :) А так и картинки почти, как на Спектруме, и музыка почти, как на Спектруме.

Готовый к загрузке в эмулятор файл ищите в первом сообщении данной темы, а исходники прикреплены к этому сообщению. В целях экономии места, я не стал добавлять в архив SjASMPlus. Кому нужно, смогут его взять из исходников, прикреплённых к первому сообщению.

ivagor
23.01.2019, 08:01
Пару моментов вчера забыл написать.
1. Для выхода в монитор при проигрывании можно нажать F1-F11 (и еще какую-то клавишу, надо посмотреть раскладку клавиатуры специалиста)
2. Данный плеер будет неправильно работать на z80, т.к. в одном месте используется проверка флага четности после инкремента. Это не проблема, просто особенность, т.к. для z80 можно или использовать оригинальный плеер или написать более быстрый.

- - - Добавлено - - -

Еще хочу написать, что смог быстро отреагировать только потому, что раньше разбирался с векторовским эксолоном.

CityAceE
23.01.2019, 08:17
Ещё раз перечитал историю создания векторовской версии Exolon'а. Видимо, не так просто будет его адаптировать к Специалисту. И похоже, что лучше всего при адаптации как раз опираться на версию Вектора - там хотя бы учтены тормоза i8080. Но с другой стороны, там для синхронизации используется таймер, который отсутствует в Специалисте.


Еще хочу написать, что смог быстро отреагировать только потому, что раньше разбирался с векторовским эксолоном.
Посмотрим, вдруг кто-то всё-таки примет вызов и сумеет сделать ещё лучше! ;)

ivagor
23.01.2019, 10:12
У векторовского эксолона для определения текущего положения луча используется таймер, а таймер перед этим привязывается к лучу с помощью прерывания. Но это в основном связано именно с векторовскими особенностями, что опрос клавиатуры и программирование палитры можно делать только в определенные интервалы времени относительно развертки. А автор захотел еще стек использовать для рисования и запрещает прерывания.
Т.е. если не на векторе, то таймер и прерывания не критичны.

ivagor
23.01.2019, 22:24
Разогнать основной цикл проигрывателя (и соответственно расширить вверх диапазон воспроизводимых нот) вряд ли получится, а вот сократить и подравнять побочные ветки можно. Правда нужно будет больше памяти. Реализация этого подхода - версия V2, в которой (по крайней мере должно быть) меньше посторонних призвуков и обертонов.
Также не могу не поделиться своеобразной версией V2weird, которая хуже первого варианта и V2 по скорости основного цикла/диапазону, но (по крайней мере мне) было интересно подтвердить на практике, что так тоже можно. Там освободились 2 регистра, которые можно использовать или для ускорения реинициализации счетчиков каналов или для ускорения внешнего цикла длительности (сам бы я выбрал 1й вариант).
Плюс эти версии могут работать на z80, хотя для гладкости на z80 их надо слегка подтюнинговать.

- - - Добавлено - - -


Разогнать основной цикл проигрывателя (и соответственно расширить вверх диапазон воспроизводимых нот) вряд ли получится
Когда еще раз взглянул на V2, то заметил, что получится заметно разогнать/расширить диапазон, да еще и немного сократить размер. V2 удалил, V2weird оставил в качестве курьеза.

CityAceE
24.01.2019, 03:51
Обновил exolon.rks в первом сообщении с новым плеером от ivagor.

ivagor
24.01.2019, 08:14
Вчера прикинул - основной цикл V3 на орионе (8080 на 2.5 МГц) догонит и даже немного перегонит оригинал (z80 3.5 МГц).
Насчет Pause - если играть только 2 штатные мелодии, то эту процедуру можно убрать, пауз там нет. А если даже писать свои мелодии с паузами, то ее можно и нужно оптимизировать, сведя к простому калиброванному циклу.

ivagor
25.01.2019, 20:43
Если не ориентироваться на применение проигрывателя в программе, а смотреть на него как на отдельную задачу, то получается офигенный результат. Развернул циклы - избавился от внутреннего счетчика. Убрал все балластные команды (теперь основной цикл и без них ровный). Основной цикл ускорился настолько, что стал быстрее цикла спековского проигрывателя. Пришлось пересчитать периоды нот. Плата за все это - всего то 10 Кб памяти.
Кода Максима Китченко здесь уже совсем нет. В V3 была пауза, которая не использовалась.

goodboy
25.01.2019, 20:53
Развернул циклы - избавился от внутреннего счетчика.
...
Плата за все это - всего то 10 Кб памяти
в первых плейерах мелодии хранились вообще сразу в виде частот (даже не выбирались из таблицы)
хранение мелодии в виде байткода появилось чуть позже.
возможно и тут можно применить такой подход

ivagor
25.01.2019, 21:03
Проблема была в том, что медленность основного цикла не позволяла играть высокие ноты этой мелодии, а теперь основной цикл достаточно (и даже более чем) быстрый.
Хранение нот в виде частот чуть-чуть ускорит проигрывание, но на диапазон извлекаемых звуков не повлияет. При необходимости ускорить проигрывание проще делить длительности на какую-то константу.

jerri
27.01.2019, 00:25
как это работает?
спец вроде чб?

fifan
27.01.2019, 09:05
как это работает?
спец вроде чб?

Специалист цветной.

jerri
27.01.2019, 22:43
fifan, как цвета задаются?

balu_dark
28.01.2019, 00:50
fifan, как цвета задаются?

В регистр ВВ55 кладется 3 бита цвета. все записываемые в экран после этого точки будут окрашены в соответствующий цвет. тоест запулил в порт зеленый цвет - потом рисуешь все точки которые должны быть зелеными . поменял цвет на красный - прорисовываешь все красные. итд. Если не ошибаюсь - цвет идет на 8 бит полоску. PAPER в обычном специалисте не используется, только в МХ (Fifan: подправил - просто МХ, МХ2 - это совмещение std и MX).

fifan
28.01.2019, 09:13
Смотрите описание контроллера цвета (http://www.spetsialist-mx.ru/index3.html) (низ страницы).

jerri
28.01.2019, 12:06
Смотрите описание контроллера цвета (http://www.spetsialist-mx.ru/index3.html) (низ страницы).

Бро, мне вот эти вот полосочки и квадратики с циферками как китайская грамота.
код цвета то куда писать? и как он выглядит?

HardWareMan
28.01.2019, 12:38
jerri, сказали на прошлой странице. Для стандарта это системный ППА, биты порта PC6/PC7 для 5-ти цвета или биты порта PC4/PC6/PC7 для 8-ми цвета. Для МХа есть регистр цвета, содержащий INK и PAPER.

CityAceE
28.01.2019, 13:46
код цвета то куда писать? и как он выглядит?
Записываем код цвета в ячейку #FF02 и все последующие записанные байты в экранное ОЗУ будут этого цвета до тех пор, пока в #FF02 не будет записан другой цвет. Погашенные пиксели всегда чёрного цвета.

Коды цветов:



; Числовые значения для цветов Специалиста
black equ #d0
blue equ #c0
red equ #50
magenta equ #40
green equ #90
cyan equ #80
yellow equ #10
white equ #00

fifan
28.01.2019, 17:07
Вот установка цвета, взято с программы SpetsBrowser:

ld a, #80 ; голубые символы на чёрном фоне
ld (#f802), a ; занос кода цвета для STD