Расчет адреса следующей строки экрана — различия между версиями

Материал из SpeccyWiki
Перейти к: навигация, поиск
 
(не показаны 3 промежуточные версии 2 участников)
Строка 1: Строка 1:
'''Расчет адреса следующей строки экрана''' (DOWN HL), '''UP HL''' — широко используемые при программировании графики процедуры для перехода к следующей и предыдущей пиксельной строке экрана с учётом [[256x192|нелинейной раскладки видеопамяти]], то есть с переходом между строками знакомест и третями экрана.
+
'''Расчет адреса следующей/предыдущей пиксельной строки экрана''', '''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 пикселя).
 +
 
 +
[[Категория:Программирование графики]]

Текущая версия на 09: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 пикселя).