Сегодняшний выпуск ЭТЮДОВ начнем с непрекращающегося потока писем по поводу "гасилки" экрана (вот уж не думали, что эта тема вызовет такой резонанс!).
Некоторые читатели недоумевают по поводу того, что мы пользуемся командой HALT, предварительно не разрешив прерывания командой EI. Друзья. Не будьте буквоедами. Если пойти еще дальше, то можно упомянуть предварительную установку черного цвета бордюра (который может быть и белым, а погасший экран с белым бордюром смотрится нелепо). Еще дальше -установку стека, чтобы он не оказался в одних адресах с программой и т.д. и т.п. Давайте остановимся - все хорошо в меру. Все это - внешние условия работы процедуры. Первоначальный запуск любой программы все равно происходит из Бейсика, при этом прерывания разрешены. И если Вы в своей основной программе их запрещаете, то Вам придется потрудиться разрешить их перед вызовом подпрограмм, содержащих HALT. Это естественно. Однако Вы можете в каждую такую подпрограмму вставить собственный EI, предшествующий HALT, чтобы потом не заботиться о состоянии режима прерываний. И то, и другое верно -поступайте, кому как нравится. Мы не указываем команду EI только потому, чтобы поставить разные варианты в одинаковые условия при подсчете количества байтов.
Теперь конкретно о письмах. В основном, это повторение уже опубликованных приемов и идей по поводу сокращения программ. Пришло несколько писем с длиной процедуры 23 байта, однако это теперь уже не рекорд. Тем не менее рассмотрим пару идей.
Владимир Зореев прислал очередной вариант, длиной 23 байта. Но длина - даже не главное. Он придумал новый способ реализации задержка *
1 |
|
org |
50000 |
2 |
|
ent |
$ |
3 |
pause |
equ |
5 |
4 |
|
ld |
c,%01111111 |
5 |
l3 |
ld |
b,pause |
6 |
l2 |
ld |
hl,#5800 |
7 |
l1 |
ld |
a, (hl) |
8 |
|
and |
с |
9 |
|
ld |
(hl),a |
10 |
|
inc |
hl |
11 |
|
ld |
a, #5b |
12 |
|
cp |
h |
13 |
|
jr |
nz, li |
14 |
|
djnz |
l2 |
15 |
|
srl |
с |
16 |
|
jr |
с, l3 |
17 |
|
ret |
|
В его процедуре задержка выполняется при помощи многократного выполнения одного и того же активного действия. То есть в данном варианте пять раз гасится 7-й бит, пять раз 6-й и т.д. Величина задержки задается в PAUSE. Ко всему прочему, процедура одинаково хорошо работает и с разрешенными и с запрещенными прерываниями.
Алексей Леготин взял за основу процедуру А.Палоусова (ZX-PE-ВЮ-95, N3, стр.40) и сократил ее на 1 байт. Он догадался, что разумнее регистры Н и L загружать одной командой, объединив строки 50 и 90 (см.листинг в указанном номере РЕВЮ) в одну команду (результат 23 байта):
1 2
3
4
5
6
7
8 9
10 l3
11 12
13
14
15
16 17
org ent ld ld
halt
dec
jr
srl
ret
ld
and
ld
inc
ld
cp
jr
jr
50000 $
de,#5bff hl,#5805
l
nz, l2 E
nc
a,(hl) E
(hl),a hl a,h d
nz, l3 li
Берем письмо с очередной "га-силкой". И вдруг... что это? Новая заявка на рекорд! А мы-тр уж было усомнились в том, что результат Сергея Колотова может быть побит. Но он продержался, по традиции, тоже два месяца. Новым победителем стал Максим Лупан из Адлера. Длина его процедуры 22
байта. |
! Вот |
она: |
|
1 |
|
ORG |
50000 |
2 |
|
ENT |
$ |
3 |
PAUSE |
EQU |
5 |
4 |
|
LD |
C, #FF |
5 |
LI |
LD |
H, #5A |
6 |
L2 |
LD |
A,(HL) |
7 |
|
AND |
С |
8 |
|
LD |
(HL),A |
9 |
|
DEC |
HL |
10 |
|
BIT |
2 ,H |
11 |
|
JR |
Z ,L2 |
12 |
|
SRL |
С |
13 |
|
RET |
NC |
14 |
|
LD |
В,PAUSE |
15 |
L3 |
HALT |
|
16 |
|
DJNZ |
L3 |
17 |
|
JR |
LI |
Чем вызван успех? Так-так, опять декремент регистра HL. Однако контроль 2-го, а не 3-го (как в процедуре Сергея Колотова) бита регистра Н, что, в сущности, то же самое "с точностью до наоборот*' :
per. Н per. L 23295: 01011010 11111111 22528: 01011000 00000000
22527: 01010111 11111111 %%
3-Й бит -1 1- 2-Й бит
А вот и оригинальная идея! Не
расходуется память на задание содержимого регистра L. Ведь при циклическом повторении команды DEC HL - регистр L все равно пробегает все 256 значений. И если даже начало работы будет при произвольном значении регистра L (например, 0, то есть HL-фЗАОО), то при сравнении по AND с маской, "недообнуленные" при самом первом проходе старшие биты некоторых атрибутов (это FLASH) обнулятся уже при втором проходе, после чего "порядок" восстановится. На глаз такое "недообнуление при первом проходе" совершенно незаметно (ведь FLASH практически не встречается в картинках, да еще конкретное место играет роль). Однако этот прием дал победный байт!
Кстати, Максим приводит понравившуюся ему и усовершенствованную им процедуру Антона Сидоренко (не претендуя на ее авторство, см. гХ-РЕВЮ-94, N3, стр.40). С применением того же приема ее
ORG
ENT
EQU
LD
LD
LD
LD
AND
LD
DEC
BIT
длина |
стала |
23 байта: |
1 |
|
ORG |
50000 |
2 |
|
ENT |
$ |
3 |
PAUSE |
EQU |
#50 |
4 |
|
LD |
C,#FF |
5 |
LI |
LD |
H,#5A |
6 |
L2 |
LD |
A,(HL) |
7 |
|
AND |
С |
8 |
|
LD |
(HL),A |
9 |
|
DEC |
HL |
10 |
|
BIT |
2 ,H |
11 |
|
JR |
Z,L2 |
12 |
|
SRL |
С |
13 |
|
RET |
NC |
14 |
L3 |
DEC |
HL |
15 |
|
LD |
A,H |
16 |
|
CP |
PAUSE |
17 |
|
JR |
NZ, L3 |
18 |
|
JR |
LI |
Сколько идей по поводу одной и той же маленькой процедуры! Вот бы взять, да и объединить самые лучшие идеи - может удастся еще сократить процедуру? Ну вот, например, замечательная 23-байтная процедура Владимира Зореева (см. выше). Попробуем реализовать в ней идею, которую предложил Максим Лупан:
50000 $
5
C, #FF В,PAUSE H,#5A A,(HL) С
(HL),A
HL
3,H
12 JR NZ,L1
13 DJNZ L2
14 SRL С
15 JR C,L3
16 RET
Но что это? Выходит, мы установили новый рекорд. Длина полученной процедуры 21 байт! Да еще независимость от назойливых прерываний, которые то - разрешены, то - запрещены!
Нет, конечно, мы не можем претендовать на победу, используя ваши идеи, друзья. Ведь мы находимся в привилегированном положении по сравнению с вами. Такую процедуру Владимир Зореев наверняка написал бы и сам, получив этот номер журнала. Не отнимать же у него рекорд!
Результат оказался возможным благодаря совместным усилиям. Ну что же, подтвердилась еще одна прописная истина: "Одна голова -хорошо, а две - лучше". Поэтому справедливо будет признать, что сегодня победу разделили две головы: Максим Лупан из г.Адлер и Александр Зореев из г.Заволжье Нижегородской обл.
Но уточняем, что все вышеизложенное справедливо только по отношению к упрощенному алгоритму гашения экрана, а не к оригинальному, применяющемуся в процедуре из TERMINATOR' а - об этом Mil писали в прошлом номере. Этот вопрос пока остается открытым.
Письма, письма... Что-то в последнее время все реже стали попадаться эффекты, заслуживающие внимания. В основном, это повторение уже опубликованных вариантов. Неужели хаккерский потенциал так оскудел? Разве нет достойных внимания эффектов в западных программах? Что, боязно "копнуть поглубже"? Или не хватает знаний для создания собственных программ?
На этом фоне очень приятное впечатление производит процедура, присланная корреспондентом, имя которого уже встречалось на страницах ЭТЮДОВ.
(С) Антон Сидоренко, пос.Мурмаши, Мурманская обл., 1995.
Предлагаю свою небольшую программку для очистки экрана. Эффект ее таков: картинка исчезает, стираясь постепенно от левого края экрана к правому. В процессе участвуют как дисплейный файл, так и файл атрибутов. Кроме того, происходящее на экране сопровождается звуковым эффектом.
1 |
; (с) |
LOGIC |
GAMES, 1 |
2 |
|
ORG |
50000 |
3 |
|
ENT |
$ |
4 |
|
LD |
HL, 0 |
5 |
|
LD |
DE,16384 |
6 |
М4 |
PUSH |
DE |
7 |
|
LD |
B,PAUSE |
8 |
|
HALT |
|
9 |
М5 |
PUSH |
BC |
10 |
|
PUSH |
DE |
11 |
|
LD |
C,B |
12 |
|
LD |
B, 8 |
13 |
М7 |
PUSH |
BC |
14 |
|
LD |
В, 8 |
15 |
М8 |
PUSH |
DE |
16 |
М9 |
LD |
A,(DE) |
17 |
|
AND |
(HL) |
18 |
|
LD |
(DE),A |
19 |
|
AND |
16 |
20 |
|
OUT |
(#FE),A |
21 |
|
LD |
А,С |
22 |
|
CP |
PAUSE |
23 |
|
JR |
NZ ,M3 |
24 |
|
XOR |
A |
25 |
|
LD |
(DE),A |
26 |
|
PUSH |
DE |
27 |
|
LD |
A,D |
28 |
|
RRCA |
|
29 |
|
RRCA |
|
30 |
|
RRCA |
|
31 |
|
AND |
3 |
32 |
|
OR |
88 |
33 |
|
LD |
D, A |
34 |
|
LD |
A,CLR |
35 |
|
LD |
(DE),A |
36 |
|
POP |
DE |
37 |
МЗ |
LD |
A, D |
38 |
|
ADD |
A,8 |
39 |
|
LD |
D, A |
40 |
|
CP |
88 |
41 |
|
JR |
C,M9 |
42 |
|
POP |
DE |
43 |
|
INC |
D |
44 |
|
INC |
HL |
45 |
|
DJNZ |
M8 |
46 |
|
LD |
A, D |
47 |
|
SUB |
8 |
48 |
|
LD |
D, A |
49 |
|
LD |
A, E |
50 |
|
ADD |
A,32 |
51 |
|
LD |
E, A |
52 |
|
POP |
ВС |
53 |
|
DJNZ |
M7 |
54 |
|
POP |
DE |
55 |
|
POP |
ВС |
56 |
|
RES |
6,H |
57 |
|
INC |
E |
58 |
|
LD |
A, E |
59 |
|
AND |
31 |
60 |
|
JR |
Z,M6 |
61 |
|
DJNZ |
M5 |
62 |
M6 |
POP |
DE |
63 |
|
INC |
E |
64 |
|
LD |
A, E |
65 |
|
AND |
31 |
66 |
|
RET |
Z |
67 |
|
JR |
M4 |
68 |
PAUSE |
EQU |
6 |
69 |
CLR |
EQU |
7 |
Параметр в строке 68 задает скорость исполнения эффекта. В строке 69 задан атрибут, которым будет заполняться экран после
очистки. |
|
|
|
|
|
|
|
|
Длина |
блока |
кодов |
90 |
байт: |
|
C350 |
21 |
00 |
00 |
11 |
00 |
40 |
D5 |
06 |
60 |
C358 |
06 |
76 |
С5 |
D5 |
48 |
06 |
08 |
С5 |
4С |
C360 |
06 |
08 |
D5 |
1А |
А6 |
12 |
Е6 |
10 |
СЕ |
C368 |
D3 |
FE |
79 |
FE |
06 |
20 |
10 |
AF |
58 |
C370 |
12 |
D5 |
7А |
0F |
0F |
0F |
Е6 |
03 |
АА |
C378 |
F6 |
58 |
57 |
ЗЕ |
07 |
12 |
D1 |
7А |
82 |
C380 |
С6 |
08 |
57 |
FE |
58 |
38 |
DC |
D1 |
A3 |
C388 |
14 |
23 |
10 |
D6 |
7А |
D6 |
08 |
57 |
17 |
C390 |
7В |
С6 |
20 |
5F |
С1 |
10 |
С8 |
D1 |
7D |
C398 |
С1 |
СВ |
В4 |
1С |
7В |
Е6 |
1F |
28 |
5F |
C3A0 |
02 |
10 |
В7 |
D1 |
1С |
7В |
Е6 |
1F |
99 |
C3A8 |
С8 |
18 |
АВ |
00 |
00 |
00 |
00 |
00 |
F6 |
И |
еще |
несколько программ, лос- |
вященных очистке экрана, полученных от нашего 15-летнего корреспондента из г.Улан-Удэ.
(С) Сергей Жуков,
г.Улан-Удэ, 1995.
Первая программа очищает монохромное изображение экрана при помощи использования регистра регенерации. Неплохой эффект, учитывая длину программы.
При автономном использовании мы все же рекомендуем удлинить программу за счет строк 4-10, для преобразования цветного изображения в монохромный вариант.
1 ; (С) CONDOR SOFT, 1995.
2 |
ORG |
50000 |
3 |
ENT |
$ |
4 |
LD |
HL,#5800 |
5 |
LD |
D,H |
6 |
LD |
E,L |
7 |
INC |
DE |
8 |
LD |
BC,#02FF |
9 |
LD |
(HL),7 |
10 |
LDIR |
|
11 |
LD |
B,10 |
12 L2 |
PUSH |
ВС |
13 |
LD |
HL,16384 |
14 |
LD |
ВС,6144 |
15 L1 |
LD |
A, R |
16 |
AND |
(HL) |
17 |
LD |
(HL),A |
18 |
INC |
HL |
19 |
DEC |
ВС |
20 |
LD |
А,В |
21 |
OR |
С |
22 |
JR |
NZ, LI |
23 |
POP |
ВС |
24 |
DJNZ |
L2 |
25 |
RET |
|
Длина блока кодов 36 байт (со строками 4-10):
С350: 21 00 58 54 5D 13 01 FF :50
С358: 02 36 07 ED ВО 06 OA С5 :СС
С360: 21 00 40 01 00 18 ED 5F :Е9
С368: А6 77 23 0В 78 В1 20 F6 :В5
С370: С1 10 ЕС С9 00 00 00 00 :В9
Вторая программа гасит атрибуты, заполняя экран голубым цветом . Эффект происходит со звуковым сопровождением.
1 ; (С) CONDOR SOFT, 1995.
2 ORG 50000
3 ENT $
4 LD HL,#4000
5 LD DE,#5800
6 LD ВС,#0300
7 LDIR
8 LD В,255
9 L5 PUSH ВС
10 LD C,B
11 LD A,21
12 |
L1 |
OUT |
(254), A |
13 |
|
DJNZ |
LI |
14 |
|
LD |
B,C |
15 |
|
LD |
A,5 |
16 |
L2 |
OUT |
(254) ,A |
17 |
|
DJNZ |
L2 |
18 |
|
POP |
BC |
19 |
|
LD |
HL,22528 |
20 |
|
LD |
DE,768 |
21 |
М |
LD |
A,(HL) |
22 |
|
CP |
45 |
23 |
|
JR |
Z,L3 |
24 |
|
DEC |
(HL) |
25 |
L3 |
INC |
HL |
26 |
|
DEC |
DE |
27 |
|
LD |
A,D |
28 |
|
OR |
E |
29 |
|
JR |
NZ,L4 |
30 |
|
DJNZ |
L5 |
31 |
|
RET |
|
Длина блока кодов 50 байт:
С350: 21 00 40 11 00 58 01 00 :DE
С358: 03 ED ВО 06 FF С5 48 ЗЕ :0В
С360: 15 D3 FE 10 FC 41 ЗЕ 05 :99
С368: D3 FE 10 FC С1 21 00 58 :42
С370: 11 00 03 7Е FE 2D 28 01 :19
С378: 35 23 IB 7А ВЗ 20 F4 10 :FF
С380: DC С9 00 00 00 00 00 00 :Е8
Для черного цвета (вместо голубого) надо сделать следующие изменения:
11 LD А,16
15 LD А,0
22 CP 7
Следующая программа тоже предназначена для гашения экрана. Процесс каждый раз будет происходить по-разному за счет программной переменной, значение которой каждый раз меняется.
Листинг приводится с непринципиальными изменениями (раскрыта подпрограмма, что позволило сделать модуль релоцируемым).
i ; (c) |
CONDOR SOFT, |
2 |
ORG 50000 |
3 |
ENT $ |
4 |
LD C,#7F |
5 LI |
PUSH HL |
6 |
LD HL,(L6) |
7 |
LD A,H |
8 |
AND #1F |
9 |
LD |
H, A |
10 |
LD |
A,(HL) |
11 |
INC |
HL |
12 |
ADD |
A,(HL) |
13 |
INC |
HL |
14 |
XOR |
(HL) |
15 |
INC |
HL |
16 |
LD |
(L6),HL |
17 |
POP |
HL |
18 |
OR |
1 |
19 |
LD |
E, A |
20 L2 |
SUB |
3 |
21 |
JR |
Z,L1 |
22 |
JR |
NC,L2 |
23 L3 |
LD |
HL,#4000 |
24 |
LD |
B,E |
25 |
LD |
D, 0 |
26 L4 |
LD |
A,(HL) |
27 |
AND |
С |
28 |
LD |
(HL),A |
29 |
RRC |
С |
30 |
ADD |
HL,DE |
31 |
LD |
A,H |
32 |
CP |
#5B |
33 |
JR |
C,L4 |
34 |
LD |
H, #40 |
35 |
DJNZ |
L4 |
36 |
RRC |
С |
37 |
RRC |
С |
38 |
RRC |
С |
39 |
JR |
С, L3 |
40 |
RET |
|
41 L6 |
DEFS |
2 |
Длина |
блока |
КОДОВ |
61 |
байт: |
|
С350: |
0Е |
7F |
Е5 |
2А |
8В |
СЗ |
1С |
Еб |
: 5F |
С358: |
IF |
67 |
7Е |
23 |
86 |
23 |
АЕ |
23 |
: ВС |
С360: |
22 |
8В |
СЗ |
Е1 |
F6 |
01 |
5F |
D6 |
: АО |
С368: |
03 |
28 |
Е7 |
30 |
FA |
21 |
00 |
40 |
: С8 |
С370: |
43 |
16 |
00 |
7Е |
А1 |
77 |
СВ |
09 |
: F6 |
С378: |
19 |
7С |
FE |
5В |
38 |
F5 |
26 |
40 |
: ВС |
С380: |
10 |
F1 |
СВ |
09 |
СВ |
09 |
СВ |
09 |
: СО |
С388: |
38 |
ЕЗ |
С9 |
00 |
00 |
00 |
00 |
00 |
: 2F |
Следует добавить пару слов об этом эффекте. При использовании его для стирания экрана-заставки, он может быть, и не произведет на Вас впечатления. Однако поверьте, картина совершенно меняется, если Вы используете предложенную процедуру для текста! Попробуйте сами, и Вы все поймете. Одним словом, этот небольшой эффект украсит любую адвентюру или инструкцию к программе - там, где происходит вывод текста на экран.
ЭТЮДЫ
А теперь |
предлагаем программу |
41 |
|
|
LD |
L, А |
|
для вывода коротких текстовых со |
42 |
|
|
LD |
Н,0 |
|
общений . |
|
|
43 |
|
|
ADD |
HL,HL |
|
|
|
|
44 |
|
|
ADD |
HL,HL |
|
(С) А.В.Захваткин |
Удмуртия,1995. |
45 |
|
|
ADD |
HL,HL |
|
|
|
|
46 |
|
|
EX |
DE,HL |
|
Программа |
рассчитана для печа- |
47 |
|
|
LD |
HL,(23606) |
|
ти на экране, но слово "печать" |
48 |
|
|
ADD |
HL,DE |
|
здесь не совсем уместно, так как |
49 |
|
|
LD |
A,(HL) |
|
эта программа во всех позициях |
50 |
|
|
POP |
HL |
|
печати (знакоместах) сдвигает |
51 |
|
|
LD |
(HL),A |
|
изображение |
на 1 пиксел вверх, а |
52 |
|
|
INC |
HL |
|
на освободившееся |
место печатает |
53 |
|
|
DJNZ |
L4 |
|
следующую пиксельную линию (всего |
54 |
|
|
POP |
HL |
|
сообщения). |
В общем, получается |
55 |
|
|
LD |
HL,(23606) |
|
как на счетчике, |
когда "девятки" |
56 |
|
|
INC |
HL |
|
сменяются на |
"нули". |
57 |
|
|
LD |
(23606),HL |
|
|
|
|
58 |
|
|
POP |
DE |
|
1 |
ORG |
50000 |
59 |
|
|
POP |
ВС |
|
2 |
ENT |
$ |
60 |
|
|
POP |
HL |
|
3 |
LD |
HL,TEXT |
61 |
|
|
|
|
|
4 |
LD |
E,END_TX-TEXT |
62 |
|
|
HALT |
|
|
5 |
EI |
|
63 |
|
|
DJNZ |
SCR |
|
6 |
LD |
В,8 |
64 |
|
|
LD |
HL,(23606) |
|
7 ;----- |
|
|
65 |
|
|
LD |
DE, 8 |
|
8 SCR |
PUSH |
HL |
66 |
|
|
SBC |
HL,DE |
|
9 |
PUSH |
ВС |
67 |
|
|
LD |
(23606),HL |
|
10 |
LD |
С, E |
68 |
|
|
RET |
|
|
11 |
LD |
HL,(23684) |
69 |
TEXT |
DEFM |
"DEMO-Printing" |
12 L2 |
PUSH |
HL |
70 |
END ТХ DEFS |
0 |
|
13 |
LD |
В,7 |
|
|
|
|
|
|
|
14 L3 |
INC |
H |
Ha |
входе |
в процедуру задаются: |
15 |
LD |
A,(HL) |
в регистре |
HL - |
адрес начала |
16 |
DEC |
H |
текстового сообщения в памяти; |
в |
17 |
LD |
(HL),A |
регистре |
Е - |
- длина сообщения. |
|
18 |
INC |
H |
Место |
печати на экране опреде- |
19 |
DJNZ |
L3 |
ляется текущим значением AT (бе |
20 |
POP |
HL |
рется |
из систенной переменной |
21 |
INC |
HL |
DF_CC |
(23684). После отработки |
22 |
DEC |
С |
процедуры эта величина не изменя |
23 |
JR |
NZ ,L2 |
ется j |
|
то |
есть позиция печати ос- |
24 |
POP |
ВС |
тается той же, что была до вызова |
25 |
POP |
HL |
процедуры. |
|
|
|
26 ;------ |
|
|
Длина |
блока кодов 104 байта: |
|
27 ART |
PUSH |
HL |
|
|
|
|
|
|
|
28 |
PUSH |
ВС |
С350 |
|
21 |
АВ |
СЗ IE |
0D FB 06 08 |
D6 |
29 |
PUSH |
DE |
С358 |
|
Е5 |
С5 |
4В 2А |
84 5C E5 06 |
05 |
30 |
LD |
B,E |
С360 |
|
07 |
24 |
7Е 25 |
77 24 10 F9 |
95 |
31 |
PUSH |
HL |
С368 |
|
Е1 |
23 |
0D 20 |
F1 CI El E5 |
D4 |
32 |
LD |
HL,(23684) |
С370 |
|
С5 |
D5 |
43 Е5 |
2A 84 5C 3E |
3D |
33 |
LD |
A,7 |
С378 |
|
07 |
84 |
67 ЕЗ |
7E 23 ЕЗ E5 |
79 |
34 |
ADD |
A,H |
С380 |
|
6F |
26 |
00 29 |
29 29 ЕВ 2A |
68 |
35 |
LD |
H, A |
С388 |
|
36 |
5С |
19 7Е |
El 77 23 10 |
FF |
36 L4 |
EX |
(SP),HL |
С390 |
|
ЕА |
Е1 |
2А 36 |
5C 23 22 36 |
55 |
37 |
LD |
A,(HL) |
С398 |
|
5С |
D1 |
CI Е1 |
76 10 B9 2A |
93 |
38 |
INC |
HL |
C3A0 |
|
36 |
5С |
11 08 |
00 ED 52 22 |
6F |
39 |
EX |
(SP),HL |
СЗА8 |
|
36 |
5С |
С9 44 |
45 4D 4F 2D |
18 |
40 |
PUSH |
HL |
СЗВО |
|
50 |
72 |
69 6Е |
74 69 6E 67 |
BE |
ЭТЮДЫ
Теперь порадуем обладателей музыкального сопроцессора.
21 60 48 20 F5 С9 19 С6 04 Е5 11 F1 С9 ED 52 CD FE 00 28 36 00 С9
F5 CD 01 FD 08 ED C5 CD 00 A7 04 11 9B EA 04 36 00 00
: 53 : 77 :A2 :C1 :5B : 96 :B4 :B0 : 0D
ЕА60: ЕА68: ЕА70: ЕА78: ЕА80: ЕА88: ЕА90: ЕА98: ЕААО:
(С) Александр Соловьев,
г.Андреаполь,
Элементом оформления музыкальных заставок, в которых используется музыка для музыкального сопроцессора, может являться индикатор амплитуды каналов, который я и предлагаю Вашему вниманию.
ЗЕ 03 3D 6Е EA F1 FF 16 00 79 ED 78 8D EA С1 ED 52 10 00 02 А7 10 F5 С9 7Е 3D С9
Сохраните блок кодов: SAVE "music"CODE 60000,70 Если при помощи SOUND TRACKER
1 |
|
ORG |
60000 |
скомпилировать музыку под адрес |
2 |
; (С) ORIONSOFT 1995. |
49152 (пусть имя блока имя будет |
3 |
|
ENT |
$ |
"SONG"), то продемонстрирует ра |
4 |
|
LD |
A, 3 |
боту индикатора Бейсик-программа |
5 |
MAIN |
DEC |
A |
(автостарт со 2 строки): |
6 |
|
LD |
HL,18528 |
|
7 |
|
PUSH |
AF |
1 GO ТО 10 |
8 |
|
CALL |
START |
2 BORDER 0: PAPER 0: INK 7: С |
9 |
|
POP |
AF |
LEAR 49151: RANDOMIZE USR 15619: |
10 |
|
JR |
NZ,MAIN |
REM : LOAD "music"CODE 60000 |
11 |
|
RET |
|
3 RANDOMIZE USR 15619: REM : |
12 |
START |
LD |
BC,65533 |
LOAD "SONG"CODE 49152 |
13 |
|
LD |
D, 0 |
10 RANDOMIZE USR 49152 |
14 |
|
LD |
E,A |
20 RANDOMIZE USR 49158: RANDOM |
15 |
|
ADD |
HL,DE |
IZE USR 60000: PAUSE 1: IF INKEY |
16 |
|
ADD |
A,8 |
$="" THEN GO TO 20 |
17 |
|
OUT |
(C),A |
30 RANDOMIZE USR 49152 |
18 |
|
IN |
A,(C) |
|
19 |
|
LD |
B, 4 |
В заключение, ответы на "за |
20 |
LABEL2 |
PUSH |
HL |
гадки" для начинающих, заданные в |
21 |
|
PUSH |
BC |
предыдущем выпуске ЭТЮДОВ |
22 |
|
CALL |
Ml |
(см.ZX-РЕВЮ-95, N4, стр.47). |
23 |
|
POP |
BC |
1. Кнопка "MAGIC" активно ра |
24 |
|
POP |
HL |
ботает со стеком, а занести зна |
25 |
|
LD |
DE, 32 |
чения стека в ПЗУ невозможно, по |
26 |
|
AND |
A |
этому работа программы MAGIC на |
27 |
|
SBC |
HL,DE |
рушается, что приводит к сбросу. |
28 |
|
DJNZ |
LABEL2 |
2. Приведенный блок кодов, в |
29 |
|
RET |
|
принципе, не имеет смысла. Прог |
30 |
Ml |
LD |
B, 4 |
рамма "крутится" на одном месте |
31 |
LABELl |
LD |
DE,512 |
вокруг метки L1. А во время пре |
32 |
|
AND |
A |
рывания происходит переход на |
33 |
|
SBC |
HL,DE |
"пустую" подпрограмму PROG, тоже |
34 |
|
CALL |
CP1 |
ничего не выполняющую. В резуль |
35 |
|
DJNZ |
LABELl |
тате имеем просто зависший компь |
36 |
|
RET |
|
ютер. А убедиться в том, что об |
37 |
CP1 |
CP |
0 |
работка прерываний все-таки идет, |
38 |
|
JR |
Z ,CP2 |
можно так: |
39 |
|
LD |
(HL),126 |
|
40 |
|
DEC |
A |
PROG LD HL,#100 |
41 |
|
RET |
|
LD DE,#10 |
42 |
CP 2 |
LD |
(HL),0 |
CALL #03B5 ; BEEPER |
43 |
|
RET |
|
RET |
Длина блока кодов 70 байт: