Расчет адреса следующей строки экрана — различия между версиями
Moroz1999 (обсуждение | вклад) |
Alone (обсуждение | вклад) |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 1: | Строка 1: | ||
− | '''Расчет адреса следующей строки экрана''' | + | '''Расчет адреса следующей/предыдущей пиксельной строки экрана''', '''DOWN HL''', '''UP HL''' — широко используемые при программировании графики процедуры для перехода к следующей и предыдущей пиксельной строке экрана с учётом [[256x192|нелинейной раскладки видеопамяти]], то есть с переходом между строками знакомест и третями экрана. |
Из названия процедуры следует, что адрес находится в регистровой паре HL. Также используются варианты этой процедуры для других регистровых пар. Существует несколько версий процедуры, отличающихся размером и быстродействием, а также оформлением в виде подпрограммы или макроса. Время выполнения процедуры зависит от адреса текущей пиксельной строки. | Из названия процедуры следует, что адрес находится в регистровой паре HL. Также используются варианты этой процедуры для других регистровых пар. Существует несколько версий процедуры, отличающихся размером и быстродействием, а также оформлением в виде подпрограммы или макроса. Время выполнения процедуры зависит от адреса текущей пиксельной строки. | ||
В случае реализации функционала в виде отдельной процедуры, условные переходы необходимо заменить на условный возврат (JR Z,EXIT -> RET Z). | В случае реализации функционала в виде отдельной процедуры, условные переходы необходимо заменить на условный возврат (JR Z,EXIT -> RET Z). | ||
+ | |||
+ | Вариант в виде макроса был встроен в ассемблер [[MASM]]. | ||
<code><pre> | <code><pre> | ||
;В этом варианте процедуры также используется флаг переноса. | ;В этом варианте процедуры также используется флаг переноса. | ||
;Он установлен, если был переход к следующей строке знакомест. | ;Он установлен, если был переход к следующей строке знакомест. | ||
+ | |||
+ | ;Время выполнения этой версии кода в тактах: | ||
+ | ; 27 переход в пределах строки знакомест | ||
+ | ; 49 переход в следующую строку знакомест | ||
+ | ; 59 переход в следующую треть экрана | ||
DOWN_HL: | DOWN_HL: | ||
Строка 37: | Строка 44: | ||
</pre></code> | </pre></code> | ||
− | [[ | + | Этот вариант удобнее использовать в виде подпрограммы. Для использования внутри циклов есть более быстрый вариант, предложенный [[Spencer Winset]] (не возвращает флаги): |
+ | |||
+ | <code><pre> | ||
+ | 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: | ||
+ | </pre></code> | ||
+ | |||
+ | Spencer Winset также предложил технику [[Down Micro Dub]], где в выводе спрайта используется цикл из 8 строк со входом и выходом из произвольного места, а 7 из 8 строк имеют только INC H. | ||
+ | |||
+ | В демо может использоваться более простой способ: держать все экранные адреса в стеке - сверху вниз, слева направо. Этот способ использовался в последней части демо [[Shock]]. В демо [[Iris]] (часть "Real Morph") хранятся адреса через одну строчку (для точности вывода в 2 пикселя). | ||
+ | |||
+ | [[Категория:Программирование графики]] |
Текущая версия на 06:41, 6 апреля 2013
Расчет адреса следующей/предыдущей пиксельной строки экрана, 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 пикселя).