|
Этюды - предлагаю в новую замечательную рубрику ЭТЮДЫ несколько своих программ.
|
© Патрахин В.В., г. Оленегорск, 1994.
Предлагаю в Вашу новую и замечательную рубрику ЭТЮДЫ несколько своих программ. Первые три небольшие процедурки я написал под впечатлением программ для расчёта адреса знакоместа в экранном файле А.А. Иванова (автора и основоположника этой рубрики, очень понравившейся нашим читателям, судя по письмам - прим. ИФК). А мои программы рассчитывают адрес знакоместа в файле атрибутов.
Первый вариант. На входе: в E - номер строки, в D - номер столбца. На выходе: DE - без изменений; в HL -адрес в файле атрибутов. 00010 LD A,E
00020 AND #18
00030 RRCA
00040 RRCA
00050 RRCA
00060 OR #58
00070 LD H,A
00080 LD A,E
00090 AND #07
00100 RRCA
00110 RRCA
00120 RRCA
00130 ADD A, B
00140 LD L,A
Второй вариант. На входе: в L - строка, в H - столбец. На выходе: в HL - адрес в файле атрибутов. 00010 LD A,L
00020 AND #07
00030 RRCA
00040 RRCA
00050 RRCA
00060 ADD A, H
00070 LD H,L
00080 LD L,A
00090 LD A,H
00100 AND #18
00110 RRCA
00120 RRCA
00130 RRCA
00140 OR #58
00150 LD H,A
Хотя процедуры, приведенные В.В. Патрахиным, чуть длиннее нашей (см. "Элементарная графика", стр. 86), зато придуманы самостоятельно, без подсказок. А это наиболее ценно. Однако, Вернёмся к письму.
А эта программа переводит адрес в экранном файле в адрес в файле атрибутов.
На входе: в HL - адрес в экранном файле. На выходе - в HL -адрес в файле атрибутов.
00010 LD A,H
00020 RRCA
00030 RRCA
00040 RRCA
00050 AND #03
00060 OR #58
00070 LD H,A
Следующая программа предназначена для очистки заданного окна экрана так, как это происходит в игре R0B0C0P. В программе используются следующие переменные:
YX - двухбайтовая величина, старший байт - строка, младший - столбец левого верхнего угла очищаемого
окна.
VERT - размер по вертикали (в знакоместах) окна. HORIZ - то же по горизонтали.
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
YX |
EQU |
#0404 |
00040 |
VERT |
EQU |
16 |
00050 |
HORIZ |
EQU |
24 |
00060 |
PAUSE |
EQU |
50 |
00070 |
|
LD |
HL, YX |
00080 |
|
LD |
A, L |
00090 |
|
AND |
#07 |
00100 |
|
RRCA |
|
00110 |
|
RRCA |
|
00120 |
|
RRCA |
|
00130 |
|
ADD |
A, H |
00140 |
|
LD |
H, L |
00150 |
|
LD |
L,A |
00160 |
|
AND |
#18 |
00170 |
|
OR |
#40 |
00180 |
|
LD |
H, A |
00190 |
|
LD |
B, 2 |
00200 |
L4 |
PUSH |
BC |
00210 |
|
PUSH |
HL |
00220 |
|
LD |
C,VERT |
00230 |
L3 |
LD |
B, 4 |
00240 |
|
PUSH |
HL |
00250 |
|
LD |
DE,#20 |
00260 |
|
ADD |
HL, DE |
00270 |
|
EX |
DE, HL |
00280 |
|
POP |
HL |
00290 |
|
LD |
A, D |
00300 |
|
CP |
H |
00310 |
|
JR |
Z, L1 |
00320 |
|
PUSH |
HL |
00330 |
|
LD |
DE,#0720 |
00340 |
|
ADD |
HL, DE |
00350 |
|
EX |
DE, HL |
00360 |
|
POP |
HL |
00370 |
L1 |
PUSH |
BC |
00380 |
|
PUSH |
HL |
00390 |
|
LD |
B,HORIZ |
00400 |
|
XOR |
A |
00410 |
L2 |
LD |
(HL),A |
00420 |
|
INC |
HL |
00430 |
|
PUSH |
BC |
00440 |
|
LD |
B,PAUSE |
00450 |
PAUS |
DJNZ |
PAUS |
00460 |
|
POP |
BC |
00470 |
|
DJNZ |
L2 |
00480 |
|
POP |
HL |
00490 |
|
POP |
BC |
00500 |
|
INC |
H |
00510 |
|
INC |
H |
00520 |
|
DJNZ |
L1 |
00530 |
|
EX |
DE, HL |
00540 |
|
DEC |
C |
00550 |
|
JR |
NZ, L3 |
00560 |
|
POP |
HL |
00570 |
|
POP |
BC |
00580 |
|
INC |
H |
00590 |
|
DJNZ |
L4 |
00600 |
|
RET |
|
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #004A |
(00074) |
Executes : #9C40 (40000)
И дамп блока кодов:
9C4 0 |
21 |
04 |
04 |
7D |
E6 |
07 |
0F |
0F |
8D |
9C4 8 |
0F |
84 |
65 |
6F |
E6 |
18 |
F6 |
40 |
7F |
9C50 |
67 |
06 |
02 |
C5 |
E5 |
0E |
10 |
06 |
29 |
9C58 |
04 |
E5 |
11 |
20 |
00 |
19 |
EB |
E1 |
F3 |
9C60 |
7A |
BC |
28 |
07 |
E5 |
11 |
20 |
07 |
7E |
9C68 |
19 |
EB |
E1 |
C5 |
E5 |
06 |
18 |
AF |
60 |
9C7 0 |
77 |
23 |
C5 |
06 |
32 |
10 |
FE |
C1 |
72 |
9C7 8 |
10 |
F 6 |
E1 |
C1 |
24 |
24 |
10 |
EB |
FF |
9C80 |
EB |
0D |
20 |
D3 |
E1 |
C1 |
24 |
10 |
DD |
9C88 |
CA |
C9 |
00 |
00 |
00 |
00 |
00 |
00 |
B7 |
© Александр Шишкин, г. Ярославль, 1994.
Хочу поделиться с Вами моими программами и буду рад, если они кому-нибудь пригодятся. Первая программа выполняет плавное затухание экрана.
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
LD |
B, 8 |
00040 |
|
LD |
C, #C7 |
00050 |
LOOP |
LD |
A, C |
00060 |
|
SUB |
8 |
00070 |
|
LD |
(COM),A |
00080 |
|
LD |
C,A |
00090 |
|
LD |
HL,22528 |
00100 |
|
LD |
DE,768 |
00110 |
L1 |
LD |
A,(HL) |
00120 |
|
DEFB |
#CB |
00130 |
COM |
DEFB |
0 |
00140 |
|
LD |
(HL),A |
00150 |
|
INC |
HL |
00160 |
|
DEC |
DE |
00170 |
|
LD |
A, D |
00180 |
|
OR |
E |
00190 |
|
JR |
NZ, L1 |
00200 |
|
PUSH |
BC |
00210 |
|
LD |
BC,#1800 |
00220 |
L2 |
DEC |
BC |
00230 |
|
LD |
A, B |
00240 |
|
OR |
C |
00250 |
|
JR |
NZ, L2 |
00260 |
|
POP |
BC |
00270 |
|
DJNZ |
LOOP |
00280 |
|
RET |
|
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #0028 |
(00040) |
Executes |
: # 9C4 0 |
(40000) |
Эта программа выключает биты в значениях атрибутов, отвечающие сначала за мерцание, затем яркость и т.д. В связи с укорочением процедуры, применен приём, при котором программа в процессе работы сама себя видоизменяет.
Посмотрите: в строках 40-50 при помощи регистра C в аккумулятор заносится код #C7. В процессе цикла, организованного в строке 30, из этого кода (#C7) каждый раз вычитается 8 (строка 60). При этом получаются числа: #BF, #B7, #AF, ... #87. Таким образом, вместе с префиксом #CB в строке 120, в памяти последовательно во времени генерируются команды: RES 7,A; RES 6,A; RES 5,A; ... RES 0,A, которые затем и выполняются программой.
Благодаря такому приему удалось получить длину программы всего 40 байтов, однако победителем (39 байтов) среди процедур, реализующих этот эффект, всё же пока является программа из игры TERMINATOR-2, присланная Кривцовым А.И. (ZX-PEBW-94, ' 4, стр. 36), к тому же она релоцируемая. Так-так, посмотрим, удастся ли нашим программистам превзойти западных...
В комплекте с первой процедурой предлагаю обратную - которая плавно "зажигает" картинку. Переменная ADRES - адрес расположения картинки в памяти. 00010 ORG 40040
00020 ENT
00030 ADRES EQU ENDR+1
00040 LD HL,ADRES
00050 |
|
LD |
DE,16384 |
00060 |
|
LD |
BC,6144 |
00070 |
|
LDIR |
|
00080 |
|
LD |
IX,ENDR |
00090 |
|
LD |
B, 8 |
00100 |
LOOP |
PUSH |
BC |
00110 |
|
LD |
A, #C9 |
00120 |
|
LD |
(IX+0),A |
00130 |
|
DEC |
IX |
00140 |
|
DEC |
IX |
00150 |
|
LD |
HL,ADRES+614 4 |
00160 |
|
LD |
DE,22528 |
00170 |
|
LD |
BC,7 68 |
00180 |
L1 |
LD |
A,(HL) |
00190 |
|
CALL |
REST |
00200 |
|
LD |
(DE),A |
00210 |
|
INC |
DE |
00220 |
|
INC |
HL |
00230 |
|
DEC |
BC |
00240 |
|
LD |
A, B |
00250 |
|
OR |
C |
00260 |
|
JR |
NZ, L1 |
00270 |
|
LD |
BC,#1800 |
00280 |
L2 |
DEC |
BC |
00290 |
|
LD |
A, B |
00300 |
|
OR |
C |
00310 |
|
JR |
NZ, L2 |
00320 |
|
POP |
BC |
00330 |
|
DJNZ |
LOOP |
00340 |
|
LD |
B, 8 |
00350 |
L3 |
LD |
A, #CB |
00360 |
|
INC |
IX |
00370 |
|
INC |
IX |
00380 |
|
LD |
(IX+0),A |
00390 |
|
DJNZ |
L3 |
00400 |
|
RET |
|
00410 |
REST |
RES |
7,A |
00420 |
|
RES |
6,A |
00430 |
|
RES |
5,A |
00440 |
|
RES |
4,A |
00450 |
|
RES |
3,A |
00460 |
|
RES |
2,A |
00470 |
|
RES |
1,A |
00480 |
ENDR |
RET |
|
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #0058 |
(00088) |
Executes |
: # 9C4 0 |
(40000) |
В этой процедуре используется аналогичный прием для сокращения размера программы: здесь модифицируется часть программы в строках 410-480. В последовательности двухбайтовых команд RES N,A в подпрограмме REST вместо префикса подставляется команда RET (см. строки 80-140). Из-за этого часть подпрограммы REST отсекается. Затем (строки 340-390) исходный вариант программы восстанавливается.
После тестирования этих программ сама собой напросилась идея совместного их использования. В строке 10 второго листинга Вы видите команду ORG 40040 - длина первой процедуры 40 байтов. Так как длина второй - 88 байтов, то адрес загрузки картинки будет равен 40128. Испытание можете провести при помощи простейшей Бейсик-программы:
10 BORDER 0: PAPER 0: INK 0: POKE 23624,0: CLS
2 0 LOAD "filename" CODE
30 LOAD "screen" CODE 40128
40 PAUSE 0
50 RANDOMIZE 40040
60 PAUSE 0
7 0 RANDOMIZE 4 0000
70 GO TO 40
Шестнадцатеричный дамп объединённого варианта программы, файл "filename", загружаемый в 20 Бейсик-строке:
9C4 0 |
06 |
08 |
0E |
C7 |
79 |
D6 |
08 |
32 |
48 |
9C4 8 |
53 |
9C |
4F |
21 |
00 |
58 |
11 |
00 |
AC |
9C50 |
03 |
7E |
CB |
00 |
77 |
23 |
IB |
7A |
67 |
9C58 |
B3 |
20 |
F 6 |
C5 |
01 |
00 |
18 |
0B |
A6 |
9C60 |
78 |
B1 |
20 |
FB |
C1 |
10 |
DD |
C9 |
B7 |
9C68 |
21 |
C0 |
9C |
11 |
00 |
40 |
01 |
00 |
D3 |
9C7 0 |
18 |
ED |
B0 |
DD |
21 |
BF |
9C |
06 |
20 |
9C7 8 |
08 |
C5 |
3E |
C9 |
DD |
77 |
00 |
DD |
19 |
9C80 |
2B |
DD |
2B |
21 |
C0 |
B4 |
11 |
00 |
F5 |
9C88 |
58 |
01 |
00 |
03 |
7E |
CD |
B1 |
9C |
18 |
9C90 |
12 |
13 |
23 |
0B |
78 |
B1 |
20 |
F4 |
BC |
9C98 |
01 |
00 |
18 |
0B |
78 |
B1 |
20 |
FB |
9C |
9CA0 |
C1 |
10 |
D6 |
06 |
08 |
3E |
CB |
DD |
D7 |
9CA8 |
23 |
DD |
23 |
DD |
77 |
00 |
10 |
F5 |
C0 |
9CB0 |
C9 |
CB |
BF |
CB |
B7 |
CB |
AF |
CB |
66 |
9CB8 |
A7 |
CB |
9F |
CB |
97 |
CB |
8F |
C9 |
EA |
Александр Шишкин просит опубликовать его адрес, что мы и делаем. Он готов помочь другим хакерам тем, что знает и хочет спросить то, чего не знает. Александр предлагает: нестандартные загрузчики, интерфейс, аналогичный "стрелке" в ARTSTUDIO (только без стрелки), с управлением от всех джойстиков одновременно, и
многие другие разработки. _
150062, г. Ярославль, ул. Космонавтов, д.7, кв.20 Шишкин А.П. (SHURa'94)
© Toadstool & Ter.Val". hackers, г. Ухта, (Коми), 1994.
Хотим предложить программу печати символами двойной высоты. Она короче тех, которые Вы печатали. Процедура для печати 32-х символов взята в одном из загрузчиков доработана нами для печати 384-х символов.
Особенность программы заключается в том, что текст, который нужно напечатать, располагается в памяти задом наперед и из кода символа надо вычесть число 32. В строке 10 задается адрес расположения текста в памяти (так как текст расположен задом наперед, указывать надо последний адрес). Если в тексте (с учетом вычитания 32) встретится код 222, то позиция печати будет перенесена на следующую строку. Если встретится код 223, это означает завершение печати и выход из процедуры.
Листинг приводится с непринципиальными изменениями.
00010 |
TEXT |
EQU |
41037 |
00015 |
PRINT |
EQU |
16384 |
00020 |
|
ORG |
40000 |
00030 |
|
ENT |
|
00040 |
|
LD |
HL,PRINT |
00050 |
|
LD |
(L1+1),HL |
00060 |
|
LD |
HL,TEXT |
00070 |
|
LD |
(L2+1),HL |
00080 |
L1 |
LD |
DE,0 |
00090 |
L2 |
LD |
HL, 0 |
00100 |
L3 |
LD |
A,(HL) |
00110 |
|
CP |
222 |
00120 |
|
JR |
Z,L6 |
00130 |
|
CP |
223 |
00140 |
|
RET |
NC |
00150 |
|
RLCA |
|
00160 |
|
PUSH |
HL |
00170 |
|
PUSH |
DE |
00180 |
|
LD |
L,A |
00190 |
|
LD |
H, 15 |
00200 |
|
ADD |
HL, HL |
00210 |
|
ADD |
HL, HL |
00220 |
|
INC |
H |
00230 |
|
CALL |
L4 |
00240 |
|
EX |
DE, HL |
00250 |
|
LD |
BC,#F820 |
00260 |
|
ADD |
HL, BC |
00270 |
|
EX |
DE, HL |
00280 |
|
CALL |
L4 |
00290 |
|
POP |
DE |
00300 |
|
INC |
E |
00310 |
|
POP |
HL |
00320 |
|
DEC |
HL |
00330 |
|
JR |
L3 |
00340 |
L4 |
LD |
B, 4 |
00350 |
L5 |
LD |
A,(HL) |
00360 |
|
RRCA |
|
00370 |
|
OR |
(HL) |
00380 |
|
INC |
HL |
00390 |
|
OR |
(HL) |
00400 |
|
LD |
(DE),A |
00410 |
|
INC |
D |
00420 |
|
LD |
(DE),A |
00430 |
|
INC |
D |
00440 |
|
DJNZ |
L5 |
00450 |
|
RET |
|
00460 |
L6 |
DEC |
HL |
00470 |
|
LD |
(L2+1),HL |
00480 |
|
LD |
HL,(L1+1) |
00490 |
|
LD |
DE,64 |
00500 |
|
ADD |
HL, DE |
00510 |
|
LD |
(L1+1),HL |
00520 |
|
JR |
L1 |
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #0053 |
(00083) |
Executes |
: # 9C4 0 |
(40000) |
Дамп блока кодов:
9C4 0 |
21 |
00 |
40 |
22 |
4D |
9C |
21 |
4D |
B6 |
9C4 8 |
A0 |
22 |
50 |
9C |
11 |
00 |
00 |
21 |
C4 |
9C50 |
00 |
00 |
7E |
FE |
DE |
28 |
2C |
FE |
98 |
9C58 |
DF |
D0 |
07 |
E5 |
D5 |
6F |
26 |
0F |
08 |
9C60 |
29 |
29 |
24 |
CD |
75 |
9C |
EB |
01 |
3C |
9C68 |
20 |
F8 |
09 |
EB |
CD |
75 |
9C |
D1 |
BF |
9C7 0 |
1C |
E1 |
2B |
18 |
DD |
06 |
04 |
7E |
B1 |
9C7 8 |
0F |
B6 |
23 |
B6 |
12 |
14 |
12 |
14 |
FE |
9C80 |
10 |
F5 |
C9 |
2B |
22 |
50 |
9C |
2A |
4D |
9C88 |
4D |
9C |
11 |
40 |
00 |
19 |
22 |
4D |
E 6 |
9C90 |
9C |
18 |
B9 |
00 |
00 |
00 |
00 |
00 |
99 |
В приведенной процедуре печати для сокращения объёма тоже приценяется приём модификации программы в процессе работы. Вообще говоря, модифицируются не команды, а данные: изменяются значения, задаваемые в регистры DE и HL в строках 90 и 100. Вместо нулей при работе подставляются конкретные данные.
Не знаем, хорошо или плохо то, что текст для печати должен быть "закодирован" - видимо, это зависит от конкретных задач. Слово "закодирован" взято в кавычки, поскольку, если текст должен быть напечатан строчными буквами, то при "кодировании" они просто должны быть заменены на заглавные. Так или иначе, упрощение процедуры привело к усложнению процесса подготовки текста для печати. Но, как говорится, о вкусах не спорят. От себя мы можем дополнить процедуру программой на Бейсике, кодирующей текстовые сообщения. 10 LET begin=41000: LET b$="" 20 INPUT LINE a$
30 IF a$<>"" THEN LET b$=b$+a$+CHR$ 254: GO TO 20 40 LET len=LEN b$ 50 LET b$(len)=CHR$ 255 60 LET end=begin+len 70 FOR a=1 TO len
80 POKE (begin+a-1),CODE (b$(len-a+1))-32 90 NEXT a
100 PRINT "TEXT: ";begin;"...";end-1''"LENGTH=";len
Текст надо вводить по запросу программы по строкам (не более 32 символов). При вводе текст строки будет автоматически завершен символом перевода на новую строку. Нажатие ENTER без ввода текста означает завершение текста и ввод символа конца текста. После этого будет произведено кодирование и выданы следующие значения: начальный и конечный адрес расположения текста в памяти, а также длину текста. Первый и последний параметры можете использовать для сохранения "закодированного" текста на ленте или диске, а второй Вы должны будете подставить в строку 10 листинга кодового блока вместо nnnnn).
© Руслан Крылов, г. Владивосток, 1994.
Предлагаю Вам к разделу "Этюды" небольшую, но довольно эффектную программу, выполняющую очистку экрана. Подобной я у Вас пока не встречал. Программа очищает экран от центра к четырём вершинам, при этом, в центре экрана образуется чёрный ромб, увеличивающийся в размерах, пока им не будет заслонен (очищен) весь экран.
00010 |
|
ORG |
40000 |
00020 |
ONE |
LD |
A, B |
00030 |
|
CP |
#C0 |
00040 |
|
RET |
NC |
00050 |
|
CALL |
8881 |
00060 |
|
LD |
B, #BF |
00070 |
|
LD |
A, C |
00080 |
|
AND |
#07 |
00090 |
|
ADD |
A, #F1 |
00100 |
|
LD |
C,A |
00110 |
|
LD |
A,(BC) |
00120 |
|
AND |
(HL) |
00130 |
|
LD |
(HL),A |
00140 |
|
RET |
|
00150 |
TWO |
LD |
A, #80 |
00160 |
|
ADD |
A, E |
00170 |
|
LD |
C,A |
00180 |
|
LD |
A,#60 |
00190 |
|
ADD |
A, D |
00200 |
|
LD |
B, A |
00210 |
|
CALL |
ONE |
00220 |
|
LD |
A, #80 |
00230 |
|
SUB |
E |
00240 |
|
LD |
C,A |
00250 |
|
LD |
A,#60 |
00260 |
|
ADD |
A, D |
00270 |
|
LD |
B, A |
00280 |
|
CALL |
ONE |
00290 |
|
LD |
A, #80 |
00300 |
|
SUB |
E |
00310 |
|
LD |
C,A |
00320 |
|
LD |
A,#60 |
00330 |
|
SUB |
D |
00340 |
|
LD |
B, A |
00350 |
|
CALL |
ONE |
00360 |
|
LD |
A, #80 |
00370 |
|
ADD |
A, E |
00380 |
|
LD |
C,A |
00390 |
|
LD |
A,#60 |
00400 |
|
SUB |
D |
00410 |
|
LD |
B, A |
00420 |
|
CALL |
ONE |
00430 |
|
DEC |
E |
00440 |
|
INC |
D |
00450 |
|
LD |
A, E |
00460 |
|
CP |
#FE |
00470 |
|
RET |
NC |
00480 |
|
JR |
TWO |
00490 |
|
ENT |
|
00500 |
START |
LD |
HL,2252 |
00510 |
|
LD |
DE,2252 |
00520 |
|
LD |
BC,7 67 |
00530 |
|
LD |
(HL) , 1 |
00540 |
|
LDIR |
|
00550 |
|
LD |
DE,255 |
00560 |
THREE |
INC |
E |
00570 |
|
INC |
E |
00580 |
|
PUSH |
DE |
00590 |
|
CALL |
TWO |
00600 |
|
POP |
DE |
00610 |
|
LD |
A, E |
00620 |
CP |
#DF |
00630 |
RET |
Z |
00640 |
JR |
THREE |
00650 |
RET |
|
Start of object |
: # 9C4 0 |
(40000) |
Length |
: #0065 |
(00101) |
Executes |
: #9C87 |
(40071) |
Сразу после старта программы (строка 490) происходит установка атрибутов для всего экрана, значение которых задается числовым параметром в строке 530 (в данном примере PAPER 0; INK 1, но Вы можете задать своё значение при помощи хотя бы POKE 40081,N). Затем начинается собственно формирование "ромба", очищающего экран.
Если Вы добавите строку:
00545 ENT
то будете иметь ромб без предварительной установки атрибутов. Иными словами, для этого надо запустить блок с адреса:
Executes : #9C94 (40084)
Шестнадцатеричный дамп блока:
9C4 0 |
78 |
FE |
C0 |
D0 |
CD |
B1 |
22 |
06 |
88 |
9C4 8 |
BF |
79 |
E6 |
07 |
C6 |
P1 |
4F |
0A |
19 |
9C50 |
A6 |
77 |
C9 |
3E |
80 |
83 |
4F |
3E |
A0 |
9C58 |
60 |
82 |
47 |
CD |
40 |
9C |
3E |
80 |
84 |
9C60 |
93 |
4F |
3E |
60 |
82 |
47 |
CD |
40 |
52 |
9C68 |
9C |
3E |
80 |
93 |
4F |
3E |
60 |
92 |
70 |
9C7 0 |
47 |
CD |
40 |
9C |
3E |
80 |
83 |
4F |
8C |
9C7 8 |
3E |
60 |
92 |
47 |
CD |
40 |
9C |
1D |
51 |
9C80 |
14 |
7B |
FE |
FE |
D0 |
18 |
CC |
21 |
7C |
9C88 |
00 |
58 |
11 |
01 |
58 |
01 |
FF |
02 |
E8 |
9C90 |
36 |
01 |
ED |
B0 |
11 |
FF |
00 |
1C |
2C |
9C98 |
1C |
D5 |
CD |
53 |
9C |
D1 |
7B |
FE |
2B |
9CA0 |
DF |
C8 |
18 |
F3 |
C9 |
00 |
00 |
00 |
B7 |
© Андрей Нефедов, г. Новокузнецк, 1994.
Хочу поделиться с читателями некоторыми процедурами, взятыми из разных игровых и прикладных программ. Эти процедуры позволяют создавать разные звуковые эффекты, которые играют немаловажную роль в различных программах, создаваемых любителями сделать что-нибудь своими руками.
Процедуры эти довольно простые, как в написании, так и в обращении. Они, при различных значениях изменяемых параметров, помеченных в листингах как "var", помогут создать довольно обширный спектр звуковых
эффектов. |
|
|
|
|
|
Процедура 1. |
|
|
|
|
00010 |
|
ORG |
40000 |
|
|
00020 |
|
ENT |
|
|
|
00030 |
|
LD |
A, (23624) |
|
00040 |
|
RRA |
|
|
|
00050 |
|
RRA |
|
|
|
00060 |
|
RRA |
|
|
|
00070 |
|
LD |
B, 240 |
; |
var |
00080 |
|
LD |
C,254 |
|
|
00090 |
LB |
DEC |
H |
|
|
00100 |
|
JR |
NZ, LA |
|
|
00110 |
|
XOR |
16 |
|
|
00120 |
|
OUT |
(C) , A |
|
|
00130 |
|
LD |
H, 238 |
; |
var |
00140 |
LA |
DEC |
L |
|
|
00150 |
|
JR |
NZ, LB |
|
|
00160 |
|
XOR |
16 |
|
|
00170 |
|
OUT |
(C) , A |
|
|
00180 |
|
LD |
L,254 |
; |
var |
00190 |
|
DJNZ |
LB |
|
|
00200 |
|
RET |
|
|
|
Start |
of object |
: # 9C4 0 |
(40000) |
|
|
Length |
: #001F |
(00031) |
|
|
Executes |
: # 9C4 0 |
(40000) |
|
|
|
|
9C4 0 I |
3A 48 |
5C |
1F |
|
|
9C4 8 |
0E FE |
25 |
20 |
1F
06
9C50 9C58
ORG ENT LD LD LD
PUSH PUSH PUSH CALL POP POP POP LD SUB LD
DJNZ RET
# 9C4 0 (40000) #0018 (00024)
# 9C4 0 (40000)
Процедура 2.
00010
00020
00030
00040
00050
00060 LA
00070
00080
00090
00100
00110
00120
00130
00140
00150
00160
00170
Start of object
Length
Executes
BC,64004
HL,512
DE,2
HL
DE
BC
949
BC
DE
HL
A, L
C
L,A LA
9C4 0 |
01 |
04 |
FA |
21 |
00 |
02 |
11 |
02 |
11 |
9C4 8 |
00 |
E5 |
D5 |
C5 |
CD |
B5 |
03 |
C1 |
A9 |
9C50 |
D1 |
E1 |
7D |
91 |
6F |
10 |
F2 |
C9 |
E 6 |
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
LD |
A,(23624) |
00040 |
|
SRL |
A |
00050 |
|
SRL |
A |
00060 |
|
LD |
L,A |
00070 |
|
LD |
E, 0 |
00080 |
|
LD |
D,128 |
00090 |
LC |
PUSH |
DE |
00100 |
LB |
LD |
B, E |
00110 |
LA |
DJNZ |
LA |
00120 |
|
LD |
A,(BC) |
00130 |
|
AND |
248 |
00140 |
|
OR |
L |
00150 |
|
OUT |
(254) , A |
00160 |
|
INC |
C |
001л0 |
|
DEC |
D |
00180 |
|
JR |
NZ, LB |
00190 |
|
POP |
DE |
00200 |
|
INC |
E |
00210 |
|
DEC |
D |
00220 |
|
JR |
NZ, LC |
00230 |
|
RET |
|
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #0020 |
(00032) |
Executes |
: # 9C4 0 |
(40000) |
; var ; var
9C4 0 |
3A |
48 |
5C |
CB |
3F |
CB |
3F |
6F |
3D |
9C4 8 |
1E |
00 |
16 |
80 |
D5 |
43 |
10 |
FE |
BE |
9C50 |
0A |
E6 |
F8 |
B5 |
D3 |
FE |
0C |
15 |
7B |
9C58 |
20 |
F3 |
D1 |
1C |
15 |
20 |
ED |
C9 |
DF |
ORG ENT LD
RRCA RRCA RRCA
00010 00020 00030 00040 00050 00060
00070
00080 LB
00090
00100
00110
00120 LA
00130
00140
00150
00160
Start of object
Length
Executes
53 |
0F |
0F |
0F |
1E |
C8 |
C4 |
FE |
EE |
11 |
43 |
10 |
FE |
F8 |
F5 |
FB |
C9 |
00 |
00 |
00 |
E2 |
Процедура 5.
00010
00020
00030
00040
00050 LC
00060
00070
00080
00090 LB
00100
00110
00120 LA
00130
00140
00150
00160
Start of object
Length
Executes
FE 57 CB A2 CB 20 02 16 18 ED _ 3D 20 EE C9 00
Предоставим читателях возможность самим поэкспериментировать с изменяемыми числовыми параметрами и обратим внимание на другой момент. Так как порт .звукового динамика и бордюра - один и тот же, то звуковые эффекты неизбежно влияют на цвет бордюра. Если Вам не надо, чтобы цвет его менялся, надо предусматривать специальные меры - блокировать 0...2 биты числа, выдаваемого в порт (#FE). Или же, наоборот, звуковой эффект может приводить к изменению цвета бордюра (0-2 биты), если того требует идея. Так, в процедуре 1 попробуйте изменить строки 110 и 160, задавая числовой параметр для XOR в пределах от 16 до 23, да ещё так, чтобы он не обязательно был одинаковым в этих строках.
В Процедуре 2 используется стандартный BEEPER из ПЗУ, поэтому цвел бордюра будет определяться содержимым системной ячейки 23624 (BORDCR).
Процедура 3 тоже использует значение BORDCR. От её значения будет зависеть цвет бордюра в момент звукового сигнала. Например, при белом бордюре, он станем жёлтым, при жёлтом - изменится на зелёный и т.д. Если Вы измените строку 130, например, так: 00130 XOR 255
то при изначально зеленом бордюре в момент звукового сигнала получите полосы всех цветов.
Не менее интересные результаты дадут эксперименты с процедурой 4. Здесь вообще в качестве переменной используется ячейка дисплейного файла. Видимо, в оригинале процедуры цвет бордюра в момент звукового сигнала зависел от того, что в этот момент находилось в этом месте экрана. Можете переделать программу: 00030 LD A, N ; var
а строки 40-60 - удалите (это, кстати, сократит процедуру на 4 байта). Попробуйте менять параметр N в диапазоне 0.7, меняя также при этом и параметр в строке 100 от 16 до 23 - Вы получите различные цвета полос на бордюре в момент звукового сигнала.
А в процедуре 5 в момент звукового сигнала Вы увидите все цвета радуги на экране.
Андрей тоже просит напечатать его адрес - он надеется, что вместе с новыми друзьями они смогут разгадать какие-нибудь секреты ZX-Spectrum:
E,200
(254), 17 B, E LA E
NZ, LB
LD
DI
OUT
XOR
LD
DJNZ
DEC
JR
EI
RET
# 9C4 0 #0015
# 9C4 0 9C4 0 9C4 8 9C50
ORG
ENT
LD
LD
LD
RES
RES
LD
CP
JR
LD
OUT
DJNZ
DEC
JR
RET
# 9C4 0 #0017
# 9C4 0 9C4 0 9C4 8 9C50
(40000) (00021) (40000) 3A 48 F3 D3 1D 20
40000
E, 50
C,254
D,A 4,D 3,D B, E B
NZ, LA D,24 (C),D LB A
NZ, LC
(40000) (00023) (40000) 1E 32 9A 43 51 10
654006, Кемеровская обл., г. Новокузнецк, ул. Филиппова, 16-9, Нефедов Андрей.
© Вячеслав Пономарев, г. Черногорец (Хакасия), 1994.
Предлагаю Вам программу, которую написал под впечатлением от многочисленных "музыкалок". Эта программа выводит любой текст произвольным (загруженным) символьным набором. Особенность программы в том, что текст выводится в нижней трети экрана и буквы по высоте равны одной трети экрана. Вся хитрость в том, что буквы рисуются не в дисплейном файле, а в файле атрибутов, цветом PAPER и INK, то есть Вы можете нарисовать в нижней трети любой рисунок любым цветом INK и буквы будут "бежать" по рисунку, а рисунок как бы просвечиваться через буквы.
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
BEGIN |
LD |
HL,ADR |
00040 |
|
LD |
(TEXT),HL |
00050 |
MN |
LD |
DE, (23606) |
00060 |
|
LD |
HL,(TEXT) |
00070 |
|
LD |
A,(HL) |
00080 |
|
CP |
13 |
00090 |
|
JR |
Z,BEGIN |
00100 |
|
CP |
16 |
00110 |
|
JP |
Z, Ll |
00120 |
|
CP |
17 |
00130 |
|
JP |
Z,L2 |
00140 |
|
LD |
H, 0 |
00150 |
|
LD |
L,A |
00160 |
|
ADD |
HL, HL |
00170 |
|
ADD |
HL, HL |
00180 |
|
ADD |
HL, HL |
00190 |
|
ADD |
HL, DE |
00200 |
|
LD |
BC, 8 |
00210 |
|
LD |
DE,BUFFER |
00220 |
|
LDIR |
|
00230 |
|
LD |
B, 8 |
00240 |
мз |
PUSH |
BC |
00250 |
PAUSE |
LD |
B, 1 |
00260 |
MM |
HALT |
|
00270 |
|
DJNZ |
MM |
00280 |
|
LD |
DE,#5AlF |
00290 |
|
LD |
B, 8 |
00300 |
|
LD |
HL,BUFFER |
00310 |
|
LD |
(POINTB),HL |
00320 |
Ml |
LD |
HL, (POINTB) |
00330 |
|
LD |
A,(HL) |
00340 |
|
SLA |
A |
00350 |
|
JR |
C,MSET |
00360 |
|
LD |
A,(DE) |
00370 |
|
AND |
#C7 |
00380 |
PAPER |
OR |
#20 |
00390 |
|
LD |
(DE),A |
00400 |
M0 |
LD |
HL,#20 |
00410 |
|
ADD |
HL, DE |
00420 |
|
EX |
DE, HL |
00430 |
|
LD |
HL, (POINTB) |
00440 |
|
INC |
HL |
00450 |
|
LD |
(POINTB),HL |
00460 |
|
DJNZ |
M1 |
00470 |
|
LD |
HL,BUFFER |
00480 |
|
LD |
B, 8 |
00490 |
M2 |
LD |
A,(HL) |
00500 |
|
SLA |
A |
00510 |
|
LD |
(HL),A |
00520 |
|
INC |
HL |
00530 |
|
DJNZ |
M2 |
00540 |
|
LD |
HL, #5A00 |
00550 |
|
LD |
C,8 |
00560 |
NEXTL |
LD |
B, 31 |
00570 |
NEXTC |
INC |
HL |
00580 |
|
LD |
A,(HL) |
00590 |
|
AND |
#38 |
00600 |
|
LD |
E,A |
00610 |
|
DEC |
HL |
00620 |
|
LD |
A,(HL) |
00630 |
|
AND |
#C7 |
00640 |
|
OR |
E |
00650 |
|
LD |
(HL),A |
00660 |
|
INC |
HL |
00670 |
|
DJNZ |
NEXTC |
00680 |
|
INC |
HL |
00690 |
|
DEC |
C |
00700 |
|
JR |
NZ,NEXTL |
00710 |
|
POP |
BC |
00720 |
|
DJNZ |
M3 |
00730 |
PROD |
LD |
HL,(TEXT) |
00740 |
|
INC |
HL |
00750 |
|
LD |
(TEXT),HL |
00760 |
|
LD |
A, #7F |
00770 |
|
IN |
A, (#FE) |
00780 |
|
AND |
1 |
00790 |
|
RET |
Z |
00800 |
|
JP |
MN |
00810 |
MSET |
LD |
A,(DE) |
00820 |
|
AND |
#C7 |
00830 |
INK |
OR |
#10 |
00840 |
|
LD |
(DE),A |
00850 |
|
JR |
M0 |
00860 |
L1 |
CALL |
LLL |
00870 |
|
LD |
(INK+1),A |
00880 |
|
JR |
PROD |
00890 |
L2 |
CALL |
LLL |
00900 |
|
LD |
(PAPER+1),A |
00910 |
|
JR |
PROD |
00920 |
LLL |
LD |
HL,(TEXT) |
00930 |
|
INC |
HL |
00940 |
|
LD |
(TEXT),HL |
00950 |
|
LD |
A,(HL) |
00960 |
|
LD |
HL,POICOL |
00970 |
|
LD |
D,0 |
00980 |
|
LD |
E,A |
00990 |
|
ADD |
HL, DE |
01000 |
|
LD |
A,(HL) |
01010 |
|
RET |
|
01020 |
BUFFER |
DEFW |
0, 0,0, 0 |
01030 |
TEXT |
DEFW |
0 |
01040 |
POINTB |
DEFW |
0 |
01050 |
POICOL |
DEFB |
0,8,16,24 |
01060 |
|
DEFB |
32,40,48,56 |
01080 |
ADR |
DEFB |
16,2,17,5 |
01090 |
|
DEFM |
" HELLO, " |
01100 |
|
DEFB |
16,7,17,2 |
01110 |
|
DEFM |
"ALL USERS" |
01120 |
|
DEFB |
16,2,17,5 |
01130 |
|
DEFM |
" !!! " |
01140 |
|
DEFB |
17, 1 |
01150 |
|
DEFM |
" " |
01160 |
|
DEFB |
13 |
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #00F9 |
(00249) |
Executes |
: # 9C4 0 |
(40000) |
В строке 30 задается адрес текста в ОЗУ. В строке 40 его значение сохраняется в переменной TEXT. В строке 50 задается значение CHARS того символьного набора, которым должна выполняться печать. Далее анализируются символы текста. В строке 80 проверяется признак конца текста. Если он зафиксирован, программа зацикливается и текст печатается сначала. В строке 100 анализируется код управления цветом INK, а в строке 120 - код управления PAPER.
Строки 140-190 находят образ символа по его коду, а 200-220 переносят восемь его байтов в служебный
буфер.
В строках 250-270 организована задержка, определяющая скорость движения бегущей строки, она зависит от числового параметра, задаваемого в регистре B. Однако при других значениях B слишком заметными становятся рывки при перемещении букв.
В строке 540 задается адрес начала нижней трети экрана в файле атрибутов. В строках 550-700 происходит сдвиг атрибутов (PAPER) нижней трети - влево.
В строках 760-790 выполняется опрос клавиши SPACE, если она нажата, то происходит выход из программы.
Текст кодируется - как обычно, но в конце текста обязательно должен стоять маркер CHR$ 13. Чтобы сменить цвет букв или фона (не забывайте, что цвет букв PAPER!), нужно задать управляющие коды CHR$ 16; CHR$... - для цвета INK (фон букв) или CHR$ 17; CHR$... - для цвета PAPER (цвет букв).
А теперь шестнадцатеричный дамп:
9C4 0 |
21 |
10 |
9D |
22 |
04 |
9D |
ED |
5B |
B5 |
9C4 8 |
36 |
5C |
2A |
04 |
9D |
7E |
FE |
0D |
CA |
9C50 |
28 |
EE |
FE |
10 |
CA |
DB |
9C |
FE |
4F |
9C58 |
11 |
CA |
E3 |
9C |
26 |
00 |
6F |
29 |
0C |
9C60 |
29 |
29 |
19 |
01 |
08 |
00 |
11 |
FC |
7D |
9C68 |
9C |
ED |
B0 |
06 |
08 |
C5 |
06 |
01 |
17 |
9C7 0 |
76 |
10 |
FD |
11 |
1F |
5A |
06 |
08 |
27 |
9C7 8 |
21 |
FC |
9C |
22 |
06 |
9D |
2A |
06 |
C2 |
9C80 |
9D |
7E |
CB |
27 |
38 |
4D |
1A |
E6 |
AE |
9C88 |
C7 |
F6 |
20 |
12 |
21 |
20 |
00 |
19 |
6D |
9C90 |
EB |
2A |
06 |
9D |
23 |
22 |
06 |
9D |
CC |
9C98 |
10 |
E4 |
21 |
FC |
9C |
06 |
08 |
7E |
6D |
9CA0 |
CB |
27 |
77 |
23 |
10 |
F9 |
21 |
00 |
F2 |
9CA8 |
5A |
0E |
08 |
06 |
1F |
23 |
7E |
E6 |
60 |
9CB0 |
38 |
5F |
2B |
7E |
E6 |
C7 |
B3 |
77 |
63 |
9CB8 |
23 |
10 |
F2 |
23 |
0D |
20 |
EC |
C1 |
76 |
9CC0 |
10 |
AB |
2A |
04 |
9D |
23 |
22 |
04 |
2B |
9CC8 |
9D |
3E |
7F |
DB |
FE |
E6 |
01 |
C8 |
46 |
9CD0 |
C3 |
46 |
9C |
1A |
E6 |
C7 |
F6 |
10 |
DE |
9CD8 |
12 |
18 |
B1 |
CD |
EB |
9C |
32 |
D7 |
AC |
9CE0 |
9C |
18 |
DF |
CD |
EB |
9C |
32 |
8A |
1F |
9CE8 |
9C |
18 |
D7 |
2A |
04 |
9D |
23 |
22 |
1F |
9CF0 |
04 |
9D |
7E |
21 |
08 |
9D |
16 |
00 |
87 |
9CF8 |
5F |
19 |
7E |
C9 |
00 |
00 |
00 |
00 |
53 |
9D00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
9D |
9D08 |
00 |
08 |
10 |
18 |
20 |
28 |
30 |
38 |
85 |
9D10 |
10 |
02 |
11 |
05 |
20 |
48 |
45 |
4C |
CE |
9D18 |
4C |
4F |
2C |
20 |
10 |
07 |
11 |
02 |
C6 |
9D2 0 |
41 |
4C |
4C |
20 |
55 |
53 |
45 |
52 |
F5 |
9D2 8 |
53 |
10 |
02 |
11 |
05 |
20 |
21 |
21 |
A2 |
9D30 |
21 |
20 |
11 |
01 |
20 |
20 |
20 |
20 |
A0 |
9D38 |
0D |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
E2 |
© Сергей Гуляев, республика Коми, 1994 г.
Очень люблю Ваш новый раздел ЭТЮДЫ. Решив поддержать идею А.А.Иванова из г. Печора, я высылаю Вам две программы.
Программа 1. Действие её таково: от центра экрана к его краям расходятся разноцветные полосы.
00010 |
ORG |
40000 |
00020 |
ENT |
|
00030 |
LD |
IX,#000F |
00040 |
LD |
HL,#0010 |
00050 |
LD |
B, #10 |
00060 L1 |
PUSH |
BC |
00070 |
PUSH |
HL |
00080 |
CALL |
L2 |
00090 |
PUSH |
IX |
00100 |
POP |
HL |
00110 |
|
CALL |
L2 |
00120 |
|
POP |
HL |
00130 |
|
POP |
BC |
00140 |
|
INC |
HL |
00150 |
|
DEC |
IX |
00160 |
|
LD |
A, #FF |
00170 |
|
LD |
(L11),A |
00180 |
|
DJNZ |
L1 |
00190 |
|
RET |
|
00200 |
L2 |
LD |
B, #18 |
00210 |
|
LD |
A, (L10) |
00220 |
|
ADD |
A,2 |
00230 |
|
LD |
(L10),A |
00240 |
L3 |
PUSH |
BC |
00250 |
|
PUSH |
HL |
00260 |
|
CALL |
L4 |
00270 |
|
POP |
HL |
00280 |
|
LD |
A, (L10) |
00290 |
|
AND |
#7F |
00300 |
|
LD |
C,A |
00310 |
|
LD |
A, #20 |
00320 |
|
CALL |
L6 |
00330 |
|
LD |
DE,#0020 |
00340 |
|
ADD |
HL, DE |
00350 |
|
POP |
BC |
00360 |
|
DJNZ |
L3 |
00370 |
|
RET |
|
00380 |
L4 |
LD |
A,(L11) |
00390 |
|
CP |
0 |
00400 |
|
RET |
Z |
00410 |
|
DEC |
A |
00420 |
|
LD |
(L11),A |
00430 |
|
LD |
C,A |
00440 |
|
LD |
B, A |
00450 |
|
LD |
A, #10 |
00460 |
L5 |
OUT |
(#FE),A |
00470 |
|
DJNZ |
L5 |
00480 |
|
LD |
B, C |
00490 |
|
XOR |
A |
00500 |
|
OUT |
(#FE),A |
00510 |
|
RET |
|
00520 |
L6 |
PUSH |
HL |
00530 |
|
PUSH |
AF |
00540 |
|
EX |
DE, HL |
00550 |
|
LD |
HL,#5800 |
00560 |
|
ADD |
HL, DE |
00570 |
|
LD |
(HL),C |
00580 |
|
LD |
HL,#4000 |
00590 |
|
LD |
A, D |
00600 |
|
OR |
A |
00610 |
|
JR |
Z, L7 |
00620 |
|
LD |
H, #47 |
00630 |
L7 |
CP |
2 |
00640 |
|
JR |
NZ, L8 |
00650 |
|
LD |
H, #4E |
00660 |
L8 |
ADD |
HL, DE |
00670 |
|
POP |
AF |
00680 |
|
PUSH |
HL |
00690 |
|
LD |
L,A |
00700 |
|
LD |
H, 0 |
00710 |
|
ADD |
HL, HL |
00720 |
|
ADD |
HL, HL |
00730 |
|
ADD |
HL, HL |
00740 |
|
EX |
DE, HL |
00750 |
|
LD |
HL,(#5C3 |
00760 |
|
ADD |
HL, DE |
00770 |
|
EX |
DE, HL |
00780 |
|
POP |
HL |
00790 |
|
LD |
B, 8 |
00800 |
L9 |
LD |
A,(DE) |
00810 |
|
INC |
DE |
00820 |
|
LD |
(HL),A |
00830 |
|
INC |
H |
00840 |
|
DJNZ |
L9 |
00850 |
|
POP |
HL |
00860 |
|
RET |
|
00870 |
L10 |
DEFB |
0 |
00880 |
L11 |
DEFB |
0 |
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #008E |
(00142) |
Executes |
: # 9C4 0 |
(40000) |
Эффект происходит со звуковым сопровождением.
Мы хотим обратить вникание читателей на строку 310 листинга: здесь задается код ПРОБЕЛА, печать которого разными цветами и создает эффект цветных полос. Значение CHARS символьного набора для печати задается в строке 750.
Шестнадцатеричный дамп процедуры:
9C4 0 |
DD |
21 |
0F |
00 |
21 |
10 |
00 |
06 |
20 |
9C4 8 |
10 |
C5 |
E5 |
CD |
61 |
9C |
DD |
E5 |
2A |
9C50 |
E1 |
CD |
61 |
9C |
E1 |
C1 |
23 |
DD |
39 |
9C58 |
2B |
3E |
FF |
32 |
CD |
9C |
10 |
E9 |
F0 |
9C60 |
C9 |
06 |
18 |
3A |
CC |
9C |
C6 |
02 |
4D |
9C68 |
32 |
CC |
9C |
C5 |
E5 |
CD |
84 |
9C |
35 |
9C7 0 |
E1 |
3A |
CC |
9C |
E6 |
7F |
4F |
3E |
81 |
9C7 8 |
20 |
CD |
9B |
9C |
11 |
20 |
00 |
19 |
82 |
9C80 |
C1 |
10 |
E8 |
C9 |
3A |
CD |
9C |
FB |
3F |
9C88 |
00 |
C8 |
3D |
32 |
CD |
9C |
4F |
47 |
5A |
9C90 |
3E |
10 |
D3 |
FE |
10 |
FC |
41 |
AF |
47 |
9C98 |
D3 |
FE |
C9 |
E5 |
F5 |
EB |
21 |
00 |
B4 |
9CA0 |
58 |
19 |
71 |
21 |
00 |
40 |
7A |
B7 |
B0 |
9CA8 |
28 |
02 |
26 |
47 |
FE |
02 |
20 |
02 |
FD |
9CB0 |
26 |
4E |
19 |
F1 |
E5 |
6F |
26 |
00 |
44 |
9CB8 |
29 |
29 |
29 |
EB |
2A |
36 |
5C |
19 |
8F |
9CC0 |
EB |
E1 |
06 |
08 |
1A |
13 |
77 |
24 |
FE |
9CC8 |
10 |
FA |
E1 |
C9 |
00 |
00 |
00 |
00 |
18 |
на является разновидностью программы "Гашение экрана". |
|
Эта программа аналогична уже опубликованной нами (в РЕВЮ-94 ' 3, стр. 45) процедуре, имитирующей действие FADE_0) MEGABASIC. Отличие предлагаемой сейчас в том, что происходящее на экране сопровождается
звуковым эффектом. |
|
|
00010 |
ORG |
40000 |
00020 |
ENT |
|
00030 |
LD |
HL,LABEL1 |
00040 |
ADD |
A,(HL) |
00050 |
LD |
(LABEL1) , A |
00060 |
LD |
A, R |
00070 |
AND |
#7F |
00080 |
ADD |
A,(HL) |
00090 |
LD |
(LABEL1) , A |
00100 |
LD |
HL,(LABEL3) |
00110 |
INC |
HL |
00120 |
LD |
A, H |
00130 |
AND |
#03 |
00140 |
LD |
H, A |
00150 |
LD |
(LABEL3),HL |
00160 |
LD |
A,(HL) |
00170 |
LD |
HL, LABEL1 |
00180 |
ADD |
A,(HL) |
00190 |
LD |
(LABEL1) , A |
00200 |
LD |
L,A |
00210 |
|
LD |
H, 0 |
00220 |
|
ADD |
HL, HL |
00230 |
|
ADD |
HL, HL |
00240 |
|
LD |
DE,#5800 |
00250 |
|
LD |
BC,#0300 |
00260 |
|
LDIR |
|
00270 |
L1 |
LD |
HL,#5800 |
00280 |
|
LD |
D,0 |
00290 |
|
LD |
BC,#0300 |
00300 |
L2 |
LD |
A,(HL) |
00310 |
|
CP |
0 |
00320 |
|
JR |
z,l3 |
00330 |
|
LD |
D, #FF |
00340 |
|
DEC |
(HL) |
00350 |
|
LD |
A, #10 |
00360 |
|
OUT |
(#FE),A |
00370 |
|
XOR |
A |
00380 |
|
OUT |
(#FE),A |
00390 |
L3 |
DEC |
BC |
00400 |
|
INC |
HL |
00410 |
|
LD |
A, B |
00420 |
|
OR |
C |
00430 |
|
JR |
NZ, L2 |
00440 |
|
CP |
D |
00450 |
|
JR |
NZ, L1 |
00460 |
|
LD |
HL,#4000 |
00470 |
|
LD |
DE,#4001 |
00480 |
|
LD |
(HL),0 |
00490 |
|
LD |
BC,#1800 |
00500 |
|
LDIR |
|
00510 |
|
RET |
|
00520 |
LABEL1 |
DEFB |
0 |
00530 |
LABEL2 |
DEFB |
0 |
00540 |
LABEL3 |
DEFB |
0 |
00550 |
LABEL4 |
DEFB |
0 |
Start |
of object |
: # 9C4 0 |
(40000) |
Length |
: #0061 |
(00097) |
Executes |
: # 9C4 0 |
(40000) |
Шестнадцатеричный дамп:
9C4 0 |
21 |
9D |
9C |
86 |
32 |
9D |
9C |
ED |
14 |
9C4 8 |
5F |
E6 |
7F |
86 |
32 |
9D |
9C |
2A |
C3 |
9C50 |
9F |
9C |
23 |
7C |
E6 |
03 |
67 |
22 |
38 |
9C58 |
9F |
9C |
7E |
21 |
9D |
9C |
86 |
32 |
BF |
9C60 |
9D |
9C |
6F |
26 |
00 |
29 |
29 |
11 |
2D |
9C68 |
00 |
58 |
01 |
00 |
03 |
ED |
B0 |
21 |
1E |
9C7 0 |
00 |
58 |
16 |
00 |
01 |
00 |
03 |
7E |
FC |
9C7 8 |
FE |
00 |
28 |
0A |
16 |
FF |
35 |
3E |
CC |
9C80 |
10 |
D3 |
FE |
AF |
D3 |
FE |
0B |
23 |
AB |
9C88 |
78 |
B1 |
20 |
EB |
BA |
20 |
E0 |
21 |
33 |
9C90 |
00 |
40 |
11 |
01 |
40 |
36 |
00 |
01 |
F5 |
9C98 |
00 |
18 |
ED |
B0 |
C9 |
00 |
00 |
00 |
B2 |
9CA0 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
3C |
© Евгений Любимов, г. Новокузнецк, 1994.
Хочу предложить в рубрику "Этюды" программу, действие которой аналогично команде Мега-Бейсика FADE_0. Она релоцируемая, может загружаться в любой адрес и стартовать с адреса загрузки.
00010 00020 00030 00040 00050 00060 00070 00080 L3
40000
BC,768 DE,22528 HL,768
B, 255 BC
ORG
ENT
LD
LD
LD
LDIR LD
PUSH
00090 |
|
LD |
HL,22528 |
00100 |
|
LD |
ВС,768 |
00110 |
L2 |
LD |
A,(HL) |
00120 |
|
CP |
1 |
00130 |
|
CALL |
NC, L1 |
00140 |
|
INC |
HL |
00150 |
|
DEC |
ВС |
00160 |
|
LD |
А, В |
00170 |
|
OR |
С |
00180 |
|
JR |
NZ, L2 |
00190 |
|
POP |
ВС |
00200 |
|
DJNZ |
L3 |
00210 |
|
RET |
|
00220 |
L1 |
DEC |
A |
00230 |
|
LD |
(HL),A |
00240 |
|
RET |
|
Start of object : #9C40 (40000) Length : #0027 (00039)
Executes : #9C40 (40000)
9C4 0 |
01 |
00 |
03 |
11 |
00 |
58 |
21 |
00 |
6A |
9C4 8 |
03 |
ED |
B0 |
06 |
FF |
C5 |
21 |
00 |
6F |
9C50 |
58 |
01 |
00 |
03 |
7E |
FE |
01 |
D4 |
99 |
9C58 |
64 |
9C |
23 |
0B |
78 |
B1 |
20 |
F4 |
5F |
9C60 |
C1 |
10 |
EA |
C9 |
3D |
77 |
C9 |
00 |
FD |
Эта процедура по эффекту похожа на аналогичную, предложенную в РЕВЮ-94 № 3, хотя, справедливости ради, следует заметить, что эффект всё же отличается.
© Алексей Прокопенко, г. Ростов-на-Дону, 1994. Предлагаю Вам свою программу для скроллинга всего экрана внутри знакомест.
00010 |
ORG |
40000 |
00020 |
ENT |
|
00030 |
LD |
HL,16384 |
00040 |
LD |
BC,6144 |
00050 LOOP |
LD |
A,(HL) |
00060 |
RLCA |
|
00070 |
LD |
(HL),A |
00080 |
INC |
HL |
00090 |
DEC |
BC |
00100 |
LD |
A, B |
00110 |
OR |
C |
00120 |
JR |
NZ,LOOP |
00130 |
RET |
|
Start of object |
: # 9C4 0 |
(40000) |
Length |
: #0010 |
(00016) |
Executes |
: # 9C4 0 |
(40000) |
В строке 60 может стоять любая циклическая или нециклическая команда сдвига регистра А. В зависимости от этого можно получать различные эффекты.
Например, при использовании команда SRL A или SLA A получим интересную очистку экрана, а при использовании RRCA или RLCA - интересный эффект с экраном. Для этого добавьте строки: 00022 LD В,24
00024 L1 PUSH ВС
00122 POP ВС
00124 DJNZ L1
Получим вариант программыг, "вращающей" изображение внутри каждого знакоместа экрана три раза. Параметры блока кодов станут при этом следующими:
Start of object |
: # 9C4 0 |
(40000) |
|
|
|
|
|
|
|
Length |
: #0016 |
(00022) |
|
|
|
|
|
|
|
Executes |
: # 9C4 0 |
(40000) |
|
|
|
|
|
|
|
|
9C4 0 |
06 18 |
C5 |
21 |
00 |
40 |
01 |
00 |
21 |
|
9C4 8 |
18 7E |
07 |
77 |
23 |
0B |
78 |
B1 |
4F |
|
9C50 |
20 F7 |
C1 |
10 |
ED |
C9 |
00 |
00 |
8A |
|
© Руслан Пак, г. |
Климовск Тул |
ьской |
области, 1994. |
Я испытал программу "ВОТ ТАК!", опубликованную в РЕВЮ-94 № 3 (стр.47). Картинку она проявляет
хорошо, а вот атрибутов на ней нет. Предлагаю усовершенствование этой программы.
00010 |
ORG |
50000 |
00020 W1 |
LD |
F, 1 |
00030 |
AND |
A |
00040 |
EX |
AF,AF' |
00050 |
LD |
B, 9 |
00060 W2 |
LD |
DE,#1800 |
00070 |
LD |
HL,#DF38 |
00080 W3 |
DEC |
HL |
00090 |
DEC |
DE |
00100 |
LD |
A, D |
00110 |
OR |
E |
00120 |
JR |
Z,W4 |
00130 |
SET |
6, D |
00140 |
EX |
AF,AF' |
00150 |
RLA |
|
00160 |
RLA |
|
00170 |
RLA |
|
00180 |
RLA |
|
00190 |
PUSH |
AF |
00200 |
AND |
(HL) |
00210 |
EX |
DE, HL |
00220 |
OR |
(HL) |
00230 |
EX |
DE, HL |
00240 |
LD |
(DE),A |
00250 |
POP |
AF |
00260 |
EX |
AF,AF' |
00270 |
RES |
6, D |
00280 |
JR |
W3 |
00290 W4 |
DJNZ |
W2 |
00300 |
RET |
|
00310 |
ENT |
|
00320 |
LD |
DE,#5800 |
00330 |
LD |
HL,#DF38 |
00340 |
LD |
BC,#0300 |
00350 |
LDIR |
|
00360 |
JR |
W1 |
Start of object : #C350 (50000) Length : #0035 (00053)
Executes : #C378 (50040)
Загрузите заставку под адрес 51000, затем запустите программу с адреса 50040. Шестнадцатеричный дамп процедуры:
C350 |
3E |
01 |
A7 |
08 |
06 |
09 |
11 |
00 |
21 |
C358 |
18 |
21 |
38 |
DF |
2B |
1B |
7A |
B3 |
DE |
C360 |
28 |
13 |
CB |
F2 |
08 |
17 |
17 |
17 |
68 |
C368 |
17 |
F5 |
A6 |
EB |
B6 |
EB |
12 |
F1 |
6C |
C370 |
08 |
CB |
B2 |
18 |
E7 |
10 |
DF |
C9 |
6F |
C378 |
11 |
00 |
58 |
21 |
38 |
DF |
01 |
00 |
DD |
C380 |
03 |
ED |
B0 |
18 |
CB |
00 |
00 |
00 |
C6 |
|
|