Подтвердить что ты не робот

Нарисовать на границе экрана в Commodore 64

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

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

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

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

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

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

4b9b3361

Ответ 1

Во-первых, в пограничной области могут отображаться только спрайты или повторяющийся 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 ​​пикселей прокрутки вы увидите данные "pop" на экране. Чтобы исправить это, вы могли бы увеличить площадь границы на 8 пикселей по вертикали, очистив бит 3 в регистре $d011. Это называется 24-строчным режимом. По умолчанию на экране было установлено 25 строк 8x8 пикселей. В режиме 24 строк вы все равно можете нарисовать символы в нижней строке, они просто будут скрыты границей.

Итак, трюк для отключения верхней и нижней границ:

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

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

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

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

5) Повторите каждый кадр

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

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

Ответ 2

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

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

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

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

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

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

Ответ 3

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

    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

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

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

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

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

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

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

Ответ 5

ПЕЧАТЬ "ЭТО было 53280, DUDE".

Ответ 6

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

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

Ответ 7

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

Ответ 8

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

Ответ 9

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

Ответ 10

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

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

Ответ 11

Симулятор полета Microsoft нарисовал на границе. С одной стороны, мы можем добиться эффекта рисования границы, изменив цвет границы в нужное время. Например, в LOGO был режим разделенного экрана для графики Turtle, когда экран переключался между графикой HiRes выше и несколькими строками текста ниже. Рамка тоже была разного цвета. Так что легко сделать эффект горизонта, зеленые пастбища внизу и голубое небо вверху (как в Симуляторе Полетов), который распространяется на кадр.

Когда вы запускаете дикую рамку, например,

   C000 LDX #00
        STX D020
        INX
        STX D020
        DEX
        BEQ C002

тогда цвет меняется каждые 10-20 пикселей или около того. Это самое быстрое изменение, которое вы можете получить, я думаю. Таким образом, вы можете нарисовать горизонтальную линию на границе. fastest change of border color

И вы можете рассчитать время, используя тот же регистр вертикальной линии в VIC в $ D012 и бит 7 в $ D011. Вы можете прочитать текущую строку сканирования из этого регистра. Но если вы напишите в него и включите младший бит в регистре $ D01A, тогда VIC подаст сигнал и IRQ, когда сканирование достигнет этой строки. Так что, как достигается эффект разделения экрана.

Вот пример. Сначала я настроил свою процедуру прерывания:

   C000 SEI        ; disable interrupt
        LDA #1F    ; set interrupt routine to C01F
        STA 0314   ; set low byte
        LDA #C0    ; high byte
        STA 0315   ; set
        LDA #C0    ; raster position for horizon
        STA D012   ; set to raster position interrupt
        LDA D011   ; and for the high bit of the raster position
        AND #7F    ; clear the high bit
        STA D011   ; and set the cleared high bit
        LDA #F1    ; enable the raster interrupt
        STA D01A   ; in the appropriate register
        CLI        ; allow interrupt
        RTS        ; return from subroutine

И вот моя настоящая процедура прерывания сейчас:

   C01F LDA D019   ; load VIC interrupt register
        STA D019   ; and clear it
        BMI C02E   ; if highest bit is set, go to our routine
        LDA DC0D   ; else disable CIA interrupt
        CLI        ; enable interrupt
        JMP EA31   ; continue with normal system interrupt routine

   C02E LDA D012   ; load current vertical scan line
        CMP #01    ; is it just about the first line?
        BCS C042   ; if not jump to bottom part
        LDA #03    ; cyan
        STA D020   ; set border color (sky)
        LDA #C0    ; horizon level 
        STA D012   ; set vertical scan interrupt to occur at horizon
        JMP EA81   ; continue with normal interrupt minus cursor blink

   C042 LDA #00    ; black to draw a piece of horizontal line on the horizon
        STA D020   ; set border color
        LDX #08    ; a short busy loop
   C049 DEX
        BNE C049
        LDA #01    ; white to draw on the right side horizon
        STA D020   ; set border color
        LDC #02    ; very short busy loop
   C053 DEX
        BNE C053
        LDA #05    ; finally green as the grass
        STA D020   ; set border color
        LDA #00    ; next scan line interrupt at top of screen
        STA DO12   ; set scan line interrupt
        JMP EA81   ; continue normal interrupt sans cursor blink 

со следующим великолепным результатом: split screen with two line segments drawn on the horizon