|
Этюды - предлагаю вам программы, написанные лично мной.
|
ЭТЮДЫ
© Вадим Бодров, г. Уфа, 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 |
|
|