|
Этюды - Ученик 10 класса Сутурин Сергей пишет о том, что он внимательно просмотрел статьи в ZX-РЕВЮ-93 "Методы Билла Гильберта" (Михайленко B.C., Турович А.К., стр. 64) и "Стилизованные шрифты" (раздел "Маленькие хитрости", стр. 46). И вот что он в связи с этим придумал.
|
Ученик 10 класса Сутурин Сергей пишет о том, что он внимательно просмотрел статьи в ZX-РЕВЮ-93 "Методы Билла Гильберта" (Михайленко B.C., Турович А.К., стр. 64) и "Стилизованные шрифты" (раздел "Маленькие хитрости", стр. 46). И вот что он в связи с этим придумал.
© Сутурин Сергей, г. Находка, 1994. Знакогенератор стилизованного шрифта.
Подумав, я решил, что в больших серьезных программах (например, в играх) такой способ создания оригинального символьного набора вряд ли пригодится, так как новый символьный набор всё равно занимает положенные ему 768 байтов. Поэтому, подумав, я решил, что лучше сделать специальный знакогенератор для печати стилизованными шрифтами (Листинг_1).
Перед входом в эту процедуру, как и в случае использования RST #10, подпрограммой #1601 должен быть открыт соответствующий канал для печати. Код печатаемого символа также, как и для RST #10 должен находиться в аккумуляторе. Далее по адресу ADRESS происходит формирование нового стилизованного символа из заданного символа символьного набора ПЗУ. Переносятся и преобразуются 8 байт. Таким образом, не происходит предварительный перенос и модификация всех 96 печатных символов, а каждый символ формируется непосредственно в момент печати - генерируется символьный набор из одного единственного символа.
Далее происходит переключение CHARS на этот новый "односимвольный" символьный набор. Значение CHARS на 256 байт меньше значенияADRESS, благодаря этому сформированный символ можно распечатать, задав код для печати равный 32.Печатается всегда "пробел" (код 32), но образ его каждый раз определяется содержимым восьми байтов ADRESS, благодаря этому и происходит печать.
PUSH |
DE |
|
|
PUSH |
HL |
|
|
PUSH |
BC |
|
Сохранение всех регистров. |
CP |
32 |
|
|
JP |
C,EXIT |
|
Проверка на управляющий код. |
CP |
129 |
|
|
JP |
NC,EXIT |
|
Проверка на код токена. |
OR |
A |
|
Сброс флага С. |
LD |
DE,15360 |
|
Начало символьного набора из ПЗУ |
LD |
L,A |
|
|
LD |
H, 0 |
|
В результате в регистре HL |
ADC |
HL, HL |
|
|
ADC |
HL, HL |
|
получим адрес начала образа |
ADC |
HL, HL |
|
|
ADC |
HL, DE |
|
печатаемого символа. |
LD |
DE,ADRESS |
|
LD |
B, 8 |
|
Восьмикратный цикл процедуры |
CALL |
GENER |
|
переноса и преобразования. |
LD |
DE,256 |
|
B регистре HL получаем |
LD |
HL,ADRESS |
|
SBC |
HL, DE |
|
адрес нового CHARS. |
LD |
(23606), |
HL |
Переключаемся на него |
LD |
A,32 |
|
|
RST |
#10 |
|
и печатаем "пробел". |
LD |
HL,15360 |
|
восстанавливаем |
LD |
(23606), |
HL |
старый CHARS. |
POP |
BC |
|
|
POP |
HL |
|
|
POP |
DE |
|
восстанавливаем регистры |
RET |
|
|
и выход. |
RST |
#10 |
|
|
POP |
BC |
|
|
POP |
HL |
|
Обычная печать управляющих кодов |
POP |
DE |
|
|
RET |
|
|
или токенов. |
DEFW |
#0000 |
|
Резервируем 8 байтов |
DEFW |
#0000 |
|
под формируемый |
DEFW |
#0000 |
|
" односимвольный" |
DEFW |
#0000 |
|
символьный набор. |
LD |
A, (HL) |
|
|
LD C,A ;
RLA ; Процедура формирования
OR C ; одного стилизованного
LD (DE),A ; символа по адресу ADRESS.
INC HL ;
INC DE ;
DJNZ GENER ;
RET ;
GENER LD A,(HL) ; Второй вариант процедуры.
LD (DE),A ;
INC HL ;
INC DE ;
DJNZ GENER ;
LD DE,ADRESS+4 ;
LD B,4 ;
L1 LD A, (DE) ;
LD C,A ;
RLA ;
OR C ;
LD (DE),A ;
INC DE ;
DJNZ L1 ;
RET ;
GENER LD B,5 ; Третий вариант процедуры.
L1 LD A, (HL) ;
LD C,A ;
RLA ;
OR C ;
LD (DE),A ;
INC HL ;
INC DE ;
DJNZ L1 ;
INC DE ;
INC HL ;
INC DE ;
LD A,(HL) ;
LD C,A ;
RLA ;
OR C ;
LD C,A ;
SRL A ;
OR C ;
LD (DE),A ;
RET ;
GENER LD A,(HL) ; Четвертый вариант процедуры.
SRL A ;
LD (DE),A ;
INC HL ;
INC DE ;
DJNZ GENER ;
LD DE,ADRESS ;
LD B,8 ;
L1 LD A, (DE) ;
LD C,A ;
RLA ;
RLA ;
OR C ;
LD (DE),A ;
INC DE ;
DJNZ L1 ;
RET ;
GENER LD B,4 ; Пятый вариант процедуры.
L1 LD A, (HL) ;
LD (DE),A ;
INC HL ;
INC DE ;
DJNZ L1 ;
LD B,4 ;
L2 LD A, (HL) ;
RLA ;
LD (DE),A ;
INC DE ;
INC HL ;
DJNZ L2 ;
RET ;
Печатать можно и управляющие коды и псевдографику и токены, но в этих случаях печать производится символами символьного набора ПЗУ - программа переходит непосредственно на RST #10 (см. строки 20 и 30 и метку EXIT).
Для примера приведено несколько вариантов процедуры GENER. Подставляя разные процедуры, Вы получите разные варианты стилизованных шрифтов.
Листинг процедуры, приведенной выше, является скорее академическим, так как показывает суть метода. Для практического же использования процедуру удобно подключить к Дополнительным каналам. О том, как это можно сделать, мы подробно рассказывали в нашей книге "Прикладная графика".
Следует отметить, что поскольку в этой процедуре формирование символа происходит в момент печати, то она будет работать несколько медленнее, чем печать при помощи просто RST #10 символами заранее приготовленного символьного набора. Возможно, разница в скорости станет заметной при распечатке сильно насыщенного информацией экрана, хотя полагаем, что замедление не будет столь значительным.
© Кривцов A.H. (New Star), 1994.
Сначала - о двух программах в кодах. Первая - выводит на экран картинку, предварительно помещенную в память, причем делает это очень впечатляюще: из левого верхнего угла экрана появляется радужная полоса, которая перемещается к правому нижнему углу экрана, оставляя после себя на экране готовую картинку.
Вот листинг этой программы, набранный в ассемблере ZEUS (правда следует сказать, что мы добавили сюда процедуру очистки экрана - строки по 120 включительно - прим. ИФК).
00010 |
|
ORG |
40000 |
00020 |
BUFF |
EQU |
40200 |
00030 |
|
ENT |
|
00040 |
|
LD |
HL,16384 |
00050 |
|
LD |
(HL),0 |
00060 |
|
PUSH |
HL |
00070 |
|
POP |
DE |
00080 |
|
INC |
DE |
00090 |
|
LD |
BC,6911 |
00100 |
|
LDIR |
|
00110 |
|
XOR |
A |
00120 |
|
OUT |
(254) , A |
00130 |
|
LD |
HL,BUFF |
00140 |
|
LD |
DE,16384 |
00150 |
|
LD |
BC,6144 |
00160 |
|
LDIR |
|
00170 |
|
LD |
HL,BUFF |
00180 |
|
LD |
E, 248 |
00190 |
SC1 |
CALL |
SCR1 |
00200 |
|
HALT |
|
00210 |
|
INC |
E |
00220 |
|
LD |
A, E |
00230 |
|
CP |
63 |
00240 |
|
JR |
NZ,SC1 |
00250 |
|
RET |
|
00260 |
SCR1 |
PUSH |
DE |
00270 |
|
PUSH |
AF |
00280 |
|
LD |
D,0 |
00290 |
SC2 |
PUSH |
DE |
00300 |
|
LD |
A,71 |
00310 |
SC3 |
CALL |
SCR2 |
00320 |
|
DEC |
E |
00330 |
|
DEC |
A |
00340 |
|
CP |
63 |
00350 |
|
JR |
NZ,SC3 |
00360 |
|
POP |
DE |
00370 |
|
DEC |
E |
00380 |
|
INC |
D |
00390 |
|
LD |
A, D |
00400 |
|
CP |
24 |
00410 |
|
JR |
NZ,SC2 |
00420 |
|
POP |
AF |
00430 |
|
POP |
DE |
00440 |
|
RET |
|
00450 |
SCR2 |
EX |
AF,AF' |
00460 |
|
LD |
A, E |
00470 |
|
CP |
32 |
00480 |
|
JR |
NC,SC4 |
00490 |
|
LD |
A, D |
00500 |
|
CP |
24 |
00510 |
|
JR |
NC,SC4 |
00520 |
|
PUSH |
HL |
00530 |
|
LD |
HL,2252 |
00540 |
|
SRL |
D |
00550 |
|
RR |
L |
00560 |
|
SRL |
D |
00570 |
|
RR |
L |
00580 |
|
SRL |
D |
00590 |
|
RR |
L |
00600 |
|
ADD |
HL, DE |
00610 |
|
LD |
D,A |
00620 |
|
EX |
AF,AF' |
00630 |
|
CP |
64 |
00640 |
|
PUSH |
AF |
00650 |
|
CALL |
Z, SCR3 |
00660 |
|
LD |
(HL),A |
00670 |
|
POP |
AF |
00680 |
|
POP |
HL |
00690 |
|
RET |
|
00700 |
SC4 |
EX |
AF,AF' |
00710 |
|
RET |
|
00720 |
SCR3 |
PUSH |
HL |
00730 |
|
PUSH |
DE |
00740 |
|
LD |
DE,BUFF |
00750 |
|
ADC |
HL, DE |
00760 |
|
LD |
A, (HL) |
00770 |
|
POP |
DE |
00780 |
|
POP |
HL |
00790 |
|
RET |
|
-16384
Файл - картинка (длиной 6912 байт) должен быть предварительно загружен в буфер, расположенный с адреса 40200. После запуска этой программы экран очищается, BORDER, PAPER и INK становятся черного цвета. В этот момент на экран перебрасывается содержимое дисплейного файла (картинка без атрибутов, 6144 байт). Далее начинает работать основная часть программы, манипулируя с атрибутами. Происходит формирование радужной полосы, а после её прохода атрибуты остаются такими, как в исходном файле-картинке.
Следующая программа позволяет гасить экран аналогично тому, как он прорисовывался первой программой: радужная полоса, проходя по диагонали экрана, гасит его (опять же, манипулируя атрибутами).
Эти две программы удобно скомпоновать в единый блок с двумя точками входа: для прорисовки экрана и его гашения.
Вот листинг второй программы. Она начинается с адреса 40123 (123 байта занимает первая программа).
00010 ORG 40123
00020 ENT
00030 LD E,248
00040 CLS CALL CLS1
00050 HALT
00060 |
|
INC |
E |
00070 |
|
LD |
A, E |
00080 |
|
CP |
63 |
00090 |
|
JR |
NZ,CLS |
00100 |
|
RET |
|
00110 |
CLS1 |
PUSH |
DE |
00120 |
|
PUSH |
AF |
00130 |
|
LD |
D,0 |
00140 |
CL2 |
PUSH |
DE |
00150 |
|
LD |
A,71 |
00160 |
CL1 |
CALL |
CLS2 |
00170 |
|
DEC |
E |
00180 |
|
DEC |
A |
00190 |
|
CP |
63 |
00200 |
|
JR |
NZ,CL1 |
00210 |
|
POP |
DE |
00220 |
|
DEC |
E |
00230 |
|
INC |
D |
00240 |
|
LD |
A, D |
00250 |
|
CP |
24 |
00260 |
|
JR |
NZ,CL2 |
00270 |
|
POP |
AF |
00280 |
|
POP |
DE |
00290 |
|
RET |
|
00300 |
CLS2 |
EX |
AF,AF' |
00310 |
|
LD |
A, E |
00320 |
|
CP |
32 |
00330 |
|
JR |
NC,CL3 |
00340 |
|
LD |
A, D |
00350 |
|
CP |
24 |
00360 |
|
JR |
NC,CL3 |
00370 |
|
PUSH |
HL |
00380 |
|
LD |
HL,22528 |
00390 |
|
SRL |
D |
00400 |
|
RR |
L |
00410 |
|
SRL |
D |
00420 |
|
RR |
L |
00430 |
|
SRL |
D |
00440 |
|
RR |
L |
00450 |
|
ADD |
HL, DE |
00460 |
|
LD |
D,A |
00470 |
|
EX |
AF,AF' |
00480 |
|
LD |
(HL),A |
00490 |
|
POP |
HL |
00500 |
|
RET |
|
00510 |
CL3 |
EX |
AF,AF' |
00520 |
|
RET |
|
Чтобы изменить цвет фона, остающийся после очистки экрана, измените число в строке 190. Если число меньше 45, то в строке 50 надо поставить команду LD L,(HL) а в строке 80 число увеличить настолько, насколько было уменьшено число в строке 190. Это число не должно превышать 71.
В строке 250 хранится число строк, а в строке 320 - число столбцов, которые подлежат очистке, считая от левого верхнего угла экрана. Если же надо очистить окно в заданном месте экрана, то надо изменить число в строке 380.
Для тех, кто пока что не работает с ассемблером, приводим (на следующей странице) шестнадцатеричный дамп объединенного кодового блока "радужных" эффектов. Что с ним делать, надеемся, объяснять уже не надо.
9C40 |
21 |
00 |
40 |
36 |
00 |
E5 |
Dl |
13 |
3C |
9C48 |
01 |
FF |
1A |
ED |
B0 |
AF |
D3 |
FE |
1B |
9C50 |
21 |
08 |
9D |
11 |
00 |
40 |
01 |
00 |
04 |
9C58 |
18 |
ED |
B0 |
21 |
08 |
9D |
1E |
F8 |
85 |
9C60 |
CD |
6B |
9C |
76 |
1C |
7B |
FE |
3E |
19 |
9C68 |
20 |
F6 |
C9 |
D5 |
F5 |
16 |
00 |
D5 |
98 |
9C70 |
3E |
47 |
CD |
86 |
9C |
1D |
3D |
FE |
D8 |
9C78 |
3F |
20 |
F7 |
Dl |
1D |
14 |
7A |
FE |
E4 |
9C80 |
18 |
20 |
EC |
Fl |
Dl |
C9 |
08 |
7B |
4E |
9C88 |
FE |
20 |
30 |
22 |
7A |
FE |
18 |
30 |
54 |
9C90 |
1D |
E5 |
21 |
00 |
58 |
CB |
3A |
CB |
77 |
9C98 |
1D |
CB |
3A |
CB |
1D |
CB |
3A |
CB |
0E |
9CA0 |
1D |
19 |
57 |
08 |
FE |
40 |
F5 |
CC |
D0 |
9CA8 |
B0 |
9C |
77 |
Fl |
El |
C9 |
08 |
C9 |
73 |
9CB0 |
E5 |
D5 |
11 |
08 |
5D |
ED |
5A |
7E |
41 |
9CB8 |
Dl |
El |
C9 |
1E |
F8 |
CD |
C8 |
9C |
16 |
9CC0 |
76 |
1C |
7B |
FE |
3E |
20 |
F6 |
C9 |
84 |
9CC8 |
D5 |
F5 |
16 |
00 |
D5 |
3E |
47 |
CD |
6B |
9CD0 |
E3 |
9C |
1D |
3D |
FE |
3F |
20 |
F7 |
99 |
9CD8 |
Dl |
1D |
14 |
7A |
FE |
18 |
20 |
EC |
12 |
9CE0 |
Fl |
Dl |
C9 |
08 |
7B |
FE |
20 |
30 |
D8 |
9CE8 |
1B |
7A |
FE |
18 |
30 |
16 |
E5 |
21 |
7B |
9CF0 |
00 |
58 |
CB |
3A |
CB |
1D |
CB |
3A |
D6 |
9CF8 |
CB |
1D |
CB |
3A |
CB |
1D |
19 |
57 |
D9 |
9D00 |
08 |
77 |
E1 |
C9 |
08 |
C9 |
00 |
00 |
97 |
После набора сохраните блок кодов командой: SAVE "scr" CODE 40000,198.
Далее наберите несложную Бейсик-программку, демонстрирующую "радужные" эффекты (автостарт с 10 строки):
1 GO TO 40
10 CLEAR 3 9999
2 0 LOAD "scr" CODE
30 LOAD "screen" CODE 40200
4 0 RANDOMIZE USR 4 0000: PAUSE 0: RANDOMIZE USR 4 012 3: PAUSE 0
В 30 строке для демонстрации эффектов загружается любой файл-экран. После окончания загрузки нажмите любую клавишу, картинка плавно появится на экране. При следующем нажатии - плавно погаснет.
Гасить экран можно и по-другому. Вот как это делается в игре "TERMINATOR-2". Гашение происходит опять же благодаря манипуляции с атрибутами.
00010 |
|
ORG |
40000 |
00020 |
SPEED |
EQU |
2000 |
00030 |
|
ENT |
|
00040 |
|
LD |
B, 7 |
00050 |
L4 |
HALT |
|
00060 |
|
LD |
HL,SPEED |
00070 |
L0 |
DEC |
HL |
00080 |
|
LD |
A, L |
00090 |
|
OR |
H |
00100 |
|
JR |
NZ, L0 |
00110 |
|
LD |
HL,22528 |
00120 |
L3 |
LD |
A, (HL) |
00130 |
|
AND |
56 |
00140 |
|
JR |
Z, L1 |
00150 |
|
SUB |
8 |
00160 |
L1 |
LD |
C,A |
00170 |
|
LD |
A, (HL) |
00180 |
|
AND |
7 |
00190 |
|
JR |
Z,L2 |
00200 |
|
DEC |
A |
00210 |
L2 |
OR |
C |
00220 |
|
LD |
(HL),A |
00230 |
|
INC |
HL |
00240 |
|
LD |
A, H |
00250 |
|
CP |
91 |
00260 |
|
JR |
NZ, L3 |
00270 |
|
DJNZ |
L4 |
00280 |
|
RET |
|
Среди многих аналогичных процедур, испытанных в редакции, эта выглядит привлекательно тем, что при сравнительно небольшой длине обладает повышенными качественными характеристиками: гашение экрана происходит плавно (8 ступеней), а скорость процесса можно регулировать в широчайших пределах, изменяя значение параметра в строке 20. Кроме того, программа релоцируема, её можно без переделок загружать в любой адрес и стартовать с адреса загрузки.
Вот шестнадцатеричный дамп этого блока кодов.
9C40 |
06 |
07 |
76 |
21 |
88 |
13 |
2B |
7D |
C3 |
9C48 |
B4 |
20 |
FB |
21 |
00 |
58 |
7E |
E6 |
90 |
9C50 |
38 |
28 |
02 |
D6 |
08 |
4F |
7E |
E6 |
DF |
9C58 |
07 |
28 |
01 |
3D |
B1 |
77 |
23 |
7C |
28 |
9C60 |
FE |
5B |
20 |
EA |
10 |
DC |
C9 |
00 |
14 |
После набора сохраните блок кодов: SAVE "cls"CODE 4 0000,49.
Работу программы демонстрирует простая Бейсик-программка (автостарт с 10 строки):
1 GO T0 3 0
10 BORDER 0: PAPER 0: INK 7: C LEAR 3 9999
2 0 LOAD "cls" CODE
30 LOAD "screen" CODE 16384 40 PAUSE 0: RANDOMIZE USR 40000
Следующая программа предназначена для создания стилизованного символьного набора. Например, буква "А" будет выглядеть следующим образом: _
И
Шрифт очень красив, но его эргономические показатели низки, при использовании его для чтения, он слишком навязчив - быстро надоедает. Поэтому советую использовать его в заставках, для вывода названия игры, и т.д., но не больше.
Вот программа для генерации символьного набора.
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
LD |
HL,15616 |
00040 |
|
LD |
DE,768 |
00050 |
|
LD |
IX,FONT+1 |
00060 |
FONT2 |
LD |
B, 4 |
00070 |
FONT1 |
LD |
A, (HL) |
00080 |
|
RLC |
A |
00090 |
|
OR |
(HL) |
00100 |
|
LD |
(IX+0),A |
00110 |
|
DEC |
DE |
00120 |
|
INC |
HL |
00130 |
|
INC |
IX |
00140 |
|
DJNZ |
FONT1 |
00150 |
|
LD |
B, 4 |
00160 |
FONT3 |
LD |
A, (HL) |
00170 |
|
RLCA |
|
00180 |
|
LD |
(IX+0),A |
00190 |
|
LD |
A,(HL) |
00200 |
|
RRCA |
|
00210 |
|
OR |
(IX+0) |
00220 |
|
LD |
(IX+0) , A |
00230 |
|
INC |
IX |
00240 |
|
INC |
HL |
00250 |
|
DEC |
DE |
00260 |
|
DJNZ |
FONT3 |
00270 |
|
LD |
A, D |
00280 |
|
OR |
E |
00290 |
|
JR |
NZ,FONT2 |
00300 |
FONT |
RET |
|
Готовый символьный набор в этом примере формируется сразу же за кодовым блоком, по адресу 40051. Если Вас по какой-либо причине не устраивает этот адрес, то в строке 50 вместо FONT+1 подставьте нужный адрес.
Дамп блока кодов, формирующего стилизованный символьный набор:
9C40 |
21 |
00 |
3D |
11 |
00 |
03 |
DD |
21 |
4C |
9C48 |
73 |
9C |
06 |
04 |
7E |
CB |
07 |
B6 |
03 |
9C50 |
DD |
77 |
00 |
1B |
23 |
DD |
23 |
10 |
8E |
9C58 |
F3 |
06 |
04 |
7E |
07 |
DD |
77 |
00 |
CA |
9C60 |
7E |
0F |
DD |
B6 |
00 |
DD |
77 |
00 |
70 |
9C68 |
DD |
23 |
23 |
1B |
10 |
ED |
7A |
B3 |
6C |
9C70 |
20 |
D8 |
C9 |
00 |
00 |
00 |
00 |
00 |
CD |
После набора сохраните |
блок кодов: |
SAVE |
"fonf" |
CODE 4 0000,51 |
|
|
Бейсик-программка, демонстрирующая новый символьный набор (автостарт с 10 строки):
1 GO TO 4 0
10 CLEAR 3 9999
2 0 LOAD "font" CODE
30 RANDOMIZE USR 4 0000
40 RANDOMIZE (40051-256): POKE 23606,PEEK 23670: POKE 23607,PEEK 23671 50 FOR a=32 TO 127: PRINT CHR$ a;" ";: NEXT a 60 POKE 23606,0: POKE 23607,60
И ещё одна программа, предназначенная для владельцев 128К компьютеров, так как в ней используются два экрана. Она выводит картинку после очистки экрана. Вывод происходит следующим образом: сначала экран (вместе с бордюром!) плавно "закрывается", как шторой, сверху вниз, а затем открывается. Эффект похож на "занавес".
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
DI |
|
00040 |
|
LD |
BC,32765 |
00050 |
|
LD |
A,16 |
00060 |
|
OUT |
(C) , A |
00070 |
|
LD |
HL,4 9152 |
00080 |
|
LD |
(HL),A |
00090 |
|
XOR |
7 |
00100 |
|
OUT |
(C) , A |
00110 |
|
PUSH |
BC |
00120 |
|
PUSH |
HL |
00130 |
|
POP |
DE |
00140 |
|
PUSH |
HL |
00150 |
|
INC |
DE |
00160 |
|
LD |
BC,6911 |
00170 |
|
LD |
A,18 |
00180 |
|
LD |
(HL),A |
00190 |
|
LDIR |
|
00200 |
|
POP |
HL |
00210 |
|
POP |
BC |
00220 |
|
LD |
A,16 |
00230 |
|
OUT |
(C) , A |
00240 |
|
LD |
BC,32765 |
00250 |
|
LD |
HL, 2 |
00260 |
SCR1 |
EI |
|
00270 |
|
HALT |
|
00280 |
|
LD |
A,2 |
00290 |
|
OUT |
(254),A |
00300 |
|
LD |
A,24 |
00310 |
|
OUT |
(C) , A |
00320 |
|
PUSH |
HL |
00330 |
|
POP |
DE |
00340 |
SCR2 |
DEC |
DE |
00350 |
|
LD |
A, D |
00360 |
|
OR |
E |
00370 |
|
JR |
NZ,SCR2 |
00380 |
|
XOR |
A |
00390 |
|
OUT |
(254),A |
00400 |
|
LD |
A,16 |
00410 |
|
OUT |
(C) , A |
00420 |
|
LD |
DE,37 |
00430 |
|
ADD |
HL, DE |
00440 |
|
LD |
A, H |
00450 |
|
CP |
9 |
00460 |
|
JR |
NZ,SCR1 |
00470 |
|
LD |
A,24 |
00480 |
|
OUT |
(C) , A |
00490 |
|
LD |
A,2 |
00500 |
|
OUT |
(254),A |
00510 |
|
LD |
HL,24576 |
00520 |
|
LD |
DE,16384 |
00530 |
|
LD |
BC,6912 |
00540 |
|
LDIR |
|
00550 |
|
DI |
|
00560 |
|
LD |
BC,32765 |
00570 |
|
LD |
HL, 2 |
00580 |
|
EI |
|
00590 |
SCR3 |
HALT |
|
00600 |
|
XOR |
A |
00610 |
|
OUT |
(254),A |
00620 |
|
LD |
A,16 |
00630 |
|
OUT |
(C) , A |
00640 |
|
PUSH |
HL |
00650 |
|
POP |
DE |
00660 |
SCR4 |
DEC |
DE |
00670 |
|
LD |
A, D |
00680 |
|
OR |
E |
00690 |
|
JR |
NZ,SCR4 |
00700 |
|
LD |
A,2 |
00710 |
|
OUT |
(254),A |
00720 |
|
LD |
A,24 |
00730 |
|
OUT |
(C) , A |
00740 |
|
LD |
DE,37 |
00750 |
|
ADD |
HL, DE |
00760 |
|
LD |
A, H |
00770 |
|
CP |
9 |
00780 |
|
JR |
NZ,SCR3 |
00790 |
|
XOR |
A |
00800 |
|
OUT |
(254),A |
00810 |
|
LD |
A,16 |
00820 |
|
OUT |
(C) , A |
00830 |
|
EI |
|
00840 |
|
RET |
|
Картинка загружается по адресу 24576.
© Дмитрий Барановский, Ростов-Дон, 1994.
Хочу привести одну любопытную процедуру, "вытащенную" из программы "COPY 83M". Результат её работы следующий. При запуске её с адреса 54838 (D636H) происходит очистка экрана, а затем плавная "раздвижка" среднего сегмента экрана (предварительно загруженного в память) от центра к краям. Сегмент для "раздвижки" -кодовый блок длиной 2048 байтов - заранее загружается в память по адресу 55000. Аналогично "раздвижке" работает и процедура "задвижки", стартующая с адреса 54871 (D657H) - изображение плавно сдвигается с краёв экрана к центру и там исчезает.
Мы приводим эту процедуру с непринципиальными изменениями адресов для получения более компактного
блока.
D636 |
210040 |
LD |
HL,#4000 |
D639 |
110140 |
LD |
DE,#4001 |
D63C |
01FF1A |
LD |
BC,#1AFF |
D63F |
3600 |
LD |
(HL),#00 |
D641 |
EDBO |
LDIR |
|
D643 |
AF |
XOR |
A |
D644 |
D3FE |
OUT |
(#FE),A |
D646 |
210059 |
LD |
HL,#5900 |
D649 |
110159 |
LD |
DE,#5901 |
D64C |
01DF00 |
LD |
BC,# 0 0DF |
D64F |
3646 |
LD |
(HL),#46 |
D651 |
EDBO |
LDIR |
|
D653 |
CD7FD6 |
CALL |
#D67F |
D656 |
C9 |
RET |
|
D657 |
F3 |
DI |
|
D658 |
0680 |
LD |
B, #80 |
D65A |
210048 |
LD |
HL,#4800 |
D65D |
0E10 |
LD |
C, #10 |
D65F |
AF |
XOR |
A |
D660 |
CB1E |
RR |
(HL) |
D662 |
23 |
INC |
HL |
D663 |
0D |
DEC |
C |
D664 |
2 0FA |
JR |
NZ,#D660 |
D666 |
110F00 |
LD |
DE,#000F |
D669 |
19 |
ADD |
HL, DE |
D66A |
E5 |
PUSH |
HL |
D66B |
0E10 |
LD |
C, #10 |
D66D |
AF |
XOR |
A |
D66E |
CB16 |
RL |
(HL) |
D670 |
2B |
DEC |
HL |
D671 |
0D |
DEC |
C |
D672 |
2 0FA |
JR |
NZ,#D 6 6E |
D674 |
E1 |
POP |
HL |
D675 |
23 |
INC |
HL |
D676 |
7C |
LD |
A, H |
D677 |
FE50 |
CP |
#50 |
D679 |
20E2 |
JR |
NZ,#D65D |
D67B |
10DD |
DJNZ |
#D65A |
D67D |
FB |
EI |
|
D67E |
C9 |
RET |
|
D67F |
F3 |
DI |
|
D680 |
11D8D6 |
LD |
DE,#D6D8 |
D683 |
DD21F7D6 |
LD |
IX,#D6F7 |
D687 |
0610 |
LD |
B, #10 |
D689 |
C5 |
PUSH |
BC |
D68A |
0608 |
LD |
B, #08 |
D68C |
C5 |
PUSH |
BC |
D68D |
DDE5 |
PUSH |
IX |
D68F |
D5 |
PUSH |
DE |
D690 |
210F48 |
LD |
HL,#480F |
D693 |
E5 |
PUSH |
HL |
D694 |
AF |
XOR |
A |
D695 |
EB |
EX |
DE, HL |
D696 |
CB16 |
RL |
(HL) |
D698 |
EB |
EX |
DE, HL |
D699 |
E5 |
PUSH |
HL |
D69A |
0610 |
LD |
B, #10 |
D69C |
CB16 |
RL |
(HL) |
D69E |
2B |
DEC |
HL |
D69F |
10FB |
DJNZ |
#D 69C |
D6A1 |
E1 |
POP |
HL |
D6A2 |
23 |
INC |
HL |
D6A3 |
AF |
XOR |
A |
D6A4 |
DDCB001E |
RR |
(ix+0) |
D6A8 |
0610 |
LD |
b, #10 |
D6AA |
CB1E |
RR |
(HL) |
D6AC |
23 |
INC |
HL |
D6AD |
10FB |
DJNZ |
#D6AA |
D6AF |
012000 |
LD |
BC,#0020 |
D6B2 |
DD09 |
ADD |
IX, BC |
D6B4 |
EB |
EX |
DE, HL |
D6B5 |
09 |
ADD |
HL, BC |
D6B6 |
EB |
EX |
DE, HL |
D6B7 |
E1 |
POP |
HL |
D6B8 |
09 |
ADD |
HL, BC |
D6B9 |
7C |
LD |
A, H |
D6BA |
FE50 |
CP |
#50 |
D6BC |
20D5 |
JR |
NZ,#D 693 |
D6BE |
D1 |
POP |
DE |
D6BF |
DDE1 |
POP |
IX |
D6C1 |
C1 |
POP |
BC |
D6C2 |
10C8 |
DJNZ |
#D68C |
D6C4 |
DD2B |
DEC |
IX |
D6C6 |
13 |
INC |
DE |
D6C7 |
C1 |
POP |
BC |
D6C8 |
10BF |
DJNZ |
#D689 |
D6CA |
11D8D6 |
LD |
DE,#D6D8 |
D6CD |
210048 |
LD |
HL,#4800 |
D6D0 |
010008 |
LD |
BC,#0800 |
D6D3 |
EDB0 |
LDIR |
|
D6D5 |
C9 |
RET |
|
D6D6 |
00 |
NOP |
|
D6D7 |
00 |
NOP |
|
D6D8 |
- |
здесь |
начинается |
сегмент разворачиваемого экрана. При старте программы с адреса D636H сначала экран очищается, и устанавливаются атрибуты: INK 0; PAPER 6; BRIGHT 1. Затем вызывается подпрограмма "раздвижки" сегмента экрана, расположенная с адреса D67FH. Подпрограмма "сдвижки" сегмента является самостоятельной процедурой, она расположена с адреса D657H.
В процессе работы процедур происходит манипуляция только с дисплейным файлом, атрибуты в процессе не участвуют и остаются такими, какими были заданы в вызывающей программе D636H.
© Виталий Казаков, г. Армавир, 1994. Две несложные процедуры предназначены для прорисовки демонстрационных надписей в программах. Текстовое сообщение длиной не более 32 символов как бы "выстреливается" по одной букве, которые, пробегая вдоль всей строки, затем образуют текст. Предлагаю один вариант этой программы для "выстреливания" букв справа налево и другой вариант - слева направо.
Листинг первого варианта, набранный в ассемблере ZEUS:
00010 00020 00030 00040 00050 00060 00070 00080 00090 00100 00110 00120 00130 00140 00150 00160 00170 00180 00190 00200 00210 00220 00230 00240 00250 00260 00270 00280 00290
ORG 40000 ENT
LD HL,TEXT
LD B,32
LD E,31
PUSH BC
PUSH DE
PUSH BC
LD A,22
RST 16
LD A,01
RST 16
LD A, E
RST 16
LD A,(HL)
RST 16
LD A,32
RST 16
DEC E
POP BC
DJNZ L2
POP DE
INC HL
POP BC
DJNZ L1 RET
DEFM /Demonstrati/ DEFM /on effect / DEFM / /
Листинг второго варианта:
00010 |
|
ORG |
40000 |
00020 |
|
ENT |
|
00030 |
|
LD |
HL,TEXT+31 |
00040 |
|
LD |
B, 32 |
00050 |
L1 |
LD |
E, 0 |
00060 |
|
PUSH |
BC |
00070 |
|
PUSH |
DE |
00080 |
L2 |
PUSH |
BC |
00090 |
|
LD |
A,22 |
00100 |
|
RST |
16 |
A,01 16 A, E 16
A, (HL) 16 A,8 16 A,8 16
A,32 16 E
00110 00120 00130 00140 00150 00160 00170 00180 00190 00200 00210 00220 00230 00240 00250 00260 00270 00280 00290 00300 00310 00320 00330
LD
RST
LD
RST
LD
RST
LD
RST
LD
RST
LD
RST
INC
POP
DJNZ
POP
DEC
POP
DJNZ
RET
DEFM
DEFM
DEFM
BC L2 DE HL BC L1
/ / / Demonstrat/ /ion effect/
А теперь шестнадцатерпчные дампы обоих вариантов программ. Для примера оба они расположены с адреса 40000. Если Вы захотите изменить адреса их расположения, то Вы должны будете изменить адрес, указывающий на текстовое сообщение (ячейки #9С41, #9С42, см. строку 30 в листингах).
TEXT
9C40 |
21 |
61 |
9C |
06 |
20 |
1E |
1F |
C5 |
22 |
9C48 |
D5 |
C5 |
3E |
16 |
D7 |
3E |
01 |
D7 |
BF |
9C50 |
7B |
D7 |
7E |
D7 |
3E |
20 |
D7 |
1D |
E5 |
9C58 |
C1 |
10 |
EE |
D1 |
23 |
C1 |
10 |
E5 |
5D |
9C60 |
C9 |
44 |
65 |
6D |
6F |
6E |
73 |
74 |
9F |
9C68 |
72 |
61 |
74 |
69 |
6F |
6E |
20 |
65 |
16 |
9C70 |
66 |
66 |
65 |
63 |
74 |
20 |
20 |
20 |
74 |
9C78 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
14 |
9C80 |
20 |
00 |
00 |
00 |
00 |
00 |
00 |
00 |
3C |
9C40 |
21 |
86 |
9C |
06 |
20 |
1E |
00 |
C5 |
28 |
9C48 |
D5 |
C5 |
3E |
16 |
D7 |
3E |
01 |
D7 |
BF |
9C50 |
7B |
D7 |
7E |
D7 |
1E |
08 |
D7 |
3E |
EE |
9C58 |
08 |
D7 |
3E |
20 |
D7 |
1C |
C1 |
10 |
F5 |
9C60 |
E8 |
D1 |
2B |
C1 |
10 |
DF |
C9 |
20 |
79 |
9C68 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
20 |
04 |
9C70 |
20 |
20 |
20 |
44 |
65 |
6D |
6F |
6E |
5F |
9C78 |
73 |
74 |
72 |
61 |
74 |
69 |
6F |
6E |
88 |
9C80 |
20 |
65 |
66 |
66 |
65 |
63 |
74 |
00 |
A9 |
|
|