C64 Assembly - 6502/6510 - отображение серии из трех растровых изображений одно за другим с последующим переходом в символьный режим
У меня здесь довольно большой вопрос, на который мне очень трудно ответить, имея всего пару справочников, Интернет и ваш покорный слуга.
- Я просто хочу отобразить растровое изображение. Подождите пару секунд.
- Сотри это из памяти.
- Отобразите другое растровое изображение. Подождите еще раз.
- Сотри это из памяти.
- Отобразите окончательное растровое изображение. Подождите в последний раз.
- И, как вы уже догадались, сотрите это из памяти.
- Затем войдите в стандартный символьный режим. & Продолжить выполнение моего кода, который начинается с пустого экрана и переходит к запросу пользователя ввести текст и т. Д.
Биты, выделенные жирным шрифтом, у меня возникли серьезные проблемы!
Это код, который я использую для запуска части растрового изображения дисплея, в данный момент он просто переходит в бесконечный цикл ...
*=$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"
До сих пор я пытался повторить код, думая, что он может просто перезаписать все, но *=$1FFEE, похоже, не работает в хронологическом порядке, с каждым файлом я получаю ошибку перезаписи памяти, и всегда по умолчанию отображение последнего растрового изображения, которое я вызываю с помощью функции incbin. Есть ли способ сбросить все (но просто перейти в черный цвет) между каждым кадром растрового изображения? Или я просто неправильно загружаю эти изображения?
Переход в символьный режим также будет сложным, поскольку я не могу найти способ сделать это даже с одним растровым изображением. Возможно, вся эта структура кода - неправильный путь, идк ...
Или это просто то, что c64 не может сделать? Я не хочу идти сюда, потому что уверен, что раньше видел цикл растровых изображений во вступлении к играм - просто ломаю голову, пытаясь понять, как это можно сделать.
Еще раз спасибо, ребята, и извините за непонимание, я новичок в программировании в целом, но думаю, что нахожусь на правильном пути. Я надеюсь, что многие смогут извлечь уроки из ваших ответов, потому что это действительно то, о чем я думаю, на самом деле нет никакой информации.
Ваш любящий друг Коммодор,
Джеймс (Смокипаркин)
1 ответ
У вас есть три альтернативы.
- Вы можете включить все три растровых изображения в разные ячейки памяти и перенести их по одному в нужное место. Например, в настоящее время вы загружаете свое первое растровое изображение до $2000. Все в порядке. Вы можете загрузить следующие растровые изображения до 4800 и 7000 долларов. Затем перенесите их в нужные места, когда вам нужно показать следующее растровое изображение.
- Вы можете загружать растровые изображения в подходящие позиции растровых изображений VIC, такие как $2000, $6000, $ e000 и т. Д. Затем все, что вам нужно сделать, это изменить $dd00 и переключить банк. Но будьте осторожны, 6000 долларов - это нормально, но для того, чтобы иметь возможность использовать 000 долларов, вам необходимо отключить Kernal ROM. Здесь все становится немного сложнее, вам нужно возиться со значениями $ 01.
- Вы можете использовать загрузчик 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
Для создания задержки проверьте мой ответ здесь:Как создать задержку в asm для MOS 6502
Для ввода с клавиатуры проверьте мой ответ здесь:Сравните нажатия клавиш - Сборка CCS64