Вопрос

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

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

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

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

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

Это зло....вы обыгрываете растр и перемещаете спрайт до того, как он туда попадет...

Это было полезно?

Решение

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

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

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

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

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

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

Еще одна интересная функция чипа 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, заставляя ее думать, что она уже начала рисовать границу, поэтому она никогда не начинает ее рисовать.Вуаля, верхняя и нижняя границы открыты.

Что касается боковых границ, вы можете сделать то же самое с разными регистрами, но поскольку горизонтальное перемещение растра происходит намного быстрее, чем вертикальное, синхронизация должна быть намного более жесткой.И есть еще одна проблема, которую следует принимать во внимание, называемая дрожанием.<- который я не буду здесь объяснять.Найдите в Интернете "Стабильный растр C64" для подробного объяснения этой проблемы.

Другие советы

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

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

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

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

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

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

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

    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

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

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

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

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

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

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

ВЫВЕДИ "ЭТО БЫЛО 53280, ЧУВАК".

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

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

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

Вы также можете использовать спрайты для создания границ в basic: БАЗОВЫЕ Спрайты в Border

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top