Эмуляция Commodore 65
Никогда не знаешь, где, когда и в какой момент времени узнаешь о неизвестном компьютере.
В этот раз вышло проще.
Я стал искать список компьютеров на основе MOS 6502 и наткнулся на упоминание C64Dx (или С65) на базе 65CE02 — прототип компьютера, созданного в Commodore Business Machines в 1990–1991 годах. Это улучшенная версия Commodore 64, и она должна была быть обратно-совместимой со старым компьютером, при этом предоставляя ряд расширенных функций, близких к Amiga. Число моделей выпущено не так и много, а вот список цен, озвученных при покупке C65 впечатляет.
Еще я прочитал о MEGA65 — компьютере, совместимом с C64/C65. Всё, я созрел к знакомству.
Видеорежим
новый чип VIC III предоставляет следующие возможности:
- текстовый режим 40/80×25
- 320×200x256
- 640×200×16
- 1280×200×4
- 320×400×256
- 640×400×16
- 1280×400×4
доступны видеорежимы, совместимые с VIC II
DMA контроллер
128К ROM
128K RAM, возможно расширение до 1М
Два звуковых чипа SID
Новая версия BASIC 10.0
Теперь эмулятор.
Hi65 не заработал, оставил только примеры Бейсика, чтобы ознакомиться с графикой.
Я взял другой.
Еще нужно скачать файл
и переименовать в c65-system.rom
запуск эмулятора
xc65.exe -8 diskimage.d81
Для удобства я стал искать кросс-средства:
ассемблер 64tass т.к. поддерживает 65CE02
cc1541 V3.1 — утилита создает образы .d81 и добавляет файлы. Так удобнее при сборке
DirMaster v3.1.5/Style описывать лишне. MustHave.
Первая цель была написать программу, которая выводит на экран «Hello, world!». Чтение топиков на форумах подсказало решение
*=$0FFE
.byte $00, $10
ldx #$0
cycle lda hworld,x
cmp #0
beq exit
sta $0800,x
; sta $D800,x
inx
jmp cycle
exit rts
hworld .text 'hello world!',0
Что-то пошло не так? Просто кодировка другая:
Поэтому текст поменялся на
hworld .byte 8,5,$0C,$0C,$0F,$20,$17,$0F,$12,$0C,4,$21,0
Далее, нашел документацию Commodore 64 Programmers Reference Guide
и еще один архив, где нашлось много вкусного.
Чтение дока c64-programmers_reference_guide-03-programming_graphics.pdf подсказало идею одного эффекта. Например
lda #$62
sta $D018
Разместит видеопамять по адресу $1800, а данные символов по адресу $800. Почитав c65manual.txt, я нашел информацию о цветах:
$D100, $D200,$D300 — R, G, B значения цветов (0–15)
$D800-$DBFFF — цветовые атрибуты текста (а точнее, все цвета хранятся по адресам $1F800-$1FFFF).
Немного проб кода, я получил готовый набор символов и простые цвета. Вот только хотелось использовать чип DMAgic для переброски двух участков памяти.
Стал читать доки
Контроллер работает в 4 режимах
COPY — копирование участка памяти
SWAP — обмен данными для участков
FILL — заполнить участок памяти данными
MIX — выполняет boolean Minterm mix над источником и приемником (убейте меня, я не знаю, как написать)
а дальше я совсем запутался, понял только принцип работы. Для удобства используются таблицы DMAT, запись данных в регистры выполнит операцию
lda #0 ;the bank (0-15) where the list is
sta $d702
lda #>address ;the high byte of the list address
sta $d701
lda #
Заодно, в доке вычитал, что можно использовать DMA. Написал программу, еще не зная язык:
Теперь костяк готов, нужные данные мне известны, и пора писать код дальше. Но, на следующий день меня ждал полный облом — я не нашел свободной памяти и не разобрался, как работают операции памяти. На форуме подсказали, что причина в эмуляторе kemu и подсказали несколько процедур. К тому же, часть информации непонятна для меня. И все же, я надеюсь, что когда-нибудь я получу доступ к реалу и узнаю всё, что интересно, и я смогу писать программы. Ну не радость ли?
pouet