Как стать автором
Обновить

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

В отладке кода для ZX Spectrum вас ждет сюрприз — компилятора под него всего два: binutils-z80 и z88dk

Справедливости ради — у speccy был/есть ещё компилятор "HiSoft C".

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

А я из названия подумал, что весь процесс (компиляция и отладка) будут от и до проходить на спекки, без юзания современного компа и софта. На мобильном хабре тегов и описания то нет, только заголовок… :-(

Проблема не только в том, что нужно скомпилировать, также нужно поставить хорошую стандартную библиотеку. У z88dk довольно скудный(е) компилятор(ы), но никто не может переплюнуть его массивную библиотеку. Также, что для меня лично критично, "SDK" для Spectranet идёт только к z88dk.

Подключать библиотеки? Это как то слишком новомодно, не олдскульно.

А ещё есть IAR z80 компилятор, код генерит не хуже чем sdcc.

IAR ещё. Тот хоть и старый, но в своё время разрабатывался для «серьёзных дел».

Главная беда ZX Spectrum заключается в его совершенно кошмарной палитре. Такое ощущение, что её специально разрабатывали с целью исключить малейшую возможность создания хоть сколь-нибудь привлекательно выглядящей игрушки/демки.
Даже CGA-палитра не настолько кошмарна.

И соглашусь, и не соглашусь одновременно. В детстве я был впечатлен игрушками того времени, а сейчас — любопытно обходить его ограничения. Например, посмотрите "The Lyra II Megademo", или "slightly magic" или другие диззи-подобные игры. Или, например, Зеркало (гуглить Zerkalo zx spectrum)

А мне именно палитра нравится. Выглядит замечательно. Хотя мне и герои меча и магии 4 нравятся больше остальных частей вместе с российскими микроконтроллерами. Возможно это связано.

Скорее дело было не в палитре, а клэшинге, когда экран был поделён на знакоместа и одно знакоместо (8 на 8 пикселов) могло, стандартно, иметь одновременно только два цвета и всё (говорим тут о цветном режиме, а не монохроме). А это сильно ограничивало красочность игр. Потом, конечно, появилась такая штука как мультиколор, но использовалось это в демках, да и то, по причине разных таймингов, на разных моделях спектрума работало это не одинаково.

Клэшинг тут ни при чём, спектрумовская палитра совершенно не подходит для создания сколько-нибудь реалистичных картинок вообще.
Ср. Commodore 64 и Amstrad CPC:
image

Мультиколор, кстати, почти такое же древнее явление как и сам спектрум, в играх встречалось тоже, навскидку - заставка Action Force II. И более современные, напр. Old Tower, где вся игра - один большой мультиколор.

https://youtu.be/yHXx3orN35Y

Демка на CGA, например.

Вот уж где была самая отвратительная палитра, так это на БК 0010.

Её никто не разрабатывал. И строго говоря, палитры специальной там нет. Там просто три бита — R,G,B. Вот их комбинация и даёт 8 цветов. Плюс яркостный бит. Вот и всё.

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

Жалко скриншоты не сохранились. Например exolon вообще офигенно смотрелся с коммадоровской палитрой.

А клэшинг это была расплата за дёшево и сердито. Зато существенная экономия памяти на графике, больше помещается в 48 килобайт ОЗУ, процессор гораздо быстрее отрисовывает графику, и наверно самое важное - игра быстрее загружается с кассеты! Ради такого можно и потерпеть клэшинг.

Формально ничего не мешало сделать на спектруме 2ой режим — когда атрибут был не на каждое знакоместо (8х8), а на каждый байт (8х1). Требования к пропускной способности памяти это бы не изменило (ULA в спектруме и так фетчит каждый атрибут 8 раз подряд для каждого из байтов знакоместа), а картинки бы стали лучше выглядеть. Такое делали для многочисленных клонов: https://speccy.info/%D0%90%D0%BF%D0%BF%D0%B0%D1%80%D0%B0%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D1%83%D0%BB%D1%8C%D1%82%D0%B8%D0%BA%D0%BE%D0%BB%D0%BE%D1%80

новые режимы заставляли бы переделывать так или иначе код и на такое мало кто подпишется, а вот добавление нескольких процессоров как в zx-poly решало вопрос с обратной совместимостью

Речь о том, что это можно было бы сделать СРАЗУ, в 82ом году или когда там УЛу делали.

Первый спектрум вышел с 16 Кб оперативки. Если бы сделали как Вы предлагаете, то на экран ушло бы 12288 байт из 16384, для программ оставалось бы всего 4096 байт, вычитая системную область. Это похоронило бы большинство игр.

Его практически реализовали?

Еще кроме zx-poly был zx next и не реализованый Wild Speccy Robus a

ИМХО отличная яркая палитра для игр. Commodore 64 — вот где ужасная палитра из бледно-серо-буро-малиновых цветов.

У c64 приятная палитра. Цвета сочетаются друг с другом. Чувствуется, что палитру художник составлял. За основу палитры взят коричневый цвет, как на картинах Леонардо и Рембрандта. Выбор разумный, в такой палитре легко нарисовать портрет человека, землю, поля, скалы, каменистые планеты, стволы деревьев, деревянные и каменные строения, деревянную же мебель, осеннюю листву.

Очень неплохо для всего лишь 16 цветов.

Все в точности наоборот - палитра отличная, у многих компов с гораздо большими возможностями цвета куда как хуже(привет эплу), а в спек втиснули аж всю радугу.

То что нельзя каждую точку раскрасить - ну посчитайте сколько на это уйдет памяти и проца, для прикладного ПО не останется ресурсов.

В первую очередь, опытным разработчикам, которым хотелось бы встретить вызов: всего лишь ~40кб памяти, включая код программы.

Разработчики не могут написать нетормозящий браузер, и это при охулиардах ОЗУ, куче ядер и ССД.

Браузер — это не столько просмотрщик документов, сколько виртуальная машина. Поэтому попросить «напишите нетормозящий браузер» — это всё равно что попросить разработать процессор, под который ни один программист не смог бы написать тормозящий код.
Как ни оптимизируй, разработчики веб-страничек всё одно уронят производительность в ноль.
А вот почему до сих пор так и не смогли написать нетормозящий просмотрщик PDF, для меня действительно загадка.

SumatraPDF?

НЛО прилетело и опубликовало эту надпись здесь

8*8

Можно ещё попробовать для ZX-Spectrun кросс программирования.
M4 FORTH (ZX Spectrum, Z80)
Простой компилятор FORTH, созданный с помощью макросов M4.
Создает читаемый и аннотированный код в ассемблере Z80. Пузырьковая oптимизация (peephole) не используется, но для некоторых часто связанных слов создается новое слово с оптимизированным кодом. Например, для dup <число> <условие> else. Небольшая библиотека среды выполнения для печати чисел и текста предназначена для компьютера ZX Spectrum. Несмотря на свою примитивность, M4 FORTH производит более короткий код и в 2-4 раза более быстрый, чем zd88k, вероятно, лучший компилятор для Z80.

В примерах проекта, приведены пока два демо примера — игра змейка и реализация «игры» имитации «Жизнь».

Автор проекта, также использовал разные тесты для оценки времени их выполнения и сравнения с другими реализациями Форт работающими на разнообразном железе.

P.S. По запросу словосочетания Forth Z80 на Github находятся ещё разныe Форт-системы, в том числе и под разработку для использования с ZX-Spectrum и кросс компиляции.

Вообще, выполнение кода в эмуляторе может дать много возможностей, которые невозможно или сложно получить на реальном железе. Это позволит перевести разработку с ручного ковыряния в байтах на более высокий уровень. Вот что приходит мне в голову:


  • профайлинг кода с точностью до такта
  • сбор метрик и телеметрии. Например, мы можем в игре собирать статистику, сколько спрайтов отображается на экране, сколько времени это отняло. И естественно, отлавливать случаи, когда пропускается кадр из-за нехватки времени. Более того, мы можем написать скрипт, который будет проходить по уровню и замерять производительность каждого экрана в игре. Затем строить тепловую карту. Это поможет увидеть "тяжелые" места в игре и может быть, что-то поменяв, мы сможем от них избавиться.
  • возможность выполнять юнит-тестирование кода
  • возможность расстановки ассертов вроде assert HL >= 0x2000. Такие ассерты могут найти ошибку.
  • возможность реализовать защиту памяти при косвенной адресации (вроде LD (HL), A) и косвенных переходах. Например, мы можем указать, что эта команда LD (HL), A пишет только в буфер экрана и если программа из-за ошибки попытается произвести запись в другую ячейку, это будет обнаружено.

А что касается ручной отладки, то я gdb не люблю. Я им пользовался несколько раз, но команды каждый раз забываю и гуглю. Неудобно. Мне как-то привычнее "отладка через printf".

Спасибо за статью-комментарий. Натолкнули меня сделать такую пожжержку в fuse, чтобы gdb показал стек на падении. Но, своей задаче — свой инструмент, программа, которую я сейчас отлаживаю, очень завязана на UI и я могу делать printf только или через сеть, или через экран, что не идеально.

Вообще, gdb позволяет при срабатывании брейкпойнта вывести значение переменной и продолжить выполнение автоматически. Это довольно удобная опция.


Но я себе это представляю немного по-другому: мы просто в исходном коде ставим аннотацию Log(HL) и эмулятор, когда доходит до этого места, выводит в консоль значение HL. При этом это именно аннотация, то есть она не создает кодов команд в объектном файле, и не тратит циклы процессора. Аналогично должна работать аннотация assert HL > 0x2000 — она отсутствует в бинарном файле и присутствует только в метаданных к файлу. Аннотации используются только эмулятором и игнорируются на реальном железе.


Аналогично с помощью аннотаций можно собирать метрики и размечать код для профайлинга.

Раз уж все равно кросс-разработка, то положение стека может отслеживать эмулятор, пользуясь для этого отладочной информацией. Не надо тормозить и раздувать программу для этого. Второй плюс - эквивалентность бинарного кода исключит часть ошибок вида "в дебаге работает, в релизе не работает", связанных, например, с выравниванием.

Это исключит возможность реализовать хардварный дебаг без эмулятора, что так же в планах. Ну или создаст необходимость работы над двумя версиями отладчика. Также, gdb, на самом деле, мало что знает про эмулятор и то что он может отслеживать, ему неизвестно, или нужно реализовывать на недокументированном протоколе. Ломать протокол — ломать другие отладчики.

А не помните, когда Медноногов ЧВ писал, он использовал кросс и эмулятор, утилитки даже выкладывали, только не помню кросс-АСМ это был или кросс-С…

там только кросс-ассемблер был, вроде назывался ASM80

В эмуляторе ZXMAK2 свой gdbserver есть уже лет 10 как

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.