© Дмитрий Глотов, г. Нижний Новгород, 1994 г.
Я хочу предложить читателям свою программу "SYMBOL-NINJA". Эту небольшую процедуру можно использовать и для оформления программ, и для оформления загрузчика. Программа по одной букве, оригинальным образом выводит сообщение со звуковым сопровождением. Звуки я создавал с применением программы "SPECSOUND" и после программы привожу дисассемблер этих звуков. Программа выводит одну строку сообщения с одним звуком, а другую - с другим. Итак, программа.
|
00010 |
LEN |
EQU |
63 |
Полная длина сообщения. |
|
00020 |
LEN1 |
EQU |
32 |
Половина длины сообщения. |
|
00030 |
ADR |
EQU |
22464 |
Адрес в дисплейном файле. |
|
00040 |
ORG |
40000 | ||
|
00050 |
ENT | |||
|
00060 |
LD |
HL,LEN |
B HL - длина сообщения. | |
|
00070 |
LD |
(BUFF),HL |
Пересылка ее в буфер. | |
|
00080 |
LD |
BC,ADR |
Место вывода сообщения на экран. | |
|
00090 |
LD |
IY,DATA |
B IY - адрес сообщения. | |
|
00100 |
SCROLL |
LD |
L, (IY) |
Код первого символа сообщения. |
|
00110 |
LD |
H, 0 |
Очистка Н. | |
|
00120 |
PUSH |
IY |
Сохранение регистров на стеке | |
|
00130 |
PUSH |
BC |
для последующих расчетов. | |
|
00140 |
LD |
DE, (23606) |
Расчет места | |
|
00150 |
ADD |
HL, HL |
шаблона символа | |
|
00160 |
ADD |
HL, HL |
в символьном | |
|
00170 |
ADD |
HL, HL |
наборе. | |
|
00180 |
ADD |
HL, DE | ||
|
00190 |
EX |
DE, HL | ||
|
00200 |
LD |
H, B | ||
|
00210 |
LD |
L, C |
B HL - адрес начала вывода символа. | |
|
00220 |
LD |
A, 1 |
Нач. количество выводимых линий символа | |
|
00230 |
LOOP |
LD |
B, A |
Счетчик выводимых на экран линий. |
|
00240 |
PUSH |
DE |
Адрес первой линии символа. | |
|
00250 |
PUSH |
HL |
Адрес начала вывода сообщения. | |
|
00260 |
PUSH |
AF |
в А - количество выводов на экран, для вывода всего символа - 8 повтор. | |
|
00270 |
LOOP1 |
LD |
A,(DE) |
Переброска одной линии |
|
00280 |
LD |
(HL),A |
символа на экран. | |
|
00290 |
PUSH |
BC |
Вызов | |
|
00300 |
CALL |
WAIT |
процедуры | |
|
00310 |
POP |
BC |
задержки. | |
|
00320 |
INC |
DE |
Переход к следующей линии символа. | |
|
00330 |
INC |
H |
Переход к месту печати следующей линии. | |
|
00340 |
DJNZ |
LOOP1 |
Повторение для всех 8 линий символа. | |
|
00350 |
POP |
AF |
Восстановление | |
|
00360 |
POP |
HL |
значений | |
|
00370 |
POP |
DE |
регистров. | |
|
00380 |
DEC |
H |
Переход для вывода на 1 линию выше. | |
|
00390 |
Увеличение счетчика числа выводов. | |||
|
00400 |
CP |
9 |
Если выведены все 8 линий (А=9), | |
|
00410 |
JR |
Z,LOOP2 |
то переход к выводу звука. | |
|
00420 |
JR |
LOOP |
Иначе - возврат и повторение. | |
|
00430 |
LOOP2 |
CALL |
SOUND |
Вызов звука. |
|
00440 |
POP |
BC |
Восстановление адреса вывода сообщения, | |
|
00450 |
POP |
IY |
Восстановление адреса хранения сообщени | |
|
00460 |
INC |
BC |
Переход к следующему знакоместу. | |
|
00470 |
INC |
IY |
Переход к следующему символу. | |
|
00480 |
LD |
A, (IY) |
B A - код символа. | |
|
00490 |
CP |
0 |
Проверка на маркер конца (А=0). | |
|
00500 |
JR |
Z, END |
Если конец достигнут, завершение. | |
|
00510 |
JR |
SCROLL |
Иначе - вывод следующего символа. | |
|
00520 |
WAIT |
LD |
BC,500 |
Время задержки. |
|
00530 |
WAIT1 |
DEC |
BC |
Уменьшение счетчика задержки. |
|
00540 |
LD |
A, B |
Проверка содержимого |
|
ЧШСЯЖЕЛЪ | ||||
|
00550 |
OR |
C |
BC на ноль. | |
|
00560 |
OR |
NZ,WAIT1 ; |
Если нет, то повтор. | |
|
00570 |
RET |
Иначе - возврат. | ||
|
00580 |
END |
LD |
IY,23610 |
Восстанов. IY для корректного завершения |
|
00590 |
RET |
Выход из процедуры. | ||
|
00600 |
DATA |
DEFM |
" WRITTEN BY |
Текст сообщения. |
|
00610 |
DEFM |
" (C)CRYSTAL | ||
|
00620 |
DEFM |
"SOFT 1994 ; | ||
|
00630 |
DEFM |
" N.NOVGOROD | ||
|
00640 |
DEFM |
" TEL. (8312) | ||
|
00650 |
DEFM |
"54-95-320 | ||
|
00660 |
DEFB |
0 |
Маркер конца сообщения. | |
|
00670 |
BUFF |
DEFW |
0 |
Буфер. |
|
00680 |
SOUND |
XOR |
A |
Обнуление А. |
|
00690 |
LD |
HL,(BUFF) |
B HL - длина сообщения. | |
|
00700 |
DEC |
L |
Уменьшили на единицу. | |
|
00710 |
LD |
(BUFF),HL |
Зафиксировали новую длину. | |
|
00720 |
LD |
A, L |
Проверка достижения половины. | |
|
00730 |
CP |
LEN1 ; |
Половина сообщения достигнута? | |
|
00740 |
JR |
CSOUND2 |
Если да, то смена звука. | |
|
00750 |
SOUNDI |
LD |
C,1 ; |
Процедура |
|
00760 |
N1 |
LD |
B, 15 |
"звук 1", |
|
00770 |
N2 |
LD |
HL,100 |
используется |
|
00780 |
PUSH |
BC |
при выводе | |
|
00790 |
LD |
DE,1 ; |
первой | |
|
00800 |
PUSH |
HL |
ПОЛОВИНЫ | |
|
00810 |
CALL |
#03B5 |
сообщения. | |
|
00820 |
POP |
HL | ||
|
00830 |
LD |
DE,100 ; | ||
|
00840 |
ADC |
HL, DE | ||
|
00850 |
POP |
BC | ||
|
00860 |
DJNZ |
N2 | ||
|
00870 |
LD |
A,2 ; | ||
|
00880 |
INC |
C | ||
|
00890 |
LD |
B, C | ||
|
00900 |
CP |
B | ||
|
00910 |
OR |
NZ, N1 | ||
|
00920 |
RET | |||
|
00930 |
SOUND2 |
LD |
C,1 ; |
Процедура |
|
00940 |
N3 |
LD |
B, 3 |
"звук 2", |
|
00950 |
N4 |
LD |
HL,300 |
используется |
|
00960 |
PUSH |
BC |
при выводе | |
|
00970 |
LD |
DE,8 ; |
второй | |
|
00980 |
PUSH |
HL |
половины | |
|
00990 |
CALL |
#03B5 |
сообщения. | |
|
01000 |
POP |
HL | ||
|
01010 |
LD |
DE,300 ; | ||
|
01020 |
ADC |
HL, DE | ||
|
01030 |
POP |
BC | ||
|
01040 |
DJNZ |
N4 | ||
|
01050 |
LD |
A,2 ; | ||
|
01060 |
INC |
C | ||
|
01070 |
LD |
B, C | ||
|
01080 |
CP |
B | ||
|
01090 |
JR |
NZ, N3 | ||
|
01100 |
RET | |||
|
Start |
of object: #9C40 |
(40000) | ||
|
Length |
: #00EB |
(00235) | ||
|
Executes |
: # 9C4 0 |
(40000) | ||
Теперь, как обычно, приводим шестнадцатеричный дамп приведенной процедуры. Стартовый адрес -40000, длина - 235 байт:
|
9C40 |
21 |
3F |
00 |
22 |
DC |
9C |
01 |
C0 |
97 | |
|
9C48 |
57 |
FD |
21 |
9C |
9C |
FD |
6E |
00 |
FC | |
|
9C50 |
26 |
00 |
FD |
E5 |
C5 |
ED |
5B |
36 |
37 | |
|
9C58 |
5C |
29 |
29 |
29 |
19 |
EB |
60 |
69 |
98 | |
|
9C60 |
3E |
01 |
47 |
D5 |
E5 |
F5 |
1A |
77 |
C2 | |
|
9C68 |
C5 |
CD |
8E |
9C |
C1 |
13 |
24 |
10 |
C8 | |
|
9C70 |
F5 |
F1 |
E1 |
D1 |
25 |
3C |
FE |
09 |
0C | |
|
9C78 |
28 |
02 |
18 |
E6 |
CD |
DE |
9C |
C1 |
44 | |
|
9C80 |
FD |
E1 |
03 |
FD |
23 |
FD |
7E |
00 |
98 | |
|
9C88 |
FE |
00 |
28 |
0B |
18 |
BF |
01 |
F4 |
21 | |
|
9C90 |
01 |
0B |
78 |
B1 |
20 |
FB |
C9 |
FD |
42 | |
|
9C98 |
21 |
3A |
5C |
C9 |
20 |
57 |
52 |
49 |
C6 | |
|
9CA0 |
54 |
54 |
45 |
4E |
20 |
42 |
59 |
20 |
52 | |
|
9CA8 |
28 |
43 |
29 |
43 |
52 |
59 |
53 |
54 |
6D | |
|
9CB0 |
41 |
4C |
53 |
4F |
46 |
54 |
20 |
31 |
66 | |
|
9CB8 |
39 |
39 |
34 |
20 |
20 |
4E |
2E |
4E |
04 | |
|
9CC0 |
4F |
56 |
47 |
4F |
52 |
4F |
44 |
20 |
9C | |
|
9CC8 |
54 |
45 |
4C |
2E |
28 |
38 |
33 |
31 |
3B | |
|
9CD0 |
32 |
29 |
35 |
34 |
2D |
39 |
35 |
2D |
F8 | |
|
9CD8 |
33 |
32 |
30 |
00 |
00 |
00 |
AF |
2A |
E2 | |
|
9CE0 |
DC |
9C |
2D |
22 |
DC |
9C |
7D |
FE |
36 | |
|
9CE8 |
20 |
38 |
20 |
0E |
01 |
06 |
0F |
21 |
41 | |
|
9CF0 |
64 |
00 |
C5 |
11 |
01 |
00 |
E5 |
CD |
79 | |
|
9CF8 |
B5 |
03 |
E1 |
11 |
64 |
00 |
ED |
5A |
E9 | |
|
9D00 |
C1 |
10 |
EC |
3E |
02 |
0C |
41 |
B8 |
9F | |
|
9D08 |
20 |
E3 |
C9 |
0E |
01 |
06 |
03 |
21 |
AA | |
|
9D10 |
2C |
01 |
C5 |
11 |
08 |
00 |
E5 |
CD |
6A | |
|
9D18 |
B5 |
03 |
E1 |
11 |
2C |
01 |
ED |
5A |
D3 | |
|
9D20 |
C1 |
10 |
EC |
3E |
02 |
0C |
41 |
B8 |
BF | |
|
9D28 |
20 |
E3 |
C9 |
00 |
00 |
00 |
00 |
00 |
91 |
И еще несколько слов о процедурах звуковых эффектов, отмеченных в листинге метками SOUND1 и SOUND2. Те, кто хочет получить исчерпывающую информацию на эту тему, могут обратиться к материалу, подготовленному в свое время Андреем Алексеевым (см. РЕВЮ-92, № 11-12, стр. 241).
* * *