Динамическая графика 1994 г.

Анимаци в растровой графике - Перемещение спрайтов.


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С

1Е08

19

46

19

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)

LD

ADD

LD

ADD

LD

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

LD (DIREC),A

D10C 329ED1

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

BEGIN CALL SPRDRV-P

CP #00

D131 FEOO

2813

3AA1D1

FEOO

D133 D135 D138

3R LD CP

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 С .

Адрес Наш.код Метка Мнемоника

D13A 280С

D13C 3AA0D1

D13F С601

D141 Е601

D143 32A0D1

D146 1847

Комментарий

;Если нет детекции коллизии, то обход.

Переключение переключателя 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 его ;портит.

D1C4 Е5

SPRDRV-S PUSH HL

D1C5 D5 D1C6 С5 D1C7

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 пропс

CALL #22В1

;ходит не по обычной точке входа #22АА, а через точку #22В1. Адрес Маш .код метка Мнемоника_Комментарий.

JR Z,FIT-S

D1CF 2852

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

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

D209 D20A

7С Е607

D20C 20CD D20E 01СА8С

D211 D212 D213 D214 D216 D217

08 5F 08

ЗЕ15 93 80

LD

EX

LD

SUB

ADD

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

7Е А9 77 2В

7Е АА 77 2В

LD

X0R

LD

DEC

LD XOR LD DEC

LD

XOR

LD

EX

DEC 3R

D1FE 7Е D1FF АВ D200 D201

77

08

D202 3D D203 2819

D205 08

D206 DD23

D208 24

Стираиие линии во

2-м справа знакоместе. Переход ко 2-му знакоместу слева. Стирание линии во 2-м слева знакоместе. Переход к крайнему левому знакоместу. Стирание линии в крайнем левом знакоместе. Восстановили счетчик линий.

Уменьшили его. Если весь спрайт стерт, то выход. Запомнили счетчик линий.

Переход к очередному байту в шаблоне спрайта.

Переход к соседней снизу линии на экране. Если очередной экранный ряд не закончен, возврат к началу цикла. Взяли счетчик линий.

Расчет по формуле: В=у+21-Е, где Е количество ненапечатанных строк спрайта.

Адрес Маш.код метка Мнемоника

Комментарий

D218 47 D219 CDB122

18BD F1 С1 D1

Е1 С9

END-S

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

А9

D22A D22D D230 D233 D234 D235 D236

LD INC

D237 77

D238 2В

D239 D23A D23B D23C

D23D D23E

7Е АА 77 2В

7Е АВ

;Расчет адреса ;правого знакоместа. ;Сняли с экрана. ;Наложили спрайт по :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

D241 D242

LD (HL),A

EX AF,AF1

DEC A

3R Z,END-S

EX AF,AF1

INC IX

LD

AND

JR

EX

LD

EX

LD

INC H

A,H

#07

NZ.BEGIN2 AF , AF 1 E,A AF, AF' BC,#8CB8

LD SUB ADD LD

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

D25D Е5

D25E

D25F D26U D261

D5 С5 Е5

DDE1

;Точка входа для печати. Сохранение всех основных регистровых пар на машинном стеке. ;Переброска адреса из ;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

7Е А8 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

END-P

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

EX

LD

EX

LD

SUB

ADD

LD

AF,AF' E,A AF,AF1 A,#15 E

A,В

B,A

JR

POP

POP

CALL #22B1

BEGIN3 ВС DE POP HL

LD A, (COLLIZ) RET

Взяли счетчик строк спрайта.

Уненьрили его на 1 -Если все строки спрайта напечатаны, то конец. Запомнили результат. Переход к следующему байту в шаблоне спрайта Переход к соседней снизу линии на экране. Если это ненулевая линия в знакоместе, то возврат в начало цикла. Ввод координат у,х, см. также команду #D26E. Взяли счетчик линий. Расчет по формуле: В=у+21-Е, где Е -количество ненапечатанных строк спрайта.

Вызов PIXEL-ADD (см. выше).

Возврат к началу. Финишные операции, связанные с балансировкой стека.

Комментарий.

(D315),ВС ;Ввели координату в

;команду #0314. А,#15 ;21 строка в спрайте.

D2D8 ED4315D3 FIT-P LD

D2DC ЗЕ15

LD

Адрес Маш-код Метка Мнемоника

Комментарий -

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

D301 D302 D303 D304

D305 3D

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 ;Возврат к началу.

28С9 08

DD23

D306 D308 D309

D30B 24

Е607 20СЕ 08 5F 08

01В88С

ЗЕ15 93 80 47

CDB122

D30C D30D D30F D311 D312 D313 D314

D317 D319 D31A D31B D31C

D31F 18ВЕ

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




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Энциклопедия - обзор языков программирования.
CREDITS - Кто трудился над номером...
C-DOS модем - Описание сигналов C-DOS модема и процедру тестирующая на- личие модема.
Ответ на письмо №4.
От автора - о правильном произношении названия газеты.

В этот день...   21 ноября