Эмуляция Commodore 65

image


Никогда не знаешь, где, когда и в какой момент времени узнаешь о неизвестном компьютере.

В этот раз вышло проще.
Я стал искать список компьютеров на основе 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 и добавляет файлы. Так удобнее при сборке

image
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


image

Что-то пошло не так? Просто кодировка другая:

image

Поэтому текст поменялся на

hworld .byte 8,5,$0C,$0C,$0F,$20,$17,$0F,$12,$0C,4,$21,0


image

Далее, нашел документацию 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. Написал программу, еще не зная язык:

image

Теперь костяк готов, нужные данные мне известны, и пора писать код дальше. Но, на следующий день меня ждал полный облом — я не нашел свободной памяти и не разобрался, как работают операции памяти. На форуме подсказали, что причина в эмуляторе kemu и подсказали несколько процедур. К тому же, часть информации непонятна для меня. И все же, я надеюсь, что когда-нибудь я получу доступ к реалу и узнаю всё, что интересно, и я смогу писать программы. Ну не радость ли?

pouet

© Habrahabr.ru