|
Этюды - Как говорят программисты, нет такой программы, которую нельзя было бы сократить (в смысле улучшить) хотя бы на одну команду. То есть предела совершенству нет. А раз так, то у меня к Вам есть маленькое предложение. Давайте введем раздел "ЭТЮДЫ".
|
ЭТЮДЫ
С интересным предложением обратился к нам А.А.Иванов из г. Печора (республика Коми). Цитируем дословно. Уверены, что это предложение поддержат все наши читатели.
© А. А. Иванов, г. Печора, 1994г.
Как говорят программисты, нет такой программы, которую нельзя было бы сократить (в смысле улучшить) хотя бы на одну команду. То есть предела совершенству нет. А раз так, то у меня к Вам есть маленькое предложение. Давайте введем раздел "ЭТЮДЫ".
Общеизвестно, что существуют мастера игры в шахматы, но существуют и мастера шахматных этюдов.
Конечно, у Вас есть и "Маленькие хитрости", и "Форум", и "Читатель читателю", и это очень интересные разделы, но. Но! Одну и ту же проблему можно решить разными путями. Это может быть скучный путь следования классическим (но проверенным) путем программирования и это может быть (пусть не всегда удачный), путь отыскания собственного решения.
В "Этюдах" мы могли бы делиться друг с другом своими "перлами" и "алмазами" в области совершенствования приемов и методов программирования.
Можно устраивать конкурсы (с призами!) в решении тех или иных задач.
Эти задачи Вы можете давать сами, в своих целях.
Эти задачи могут объявлять и читатели, в своих целях.
Итогами конкурсов могли бы пользоваться все, в своих целях.
И ещё. Писать умеет огромное количество людей на Планете, однако многие ли могут похвастаться тем, что написали что-нибудь вроде "Войны и Мира".
При этом, заметьте! Существует огромнейшее число прекрасных рассказов, рассказиков, эссе, да и просто оборотов и выражений, написанных далеко не гениальными писателями. Это не ода в пользу бесталанных и не попытка добывать золото из пустой породы. Это реалии нашей жизни.
Чтобы не быть голословным, хочу предложить разработанные мной (до Ваших публикаций) различные
методы расчета адресов в области экрана (для "Спектрума"). |
|
Процедура расчета адреса знакоместа самая быстрая и короткая. |
7B |
LD |
A, E |
|
E 6 18 |
AND |
18H |
|
C6 40 |
ADD |
A, 40H |
|
67 |
LD |
H, A - |
H сформирован |
7B |
LD |
A, E |
|
E6 07 |
AND |
7 |
|
0F |
RRCA |
|
|
0F |
RRCA |
|
|
0F |
RRCA |
|
|
82 |
ADD |
A, D |
|
6F |
LD |
L,A - |
L сформирован |
|
На входе: E - номер строки, D |
- номер столбца. |
|
На выходе: DE - |
без изменения; HL - адрес верхнего байта в знакоместе; |
|
Если нужен адрес другого байта в том же знакоместе, то следует ADD A,40H заменить на ADD A,40H+n где |
n=0-7. Процедура занимает 14 байт. |
|
|
Другая процедура, использующая только HL и A. |
7D |
LD |
A, L |
|
E6 07 |
AND |
7 |
|
0F |
RRCA |
|
|
0F |
RRCA |
|
|
0F
84 |
RRCA ADD |
A, H |
|
65 |
LD |
H, L |
|
6F |
LD |
L,A - |
L сформирован |
7C |
LD |
A, H |
|
E6 18 |
AND |
18H |
|
F6 40 |
OR |
40H |
|
67 |
LD |
H, A - |
H сформирован |
|
На входе: L - строка, H столбец. |
|
На выходе: HL - |
адрес верхнего байта в знакоместе. |
|
После ваших публикаций на эту тему нет смысла подробно объяснять, как они работают. Одно могу сказать, |
они короче и быстрее данных Вами, а это очень существенно для больших циклов. |
|
У меня есть еще процедуры определения адреса байта атрибутов по адресу байта знакоместа; своя процедура |
(короче |
и быстрее) рисования точки; процедура рисования линии, отличающаяся от Вашей; своя процедура печати |
всех символов и т.д.
Конечно, это не "алмазы", а скорее "перлы". Но ведь кто-то сможет предложить и настоящий бриллиант! При этом сэкономит кому-то, делающему солидные программы, время и нервы.
* * *
Развивая плодотворную этюдную идею, мы не можем не привести несколько этюдов, присланных нам другим корреспондентом.
© В.Акопов, г. Ужур, 1994г.
Свои первые успехи в машинных кодах я сделал, когда прочитал в ZX-РЕВЮ "40 Лучших Процедур". Мне 15 лет и я мечтаю стать программистом. Предлагаю на суд читателей несколько собственных этюдов. Они перемещаемы и потому адреса не указаны.
Программа "ЗАТУХАНИЕ".
Эта программа была написана под впечатлением от работы с языком "MEGA-BASIC", в частности, с функцией FADE_0. Программа исполняет постепенное гашение экрана, манипулируя с атрибутами.
F3 |
|
DI |
|
010000 |
|
LD |
BC,#0000 |
165B |
|
LD |
D, #5B |
210058 |
AGAIN |
LD |
HL,#5800 |
7E |
NEXT_A |
LD |
A,(HL) |
B9 |
|
CP |
C |
2801 |
|
JR |
Z,NEXT_B |
35 |
|
DEC |
(HL) |
23 |
NEXT_B |
INC |
HL |
7C |
|
LD |
A, H |
BA |
|
CP |
D |
20F6 |
|
JR |
NZ,NEXT_A |
10F1 |
|
DJNZ |
AGAIN |
FB |
|
EI |
|
C9 |
|
RET |
|
Программа "KODEK".
Программа "КОДЕК" (КОдер-ДЕКодер) при первом вызове кодирует блок кодов с помощью "ключа", а при повторном - декодирует. "Ключом" является произвольная последовательность символов любой длины. Маркером конца "ключа" служит байт с включенным седьмым битом. В начале программы в HL задается начальный адрес блока кодов, подлежащего кодированию или декодированию; в ВС - длина кодируемого блока кодов; а в DE - начальный
адрес "ключа". |
|
|
|
|
210000 |
|
|
LD |
HL,START |
010000 |
|
|
LD |
BC,LENGTH |
110000 |
NEXT |
_A |
LD |
DE,KEY-ADR |
1A |
NEXT |
_B |
LD |
A,(DE) |
AE |
|
|
XOR |
(HL) |
77 |
|
|
LD |
(HL),A |
23 |
|
|
INC |
HL |
0B |
|
|
DEC |
BC |
78 |
|
|
LD |
A, B |
B1 |
|
|
OR |
C |
C8 |
|
|
RET |
Z |
13 |
|
|
INC |
DE |
1A |
|
|
LD |
A,(DE) |
CB7F |
|
|
BIT |
7,A |
28F2 |
|
|
JR |
Z,NEXT_B |
18ED |
|
|
JR |
NEXT_A |
ПЕЧАТЬ СИМВОЛОВ ДВОЙНОЙ ВЫСОТЫ
Эта программа является машиннокодовым вариантом программы, опубликованной в одном из выпусков журнала "Радиолюбитель" за 1992 г. Она быстро распечатывает сообщение из 32-х (максимум) знаков в заданных координатах с двойной высотой.
Для работы программы предварительно необходимо занести данные в ячейки памяти, начиная с 5В00Н (23296). Это можно сделать при помощи POKE из Бейсика.
23296 - координата Y (от 0 до 21).
23297 - координата X (от 0 до 31).
23298 - длина текста (от 1 до 32).
23299 - начальный адрес текста.
ED5B005B LD DE, (#5B00)
7B LD A,E
E618 AND #18
F640 OR #40
67 LD H,A
7B LD A,E
E607 |
|
|
AND |
#07 |
B7 |
|
|
OR |
A |
1F |
|
|
RRA |
|
1F |
|
|
RRA |
|
1F |
|
|
RRA |
|
1F |
|
|
RRA |
|
82 |
|
|
ADD |
A, D |
6F |
|
|
LD |
L,A |
2B |
|
|
DEC |
HL |
22005B |
|
|
LD |
(#5B00),HL |
3A025B |
|
|
LD |
A,(#5B02) |
47 |
|
|
LD |
B, A |
0E01 |
|
|
LD |
C, #01 |
C5 |
N_ |
_LETTER |
PUSH |
BC |
DD2A005B |
|
|
LD |
IX, (#5B00) |
DD23 |
|
|
INC |
IX |
DD22005B |
|
|
LD |
(#5B00),IX |
1600 |
|
|
LD |
D, #00 |
59 |
|
|
LD |
E, C |
21025B |
|
|
LD |
HL,#5B02 |
19 |
|
|
ADD |
HL, DE |
7E |
|
|
LD |
A,(HL) |
2600 |
|
|
LD |
H, #00 |
6F |
|
|
LD |
L,A |
29 |
|
|
ADD |
HL, HL |
29 |
|
|
ADD |
HL, HL |
29 |
|
|
ADD |
HL, HL |
54 |
|
|
LD |
D, H |
5D |
|
|
LD |
E, L |
2A365C |
|
|
LD |
HL, (#5C36) |
19 |
|
|
ADD |
HL, DE |
DDE5 |
|
|
PUSH |
IX |
D1 |
|
|
POP |
DE |
0604 |
|
|
LD |
B, #04 |
7E |
N_ |
LINE1 |
LD |
A,(HL) |
12 |
|
|
LD |
(DE),A |
14 |
|
|
INC |
D |
12 |
|
|
LD |
(DE),A |
14 |
|
|
INC |
D |
23 |
|
|
INC |
HL |
10F8 |
|
|
DJNZ |
N_LINE1 |
112000 |
|
|
LD |
DE,#0020 |
DD19 |
|
|
ADD |
IX, DE |
DDE5 |
|
|
PUSH |
IX |
D1 |
|
|
POP |
DE |
0604 |
N_ |
LINE2 |
LD |
B, #04 |
7E |
|
|
LD |
A,(HL) |
12 |
|
|
LD |
(DE),A |
14 |
|
|
INC |
D |
12 |
|
|
LD |
(DE),A |
14 |
|
|
INC |
D |
23 |
|
|
INC |
HL |
10F8 |
|
|
DJNZ |
N_LINE2 |
C1 |
|
|
POP |
BC |
0C |
|
|
INC |
C |
10BE |
|
|
DJNZ |
N_LETTER |
C9 |
|
|
RET |
|
1 CLEAR 5 9999
5 LOAD "screen" CODE 16384 10 FOR x=60000 TO 60031
2 0 READ a: POKE x,a: NEXT x
30 DATA 6,6,197,33,255,87,14,32,167,0,203,38,0,203,6,0 40 DATA 203,38,0,43,13,32,242,62,63,188,32,234,193,16,227,201 50 PAUSE 0: RANDOMIZE USR 60000
Приводим дисассемблер блока кодов, формируемого программой.
EA60 |
0606 |
LD |
b, #06 |
EA62 |
C5 |
PUSH |
BC |
EA63 |
21FF57 |
LD |
HL,#57FF |
EA66 |
0E20 |
LD |
C, #20 |
EA68 |
A7 |
AND |
A |
EA69 |
00 |
NOP |
|
EA6A |
CB2 6 |
SLA |
(HL) |
EA6C |
00 |
NOP |
|
EA6D |
CB06 |
RLC |
(HL) |
EA6F |
00 |
NOP |
|
EA7 0 |
CB2 6 |
SLA |
(HL) |
EA72 |
00 |
NOP |
|
EA7 3 |
2B |
DEC |
HL |
EA7 4 |
0D |
DEC |
C |
EA7 5 |
20F2 |
JR |
NZ,#EA69 |
EA7 7 |
3E3F |
LD |
A, #3F |
EA7 9 |
BC |
CP |
H |
EA7A |
2 0EA |
JR |
NZ,#EA66 |
EA7C |
C1 |
POP |
BC |
EA7D |
10E3 |
DJNZ |
#EA62 |
EA7F |
C9 |
RET |
|
Вторая программа называется "ВОТ ТАК!". Она попала к нашему корреспонденту от неизвестного автора. Приводим её также с непринципиальными изменениями.
ВОТ ТАК!
1 BORDER 0: PAPER 0: INK 0: CLEAR 4 9999 5 LOAD "screen"CODE 16384 10 FOR f=50000 TO 50051 20 READ a: POKE f,a 30 NEXT f
4 0 DATA 62,1,167,8,6,9,17,0,24 50 DATA 33,56,223,43,27,122,179 60 DATA 40,19,203,242,8,23,23 70 DATA 23,23,245,166,235,182 80 DATA 235,18,241,8,203,178,24 DATA 231,16,223,201,17,56 DATA 199,33,0,64,1,0,24,237
DATA 17 6,201 RANDOMIZE USR 50040 INK 7: CLS : PAUSE 0 RANDOMIZE USR 50000
В строке 5, как и в предыдущей программе, для наглядности загружается любая картинка-экран. В строке 120 содержимое дисплейного файла перебрасывается в буфер, затем экран очищается. После нажатия на любую клавишу происходит интересный эффект. Для тех, кто заинтересовался им, приводим дисассемблер формируемого программой
блока кодов. |
|
|
C350 |
3E01 |
LD |
A, #01 |
C352 |
A7 |
AND |
A |
C353 |
08 |
EX |
AF,AF' |
C354 |
0609 |
LD |
B, #09 |
C356 |
110018 |
LD |
DE,#1800 |
C359 |
2138DF |
LD |
HL,#DF38 |
C35C |
2B |
DEC |
HL |
C35D |
1B |
DEC |
DE |
C35E |
7A |
LD |
A, D |
C35F |
B3 |
OR |
E |
C360 |
2813 |
JR |
Z,#C37 5 |
C362 |
CBF2 |
SET |
6, D |
C364 |
08 |
C3 65 |
17 |
C366 |
17 |
C367 |
17 |
C3 68 |
17 |
C369 |
F5 |
C3 6A |
A6 |
C36B |
EB |
C36C |
B6 |
C36D |
EB |
C36E |
12 |
C36F |
F1 |
C37 0 |
08 |
C371 |
CBB2 |
C373 |
18E7 |
C375 |
10DF |
C377 |
C9 |
EX |
AF,AF' |
RLA |
|
RLA |
|
RLA |
|
RLA |
|
PUSH |
AF |
AND |
(HL) |
EX |
DE, HL |
OR |
(HL) |
EX |
DE, HL |
LD |
(DE),A |
POP |
AF |
EX |
AF,AF' |
RES |
6, D |
JR |
#C35C |
DJNZ |
#C356 |
RET |
|
C378 1138C7 |
LD |
DE,#C738 |
C37B 210040 |
LD |
HL,#4000 |
C37E 010018 |
LD |
BC,#1800 |
C381 EDB0 |
LDIR |
|
C383 C9 |
RET |
* * * |
Прочитав в |
первом номере ZX-РЕВЮ "Бегущую строку" М. Титова, |
придумал другую подобную программу и предлагает её нашим читателям. |
Строками 16, 76 и 77 можно изменить скорость исполнения программы. |
|
|
© Лесняк В.А., Северодвинск,1994. |
|
|
TITRE |
1 |
CALL |
INIT |
2 LOOP |
CALL |
TITRE |
3 |
LD |
A, #7F |
4 |
IN |
A,(#FE) |
5 |
RR |
A |
6 |
JR |
C,LOOP |
7 |
RET |
|
8 INIT |
LD |
HL,TEXT |
9 |
LD |
(STARTLET),HL |
10 |
LD |
(COUNTLET),HL |
11 |
XOR |
A |
12 |
LD |
(LINEINCHAR),A |
13 |
RET |
|
14 TITRE |
DI |
|
15 |
CALL |
SCROLL |
16 |
CALL |
SCROLL ; можно удалить |
17 |
LD |
HL,(COUNTLET) |
18 |
LD |
IX,BUFFER |
19 |
LD |
A,(HL) |
20 |
CP |
0 |
21 |
JR |
NZ, LABEL1 |
22 |
LD |
HL,(STARTLET) |
23 |
LD |
(COUNTLET),HL |
24 LABEL1 |
LD |
B,16 |
25 LOOP3 |
PUSH |
BC |
26 |
PUSH |
HL |
27 |
LD |
L,(HL) |
28 |
LD |
H, 0 |
29 |
ADD |
HL, HL |
30 |
ADD |
HL, HL |
31 |
ADD |
HL, HL |
32 |
LD |
A,(LINEINCHAR) |
33 |
LD |
C,A |
34 |
LD |
B, 0 |
35 |
ADD |
HL, BC |
36 LD BC,(#5C36)
37 ADD HL, BC
38 LD A, (HL)
39 POP HL
40 LD BC,#0402
41 LOOP2 PUSH BC
42 LOOP1 RLA
43 PUSH AF
44 RL (IX+0)
45 POP AF
46 RL (IX+0)
47 DJNZ LOOP1
48 INC IX
49 POP BC
50 DEC C
51 JR NZ,LOOP2
52 POP BC
53 INC HL
54 DJNZ LOOP3
55 LD DE,#56E0
5 6 LD HL,BUFFER
57 LD BC,32
58 LDIR
59 LD DE,#55E0
60 LD HL,BUFFER
61 LD BC,32
62 LDIR
63 LD A, (LINEINCHAR)
64 INC A
65 CP 08
66 JR NZ,LABEL2
67 LD BC,16
68 LD HL,(COUNTLET)
69 ADD HL, BC
70 LD (COUNTLET),HL
71 XOR A
72 LABEL2 LD (LINEINCHAR),A
73 EI
74 RET
75 SCROLL LD HL,#4000
76 LD DE,#4100 ; При удалении строки 16, здесь надо
77 LD C,191 ;поставить LD DE,#4200 и LD C,190.
78 L4 PUSH HL
79 PUSH DE
80 LD B,32
81 L1 LD A, (DE)
82 LD (HL),A
83 INC HL
84 INC DE
85 DJNZ L1
86 POP DE
87 POP HL
88 INC D
8 9 LD A, D
90 AND 07
91 JR NZ,L2
92 LD A, E
93 ADD A,32
94 LD E,A
95 JR C,L2
96 LD A, D
97 SUB 08
98 LD D,A
99 L2 INC H
100 |
|
LD |
101 |
|
AND |
102 |
|
JR |
103 |
|
LD |
104 |
|
ADD |
105 |
|
LD |
106 |
|
JR |
107 |
|
LD |
108 |
|
SUB |
109 |
|
LD |
110 |
L3 |
DEC |
111 |
|
JR |
112 |
|
RET |
113 |
STARTLET |
DEFW |
114 |
COUNTLET |
DEFW |
115 |
LINEINCHAR |
DEFB |
116 |
BUFFER |
DEFS |
117 |
TEXT |
DEFM |
118 |
|
DEFM |
119 |
|
DEFM |
120 |
|
DEFM |
121 |
|
DEFM |
122 |
|
DEFM |
123 |
|
DEFM |
124 |
|
NOP |
A, H
07
NZ, L3 A, L A,32 L,A
c, l3
A, H
08 H, A
C
NZ, L4
XXXX XXXX 0
32
"(C) Lesnjak V.A."
Special for ZX-REVIEW magazine 19.03.94
* * *
|
|