Как прочитать сетку от $0200 до $05ff в сборке 6502

Итак, мне дали задание, где мы должны сделать символ, используя цветные пиксели, используя эмулятор ассемблера 6502. Я не совсем понимаю, как работает эта сетка. Может ли кто-нибудь объяснить, как работает эта сетка, и, возможно, привести пример?

вот ссылка на эмулятор: https://skilldrick.github.io/easy6502/#first-program

и сетка, с которой я буду работать: https://i.stack.imgur.com/QuqPi.png


person ZootZoot    schedule 16.02.2021    source источник
comment
Насколько я могу судить, этот 1 КБ памяти соответствует растровому изображению 32x32 пикселя, где каждый байт представляет один пиксель (используются только младшие 4 бита каждого байта). Я не уверен, что еще можно объяснить. На странице, на которую вы ссылаетесь, даже есть некоторый код, который отображает пару пикселей.   -  person Michael    schedule 16.02.2021


Ответы (1)


Я думаю, что команда Майкла верна; избегая использования «x» и «y» из-за потенциальных причин неоднозначности регистра, адрес $0200 + (q*32) + p содержит пиксель в (p, q) для p и q в диапазоне от 0 до 31, и в каждом байте младшие четыре бита определяют цвет пикселя .

Так, например. $0200 — это пиксель в верхнем левом углу, $0201 — это пиксель справа от верхнего левого угла, а $0220 — это пиксель в верхнем левом углу.

В терминах 6502 возможная прямая реализация общей подпрограммы построения графика может использовать индексированную косвенную адресацию, сохраняя $0200 + (q*32) в ячейке с нулевой страницей, а затем индексируя p для достижения определенной горизонтальной позиции в этой строке. Неожиданно и без проверки того, какой именно синтаксис использует этот ассемблер, и жесткого кодирования использования адресов нулевой страницы $80 и $81:

; 
; Plot; stores the colour in A to the pixel at (y, x).
; So, yes: x and y are backwards.
;
; Clobbers x.
;
Plot:
    ; Arbitrarily, this adds x to ($200 >> 5) and
    ; then shifts the whole lot left by 5. That's
    ; rather than shifting x by 5 and then doing a
    ; one-byte add to the upper byte, I guess.

    pha
    txa
    clc
    adc #$10 ; $10 = $200 >> 5
    sta $80
    lda #$00
    sta $81

    ; Multiply by 32. You could unroll this if
    ; that's what your priorities imply.
    ldx #5
.rollLoop
    asl $80
    rol $81
    dex
    bne rollLoop

    pla
    sta ($80), y

    rts
person Tommy    schedule 16.02.2021