Category: Железо

20
Июн
2024

Продвигаемся дальше

После долгого перерыва на отпуск, послеотпускной завал работы, простуду, я наконец-то вышел на рабочий режим, въехал в собственный код и проект «Dangerous Dave для БК0011М+AZBK» начал двигаться.
Первым делом я столкнулся с тем, что Maxiol и Gid внесли изменения в железо AZBK и его реализацию в эмуляторе GID. Изменения, собственно, я сам и запрашивал, сталкиваясь с проблемами видеовывода то в железе, то в эмуле. Эти изменения притащили с собой новый формат команд и новые команды блиттера. Пришлось долгое время переписывать все процедуры Дейва, связанные с выводом на экран, под нововведения в параметрах команд блиттера. Было много глюков — спрайты рисовали не там, где надо, весь экран начинал покрываться рябью и все таком стиле. Постепенно это все ушло в небытие и Дейв начал снова бегать по лабиринту (первый уровень мне уже порядком надоел).
Но он не просто начал снова бегать, он начал снова глючить — момент перехода рулона через ноль и переключения в этот момент страниц видеопамяти вызывает дергание экрана. Все потому что движок Дейва не всегда успевает подготовить новый кадр за 1/60 секунды, чтобы вывести новые данные в момент обратного хода луча. А если не ждать этого момента — манипуляции с экраном становятся видны. На данный момент я еще не придумал, как это побороть.
Так что я решил пока двигаться дальше — какой смысл впихивать текущую подготовку кадра в 1/60 сек, если еще не все механизмы готовы? Еще нет разлетающихся кровавых ошметков от монстров, не все монстры задействованы и т.д.
Первым делом я занялся попаданиями пули по монстрам. Тут было два варианта решения:
1.  При трассировке траектории пули на каждом шагу сверяться с массивом координат монстров и определять совпадение монстра и пули.
2. Завести слой лабиринта, по «знакоместам» которого двигать коды монстров (точнее, сразу указатели на записи о монстрах) при их передвижении по лабиринту. Тогда для проверки совпадения не нужно пробегать всех врагов, можно просто сразу получить указатель на того, что попался в этом «знакоместе» лабиринта.
Первый вариант не накладывает новых расходов на движок, зато грозит долгой обработкой кучи данных при стрельбе. Второй вариант делает стрельбу скоростной, но нужно двигать лишние данные на каждом движении монстров. Я выбрал второй путь. Это потребовало памяти, но, т.к. я использую AZBK, то памяти у меня вагон. Да и к тому же, как оказалось, страницы 5 и 6 (экраны БК0011М) теперь тоже можно использовать как обычные страницы памяти, ведь  они больше не используются для вывода на экран.
Метод был успешно реализован, теперь надо было сделать визуализацию попадания пули в монстра. В Дейве это реализовано выводом текущего спрайта монстра полностью залитым белым цветом. Я собирался генерировать такой спрайт программно, но Maxiol сказал, что это можно легко заставить делать блиттер. В итоге в новой версии блиттера (и в эмуле GIDа) к моему приезду как раз появилась такая команда. Я воспользовался ей и все сразу заработало, что удивительно. Спрайты «блымкают» белым как надо, это сразу добавило энтузиазма, как и любое продвижение вперед.
В прилагаемом ролике видны дергания экрана, это как раз те глюки при переключении страниц, которые меня вгоняют в тоску. Также там видно, что Зомби пока что слезают со ступенек раньше, чем дойдут до пола, но это все ерунда. Хуже то, что при большом количестве Зомби на экране Дейв начинает притормаживать, но я утешаю себя тем, что в реальной игре Дейв просто не может пройти через такое количество врагов, они его сожрут раньше. Но в целом, конечно, надо искать узкие места и оптимизировать.
14
Июн
2024

Новый вариант блиттера

Переписываю вывод всей графики на новый формат команд блиттера. Помимо изменения способа задания размеров спрайта, добавился и новый способ позиционирования спрайтов на экране — теперь блиттеру можно указать координату Y в виде номера строки. Раньше это был 24-битный адрес. Так что переделывать пришлось много чего. Но уже почти все получилось.
Из-за длительного перерыва (отпуск на море!) дело шло со скрипом. Все-таки пока целиком погружен в проект — пишется легко, вся структура в голове. А немного отвлекся и приходится въезжать заново 🙂

30
Апр
2024

Накрылось видео — займусь пока звуками

Так как с выводом на блиттер возникли проблемы (подробно описанные в предыдущем посте), решил пока заняться звуками из Dave. Формат оригинальных файлов звука уже нашел, изучаю. В AZBK можно выводить звук и на AY и на 2AY и на Covox…

30
Апр
2024

Внезапные грабли

Графика в текущем проекте (Dave) выводится с помощью AZBK, а точнее с помощью одной из графических фич AZBK — блиттера. Суть «азбучного» блиттера состоит в том, что ему можно давать пакет команд, который он читает себе в буфер и потом выполняет уже самостоятельно, не отнимая процессорного времени.

Читать далее

16
Апр
2024

Призраки и Блиттер

Наконец-то я победил эти «хвосты» при скроллинге! Можно делать игру дальше!

При больших сдвигах рулона среднего экранного слоя (где бродят Зомби) промелькивали объекты, которые должны были уже быть стерты. И борьба с ними заняла у меня три дня…

Пока я использовал блиттер в атоматическом режиме (он при этом сам стартует при каждом прерывании по вектору 100) — все было почти хорошо. Точнее, в эмуляторе было вооще все хорошо, а вот на реальном железе при глобальном скроллинге экрана иногда наблюдалось какое-то дергание экрана.  Этим, конечно же, было поручено заняться Тэду из будущего. При этом возникал вопросы о скоростном построении экрана из множества тайлов — ведь количество команд, которые можно скормить блиттеру за раз, ограничено.  А это значит, что лабиринт будет заполняться порциями, каждыя из которых будет выводиться при очередном прерывании по вектору 100 («кадровое»). С появлением в AZBK режима ручного запуска блиттера, эта проблема ушла — выдаем блиттеру пакет за пакетом и запускаем все это сами, не ожидая милостей от вектора 100. Заодно появилась возможность сбрасывать блиттеру фоновые задачи, типа «удали старые спрайты со скрытого экрана, а мы в это время посчитаем куда какому монстру сделать шаг». И вывод на экран стало возможно делать тогда, когда хочется, а не ожидая очередного «кадрового» прерывания. Вот тут и был подвох.

Как только я добавил Зомби, шагающих туда-сюда, потребовалось их еще и скроллить вместе с фоном, когда Дейв инициирует движение окна. При этом, когда скроллинг (вертикальный или горизонтальный) докручивался до максимума и надо было уже переключать окно, вдруг могли промелькнуть какие-то дополнительные фигуры Зомби, там, где их никак быть не могло. Я предположил, что это спрайты, которые не успели стереться, а это место экранной страницы было вытащено скроллингом на видимую область экрана.  Стало ясно, что эти вещи надо тоже теперь синхронизировать вручную — сдвиг рулонов и переключение видимой области экрана. Но когда пакет команд блиттеру ушел, то о том, что блиттер его обработал, можно судить только по биту 15 в регистре 177270. Т.е. надо ждать, когда этот бит сбросится в 0 и потом можно переключать  рулоны.

А рулоны двигаются совсем в другом месте — в подпрограмме перемещения слоев в зависимости от деятельности Дейва. Блиттер работает сам по себе где-то в фоне, а вот регистры скроллинга изменяют изображение сразу. Значит, нам в этой подпрограмме нельзя изменять сами регистры, нужно просто вычислять новые значения, чтобы применить их потом, сразу кучей, после того, как блиттер закончит стирать/выводить спрайты и все будет готово к отображению нового кадра. Причем желательно  это сделать как раз в момент обратного хода луча, чтобы было незаметно.

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

Вот тогда призраки и были изгнаны и «дрожь земли» пропала!

Да, еще я напоролся на небольшие грабли: если пакет команд маленький, то блиттер так шустро его выполняет, что бит 15 (признак работы блиттера) и установиться не успевает. И это приводило к бесконечным ожиданиям «когда ты там начнешь команды обрабатывать??» и зависаниям.

09
Фев
2024

Аппаратный скролинг на AZBK

Сделал экран размером 512х512, причем видимая часть 256х192. И кручу рулон во всех направлениях двумя регистрами — горизонтального и вертикального скроллинга. Так работает он мгновенно, то пришлось вставить задержку, чтобы было вообще видно, что экран двигается 🙂

27
Мар
2023

Корпус для БК

Идея перенести БК в десктопный корпус возникла у меня еще в 90-х годах, после приобретения дисковода. Контроллер дисковода, сам дисковод, блок питания к нему, шлейфы — все это лежало на столе. Потом добавился винчестер — еще одна коробка, к которой шли кабели. Я не отношусь к адептам «исконно-сермяжных БКшек  исключительно в родных корпусах, с тем самым шильдиком той самой шероховатости и  с тем самым отпечатком волоса, попавшего в форму корпуса». Так что мысль «собрать все это кубло со стола в один корпус и снабдить нормальным блоком питания» напрашивалась сама собой. И мысль была реализована. Загвоздка была с клавиатурой, но она тоже была разрешена, пусть и не очень удобно — на корпус был вынесен разъем, родная клава БК стала внешней, в отдельном корпусе. Подключалась многожильным кабелем. Но та БКшка канула в лету вместе с корпусом (самодельным, кстати).

По прошествии лет у меня снова появилась БК, на этот раз это был новодел БК-0011М от Voland. К нему был куплен контроллер СМК-512.  А потом Yellow Rabbit придумал контроллер, позволяющий подключить к БК клавиатуру PS/2 и разработал новый корпус для БК, в котором СМК был подключен через «елку» к МПИ, что позволяло разместить СМК вторым этажом над платой БК. Также в корпусе помещался адаптер GBS для подключения БК к современным мониторам. Корпус был шикарный, все было суперкомпактно, что и оказалось ошибкой — появился контроллер AZ, который уже нельзя было разместить в этом корпусе.

И тут мне попался на авито довольно компактный корпус от Kraftway Popular 4l51, в который по ширине как раз входила плата от БК:

Я купил его, добавил блок питания помощнее:

и собрал все в одном корпусе:

Дисководы пока не подключены, так как AZ пока не поддерживает их в прошивке. Кнопка Reset задействована та, что установлена на самом корпусе. Светодиод AZ «выведен» на переднюю панель световодом с али, диаметром 3мм.

Клавиатура была подключена через адаптер Yellow Rabbit, но сама клава оказалась некачественной, кнопки на ней перекашивались и нажимались через раз. Я искал клавиатуру получше, но был ограничен в выборе тем, что адаптер поддерживал именно PS/2, а сейчас подавляющее большинство клавиатур USB. И вот на днях Yellow Rabbit сделал еще один мегадевайс (ссылка на сайт автора),

который позволил мне подключить уже любую USB-клавиатуру. Что я немеделенно и сделал 🙂

Огромное мерси, Братец Кролик! 🙂