ПОЛЕЗНЫ1Е СОВЕТЫ © Вадим Пыльцов, г. Надым, 1994.
Все листинги кодовых блоков, приведенные ниже, были набраны в ассемблере ZEUS и расположены с адреса 40000 только для примера - Вы можете задавать им любые удобные Вам адреса.
Поворот символа.
В книге "40 лучших процедур" была процедура поворота символа на 90°. Как мне кажется, она чересчур сложна. Предлагаю другой вариант процедуры поворота символа на 90° по часовой стрелке:
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
SUB |
A |
00040 |
|
LD |
DE,18177 |
00050 |
|
LD |
C,9 |
00060 |
LOOP |
LD |
HL,16384 |
00070 |
|
LD |
B, 9 |
00080 |
LOOP2 |
RR |
(HL) |
00090 |
|
RRA |
|
00100 |
|
INC |
H |
00110 |
|
DJNZ |
LOOP2 |
00120 |
|
LD |
(DE),A |
00130 |
|
DEC |
D |
00140 |
|
DEC |
C |
00150 |
|
JR |
NZ,LOOP |
00160 |
|
RET |
|
В строке 60 задается адрес верхней пиксельной линии того знакоместа, символ в котором должен быть повернут (в данном случае это позиция AT 0,0;). В строке 40 задан адрес нижней пиксельной линии того знакоместа, где будет нарисован повернутый на 90° символ (в данном случае это знакоместо в позиции AT 0,1;). Демонстрирует работу процедуры простейшая Бейсик-программа:
1 GO ТО 10
2 CLEAR 39999: RANDOMIZE USR15619: REM : LOAD "rotate" CODE 40000 10 PRINT AT 0,0;"A": RANDOMIZE USR 40000
Гашение экрана.
Довольно эффектная очистка экрана применяется в программах FREDDY HARDEST 2, SANXION и др. Начинают гаснуть случайным образом отдельные точки, пока не погаснет весь экран (весь процесс занимает пару секунд). Выполняется такое гашение следующей процедурой :
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
0C030 |
C1 |
CALL |
C4 |
00040 |
|
LD |
DE,0 |
00050 |
|
LD |
B, #14 |
00060 |
C2 |
PUSH |
BC |
00070 |
|
LD |
HL,#4000 |
00080 |
C3 |
LD |
A,(DE) |
00090 |
|
AND |
(HL) |
00100 |
|
LD |
(HL),A |
00110 |
|
INC |
DE |
00120 |
|
INC |
HL |
00130 |
|
LD |
A, H |
00140 |
|
CP |
#58 |
00150 |
|
JR |
NZ,C3 |
00160 |
|
EX |
DE, HL |
00170 |
|
LD |
BC,#1770 |
00180 |
|
AND |
A |
00190 |
|
SBC |
HL, BC |
00200 |
|
EX |
DE, HL |
00210 |
|
POP |
BC |
00220 |
|
DJNZ |
C2 |
00230 |
|
LD |
C,7 |
00240 |
|
CALL |
C6 |
00250 |
|
RET |
|
00260 |
C4 |
LD |
HL,#5800 |
00270 |
C5 |
LD |
(HL),6 |
00280 |
|
INC |
HL |
00290 |
|
LD |
A, H |
00300 |
|
CP |
#5B |
00310 |
|
JR |
NZ, C5 |
00320 |
|
RET |
|
00330 |
C6 |
LD |
HL,#5800 |
00340 |
C7 |
LD |
(HL),C |
00350 |
|
INC |
HL |
00360 |
|
LD |
A, H |
00370 |
|
CP |
#5B |
00380 |
|
JR |
NZ, C7 |
00390 |
|
RET |
|
Контурный шрифт.
Предлагаю процедуру формирования "контурного" шрифта. Такого шрифта ещё не было на страницах ZX-РЕВЮ. Идея такая: шаблон букв! или другого символа смещаем влево-вверх, затем вправо-вверх, влево-вниз и вправо-вниз, все это складываем командой OR, и, наконец, вырезаем командой XOR шаблон исходного символа.
Эту процедуру я сделал для своих загрузчиков. Смотрится довольно эффектно (я пишу названия программ этим шрифтом, вставляя по пробелу между соседними буквами для удобочитаемости).
Вот процедура, выполняющая преобразование символьного набора, расположенного сразу же следом за этой
процедурой: |
|
|
00010 BUFF |
EQU |
END+1 |
00020 |
ORG |
40000 |
00030 |
ENT |
|
00040 |
CALL |
UST |
00050 |
LDIR |
|
00060 |
CALL |
UST |
00070 |
INC |
HL |
00080 |
LD |
A,39 |
00090 |
LD |
(NOK),A |
00100 |
CALL |
LOOP |
00110 |
LD |
A,63 |
00120 |
LD |
(NOK),A |
00130 |
CALL |
LOOP |
00140 |
INC |
DE |
00150 |
|
CALL |
LOOP |
00160 |
|
LD |
A,39 |
00170 |
|
LD |
(NOK),A |
00180 |
|
CALL |
LOOP |
00190 |
WYREZ |
LD |
A,(DE) |
00200 |
|
XOR |
(HL) |
00210 |
|
LD |
(DE),A |
00220 |
|
INC |
HL |
00230 |
|
INC |
DE |
00240 |
|
DEC |
BC |
00250 |
|
LD |
A, B |
00260 |
|
OR |
C |
00270 |
|
JR |
NZ,WYREZ |
00280 |
|
LD |
HL,BUFF |
00290 |
|
DEC |
H |
00300 |
|
LD |
(23606),HL |
00310 |
|
RET |
|
00320 |
LOOP |
PUSH |
BC |
00330 |
|
LD |
B, 8 |
00340 |
LOOP2 |
LD |
A, (HL) |
00350 |
|
DB |
203 |
00360 |
NOK |
DB |
0 |
00370 |
|
EX |
DE, HL |
00380 |
|
OR |
(HL) |
00390 |
|
EX |
DE, HL |
00400 |
|
LD |
(DE),A |
00410 |
|
INC |
HL |
00420 |
|
INC |
DE |
00430 |
|
DJNZ |
LOOP2 |
00440 |
|
POP |
BC |
00450 |
|
DEC |
BC |
00460 |
|
DEC |
BC |
00470 |
|
DEC |
BC |
00480 |
|
DEC |
BC |
00490 |
|
DEC |
BC |
00500 |
|
DEC |
BC |
00510 |
|
DEC |
BC |
00520 |
|
DEC |
BC |
00530 |
|
LD |
A, B |
00540 |
|
OR |
C |
00550 |
|
JR |
NZ,LOOP |
00560 |
UST |
LD |
HL,15616 |
00570 |
|
LD |
DE,BUFF |
00580 |
|
LD |
BC,7 68 |
00590 |
END |
RET |
|
Если Вас не устраивает место расположения символьного набора, измените в строке 10 значение адреса его расположения BUFF.
В предложенной процедуре реализован не совсем тот алгоритм, который предложен автором вначале -сдвиг происходит влево, влево-вверх, вправо и вправо-вниз. Но результат, пожалуй, даже интереснее. Для того чтобы в точности воспроизвести предложенный выше алгоритм, можно дополнить программу следующими строками:
00105 INC HL
00155 INC DE
Шрифт, полученныш с такими изменениями, немного по-другому смотрится на экране.
Увеличение символа.
Программа, подобная этой, уже была напечатана в книге "Прикладная графика". Основное отличие моей процедуры от предложенной в книге, заключается в следующем: у меня шаблон печатается без атрибутов, но в любой точке экране (по X и по Y), с различным увеличением (в 2.20 и более раз). Я Если часть изображения выходит за экран, то она просто не рисуется.
00010 ORG 4 0000
00020 CHAS EQU 8
00030 SHIR EQU 1
00040 SPRITE EQU 15880
00050 Y0 EQU 150
00060 |
X0 |
EQU |
20 |
00070 |
DY |
EQU |
5 |
00080 |
DX |
EQU |
3 |
00090 |
|
ENT |
|
00100 |
|
LD |
HL,SPRITE |
00110 |
|
LD |
IX,STORE |
00120 |
|
LD |
A, (IX) |
00130 |
|
LD |
(IX+5) , A |
00140 |
|
SUB |
A |
00150 |
SNAP |
LD |
B, (IX+2) |
00160 |
LOOP |
PUSH |
HL |
00170 |
|
LD |
E,SHIR |
00180 |
|
LD |
C, (IX+1) |
00190 |
|
LD |
(IX+4) , C |
00200 |
KURI |
BIT |
7,(HL) |
00210 |
|
CALL |
INBIT |
00220 |
|
BIT |
6,(HL) |
00230 |
|
CALL |
INBIT |
00240 |
|
BIT |
5, (HL) |
00250 |
|
CALL |
INBIT |
00260 |
|
BIT |
4,(HL) |
00270 |
|
CALL |
INBIT |
00280 |
|
BIT |
3, (HL) |
00290 |
|
CALL |
INBIT |
00300 |
|
BIT |
2,(HL) |
00310 |
|
CALL |
INBIT |
00320 |
|
BIT |
1, (HL) |
00330 |
|
CALL |
INBIT |
00340 |
|
BIT |
0, (HL) |
00350 |
|
CALL |
INBIT |
00360 |
|
DEC |
E |
00370 |
|
JR |
Z,LOOK |
00380 |
|
INC |
HL |
00390 |
|
JR |
KURI |
00400 |
LOOK |
POP |
HL |
00410 |
|
DEC |
(IX) |
00420 |
|
RET |
Z |
00430 |
|
DJNZ |
LOOP |
00440 |
|
INC |
A |
00450 |
|
CP |
CHAS |
00460 |
|
RET |
Z |
00470 |
|
LD |
B,SHIR |
00480 |
ROUT |
INC |
HL |
00490 |
|
DJNZ |
ROUT |
00500 |
|
jr |
SNAP |
00510 |
INBIT |
JR |
Z,LOOP5 |
00520 |
|
CALL |
UST |
00530 |
|
RET |
|
00540 |
LOOP5 |
CALL |
REUST |
00550 |
|
RET |
|
00560 |
REUST |
PUSH |
BC |
00570 |
|
LD |
B,(IX+3) |
00580 |
LOM |
INC |
(IX+4) |
00590 |
|
JR |
Z,LOOP2 |
00600 |
|
DJNZ |
LOM |
00610 |
|
POP |
BC |
00620 |
|
RET |
|
00630 |
UST |
PUSH |
BC |
00640 |
|
LD |
b,(ix+3) |
00650 |
KOP |
PUSH |
BC |
00660 |
|
LD |
B, (IX) |
00670 |
|
LD |
C, (IX+4) |
00680 |
|
PUSH |
HL |
00690 |
|
PUSH |
AF |
00700 |
|
PUSH |
DE |
00710 |
|
CALL |
8933 |
00720 |
|
POP |
DE |
00730 |
|
POP |
AF |
00740 |
|
POP |
HL |
00750 |
|
POP |
BC |
00760 |
|
INC |
(IX+4) |
00770 |
|
JR |
Z,LOOP2 |
00780 |
|
DJNZ |
KOP |
00790 |
LOOP2 |
POP |
BC |
00800 |
|
RET |
|
00810 |
STORE |
DEFB |
Y0 |
00820 |
|
DEFB |
X0 |
00830 |
|
DEFB |
DY |
00840 |
|
DEFB |
DX |
00850 |
|
DEFB |
0 |
00860 |
|
DEFB |
0 |
В строке 20 задается высота исходного шаблона (в пикселях), в строке 30 - ширина (в байтах), в строке 40 -адрес размещения этого спрайта (в данном примере задана буква "А" из символьного набора ПЗУ). в строках 50 и 60 задаются координаты левого верхнего угла будущего изображения (в пикселях). В строках 70 и 80 - коэффициенты увеличения по вертикали и горизонтали. При работе программы используются рабочие ячейки, хранящие копии Y0 и Х0 -строки 850, 860.
Изображение строится по точкам процедурой PLOT из ПЗУ. Если взять процедуру PLOT из книги "Элементарная графика", и в строке 710 сделать ссылку на нее, то скорость построения шаблона увеличится примерно
в 1,8 раза. Процедура довольно быстро строит букву размером во весь экран.
* * *