Coding - быстрая печать спрайта 2х2 знакоместа, с точностью до знакоместа.

Deja Vu #09
(C) Death MoroZ
__________________________________________


   Всем привет, кто про chunky-bump'ы, а я
про быструю печать спрайта 2х2 знакоместа,
которая расчитана на фиксированное положе-
ние спрайта, например, это может быть  пе-
чать карты.
   Итак, нижеследующую процедуру необходи-
мо вызвать перед  запуском основной  прог-
раммы.
   Процедура CREAT несколько изменяет фор-
мат спрайтов, а именно: оставляя без изме-
нения первые 2 знакоместа, со вторыми про-
исходит следующее:

        до вызова:         после:
          16 17            30 31
          18 19            28 29
          20 21            26 27
          .. ..            .. ..


   Для чего это надо? А вот для чего: нап-
ример, в HL у нас задан адрес в экране,ку-
да идет печать, при печати первых 2-х зна-
комест проблем нет, но как  с  наименьшими
потерями перейти ко второй паре? Например,
можно сохранять до изменения адрес:LD A,H,
а потом востановить: LD H,A, можно исполь-
зовать стек, установив его на таблицу  ад-
ресов, но есть  способ лучше. Для перехода
к  следующим  знакоместам  просто  сделать
INC H, а затем продолжать  выводить  снизу
вверх, именно  для  этого  и предназначена
нижеприведенная процедура.


CREAT  LD      HL,адрес спрайтов+16
       LD      DE,адрес спрайтов+30
DCR    LD      B,число спрайтов
M1_    PUSH    BC,HL,DE
       LD      B,4
M2_    LD      A,(HL)
       EX      AF,AF'
       LD      A,(DE)
       LD      (HL),A
       EX      AF,AF'
       LD      (DE),A
       INC     HL
       INC     DE
       LD      A,(HL)
       EX      AF,AF'
       LD      A,(DE)
       LD      (HL),A
       EX      AF,AF'
       LD      (DE),A
       INC     HL
       DEC     DE
       DEC     DE
       DEC     DE
       DJNZ    M2_
       POP     DE
       EX      DE,HL
       LD      BC,32
       ADD     HL,BC
       EX      DE,HL
       POP     HL
       ADD     HL,BC
       POP     BC
       DJNZ    M1_
       RET


Пример процедуры вывода:

       LD     (SP_+1),SP
       LD      IX,OUTS
       LD      DE,АДРЕС В КАРТЕ
       EXX
       LD      BC,#6000;АДРЕС БУФЕРНОГО
       EXX              ;ЭКРАНА
       LD      IX,OUTS
       LD      B,ЧИСЛО СПРАЙТОВ ПО Y
LOOP   LD      HL,$+3
       !ASSM   ЧИСЛО СПРАЙТОВ ПО X
       JP      (IX)
       !CONT
;ВАША  ПРОЦЕДУРА  ПЕРЕХОДА К СЛЕД.ГОРИЗОН-
;ТАЛЬНОЙ ЛИНИИ,И ПЕРЕХОДА К СЛЕД.ПАРЕ ЗНА-
;КОМЕСТ ЭКРАНА
       DJNZ    LOOP
SP_    LD      SP,0
       RET


OUTS   LD      A,(DE)
       EXX
       ADD     A,A
       LD      L,A
       LD      H,SPR_TBL'&H;СТАРШИЙ БАЙТ
;ЗАРАНЕЕ ПОДГОТОВЛЕННОЙ ТАБЛИЦЫ АДРЕСОВ
;(ДЛЯ  СОЗДАНИЯ  СТАТИЧНОЙ АНИМАЦИИ ДОСТА-
;ТОЧНО ЛИШЬ МЕНЯТЬ ЕГО СНАЧЕНИЕ)
       LD      SP,HL
       POP     HL
       LD      SP,HL;ВЗЯЛИ АДРЕС СПРАЙТА
       LD      H,B
       LD      L,C;В HL-АДРЕС ДЛЯ ПЕЧАТИ
;
       !ASSM   3
       POP     DE
       LD      (HL),E
       INC     L
       LD      (HL),D
       INC     H
       POP     DE
       LD      (HL),D
       DEC     L
       LD      (HL),E
       INC     H
       !CONT
       POP     DE
       LD      (HL),E
       INC     L
       LD      (HL),D
       INC     H
       POP     DE
       LD      (HL),D
       DEC     L
       LD      (HL),E;НАПЕЧАТАЛИ ВЕРХНЮЮ
;                     ПОЛОВИНУ

       LD      A,#20
       ADD     A,L
       LD      L,A;ПЕРШЛИ К НИЖНЕЙ

       !ASSM   3;ПЕЧАТАЕМ НИЗ...
       POP     DE
       LD      (HL),E
       INC     L
       LD      (HL),D
       DEC     H
       POP     DE
       LD      (HL),D
       DEC     L
       LD      (HL),E
       DEC     H
       !CONT
       POP     DE
       LD      (HL),E
       INC     L
       LD      (HL),D
       DEC     H
       POP     DE
       LD      (HL),D
       DEC     L
       LD      (HL),E
       INC     C;НЕОБХОДИМЫЕ
       INC     C;КОРРЕКТИРОВКИ...
       EXX
       INC     E
       INC     HL
       INC     HL
       JP      (HL);ВЫХОД
------------------------------------------