Расчет адреса следующей строки экрана

Материал из SpeccyWiki
Перейти к: навигация, поиск

Расчет адреса следующей/предыдущей пиксельной строки экрана, DOWN HL, UP HL — широко используемые при программировании графики процедуры для перехода к следующей и предыдущей пиксельной строке экрана с учётом нелинейной раскладки видеопамяти, то есть с переходом между строками знакомест и третями экрана.

Из названия процедуры следует, что адрес находится в регистровой паре HL. Также используются варианты этой процедуры для других регистровых пар. Существует несколько версий процедуры, отличающихся размером и быстродействием, а также оформлением в виде подпрограммы или макроса. Время выполнения процедуры зависит от адреса текущей пиксельной строки. В случае реализации функционала в виде отдельной процедуры, условные переходы необходимо заменить на условный возврат (JR Z,EXIT -> RET Z).

Вариант в виде макроса был встроен в ассемблер MASM.

;В этом варианте процедуры также используется флаг переноса.
;Он установлен, если был переход к следующей строке знакомест.

;Время выполнения этой версии кода в тактах:
; 27 переход в пределах строки знакомест
; 49 переход в следующую строку знакомест
; 59 переход в следующую треть экрана

DOWN_HL:
     INC H
     LD A,H
     AND 7
     JR NZ,EXIT ;CY=0
     LD A,L
     ADD A,32
     LD L,A
     JR C,EXIT  ;CY=1
     LD A,H
     ADD A,-8
     LD H,A     ;CY=1
EXIT:

UP_HL:
     LD A,H
     DEC H
     AND 7
     JR NZ,EXIT
     LD A,L
     SUB 32
     LD L,A
     JR C,EXIT
     LD A,H
     ADD A,8
     LD H,A
EXIT:

Этот вариант удобнее использовать в виде подпрограммы. Для использования внутри циклов есть более быстрый вариант, предложенный Spencer Winset (не возвращает флаги):

     INC H
     LD A,H
     AND 7
     JR NZ,EXIT
     LD A,L
     SUB -32
     LD L,A
     SBC A,A
     AND -8
     ADD A,H
     LD H,A
EXIT:

Spencer Winset также предложил технику Down Micro Dub, где в выводе спрайта используется цикл из 8 строк со входом и выходом из произвольного места, а 7 из 8 строк имеют только INC H.

В демо может использоваться более простой способ: держать все экранные адреса в стеке - сверху вниз, слева направо. Этот способ использовался в последней части демо Shock. В демо Iris (часть "Real Morph") хранятся адреса через одну строчку (для точности вывода в 2 пикселя).