Нарисуйте границу экрана в Commodore 64 - PullRequest
57 голосов
/ 17 ноября 2009

Хорошо. Я надеюсь, что это не закрыто, потому что у меня есть это любопытство с 25 лет, и я хотел бы понять трюк.

В коммодоре 64 граница не была адресована VIC 6569. Все, что вы могли сделать, это нарисовать пиксели в центральной области, в которой перемещался курсор. Граница всегда была равномерной, хотя вы можете изменить ее цвет с помощью poke 53280, цвет, если я правильно помню.

Тем не менее, я хорошо помню игровые вступления, в которых граница была представлена ​​графикой, как будто она была полностью адресуемой. Я пытался понять, как это работает, но так и не дошел до сути. Легенды говорят, что это было умное использование спрайтов, которые при некоторых обстоятельствах могли быть нарисованы на границе, но я не знаю, является ли это городской легендой.

edit : просто прочитайте это по одной из предоставленных ссылок

Спрайты были мультиплексированы через вертикальные растровые линии (более 8 спрайтов, иногда до 120 спрайтов). До тех пор Группа Crest выпустила Krestage 3 в Май 2007 г. восприятие не более 8 спрайтов может появиться на одной линии растра, но присвоение новых координат Y сделало это появится снова вниз по экрану.

Это зло .... вы победили растр и изменили положение спрайта до его попадания ...

Ответы [ 8 ]

42 голосов
/ 19 ноября 2009

Во-первых, только спрайты могут отображаться в области границы или в виде повторяющегося 8-битного шаблона (шириной 8 пикселей), который считывается из последнего байта видеобанка, обычно $ 3fff. Обратите внимание, что вы можете видеть только эти спрайты или 8-битный шаблон, когда вы обманываете микросхему VIC, чтобы «не отображать» границы. Смотри ниже.

Границы имеют более высокий приоритет, чем спрайты, поэтому обычно, когда спрайт рисуется в области границы, граница покрывает спрайт. С помощью хитрости VIC вы можете отключить границы.

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

Сначала немного информации о том, как чип VIC работает на c64.

Микросхема VIC рисует экран сверху слева, сверху справа, затем вниз по линии и снова слева направо, пока не будет нарисован весь экран. Эта перерисовка выполняется 50 раз в секунду (для блоков PAL) или 60 раз в секунду (для блоков NTSC).

Существует 8-битный регистр VIC, который содержит вертикальную позицию растра в любой момент времени. $ D012. На самом деле существует более 255 возможных позиций, поэтому 9-й бит хранится в бите 7 (старший бит) или регистре $ d011. Таким образом, в любой момент вы можете прочитать эти регистры и узнать вертикальное положение растра. Нет доступного регистра для чтения позиции х растра.

Еще одна интересная особенность чипа VIC была использована для устранения проблемы при использовании аппаратной прокрутки. Базовая вертикальная прокрутка была достигнута с помощью аппаратного регистра для перемещения экрана на 0-7 пикселей по вертикали. Как только вы достигнете предела (0 или 7 в зависимости от направления прокрутки), вы будете перемещать каждый блок символов (8x8 пикселей) на один блок по вертикали и рисовать новые данные, которые будут отображаться сверху (или снизу в зависимости от направления). Это работает очень хорошо, за исключением того, что каждые 8 ​​пикселей прокрутки вы увидите, что данные «всплывают» на экран. Чтобы исправить это, можно увеличить область границы по вертикали на 8 пикселей, очистив бит 3 в регистре $ d011. Это называется режим 24 строки. По умолчанию на экране было установлено 25 строк размером 8x8 пикселей. В режиме 24 строки вы все равно можете рисовать символы в нижнем ряду, они будут просто скрыты границей.

Итак, хитрость в отключении верхней и нижней границ состоит в следующем:

1) Установите на экране режим 25 строк

2) дождаться, пока растр достигнет вертикального положения между $ f2 и $ fa (8 пикселей между тем, где начинается граница как в режиме 24 строк, так и в режиме 25 строк).

3) Установите экран в 24-рядный режим ... перемещая вертикальное начало границы выше текущей позиции растра

4) Подождите, пока после вертикального положения растра ($ fa)

5) Повторять каждый кадр

Шаг 3) заставляет чип VIC думать, что он уже начал рисовать границу, поэтому он никогда не начинает рисовать его. Вуаля, верхняя и нижняя границы открыты.

Что касается боковых границ, то вы можете сделать то же самое с разными регистрами, но поскольку горизонтальное движение растра намного быстрее, чем вертикальное, синхронизация должна быть намного более жесткой. И есть еще одна проблема, которую нужно учитывать, называется джиттер. <-что я не буду здесь объяснять. Поищите в сети «Stable Raster C64» для подробного объяснения этой проблемы. </p>

9 голосов
/ 21 ноября 2009

Обратите внимание, что то, что сделал Krestage 3 (как упоминалось в вопросе), отличается.

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

Более высокий уровень состоит в том, чтобы связываться с ним по правому краю бумаги, в каждой строке растра, как описано в ответе JohnD выше. Это позволяет вам иметь спрайты в левой и правой границе.

Ничто из этого не позволяет вам иметь более 8 спрайтов в одной строке. Это просто магия Креста.

На сегодняшний день лучшим ресурсом (который я знаю) для чипа VIC является "Видеоконтроллер MOS 6567/6569 (VIC-II) и его применение в Commodore 64" Кристиана Бауэра и полезным дополнением является «Доступ к памяти контроллера видеоинтерфейса MOS 6569 VIC-II и MOS 8566 VIC-IIe» , автор Marko Mäkelä.
Предостерегающий лектор: они несколько технические, и вам может быть легче их понять после того, как вы сами запрограммировали некоторые эффекты VIC.

Если ссылки когда-либо умрут, просто погуглите статьи по заголовкам, они будут бесконечно тиражированы.

6 голосов
/ 11 сентября 2011

Вы можете открыть верхнюю и нижнюю границы с помощью простой программы на Бейсике:

    1 poke56334,0:poke53266,212:poke53265,27:poke16383,0
    2 h=53265:i=53273:h1=19:h2=27:i1=1
    3 pokei,i1:waiti,i1:pokeh,h1:pokeh,h2:goto3
4 голосов
/ 17 ноября 2009

Я собираюсь нанести удар в темноте здесь (не сделал это сам). Я нашел это в Википедии.

В разделе c64demo объясняется, что:

Эффекты, которые считались невозможными, были достигается в демонстрациях, в основном благодаря недокументированные побочные эффекты, относящиеся к MOS технологии VIC-II чип . Некоторые примеры для VIC-хитрости:

Один из упомянутых хаков был:

Спрайт скроллеры были размещены в границы. Обманывая аппаратное обеспечение не нарисовать границу вокруг экрана, спрайты могут быть перемещены в эту область и отображается.

Конечно, интересная часть вопроса - как это делается. Я бы посоветовал заглянуть в некоторую демонстрационную базу данных , которая включает в себя исходный код, в поисках демонстрационной версии, в которой используется взлом.

3 голосов
/ 17 ноября 2009

ПЕЧАТЬ "ЭТО БЫЛО 53280, ЧУМАК."

2 голосов
/ 17 ноября 2009

Насколько я понимаю, это возможно только для спрайтов.

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

1 голос
/ 24 мая 2014

Вы также можете получить спрайты на границе в основном: ОСНОВНЫЕ спрайты на границе

iirc, был также какой-то способ запутать видеочип так, чтобы он рисовал 26-ю строку текста.

1 голос
/ 27 декабря 2010

Графика на границе: либо спрайты, либо использование эффекта $ 3FFF (который на самом деле НЕ спрайты вообще). Чтобы вдаваться в подробности, нужно гораздо больше места и времени, чем у меня есть здесь.

...