==============================>
^|||||| ПРОГРАММИРОВАНИЕ ||||||`
&\\\\\\\\\\\\\\\@
________________________________
Лимонов Константин (Smoke/CLV).
________________________________
Привет всем поклонникам ассем-
блера! В этом номере журнала,я
(Smoke) хочу предложить Вашему
вниманию процедуру небольшого,но
весьма выразительного эффекта -
"ЛЕТАЮЩИЙ СПРАЙТ"!
________________________________
Такой эффект Вы,наверняка,видели
в куче всяких INTRO и MUSICDEMO.
На ассемблере эти процедуры выг-
лядят по-разному,но принцип дей-
ствия у них почти один и тот же.
Я представляю свой вариант.Коне-
чно,он далеко не самый лучший и
эффективный,но зато самый прос-
той,и понятный каждому начинаю-
щиму кодеру.Все строки программы
пронумерованы и Вы сможете пос-
мотреть подробный комментарий к
каждой из них после текста самой
программы.Итак приступим...
________________________________
FLY LD DE,#0000 00
CALL CL_SP 01
PTX LD HL,POX 02
LD A,(HL) 03
CP #FF 04
JR NZ,LIP1 05
LD HL,POX 06
LD (PTX+#01),HL 07
JR PTX 08
LIP1 LD D,A 09
PTY LD HL,POY 10
LD A,(HL) 11
CP #FF 12
JR NZ,LIP2 13
LD HL,POY 14
LD (PTY+#01),HL 15
JR PTY 16
LIP2 LD E,A 17
CALL PLOT 18
LD (FLY+#01),HL 19
PUSH HL 20
LD DE,SPSIZE 21
LD HL,SPRT-SSIZE 22
LIP3 ADD HL,DE 23
DJNZ LIP3 24
POP DE 25
CALL GET_SP 26
LD HL,(PTX+#01) 27
INC HL 28
LD (PTX+#01),HL 29
LD HL,(PTY+#01) 30
INC HL 31
LD (PTY+#01),HL 32
RET 33
PLOT LD A,#AF 34
SUB E 35
AND A 36
RRA 37
SCF 38
RRA 39
AND A 40
RRA 41
XOR E 42
AND #F8 43
XOR E 44
LD H,A 45
LD A,D 46
RLCA 47
RLCA 48
RLCA 49
XOR E 50
AND #C7 51
XOR E 52
RLCA 53
RLCA 54
LD L,A 55
LD A,D 56
AND #07 57
LD B,A 58
INC B 59
RET 60
GET_SP LD B,VIS*#08 61
LIP4 PUSH DE,BC 62
LD B,DLINA 63
LIP4_X PUSH BC 64
LDI 65
POP BC 66
DJNZ LIP4_X 67
POP BC,DE 68
CALL DE_LINE 69
DJNZ LIP4 70
RET 71
CL_SP LD BC,VIS*#800 72
LIP5 PUSH BC,DE 73
XOR A 74
LD B,DLINA 75
LIP6 LD (DE),A 76
INC DE 77
DJNZ LIP6 78
POP DE,BC 79
CALL DE_LINE 80
DJNZ LIP5 81
RET 82
;-------------------------------
DE_LINE INC D 83
LD A,D 84
AND #07 85
RET Z 86
LD A,E 87
ADD A,#20 88
LD E,A 89
RET C 90
LD A,D 91
SUB #08 92
LD D,A 93
RET 94
;-------------------------------
SPRT INCBIN SPRITES 95
POX INCBIN COORD-X 96
POY INCBIN COORD-Y 97
;-------------------------------
Теперь рассмотрим эту процедуру
более подробно.Итак,начнем с 0-й
строки.В этой строке в регистро-
вую пару DE загружается адрес в
экранной области,где в данный
момент находится спрайт.Затем,в
строке 01 вызывается процедура
стирания спрайта.При этом,изоб-
ражение находящееся под спрайтом
теряется.Поэтому лучше будет,ес-
ли Вы не будете распологать на
месте,где будет "летать" спрайт,
какую-то графическую информацию.
В строке 02,в регистровую пару
HL засылается адрес расположения
таблицы координат по оси 'X'.
(О том,как готовить таблицы ко-
ординат,Вы прочтете ниже).
В аккумулятор загружается коор-
дината из таблицы и производится
проверка на конец таблицы (Кодом
конца таблицы является число
#FF (255 DEC)).Если это конец
таблицы,то строка 02 модернизи-
руется таким образом,что в ре-
гистровой паре HL устанавливает-
ся начало таблицы координат.
Если же это одна из координат,то
происходит переход на строку 09.
Полученная X-координата здесь
переносится в регистр D.Потом
происходит аналогичная загрузка
и проверка координаты Y.При пе-
реходе к строке 17,мы имеем в
регистре D координату X,а в ре-
гистре E координату Y.Далее,в 18
строке производится вызов проце-
дуры PLOT.Она занимает строки с
34-й по 60-ю.Процедура PLOT за-
нимается расчетом адреса в эк-
ранной области при координатах,
заданных в пикселах.В регистро-
вой паре HL она возвращает адрес
в экранной области,а в регистре
B номер спрайта,который должен в
этот момент печататься на экране
монитора.Внимание! Программа ис-
пользует 8 спрайтов одинаковой
ширины и высоты,но каждый из
спрайтов сдвинут относительно
предыдущего на один пиксел впра-
во.Это необходимо для плавного
перемещения спрайта влево и
вправо.Почему спрайтов восемь???
Да,потому что один байт состоит
из восьми битов! Подготовить
такой набор спрайтов можно,в
принципе,в ART-STUDIO,но лучше
использовать для этого,например,
программу группы Digital Reality
- "SpriteLand v1.xx".Но учтите,
что при здвиге спрайта,его шири-
на увеличится на один символ (!)
Помните об этом! При работе про-
граммы также надо знать длину
одного спрайта в байтах.
После вычисления адреса коорди-
нат,он заносится в строку 00,где
он необходим для стирания спрай-
та.После этого этот же адрес от-
правляется на стек,а в строках с
21-й по 24-ю происходит поиск
нужного спрайта из таблицы и по-
том,восстановив адрес печати,в
строке 26,производится вызов
процедуры печати спрайта.
Процедура печати спрайта на эк-
ране занимает строки с 61-й по
71-ю.Она проста до предела.В
строке 61 в регистр B загружает-
ся высота Вашего спрайта в зна-
коместах умноженная на восемь.
Ведь в одном знакоместе 8-мь ли-
ний,не так ли? В следующей стро-
ке сохраняем регистры DE и BC,а
потом организуется еще один цикл
для печати каждой строки спрай-
та.В принципе,Вы можете раскрыть
этот цикл стерев строки с 63-й
по 67-ю,а вместо этого наберите
в этом месте столько команд LDI,
сколько знакомест в ширину зани-
мает Ваш спрайт.Далее,в строке
68-й,восстанавливаются регистры
BC и DE,а потом идет вызов про-
цедуры расчета адреса печати
следующей линии спрайта,находя-
щейся под предыдущей.Эта проце-
дура настолько известна и прос-
та,что описывать принцип ее ра-
боты просто бессмысленно.Лучше
читайте книги "Инфорком'А":
"Элементарная графика","Приклад-
ная графика" и "Динамическая
графика".Ну и,конечно,ZX-РЕВЮ!
Со строки 72-й по 82-ю идет про-
цедура стирания спрайта.Она ра-
ботает по тому же принципу,что и
процедура печати спрайта.Ну,во-
общем,разберетесь! А то я сейчас
помру за клав'ой от такого умс-
твенного напряжения.
____________
Ну пора рассказать Вам как сде-
лать таблицы координат по кото-
рым будет "летать" Ваш спрайт.
В приложении журнала Вы найдете
небольшую программу на Бейсике,
которая поможет Вам на первых
порах.Потом,на ее основе,Вы мо-
жете создать что-то свое.Она на-
зывается - LISSADGU,и строит,так
называемые,фигуры Лиссажу.Чтобы
понимать о чем идет речь,необхо-
димо хотя бы немного знать элек-
тротехнику.Так вот,объекты,кото-
рые появятся в результате работы
программы на экране,и есть те
самые фигуры Лиссажу.Программа
имеет некоторые переменные:
________________________________
'K' - кратность.
'G' - фазовый сдвиг.
'A1' и 'A2' - амплитуды.
________________________________
Попробуйте ввести,например,такие
параметры:K[5,G[0,A1[110,A2[70,
или такие:K[2,G[1,A1[90,A2[75; и
сразу все будет понятно! Только
запомните одно условие - спрайт
будет печататься начиная от вер-
хнего левого угла,и именно в тех
точках,которые будут изображены
на экране! Так что следите за
тем,чтобы Ваш спрайт не вылез за
край экрана (на бордюр! Шутка!)!
Делайте соответственный отступ
на столько пикселов,сколько име-
ет в ширину Ваш спрайт! Ну а по-
сле того,как программка предло-
жит Вам сохранить созданные таб-
лицы на диск,Вы можете спокойно
подставлять их имена в ассембле-
рный текст,в строки 96 и 97.А в
строку 95 подставьте имя создан-
ной Вами таблицы спрайтов.И на
этом,пожалуй,можно было бы за-
кончить.Good luck,young coders!
________________
CUL8R! Written by Smoke
18/11/97-00:07
________________
P.S. Имя ассемблерного файла на
диске:(SPRFLY).