|
Этюды - предлагаю вам программы, написанные лично мной.
|
ЭТЮДЫ
© Вадим Бодров, г. Уфа, 1995.
Предлагаю Вам программы, написанные лично мной.
1). Программа BLINK создает на экране симпатичные помехи. Такой эффект я увидел на "писишке" ещё несколько лет назад.
EFFECTS
Bodrov (C) 1995
1 ; BLINC
2 ;Vadim
3 ;
4 |
ORG |
50000 |
5 |
ENT |
$ |
6 |
LD |
B, HMP |
7 LOOP |
CALL |
RND |
8 |
LD |
(B FAD) ,HL |
9 |
CALL |
BLINK |
10 |
LD |
A, B |
11 |
SLA |
A |
12 |
DEC |
A |
13 |
DEC |
A |
14 |
LD |
D, 0 |
15 |
LD |
E, A |
16 |
LD |
HL,BUFF |
17 |
ADC |
HL, DE |
18 |
LD |
DE,BFAD |
19 |
EX |
DE, HL |
20 |
CALL |
CHANG |
21 |
DJNZ |
LOOP |
22 |
LD |
B, HMP |
23 LOOP2 |
LD |
A,B |
24 |
SLA |
A |
25 |
DEC |
A |
26 |
DEC |
A |
27 |
LD |
D, 0 |
28 |
LD |
E, A |
29 |
LD |
HL,BUFF |
30 |
ADC |
HL, DE |
31 |
LD |
DE,BFAD |
32 |
CALL |
CHANG |
33 |
CALL |
BLINK |
34 |
DJNZ |
LOOP2 |
35 |
RET |
|
36 BLINK |
LD |
HL,(BFAD) |
37 |
LD |
A, #FF |
38 |
XOR |
(HL) |
39 |
LD |
(HL),A |
40 |
RET |
|
41 CHANG |
LD |
A,(HL) |
42 |
INC |
HL |
43 |
EX |
DE, HL |
44 |
LD |
(HL),A |
45 |
INC |
HL |
46 |
EX |
DE, HL |
ZX-РЕВЮ 96/1-2 ЭТЮДЫ
47 |
|
LD |
A,(HL) |
48 |
|
EX |
DE, HL |
49 |
|
LD |
(HL),A |
50 |
|
RET |
|
51 |
HMP |
EQU |
15 |
52 |
RAND |
DEFW |
0 |
53 |
BUFF |
DEFS |
HMP |
54 |
|
DEFS |
HMP |
55 |
BFAD |
DEFW |
0 |
56 |
RND |
LD |
HL,(RAND) |
57 |
|
LD |
A,(HL) |
58 |
|
INC |
HL |
59 |
|
AND |
127 |
60 |
|
OR |
64 |
61 |
|
CP |
88 |
62 |
|
JR |
C, PASS |
63 |
|
AND |
#DF |
64 |
|
CP |
88 |
65 |
|
JR |
C, PASS |
66 |
|
AND |
#CF |
67 |
PASS |
LD |
D,A |
68 |
|
LD |
E,(HL) |
69 |
|
I NC |
HL |
70 |
|
LD |
A, H |
71 |
|
CP |
63 |
72 |
|
JR |
NZ, PASS2 |
73 |
|
LD |
HL, 0 |
74 |
PASS2 |
LD |
(RAND),HL |
75 |
|
EX |
DE, HL |
76 |
|
RET |
|
Длина блока кодов 149 байт:
C350 |
06 |
0F |
CD |
C0 |
C3 |
22 |
BE |
C3 |
1B |
C358 |
CD |
8C |
C3 |
78 |
CB |
27 |
3D |
3D |
1B |
C360 |
16 |
00 |
5F |
21 |
A0 |
C3 |
ED |
5A |
63 |
C368 |
11 |
BE |
C3 |
EB |
CD |
94 |
C3 |
10 |
DC |
C370 |
E1 |
06 |
0F |
78 |
CB |
27 |
3D |
3D |
0D |
C378 |
16 |
00 |
5F |
21 |
A0 |
C3 |
ED |
5A |
7B |
C380 |
11 |
BE |
C3 |
CD |
94 |
C3 |
CD |
8C |
52 |
C388 |
C3 |
10 |
E8 |
C9 |
2A |
BE |
C3 |
3E |
B8 |
C390 |
FF |
AE |
77 |
C9 |
7E |
23 |
EB |
77 |
43 |
C398 |
23 |
EB |
7E |
EB |
77 |
C9 |
00 |
00 |
12 |
C3A0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
63 |
C3A8 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
6B |
C3B0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
73 |
C3B8 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
7B |
C3C0 |
2A |
9E |
C3 |
7E |
23 |
E6 |
7F |
F6 |
0A |
C3C8 |
40 |
FE |
58 |
38 |
08 |
E6 |
DF |
FE |
24 |
C3D0 |
58 |
38 |
02 |
E6 |
CF |
57 |
5E |
23 |
B2 |
C3D8 |
7C |
FE |
3F |
20 |
03 |
21 |
00 |
00 |
98 |
C3E0 |
22 |
9E |
C3 |
EB |
C9 |
00 |
00 |
00 |
DA |
ЭТЮДЫ
Количество линий, одновременно отображаемых на экране можно изменять. Для этого в строке 51 нужно подставить вместо 15 свое значение. Учтите, что при этом буфер координат, а следовательно и сама программа увеличится на N*2 байт.
Для демонстрации эффекта можно воспользоваться БЕИСИК-программой: 10 BORDER 0: PAPER 0: INK 7: CLEAR 49999: RANDOMIZE USR 15619: REM:
LOAD "blink" CODE 20 RANDOMIZE USR 50000: GO TO 20
2). Программа ATTR SHOW!!! создает в заданном окне экрана интересные эффекты с атрибутами. При её циклическом вызове (для этого удобно использовать прерывания второго рода) в окне с координатами (COORDS) и размерами (DX и DY) изображение будет переливаться всеми цветами радуги. Фон же в этом окне будет постоянно чёрным. Вам ничего не мешает сделать его белым или, например, синим. Для этого просто нужно изменить параметры MASK OFF и MASK ON в строках 38-39.
1 ;ATTR SHOW!!!
2 ;VADIM BODROV (C) 1995
3 ; |
|
|
4 |
ORG |
50000 |
5 |
ENT |
$ |
6 |
LD |
DE,(COORDS) |
7 PASS |
LD |
A,(DY) |
8 |
LD |
B, A |
9 LOOP1 |
PUSH |
BC |
10 |
LD |
A, (DX) |
11 |
LD |
B, A |
12 |
PUSH |
DE |
13 LOOP2 |
PUSH |
BC |
14 |
LD |
A, E |
15 |
AND |
#18 |
16 |
RRCA |
|
17 |
RRCA |
|
18 |
RRCA |
|
19 |
OR |
#58 |
20 |
LD |
H, A |
21 |
LD |
A, E |
22 |
AND |
#07 |
23 |
RRCA |
|
24 |
RRCA |
|
25 |
RRCA |
|
26 |
ADD |
A, D |
27 |
LD |
L, A |
28 |
PUSH |
HL |
29 |
LD |
HL,(RANDOM) |
30 |
I NC |
HL |
31 |
LD |
A, 64 |
32 |
CP |
H |
33 |
JR |
NZ,PASS1 |
34 |
LD |
H, 0 |
35 PASS1 |
LD |
(RANDOM),HL |
36 |
LD |
A,(HL) |
37 |
POP |
HL |
38 |
AND |
#47 |
39 |
OR |
#40 |
; MAS K ; MAS K
ZX-РЕВЮ 96/1-2 ЭТЮДЫ
40 |
|
LD |
(HL),A |
41 |
|
I NC |
E |
42 |
|
POP |
BC |
43 |
|
DJNZ |
LOOP2 |
44 |
|
POP |
DE |
45 |
|
POP |
BC |
46 |
|
I NC |
E |
47 |
|
DJNZ |
LOOP1 |
48 |
|
EI |
|
49 |
|
RET |
|
50 |
DY |
DEFB |
10 |
51 |
DX |
DEFB |
20 |
52 |
COORDS |
DEFW |
#0607 |
53 |
RANDOM |
DEFW |
#0000 |
Длина блока кодов 72 байта:
C350 |
F3 |
ED |
5B |
94 |
C3 |
3A |
92 |
C3 |
34 |
C358 |
47 |
C5 |
3A |
93 |
C3 |
47 |
D5 |
C5 |
98 |
C360 |
7B |
E6 |
18 |
0F |
0F |
0F |
F6 |
58 |
17 |
C368 |
67 |
7B |
E6 |
07 |
0F |
0F |
0F |
82 |
A9 |
C370 |
6F |
E5 |
2A |
96 |
C3 |
23 |
3E |
40 |
AB |
C378 |
BC |
20 |
02 |
26 |
00 |
22 |
96 |
C3 |
BA |
C380 |
7E |
E1 |
E6 |
47 |
F6 |
40 |
77 |
14 |
90 |
C388 |
C1 |
10 |
D4 |
D1 |
C1 |
1C |
10 |
C9 |
77 |
C390 |
FB |
C9 |
0A |
14 |
07 |
06 |
00 |
00 |
42 |
Для демонстрации эффекта можно воспользоваться БЕЙСИК-программой (в строке 15 загружается любая картинка):
10 BORDER 0: PAPER 0: INK 7: CLEAR 49999: RANDOMIZE USR 15619: REM :
LOAD "attrshow" CODE 15 RANDOMIZE USR 15619: REM: LOAD "screen $"CODE 16384 20 RANDOMIZE USR 50000: GO TO 20
3) Программа FONT CREAT создает стилизованный символьный набор, создающий впечатление "объёмности" букв.
1 ;FONTCREAT
2 ;Vadim Bodrov (С) 1995
3 ;
4 FONT |
EQU |
51000 |
5 |
ORG |
50000 |
6 |
ENT |
$ |
7 |
LD |
HL,1561 |
8 |
LD |
DE, FONT |
9 |
LD |
BC,768 |
10 |
LDIR |
|
11 |
LD |
HL,FONT |
12 |
LD |
BC,768 |
13 LOOP |
LD |
A,(HL) |
14 |
LD |
D, A |
15 |
SRL |
A |
16 |
OR |
(HL) |
17 |
I NC |
HL |
18 |
OR |
(HL) |
19 |
XOR |
D |
20 |
DEC |
HL |
ЭТЮДЫ
21 |
LD |
(HL),A |
|
22 |
INC |
HL |
|
23 |
DEC |
BC |
|
24 |
LD |
A, B |
|
25 |
OR |
C |
|
26 |
JR |
NZ,LOOP |
|
27 |
LD |
HL,FONT- |
256 |
28 |
LD |
(#5C3 6) , |
HL |
29 |
RET |
|
|
Длина блока кодов 40 байт:
C350 |
21 |
00 |
3D |
11 |
38 |
C7 |
01 |
00 |
82 |
C358 |
03 |
ED |
B0 |
21 |
38 |
C7 |
01 |
00 |
DC |
C360 |
03 |
7E |
57 |
CB |
3F |
B6 |
23 |
B6 |
94 |
C368 |
AA |
2B |
77 |
23 |
0B |
78 |
B1 |
20 |
EE |
C370 |
F0 |
21 |
38 |
C6 |
22 |
36 |
5C |
C9 |
BF |
*************************************************************************************
© Игорь Л. Комаров, Иркутск, 1995.
Эта процедура может использоваться в паре с процедурой очистки экрана как в игре FREDDY HARDEST (2Х-РЕВЮ-94, № 6, стр. 29). Она так же попиксельно, случайным образом
выводит на экран картинку из буфера |
1 |
ORG |
50000 |
2 |
ENT |
$ |
3 |
DI |
|
4 |
CALL |
CLS |
5 |
LD |
A, 1 |
6 L1 |
PUSH |
AF |
7 |
CALL |
GO |
8 |
POP |
AF |
9 |
RLCA |
|
10 |
RLCA |
|
11 |
RLCA |
|
12 |
CP |
1 |
13 |
JR |
NZ, L1 |
14 |
LD |
HL,BUFF+61 |
15 |
LD |
DE,#5800 |
16 |
LD |
BC,#0300 |
17 |
LDIR |
|
18 |
EI |
|
19 |
RET |
|
2 0 ; |
|
|
21 GO |
LD |
HL,BUFF-1 |
22 |
LD |
DE,#3FFF |
23 CONT |
INC |
HL |
24 |
INC |
DE |
25 |
PUSH |
AF |
26 |
LD |
A, E |
27 |
CP |
3 |
28 |
JR |
NZ, L2 |
29 |
POP |
AF |
30 |
RET |
|
31 ; |
|
|
32 L2 |
POP |
AF |
ЭТЮДЫ
33 |
|
LD |
BC,2047 |
34 |
|
PUSH |
HL |
35 |
|
PUSH |
DE |
36 |
ONE |
PUSH |
AF |
37 |
|
AND |
(HL) |
38 |
|
EX |
DE, HL |
39 |
|
OR |
(HL) |
40 |
|
EX |
DE, HL |
41 |
|
PUSH |
BC |
42 |
|
LD |
B, 20 |
43 |
L3 |
DJNZ |
L3 |
44 |
|
POP |
BC |
45 |
|
LD |
(DE) , A |
46 |
|
DEC |
BC |
47 |
|
LD |
A, B |
48 |
|
OR |
C |
49 |
|
JR |
Z, L4 |
50 |
|
POP |
AF |
51 |
|
RLCA |
|
52 |
|
INC |
HL |
53 |
|
INC |
HL |
54 |
|
INC |
HL |
55 |
|
INC |
DE |
56 |
|
INC |
DE |
57 |
|
INC |
DE |
56 |
|
JR |
ONE |
59 |
; |
|
|
60 |
L4 |
POP |
AF |
61 |
|
POP |
DE |
62 |
|
POP |
HL |
63 |
|
JR |
CONT |
64 |
; |
|
|
65 |
CLS |
XOR |
A |
66 |
|
OUT |
(# FE) , A |
67 |
|
LD |
HL,#4000 |
68 |
|
PUSH |
HL |
69 |
|
POP |
DE |
70 |
|
INC |
DE |
71 |
|
LD |
BC,#17FF |
72 |
|
LD |
(HL),A |
73 |
|
LDIR |
|
74 |
|
INC |
HL |
75 |
|
INC |
DE |
76 |
|
LD |
BC, #02FF |
77 |
|
LD |
(HL),6 |
78 |
|
LDIR |
|
79 |
|
RET |
|
80 |
BUFF |
DEFS |
6912 |
81 |
|
END |
|
Длина
без буфера экрана) = 110 байтов:
F3 CD A5 C3 3E 01 6F C3 F1 07 07 07
ЭТЮДЫ
C360 |
20 |
F4 |
21 |
BE |
DB |
11 |
00 |
58 |
5A |
C368 |
01 |
00 |
03 |
ED |
B0 |
FB |
C9 |
21 |
B1 |
C370 |
BD |
C3 |
11 |
FF |
3F |
23 |
13 |
F5 |
2D |
C378 |
7B |
FE |
03 |
20 |
02 |
F1 |
C9 |
F1 |
84 |
C380 |
01 |
FF |
07 |
E5 |
D5 |
F5 |
A6 |
EB |
8A |
C388 |
B6 |
EB |
C5 |
06 |
14 |
10 |
FE |
C1 |
9A |
C390 |
12 |
0B |
78 |
B1 |
28 |
0A |
F1 |
07 |
C3 |
C398 |
23 |
23 |
23 |
13 |
13 |
13 |
18 |
E5 |
FA |
C3A0 |
F1 |
D1 |
E1 |
18 |
D0 |
AF |
D3 |
FE |
6E |
C3A8 |
21 |
00 |
40 |
E5 |
D1 |
13 |
01 |
FF |
95 |
C3B0 |
17 |
77 |
ED |
B0 |
23 |
13 |
01 |
FF |
D4 |
C3B8 |
02 |
36 |
06 |
ED |
B0 |
C9 |
00 |
00 |
1F |
*************************************************************************************
© В. Казаков, Д. Денисенко, г. Армавир, 1995.
Процедуры приводятся с непринципиальными изменениями.
Эта процедура выполняет красивую очистку экрана (эффект немного похож на действие предыдущей программы):
1 |
ORG |
50000 |
2 |
ENT |
$ |
3 |
LD |
HL,#5800 |
4 |
LD |
D, H |
5 |
LD |
E, L |
6 |
INC |
DE |
7 |
LD |
(HL),64+7 |
8 |
LD |
BC,#02FF |
9 |
LDIR |
|
10 |
LD |
B, 32 |
11 M0 |
PUSH |
BC |
12 |
LD |
HL,#2BB0 |
13 |
LD |
(M3+1),HL |
14 |
LD |
HL,16385 |
15 |
LD |
DE,16384 |
16 |
CALL |
LOOP |
17 |
LD |
HL,18433 |
18 |
LD |
DE,18432 |
19 |
CALL |
LOOP |
20 |
LD |
HL,20481 |
21 |
LD |
DE,20480 |
22 |
CALL |
LOOP |
23 |
LD |
HL,#2 3B8 |
24 |
LD |
(M3+1),HL |
25 |
LD |
DE,16671 |
26 |
LD |
HL,16670 |
27 |
CALL |
LOOP |
28 |
LD |
DE,18719 |
29 |
LD |
HL,18718 |
30 |
CALL |
LOOP |
31 |
LD |
DE,20767 |
32 |
LD |
HL,20766 |
33 |
CALL |
LOOP |
34 |
POP |
BC |
35 |
DJNZ |
M0 |
(едуры |
= 128 байтов: |
|
|
|
|
|
|
|
C350 |
21 |
00 |
58 |
54 |
5D |
13 |
36 |
47 |
CD |
C358 |
01 |
FF |
02 |
ED |
B0 |
06 |
20 |
C5 |
A5 |
C360 |
21 |
B0 |
2B |
22 |
B4 |
C3 |
21 |
01 |
DA |
C368 |
40 |
11 |
00 |
40 |
CD |
A6 |
C3 |
21 |
13 |
C370 |
01 |
48 |
11 |
00 |
48 |
CD |
A6 |
C3 |
0B |
C378 |
21 |
01 |
50 |
11 |
00 |
50 |
CD |
A6 |
81 |
C380 |
C3 |
21 |
B8 |
23 |
22 |
B4 |
C3 |
11 |
AC |
C388 |
1F |
41 |
21 |
1E |
41 |
CD |
A6 |
C3 |
61 |
C390 |
11 |
1F |
49 |
21 |
1E |
49 |
CD |
A6 |
C7 |
C398 |
C3 |
11 |
1F |
51 |
21 |
1E |
51 |
CD |
FC |
C3A0 |
A6 |
C3 |
C1 |
10 |
BA |
C9 |
06 |
08 |
2E |
C3A8 |
C5 |
E5 |
D5 |
06 |
04 |
C5 |
E5 |
D5 |
73 |
C3B0 |
01 |
1F |
00 |
ED |
B0 |
2B |
36 |
00 |
91 |
C3B8 |
D1 |
E1 |
14 |
14 |
24 |
24 |
C1 |
10 |
6E |
C3C0 |
EC |
D1 |
E1 |
01 |
20 |
00 |
ED |
4A |
79 |
C3C8 |
EB |
ED |
4A |
EB |
C1 |
10 |
D9 |
C9 |
0B |
Следующая процедура предназначена для прорисовки экрана в комплекте с предыдущей:
ORG 50000 ENT $ XOR A
36 |
|
RET |
|
|
37 |
LOOP |
LD |
B,8 |
|
38 |
Ml |
PUSH |
BC |
|
39 |
|
PUSH |
HL |
|
40 |
|
PUSH |
DE |
|
41 |
|
LD |
B, 4 |
|
42 |
M2 |
PUSH |
BC |
|
43 |
|
PUSH |
HL |
|
44 |
|
PUSH |
DE |
|
45 |
|
LD |
BC, |
31 |
46 |
M3 |
LDIR |
|
|
47 |
|
DEC |
HL |
|
48 |
|
LD |
(HL |
0 , 0 |
49 |
|
POP |
DE |
|
50 |
|
POP |
HL |
|
51 |
|
INC |
D |
|
52 |
|
INC |
D |
|
53 |
|
INC |
H |
|
54 |
|
INC |
H |
|
55 |
|
POP |
BC |
|
56 |
|
DJNZ |
M2 |
|
57 |
|
POP |
DE |
|
58 |
|
POP |
HL |
|
59 |
|
LD |
BC, |
32 |
60 |
|
ADC |
HL, |
BC |
61 |
|
EX |
DE, |
HL |
62 |
|
ADC |
HL, |
BC |
63 |
|
EX |
DE, |
HL |
64 |
|
POP |
BC |
|
65 |
|
DJNZ |
M1 |
|
66 |
|
RET |
|
|
4 |
|
LD |
(SYSTEM),A |
5 |
|
LD |
B, 32 |
6 |
PRO |
PUSH |
BC |
7 |
|
LD |
A, #3C |
8 |
|
LD |
(M3) ,A |
9 |
|
LD |
A, #B0 |
10 |
|
LD |
( M4 + 1 ) , A |
11 |
|
LD |
HL,BUFF |
12 |
|
LD |
DE,16384 |
13 |
|
CALL |
LOOP |
14 |
|
LD |
HL,BUFF+2048 |
15 |
|
LD |
DE,18432 |
16 |
|
CALL |
LOOP |
17 |
|
LD |
HL,BUFF+4096 |
18 |
|
LD |
DE,20480 |
19 |
|
CALL |
LOOP |
20 |
|
LD |
A, #B8 |
21 |
|
LD |
( M4 + 1 ) , A |
22 |
|
LD |
HL,BUFF+287 |
23 |
|
LD |
DE,16671 |
24 |
|
CALL |
LOOP |
25 |
|
LD |
HL,BUFF+2335 |
26 |
|
LD |
DE,18719 |
27 |
|
CALL |
LOOP |
28 |
|
LD |
HL,BUFF+4383 |
29 |
|
LD |
DE,20767 |
30 |
|
CALL |
LOOP |
31 |
|
POP |
BC |
32 |
|
DJNZ |
PRO |
33 |
|
LD |
HL,BUFF+6144 |
34 |
|
LD |
DE,22528 |
35 |
|
LD |
BC,768 |
36 |
|
LDIR |
|
37 |
|
RET |
|
38 |
LOOP |
LD |
B,8 |
39 |
M1 |
PUSH |
BC |
40 |
|
PUSH |
DE |
41 |
|
PUSH |
HL |
42 |
|
LD |
B, 4 |
43 |
M2 |
PUSH |
BC |
44 |
|
PUSH |
DE |
45 |
|
PUSH |
HL |
46 |
|
LD |
A, (SYSTEM) |
47 |
M3 |
INC |
A |
48 |
|
LD |
(SYSTEM),A |
49 |
|
LD |
B, 0 |
50 |
|
LD |
C, A |
51 |
M4 |
LDIR |
|
52 |
|
XOR |
A |
53 |
|
LD |
(M3) ,A |
54 |
|
POP |
HL |
55 |
|
POP |
DE |
ZX-РЕВЮ 96/1-2 ЭТЮДЫ
ZX-РЕВЮ 96/1-2 ЭТЮДЫ
56 |
INC |
H |
57 |
INC |
H |
58 |
INC |
D |
59 |
INC |
D |
60 |
POP |
BC |
61 |
DJNZ |
M2 |
62 |
POP |
HL |
63 |
POP |
DE |
64 |
LD |
BC, 32 |
65 |
ADD |
HL, BC |
66 |
EX |
DE, HL |
67 |
ADD |
HL, BC |
68 |
EX |
DE, HL |
69 |
POP |
BC |
70 |
DJNZ |
M1 |
71 |
RET |
|
72 SYSTEM DEFB 0
73 BUFF DEFS 6912
Буфер экрана в этой программе находится по адресу 50140. Длина процедуры (без буфера экрана) = 140 байтов:
C350 |
AF |
32 |
DB |
C3 |
06 |
20 |
C5 |
3E |
BB |
C358 |
3C |
32 |
B8 |
C3 |
3E |
B0 |
32 |
C0 |
E4 |
C360 |
C3 |
21 |
DC |
C3 |
11 |
00 |
40 |
CD |
C4 |
C368 |
AB |
C3 |
21 |
DC |
CB |
11 |
00 |
48 |
BA |
C370 |
CD |
AB |
C3 |
21 |
DC |
D3 |
11 |
00 |
4 F |
C378 |
50 |
CD |
AB |
C3 |
3E |
B8 |
32 |
C0 |
AE |
C380 |
C3 |
21 |
FB |
C4 |
11 |
1F |
41 |
CD |
24 |
C388 |
AB |
C3 |
21 |
FB |
CC |
11 |
1F |
49 |
1A |
C390 |
CD |
AB |
C3 |
21 |
FB |
D4 |
11 |
1F |
AE |
C398 |
51 |
CD |
AB |
C3 |
C1 |
10 |
B7 |
21 |
90 |
C3A0 |
DC |
DB |
11 |
00 |
58 |
01 |
00 |
03 |
87 |
C3A8 |
ED |
B0 |
C9 |
06 |
08 |
C5 |
D5 |
E5 |
5E |
C3B0 |
06 |
04 |
C5 |
D5 |
E5 |
3A |
DB |
C3 |
D4 |
C3B8 |
3C |
32 |
DB |
C3 |
06 |
00 |
4F |
ED |
C9 |
C3C0 |
B0 |
AF |
32 |
B8 |
C3 |
E1 |
D1 |
24 |
65 |
C3C8 |
24 |
14 |
14 |
C1 |
10 |
E4 |
E1 |
D1 |
3E |
C3D0 |
01 |
20 |
00 |
09 |
EB |
09 |
EB |
C1 |
5D |
C3D8 |
10 |
D3 |
C9 |
00 |
00 |
00 |
00 |
00 |
47 |
И ещё одна программа для плавной прорисовки картинки, предварительно помещенной по адресу BUFF, сверку вниз по линиям:
1 |
ORG |
50000 |
2 |
ENT |
$ |
3 |
LD |
HL,BUFF |
4 |
LD |
DE, 16384 |
5 |
CALL |
PROG |
6 |
LD |
HL,BUFF+2048 |
7 |
LD |
DE, 18432 |
8 |
CALL |
PROG |
9 |
LD |
HL,BUFF+4096 |
10 |
LD |
DE, 20480 |
11 |
CALL |
PROG |
12 |
LD |
HL,BUFF+6144 |
ЭТЮДЫ
13 |
|
LD |
DE,225 |
14 |
|
LD |
BC,768 |
15 |
|
LDIR |
|
16 |
|
RET |
|
17 |
PROG |
LD |
B,8 |
18 |
M1 |
PUSH |
BC |
19 |
|
PUSH |
HL |
20 |
|
PUSH |
DE |
21 |
|
LD |
B, 8 |
22 |
M2 |
PUSH |
BC |
23 |
|
PUSH |
HL |
24 |
|
PUSH |
DE |
25 |
|
LD |
BC, 32 |
26 |
|
LDIR |
|
27 |
|
HALT |
|
28 |
|
POP |
DE |
29 |
|
POP |
HL |
30 |
|
INC |
H |
31 |
|
INC |
D |
32 |
|
POP |
BC |
33 |
|
DJNZ |
M2 |
34 |
|
LD |
BC, 32 |
35 |
|
POP |
DE |
36 |
|
POP |
HL |
37 |
|
ADD |
HL, BC |
38 |
|
EX |
DE, HL |
39 |
|
ADD |
HL, BC |
40 |
|
EX |
DE, HL |
41 |
|
POP |
BC |
42 |
|
DJNZ |
M1 |
43 |
|
RET |
|
44 |
BUFF |
DEFS |
6912 |
(едуры ( |
без буфера экрана) |
= 75 байтов: |
|
|
|
|
C350 |
21 |
9B |
C3 |
11 |
00 |
40 |
CD |
77 |
27 |
C358 |
C3 |
21 |
9B |
CB |
11 |
00 |
48 |
CD |
8B |
C360 |
77 |
C3 |
21 |
9B |
D3 |
11 |
00 |
50 |
4D |
C368 |
CD |
77 |
C3 |
21 |
9B |
DB |
11 |
00 |
DA |
C370 |
58 |
01 |
00 |
03 |
ED |
B0 |
C9 |
06 |
FB |
C378 |
08 |
C5 |
E5 |
D5 |
06 |
08 |
C5 |
E5 |
7A |
C380 |
D5 |
01 |
20 |
00 |
ED |
B0 |
76 |
D1 |
1D |
C388 |
E1 |
24 |
14 |
C1 |
10 |
F0 |
01 |
20 |
46 |
C390 |
00 |
D1 |
E1 |
09 |
EB |
09 |
EB |
C1 |
AE |
C398 |
10 |
DF |
C9 |
00 |
00 |
00 |
00 |
00 |
13 |
Мы хотим обратить внимание читателей на не очень рациональное построение процедур: это проявляется в обилии задаваемых: конкретных адресов в дисплейном файле и буфере экрана. Например, последнюю процедуру можно было выполнить очень элегантно, используя 15-байтную подпрограмму расчёта адреса нижележащей пиксельной линии, приведенную в разделе ЭТЮДЫ в 2Х-РЕВЮ-95, № 4.
*************************************************************************************
© Николай Губин, г. Новгород, 1995.
Предлагаю две процедуры для владельцев 128К компьютеров. Они предназначены для вывода на экран картинки, предварительно помещённой в буфер (обозначен меткой BUFF).
ЭТЮДЫ
Первая процедура прорисовывает картинку от центра экрана вниз и вверх. Эта процедура используется в загрузчике DIZZY 4.
Так как в процедуре используется режим прерываний 2 рода, то она не будет работать на компьютерах, у которых этот режим некорректно обрабатывается. Впрочем, как исправить, мы думаем, Вы уже знаете - мы не раз приводили примеры в ZX-РЕВЮ.
00010 |
BUFF |
EQU |
41000 |
00020 |
|
ORG |
40000 |
00030 |
|
ENT |
|
00040 |
|
DI |
|
00050 |
|
LD |
BC,#7 FFD |
00060 |
|
LD |
A, #17 |
00070 |
|
OUT |
(C) ,A |
00080 |
|
LD |
HL,BUFF |
00090 |
|
LD |
DE, #C000 |
00100 |
|
LD |
BC,#1B00 |
00110 |
|
LDIR |
|
00120 |
|
LD |
HL,#A1A1 |
00130 |
|
LD |
(#A0FF) ,: |
00140 |
|
LD |
A, #C3 |
00150 |
|
LD |
( #A1 A1 ) , |
00160 |
|
LD |
HL,SCR |
00170 |
|
LD |
( #A1 A2 ) , |
00180 |
|
LD |
A, #A0 |
00190 |
|
LD |
I,A |
00200 |
|
IM |
2 |
00210 |
|
EI |
|
00220 |
LOOP |
HALT |
|
00230 |
|
LD |
A, (POKE3 |
00240 |
|
OR |
A |
00250 |
|
JR |
NZ,LOOP |
00260 |
|
DI |
|
00270 |
|
LD |
A, #3F |
00280 |
|
LD |
I,A |
00290 |
|
IM |
1 |
00300 |
|
LD |
A, #18 |
00310 |
|
LD |
BC,#7 FFD |
00320 |
|
OUT |
(C) , A |
00330 |
|
LD |
HL,BUFF |
00340 |
|
LD |
DE, #4000 |
00350 |
|
LD |
BC,#1B00 |
00360 |
|
LDIR |
|
00370 |
|
LD |
A, #10 |
00380 |
|
LD |
BC,#7 FFD |
00390 |
|
OUT |
(C) , A |
00400 |
|
RET |
|
00410 |
SCR |
PUSH |
HL |
00420 |
|
PUSH |
DE |
00430 |
|
PUSH |
BC |
00440 |
|
PUSH |
AF |
00450 |
|
LD |
HL,#171F |
00460 |
|
LD |
BC,#7 FFD |
00470 |
|
OUT |
(C) , H |
ЭТЮДЫ
00480 |
|
LD |
DE,(POKE2) |
00490 |
L1 |
DEC |
DE |
00500 |
|
LD |
A, D |
00510 |
|
OR |
E |
00520 |
|
JR |
NZ, L1 |
00530 |
|
OUT |
(C) , L |
00540 |
|
LD |
DE,(POKE2) |
00550 |
|
DEC |
DE |
00560 |
|
DEC |
DE |
00570 |
|
DEC |
DE |
00580 |
|
DEC |
DE |
00590 |
|
DEC |
DE |
00600 |
|
DEC |
DE |
00610 |
|
DEC |
DE |
00620 |
|
DEC |
DE |
00630 |
|
DEC |
DE |
00640 |
|
LD |
(POKE2),DE |
00650 |
|
LD |
DE,(POKE1) |
00660 |
L2 |
DEC |
DE |
00670 |
|
LD |
A, D |
00680 |
|
OR |
E |
00690 |
|
JR |
NZ, L2 |
00700 |
|
OUT |
(C) , H |
00710 |
|
LD |
DE,(POKE1) |
00720 |
|
LD |
HL,#12 |
00730 |
|
ADD |
HL, DE |
00740 |
|
LD |
(POKE1),HL |
00750 |
|
POP |
AF |
00760 |
|
POP |
BC |
00770 |
|
POP |
DE |
00780 |
|
POP |
HL |
00790 |
|
EI |
|
00800 |
|
RET |
|
00810 |
POKE1 |
DEFB |
2,0 |
00820 |
POKE2 |
DEFB |
#5E |
00830 |
POKE3 |
DEFB |
#05 |
Start of object: |
#9C4 0 |
(40000 |
) |
|
|
|
|
Length: |
|
#009B |
(00155 |
) |
|
|
|
|
Executes: |
|
#9C40 |
(40000 |
) |
|
|
|
|
9C40 |
F3 |
01 |
FD |
7F |
3E |
17 |
ED |
79 |
07 |
9C48 |
21 |
28 |
A0 |
11 |
00 |
C0 |
01 |
00 |
9F |
9C50 |
1B |
ED |
B0 |
21 |
A1 |
A1 |
22 |
FF |
28 |
9C58 |
A0 |
3E |
C3 |
32 |
A1 |
A1 |
21 |
93 |
BD |
9C60 |
9C |
22 |
A2 |
A1 |
3E |
A0 |
ED |
47 |
0F |
9C68 |
ED |
5E |
FB |
76 |
3A |
DA |
9C |
B7 |
27 |
9C70 |
20 |
F9 |
F3 |
3E |
3F |
ED |
47 |
ED |
B6 |
9C78 |
56 |
3E |
18 |
01 |
FD |
7F |
ED |
79 |
A3 |
9C80 |
21 |
28 |
A0 |
11 |
00 |
40 |
01 |
00 |
57 |
9C88 |
1B |
ED |
B0 |
3E |
10 |
01 |
FD |
7F |
A7 |
9C90 |
ED |
79 |
C9 |
E5 |
D5 |
C5 |
F5 |
21 |
F0 |
9C98 |
1F |
17 |
01 |
FD |
7F |
ED |
61 |
ED |
22 |
9CA0 |
5B |
D9 |
9C |
1B |
7A |
B3 |
20 |
FB |
6F |
ЭТЮДЫ
9CA8 9CB0 9CB8 9CC0 9CC8 9CD0 9CD8
Следует только заметить, что |
изменяется содержимое ячеек. |
Вторая процедура выводит на : |
00010 |
BUFF |
EQU |
32768 |
00020 |
|
ORG |
40000 |
00030 |
|
ENT |
|
00040 |
|
DI |
|
00050 |
|
LD |
HL,#4000 |
00060 |
|
LD |
DE, #4001 |
00070 |
|
LD |
BC,#1AFF |
00080 |
|
LD |
(HL),L |
00090 |
|
LDIR |
|
00100 |
|
LD |
HL,BUFF |
00110 |
|
LD |
DE, #4000 |
00120 |
|
LD |
BC,#1800 |
00130 |
|
LDIR |
|
00140 |
|
LD |
A, #01 |
00150 |
L1 |
LD |
B,#FF |
00160 |
|
PUSH |
AF |
00170 |
LOOP |
LD |
H,#98 |
00180 |
|
CALL |
SCR |
00190 |
|
INC |
H |
00200 |
|
CALL |
SCR |
00210 |
|
INC |
H |
00220 |
|
CALL |
SCR |
00230 |
|
DJNZ |
LOOP |
00240 |
|
POP |
AF |
00250 |
|
DEC |
A |
00260 |
|
OR |
A |
00270 |
|
JR |
NZ, L1 |
00280 |
|
LD |
HL,BUFF+61 |
00290 |
|
LD |
DE, #5800 |
00300 |
|
LD |
BC,#0300 |
00310 |
|
LDIR |
|
00320 |
|
RET |
|
00330 |
SCR |
PUSH |
HL |
00340 |
|
LD |
HL,POKE |
00350 |
|
INC |
(HL) |
00360 |
|
BIT |
0,(HL) |
00370 |
|
POP |
HL |
00380 |
|
JR |
Z, CONT |
00390 |
|
RES |
7, C |
00400 |
BON |
LD |
A,R |
00410 |
|
OR |
C |
00420 |
|
LD |
L, A |
ЭТЮДЫ
00430 |
|
PUSH |
HL |
00440 |
|
LD |
A, H |
00450 |
|
SUB |
#40 |
00460 |
|
LD |
H, A |
00470 |
|
POP |
DE |
00480 |
|
LD |
A, (DE) |
00490 |
|
LD |
(HL),A |
00500 |
|
EX |
DE, HL |
00510 |
|
CALL |
S1 |
00520 |
|
RET |
|
00530 |
CONT |
SET |
7,C |
00540 |
|
JR |
BON |
00550 |
S1 |
PUSH |
HL |
00560 |
|
PUSH |
BC |
00570 |
|
PUSH |
DE |
00580 |
|
PUSH |
AF |
00590 |
|
LD |
HL, 0 |
00600 |
|
LD |
DE, 0 |
00610 |
|
LD |
BC,#123 |
00620 |
|
LDIR |
|
00630 |
|
POP |
AF |
00640 |
|
POP |
DE |
00650 |
|
POP |
BC |
00660 |
|
POP |
HL |
00670 |
|
RET |
|
Start of object: |
#9C4 0 |
(40000 |
) |
|
|
|
|
Length: |
|
#0073 |
(00115 |
) |
|
|
|
|
Executes: |
|
#9C40 |
(40000 |
) |
|
|
|
|
9C40 |
F3 |
21 |
00 |
40 |
11 |
01 |
40 |
01 |
83 |
9C48 |
FF |
1A |
75 |
ED |
B0 |
21 |
00 |
80 |
B0 |
9C50 |
11 |
00 |
40 |
01 |
00 |
18 |
ED |
B0 |
F3 |
9C58 |
3E |
01 |
06 |
FF |
F5 |
26 |
98 |
CD |
B8 |
9C60 |
7D |
9C |
24 |
CD |
7D |
9C |
24 |
CD |
10 |
9C68 |
7D |
9C |
10 |
F1 |
F1 |
3D |
B7 |
20 |
23 |
9C70 |
E9 |
21 |
00 |
98 |
11 |
00 |
58 |
01 |
18 |
9C78 |
00 |
03 |
ED |
B0 |
C9 |
E5 |
21 |
B2 |
35 |
9C80 |
9C |
34 |
CB |
46 |
E1 |
28 |
13 |
CB |
E4 |
9C88 |
B9 |
ED |
5F |
B1 |
6F |
E5 |
7C |
D6 |
80 |
9C90 |
40 |
67 |
D1 |
1A |
77 |
EB |
CD |
9E |
8B |
9C98 |
9C |
C9 |
CB |
F9 |
18 |
EB |
E5 |
C5 |
0A |
9CA0 |
D5 |
F5 |
21 |
00 |
00 |
11 |
00 |
00 |
38 |
9CA8 |
01 |
23 |
01 |
ED |
B0 |
F1 |
D1 |
C1 |
89 |
9CB0 |
E1 |
C9 |
00 |
00 |
00 |
00 |
00 |
00 |
F6 |
У этой процедуры буфер экрана обязательно (#8000).
должен располагаться по адресу 32768
ЭТЮДЫ
© Влад, г. Оленегорск, 1995.
Предлагаю программу имитации звёздного неба (как в ГБМ'овской программе WD).
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
CALL |
INIT |
00040 |
|
HALT |
|
00050 |
STAR |
CALL |
START |
00060 |
|
LD |
A, 127 |
00070 |
|
IN |
A, (254) |
00080 |
|
RRA |
|
00090 |
|
JR |
C, STAR |
00100 |
|
RET |
|
00110 |
INIT |
LD |
IX,SHAB |
00120 |
|
L1 |
LD D, (I |
00130 |
|
LD |
E,(IX+1) |
00140 |
|
CALL |
TOSCR |
00150 |
|
LD |
A,(IX+3) |
00160 |
|
XOR |
(HL) |
00170 |
|
LD |
(HL),A |
00180 |
|
LD |
DE, 4 |
00190 |
|
ADD |
IX, DE |
00200 |
|
LD |
A,(IX+0) |
00210 |
|
CP |
255 |
00220 |
|
RET |
Z |
00230 |
|
JR |
L1 |
00240 |
START |
LD |
IX,SHAB |
00250 |
L5 |
LD |
D,(IX+0) |
00260 |
|
LD |
E,(IX+1) |
00270 |
|
CALL |
TOSCR |
00280 |
|
LD |
A,(IX+3) |
00290 |
|
XOR |
(HL) |
00300 |
|
LD |
(HL),A |
00310 |
|
LD |
B,(IX+2) |
00320 |
|
LD |
A,(IX+3) |
00330 |
L3 |
ADD |
A,A |
00340 |
|
OR |
A |
00350 |
|
JR |
Z, L2 |
00360 |
|
DJNZ |
L3 |
00370 |
|
LD |
(IX+3),A |
00380 |
|
XOR |
(HL) |
00390 |
|
LD |
(HL),A |
00400 |
|
JR |
L4 |
00410 |
L2 |
LD |
(IX+3),1 |
00420 |
|
LD |
A, (IX+1) |
00430 |
|
DEC |
A |
00440 |
|
AND |
31 |
00450 |
|
LD |
(IX+1),A |
00460 |
|
LD |
D,(IX+0) |
00470 |
|
LD |
E,(IX+1) |
00480 |
|
CALL |
TOSCR |
00490 |
|
LD |
A, (IX+3) |
00500 |
|
XOR |
(HL) |
ZX-РЕВЮ 96/1-2 ЭТЮДЫ
00510 |
|
LD |
(HL),A |
00520 |
L4 |
LD |
DE,4 |
00530 |
|
ADD |
IX, DE |
00540 |
|
LD |
A, (IX+0) |
00550 |
|
CP |
255 |
00560 |
|
JR |
NZ, L5 |
00570 |
|
RET |
|
00580 |
TOSCR |
LD |
H,64 |
00590 |
|
LD |
A, D |
00600 |
|
AND |
192 |
00610 |
|
SRL |
A |
00620 |
|
SRL |
A |
00630 |
|
SRL |
A |
00640 |
|
ADD |
A, H |
00650 |
|
LD |
H, A |
00660 |
|
LD |
A, D |
00670 |
|
AND |
7 |
00680 |
|
ADD |
A, H |
00690 |
|
LD |
H, A |
00700 |
|
LD |
A, D |
00710 |
|
AND |
56 |
00720 |
|
ADD |
A, A |
00730 |
|
ADD |
A, A |
00740 |
|
ADD |
A, E |
00750 |
|
LD |
L, A |
00760 |
|
RET |
|
00770 |
SHAB |
DEFB |
10,26,1,64 |
00780 |
|
DEFB |
100,4,1,64 |
00790 |
|
DEFB |
50,29,2,16 |
00800 |
|
DEFB |
130,14,2,16 |
00810 |
|
DEFB |
70, 30, 4, 16 |
00820 |
|
DEFB |
170,14,1,32 |
00830 |
|
DEFB |
20,13,4,16 |
00840 |
|
DEFB |
30,19,2,4 |
00850 |
|
DEFB |
40, 25, 4, 16 |
00860 |
|
DEFB |
60,22,1,32 |
00870 |
|
DEFB |
150,4,1,32 |
00880 |
|
DEFB |
180,1,4,16 |
00890 |
|
DEFB |
190, 26, 2,4 |
00900 |
|
DEFB |
80,5,2,4 |
00910 |
|
DEFB |
90,14,2,4 |
00920 |
|
DEFB |
110,1,4,16 |
00930 |
|
DEFB |
120,31,1,32 |
00940 |
|
DEFB |
140,14,1,32 |
00950 |
|
DEFB |
160,22,2,4 |
00960 |
|
DEFB |
10,9,1,32 |
00970 |
|
DEFB |
100,21,1,32 |
00980 |
|
DEFB |
50,14,2,4 |
00990 |
|
DEFB |
130,29,2,4 |
01000 |
|
DEFB |
70,13,4,16 |
01010 |
|
DEFB |
170,31,1,32 |
01020 |
|
DEFB |
20, 30, 4, 16 |
ZX-РЕВЮ 96/1-2 ЭТЮДЫ
01030 |
DEFB |
30, 2, 2, 4 |
01040 |
DEFB |
40, 8, 4, 16 |
01050 |
DEFB |
60, 5, 1, 32 |
01060 |
DEFB |
150, 21, 1, 32 |
01070 |
DEFB |
180, 18, 4, 16 |
01080 |
DEFB |
190, 11, 2, 4 |
01090 |
DEFB |
80,22,2,4 |
01100 |
DEFB |
90, 29, 2, 4 |
01110 |
DEFB |
110, 18, 4, 16 |
01120 |
DEFB |
120, 14, 1, 32 |
01130 |
DEFB |
140, 31, 1, 32 |
01140 |
DEFB |
160, 5, 2, 4 |
01150 |
DEFB |
255 |
|
Start of object: #9C40 |
Length: #012E (06302)
Executes: #9C40 (40000)
Каждая звезда определяется четырьмя байтами. Первый и второй байты - это координаты звёзд в пикселях, третий байт - скорость перемещения звёзды, четвёртый байт - шаблон самой звезды.
Шестнадцатеричный дамп:
9C40 |
CD |
4F |
9C |
76 |
CD |
6E |
9C |
3E |
1F |
9C48 |
7 F |
DB |
FE |
1F |
38 |
F6 |
C9 |
DD |
2 F |
9C50 |
21 |
D5 |
9C |
DD |
56 |
00 |
DD |
5E |
EC |
9C58 |
01 |
CD |
BB |
9C |
DD |
7E |
03 |
AE |
25 |
9C60 |
77 |
11 |
04 |
00 |
DD |
19 |
DD |
7E |
D9 |
9C68 |
00 |
FE |
FF |
C8 |
18 |
E5 |
DD |
21 |
C4 |
9C70 |
D5 |
9C |
DD |
56 |
00 |
DD |
5E |
01 |
EC |
9C78 |
CD |
BB |
9C |
DD |
7E |
03 |
AE |
77 |
BB |
9C80 |
DD |
46 |
02 |
DD |
7E |
03 |
87 |
B7 |
DD |
9C88 |
28 |
09 |
10 |
FA |
DD |
77 |
03 |
AE |
64 |
9C90 |
77 |
18 |
1B |
DD |
36 |
03 |
01 |
DD |
CA |
9C98 |
7E |
01 |
3D |
E6 |
1F |
DD |
77 |
01 |
4A |
9CA0 |
DD |
56 |
00 |
DD |
5E |
01 |
CD |
BB |
33 |
9CA8 |
9C |
DD |
7E |
03 |
AE |
77 |
11 |
04 |
78 |
9CB0 |
00 |
DD |
19 |
DD |
7E |
00 |
FE |
FF |
9A |
9CB8 |
20 |
B8 |
C9 |
26 |
40 |
7A |
E6 |
C0 |
7B |
9CC0 |
CB |
3F |
CB |
3F |
CB |
3F |
84 |
67 |
65 |
9CC8 |
7A |
E6 |
07 |
84 |
67 |
7A |
E6 |
38 |
4E |
9CD0 |
87 |
87 |
83 |
6F |
C9 |
0A |
1D |
01 |
5D |
9CD8 |
20 |
64 |
07 |
01 |
20 |
32 |
03 |
02 |
57 |
9CE0 |
04 |
82 |
14 |
02 |
04 |
46 |
0A |
04 |
70 |
9CE8 |
01 |
AA |
11 |
01 |
10 |
14 |
19 |
04 |
82 |
9CF0 |
01 |
1E |
19 |
02 |
01 |
28 |
05 |
04 |
F8 |
9CF8 |
01 |
3C |
19 |
01 |
10 |
96 |
07 |
01 |
99 |
9D00 |
10 |
B4 |
0D |
04 |
01 |
BE |
00 |
02 |
33 |
9D08 |
01 |
50 |
0B |
02 |
01 |
5A |
14 |
02 |
74 |
9D10 |
01 |
6E |
0D |
04 |
01 |
78 |
02 |
01 |
A9 |
9D18 |
10 |
8C |
11 |
01 |
10 |
A0 |
1C |
02 |
31 |
9D20 |
01 |
0A |
0C |
01 |
10 |
64 |
18 |
01 |
62 |
9D28 |
10 |
32 |
14 |
02 |
01 |
82 |
03 |
02 |
A5 |
9D30 |
01 |
46 |
19 |
04 |
01 |
AA |
02 |
01 |
DF |
9D38 |
10 |
14 |
0A |
04 |
01 |
1E |
08 |
02 |
30 |
ЭТЮДЫ
9D40 |
01 |
28 |
14 |
04 |
01 |
3C |
08 |
01 |
64 |
9D48 |
10 |
96 |
18 |
01 |
10 |
B4 |
1E |
04 |
8A |
9D50 |
01 |
BE |
11 |
02 |
01 |
50 |
1C |
02 |
2E |
9D58 |
01 |
5A |
03 |
02 |
01 |
6E |
1E |
04 |
E 6 |
9D60 |
01 |
78 |
11 |
01 |
10 |
8C |
02 |
01 |
27 |
9D68 |
10 |
A0 |
0B |
02 |
01 |
FF |
00 |
00 |
C2 |
************************************************************************************* © Роман Щербаков, г. Москва, 1995.
Процедура EXPLOSION
Этот графический эффект я назвал EXPLOSION - взрыв. Его действие состоит в следующем: при запуске программа "взрывает" заданную часть экрана, сопровождая зрелище соответствующими звуками. Изображение по точкам ("осколкам") начинает разлетаться от места взрыва в разные стороны, пока не исчезнет за пределами экрана. Задать для "взрыва" можно любую область экрана, причем разлетающиеся "осколки" не будут портить ничего на своем пути. В основе лежит процедура из игры STAINLESS STEEL, однако исходный вариант примерно на 90% мной переработан.
Процедура может использоваться, например, для демонстрации гибели героя в играх, но можно найти ей ещё более интересное применение.
1 ; (С) Щербаков Роман 1995.
2 ;
10 |
ORG |
50000 |
;--- Программные переменные --- |
20 XCRD |
EQU |
#60 |
;Х-координата взрываемого прямоугольника |
3 0 YCRD |
EQU |
#48 |
;Y-координата от левого верхнего угла |
40 XLEN |
EQU |
#48 |
;Длина прямоугольника в пикселях |
50 YHGT |
EQU |
#10 |
;Высота прямоугольника в пикселях |
60 |
ENT |
$ |
;--- Инициализатор --- |
70 |
LD |
IX, DATA |
;В IX помещается адрес начала буфера |
|
|
|
;данных |
80 |
LD |
B, #FF |
;B регистр B - количество "осколков" (255) |
90 INIT |
LD |
C,XLEN |
;В регистр C - макс. длину прямоугольника |
100 |
CALL |
RNDA |
;Вызов генератора псевдослучайных чисел. |
110 |
ADD |
A, XCRD |
; Складываем случайное число с Х-координаты |
120 |
LD |
(IX+0),A |
;В соответствующее место буфера его |
130 |
LD |
C, YHGT |
;Аналогичные расчёты для Y-координаты |
140 |
CALL |
RNDA |
;(В регистр C помещается максимальное число |
150 |
ADD |
A, YCRD |
; которое является ограничителем для |
160 |
LD |
(IX+1),A |
; генератора псевдослучайных чисел) |
170 |
LD |
C, #0F |
;Для определения скорости движения осколков |
180 LOOP |
CALL |
RNDA |
;генерируем число 0-15 и вычитаем 8, |
190 |
SUB |
#08 |
; получая число -8...+ 8; но если получаем |
200 |
JR |
Z,LOOP |
;скорость=0, то повторная генерация и |
210 |
LD |
(IX+2),A |
;повторная проверка. |
220 |
LD |
(KEY0+1),A |
; Помещаем скорость по оси X в буфер и |
230 |
CALL |
RNDA |
; флаг первого запуска (о нем позже). |
240 |
SUB |
#08 |
; Аналогично рассчитываем скорость по Y, |
250 |
LD |
(IX+3),A |
;но без проверки на 0; засылаем в буфер |
260 |
LD |
DE,#0004 |
;Переход к следующему элементу буфера на |
270 |
ADD |
IX, DE |
;4 байта вперед или возврат в Бейсик, |
280 |
DJNZ |
I NI T |
; если весь массив проинициализирован |
290 |
RET |
|
;Расклад: X, Y, скорость X, скорость Y. |
300 EXPL |
LD |
IX,DATA |
;--- Основной блок --- |
310 |
LD |
BC,#FFFF |
; В ВС - счётчик на "активные осколки". |
78 |
ЭТЮДЫ
320 |
TYPE |
LD |
A,(IX+1) |
;Если коорд.=255 (чего быть не может), |
330 |
|
INC |
A |
;значит осколок улетел за край экрана, |
340 |
|
JR |
Z, NEXT |
;поэтому переход без печати на экране |
350 |
KEY0 |
LD |
A,#FF |
;Если флаг 1 -го запуска 7-00, то обходим |
360 |
|
OR |
A |
;вызов гашения точек (при первом проходе |
370 |
|
CALL |
Z,CALC |
;выключать нечего - осколков ещё нет) |
380 |
|
LD |
A, (IX+0) |
;Вычисляем новую Х-координату осколка: |
390 |
|
ADD |
A, (IX+2) |
; складываем текущую координату и смещение |
400 |
|
CP |
#08 |
; Если точка улетела за край экрана, |
410 |
|
JR |
C, STOP |
; то выключаем её |
420 |
|
LD |
(IX+0),A |
;3апоминаем новую координату в буфере. |
430 |
|
LD |
A, (IX+1) |
;Аналогичные действия проводим и над |
440 |
|
ADD |
A, (IX+3) |
;Y-координатой, проверяя достижение |
450 |
|
CP |
#B0 |
;"осколком" верхней или нижней |
460 |
|
JR |
C, CONT |
; части экрана |
470 |
STOP |
LD |
(IX+1),#FF |
;3десь заносим в Y-координату 255, что |
480 |
|
JR |
NEXT |
;означает выключение осколка. |
490 |
CONT |
LD |
(IX+1),A |
;3апоминаем новую Y-координату в буфере |
500 |
|
CALL |
CALC |
; и выполняем печать нового осколка |
510 |
|
INC |
C |
; корректируем число |
520 |
NEXT |
LD |
DE,#0 0 04 |
; оставшихся точек и |
530 |
|
ADD |
IX, DE |
; переходим к следующему |
540 |
|
DJNZ |
TYPE |
; элементу массива |
550 |
|
INC |
C |
; Если улетели не все осколки, то повтор |
560 |
|
LD |
A, D |
; основного блока сначала (только |
570 |
|
LD |
(KEY0+1),A |
; выключаем флаг первого прохода) |
580 |
|
JR |
NZ,EXPL |
; Если точки улетели, |
590 |
|
RET |
|
; то выход в Бейсик. |
600 |
CALC |
PUSH |
BC |
;--- Подпрограмма печати осколков --- |
610 |
|
LD |
C,(IX+0) |
;В С заносим из буфера Х-координату, |
620 |
|
LD |
A, (IX+1) |
;А - Y-координату |
630 |
|
CALL |
#22B0 |
;Вызываем из ПЗУ подпрограмму |
640 |
|
LD |
B, A |
; расчёта адреса |
650 |
|
INC |
B |
; и формируем осколок - |
660 |
MOVE |
RRCA |
|
;- 1, 2 или 3 точки. |
670 |
|
DJNZ |
MOVE |
|
680 |
|
XOR |
(HL) |
; Закладываем по XOR на имеющееся |
690 |
|
LD |
(HL),A |
;изображение. |
700 |
|
AND |
#10 |
|
710 |
|
OR |
0 |
;3десь задается цвет BORDER'a во время |
720 |
|
OUT |
(# FE) , A |
;исполнения эффекта (первоначально 0). |
730 |
|
POP |
BC |
|
740 |
|
RET |
|
|
750 |
RNDA |
LD |
DE,0 |
;--- Генератор псевдослучайных чисел --- |
760 |
|
LD |
H, E |
; Генерирует |
770 |
|
LD |
L, #FD |
; псевдослучайное |
780 |
|
LD |
A, D |
; число |
790 |
|
OR |
D |
;в |
800 |
|
SBC |
HL, DE |
; диапазоне |
810 |
|
SBC |
A, 0 |
; от |
820 |
|
SBC |
HL, DE |
; нуля |
830 |
|
SBC |
A, 0 |
; до |
ЭТЮДЫ
840 |
LD |
E, A |
;числа, |
850 |
LD |
D, 0 |
;содержащегося |
860 |
SBC |
HL, DE |
;в |
870 |
JR |
NC,RND1 |
;регистре |
880 |
INC |
HL |
;C |
890RND1 |
LD |
(RNDA+1) |
,HL ;Генератор |
900 |
CP |
C |
; практически |
910 |
JR |
NC,RNDA |
; не |
920 |
RET |
|
;изменён |
93 0 DATA |
DEFS |
1020 |
;3десь будет сформирован |
■ динамичной информации о координатах,
■ скорости и состоянии осколков в таком
■ формате: Х-координата (относительно левого ; верхнего угла) Y-координата скорость
■ точки по оси X скорость по оси Y (все в ^пикселях). Итого для 255 элементов по 4 мбайта = 1020 байтов
а кодов (без буфера для формирования данных) равна 183 |
байта |
C350 |
DD |
21 |
07 |
C4 |
06 |
FF |
0E |
48 |
37 |
C358 |
CD |
E8 |
C3 |
C6 |
60 |
DD |
77 |
00 |
0D |
C360 |
0E |
10 |
CD |
E8 |
C3 |
C6 |
48 |
DD |
A4 |
C368 |
77 |
01 |
0E |
0F |
CD |
E8 |
C3 |
D6 |
0E |
C370 |
08 |
28 |
F9 |
DD |
77 |
02 |
32 |
97 |
7B |
C378 |
C3 |
CD |
E8 |
C3 |
D6 |
08 |
DD |
77 |
A8 |
C380 |
03 |
11 |
04 |
00 |
DD |
19 |
10 |
CE |
2 F |
C388 |
C9 |
DD |
21 |
07 |
C4 |
01 |
FF |
FF |
DC |
C390 |
DD |
7E |
01 |
3C |
28 |
2A |
3E |
FF |
7A |
C398 |
B7 |
CC |
CF |
C3 |
DD |
7E |
00 |
DD |
A8 |
C3A0 |
86 |
02 |
FE |
08 |
38 |
0D |
DD |
77 |
8A |
C3A8 |
00 |
DD |
7E |
01 |
DD |
86 |
03 |
FE |
2B |
C3B0 |
B0 |
38 |
06 |
DD |
36 |
01 |
FF |
18 |
8C |
C3B8 |
07 |
DD |
77 |
01 |
CD |
CF |
C3 |
0C |
42 |
C3C0 |
11 |
04 |
00 |
DD |
19 |
10 |
C9 |
0C |
73 |
C3C8 |
7A |
32 |
97 |
C3 |
20 |
BB |
C9 |
C5 |
FA |
C3D0 |
DD |
4E |
00 |
DD |
7E |
01 |
CD |
B0 |
97 |
C3D8 |
22 |
47 |
04 |
0F |
10 |
FD |
AE |
77 |
49 |
C3E0 |
E 6 |
10 |
F6 |
00 |
D3 |
FE |
C1 |
C9 |
EA |
C3E8 |
11 |
00 |
00 |
63 |
2E |
FD |
7A |
B2 |
76 |
C3F0 |
ED |
52 |
DE |
00 |
ED |
52 |
DE |
00 |
ED |
C3F8 |
5F |
16 |
00 |
ED |
52 |
30 |
01 |
23 |
C3 |
C400 |
22 |
E9 |
C3 |
B9 |
30 |
E2 |
C9 |
00 |
26 |
Программа состоит из двух частей: инициализатора и основного исполняемого модуля. Инициализатор подготавливает буфер-ячейки памяти, определяющие поведение осколков. Они используются программой при работе основного исполняемого модуля, непосредственно воспроизводящего эффект. Обе части программы объединены в блоке двумя точками входа: для исполняемого модуля адрес будет равен ORG+57, где ORG - адрес ассемблирования.
Буфер, создаваемый инициализатором, необходим для хранения динамической информации о координатах, скорости и состоянии осколков.
Теперь о том, как использовать процедуру. Допустим, что Вы хотите "взорвать" прямоугольную часть экрана, левый верхний угол которого имеет координаты AT 10,8 (в знакоместах), длиной в 6, высотой в 2 символа. Умножьте каждое из этих чисел на 8 и при
ЭТЮДЫ
ассемблировании занесите получившиеся числа в переменные XCRD, YCRD, XLEN, YHGT. Для занесения координат в уже готовый блок, можно воспользоваться командами: POKE ORG+ 7,XLEN POKE ORG+12,XCRD POKE ORG+17,YHGT POKE ORG+22,YCRD
После передачи параметров запускайте инициализатор с адреса ORG. Далее придётся прибегнуть к маленькой хитрости: после инициализации будет необходимо удалить изображение во взрываемом прямоугольнике экрана, так как основная программа этого не сделает! Дело в том, что инициализатор подготавливает массив, используя случайные данные, поэтому нет контроля за тем, что находится в этом месте экрана (можно взорвать даже пустой прямоугольник). Но это несёт в себе и определенные преимущества, так как если взрываемый прямоугольник содержит в себе участок фона или пейзажа, который взрывать не надо, то после инициализации удалите (по XOR) только то, что собираетесь действительно взорвать (удалить с экрана). А разлетающиеся осколки не испортят основной фон.
Запуск взрывателя производится с адреса ORG+57.
Приведённая ниже Бейсик-программа предназначена для демонстрационной работы (автостарт со 2-й строки). Параметры для этого примера заданы в листинге на ассемблере.
1 GO ТО 4
2 BORDER 0: PAPER 0: INK 7: ВRIGHT 1: CLEAR 49999
3 RANDOMIZE USR 15619: REM : LOAD "expl" CODE 50000
4 FOR a=10 6 TO 160 STEP 6: CIRCLE a,96,8: NEXT a: RANDOMIZE USR 50000:
CLS : RANDOMIZE USR 50057: GO TO 4
Мне хотелось бы приобрести новых друзей по "Спекки". Если кого-то заинтересовали мои процедуры "СНЕГ" (см. ZX-РЕВЮ-95, № 2, стр. 30) и EXPLOSION, можете написать мне. О себе: мне 15 лет. Интересуюсь разработкой графических эффектов на АССЕМБЛЕРЕ.
103460, г. Москва, К-460, корп. 1202, кв. 97. _Щербакову Роману._
************************************************************************************* © Гревцев Я.В., г. Барнаул.
Процедура "Звезды-2"
Предлагаю процедуру, которая является дальнейшим развитием программ "Звезды" и "Падающий снег", ранее опубликованных в ZX-РЕВЮ. Моя процедура, а я назвал её "Звезды-2", выводит на экран вспыхивающие и затухающие, качественно выполненные звезды. Эффект поразительно похож на тот, что реализован в титульном меню программы EXOLON, а также в некоторых "музыкальных" загрузчиках. Именно из одного из них я и срисовал шаблоны звёзд. Кроме этого внимательный читатель наверняка заметит, что все подпрограммы, используемые мною в процедуре, уже "засветились" в различных изданиях ИНФОРКОМА. Смею надеяться, что именно это поможет без помех разобраться в данной процедуре даже начинающим программистам. Всё это является примером того, как из в общем-то известных вещей можно составить нечто новое.
Принцип действия процедуры несложен: сначала данные о звезде записываются в массив описаний. Каждая звезда задается тремя параметрами.
1 и 2 байты - координаты звезды в дисплейном файле.
3 байт - номер текущего спрайта.
4 байт - текущая фаза жизни звезды.
Далее все просто: организуется счётчик по количеству звёзд. За каждый проход печатается новый спрайт размером 2x2 знакоместа. Когда звезда угасает, случайным образом находятся и записываются в массив новые для неё координаты.
Всё это великолепие продолжается до тех пор, пока не будет нажата клавиша BREAK (CAPS SHIFT+SPACE). "Подвесить" процедуру на прерывания 2 рода наверняка не составит
ЭТЮДЫ
большого труда для просвещенных читателей ZX-РЕВЮ. Неплохо было бы объединить "Звезды-2" с процедурой "Падающий снег" - эффект был бы впечатляющий.
ИФК: При использовании процедуры в качестве "8сгееп-сейвера", сохраняющего ресурс монитора, необходимо добавить подпрограммы сохранения изображения с экрана в специальном буфере и очистку экрана перед вызовом "Звёзд-2", подпрограмму подсчёта количества прерываний и анализа нажатия на клавиши, а также подпрограмму восстановления изображения после первого нажатия на любую клавишу. Однако всё это Вы можете найти в предыдущих выпусках ZX-РЕВЮ.
1 2
ORG ENT
50000 $
3 ;
4 |
|
LD |
IX,MASS |
;Адрес массива описаний звёзд. |
5 |
|
LD |
B, 20 |
;Количество звезд. |
6 S |
1 |
CALL |
INIT |
;Инициализация координат звезды ;в дисплейном файле. |
7 |
|
CALL |
PRINT |
;Печать звезды. |
8 |
|
LD |
DE,#0004 |
;Смещение до следующего |
9 |
|
ADD |
IX, DE |
;элемента массива. |
10 |
|
DJNZ |
S_1 |
;Инициализация всего массива. |
11 |
BEGIN |
LD |
IX,MASS |
; |
12 |
|
LD |
B, 20 |
;Количество звёзд. |
13 |
S 2 |
LD |
HL,7 50 |
;Задержка времени. Скорость |
14 |
S_4 |
DEC |
HL |
;вспыхивания и угасания звёзд, |
15 |
|
LD |
A, H |
; зависит от их количества, а |
16 |
|
OR |
L |
; также от содержимого |
17 |
|
JR |
NZ, S 4 |
; регистра HL |
18 |
|
CALL |
PRINT |
;Напечатав звезду поверх её самой, ;мы тем самым стираем её. |
19 |
|
LD |
A, (IX+3) |
;В аккумуляторе число, характеризующее ;фазу жизни звезды. |
20 |
|
AND |
A |
;Сравниваем с нулем. |
21 |
|
JR |
Z, UGAS |
;Если ноль, значит звезда угасает. ;Иначе... Звезда вспыхивает. |
22 |
|
LD |
A, (IX+2) |
;Номер текущего спрайта. |
23 |
|
INC |
A |
; Предыдущий уже стёрт, переходим на ;следующий. |
24 |
|
CP |
5 |
;Заодно проверяем, не был ли ;это последний спрайт. |
25 |
|
JR |
NZ, S 3 |
;Если нет, то переход на печать. Иначе ;звезда должна угасать. Значит, печатаем ;спрайты в обратной последовательности. ;Поэтому. |
26 |
|
LD |
(IX+3),0 |
;Фаза жизни теперь равна нулю. |
27 |
|
DEC |
A |
; Становимся на один |
28 |
|
DEC |
A |
; спрайт ниже . |
29 |
|
JR |
S_3 |
;Спокойно идём на печать. ;Звезда угасает. |
30 |
UGAS |
DEC |
(IX+2) |
;Уменьшили номер спрайта ни единицу. |
31 |
|
JR |
NZ,S 3A |
; Если это был последний спрайт, то сие ;означает, что звезда сгорела. Теперь она ;должна вспыхнуть в другом месте. |
32 |
|
LD |
(IX+3),1 |
;Соответственно изменилась и фаза. |
ЭТЮДЫ
33 |
|
|
CALL |
I NI T |
;Ищем новые координаты звезды. |
34 |
|
|
LD |
A, 1 |
;Печать новой звезды начинается |
35 |
S |
3 |
LD |
(IX+2),A |
;всегда с первого спрайта. |
36 |
S_ |
3A |
CALL |
PRINT |
;Печатаем спрайт. |
37 |
|
|
LD |
DE, #0004 |
; Смещение до следующего |
38 |
|
|
ADD |
IX, DE |
;элемента массива. |
39 |
|
|
PUSH |
BC |
;Процедура проверки клавиш. |
40 |
|
|
LD |
BC,#FEFE |
;При одновременном нажатии |
41 |
|
|
IN |
A, (C) |
;CAPS SHIFT и SPACE (BREAK) |
42 |
|
|
AND |
1 |
; происходит очистка экрана |
43 |
|
|
LD |
E, A |
; от звёзд и выход |
44 |
|
|
LD |
BC,#7 FFE |
;из процедуры. |
45 |
|
|
IN |
A, (C) |
; |
46 |
|
|
AND |
1 |
;Можно организовать выход |
47 |
|
|
OR |
E |
;любым другим способом. |
48 |
|
|
JR |
NZ, S 6 |
; |
49 |
|
|
LD |
IX,MASS |
; |
50 |
|
|
LD |
B, 20 |
; |
51 |
S_ |
5 |
CALL |
PRINT |
; |
52 |
|
|
LD |
DE, #0004 |
; |
53 |
|
|
ADD |
IX, DE |
; |
54 |
|
|
DJNZ |
S_5 |
; |
55 |
|
|
POP |
BC |
; |
56 |
|
|
RET |
|
; |
57 |
S_ |
6 |
POP |
BC |
; |
58 |
|
|
DJNZ |
S_2 |
;Повтор для каждой звезды. |
59 |
|
|
JR |
BEGIN |
;Повтор до нажатия BREAK. |
; Подпрограмма инициализации одного элемента массива. ; Случайным образом находит и записывает в ячейки ; (IX+0) и (IX+1) координаты звезды в дисплейном файле.
60 INIT |
LD |
HL,(23670) |
; Подпрограмма взята |
61 |
LD |
DE, (23672) |
;из ZX-РЕВЮ-93 № 5-6, стр. 97 |
62 |
ADD |
HL, DE |
|
|
63 |
LD |
(23670) |
, HL |
;Аналогично команде Бейсика |
64 |
LD |
A, L |
|
;INT (RND* 32) . |
65 |
AND |
31 |
|
;B A число от 0 до 31. |
66 |
LD |
D, A |
|
;Записали координату Х. |
67 |
PUSH |
DE |
|
|
68 |
LD |
HL, (23670) |
|
69 |
LD |
DE, (23672) |
|
70 |
ADD |
HL, DE |
|
|
71 |
LD |
(23670) |
, HL |
|
72 |
LD |
A, H |
|
|
73 |
AND |
15 |
|
|
74 |
LD |
H, A |
|
|
75 |
LD |
A, L |
|
; Аналогично команде Бейсика |
76 |
AND |
7 |
|
;INT (RND*23). |
77 |
ADD |
A, H |
|
;В А число от 0 до 23. |
78 |
POP |
DE |
|
|
79 |
LD |
E, A |
|
; Записали координату Y. |
; Отсюда начинается расчёт адреса в дисплейном файле. ; К этому моменту в DE - координаты звезды в знакоместах.
ЭТЮДЫ
; Эта |
часть программы |
взята |
из ZX-РЕВЮ-93 № 3, стр. 4 4 |
80 |
AND |
#18 |
|
|
81 |
ADD |
A, #40 |
|
;Старший байт сформирован |
82 |
LD |
(IX+0 |
) , A |
;и записан в массив. |
83 |
LD |
A, E |
|
|
84 |
AND |
7 |
|
|
85 |
RRCA |
|
|
; |
86 |
RRCA |
|
|
; |
87 |
RRCA |
|
|
; |
88 |
ADD |
A, D |
|
;Младший байт сформирован |
89 |
LD |
(IX+1 |
) , A |
;и записан в массив. |
90 |
RET |
|
|
|
Подпрограмма печати (стирания) звезды. Взята из ZX-FORUM-1 стр. 130
91 PRINT |
PUSH |
BC |
;Запомнили ВС для корректного ;выхода из подпрограммы. |
92 |
LD |
B,(IX+2) |
;Приняли номер шаблона спрайта. ;Организовали счётчик шаблонов. |
93 |
LD |
DE,32 |
;Длина шаблона 32 байта. |
94 |
LD |
HL,STAR-32 |
;Адрес указывает на одну длину ;спрайта ниже, чем начало таблицы. |
95 PR 1 |
ADD |
HL,DE |
;Смещение на длину шаблона. |
96 |
DJNZ |
PR 1 |
;Повторяем столько раз, каков номер ;шаблона. В результате HL указывает на ;положение искомого спрайта в таблице. |
97 |
LD |
D,(IX+0) |
;DE указывает на адрес |
98 |
LD |
E, (IX+1) |
;в дисплейном файле. |
99 |
LD |
B, 2 |
;В - счётчик строк. |
100 PR 2 |
PUSH |
BC |
; |
101 |
PUSH |
DE |
; |
102 |
LD |
B, 8 |
; |
103 PR 3 |
PUSH |
BC |
; |
104 |
PUSH |
DE |
|
105 |
LD |
B, 2 |
;В - счётчик столбцов. |
106 PR 4 |
LD |
A,(DE) |
; Загрузили аккумулятор ;очередным байтом экрана. |
107 |
XOR |
(HL) |
;Слияние по XOR с очередным байтом шаблона. |
108 |
LD |
(DE) , A |
;Печать байта на экран по XOR. |
109 |
INC |
DE |
; |
110 |
INC |
HL |
|
111 |
DJNZ |
PR 4 |
|
112 |
POP |
DE |
|
113 |
POP |
BC |
; |
114 |
INC |
D |
; |
115 |
DJNZ |
PR 3 |
; |
116 |
POP |
DE |
; |
117 |
POP |
BC |
; |
118 |
LD |
A, 32 |
|
119 |
ADD |
A, E |
; |
120 |
LD |
E, A |
|
121 |
JR |
NC,PASS |
; |
122 |
LD |
A, 8 |
; |
123 |
ADD |
A, D |
|
ЭТЮДЫ
124 LD D, A ;
12 5 PASS DJNZ PR_2 ;
12 6 POP BC ; Восстановили BC.
12 7 RET ;Выход.
; Массив описаний для 2 0 звёзд.
; Для описания каждой звёзды необходимо 4 байта: ; 2 байта - координаты в дисплейном файле; ; 3-й байт - номер текущего спрайта;
; 4-й байт - фаза жизни звёзды.
128 |
MASS |
DEFB |
#00, |
#00, |
#01, |
#01, |
#00, |
#00, |
#01, |
#01 |
129 |
|
DEFB |
#00, |
#00, |
#02, |
#00, |
#00, |
#00, |
#02, |
#01 |
130 |
|
DEFB |
#00, |
#00, |
#03, |
#00, |
#00, |
#00, |
#03, |
#01 |
131 |
|
DEFB |
#00, |
#00, |
#03, |
#00, |
#00, |
#00, |
#03, |
#01 |
132 |
|
DEFB |
#00, |
#00, |
#04, |
#00, |
#00, |
#00, |
#01, |
#01 |
133 |
|
DEFB |
#00, |
#00, |
#03, |
#00, |
#00, |
#00, |
#03, |
#01 |
134 |
|
DEFB |
#00, |
#00, |
#04, |
#00, |
#00, |
#00, |
#02, |
#01 |
135 |
|
DEFB |
#00, |
#00, |
#03, |
#00, |
#00, |
#00, |
#03, |
#01 |
136 |
|
DEFB |
#00, |
#00, |
#02, |
#00, |
#00, |
#00, |
#02, |
#01 |
137 |
|
DEFB |
#00, |
#00, |
#04, |
#00, |
#00, |
#00, |
#03, |
#01 |
; Таблица |
шаблонов звёзд. |
|
|
|
|
|
|
; 4 |
шаблона размером |
2x2 |
знакоместа . |
|
|
|
139 |
STAR |
DEFB |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00 |
140 |
|
DEFB |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#80 |
141 |
|
DEFB |
#01, |
#C0, |
#00, |
#80, |
#00, |
#00, |
#00, |
#00 |
142 |
|
DEFB |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00 |
143 |
|
; |
|
|
|
|
|
|
|
|
144 |
|
DEFB |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00 |
145 |
|
DEFB |
#00, |
#00, |
#00, |
#80, |
#00, |
#00, |
#00, |
#80 |
146 |
|
DEFB |
#05, |
#D0, |
#00, |
#80, |
#00, |
#00, |
#00, |
#80 |
147
1 Л Я
148 |
|
DEFB |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00, |
#00 |
149 |
|
;
DEFB |
#00, |
#00, |
#00, |
#00, |
#00, |
#80, |
#00, |
#00 |
150 |
|
DEFB |
#00, |
#80, |
#00, |
#90, |
#02, |
#80, |
#01, |
#C0 |
151 |
|
DEFB |
#2 F, |
#F4, |
#01, |
#C0, |
#00, |
#A0, |
#04, |
#80 |
152 |
|
DEFB |
#00, |
#00, |
#00, |
#80, |
#00, |
#00, |
#00, |
#00 |
153 |
|
; |
|
|
|
|
|
|
|
|
154 |
|
DEFB |
#00, |
#80, |
#00, |
#00, |
#00, |
#80, |
#10, |
#08 |
155 |
|
DEFB |
#00, |
#80, |
#04, |
#80, |
#02, |
#A0, |
#01, |
#C0 |
156 |
|
DEFB |
#5F, |
#FD, |
#01, |
#C0, |
#02, |
#80, |
#04, |
#90 |
157 |
|
DEFB |
#00, |
#88, |
#10, |
#80, |
#00, |
#00, |
#00, |
#80 |
Длина блока кодов процедуры равна 445 байт:
C350 |
DD |
21 |
3D |
C4 |
06 |
14 |
CD |
CD |
C6 |
C358 |
C3 |
CD |
04 |
C4 |
11 |
04 |
00 |
DD |
65 |
C360 |
19 |
10 |
F3 |
DD |
21 |
3D |
C4 |
06 |
44 |
C368 |
14 |
21 |
EE |
02 |
2B |
7C |
B5 |
20 |
CC |
C370 |
FB |
CD |
04 |
C4 |
DD |
7E |
03 |
A7 |
C8 |
C378 |
28 |
10 |
DD |
7E |
02 |
3C |
FE |
05 |
0F |
C380 |
20 |
16 |
DD |
36 |
03 |
00 |
3D |
3D |
09 |
C388 |
18 |
0E |
DD |
35 |
02 |
20 |
0C |
DD |
8E |
C390 |
36 |
03 |
01 |
CD |
CD |
C3 |
3E |
01 |
29 |
C398 |
DD |
77 |
02 |
CD |
04 |
C4 |
11 |
04 |
5B |
C3A0 |
00 |
DD |
19 |
C5 |
01 |
FE |
FE |
ED |
08 |
ЭТЮДЫ
C3A8 |
78 |
E6 |
01 |
5F |
01 |
FE |
7F |
ED |
94 |
C3B0 |
78 |
E6 |
01 |
B3 |
20 |
12 |
DD |
21 |
B5 |
C3B8 |
3D |
C4 |
06 |
14 |
CD |
04 |
C4 |
11 |
3C |
C3C0 |
04 |
00 |
DD |
19 |
10 |
F6 |
C1 |
C9 |
0D |
C3C8 |
C1 |
10 |
9E |
18 |
96 |
2A |
76 |
5C |
A4 |
C3D0 |
ED |
5B |
78 |
5C |
19 |
22 |
76 |
5C |
BC |
C3D8 |
7D |
E6 |
1F |
57 |
D5 |
2A |
76 |
5C |
45 |
C3E0 |
ED |
5B |
78 |
5C |
19 |
22 |
76 |
5C |
CC |
C3E8 |
7C |
E6 |
0F |
67 |
7D |
E6 |
07 |
84 |
71 |
C3F0 |
D1 |
5F |
E6 |
18 |
C6 |
40 |
DD |
77 |
3B |
C3F8 |
00 |
7B |
E6 |
07 |
0F |
0F |
0F |
82 |
D2 |
C400 |
DD |
77 |
01 |
C9 |
C5 |
DD |
46 |
02 |
CC |
C408 |
11 |
20 |
00 |
21 |
6D |
C4 |
19 |
10 |
78 |
C410 |
FD |
DD |
56 |
00 |
DD |
5E |
01 |
06 |
46 |
C418 |
02 |
C5 |
D5 |
06 |
08 |
C5 |
D5 |
06 |
26 |
C420 |
02 |
1A |
AE |
12 |
13 |
23 |
10 |
F9 |
FF |
C428 |
D1 |
C1 |
14 |
10 |
F0 |
D1 |
C1 |
3E |
62 |
C430 |
20 |
83 |
5F |
30 |
04 |
3E |
08 |
82 |
F2 |
C438 |
57 |
10 |
DE |
C1 |
C9 |
00 |
00 |
01 |
CC |
C440 |
01 |
00 |
00 |
01 |
01 |
00 |
00 |
02 |
09 |
C448 |
00 |
00 |
00 |
02 |
01 |
00 |
00 |
03 |
12 |
C450 |
00 |
00 |
00 |
03 |
01 |
00 |
00 |
03 |
1B |
C458 |
00 |
00 |
00 |
03 |
01 |
00 |
00 |
04 |
24 |
C460 |
00 |
00 |
00 |
01 |
01 |
00 |
00 |
03 |
29 |
C468 |
00 |
00 |
00 |
03 |
01 |
00 |
00 |
04 |
34 |
C470 |
00 |
00 |
00 |
02 |
01 |
00 |
00 |
03 |
3A |
C478 |
00 |
00 |
00 |
03 |
01 |
00 |
00 |
02 |
42 |
C480 |
00 |
00 |
00 |
02 |
01 |
00 |
00 |
04 |
4B |
C488 |
00 |
00 |
00 |
03 |
01 |
00 |
00 |
00 |
50 |
C490 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
54 |
C498 |
00 |
00 |
00 |
00 |
80 |
01 |
C0 |
00 |
9D |
C4A0 |
80 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
E4 |
C4A8 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
6C |
C4B0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
74 |
C4B8 |
80 |
00 |
00 |
00 |
80 |
05 |
D0 |
00 |
51 |
C4C0 |
80 |
00 |
00 |
00 |
80 |
00 |
00 |
00 |
84 |
C4C8 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
8C |
C4D0 |
00 |
00 |
80 |
00 |
00 |
00 |
80 |
00 |
94 |
C4D8 |
90 |
02 |
80 |
01 |
C0 |
2F |
F4 |
01 |
93 |
C4E0 |
C0 |
00 |
A0 |
04 |
80 |
00 |
00 |
00 |
88 |
C4E8 |
80 |
00 |
00 |
00 |
00 |
00 |
80 |
00 |
AC |
C4F0 |
00 |
00 |
80 |
10 |
08 |
00 |
80 |
04 |
D0 |
C4F8 |
80 |
02 |
A0 |
01 |
C0 |
5F |
FD |
01 |
FC |
C500 |
C0 |
02 |
80 |
04 |
90 |
00 |
88 |
10 |
33 |
C508 |
80 |
00 |
00 |
00 |
80 |
00 |
00 |
00 |
CD |
************************************************************************************* © С. Астров, г. Чебоксары, 1995.
Процедура "Линии"
Я предлагаю программу, аналогичную программе "Звёзды" (2Х-РЕВЮ-94, № 5, стр. 5), предназначенную для сохранения ресурса видеомонитора. Во время дежурного режима на экране появляются и исчезают голубые горизонтальные линии-штрихи размером 8x1 пиксель. Полоски не
ЭТЮДЫ
так привычны, как "звёзды" в Norton Commander, но и не так круто, как "горящий" экран в DOS Navigator (IBM PC). Зато моя программа "дешевле" - всего 59 байт.
Предлагаемая процедура предназначена для монохромного экрана, так как не использует дополнительной памяти для буфера. С экрана удаляются только атрибуты, а сама картинка -остается. Например, она может использоваться в появляющихся в последнее время резидентных "расширителях" функций встроенного БЕЙСИК-редактора. Программа легко может быть переделана и для цветного экрана (об этом см. ниже).
Полоски получаются так: в каком-либо знакоместе включается атрибут (PAPER 5; INK 5) и через 18 тактов процессора выключается (PAPER 0; INK 0). За это короткое время SPECCY не успевает закрасить весь квадрат атрибутов (8x8), а успевает только прорисовать полоску 8x1 пиксель.
При выходе из процедуры восстанавливаются атрибуты из ATTR_P (23693), а цвет бордюра - из BORDER (23693).
1 |
ORG |
50000 |
2 TIME |
EQU |
12 |
3 LINES |
LD |
A,(23673) |
4 |
CP |
TIME |
5 |
RET |
C |
6 |
XOR |
A |
7 |
LD |
(23560),A |
8 |
OUT |
(# FE) , A |
9 |
CALL |
FILL |
10 |
LD |
D, A |
11 LOOP |
LD |
HL,22530 |
12 |
ADD |
HL, DE |
13 |
ADD |
HL, DE |
14 |
ADD |
HL, DE |
15 |
LD |
(HL),45 |
16 |
INC |
E |
17 |
LD |
A, (23560) |
18 |
AND |
A |
19 |
LD |
(HL),D |
20 |
JR |
Z, LOOP |
21 |
LD |
HL,255 |
22 |
LD |
E, L |
23 |
CALL |
#03B5 |
24 |
LD |
A, ( 23693) |
25 FILL |
LD |
HL,22528 |
26 |
LD |
DE, 22529 |
27 |
LD |
BC,767 |
28 |
LD |
(HL),A |
29 |
LDIR |
|
30 |
XOR |
A |
31 |
LD |
(23673),A |
32 |
RET |
|
Вызывающая программа после каждого нажатия клавиши должна обнулять содержимое ячейки 23673 (второго байта FRAMES). Периодически вызывая подпрограмму LINES, надо проверять флаг CARRY; если он выключен - то экран в дежурном режиме, если включен - то нет.
Для демонстрационного запуска процедуры "Lines" дополните листинг, приведенный выше, следующими строками (точка входа ENT, учитывая длину процедуры LINES, будет соответствовать адресу 50059): 33 ;EXAMPLE
34 |
;----- |
|
|
35 |
|
ENT |
$ |
36 |
|
CALL |
#0D6B |
37 |
|
LD |
A, 2 |
38 |
|
CALL |
#1601 |
39 |
IIN |
XOR |
A |
40 |
|
LD |
(23673),A |
41 |
|
RES |
5,(IY+1) |
42 |
WAIT |
CALL |
LINES |
43 |
|
JR |
NC,IIN |
44 |
|
BIT |
5,(IY+1) |
45 |
|
JR |
Z , WAI T |
46 |
|
LD |
A, (23560) |
47 |
|
CP |
32 |
48 |
|
RET |
Z |
49 |
|
RST |
#10 |
50 |
|
JR |
IIN |
Этот фрагмент аналогичен приведённому для процедуры "Звёзды" в указанном выше номере ZX-РЕВЮ. Продемонстрировать работу процедуры поможет Бейсик-программа (автостарт со 2 строки):
1 GO ТО 10
2 BORDER 1: PAPER 1: INK 7: CLEAR 4 9999
3 RANDOMIZE USR 15619: REM : LOAD "lines1" CODE 10 BEEP .1,20: RANDOMIZE USR 50059
После старта Вы услышите звуковой сигнал. Наберите на экране что-нибудь, пользуясь цифровыми и буквенными клавишами, а также клавишей ENTER. Не трогайте клавиатуру 1 минуту - программа перейдет в дежурный режим. Теперь нажмите любую клавишу - изображение восстановится. Для завершения работы - нажмите SPACE или BREAK.
Шестнадцатеричный дамп процедуры (с демонстрационным блоком строки 33-50 - файл "lines" CODE 50000,95):
C350 |
3A |
79 |
5C |
FE |
0C |
D8 |
AF |
32 |
E5 |
C358 |
08 |
5C |
D3 |
FE |
CD |
7A |
C3 |
57 |
B1 |
C360 |
21 |
02 |
58 |
19 |
19 |
19 |
36 |
2D |
4C |
C368 |
1C |
3A |
08 |
5C |
A7 |
72 |
28 |
F0 |
16 |
C370 |
21 |
FF |
00 |
5D |
CD |
B5 |
03 |
3A |
6F |
C378 |
8D |
5C |
21 |
00 |
58 |
11 |
01 |
58 |
07 |
C380 |
01 |
FF |
02 |
77 |
ED |
B0 |
AF |
32 |
3A |
C388 |
79 |
5C |
C9 |
CD |
6B |
0D |
3E |
02 |
6E |
C390 |
CD |
01 |
16 |
AF |
32 |
79 |
5C |
FD |
EA |
C398 |
CB |
01 |
AE |
CD |
50 |
C3 |
30 |
F3 |
D8 |
C3A0 |
FD |
CB |
01 |
6E |
28 |
F5 |
3A |
08 |
F9 |
C3A8 |
5C |
FE |
20 |
C8 |
D7 |
18 |
E4 |
00 |
80 |
Если в разных местах экрана атрибуты различны, то появляется необходимость в буфере на 768 байт для хранения атрибутов. Переброску 768 байт файла атрибутов с экрана в буфер нужно вставить вместо CALL FILL в 9 строке. А обратную переброску для восстановления - вместо строк 25-29.
************************************************************************************* © Pentagram Software, 1995.
Атрибутный скроллер
Эта программа предназначена для вывода текста крупной бегущей строкой в нижней трети экрана. Программа работает со вторым режимом прерывания и предназначена для программ-"музыкалок". Этот скроллер был впервые написан RAF (Польша, Вроцлав), затем им пользовался.
ЭТЮДЫ
Bill Gilbert в программе ТОР 128'2, из которой он перекочевал в программы, которые создавали KLAV и Vasilyev Anton (в частности, MSX 1-8, Mega Sound). Я взломал программу Bill Gilbert'a и " вытащил" этот скроллер.
; Attribut IM2-scroller ; Writing by RAF
; Cracked by PENTAGRAMM SOFTWARE ; Kherson, 1995
ORG 52 000 ENT $ DI
LD HL,#4000 ; Очистка экрана.
LD DE, #4001 LD BC,#1AFF LD (HL),L LDIR XOR A OUT (# FE) ,A CALL INIT LD A, 1 ; Вектор прерывания, его можно ; менять, но тогда надо менять ; адрес во втором ORG.
LD I, A ; Включение режима IM 2. IM 2 EI
LOOP HALT
LD A,#7 F ; Опрос клавиатуры.
IN A,(#FE) RRA
JR C, LOOP IM 1 ; 3авершение программы. RET
INIT LD HL,TEXT
LD (CONLET),HL LD A, 2 LD HL,BUFF ; Очистка буфера хранения символа. LD DE, BUFF+1 LD BC,7 LD (HL),0 LDIR
LD (LAB1),A LD A,#81 LD (LAB2),A LD HL,#5000 LD DE, #5001 LD BC,#07FF LD (HL),#FF
ЭТЮДЫ
LDIR |
|
SUB |
A |
LD |
C, A |
LD |
B, #80 |
LD |
DE,#5B0 0 |
PUSH |
AF |
PUSH |
BC |
CALL |
#22B0 |
EX |
DE, HL |
LD |
(HL),E |
INC |
HL |
LD |
(HL),D |
INC |
HL |
EX |
DE, HL |
POP |
BC |
POP |
AF |
INC |
A |
LOOP1 |
|
RET |
|
DEFW |
0 |
DEFS |
8 |
для символа.
LAB1 DEFB
LAB2 DEFB
STK1 DEFW
LD A,(LAB1)
DEC A
CALL Z,SCR1
LD (LAB1),A
CALL SCR3
CALL SCR4
CALL SCR5 RET
LD HL,(CONLET)
LD A,(HL)
CP #FF
CALL Z,SCR2
INC HL
LD (CONLET),HL
LD L, A
LD H, 0
LD DE, ( #5C3 6)
; Адрес
CHARS. |
|
|
ADD |
HL, |
HL |
ADD |
HL, |
HL |
ADD |
HL, |
HL |
ADD |
HL, |
DE |
LD |
DE, |
BUFF |
LD |
BC, |
8 |
LDIR |
|
|
LD |
8
< |
|
RET |
|
|
ЭТЮДЫ
SCR2 LD HL,TEXT
LD A,(HL) RET
SCR3 LD HL,#5A01
; Адрес в файле атрибутов, ; которого начинается ; скроллирование.
LD |
A, 8 |
PUSH |
HL |
LD |
D, H |
LD |
E, L |
DEC |
DE |
LD |
BC, 31 |
LDIR |
|
LD |
(HL),0 |
POP |
HL |
LD |
DE, 32 |
ADD |
HL, DE |
DEC |
A |
JR |
NZ,LOOP2 |
RET |
|
LD |
IX,BUFF |
LD |
DE, 32 |
LD |
HL,#5A1F |
LD |
B, 8 |
RL |
(IX+0) |
PUSH |
AF |
SBC |
A, A |
OR |
2 |
LD |
(HL),A |
ADD |
HL, DE |
DEC |
HL |
POP |
AF |
JR |
NC,SKIP1 |
LD |
A,(HL) |
CP |
#FF |
JR |
Z, SKIP1 |
RES |
1,(HL) |
INC |
HL |
INC |
IX |
DJNZ |
LOOP3 |
RET |
|
LD |
HL,#5700 |
в дисплейном файле.
LD |
(STK1),HL |
LD |
IX, LAB2 |
CALL |
SCR6 |
CALL |
SCR6 |
CALL |
SCR6 |
RLC |
(IX+0) |
RLC |
(IX+0) |
RLC |
(IX+0) |
ЭТЮДЫ
RLC (IX+0) RET
LD (STK2+1),SP
LD SP,(STK1)
LD B, 0
LD E, (IX+0)
LD D, E
PUSH DE
DJNZ LOOP4
LD (STK1),SP
LD SP,0 RET
DEFM "PENTAGRAM "
DEFM "SOFTWARE "
DEFM "PRESENTS "
DEFM "MEGA "
DEFM "SCROLL "
DEFB #FF ; Маркер конца текста.
ORG 52818 ; Адрес по вектору прерываний.
PUSH AF
PUSH BC
PUSH DE
PUSH HL ; Процедура обработки ; прерывания.
PUSH |
IX |
CALL |
SCROLL |
POP |
IX |
POP |
HL |
POP |
DE |
POP |
BC |
POP |
AF |
JP |
#0038 |
|
|