|
Маленькие хитрости - программа "ТЕНЕВОЙ КОНТУР".
|
МАЛЕНЬКИЕ ХИТРОСТИ
ПРОГРАММА "ТЕНЕВОЙ КОНТУР"
На страницах "ZX-РЕВЮ" уже не раз приводились примеры того, как можно внести некоторые усовершенствования в программы на Бейсике, применяя для этого фрагменты в машинных кодах. Сегодня, в продолжение этой темы, мы приводим блок кодов, который позволит вносить определенные изменения в изображение, имеющееся на экране. Посмотрите на рисунок. Изображение, которое Вы видите, как бы объемно. Создается впечатление, что оно приподнято над плоскостью экрана. Вам, наверное, приходилось видеть такой прием в программах. Мы предлагаем Вашему вниманию оригинальный способ получения этого эффекта.
Суть метода заключается в том, что теневое оконтуривание выполняется автоматически программой в машинных кодах. Сначала "плоское" изображение выводится на экран обычными способом, будь то Бейсик или процедуры в машинных кодах.
Можно даже заготовить "плоскую" картинку при помощи графического редактора. В общем, представим, что имеется изображение, полученное любым способом. Затем, вызывая приведенную ниже программу в кодах, выполняется теневое оконтуривание этого изображения, причем весь экран может быть обработан за один прием, а можно вызывать кодовую программу несколько раз, выполняя оконтуривание в несколько приемов.
Критерием, определяющим то, что надо оконтуривать, а что не надо, является повышенная яркость (BRIGHT 1). Все, что на экране нарисовано с повышенной яркостью, будет оконтурено при вызове блока в машинных кодах. Как это эффективнее всего использовать в программах придумайте сами. Дело за Вашей фантазией. Мы же предлагаем программу в машинных кодах под названием "Теневой контур". Ее БЕЙСИК-загрузчик приведен в Листинге_1, а машинный код с комментариями - в Листинге_2.
ВВВВВВВВВВ^ ВВВВВВВВВВ
ВВВЛШШ!ВВВ|
ввв ввв ввв ввв!
вввввв! В В В Е
ВВВВВВ В В В Е
ВВВВВВ:;:: ВВВЕ
вввввв! ВВВЕ ■^^BBBl ВВВЙ
ввв ввв| ввв! ввв|
ВВВВВВВВВВ!
вввввввввв!
Листинг_1
10 FOR i = 1 TO 211 20 READ a
30 POKE 63999+i, a 40 NEXT i
50 DATA |
243, |
253, |
229, |
253, |
33 |
60 DATA |
255, |
90, |
6, |
24, |
197 |
70 DATA |
6, |
32, |
197, |
253, |
126 |
80 DATA |
0, |
254, |
64, |
56, |
15 |
90 DATA |
253, |
126, |
1, |
254, |
64 |
100 DATA |
220, |
82, |
250, |
253, |
126 |
110 DATA |
32, |
254, |
64, |
56, |
93 |
120 DATA |
253, |
43, |
193, |
16, |
228 |
130 DATA |
193, |
16, |
222, |
253 |
|
140 DATA |
225, |
251, |
201, |
122, |
230 |
150 DATA |
3, |
7, |
7, |
7, |
246 |
160 DATA |
64, |
103, |
107, |
201, |
36 |
170 DATA |
124, |
230, |
7, |
192, |
124 |
180 |
DATA |
214, |
8, |
103, |
125, |
198 |
190 |
DATA |
32, |
111, |
208, |
124, |
198 |
200 |
DATA |
8, |
103, |
238, |
88, |
192 |
210 |
DATA |
38, |
0, |
201, |
120, |
254 |
220 |
DATA |
32, |
200, |
253, |
229, |
209 |
230 |
DATA |
19, |
205, |
47, |
250, |
221 |
240 |
DATA |
33, |
191, |
250, |
6, |
8 |
250 |
DATA |
62, |
64, |
253, |
190, |
33 |
260 |
DATA |
56, |
9, |
6, |
10, |
253 |
270 |
DATA |
190, |
32, |
48, |
2, |
6 |
280 |
DATA |
12, |
221, |
126, |
0, |
182 |
290 |
DATA |
119, |
221, |
35, |
205, |
58 |
300 |
DATA |
250, |
16, |
244, |
201, |
225 |
310 |
DATA |
241, |
245, |
229, |
254, |
24 |
320 |
DATA |
210, |
35, |
250, |
253, |
229 |
330 |
DATA |
209, |
235, |
1, |
32, |
0 |
340 |
DATA |
9, |
235, |
14, |
2, |
221 |
350 |
DATA |
33, |
203, |
250, |
205, |
47 |
360 |
DATA |
250, |
6, |
4, |
221, |
126 |
370 |
DATA |
0, |
182, |
119, |
221, |
35 |
380 |
DATA |
205, |
58, |
250, |
16, |
244 |
390 |
DATA |
253, |
126, |
33, |
254, |
64 |
400 |
DATA |
210, |
35, |
250, |
241, |
245 |
410 |
DATA |
254, |
32, |
210, |
35, |
250 |
420 |
DATA |
19, |
13, |
32, |
220, |
195 |
430 |
DATA |
35, |
250 |
|
|
|
500 |
DATA |
0, |
0, |
128, |
64, |
160 |
510 |
DATA |
80, |
160, |
80, |
160, |
80 |
520 |
DATA |
160, |
80 |
|
|
|
600 |
DATA |
42, |
21, |
10, |
5, |
128 |
610 |
DATA |
64, |
160, |
80 |
|
|
Для демонстрации действия блока машинных кодов надо набрать Бейсик-программу, приведенную ниже. Программа имеет автостарт со строки 2, где происходит загрузка необходимых кодов. Сам блок "теневой контур" надо оформить в виде файла "ten" CODE 64000,211. Кроме того, программа русифицирована по методике, приведенной в ZX-РЕВЮ-92 N1,2. стр.31. Русско-латинский символьный набор загружается в виде файла "chr" CODE 64600,768.
ЛИСТИНГ_2
Последний байт файла атрибутов. Организация цикла для 22 строк. Организация цикла для 32 колонок. Наличие BRIGHT 1 в текущем знакоместе. Если нет, то переход на PASS.
Крайнее ли это знакоместо с BRIGHT 1. Если да, то выполнение вертикального оконтуривания - VERT. Если под текущим знакоместом не BRIGHT 1, то выполнение горизонтального оконтуривания HORIZ Финишная процедура, если
FA00 FA01 FA03
FA07 FA09 FA0A FA0C FA0D FA10 FA12
FA14 FA17 FA19
F3
FDE5 FD21FF5
0616 C5
C620 C5
FD7E00
FE40
380F
FD7E01
FE40
DC52FA
DI
PUSH LD
LD
PUSH LD
PUSH LD CP JR
LD CP
CALL
IY
IY,#5AFF
B,#16 BC
B,#20 BC
A,(IY+0) #40
C,#FA23
A,(IY+1) #40
C,#FA52
FA25 |
C1 |
|
POP |
BC |
знакоместо не с BRIGHT 1 |
FA26 |
10E4 |
|
DJNZ |
#FA0C |
|
FA28 |
C1 |
|
POP |
BC |
|
FA29 |
10DE |
|
DJNZ |
#FA09 |
|
FA2B |
FDE1 |
|
POP |
IY |
|
FA2D |
FB |
|
EI |
|
|
FA2E |
C9 |
|
RET |
|
|
FA2F |
7A |
ADRES |
LD |
A,D |
Эта подпрограмма выполня- |
FA30 |
E603 |
|
AND |
#03 |
ет расчет адреса в дисп- |
FA32 |
07 |
|
RLCA |
|
лейном файле по известно- |
FA33 |
07 |
|
RLCA |
|
му адресу в файле атрибу- |
FA34 |
07 |
|
RLCA |
|
тов. |
FA35 |
F640 |
|
OR |
#40 |
|
FA37 |
67 |
|
LD |
H,A |
|
FA38 |
68 |
|
LD |
L,E |
|
FA39 |
C9 |
|
RET |
|
|
FA3A |
24 |
OVER |
INC |
H |
Эта подпрограмма выполня- |
FA3B |
7C |
|
LD |
A,H |
ет операции, связанные с |
FA3C |
E607 |
|
AND |
#07 |
наложением оконтуривающе- |
FA3E |
C0 |
|
RET |
NZ |
го изображения на тот ри- |
FA3F |
7C |
|
LD |
A,H |
сунок, который имеется на |
FA40 |
D608 |
|
SUB |
#08 |
экране. |
FA42 |
67 |
|
LD |
H,A |
|
FA43 |
7D |
|
LD |
A,L |
|
FA44 |
C620 |
|
ADD |
A,#20 |
|
FA46 |
6F |
|
LD |
L,A |
|
FA47 |
D0 |
|
RET |
NC |
|
FA48 |
7C |
|
LD |
A,H |
|
FA49 |
0606 |
|
ADD |
A,#08 |
|
FA4B |
67 |
|
LD |
H,A |
|
FA4C |
EE58 |
|
XOR |
#58 |
|
FA4E |
C0 |
|
RET |
NZ |
|
FA4F |
2600 |
|
LD |
H,#00 |
|
FA51 |
C9 |
|
RET |
|
|
FA52 |
78 |
VERT |
LD |
A,B |
Не последняя ли это коло |
FA53 |
FE20 |
|
CP |
#20 |
нка, если да, то возврат, |
FA55 |
C8 |
|
RET |
Z |
т.к. негде оконтуривать. |
FA56 |
FBE5 |
|
PUSH |
IY |
|
FA58 |
D1 |
|
POP |
DE |
|
FA59 |
13 |
|
INC |
DE |
|
FA5A |
CD2FFA |
|
CALL |
#FA2F |
|
FA5D |
DD21BFFA |
|
LD |
IX,#FABF |
Базовый адрес таблицы |
|
|
|
|
|
для построения оконтури- |
|
|
|
|
|
вающего рисунка. |
FA61 |
0608 |
|
LD |
B,#08 |
|
FA63 |
3E40 |
|
LD |
A,#40 |
|
FA65 |
FDBE21 |
|
CP |
(IY+33) |
Если знакоместо не угло- |
FA68 |
3809 |
|
JR |
C,#FA73 |
вое, то переход на LOOP_2 |
FA6A |
060A |
|
LD |
A,#0A |
если угловое, то оконту- |
FA6C |
FDBE20 |
|
CP |
(IY+32) |
ривание снизу. |
FA6F |
3002 |
|
JR |
NC,#FA73 |
|
FA71 |
060C |
|
LD |
B,#0C |
|
FA73 |
DD7E00 |
LOOP_2 |
LD |
A, (IX+0) |
Проверка необходимости |
FA76 |
B6 |
|
OR |
(HL) |
выполнения наложения |
FA77 |
77 |
|
LD |
(HL),A |
на имеющееся на экране |
FA78 |
DD23 |
|
INC |
IX |
изображение. |
FA7A |
CD3AFA |
|
CALL |
#FA3A |
Выполнение наложения. |
FA7D |
10F4 |
|
DJNZ |
#FA73 |
|
FA7F |
C9 |
|
RET |
|
|
FA80 |
E1 |
HORIZ |
POP |
HL |
|
FA81 |
F1 |
|
POP |
AF |
|
FA82 |
F5 |
|
PUSH |
AF |
|
FA83 |
E5 |
|
PUSH |
HL |
|
FA84 |
FE18 |
|
CP |
#18 |
Не последняя ли строка. |
FA86 |
D223FA |
|
JP |
NC,#FA23 |
Если да, то негде окон- |
|
|
|
|
|
туривать и переход на |
|
|
|
|
|
PASS. |
FA89 |
FDE5 |
|
PUSH |
IY |
|
FA8B |
D1 |
|
POP |
DE |
|
FA8C |
EB |
|
EX |
DE,HL |
|
FA8D |
012000 |
|
LD |
BC,#0020 |
|
FA90 |
09 |
|
ADD |
HL,BC |
|
FA91 |
EB |
|
EX |
DE,HL |
|
FA92 |
0E02 |
|
LD |
C,#02 |
|
FA94 |
DD21CBFA |
|
LD |
IX,#FACB |
Базовый адрес в таблице |
|
|
|
|
|
определяющей оконтурива |
|
|
|
|
|
ющий рисунок. |
FA98 |
CD2FFA |
|
CALL |
#FA2F |
|
FA9B |
0604 |
|
LD |
B,#04 |
|
FA9D |
DD7E00 |
|
LD |
A,(IX+0) |
Проверка необходимости |
FAA0 |
B6 |
|
OR |
(HL) |
выполнения наложения |
FAA1 |
77 |
|
LD |
(HL),A |
на имеющееся на экране |
FAA2 |
DD23 |
|
INC |
IX |
Изображение. |
FAA4 |
CD3AFA |
|
CALL |
#FA3A |
Выполнение наложения. |
FAA7 |
10F4 |
|
DJNZ |
#FA9D |
|
FAA9 |
FD7E21 |
|
LD |
A,(IY+33) |
|
FAAC |
FE40 |
|
CP |
#40 |
|
FAAE |
D223FA |
|
JP |
NC,#FA23 |
|
FAB1 |
F1 |
|
POP |
AF |
|
FAB2 |
F5 |
|
PUSH |
AF |
|
FAB3 |
FE20 |
|
CP |
#20 |
|
FAB5 |
D223FA |
|
JP |
NC,#FA23 |
|
FAB8 |
13 |
|
INC |
DE |
|
FAB9 |
0D |
|
DEC |
C |
|
FABA |
20DC |
|
JR |
NZ,#FA98 |
|
FABC |
C323FA |
|
JP |
#FA23 |
|
FABF |
000080 |
PICTURE |
DEFB |
#00,#00,#80 |
Базовая таблица, по ко- |
FAC2 |
40A050 |
|
DEFB |
#40,#A0,#50 |
торой строится оконтури |
FAC5 |
A050AO |
|
DEFB |
#A0,#50,#A0 |
вающий рисунок. |
FAC8 |
50A050 |
|
DEFB |
#50,#A0,#50 |
|
FACB |
2A150A |
|
DEFB |
#2A,#15,#0A |
|
FACE |
058040 |
|
DEFB |
#05,#80,#40 |
|
FAD1 |
A050 |
|
DEFB |
#A0,#50 |
|
1 GO |
TO 100 |
|
|
|
|
2 CLEAR 63999: |
LOAD "ten" |
CODE 64000 |
|
3 LOAD "chr" CODE 64600
4 POKE 23606,88: POKE 23607,251: REM RUS 100 BORDER 1: PAPER 1: INK 7: BRIGHT 0: CLS 200 BRIGHT 1
300 LET A$="B"
1000 FOR Y=8 TO 12: FOR N=0 TO 15: PRINT AT Y, 1+N;A$;: NEXT N: NEXT Y
1010 FOR Y=3 TO 17: FOR N=0 TO 9: PRINT AT Y, 4+N;A$: NEXT N: NEXT Y
1020 FOR Y=5 TO 15: PRINT BRIGHT 0;AT Y,7;" ":NEXT Y
1030 PRINT BRIGHT 0;AT 10,3;" "
2000 FOR N=5 TO 15: PRINT AT N, 18;" ": NEXT N
2010 PRINT AT 8, 20; "ПРОГРАММА"
2020 PRINT AT 9, 20; "ДЕМОНСТРИ-"
2030 PRINT AT 10, 22; "РУЮЩАЯ"
2040 PRINT AT 12, 20; ......ТЕНЕВОЙ"
2050 PRINT AT 13, 23; "КОНТУР......
2100 PAUSE 50: PLOT 145,48: DRAW 0,86: DRAW 102,0 3000 PAUSE 50: RANDOMIZE USR 64000 4000 BRIGHT 0
После старта программы со строки 2, загрузки кодовых блоков и включения русского символьного набора, происходит формирование изображения на экране, которое в дальнейшем будет оконтурено. Для этого перед подачей команд PRINT происходит включение режима повышенной яркости BRIGHT 1 (строка 200). Обратите взимание, что отверстие в левой фигуре, состоящей из букв "В", прорисовывается в режиме BRIGHT 0. В правой части экрана получен прямоугольник, подлежащий оконтуриванию. Это выполняется печатью нескольких строк пробелов в режиме BRIGHT 1 (строка 2000), а текст впечатывается уже потом. Для завершенности фигуры этот прямоугольник слева и сверху замкнут прорисовкой прямых линий (строка 2100), так как оконтуривание производится только справа и снизу.
Если оконтуривание должно быть выполнено поверх символов, напечатанных на экране и имеющих BRIGHT 0, то происходит наложение оконтуривающего фона на имеющееся изображение, это можно наблюдать, если добавить в программу строку:
150 FOR N=1 TO 32*22: PRINT "+"; : NЕХТ N
Итак, дело за Вашей фантазией, уважаемые читатели!
|
|