C64 : графический режим bitmap

 

В последнее время чтение документации у меня не вызывает энтузиазма. По той причине, что мало чего понятно из описания. И мало что получается. 

Добрался я до графического режима 320х200х16 цветов.Включается он как

POKE 53272,PEEK(53272)OR8 : POKE 53265,PEEK(53265)OR32

53272(D018) - указывает, что данные о пикселях размещаются по адресу $2000.

53265(D011) - включают режим пикселей(или bitmap)


Другая дока подсказывает, что

(You'd generally set this up with: $d011=$3b, $d016=8)

Путаница, блин.

Формат пикселей описан как


Для блока 8ч8 пикселей задается два цвета по адресу $400: старший ниббл это цвет для включенных точек, младший ниббл - если нет точек.

ичсх никаких функций kernal не описано - ни очистки, ни построения точек. Решил попробовать сам. Очистка? пфф, это реализуется одной процедурой.

;set memory
lda #4
sta $FB
lda #0
sta $FA
ldx #4
lda #$10
jsr fillm
lda #$20
sta $FB
lda #0
ldx #$40
jsr fillm
....
fillm
ldy #0
fm sta($FA),y
iny
bne fm
inc $FB
dex
bne fm
rts

Гугл подсказал, что очистка используется как PRINT CHR$(147), но я не нашел как.
Еще одна статья подсказала, как считаются адреса. Решил для начала глянуть на крэктро:

Алгоритм мне известен, но на построение точек неплохо бы взглянуть. Написал код генерации таблиц, и при изучении программы я увидел, что программа использовала координаты 8бит. Да и весь код вырос за 200 байт - ясно, что для интро не подойдет такой подход. Вернулся к началу и написал построение точек заново, только использовал 8бит для координат

Итого 145 байт - есть, куда стремиться.Сырки

Дополнение. Обнаружилась ошибка


plot: ;reg Y=Yc,reg X=Xc
lda #0
sta $FA
lda #$20
sta $FB
tya
pha
and #248
beq nomul
tay
add40:
lda #40
jsr addfa
dey
bne add40
nomul:
pla
; tay
and #7
tay
jsr addfa
txa
and #$F8
jsr addfa
txa
and #7
tay
ldx #0
lda ($FA,x)
ora bw,y
sta ($fa,x)
rts

Комментарии