Сборка C64 — 6502/6510 — отображение серии из трех растровых изображений одно за другим с последующим переходом в символьный режим.

У меня есть довольно большой вопрос, на который мне очень трудно ответить, имея всего пару справочников, интернет и ваш покорный слугу.

  1. Я просто хочу отобразить растровое изображение. Подождите пару секунд.
  2. Сотрите это из памяти.
  3. Показать другое растровое изображение. Подождите еще раз.
  4. Сотрите это из памяти.
  5. Отобразите окончательное растровое изображение. Подождите в последний раз.
  6. И, как вы уже догадались, сотрите это из памяти.
  7. Затем войдите в стандартный текстовый режим. & Продолжите выполнение моего кода, который начинается с пустого экрана и переходит к запросу пользователя на ввод текста и т. д.

Биты, выделенные жирным шрифтом, вызывают у меня большие затруднения!

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

*=$1000

        lda $4710
        sta $d020
        sta $d021
        ldx #$00

loaddccimage
        lda $3f40,x
        sta $0400,x
        lda $4040,x
        sta $0500,x
        lda $4140,x
        sta $0600,x
        lda $4240,x
        sta $0700,x
        lda $4328,x
        sta $d800,x
        lda $4428,x
        sta $d900,x
        lda $4528,x
        sta $da00,x
        lda $4628,x
        sta $db00,x
        inx
        bne loaddccimage

        lda #$3b
        sta $d011
        lda #$18
        sta $d016
        lda #$18
        sta $d018
        
        jsr *

*=$1FFE
        incbin "ASTRO1.prg"

До сих пор я пытался повторить код, думая, что он может просто перезаписать все, но *=$1FFE, похоже, не работает в хронологическом порядке, с каждым файлом я получаю ошибку перезаписи памяти, и по умолчанию всегда используется отображение последнего растрового изображения, которое я вызываю с помощью функции incbin. Есть ли способ сбросить все (но просто перейти к черному) между каждым кадром растрового изображения? Или я просто загружаю эти изображения неправильно?

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

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

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

Ваш любящий друг Коммодора,

Джеймс (Смокипаркин)


person Smokeyparkin    schedule 11.07.2021    source источник
comment
У вас уже загружены в память все три растровых изображения? Вы загружаете новое растровое изображение поверх старого по адресу $3f40? И для меня это было давно, но если вы делаете JSR * и у вас есть *=$1FFE, почему бы не просто JSR $1FFE?   -  person tendim    schedule 12.07.2021


Ответы (1)


У вас есть три альтернативы.

  1. Вы можете включить все три растровых изображения в разные ячейки памяти и перенести их одну за другой в нужное место. Например, в настоящее время вы загружаете свое первое растровое изображение до 2000 долларов. Это отлично. Вы можете загрузить следующие растровые изображения до 4800 и 7000 долларов. Затем переносите их соответственно в нужные места, когда вам нужно показать следующий битмап.
  2. Вы можете загружать растровые изображения в подходящие позиции растровых изображений VIC, такие как $2000, $6000, $e000 и т. д. Затем все, что вам нужно сделать, это изменить $dd00 и выполнить переключение банка. Но будьте осторожны, 6000 долларов — это нормально, но чтобы иметь возможность использовать е000 долларов, вам нужно отключить Kernal ROM. Здесь все немного сложнее, вам нужно поиграть со значениями $01.
  3. Вы можете использовать загрузчик IRQ, такой как загрузчик IRQ Krill. Вы можете найти его в Интернете. Используя загрузчик IRQ, вы можете включить первое растровое изображение, а затем снова загрузить другие растровые изображения с диска в место за 2000 долларов и повторить то же самое. Конечно, вы можете захотеть показать что-то еще, возможно, сообщение о загрузке во время загрузки. Лучше использовать $2000 и $6000 для растрового изображения, загрузить следующую картинку в другой банк и снова переключить банк, используя $dd00. Таким образом, ваш первоначальный файл PRG будет содержать только первое изображение, а остальные вы сможете загрузить с диска.

Что касается возврата к символьному режиму, достаточно просто установить $d011, $d016 и $d018 в их начальные значения (также $dd00, если вы его измените).

    lda #$1b
    sta $d011
    lda #$c8
    sta $d016
    lda #$14
    sta $d018

Для создания задержки проверьте мой ответ здесь: Как создать задержку на ассемблере для MOS 6502

Для ввода с клавиатуры проверьте мой ответ здесь: Сравните нажатия клавиш - Сборка CCS64

person Emir Akaydın    schedule 12.07.2021
comment
Номер 1 звучит как тот, который я мог бы сделать без особых хлопот и риска из-за моей новой натуры. Их загрузка была бы достаточно простой, но я изо всех сил пытаюсь понять, как это сделать в коде, чтобы они не перекрывали друг друга. Хронологически внутри кода, похоже, не работает. Он просто отображает окончательное растровое изображение на экране. Очень запутанно. - person Smokeyparkin; 13.07.2021
comment
Отправил в новую тему, так как у меня все еще есть проблемы. Это ссылка: stackoverflow.com/questions/68354669/ - person Smokeyparkin; 13.07.2021