ZX-Ревю 1994 №4 1993 г.

Этюды - Ученик 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)

EXIT

ADRESS

GENER

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

L1

L2

TEXT

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




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Источники - Сайты и литература.
Хуй тебе - Чапай-разъебай.
МinskZxNet - Значит русский рэп можно, а чеченский блек нельзя?
Поиск - поиск игр, программ.
Пресса - Размышления на тему электронных изданий.

В этот день...   25 апреля