2.1.4. Перемещение спрайтов.
Теперь, когда мы научились создавать спрайты и
печатать их на экране в нужной нам позиции, настало время подумать о
самом интересном моменте - о перемещении спрайтов. Для того, чтобы
начать эксперименты с анимацией спрайтов, нам потребуется специальная
процедура, которую мы будем использовать еще не раз. Назовем эту
процедуру драйвером спрайта SPRDRV и рассмотрим здесь поподробнее
В качестве первого приближения поставим задачу простейшего
Рис. 15 Блок-схема процедуры простого перемещения спрайта.
перемещения без анимации, т.е. без изменения
формы спрайта. Наша задача разобьется на две подзадачи. Первая -
управление перемещением спрайта, этим займется головная процедура и
вторая задача состоит в непосредственно печати и стирании спрайта -этим
и займется процедура-драйвер Связь между ними будет организована по
следующей схеме (см. рис. 15).
Печать/стирание выполняются последовательной печатью по XOR
(ИСКЛЮЧАЮЩЕЕ ИЛИ). Это наиболее эффективный прием. Мы о нем уже
говорили в предыдущих томах сериала, но если Вы желаете убедиться в
этом сами, поэкспериментируйте, например:
Исходный байт: 1100 1010
Накладываемый байт: 1111 0000
Результат (XOR) ООН 1010
Повторное наложение 1111 0000
Окончательный результат: 1100 1010
Как видите, окончательный результат ничем не
отличается от исходного байта. В этом и состоит основной смысл
использования функции XOR То есть первое наложение байта на байт по XOR
эквивалентно печати спрайта на заранее подготовленном фоне, а второе
наложение в то же место обеспечивает стирание и восстановление фона Во
втором томе нашего сериала ("Прикладная гра фика",
с. 46-51) мы даже вывели ряд правил, которых необходимо придерживаться
для того, чтобы при такой печати по X0R свести к минимуму проблемы,
связанные с "клэшингом" атрибутов. Вам также может быть полезна работа
С.Суркова "Вывод спрайтов на экран с маской", опубликованная в сборнике ZX-FORUM (с 126-131).
Листинг 7
Загрузчик управляющей процедуры. 10 REM »•* Загрузчик машинного кода
20 LET adr-53500 LET long=170- LET check-70909■ LET sum=0 30 FOR k=0 TO long-1: READ a 40 POKE (adr+k),a: LET sum=sum+a
50 NEXT к
60 IF sumocheck THEN PRINT ■■??": STOP 100 REM «** Данные для нашинного кода
110
|
DATA
|
042,
|
011,
|
092,
|
017,
|
004
|
120
|
DATA
|
000,
|
025,
|
078,
|
030,
|
008
|
130
|
DATA
|
025,
|
070,
|
025,
|
126,
|
230
|
140
|
DATA
|
003,
|
050,
|
158,
|
209,
|
025
|
150
|
DATA
|
126,
|
050,
|
159,
|
209,
|
025
|
160
|
DATA
|
126,
|
230,
|
001,
|
050,
|
160
|
170
|
DATA
|
209,
|
025
|
126,
|
230,
|
001
|
180
|
DATA
|
050,
|
161,
|
209,
|
025,
|
126
|
190
|
DATA
|
017,
|
063,
|
000,
|
033,
|
009
|
200
|
L A"
|
213,
|
025,
|
061,
|
032,
|
252
|
210
|
DATA
|
205,
|
093,210,
|
254,
|
000
|
220
|
DATA
|
040,
|
019,
|
058,
|
161,
|
209
|
230
|
DATA
|
254,
|
000,
|
040,
|
012,
|
058
|
240
|
DATA
|
160,
|
209,
|
198,
|
001,
|
230
|
250
|
DATA
|
001,
|
050,
|
160,
|
209,
|
024
|
260
|
DATA
|
071,
|
118,
|
205,
|
196,
|
209
|
270
|
DATA
|
058,
|
158,
|
209,
|
254,
|
000
|
280
|
DATA
|
040,
|
019,
|
254,
|
001,
|
040
|
290
|
DATA
|
026,
|
254,
|
002,
|
040,
|
033
|
300
|
DATA
|
005,
|
005.
|
005,
|
120,
|
230
|
310
|
DATA
|
252,
|
040,
|
044,
|
195,
|
132
|
320
|
DATA
|
209,
|
013,
|
013,
|
013,
|
121
|
330
|
DATA
|
230,
|
252,
|
040,
|
033,
|
195
|
340
|
DATA
|
132,
|
209,
|
012,
|
012,
|
012
|
350
|
DATA
|
121,
|
214,
|
231,
|
048,
|
022
|
360
|
DATA
|
195,
|
132,
|
209,
|
004,
|
004
|
370
|
DATA
|
004,
|
120,
|
214,
|
150,
|
048
|
380
|
DATA
|
011,
|
058,
|
159,
|
209,
|
061
|
390
|
DATA
|
050,
|
159,
|
209,
|
254,
|
000
|
400
|
DATA
|
032,
|
159,
|
058,
|
160,
|
209
|
067,250,208,254 200,118,205,093 201,001,063,000 000,000,000,000
410 DATA 237, 420 DATA ООО, 430 DATA 210, 440 DATA 001,
формат управляющей процедуры.
DBF FNg (х,у,d, 1,3, о,II)
х,у - координаты исходной позиции спрайта. Они относятся к ле-вону верхнему углу и задаются в пикселах.
d - direction - параметр, определяющий направление перемещения.
d=0 - перемещение справа налево. d=l - перемещение слева направо. d=2 - перемещение снизу вверх. d=l - перемещение сверху вниз-
1 - параметр, определяющий дистанцию, на
которую перемещается спрайт. За единицу принято перемещение на три
пиксела. Таким образом, если установить здесь например число 20, то
спрайт продвинется на 60 пикселов и остановится.
s - switch - параметр, определяющий остается
спрайт на экране после окончания перемещения или нет. Если s=0, то он
останется на экране. Если s=l, то спрайт исчезнет.
с
- collision флаг детекции коллизии. Если его включить (с=1), то при
столкновении с любым препятствием (со включенными пикселами экрана)
спрайт остановится после того, как три пиксела спрайта "наедут" на
препятствие. Если его отключить (с=0), то спрайт будет проходить через
любое препятствие.
п номер спрайта. Если у Вас в таблице спрайтов
задано несколько шаблонов, то здесь достаточно указать на нужный Ван
нонер спрайта.
Листинг 8 Процедура, управляющая перенещениен спрайта.
Адрес Наш.код Метка Мнемоника
D0FC 2А0В5С
D0FF 110400 D102 19
D103 4Е
D104 D106 D107 D108 D109
D10A Е603
LD HL,(#5C0B)
DOFA 0000 YXLAST DEFW #0000
LD DE,#0004 ADD HL,DE
LD C,(HL)
E, #08 HL, DE B,(HL) HL, DE A,(HL)
AND #03
;Когда спрайт закончит перемещение, в эту переменную запишутся последние координаты у и х. ;По
ним можно определить, ;например, где произошла ;коллизия с
препятствием. ; Точка входа. ;DEFADD - системная переменная,
указывающая на ;то, где находятся параметры функции пользователя. Ее
адрес: #5С0В ;(23563).
;Сдвиг от DEFADD на 4 ;байта, переход к первому
параметру ;Координата х левого верхнего угла спрайта. ;Сдвиг еще на 8
байтов ко ;второму параметру. ;Координата у. ;Переход к 3-му пар-ру.
;Направление движения ;спрайта - d. :Маскирование шести старших битов
(за ненадобностью) .
Адрес Маш-код Метка Мнемоника
HL,DE A, (HL) (DIST),A HL, DE A,(HL) #01
(SWTCH),A HL, DE A,(HL) #01
(FLAG),A HL,DE A,(HL) DE,#003F HL,#D509 HL,DE A
ADD
LD
LD
ADD
LD
AND
LD ADD LD AND
LD
ADD
LD
LD
LD
ADD
DEC
3R
D10F D110 Dill D114 D115 D116
D118 D11B D11C D11D
D11F D122 D123 D124 D127 D12A D12B D12C D12E
19
7E
329FD1 19 7E E601
32A0D1
19
7E
E601
32A1D1
19
7E
113F00 2109D5 19 3D
20FC CD5DD2
NZ,LOOP
Z , BYPASS A,(FLAG) #00
Запомнили направление в программной переменной.
Переход к 4-му пар-ру. Дистанция перемещения. Запомнили в переменной.
Переход к 5-му пар-ру. Переключатель в. Семь старших битов не нужиы.
Запомнили в переменной. Переход к 6-му пар-ру. Флаг детекции коллизни. Маскирование старших битов.
Сохранили в переменной. Переход к 7-му пар-ру.
Номер спрайта (п). Определение начала шаблона спрайта в таблице по его
номеру (см. комментарий на с.26).
Вызов драйвера для печати спрайта. По окончании
печати драйвер выдает в аккумуляторе единицу, если произошло наложение
пикселов спрайта на включенные пикселы фонового экрана Это и есть
коллизии с препятствием. Если ноль, то обход. Проверяется флаг детекции
коллизии.
D148 76 BYPASS
D149 CDC4D1
D14C 3A9ED1
D14F FEOO
D151 2813
D153 FE01
D155 281А
D157 FE02
D159 2821
D15B 05
D15C 05
D15D 05
D15E 78
D15F E6FC
D161 282С
D163 C384D1
D166 OD LEFT
D167 OD
D168 OD 3R Z,BYPASS
LD A, (SWTCH)
ADD А,#01
AND #01
LD (SWTCH), A
3R END
HALT
CALL SPRDRV-S
LD A,(DIREC)
CP #00
3R Z,LEFT
CP #01
3R Z, RIGHT
CP #02
3R Z,UP
DEC В
DEC В
DEC В
LD А,В
AND #FC
JR Z,END
ЭР CONT
DEC С
DEC С
DEC С .
Комментарий
;Если нет детекции коллизии, то обход.
Переключение переключателя SWTCH в
противоположное положение. Завершение работы по ; причине коллизии с
препятствием. :Краткая пауза. :Вызов процедуры стирания ;спрайта.
;Направление перемещения ;влево?
;Если так, переход. ;Направление вправо? ;Если
так, переход. Направление вверх? ;Если так, переход. ;Остается только
направление вниз. Уменьшаем ;координату у в регистре ;"В" на три
единицы. ;Проверка на выход за ;пределы нижней границы ;экрана. #FC=1111 1100. ;Команда
AND FC может ;дать ноль только если ;число в аккумуляторе ;от 0 до 3.
;Конец работы. ;Иначе продолжаем. ;Уменьшение ;координаты х.
Адрес Маш .код Метка Мнемоника_Комментарий -
D169
|
79
|
|
LD
|
А,С
|
;Проверка на выход за
|
D16A
|
E6FC
|
|
AND
|
#FC
|
;левую границу экрана.
|
D16C
|
2821
|
|
3R
|
Z, END
|
;Если так, то конец.
|
D1SE
|
C384D1
|
|
JP
|
CONT
|
;Иначе продолжаем.
|
D171
|
ОС
|
RIGHT
|
INC
|
С
|
;Увеличение
|
D172
|
ОС
|
|
INC
|
С
|
;координаты х.
|
D173
|
ОС
|
|
INC
|
с
|
;
|
D174
|
79
|
|
LD
|
А,С
|
;Проверка на выход за
|
D175
|
D6E7
|
|
SUB
|
#E7
|
;правый край экрана.
|
D177
|
3016
|
|
JR
|
NC.END
|
;Если так, то конец.
|
D179
|
C3B4D1
|
|
JP
|
CONT
|
;Иначе продолжаем.
|
D17C
|
04
|
UP
|
INC
|
В
|
;Увеличение координаты
|
D17D
|
04
|
|
INC
|
В
|
;
|
D17E
|
04
|
|
INC
|
В
|
;
|
D17F
|
78
|
|
LD
|
А,В
|
;Проверка на выход за
|
D180
|
D696
|
|
SUB
|
#96
|
;верхний край экрана.
|
D182
|
300В
|
|
OR
|
NC.END
|
;Если так, то конец.
|
D184
|
3A9FD1
|
CONT
|
LD
|
A,(DIST)
|
;Уменьшение дистанции
|
D187
|
3D
|
|
DEC
|
A
|
;движения
|
D188
|
329FD1
|
|
LD
|
(DIST),A
|
;на 1 пункт.
|
D18B
|
FE00
|
|
CP
|
#00
|
;Проверка на конец ;перемещения.
|
D18D
|
209F
|
|
JR
|
NZ,BEGIN
|
;Если не конец, то воз ;врат к началу движени!
|
D18F
|
3AA0D1
|
END
|
LD
|
A,(SWTCH)
|
;Иначе загрузка SWTCH.
|
D192 ED43FAD0 LD (YXLAST),ВС;После окончания переме
щения спрайта его последние координаты за
;поминаются в этой ячейке ;памяти. Это полезно, ес-;ли спрайт с чем-то
столкнулся. Можно узнать, ;где произошло столкновение и использовать
это в ;программе.
Адрес Маш, код Метка Мнемоника__Комментарий
d196
|
feoo
|
|
cp
|
#00
|
.•Проверка swtch.
|
d198
|
c8
|
|
ret
|
z
|
;Если 0, то спрайт рисо ;вать больше не надо и ;возврат.
|
d199
|
76
|
|
halt
|
|
.•Краткая пауза
|
d19a
|
cd5dd2
|
|
call
|
sprdrv-p
|
; Последнее рисование ;спрайта.
|
d19d
|
c9
|
|
ret
|
|
:Выход.
|
d19e
|
01
|
direc
|
defb
|
01
|
Направление движения.
|
d19f
|
3f
|
dist
|
defb
|
3f
|
;Дистанция перемещения.
|
d1a0
|
00
|
swtch
|
defb
|
00
|
;Переключатель я.
|
d1a1
|
01
|
flag
|
defb
|
01
|
; Флаг детекции коллизии
|
d1a2
|
0000
|
|
defw
|
0000
|
|
d1a4
|
0000
|
|
defw
|
0000
|
|
Листинг 9
Загрузчик драйвера спрайтов SPRDRV 10 REM *** Загрузчик машинного кода
20 LET adr=53700: LET long=365: LET
check=94117: LET sum=0 30 FOR k=0 TO long-1: READ a 40 POKE (adr+k),a:
LET sum=sum+a 50 NEXT k
60 IF sumocheck THEN PRINT "??": STOP 100 REM »** Данные для машинного кода
110 DATA 229,213,197,245,229
120 DATA 221,225,120,205,177
130 DATA 034,040,082,237,067
140 DATA 015,210,050,229,209
150 DATA 062,021,008,221,094
160 DATA 000,221,086,021,221
170 DATA 078,042,006,002,175
180 DATA 203,027,203,026,203
190 DATA 025.031,016,247,035
200
|
DATA
|
035,
|
035
|
, 174
|
,119,
|
043
|
210
|
DATA
|
126,
|
169
|
,119
|
,043,
|
126
|
220
|
DATA
|
170,
|
119
|
,043
|
,126,
|
171
|
230
|
DATA
|
119,
|
008
|
,061
|
,040,
|
025
|
240
|
DATA
|
008,
|
221
|
,035
|
,036,
|
124
|
250
|
DATA
|
230,
|
007
|
,032
|
,205,
|
001
|
260
|
DATA
|
202,
|
140
|
,008
|
,095,
|
008
|
270
|
DATA
|
062,
|
021
|
,147
|
,128,
|
071
|
280
|
DATA
|
205,
|
177
|
.034
|
,024,
|
189
|
290
|
DATA
|
241,
|
193
|
,209
|
,225,
|
201
|
300
|
DATA
|
237,
|
067
|
,081
|
,210,
|
062
|
310
|
DATA
|
021,
|
008,
|
221
|
,094,
|
000
|
320
|
DATA
|
221,
|
086,
|
021
|
,221,
|
078
|
330
|
DATA
|
042,
|
035,
|
035
|
,126,
|
169
|
340
|
DATA
|
119,
|
043,
|
126
|
,170,
|
119
|
350
|
DATA
|
043,
|
126,
|
171
|
,119,
|
008
|
360
|
DATA
|
061,
|
040,
|
218
|
,008,
|
221
|
370
|
DATA
|
035,
|
036,
|
124
|
,230,
|
007
|
380
|
DATA
|
032,
|
221,
|
008
|
,095,
|
008
|
390
|
DATA
|
001,
|
184,
|
140
|
,062,
|
021
|
400
|
DATA
|
147,
|
128,
|
071
|
,205,
|
177
|
410
|
DATA
|
034
|
,024,
|
205
|
1229,
|
213
|
420
|
DATA
|
197
|
,229,
|
221
|
,225,
|
151
|
430
|
DATA
|
050
|
,041,
|
211
|
,120,
|
205
|
440
|
DATA
|
177
|
,034,
|
202
|
,216,
|
210
|
450
|
DATA
|
237
|
,067,
|
194
|
,210,
|
050
|
460
|
DATA
|
130
|
,210,
|
062
|
,021,
|
008
|
470
|
DATA
|
221
|
,094,
|
000
|
,221,
|
086
|
480
|
DATA
|
021
|
,221.
|
078
|
,042,
|
006
|
490
|
DATA
|
005
|
,175,
|
203
|
,027,
|
203
|
500
|
DATA
|
026
|
,203,
|
025
|
,031,
|
016
|
510 DATA 247,035,035,035,071 520 DATA 126,160,196,033,211 530 DATA 126,168,119,043,126
540
|
DATA
|
161
|
.196,
|
033,
|
211
|
,126
|
550
|
DATA
|
169
|
,119,
|
043,
|
126
|
,162
|
560
|
DATA
|
196
|
.033,
|
211,
|
126
|
,170
|
570
|
DATA
|
119
|
,043,
|
126,
|
163
|
,196
|
580
|
DATA
|
033
|
,211,
|
126,
|
171
|
,119
|
590
|
DATA
|
008
|
,061,
|
040,
|
025
|
,008
|
600
|
DATA
|
221
|
.035,
|
036,
|
124
|
,230
|
610
|
DATA
|
007
|
,032,
|
183,
|
001
|
,205
|
620
|
DATA
|
140
|
,008,
|
095,
|
008
|
,062
|
630
|
DATA
|
021
|
,147,
|
128,
|
071
|
,205
|
640
|
DATA
|
177
|
,034,
|
024,
|
167
|
,193
|
650
|
DATA
|
209
|
,225,
|
058,
|
041
|
,211
|
660
|
DATA
|
201
|
.237,
|
067,
|
021
|
,211
|
670
|
DATA
|
062
|
,021,
|
008,
|
221
|
,094
|
680
|
DATA
|
000
|
,221,
|
086,
|
021
|
,221
|
690
|
DATA
|
078
|
,042,
|
035,
|
035
|
,126
|
700
|
DATA
|
161
|
,196,
|
033.
|
211
|
,126
|
710
|
DATA
|
169
|
,119,
|
043,
|
126
|
,162
|
720
|
DATA
|
196
|
.033,
|
211,
|
126
|
,170
|
730
|
DATA
|
119
|
,043,
|
126,
|
163
|
,196
|
740
|
DATA
|
033
|
,211,
|
126,
|
171
|
,119
|
750
|
DATA
|
008
|
,061,
|
040,
|
201
|
,008
|
760
|
DATA
|
221
|
,035,
|
036,
|
124
|
.230
|
770
|
DATA
|
007
|
,032,
|
206,
|
008
|
,095
|
780
|
DATA
|
008
|
,001,
|
184,
|
140
|
,062
|
790
|
DATA
|
021
|
,147,
|
128,
|
071
|
,205
|
800
|
DATA
|
177
|
,034,
|
024,
|
190
|
,245
|
810
|
DATA
|
062
|
.001,
|
050,
|
041
|
,211
|
820
|
DATA
|
241
|
,201,
|
,001,
|
000
|
,000
|
830
|
DATA
|
083
|
,000,
|
000,
|
000
|
,000
|
Листинг 10 Драйвер спрайтов SPRDRV
Примечание: во время работы процедура в
некоторых случаях модифицирует саму себя. Ячейки памяти, изменяющиеся
динамически по ходу работы, отмечены в листинге символами **«**.
Адрес Маш .код Метка Мнемоника_Комментарий.
;Это точка входа для ;стирания спрайта. ; Сохранение всех ;основных регистровых ;пар на машинном ;стеке.
;Переброска адреса из ;HL в IX через стек. ;Запомнили регистр В, ;т.к вызов #22В1 его ;портит.
PUSH DE PUSH ВС PUSH AF PUSH HL POP IX LD А,В
F5
D1C8 Е5 D1C9 DDE1 D1CB 78
D1CC CDB122
;Это вызов процедуры ПЗУ PIXEL-ADD, которая
расположена ;начиная с адреса #22АА. Процедура служит для того, чтобы
по координатам пиксела, заданным в паре ВС (I - в С, а у - в В] найти
адрес, соответствующий этому пикселу в дисплейном файле. Этот адрес
выдается процедурой в регистровую пару HL. Поскольку по этому адресу
находится байт, позиция включенного бита которого также важна, эта
процедура выдает в регистре А позицию пиксела внутри байта
;Обычно в "высокой" графике принято отсчитывать
координаты X и Y, начиная с левого нижнего угла экрана. Здесь же этот
порядок изменен. Все процедуры, которые в своей работе обращаются к
процедуре MAIN, задают координаты положения спрайта в системе отсчета,
в которой за ноль приняты координаты левого верхнего угла. Именно
поэтому вызов процедуры PIXELL-ADD пропс
;ходит не по обычной точке входа #22АА, а через точку #22В1. Адрес Маш .код метка Мнемоника_Комментарий.
JR Z,FIT-S
D1D1
|
ED430FD2
|
|
LD
|
(#D20F),B<
|
D1D5
|
32E5D1
|
|
LD
|
(#D1E5),A
|
D1D8
|
ЗЕ15
|
|
LD
|
A,#15
|
D1DA
|
08
|
|
EX
|
AF, AF 1
|
D1DB
|
DD5E00
|
BEGIN1
|
LD
|
E,(IX+0)
|
D1DE
|
DD5615
|
|
LD
|
D,(IX+21)
|
D1E1
|
DD4E2A
|
|
LD
|
C,(IX+42)
|
D1E4
|
0602
|
|
LD
|
B, #02
|
D1E6
|
AF
|
|
XOR
|
A
|
D1E7
|
СВ1В
|
LOOP-1
|
RR
|
E
|
D1E9
|
СВ1А
|
|
RR
|
D
|
D1EB
|
СВ19
|
|
RR
|
С
|
DIED
|
IF
|
|
RRA
|
|
D1EE
|
10F7
|
|
DJNZ
|
LOOP-l
|
D1F0
|
23
|
|
INC
|
HL
|
D1F1
|
23
|
|
INC
|
HL
|
D1F2
|
23
|
|
INC
|
HL
|
D1F3
|
АЕ
|
|
XOR
|
(HL)
|
D1F4
|
77
|
|
LD
|
(HL),A
|
D1F5
|
2В
|
|
DEC
|
HL
|
Переход, если пиксел находится в нулевой
позиции, т.е. левая граница спрайта совпадает с границей знакоместа.
Модифицируем команду #D20E координатами у,х. Настраиваем счетчик
смещений битов. См. команду #D1E4.
#15=21 - число строк в спрайте.
Сохранение регистра А. Адреса трех байтов, образующих строку, (см. рис. 7).
Инициализация счетчика ротаций (см. #D1D5)
Обнуление аккумулятора. Ротация вправо (перемещение пиксела вправо)
регистров C,D,E,A. Выполняется столько раз, сколько выставлено в В.
Смещение на четвертое знакоиесто вправо. Стирание линии в крайнем
правом знакоместе повторной печатью по XOR.
Переход ко 2-му знакоместу справа.
Адрес Маш-код Метка Мненоника
A,(HL)
С
(HL),A HL
A,(HL) D
(HL),A HL
A,(HL)
E
(HL),A AF,AF'
A
Z,END-S
D211 D212 D213 D214 D216 D217
EX AF, AF1
INC IX
INC H
LD A,H AND #07 JR NZ,BEGIN1 LD BC,#8CCA EX AF,AF' E,A AF ,AF1 A,#15 E
А,В
D1F6 D1F7 D1F8 D1F9
D1FA D1FB D1FC D1FD
LD
X0R
LD
DEC
LD XOR LD DEC
LD
XOR
LD
EX
DEC 3R
D1FE 7Е D1FF АВ D200 D201
D202 3D D203 2819
D205 08
D206 DD23
D208 24
Стираиие линии во
2-м справа знакоместе. Переход ко 2-му знакоместу слева. Стирание линии во 2-м
слева знакоместе. Переход к крайнему левому знакоместу. Стирание линии
в крайнем левом знакоместе. Восстановили счетчик линий.
Уменьшили его. Если весь спрайт стерт, то выход. Запомнили счетчик линий.
Переход к очередному байту в шаблоне спрайта.
Переход к соседней снизу линии на экране. Если очередной экранный ряд не закончен, возврат к началу цикла. Взяли счетчик линий.
Расчет по формуле: В=у+21-Е, где Е количество ненапечатанных строк спрайта.
Адрес Маш.код метка Мнемоника
D218 47 D219 CDB122
D21C D21E D21F D220 D221 D222
LD В,А
CALL #22В1
JR BEGIN1
POP AF
POP ВС
POP DE
POP HL RET 5Вызов PIXEL-ADD (см. ;выше).
;Возврат к началу цикла. Финишные операции, связанные с балансировкой стека.
Выход из процедуры.
Е,(IX+0) D,(IX+21) С,(IX+42) HL INC HL LD A, (HL) XOR С
LD (HL),А
DEC HL
LD A, (HL)
XOR D
LD (HL),A
DEC HL
LD A, (HL) XOR E
D223 ED4351D2 FIT-S LD (#D251),BC ;Ввели координату в
;команду #D251.
D227 ЗЕ15 LD А,#15 ;21 строка в спрайте.
D229 08 EX AF,AF1 ;Временно сохранили.
;Это начало цикла по ;строкам.
BEGIN2 LD Е,(IX+0) ;Три байта, образующие LD D, (IX+21) ;одну линию в спрайте.
DD5E00
DD5615
DD4E2A
23
23
7Е
А9
D22A D22D D230 D233 D234 D235 D236
D239 D23A D23B D23C
D23D D23E
;Расчет адреса ;правого знакоместа. ;Сняли с экрана. ;Наложили спрайт по :XOR.
;Поместили результат на ; экран.
;Соседнее знакоместо ;слева.
;Стирание линии в ;этом знакоместе.
;Крайнее левое ; знакоместо. ;Стирание линии в ;крайнем левом
Адрес Маш-код Метка Мнемоника
D23F 77 D240 08
3D
28DA
D248 D249 D24B D24D D24E D24F D250
D244 08 D245 DD23
D247 24
7С Е607 20DD 08 5F 08
01В88С
D253 D255 D256 D257 D258 D25B
ЗЕ15 93 80 47
CDB122 18CD
LD (HL),A
EX AF,AF1
DEC A
3R Z,END-S
EX AF,AF1
INC IX
INC H
A,H
#07
NZ.BEGIN2 AF , AF 1 E,A AF, AF' BC,#8CB8
A,#15 E
A,В
B,A CALL #22B1 JR BEGIN2 знакоместе.
Восстановили счетчик линий-Уменьшили его. Выход, если все линии
удалены. Сохранили счетчик. Переход к следующему байту в шаблоне
спрайта.
Переход к соседней (снизу) линии экрана. Если
очередной экранный ряд не закончен, возврат к началу цикла Запомнили
счетчик линий -
Ввод текущей координаты у (см. также команду
#D223). Расчет по формуле: В=у+21-Е, где Е количество ненапечатанных
строк спрайта. Вызов PIXEL-ADD Возврат к началу
SPRDRV-P PUSH HL
PUSH DE PUSH ВС PUSH HL POP IX
;Точка входа для печати. Сохранение всех основных регистровых пар на машинном стеке. ;Переброска адреса из ;HL в IX через стек.
Адрес Маш-код Метка Мнемоника_Комментарий.
D263 97
D264 3229D3
D267 78
D268 CDB122
D26B CAD8D2
D26E ED43C2D2 D272 3282D<>
D275 3E15
D277 08
D278 DD5E00
D27B DD5615
D27E DD4E2A
D281 0605
SUB А
LD (COLLI Z) , А LD А, В CALL #22В1
DP Z.FIT-P
LD (#D2C2),BC LP (#D282),A
LD A,#15
EX AF,AF'
LD E, (IX+0)
LD D,(IX+21)
LD Cf(IX+42)
LD B, #05
Обнуление аккумулятора. Инициализация COLLIZ.
Сохраняем В (см. выше). Вызов процедуры ПЗУ PI-XELL-ADD. Определяем
адрес в дисплейном файле, соответствующий х и у. Подробнее см. выше.
Переход, если пиксел находится в нулевой позиции знакоместа.
Модифицируем команду #D2C1 координатами у,х. Модифицируем команду #D281
номером позиции пиксела, к которому относится координата Количество
линий в спрайте - 21. Оставили А в качестве счетчика линий. Три линии
из трех соседних по горизонтали знакомест.
Здесь стоит номер позиции включенного пиксела в байте (см. команду по адресу #D272). Обнуление аккумулятора. Ротация вправо.
Конец цикла ротации. Смещение
D28E 23
D28F 23
D290 47
D291 7Е
D292 АО
D293 C421D3
INC HL INC HL LD В,А LD A,(HL) AND В
CALL NZ,COL-ON на четвертое знакоместо вправо.
Печать линии в крайнем правой знакоместе. При наличии коллизии включили
перемен ную COLLIZ.
Адрес Маш.код Метка Мнемоника
D296 D297 D298
D299 2В
D29A 7Е
D29B А1
D29C C421D3
D29F 7Е
D2A0 А9
D2A1 77
D2A2 2В
D2A3 7Е
D2A4 А2
D2A5 C421D3
D2A8 7Е
D2A9 АА
D2AA 77
D2AB 2В
D2AC 7Е
D2AD A3
D2AE C421D3
D2B1 7Е
D2B2 АВ
D2B3 77
LD A,(HL)
XOR В
LD (HL),A
DEC HL
LD A, (HL)
AND С
CALL NZ,COL-ON
LD A,(HL)
XOR С
LD (HL),A
DEC HL
LD A,(HL)
AND D
CALL NZ.COL-ON
LD A,(HL)
XOR D
LD (HL),A
DEC HL
LD A, (HL)
AND E
CALL NZ,COL-ON
LD A,(HL)
XOR E
LD (HL),A
Переход ко 2-му знакоместу справа Печать линии во 2-м справа знакоместе.
Переход ко 2-му знакоместу слева Печать линии во 2-м слева знакоместе.
Переход к крайнему левому знакоместу. Печать линии в крайней левом знакоместе.
D2B4 08
D2B5 3D
D2B6 2819
D2B8 08
D2B9 DD23
D2BB 24
D2BC 7С
D2BD Е607
D2BF 20В7
D2C1 01CD8C
D2C4 08
D2C5 5F
D2C6 08
D2C7 ЗЕ15
D2C9 93
D2CA 80
D2CB 47
Адрес Маш-код Метка Мнемоника
D2CC CDB122
18А7 С1
D2CF D2D1 D2D2 D1 D2D3 Е1 D2D4
3A29D3
D2D7 С9
EX AF,AF1
DEC А
3R Z.END-P
EX AF.AF'
INC IX
INC Н
LD А,Н
AND #07
JR NZ,BEGIN3
LD BC,#8CCD
AF,AF' E,A AF,AF1 A,#15 E
A,В
B,A
CALL #22B1
BEGIN3 ВС DE POP HL
LD A, (COLLIZ) RET
Взяли счетчик строк спрайта.
Уненьрили его на 1 -Если все строки спрайта
напечатаны, то конец. Запомнили результат. Переход к следующему байту в
шаблоне спрайта Переход к соседней снизу линии на экране. Если это
ненулевая линия в знакоместе, то возврат в начало цикла. Ввод координат
у,х, см. также команду #D26E. Взяли счетчик линий. Расчет по формуле:
В=у+21-Е, где Е -количество ненапечатанных строк спрайта.
Вызов PIXEL-ADD (см. выше).
Возврат к началу. Финишные операции, связанные с балансировкой стека.
(D315),ВС ;Ввели координату в
;команду #0314. А,#15 ;21 строка в спрайте.
Адрес Маш-код Метка Мнемоника
D2DE 08
D2DF DD5E00
D2E2 DD5615
D2E5 DD4E2A
D2E8 23
D2E9 23
D2EA 7Е
D2EB А1
D2EC C421D3
D2EF 7Е
D2F0 А9
D2F1 77
D2F2 2В
D2F3 7Е
D2F4 А2 D2F5 D2F8 D2F9 D2FA D2FB D2FC
C421D3 7Е АА 77 2В 7Е
D2FD A3 D2FE C421D3 7Е АВ 77 08
EX AF,AF'
BEGIN4 LD LD LD INC INC LD AND
CALL NZ,COL-ON LD A,(HL) XOR С
LD (HL),A
DEC HL
LD
AND
CALL
LD
XOR
LD
DEC
LD
AND
CALL
LD
XOR
LD
EX
A,(HL)
D
NZ,COL-ON A, (HL) D
(HL), A HL
A,(HL) E
NZ,COL-ON A,(HL) E
Е,(IX+0) D, (IX+21) С,(IX+42) HL HL
A,(HL.)
С
(HL),A AF, AF'
DEC А
;Временно сохранили. ;Это начало цикла по ;строкам.
;Три байта, образующие ;одну линию в спрайте.
;Расчет адреса ;правого знакоместа. ;Сняли с
экрана. ;Сравнили с тем, что ;есть в спрайте. ;Включили COLLIZ. ;Сняли
линию с экрана. ;Наложили на нее по XOR ;линию из спрайта. ;Поместили
реэ-т на ;экран.
;Соседнее знакоместо ;слева.
С ним все то же самое.
Самое левое знакоместо
С ним все то же самое.
Восстановили счетчик ;линий в спрайте. ;Уменьшили счетчик линий.
Адрес Маш-код Метка Мнемоника
OR Z.END-P ;Если конец, то на выход EX AF, AF 1 ;Запомнили счетчик линий.
INC IX ;Переход к следующему
;байту в шаблоне спрайта INC Н ;Переход к соседней сни-
;эу линии на экране. LD А,Н ;Если это ненулевая ли-
AND #07 ;ния в знакоместе, то
3R NZ,BEGIN4 ;возврат в начало цикла. EX AF,AF' .Взяли счетчик линий.
LD Е,А ;Поместили его в Е.
EX AF,AF' ;Сохранили счетчик линий
LD ВС,#8СВ8 ;Ввод координат у,х, см.
;также команду #D2D8. LD А,#15 ;Расчет по формуле:
SUB Е ;В=у+21-Е, где Е -
ADD А,В количество ненапечатан-
LD В,А ;ных строк спрайта.
CALL #22В1 ; Вызов PIXEL-ADD (см.
;выше).
JR BEGIN4 ;Возврат к началу.
7С
Е607 20СЕ 08 5F 08
01В88С
ЗЕ15 93 80 47
CDB122
D30C D30D D30F D311 D312 D313 D314
D317 D319 D31A D31B D31C
D321 F5 COL-ON PUSH AF
D322 ЗЕ01 LD А,#01
D324 3229D3 LD (COLLIZ),A
D327 F1 POP AF
D328 C9 RET
D329 00 COLLIZ DEFB 00
Включение переменной COLLIZ.
Программная переменная, ;в которой фиксируется ;факт коллизии с препятствием.
D32A
|
00
|
NOP
|
D32B
|
00
|
NOP
|
D32C
|
00
|
NOP
|