РАСПАХНУТЫЕ ДВЕРИ ИЛИ ОТКРЫТЫЙ ЗАНАВЕС?
Глубокоуважаемая редакция!
Вот уже третий год я являюсь достоянным читателем Вашего журнала "ZX-РЕВЮ", неизменно следя за всеми публикациями, касающимися как "секретов" ZX-Spectrum, так и приемов программирования на языке Ассемблера Z-80. Сам я занимаюсь созданием микропроцессорных систем с начала 1988 года и не могу не оценить той услуги, которую Вы мне оказываете. Надо полагать, что эту услугу Вы оказываете всем читателям Вашего журнала!
За время работы со своим компьютером (я три года эксплуатировал "Новосибирский вариант", а сейчас уже год как построил "Москву-128" с Beta Disk Interface) мной создана довольно обширная библиотека процедур в машинных кодах, которую я широко использую при написании собственных программ.
Руководствуясь тем, что долги надо возвращать (а я, получая от Вас информацию, считаю себя Вашим должником), а также желая поделиться с другими читателями собственными разработками (негоже каждый раз изобретать заново велосипед), я отдаю на Ваш суд одну из своих разработок. Если сочтете необходимым, поступите с ней по Вашему усмотрению.
К написанию этой процедуры меня натолкнул эффект раздвигающихся дверей в игровой программе "ROBIN OF THE WOOD" фирмы "ODIN". Отсюда и название ее "DOORS". Не зная, как этот эффект достигается в фирменной программе (я ее не вскрывал, как-то еще не доходили руки), но встретив в '^-РЕВЮ-92" статью "40 лучших процедур", сразу все понял и спустя чуть больше двух часов подпрограмма была готова.
Предлагаемая процедура осуществляет очистку области пикселов и установку рабочих атрибутов экрана, но в отличие от стандартной процедуры ПЗУ CLS (#0D6B) этот процесс сопровождается сравнительно плавным перемещением пикселов влево и вправо от центра экрана (каждый раз на одно знакоместо слева и справа от центра) и заполнением свободных от пикселов столбиков новыми атрибутами, то есть довольно точно имитируется эффект раздвигающихся дверей. Процедура занимает 101 байт и еще один байт необходим для хранения данных - текущих атрибутов экрана (или вновь устанавливаемых атрибутов). Столь небольшой ее объем получен за счет использования всех регистровых пар как основного, так и альтернативного блоков, причем основной блок участвует в перемещении пикселов, а альтернативный - в установке атрибутов. Для обеспечения корректного выхода из процедуры требуется сохранение исходного адреса в регистровой паре H'L', что также осуществляется в ней, давая возможность ее использования и как машинно-кодовой вставки в BASIC-программы.
Для полной очистки всех строк пикселов экрана (#C0 - устанавливается в регистре C) требуется #0F пар перемещений знакомест (устанавливается в регистре B), тогда как число пар атрибутов, устанавливаемых в процессе работы, должно быть равно числу знакомест в полустроке, то есть #10. С этой целью в регистр A копируется константа #0F из регистра B, процесс перемещения пикселов завершается при обнулении регистра B, а процесс установки атрибутов - до появления отрицательного числа в аккумуляторе (контролируется флаг знака).
В регистровой паре HL устанавливается начальный адрес #4000 области пикселов, в регистровой паре H'L' - начальный адрес $5800 области атрибутов экрана. В регистровых парах DE и D'E' - количество знакомест в строке (#0020), а в регистре C - константа #18(24) -число знакорядов в экранной области.
В приведенном ниже листинге предлагаемой процедуры:
1) В адресах C000 - С009 - установка новых атрибутов экрана. Если предполагается сохранять атрибуты неизменными, то эти команды можно исключить вместе с константой в адресе C065 (ATTR) и устанавливать их непосредственно в командах по меткам A1 и A2. В
этом случае размер процедуры сокращается на 10 байт;
2) В адресах C015 - С01Е перемещение пикселов на одну пару знакомест во всех 192 (#C0) строках экранной области. При этом в адресах С016 - С020 - перемещение в левой половине экрана, начиная с левого края, а в адресах C023^02E - перемещение в правой половине экрана, начиная с правого края;
3)В адресах C03F - С045 - перемещение атрибутов на одну пару знакомест во всех 24 (#18) знакорядах экрана. При этом освободившиеся знакоместа заполняются новыми атрибутами. В адресах С040-С04В - операции в левой половине экрана, начиная с левого края, а в адресах С04Е-С054 - операции в правой половине экрана, начиная с правого края.
********************************* |
C032 |
F1 |
|
POP |
AF |
(С) |
SpySoft PROGRAM |
"DOORS" |
C033 |
3D |
|
DEC |
A |
|
Written by |
M. N. |
Stinov |
C034 |
D5 |
|
PUSH |
DE |
|
KHABAROVSK-1993 |
C035 |
06 |
|
EX |
AF,AF' |
********************************* |
C036 |
D9 |
|
EXX |
|
C000 |
|
|
ORG |
#C000 |
C037 |
D1 |
|
POP |
DE |
C000 |
3A65TO |
|
LD |
A,(ATTR) |
C038 |
E5 |
|
PUSH |
HL |
С003 |
3249С0 |
|
LD |
(A1+1),A |
C039 |
210058 |
|
LD |
HL,#5800 |
C006 |
3258C0 |
|
LD |
(A2+1),A |
C03C |
01180F |
|
LD |
DC,#OF18 |
C009 |
112000 DOORS |
LD |
DE,#0020 |
C03F |
С5 |
L6 |
PUSH |
BC |
C00C |
060F |
|
LD |
B,#0F |
C040 |
E5 |
|
PUSH |
HL |
C00E |
78 |
|
LD |
A,B |
C041 |
23 |
L3 |
INC |
HL |
C00F |
F5 |
L7 |
PUSH |
AF |
C042 |
7E |
|
LD |
A,(HL) |
C010 |
0EC0 |
|
LD |
C,#C0 |
C043 |
2B |
|
DEC |
HL |
C012 |
210040 |
|
LD |
HL,#4000 |
C044 |
77 |
|
LD |
(HL),A |
C015 |
C5 |
L5 |
PUSH |
BC |
C045 |
23 |
|
INC |
HL |
C016 |
E5 |
|
PUSH |
HL |
C046 |
10F9 |
|
DJNZ |
L3 |
C017 |
23 |
L1 |
INC |
HL |
C048 |
3500 |
A1 |
LD |
(HL),#00 |
C018 |
7E |
|
LD |
A,(HL) |
C04A |
E1 |
|
POP |
HL |
C019 |
2B |
|
DEC |
HL |
C04B |
19 |
|
ADD |
HL,DE |
C01A |
77 |
|
LD |
(HL),A |
C04C |
C1 |
|
POP |
BC |
C01B |
23 |
|
INC |
HL |
C04D |
C5 |
|
PUSH |
BC |
C01C |
10F9 |
|
DJNZ |
L1 |
C04E |
E5 |
|
PUSH |
HL |
C01E |
72 |
|
LD |
(HL),D |
C04F |
2B |
|
DEC |
HL |
C01F |
E1 |
|
POP |
HL |
C050 |
2B |
L4 |
DEC |
HL |
C020 |
19 |
|
ADD |
HL,DE |
C051 |
7E |
|
LD |
A,(HL) |
C021 |
C1 |
|
POP |
BC |
C052 |
23 |
|
INC |
HL |
C022 |
C5 |
|
PUSH |
BC |
C053 |
77 |
|
LD |
(HL),A |
C023 |
E5 |
|
PUSH |
HL |
C054 |
2B |
|
DEC |
HL |
C024 |
2B |
|
DEC |
HL |
C055 |
10F9 |
|
DJNZ |
L4 |
C025 |
2B |
L2 |
DEC |
HL |
C057 |
3500 |
A2 |
LD |
(HL),#00 |
C026 |
7E |
|
LD |
A,(HL) |
C059 |
E1 |
|
POP |
HL |
C027 |
23 |
|
INC |
HL |
C05A |
C1 |
|
POP |
BC |
C028 |
77 |
|
LD |
(HL),A |
C05B |
0D |
|
DEC |
C |
C029 |
2B |
|
DEC |
HL |
C05C |
20E1 |
|
JR |
NZ,L6 |
C02A |
10F9 |
|
DJNZ |
L2 |
C05E |
E1 |
|
POP |
HL |
C02C |
72 |
|
LD |
(HL),D |
C05F |
D9 |
|
EXX |
|
C02D |
E1 |
|
POP |
HL |
C060 |
08 |
|
EX |
AF,AF' |
C02E |
C1 |
|
POP |
BC |
C061 |
F20FCO |
|
JP |
P,L7 |
C02F |
0D |
|
DEC |
C |
C064 |
C9 |
|
RET |
|
С030 |
20E3 |
|
JR |
NZ,L5 |
C065 |
28 |
ATTR |
DEFB |
#28 |