SRL Е
DJNZ L1 RET
Итак, яе очфиь длинная процедура плавного гашения экраиа может выглядеть так:
можно оставить только:
L2
SRL (HL)
что даст немалую экономию. Полу-
PAUSE |
EQU |
4 |
чилась се |
шее* |
KopowcM процедура, |
|
LD |
E, X0111U11 |
ее длина |
- 22 |
байта: |
|
LD |
B,8 |
|
|
|
L1 |
LD |
HL,#5800 |
PAUSE |
EQU |
4 |
L2 |
LD |
A,(HL) |
|
LD |
В,8 |
|
AND |
E |
LI |
LD |
HL,#5800 |
|
LD |
(HL),A |
L2 |
SRL |
(HL) |
|
INC |
HL |
|
INC |
HL |
|
LD |
A,H |
|
LD |
A,H |
|
CP |
#5B |
|
CP |
#5B |
|
JR |
NZ,L2 |
|
JR |
NZ,L2 |
|
LD |
C,PAUSE |
|
LD |
C,PAUSE |
L3 |
HALT |
|
L3 |
HALT |
|
|
DEC |
С |
|
DEC |
С |
|
JR |
NZ,L3 |
|
JR |
NZ,L3 |
|
SRL |
E |
|
DJNZ |
LI |
|
DJNZ |
LI |
|
RET |
|
|
RET |
|
|
|
|
Ассемблируем ее и смотрим, что получилось. Результат - 27 байтов. Теперь посмотрим, что в ней можно усовершенствовать.
Предложенный алгоритм с маской» присланный большинством чи-
однако изменение алгоритма проявилось в не очень приятном эффекте при работе. Это связано с тем, что значение PAPER, сдвигаясь вправо, становится INK'ом, что вызывает кратковременное "вспыхивание" последнего. Были также предложения внесто SRL (HL) использовать команду SLA (HL), что через восемь повторений также приведет к очистке экрана. Но, видимо, все-таки на такое ухудшение эффекта не стоит идти ради нескольких байтов.
Теперь обратинся к работе, которую прислал поОелиявль - А.Па-лоусов (г.Комсомольск-на-Амуре). Присланные им 24 байта пока что являются лучшим вариантом. А достигнут такой результат благодаря паре оригинальных идей, на которых мы остановимся подробнее.
Первая оригинальная идея. Команда :
LD HL,#5800
занимает 3 байта. Но в регистр L все равно заносится ноль. Этим обстоятельством удобно воспользоваться, поменяв порядок следования частей процедуры: вначале задержка, затем - уменьшение числа в файле атрибутов. При этой, используя для задержки регистр L, который к концу задержки все равно обнуляется, удалось выгадать еще один байт (см. строки 50-90 листинга ниже).
Вторая оригинальная идея. Не обязательно организовывать цикл из 8 повторений, используя регистр В и последующую команду DJNZ ... Вполне можно обойтись и регистром, в котором хранится маска. При каждом SRL-сдвиге очередная "единица" будет передаваться флагу С, и как только "единицы" кончатся, значение флага изненится, что и послужит сигналом к завершению процедуры (см. строку 180 листинга ниже).
Итак, наиболее оптинальный вариант процедуры-победителя:
00010 |
PAUSE |
EQU |
4 |
00020 |
|
ORG |
40 |
00030 |
|
ENT |
|
00040 |
|
LD |
в,: |
00050 |
L1 |
LD |
L,1 |
00060 |
L3 |
HALT |
|
00070 |
|
DEC |
L |
00080 |
|
JR |
NZ |
00090 |
|
LD |
H, |
00100 |
L2 |
LD |
A, |
00110 |
AND |
В |
00120 |
LD |
(HL),A |
00130 |
INC |
HL |
00140 |
LD |
A,H |
00150 |
CP |
#5B |
00160 |
JR |
NZ,L2 |
00170 |
SRL |
В |
00180 |
JR |
С,LI |
00190 |
RET |
|
Start of object: #9С40 (40000)
Length : #0018 (00024)
Executes : #9C40 (40000)
Шестнадцатиричный дамп процедуры:
9С40: 06 7F 2Е 04 76 2D 20 FC :52 9С48: 26 58 7Е АО 77 23 7С FE :94 9С50: 5В 20 F7 CB 38 38 ЕВ С9 :4D
Справедливости ради сообщаем, что вторая оригинальная идея содержалась также и в програиие, которую прислал Александр Корота (г.Краснодар), однако в целом его программа немного "не дотянула" до победы.
Теперь еще одно частное замечание, касающееся скорости очистки экрана. Может быть, нет необходимости занимать для задержки даже 6 байтов с однобайтовым регистром. Вполне приемлемый зрительный эффект получается при значении PAUSE=3 или даже PAUSED , следовательно, вместо шести иожно обойтись вообще треня байтами :
HALT HALT HALT
(или даже двуня, ускорив процедуру еще на один HALT). При этом процедура превратится в ну очень короткую, однако это совсен уж частный случай, поэтому он при подсчете байтов учитываться не будет, хотя на практике вполне ножет использоваться.
Хотим также отметить работу Антона Сидоренко (п.Мурмаши). Длина его процедуры 25 байтов, и хотя это на один байт длиннее работы А.Палоусова, но в его работе тоже содержится момент, заслуживающий внимания. Хитрость заключается в использовании для задержки все того же регистра HL, отслеживающего адрес. Вот как этот момент реализован в его процедуре (см. строки 120-150):
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
LD |
C,*01111111 |
00040 |
L1 |
LD |
HL,#5800 |
00050 |
L2 |
LD |
A,(HL) |
00060 |
|
AND |
С |
00070 |
|
LD |
(HL),A |
00080 |
|
INC |
HL |
00090 |
|
LD |
A,H |
00100 |
|
CP |
#5B |
00110 |
|
JR |
NZ ,L2 |
00120 |
L3 |
DEC |
HL |
00130 |
|
LD |
A,H |
00140 |
|
CP |
#50 |
00150 |
|
JR |
NZ,L3 |
00160 |
|
SRL |
С |
00170 |
|
JR |
С,LI |
00180 |
|
RET |
|
Start of object: #9C40 (40000)
Length : #0019 (00025)
Executes : #9C40 (40000)
Задержка определяется числом в строке 140, с которым сравнивается значение HL, которое к этому моменту равно #5В00. Минимальная задержка здесь будет при сравнении с числом #5А (практически отсутствие задержки, так как это значение регистр Н примет всего после одной команды DEC HL; после #5В00 в HL станет #5AFF). Максимальную задержку даст сравнение с
числом #5В.
Иной вариант, дающий тот же результат:
L3 INC HL
LD А,Н
CP #66
JR NZ,L3
Хотя оба варианта с использованием для задержки регистра HL не дают выигрыша перед использованием однобайтового регистра (длина фрагмента тоже 6 байтов), однако такой прием может пригодиться в тех случаях, когда прерывания по какому-либо условию запрещены, так что нет возможности воспользоваться для задержки командой HALT и однобайтовым счетчиком. Иными словами можно сказать, что повышается универсальность процедуры.
Кстати, Антон Сидоренко прислал и процедуру для плавного зажигания экрана, которую можно использовать в паре с процедурой гашения экрана. Экран должен быть заранее помещен по адресу, указанному меткой BUFF.
00010 |
BUFF EQU |
41000 |
00020 |
|
ORG |
40025 |
00030 |
|
ENT |
|
00040 |
|
LD |
HL,BUFF |
00050 |
|
LD |
DE,16384 |
00060 |
|
LD |
BC,614 4 |
00070 |
|
LDI* |
00080 |
|
LD |
C,0 |
00090 |
L2 |
LD |
HL,22528 |
00100 |
|
LD |
DE,BUFF+6144 |
00110 |
L0 |
LD |
A,(DE) |
00120 |
|
AND |
С |
00130 |
|
LD |
(HL),A |
00140 |
|
INC |
HL |
00150 |
|
INC |
DE |
00160 |
|
LD |
A,H |
00170 |
|
CP |
91 |
00180 |
|
JR |
NZ,L0 |
00190 |
LI |
DEC |
HL |
00200 |
|
LD |
A,H |
00210 |
|
CP |
65 |
00220 |
|
JR |
NC,L1 |
00230 |
|
RL |
С |
00240 |
|
JR |
NC,L2 |
00250 |
|
RET |
|
Start |
of |
object: |
#9C59 (40025) |
Length |
: |
#0028 (00040) |
Executes
#9С59 (40025)
Вместе обе процедуры занимают 65 байтов (вместо 128 у Александра Шишкина).
При переброске дисплейного файла в экран (строки 40-70), картинка сразу же проявляется цветом INK. Поэтому перед переброской экран должен быть очищен с
установкой PAPER 0; INK 0 обяза |
00100 |
|
LD |
(DE),A |
тельно no всему экрану, включая |
00110 |
|
INC |
DE |
две нижних строки. Из Бейсика это |
00120 |
|
INC |
HL |
можно выполнить так: |
00130 |
|
DEC |
ВС |
|
|
00140 |
|
LD |
А,В |
BORDER 0: PAPER 0: INK 0: |
00150 |
|
OR |
С |
|
РОКЕ 23624,0; CLS |
00160 |
|
JR |
NZ,LP2 |
|
|
00170 |
|
HALT |
|
но проще сделать это из машинного |
00180 |
|
HALT |
|
кода, дополнив |
процедуру Антона |
00190 |
|
HALT |
|
следующими строками: |
00200 |
|
HALT |
|
|
|
00210 |
|
POP |
AF |
00031 |
LD HL,16384 |
00220 |
|
DEC |
A |
00032 |
LD DE,16385 |
00230 |
|
JR |
NZ,LP1 |
00033 |
LD (HL),L |
00240 |
|
RET |
|
00034 |
LD ВС,6911 |
|
|
|
|
00035 |
LDIR |
Start of object: |
Ц9С40 (40000) |
|
|
Length |
: #001F (00031) |
что удлинит процедуру на 12 бай |
Executes |
: #9C40 (40000) |
тов, однако повысит ее качество. |
|
|
|
|
|
|
Можно |
менять |
. параметр в строке |
Шестнадцатиричный дамп объеди |
40 - это число проходов по экра |
ненного блока: |
|
ну, от которого зависит качество |
|
|
очистки. |
А также параметр в стро- |
9С40: OE FF 21 |
00 58 7Е А1 77 :F8 |
ке 70: 6912 - |
с атрибутаии; 6144 |
9С48: 23 7С FE |
5В 20 F7 2В 7С :9А |
- без атрибутов. |
|
9С50: FE 4В 20 |
FA СВ 39 38 ЕА .75 |
При значении 6912 |
первый napa- |
9С58: С9 21 00 |
40 11 01 40 75 :Е5 |
метр может быть меньше. |
9С60: 01 FF 1А |
ED ВО 21 28 АО :9С |
|
|
|
|
9С68: 11 00 40 |
01 00 18 ED ВО :0В |
Шестнадцатиричный дамп: |
9С70: 0Е 00 21 |
00 58 11 28 В8 :84 |
|
|
|
|
9С78: 1А А1 77 |
23 13 7С FE 5В :51 |
9С40: 21 |
00 00 |
ЗЕ 0А |
F5 11 00 :4B |
9С80: 20 F6 2В |
7С FE 41 30 FA :42 |
9С48: 40 |
01 00 |
18 1А |
A6 12 13 :22 |
9С88: СВ 11 30 |
Е6 С9 00 00 00 :DF |
9С50: 23 |
0В 78 |
В1 20 |
F6 76 76 :45 |
|
|
9С58: 76 |
76 F1 |
3D 20 |
E7 C9 00 :DE |
Программы, выполняющие эффекты |
|
|
|
|
с экраном (гашение или вывод кар |
(С) Алексей |
Соколов (Hackers |
тинки) содержатся и в других |
United Group), |
г.Чебоксары, 1995. |
письмах. Вот некоторые из них. |
|
|
|
|
|
|
Предлагаю ною собственную про |
|
|
цедуру в |
духе гашения экрана, но |
(С) Александр Корота (THREE STARS |
делающую |
это, |
по-иоеиу, гораздо |
CO.,LTD), |
г.Краснодар, 1995. |
эффектнее: |
|
|
Процедура реализует затухание |
00010 |
PAUSE |
EQU |
2500 |
экрана по точкам, в случайной по |
00020 |
|
ORG |
40000 |
рядке . |
|
00030 |
|
ENT |
|
|
|
00040 |
|
LD |
DE, 7 |
00010 |
ORG 40000 |
00050 |
|
LD |
C,7 |
00020 |
ENT |
00060 |
L5 |
LD |
B, 7 |
00030 |
LD HL,0 |
00070 |
|
LD |
HL,22528 |
00040 |
LD A,10 |
00080 |
L4 |
PUSH |
HL |
00050 LP1 |
PUSH AF |
00090 |
L3 |
LD |
A,(HL) |
00060 |
LD DE,16384 |
00100 |
|
AND |
63 |
00070 |
LD ВС,6144 |
00110 |
|
SUB |
8 |
00080 LP2 |
LD A,(DE) |
00120 |
|
JR |
C,L1 |
00090 |
AND (HL) |
00130 |
|
LD |
(HL),A |
ЭТЮДЫ
00140 LI 00150 00160 00170 L2 00180 00190 00200 00210 00220 L6 00230 00240 00250 00260 00270 00280 00290 00300 00310
Start of object: #9C40 (40000) Length : #002E (00046)
Executes : #9C40 (40000)
Шестнадцатиричный дамп:
9C40: 11 07 00 OE 07 06 07 21 :37
9C48: 00 58 E5 7E E6 3F D6 08 :A2
9C50: 38 01 77 E6 07 28 01 35 :E7
9C58: 19 1С FE 5B 38 ED 21 C4 :EC
9C60: 09 2B 7C B5 20 FB El 23 :80
9C68: 10 E0 OD 20 D8 C9 00 00 :C2
Если строку 70 переименовать в 35, а строку 270 в 285, то получится не менее интересный эффект.
Следующая программа выполняет вывод на экран картинки довольно эффектным образом.
Похожий эффект мы видели в дисковой версии игры ROCK STAR. Условно назовем его "наливание экрана". При работе программы необходимо, чтобы цвет INK на экране был контрастен цвету PAPER. Хорошие результаты дает темный PAPER и светлый INK.
При разработке программы я использовал несколько измененную процедуру А.А.Иванова для расчета адреса знакоместа в экранной области . Картинка предварительно помещается по адресу, указанному меткой BUFF.
00010 BUFF EQU 41000 00020 ORG 40000
00030 ENT
AND |
7 |
JR |
Z,L2 |
DEC |
(HL) |
ADD |
HL,DE |
LD |
A,H |
CP |
91 |
JR |
C,L3 |
LD |
HL,PAUSE |
DEC |
HL |
LD |
A,H |
OR |
L |
JR |
NZ ,L6 |
POP |
HL |
INC |
HL |
DJNZ |
L4 |
DEC |
С |
JR |
NZ,L5 |
RET |
|
00040 |
|
LD |
C, 191 |
00050 |
L2 |
LD |
B,C |
00060 |
|
LD |
А,В |
00070 |
|
CALL |
ADR |
00080 |
|
LD |
HL,BUFF-16384 |
00090 |
|
ADD |
HL,DE |
00100 |
LI |
LD |
А,В |
00110 |
|
CALL |
ADR |
00120 |
|
PUSH |
BC |
00130 |
|
PUSH |
HL |
00140 |
|
LD |
BC, 32 |
00150 |
|
LDIR |
|
00160 |
|
POP |
HL |
00170 |
|
POP |
BC |
00180 |
|
DJNZ |
LI |
00190 |
|
DEC |
С |
00200 |
|
JR |
NZ ,L2 |
00210 |
|
LD |
HL,BUFF+6144 |
00220 |
|
LD |
DE,22528 |
00230 |
|
LD |
BC,768 |
00240 |
|
LDIR |
|
00250 |
|
RET |
|
00260 |
ADR |
LD |
D, 0 |
00270 |
|
RRCA |
|
00280 |
|
RRCA |
|
00290 |
|
RRCA |
|
00300 |
|
AND |
31 |
00310 |
|
LD |
E, A |
00320 |
|
AND |
7 |
00330 |
|
RRCA |
|
00340 |
|
RRCA |
|
00350 |
|
RRCA |
|
00360 |
|
ADD |
A,D |
00370 |
|
LD |
D,E |
00380 |
|
LD |
E,A |
00390 |
|
LD |
A,D |
00400 |
|
AND |
#18 |
00410 |
|
OR |
#40 |
00420 |
|
LD |
D, A |
00430 |
|
LD |
А,В |
00440 |
|
AND |
7 |
00450 |
|
RET |
Z |
00460 |
L3 |
INC |
D |
00470 |
|
DEC |
A |
00480 |
|
JR |
NZ,L3 |
00490 |
|
RET |
|
Start of object: #9C40 (40000) Length : #0048 (00072)
Executes : #9C40 (40000)
Шестнадцатиричный дамп:
9C40: 0E BF 41 78 CD 69 9C 21 :55
9C48: 28 60 19 78 CD 69 9C C5 :94
9C50: E5 01 20 00 ED B0 El Cl :31
9C58: 10 F1 0D 20 E5 21 28 B8 :08
9C60: 11 00 58 01 00 03 ED B0 :06
ЭТЮДЫ |
|
9С68: С9 16 00 |
OF OF |
OF E6 IF :15 |
После завершения работы первой |
9С70: 5F Бб 07 |
OF OF |
OF 82 53 :5A |
программы, картинку |
иожно эапи- |
9С78: 5F 7А Еб |
18 F6 |
40 57 78 :F0 |
сать на диск или ленту, чтобы по |
9С80: Еб 07 С8 |
14 3D |
20 FC C9 :07 |
том красиво выдать |
ee на экран |
|
|
|
при поиощи второй програииы: |
(С) Руслан Васильков |
г.Зелено- |
00010 BUFF |
EQU |
41000 |
горек (Красноярск-45), 1995. |
00020 |
ORG |
40100 |
|
|
|
00030 |
ENT |
|
Хочу предложить программу, ко |
00040 |
XOR |
A |
торая выводит |
на экран заставку, |
00050 |
LD |
(SYSTEM),A |
но необычный способом. Формат эк |
00060 |
LD |
IX,BUFF |
рана существенно отличается от |
00070 |
LD |
ВС,6144 |
стандартного |
фориата - это боль- |
00080 |
ADD |
IX, ВС |
шой спрайт. Первая програииа пе |
00090 |
LD |
HL,BUFF |
реформатирует |
картинку, эагружен- |
00100 |
LD |
B,0 |
ную на экран. |
Реэультат будет по- |
00110 |
CALL |
LINE |
иещен в буфер |
, указанный меткой |
00120 START |
PUSH |
ВС |
BUFF. |
|
|
00130 |
PUSH |
IX |
|
|
|
00140 |
PUSH |
DE |
00010 BUFF |
EQU |
41000 |
00150 |
LD |
ВС, 32 |
00020 |
ORG |
40000 |
00160 |
LDIR |
|
00030 |
ENT |
|
00170 |
POP |
DE |
00040 |
LD |
HL,16384 |
00180 |
PUSH |
DE |
00050 |
LD |
DE,BUFF |
00190 |
LD |
A,D |
00060 |
LD |
B, 192 |
00200 |
RRCA |
|
00070 LOOP |
PUSH |
ВС |
00210 |
RRCA |
|
00080 |
PUSH |
HL |
00220 |
RRCA |
|
00090 |
LD |
ВС,32 |
00230 |
AND |
3 |
00100 |
LDIR |
|
00240 |
OR |
88 |
00110 |
POP |
HL |
00250 |
LD |
D,A |
00120 |
POP |
ВС |
00260 |
LD |
ВС, 32 |
00130 |
CALL |
LINE |
00270 |
PUSH |
HL |
00140 |
DJNZ |
LOOP |
00280 |
PUSH |
IX |
00150 |
LD |
HL,BUFF |
00290 |
POP |
HL |
00160 |
LD |
DE,22528 |
00300 |
LDIR |
|
00170 |
LD |
ВС,6144 |
00310 |
POP |
HL |
00180 |
ADD |
HL,BC |
00320 |
POP |
DE |
00190 |
EX |
DE,HL |
00330 |
POP |
IX |
00200 |
LD |
ВС,768 |
00340 |
POP |
ВС |
00210 |
LDIR |
|
00350 |
LD |
A,(SYSTEM) |
00220 |
RET |
|
00360 |
INC |
A |
00230 LINE |
INC |
H |
00370 |
CP |
8 |
00240 |
LD |
A,H |
00380 |
JR |
NZ,GOTO |
00250 |
AND |
7 |
00390 |
XOR |
A |
00260 |
RET |
NZ |
00400 |
PUSH |
ВС |
00270 |
LD |
A,L |
00410 |
LD |
ВС, 32 |
00280 |
ADD |
A,32 |
00420 |
ADD |
IX, ВС |
00290 |
LD |
L, A |
00430 |
POP |
ВС |
00300 |
RET |
С |
00440 GOTO |
LD |
(SYSTEM),А |
00310 |
LD |
A,H |
00450 |
PUSH |
ВС |
00320 |
SUB |
8 |
00460 |
PUSH |
DE |
00330 |
LD |
H,A |
00470 |
PUSH |
HL |
00340 |
RET |
|
00480 LOOP |
CALL |
LINE |
|
|
|
00490 |
PUSH |
DE |
Start of object: #9040 (40000) |
00500 |
PUSH |
ВС |
Length |
: #0036 (00054) |
00510 |
LD |
ВС, 32 |
Executes |
: #9C40 (40000) |
00520 |
SBC |
HL,BC |
ЭТЮДЫ
00530 |
|
LDIR |
|
00540 |
|
POP |
BC |
00550 |
|
POP |
DE |
00560 |
|
INC |
В |
00570 |
|
LD |
А,В |
00580 |
|
CP |
192 |
00590 |
|
JR |
NZ,LOOP |
00600 |
|
POP |
HL |
00610 |
|
POP |
DE |
00620 |
|
POP |
BC |
00630 |
|
INC |
в |
00640 |
|
CALL |
LINE |
00650 |
|
LD |
А,В |
00660 |
|
CP |
192 |
00670 |
|
JR |
NZ,START |
00680 |
|
RET |
|
00690 |
LINE |
LD |
А,В |
00700 |
|
AND |
56 |
00710 |
|
RLCA |
|
00720 |
|
RLCA |
|
00730 |
|
LD |
E,A |
00740 |
|
LD |
А,В |
00750 |
|
AND |
192 |
00760 |
|
RRCA |
|
00770 |
|
RRCA |
|
00780 |
|
RRCA |
|
00790 |
|
OR |
64 |
00800 |
|
LD |
D, A |
00810 |
|
LD |
А,В |
00820 |
|
AND |
7 |
00830 |
|
OR |
D |
00840 |
|
LD |
D,A |
0Q850 |
|
RET |
|
00860 |
SYSTEM |
DEFB |
0 |
Start of object: #9CA4 (40100)
Length : #0084 (00132)
Executes : #9CA4 (40100)
Дампы обоих процедур:
9C40: |
21 |
00 |
40 |
11 |
28 |
AO |
06 |
CO |
:DC |
9C48: |
C5 |
E5 |
01 |
20 |
00 |
ED |
BO |
El |
:2D |
9C50: |
CI |
CD |
57 |
9C |
10 |
F2 |
21 |
28 |
:C8 |
9C58: |
AO |
11 |
00 |
58 |
01 |
00 |
18 |
09 |
: IF |
9C60: |
EB |
01 |
00 |
03 |
ED |
BO |
C9 |
24 |
: 75 |
9C68: |
7C |
E6 |
07 |
CO |
7D |
C6 |
20 |
6F |
: FF |
9C70: |
D8 |
7C |
D6 |
08 |
67 |
C9 |
00 |
00 |
:6E |
9CA4: |
AF |
32 |
27 |
9D |
DD |
21 |
28 |
AO |
:AB |
9CAC: |
01 |
00 |
18 |
DD |
09 |
21 |
28 |
AO |
: 30 |
9CB4 : |
06 |
00 |
CD |
12 |
9D |
C5 |
DD |
E5 |
: 59 |
9CBC: |
D5 |
01 |
20 |
00 |
ED |
BO |
DI |
D5 |
: 91 |
9CC4: |
7A |
OF |
OF |
OF |
E6 |
03 |
F6 |
58 |
:3E |
9CCC: |
57 |
01 |
20 |
00 |
E5 |
DD |
E5 |
El |
: 68 |
9CD4: |
ED |
BO |
El |
DI |
DD |
El |
CI |
ЗА |
: 78 |
9CDC: |
27 |
9D |
3C |
FE |
08 |
20 |
08 |
AF |
: 55 |
9CE4: |
C5 |
01 |
20 |
00 |
DD |
09 |
CI |
32 |
:3F |
9CEC: 27 9D C5 D5 E5 CD 12 9D :47
9CF4: D5 C5 01 20 00 ED 42 ED :67
9CFC: B0 CI DI 04 78 FE CO 20 :34
9D04: EC El DI CI 04 CD 12 9D :80
9D0C: 78 FE CO 20 A8 C9 78 E6 :CE
9D14: 38 07 07 5F 78 E6 CO OF :83
9D1C: OF OF F6 40 57 78 E6 07 :C9
9D24: B2 57 C9 00 00 00 00 00 :93
Эффект похож на имеющийся в ROCK STAR или на программу предыдущего корреспондента. В предлагаемой программе процесс идет сверху вниз, поэтому условно его можно было бы назвать "налива-ние-наоборотм (может быть кто-то придумает более подходящее название). Кроме этого, в процесс вовлекаются и атрибуты, отче,го эффект, безусловно, выигрывает. Зато приходится предварительно кодировать картинку. Оптимальным был бы вариант объединения положительных качеств двух этих программ.
И еще одна программа очистки экрана. Правда она довольно долго работает (около б сек.), но мне все же нравится.
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
START |
LD |
HL,16384 |
00040 |
|
LD |
DE,6144 |
00050 |
|
PUSH |
DE |
00060 |
|
POP |
BC |
00070 |
LI |
LD |
A,(HL) |
00080 |
|
CP |
0 |
00090 |
|
JR |
Z,L2 |
00100 |
|
CALL |
L4 |
00110 |
|
LD |
(HL),A |
00120 |
|
JR |
L3 |
00130 |
L2 |
DEC |
DE |
00140 |
L3 |
INC |
HL |
00150 |
|
DEC |
BC |
00160 |
|
LD |
А,В |
00170 |
|
OR |
С |
00180 |
|
JR |
NZ ,L1 |
00190 |
|
LD |
A,D |
00200 |
|
OR |
E |
00210 |
|
JR |
NZ,START |
00220 |
|
RET |
|
00230 |
L4 |
LD |
(M2),A |
00240 |
|
LD |
A,(Ml) |
00250 |
|
CP |
0 |
00260 |
|
JR |
Z,L5 |
00270 00280 00290
00300
00301
00302
00303 00310 00320 L5 00330 00340 00350 00360 00370 00380 00390 00400 N1 00410 М2
Start of object: #9C40 (40000) Length : #0050 (00080)
Executes : #9C.40 (40000)
Некоторые комментарии. Эффект создается за счет сдвига битов в ячейках дисплейного файла влево (RLA) и вправо (RRA) в строках
300-301 и 350-380. Дело в том, что в авторском варианте строки
301-303 отсутствовали. Но здесь есть одна тонкость. Поскольку в ротацию вовлечен флаг С, то для полного оборота одного бита требуется девять, а не восемь команд RRA или RLA. Рассмотрим, что будет, если в строках с 300 будет одна команда RLA, а в строках с 350 - четыре команды RRA.
->-EbJ
Бит 5, например, после этого (еле во-вправо-вправо-вправо-вправо) окажется на месте бита 2. При следующем цикле он окажется в флаге С и, за счет этого, в дисплейном файле станет одним включенным битом меньше. Но если это будет, скажем, б бит, то его дальнейшая судьба будет такой:
6 - з - о - б ... и так далее по кругу, то есть невозможна ситуация, при которой этот бит попадает во флаг С. В
XOR
LD
LD
RLA
RLA
NOP
NOP
RET
INC
LD
LD
RRA
RRA
RRA
RRA
RET
DEFB
DEFB
это время перед Вами на экране наблюдается указанное бесконечное перемещение битов, но выхода из программы не произойдет.
Поэтому, чтобы программа не зацикливалась и не зависала, необходимо, чтобы результат суммы команд RLA и RRA не был кратен трем или девяти. Для этого и добавлена еще одна команда RRA в строке 301. Но для чего еще две команды NOP ? Это сделано для возможности последующей модификации программы из Бейсика или машинного кода (снижения ее детерминированности) . Дело в том, что комбинируя различное количество команд RRA и RLA (или только одной из них) в строках 300-303 и 350-380, можно получить интересные эффекты - попробуйте.
Кроме того, нам кажется, что атрибуты, остающиеся на экране после отработки программы, оставляют впечатление незавершенности. Поэтому рекомендуем дополнить программу еще несколькими строками:
00021 LD HL,22528
00022 LD DE,22529
00023 LD (HL),7
00024 LD ВС,767
00025 LDIR
В строке 23 задается любое подходящее значение атрибутов (в данном случае PAPER 0; INK 7).
Шестнадцатиричный дамп:
9С40 |
21 |
00 |
58 |
11 |
01 |
58 |
36 |
07 |
:FC |
9С48 |
01 |
FF |
02 |
ED |
ВО |
21 |
00 |
40 |
:Е4 |
9С50 |
11 |
00 |
18 |
D5 |
С1 |
7Е |
FE |
00 |
: 27 |
9С58 |
28 |
06 |
CD |
6С |
9С |
77 |
18 |
01 |
: 87 |
9С60 |
1В |
23 |
OB |
78 |
В1 |
20 |
ЕЕ |
7А |
:F6 |
9С68 |
ВЗ |
20 |
Е2 |
С9 |
32 |
8F |
9С |
ЗА |
: 19 |
9С70 |
8Е |
9С |
FE |
00 |
28 |
ОС |
AF |
32 |
: 49 |
9С78 |
8Е |
9С |
ЗА |
8F |
9С |
17 |
17 |
00 |
:D1 |
9С80 |
00 |
С9 |
ЗС |
32 |
8Е |
9С |
ЗА |
8F |
: 46 |
9С88 |
9С |
1F |
IF |
IF |
1F |
С9 |
00 |
00 |
: 05 |
(С) Георгий Новиков,
г.Серпухов, 1995.
Предлагаю программу для вывода на экран картинки.
ЭТЮДЫ
|
|
|
|
00060 |
|
|
LD |
(HL),7 |
00010 |
BUFF EQU |
41000 |
00070 |
|
|
LDIR |
|
00020 |
|
ORG |
40000 |
00080 |
|
|
LD |
B,#10 |
00030 |
|
ENT |
|
00090 |
ONE |
PUSH |
BC |
00040 |
|
XOR |
A |
00100 |
|
|
HALT |
|
00050 |
|
LD |
BC,23295 |
00110 |
|
|
LD |
A,R |
00060 |
LI |
LD |
HL,16384 |
00120 |
|
|
LD |
L,A |
00070 |
|
LD |
DE,BUFF |
00130 |
|
|
LD |
B,A |
00080 |
L2 |
EX |
DE,HL |
00140 |
|
|
LD |
H, #23 |
00090 |
|
SLA |
(HL) |
00150 |
|
|
LD |
DE,16384 |
00100 |
|
EX |
DE,HL |
00160 |
|
|
LD |
BC,6144 |
00110 |
|
RL |
(HL) |
00170 |
|
|
LDIR |
|
00120 |
|
INC |
HL |
00180 |
|
|
POP |
BC |
00130 |
|
INC |
DE |
00190 |
|
|
DJNZ |
ONE |
00140 |
|
PUSH |
HL |
00200 |
|
|
RET |
|
00150 |
|
SCF |
|
|
|
|
|
|
00160 |
|
SBC |
HL,BC |
Start |
of |
object: |
#9C40 (40000) |
00170 |
|
POP |
HL |
Length |
|
: #0023 (00035) |
00180 |
|
JR |
NC,L3 |
Executes |
|
: #9C40 (40000) |
00190 |
|
JR |
L2 |
|
|
|
|
|
00200 |
L3 |
INC |
A |
Шестнадцатиричный дамп: |
00210 |
|
CP |
8 |
|
|
|
|
|
00220 |
|
JR |
C,L1 |
9C40: 21 |
00 |
58 |
11 01 |
58 01 FF :BF |
00230 |
|
RET |
|
9C48: 02 |
36 |
07 |
ED B0 |
06 10 C5 :9B |
|
|
|
|
9C50: 76 |
ED |
5F |
6F 47 |
26 23 11 :BE |
Start |
of |
object: |
«9С40 (40000) |
9C58: 00 |
40 |
01 |
00 18 |
ED B0 CI :AB |
Length Executes
«0021 (00033) #9C40 (40000)
:С2
Шестнадцатиричный дамп:
9C40: АР 01 PF 5А 21 00 40 11 :57
9С48: 28 АО ЕВ СВ 26 ЕВ СВ 16 :54
9С50: 23 13 Е5 37 ED 42 Е1 30 :7Е
9С58: 02 18 EF ЗС FE 08 38 Е4 :5В
9С60: С9 00 00 00 00 00 00 00 ;С5
(С) Владимир Маркелов,
г.Кореновск,
Меня заинтересовала ваша статья об оригинальных шрифтах, которые можно получить из стандартного. Я придумал еще одну программу формирования оригинального шрифта.
(С) Руслан Крылов,
|
г.Владивосток, 1995. |
00010 |
ADR |
EQU |
4Ю00 |
|
|
00020 |
|
ORG |
40000 |
Хочу |
предложить небольшую |
00030 |
|
ENT |
|
программу, |
, которая создает эффект |
00040 |
|
LD |
HL,15615 |
"помехии |
на экране телевизора. |
00050 |
|
LD |
DE,ADR |
Она может |
использоваться, напри- |
00060 |
|
LD |
BC,768 |
мер так: |
эапуск "помехи", затем |
00070 |
NEXT |
PUSH |
DE |
вывод картинки или какой-либо |
00080 |
|
LD |
A,(HL) |
надписи. |
|
00090 |
|
AND |
X00001111 |
В строке 60 можно произвольно |
00100 |
|
LD |
D,A |
задавать |
цвет помехи (атрибуты |
00110 |
|
LD |
А,С |
экрана). |
|
00120 |
|
AND |
X00000111 |
|
|
00130 |
|
AND |
A |
00010 |
ORG 40000 |
00140 |
|
JR |
NZ,M1 |
00020 |
ENT |
00150 |
|
LD |
D, 0 |
00030 |
LD HL,22528 |
00160 |
Ml |
LD |
A,D |
00040 |
LD DE,22529 |
00170 |
|
INC |
HL |
00050 |
LD BC,767 |
00180 |
|
OR |
(HL) |
ЭТЮДЫ
00190 |
LD |
D,A |
00200 |
INC |
HL |
00210 |
LD |
A,(HL) |
00220 |
DEC |
HL |
00230 |
AND |
X11110000 |
00240 |
LD |
E,A |
00250 |
LD |
А,С |
00260 |
AND |
300000111 |
00270 |
CP |
1 |
00280 |
DR |
NZ,M2 |
00290 |
LD |
E, 0 |
00300 М2 |
LD |
A,E |
00310 |
OR |
D |
00320 |
POP |
DE |
00330 |
LD |
(DE),A |
00340 |
INC |
DE |
00350 |
DEC |
ВС |
00360 |
LD |
А,В |
00370 |
OR |
С |
00380 |
3R |
NZ,NEXT |
00390 |
RET |
|
Start of object: #9C40 (40000) Length : #003A (00058)
Executes : #9040 (40000)
Можно, no желанию, дополнить процедуру парой строк, подключающих полученный символьный набор:
00381 LD HL,ADR-256
00382 LD (23606),HL
Шестнадцатиричный дамп:
9C40: |
21 |
FF |
3C |
11 |
28 |
AO |
01 |
00 |
: 12 |
9C48: |
03 |
D5 |
7E |
Еб |
OF |
57 |
79 |
E6 |
:E5 |
9C50: |
07 |
A7 |
20 |
02 |
16 |
00 |
7A |
23 |
: 6F |
9C58: |
B6 |
57 |
23 |
7E |
2B |
Еб |
F0 |
5F |
: 02 |
9C60: |
79 |
E6 |
07 |
FE |
01 |
20 |
02 |
IE |
:A1 |
9C68: |
00 |
7B |
B2 |
D1 |
12 |
13 |
0B |
78 |
: AA |
9C70: |
B1 |
20 |
D6 |
21 |
28 |
9F |
22 |
36 |
:F3 |
9C78: |
5C |
C9 |
00 |
00 |
00 |
00 |
00 |
00 |
: 39 |
(С) Дмитрий Наумов,
г.Кемерово, 1995.
Предлагаю в рубрику "Этюды" свою програииу "Печатающий квадрат" . Впервые я ее увидел в книге "Как написать игру" фириы "Питер", но там она была на Бейсике и я решил сделать ее в кодах.
Текст сообщения должен располагаться в саиой первой Бейсик -строке после REM.
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
LD |
A,2 |
00040 |
|
CALL |
5633 |
00050 |
|
LD |
A,22 |
00060 |
|
RST |
16 |
00070 |
|
XOR |
A |
00080 |
|
RST |
16 |
00090 |
|
XOR |
A |
00100 |
|
RST |
16 |
00110 |
|
LD |
HL,23872 |
00120 |
LOOP |
LD |
A,(HL) |
00130 |
|
CP |
13 |
00140 |
|
OR |
Z,END |
00150 |
|
RST |
16 |
00160 |
|
LD |
A,143 |
00170 |
|
RST |
16 |
00180 |
|
LD |
A,8 |
00190 |
|
RST |
16 |
00200 |
|
INC |
HL |
00210 |
|
HALT |
|
00220 |
|
HALT |
|
00230 |
|
HALT |
|
00240 |
|
HALT |
|
00250 |
|
HALT |
|
00260 |
|
DR |
LOOP |
00270 |
END |
LD |
A,32 |
00280 |
|
RST |
16 |
00290 |
|
RET |
|
Start of object: #9C40 (40000)
Length : #0027 (00039)
Executes : #9C40 (40000)
Шестнадцатиричный дамп:
9C40: ЗЕ 02 CD 01 16 ЗЕ 16 D7 :2В
9С48: AF D7 AF D7 21 40 5D 7E :2C
9C50: FE 0D 28 OF D7 3E 8F D7 :A9
9C58: 3E 08 D7 23 76 76 76 76 :0C
9C60: 76 18 EC 3E 20 D7 C9 00 :74
В 110 строке задается адрес расположения текста для "Спектру-ма" с дисководом. Для магнитофонного варианта должно быть 23760.
Факт, заслуживающий внимания: автору этого письма - 12 лет! А наше мнение по этому поводу такое. Если у нас в стране в 12 лет не "свихиваются" на "Денди" и "Кенге", а программируют в машинных кодах, значит у нее будет прекрасное будущее. Ради этого и
работать хочетсяt