Disclaimer:
Особенно полезно читать всем любителям пентагонов и ненавистникам фирменных машин.
Так же надо вдумчиво читать железячникам. Как не свистоперделки, а весьма тривиальная вещь может сильно облегчить жизнь программисту.
Вы когда-нибудь задумывались, почему 128k игры такие убогие ? Нет, серъёзно. Они качественно не отличаются от 48к. (Возможно есть несколько исключений. Кстати - кроме ЧВ какие ?)
Очень практиковалась лишь частичная поддержка 128к в виде AY музыки и запихиванию подгружаемых уровней в верхнюю память. Почему частичная ? Да потому что графический код был одинаков и работал по старым принципам. Очень редко использовался второй экран. Практически никогда не использовались мощные прекалькуляции для ускорения.
Фактически, внешняя память только как РАМ-диск для ресурсов. С одной стороны это можно объяснить наличием армии 48k-only машин, и желанием фирм срубить побольше бабла на продажах.
Но! Были ведь 128к-only игры! Для них аргумент про бабло теряет смысл.
Почему же в этих играх не заметно особого улучшения качества ? Только чуть больше арта. Причём зачастую не игрового, а в виде картинок между уровнями. (Например Chase H.Q.2, Robocop2). Иногда 128-only игра состояла из пачки мини-игр, каждая из которых по-отдельности ничем особенным не выделялась (BTTF3).
Начав писать свой собственный движок игры я нашёл ответ. Он очень прост - дело в жёстко прибитых номерах банок памяти. И всего одном окне page-инга. Даже в NES с её, по сути, 32кб адресного пространства для кода/данных, банки памяти можно было переключать в обоих 16кб окнах.
Если использовать два экрана - то данные для отрисовки можно брать только из нижней памяти. А из-за того что банки нижней памяти жёстко прибиты, да ещё вместе с бесполезным экраном, получается свободными всего 9.25кб медленной и 16кб быстрой памяти. Всего ~25кб. Этого ничтожно мало.
Поэтому выходов остаётся немного:
1) Оставить page-ing для данных и пытаться рисовать всё в один экран, жертвуя качественной картинкой и получая артефакты в виде tear-инга и/или мерцания.
2) Использовать два экрана, но серъёзно усечь данные, жертвуя либо качеством либо скоростью, либо и тем и другим, чтобы уместить отрисовку кадра в нижней памяти.
3) организовать в нижней памяти кеш, и динамически подкачивать туда данные из верхней памяти.
Это тормозно, потому что временные затраты сопоставимы с генерацией данных. Похожий подход, кстати, применяляся в 48k играх (например Zynaps, Robocop1, только данные не подкачивались а как раз генерились в кеш).
4) САМЫЙ РАСПРОСТРАНЁННЫЙ ВАРИАНТ: Забить, оставив отрисовку для 48к. Память юзать под рамдиск. Ну и музыки добавить.
Ещё раз: причина плохой поддержки расширенной до 128кб памяти заключается в отвратительной организации переключения банок. И, как следствие, малом количестве нижней памяти.
Варианты решения "с паяльником" отметаем и не рассматривем принципиально. Напаять можно и чёрта в ступе.
- Частично проблему можно решить в некоторых советских клонах.
Из-за желания сделать CP/M совместимую машину делали возможность включения RAM вместо ROM, что моментально увеличивало свободную нижнюю память ещё на 16кб до ~41кб.
Это ATM1, Profi, Scorpion.- Немного по другому проблему можно решить в +3/+2A/+2B. В специальном режиме "ALLRAM" всё память замещалась RAM страницами.
Причём из 4-х возможных наборов два особенно удачны: в области 4000-7FFF можно получить обе экранные страницы, 5 и 7.- Ну и совсем идеально проблема решается в ATM2.
Благодаря уникальному менеджеру памяти, позволяющему включить любую страницу, хоть RAM хоть ROM в любом из 4-х окон адресного пространства.
К сожалению кроме МикроАРТ никто больше до менджера памяти не додумался. Хотя идея лежит на поверхности и очевидна любому толковому АСМ-разрабочику. Кроме этого АТМ-менеджер умеет всего одним битом заменить один набор страниц на другой. В частности эта фича используется в элегантной хардварной реализации переключения 128к-48к ROM. Да-да, в АТМ2 бит D3 порта 7FFD переключает набор страниц менеджера памяти. И если наборы отличаются только номером ПЗУ, то получим поведение как на обычном 128к спектруме.
Рассмотрим мой случай. Для отрисовки каждого кадра мне необходимо, в зависимости от X позиции скроллинга, иметь один из прескроллированных тайловых наборов (4шт по 8кб). А также прескроллированные спрайты (порядка 9-16кб).
Это достаточно крупные величины для спектрума. И даже замена ROM в окне 0000-3FFF на страницу RAM не помогает (сомневающиеся могут пересчитать самостоятельно).
В АТМ2 всё отлично. А учитывая его безвейтовость, турбу и палитру - это абсолютный лидер по качеству картинки и по скорости отрисовки. И ещё запас прочности остаётся.
В +3/+2A/+2B все данные для отрисовки кадра умещаются в RAM благодаря возможности переключать экраны в 4000-7FFF. Хотя грань возможностей уже близка.
В классическом 128, даже с RAM вместо ROM, приходится извращаться. Мешает прибитая 5-ая страница.
Либо копировать в динамический кеш, либо организовывать вырвиглазную отрисовку в один экран, рисуя часть линий фона и тут же пересекающие их кусочки спрайтов (как в Stormlord).
Получается медленее, гораздо сложнее, и добавляет артефакты в виде tear-инга и (редко) мерцания. Всё, приплыли, силёнок не хватает.
Получается парадоксальный вывод: даже Пентагон, с его безвейтовостью и длинным интом СЛИВАЕТ по быстродействию фирменному +3/+2A/+2B с медленной памятью.
Так что не демками едиными... Да и демки лишь следствие несовместимости из-за глючного INT-а (не буду развивать эту тему, все и так в курсе).