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

Этюды - предлагаю в новую замечательную рубрику ЭТЮДЫ несколько своих программ.


© Патрахин В.В., г. Оленегорск, 1994.

Предлагаю в Вашу новую и замечательную рубрику ЭТЮДЫ несколько своих программ. Первые три небольшие процедурки я написал под впечатлением программ для расчёта адреса знакоместа в экранном файле А.А. Иванова (автора и основоположника этой рубрики, очень понравившейся нашим читателям, судя по письмам - прим. ИФК). А мои программы рассчитывают адрес знакоместа в файле атрибутов.

Первый вариант. На входе: в E - номер строки, в D - номер столбца. На выходе: DE - без изменений; в HL -адрес в файле атрибутов. 00010 LD A,E

00020 AND #18

00030 RRCA

00040 RRCA

00050 RRCA

00060 OR #58

00070 LD H,A

00080 LD A,E

00090 AND #07

00100 RRCA

00110 RRCA

00120 RRCA

00130 ADD A, B

00140 LD L,A

Второй вариант. На входе: в L - строка, в H - столбец. На выходе: в HL - адрес в файле атрибутов. 00010 LD A,L

00020 AND #07

00030 RRCA

00040 RRCA

00050 RRCA

00060 ADD A, H

00070 LD H,L

00080 LD L,A

00090 LD A,H

00100 AND #18

00110 RRCA

00120 RRCA

00130 RRCA

00140 OR #58

00150 LD H,A

Хотя процедуры, приведенные В.В. Патрахиным, чуть длиннее нашей (см. "Элементарная графика", стр. 86), зато придуманы самостоятельно, без подсказок. А это наиболее ценно. Однако, Вернёмся к письму.

А эта программа переводит адрес в экранном файле в адрес в файле атрибутов.

На входе: в HL - адрес в экранном файле. На выходе - в HL -адрес в файле атрибутов.

00010 LD A,H

00020 RRCA

00030 RRCA

00040 RRCA

00050 AND #03

00060 OR #58

00070 LD H,A

Следующая программа предназначена для очистки заданного окна экрана так, как это происходит в игре R0B0C0P. В программе используются следующие переменные:

YX - двухбайтовая величина, старший байт - строка, младший - столбец левого верхнего угла очищаемого

окна.

VERT - размер по вертикали (в знакоместах) окна. HORIZ - то же по горизонтали.

00010

ORG

40000

00020

ENT

00030

YX

EQU

#0404

00040

VERT

EQU

16

00050

HORIZ

EQU

24

00060

PAUSE

EQU

50

00070

LD

HL, YX

00080

LD

A, L

00090

AND

#07

00100

RRCA

00110

RRCA

00120

RRCA

00130

ADD

A, H

00140

LD

H, L

00150

LD

L,A

00160

AND

#18

00170

OR

#40

00180

LD

H, A

00190

LD

B, 2

00200

L4

PUSH

BC

00210

PUSH

HL

00220

LD

C,VERT

00230

L3

LD

B, 4

00240

PUSH

HL

00250

LD

DE,#20

00260

ADD

HL, DE

00270

EX

DE, HL

00280

POP

HL

00290

LD

A, D

00300

CP

H

00310

JR

Z, L1

00320

PUSH

HL

00330

LD

DE,#0720

00340

ADD

HL, DE

00350

EX

DE, HL

00360

POP

HL

00370

L1

PUSH

BC

00380

PUSH

HL

00390

LD

B,HORIZ

00400

XOR

A

00410

L2

LD

(HL),A

00420

INC

HL

00430

PUSH

BC

00440

LD

B,PAUSE

00450

PAUS

DJNZ

PAUS

00460

POP

BC

00470

DJNZ

L2

00480

POP

HL

00490

POP

BC

00500

INC

H

00510

INC

H

00520

DJNZ

L1

00530

EX

DE, HL

00540

DEC

C

00550

JR

NZ, L3

00560

POP

HL

00570

POP

BC

00580

INC

H

00590

DJNZ

L4

00600

RET

Start

of object

: # 9C4 0

(40000)

Length

: #004A

(00074)

Executes : #9C40 (40000)

И дамп блока кодов:

9C4 0

21

04

04

7D

E6

07

0F

0F

8D

9C4 8

0F

84

65

6F

E6

18

F6

40

7F

9C50

67

06

02

C5

E5

0E

10

06

29

9C58

04

E5

11

20

00

19

EB

E1

F3

9C60

7A

BC

28

07

E5

11

20

07

7E

9C68

19

EB

E1

C5

E5

06

18

AF

60

9C7 0

77

23

C5

06

32

10

FE

C1

72

9C7 8

10

F 6

E1

C1

24

24

10

EB

FF

9C80

EB

0D

20

D3

E1

C1

24

10

DD

9C88

CA

C9

00

00

00

00

00

00

B7

© Александр Шишкин, г. Ярославль, 1994.

Хочу поделиться с Вами моими программами и буду рад, если они кому-нибудь пригодятся. Первая программа выполняет плавное затухание экрана.

00010

ORG

40000

00020

ENT

00030

LD

B, 8

00040

LD

C, #C7

00050

LOOP

LD

A, C

00060

SUB

8

00070

LD

(COM),A

00080

LD

C,A

00090

LD

HL,22528

00100

LD

DE,768

00110

L1

LD

A,(HL)

00120

DEFB

#CB

00130

COM

DEFB

0

00140

LD

(HL),A

00150

INC

HL

00160

DEC

DE

00170

LD

A, D

00180

OR

E

00190

JR

NZ, L1

00200

PUSH

BC

00210

LD

BC,#1800

00220

L2

DEC

BC

00230

LD

A, B

00240

OR

C

00250

JR

NZ, L2

00260

POP

BC

00270

DJNZ

LOOP

00280

RET

Start

of object

: # 9C4 0

(40000)

Length

: #0028

(00040)

Executes

: # 9C4 0

(40000)

Эта программа выключает биты в значениях атрибутов, отвечающие сначала за мерцание, затем яркость и т.д. В связи с укорочением процедуры, применен приём, при котором программа в процессе работы сама себя видоизменяет.

Посмотрите: в строках 40-50 при помощи регистра C в аккумулятор заносится код #C7. В процессе цикла, организованного в строке 30, из этого кода (#C7) каждый раз вычитается 8 (строка 60). При этом получаются числа: #BF, #B7, #AF, ... #87. Таким образом, вместе с префиксом #CB в строке 120, в памяти последовательно во времени генерируются команды: RES 7,A; RES 6,A; RES 5,A; ... RES 0,A, которые затем и выполняются программой.

Благодаря такому приему удалось получить длину программы всего 40 байтов, однако победителем (39 байтов) среди процедур, реализующих этот эффект, всё же пока является программа из игры TERMINATOR-2, присланная Кривцовым А.И. (ZX-PEBW-94, ' 4, стр. 36), к тому же она релоцируемая. Так-так, посмотрим, удастся ли нашим программистам превзойти западных...

В комплекте с первой процедурой предлагаю обратную - которая плавно "зажигает" картинку. Переменная ADRES - адрес расположения картинки в памяти. 00010 ORG 40040

00020 ENT

00030 ADRES EQU ENDR+1

00040 LD HL,ADRES

00050

LD

DE,16384

00060

LD

BC,6144

00070

LDIR

00080

LD

IX,ENDR

00090

LD

B, 8

00100

LOOP

PUSH

BC

00110

LD

A, #C9

00120

LD

(IX+0),A

00130

DEC

IX

00140

DEC

IX

00150

LD

HL,ADRES+614 4

00160

LD

DE,22528

00170

LD

BC,7 68

00180

L1

LD

A,(HL)

00190

CALL

REST

00200

LD

(DE),A

00210

INC

DE

00220

INC

HL

00230

DEC

BC

00240

LD

A, B

00250

OR

C

00260

JR

NZ, L1

00270

LD

BC,#1800

00280

L2

DEC

BC

00290

LD

A, B

00300

OR

C

00310

JR

NZ, L2

00320

POP

BC

00330

DJNZ

LOOP

00340

LD

B, 8

00350

L3

LD

A, #CB

00360

INC

IX

00370

INC

IX

00380

LD

(IX+0),A

00390

DJNZ

L3

00400

RET

00410

REST

RES

7,A

00420

RES

6,A

00430

RES

5,A

00440

RES

4,A

00450

RES

3,A

00460

RES

2,A

00470

RES

1,A

00480

ENDR

RET

Start

of object

: # 9C4 0

(40000)

Length

: #0058

(00088)

Executes

: # 9C4 0

(40000)

В этой процедуре используется аналогичный прием для сокращения размера программы: здесь модифицируется часть программы в строках 410-480. В последовательности двухбайтовых команд RES N,A в подпрограмме REST вместо префикса подставляется команда RET (см. строки 80-140). Из-за этого часть подпрограммы REST отсекается. Затем (строки 340-390) исходный вариант программы восстанавливается.

После тестирования этих программ сама собой напросилась идея совместного их использования. В строке 10 второго листинга Вы видите команду ORG 40040 - длина первой процедуры 40 байтов. Так как длина второй - 88 байтов, то адрес загрузки картинки будет равен 40128. Испытание можете провести при помощи простейшей Бейсик-программы:

10 BORDER 0: PAPER 0: INK 0: POKE 23624,0: CLS

2 0 LOAD "filename" CODE

30 LOAD "screen" CODE 40128

40 PAUSE 0

50 RANDOMIZE 40040

60 PAUSE 0

7 0 RANDOMIZE 4 0000

70 GO TO 40

Шестнадцатеричный дамп объединённого варианта программы, файл "filename", загружаемый в 20 Бейсик-строке:

9C4 0

06

08

0E

C7

79

D6

08

32

48

9C4 8

53

9C

4F

21

00

58

11

00

AC

9C50

03

7E

CB

00

77

23

IB

7A

67

9C58

B3

20

F 6

C5

01

00

18

0B

A6

9C60

78

B1

20

FB

C1

10

DD

C9

B7

9C68

21

C0

9C

11

00

40

01

00

D3

9C7 0

18

ED

B0

DD

21

BF

9C

06

20

9C7 8

08

C5

3E

C9

DD

77

00

DD

19

9C80

2B

DD

2B

21

C0

B4

11

00

F5

9C88

58

01

00

03

7E

CD

B1

9C

18

9C90

12

13

23

0B

78

B1

20

F4

BC

9C98

01

00

18

0B

78

B1

20

FB

9C

9CA0

C1

10

D6

06

08

3E

CB

DD

D7

9CA8

23

DD

23

DD

77

00

10

F5

C0

9CB0

C9

CB

BF

CB

B7

CB

AF

CB

66

9CB8

A7

CB

9F

CB

97

CB

8F

C9

EA

Александр Шишкин просит опубликовать его адрес, что мы и делаем. Он готов помочь другим хакерам тем, что знает и хочет спросить то, чего не знает. Александр предлагает: нестандартные загрузчики, интерфейс, аналогичный "стрелке" в ARTSTUDIO (только без стрелки), с управлением от всех джойстиков одновременно, и

многие другие разработки. _

150062, г. Ярославль, ул. Космонавтов, д.7, кв.20 Шишкин А.П. (SHURa'94)

© Toadstool & Ter.Val". hackers, г. Ухта, (Коми), 1994.

Хотим предложить программу печати символами двойной высоты. Она короче тех, которые Вы печатали. Процедура для печати 32-х символов взята в одном из загрузчиков доработана нами для печати 384-х символов.

Особенность программы заключается в том, что текст, который нужно напечатать, располагается в памяти задом наперед и из кода символа надо вычесть число 32. В строке 10 задается адрес расположения текста в памяти (так как текст расположен задом наперед, указывать надо последний адрес). Если в тексте (с учетом вычитания 32) встретится код 222, то позиция печати будет перенесена на следующую строку. Если встретится код 223, это означает завершение печати и выход из процедуры.

Листинг приводится с непринципиальными изменениями.

00010

TEXT

EQU

41037

00015

PRINT

EQU

16384

00020

ORG

40000

00030

ENT

00040

LD

HL,PRINT

00050

LD

(L1+1),HL

00060

LD

HL,TEXT

00070

LD

(L2+1),HL

00080

L1

LD

DE,0

00090

L2

LD

HL, 0

00100

L3

LD

A,(HL)

00110

CP

222

00120

JR

Z,L6

00130

CP

223

00140

RET

NC

00150

RLCA

00160

PUSH

HL

00170

PUSH

DE

00180

LD

L,A

00190

LD

H, 15

00200

ADD

HL, HL

00210

ADD

HL, HL

00220

INC

H

00230

CALL

L4

00240

EX

DE, HL

00250

LD

BC,#F820

00260

ADD

HL, BC

00270

EX

DE, HL

00280

CALL

L4

00290

POP

DE

00300

INC

E

00310

POP

HL

00320

DEC

HL

00330

JR

L3

00340

L4

LD

B, 4

00350

L5

LD

A,(HL)

00360

RRCA

00370

OR

(HL)

00380

INC

HL

00390

OR

(HL)

00400

LD

(DE),A

00410

INC

D

00420

LD

(DE),A

00430

INC

D

00440

DJNZ

L5

00450

RET

00460

L6

DEC

HL

00470

LD

(L2+1),HL

00480

LD

HL,(L1+1)

00490

LD

DE,64

00500

ADD

HL, DE

00510

LD

(L1+1),HL

00520

JR

L1

Start

of object

: # 9C4 0

(40000)

Length

: #0053

(00083)

Executes

: # 9C4 0

(40000)

Дамп блока кодов:

9C4 0

21

00

40

22

4D

9C

21

4D

B6

9C4 8

A0

22

50

9C

11

00

00

21

C4

9C50

00

00

7E

FE

DE

28

2C

FE

98

9C58

DF

D0

07

E5

D5

6F

26

0F

08

9C60

29

29

24

CD

75

9C

EB

01

3C

9C68

20

F8

09

EB

CD

75

9C

D1

BF

9C7 0

1C

E1

2B

18

DD

06

04

7E

B1

9C7 8

0F

B6

23

B6

12

14

12

14

FE

9C80

10

F5

C9

2B

22

50

9C

2A

4D

9C88

4D

9C

11

40

00

19

22

4D

E 6

9C90

9C

18

B9

00

00

00

00

00

99

В приведенной процедуре печати для сокращения объёма тоже приценяется приём модификации программы в процессе работы. Вообще говоря, модифицируются не команды, а данные: изменяются значения, задаваемые в регистры DE и HL в строках 90 и 100. Вместо нулей при работе подставляются конкретные данные.

Не знаем, хорошо или плохо то, что текст для печати должен быть "закодирован" - видимо, это зависит от конкретных задач. Слово "закодирован" взято в кавычки, поскольку, если текст должен быть напечатан строчными буквами, то при "кодировании" они просто должны быть заменены на заглавные. Так или иначе, упрощение процедуры привело к усложнению процесса подготовки текста для печати. Но, как говорится, о вкусах не спорят. От себя мы можем дополнить процедуру программой на Бейсике, кодирующей текстовые сообщения. 10 LET begin=41000: LET b$="" 20 INPUT LINE a$

30 IF a$<>"" THEN LET b$=b$+a$+CHR$ 254: GO TO 20 40 LET len=LEN b$ 50 LET b$(len)=CHR$ 255 60 LET end=begin+len 70 FOR a=1 TO len

80 POKE (begin+a-1),CODE (b$(len-a+1))-32 90 NEXT a

100 PRINT "TEXT: ";begin;"...";end-1''"LENGTH=";len

Текст надо вводить по запросу программы по строкам (не более 32 символов). При вводе текст строки будет автоматически завершен символом перевода на новую строку. Нажатие ENTER без ввода текста означает завершение текста и ввод символа конца текста. После этого будет произведено кодирование и выданы следующие значения: начальный и конечный адрес расположения текста в памяти, а также длину текста. Первый и последний параметры можете использовать для сохранения "закодированного" текста на ленте или диске, а второй Вы должны будете подставить в строку 10 листинга кодового блока вместо nnnnn).

© Руслан Крылов, г. Владивосток, 1994.

Предлагаю Вам к разделу "Этюды" небольшую, но довольно эффектную программу, выполняющую очистку экрана. Подобной я у Вас пока не встречал. Программа очищает экран от центра к четырём вершинам, при этом, в центре экрана образуется чёрный ромб, увеличивающийся в размерах, пока им не будет заслонен (очищен) весь экран.

00010

ORG

40000

00020

ONE

LD

A, B

00030

CP

#C0

00040

RET

NC

00050

CALL

8881

00060

LD

B, #BF

00070

LD

A, C

00080

AND

#07

00090

ADD

A, #F1

00100

LD

C,A

00110

LD

A,(BC)

00120

AND

(HL)

00130

LD

(HL),A

00140

RET

00150

TWO

LD

A, #80

00160

ADD

A, E

00170

LD

C,A

00180

LD

A,#60

00190

ADD

A, D

00200

LD

B, A

00210

CALL

ONE

00220

LD

A, #80

00230

SUB

E

00240

LD

C,A

00250

LD

A,#60

00260

ADD

A, D

00270

LD

B, A

00280

CALL

ONE

00290

LD

A, #80

00300

SUB

E

00310

LD

C,A

00320

LD

A,#60

00330

SUB

D

00340

LD

B, A

00350

CALL

ONE

00360

LD

A, #80

00370

ADD

A, E

00380

LD

C,A

00390

LD

A,#60

00400

SUB

D

00410

LD

B, A

00420

CALL

ONE

00430

DEC

E

00440

INC

D

00450

LD

A, E

00460

CP

#FE

00470

RET

NC

00480

JR

TWO

00490

ENT

00500

START

LD

HL,2252

00510

LD

DE,2252

00520

LD

BC,7 67

00530

LD

(HL) , 1

00540

LDIR

00550

LD

DE,255

00560

THREE

INC

E

00570

INC

E

00580

PUSH

DE

00590

CALL

TWO

00600

POP

DE

00610

LD

A, E

00620

CP

#DF

00630

RET

Z

00640

JR

THREE

00650

RET

Start of object

: # 9C4 0

(40000)

Length

: #0065

(00101)

Executes

: #9C87

(40071)

Сразу после старта программы (строка 490) происходит установка атрибутов для всего экрана, значение которых задается числовым параметром в строке 530 (в данном примере PAPER 0; INK 1, но Вы можете задать своё значение при помощи хотя бы POKE 40081,N). Затем начинается собственно формирование "ромба", очищающего экран.

Если Вы добавите строку:

00545 ENT

то будете иметь ромб без предварительной установки атрибутов. Иными словами, для этого надо запустить блок с адреса:

Executes : #9C94 (40084)

Шестнадцатеричный дамп блока:

9C4 0

78

FE

C0

D0

CD

B1

22

06

88

9C4 8

BF

79

E6

07

C6

P1

4F

0A

19

9C50

A6

77

C9

3E

80

83

4F

3E

A0

9C58

60

82

47

CD

40

9C

3E

80

84

9C60

93

4F

3E

60

82

47

CD

40

52

9C68

9C

3E

80

93

4F

3E

60

92

70

9C7 0

47

CD

40

9C

3E

80

83

4F

8C

9C7 8

3E

60

92

47

CD

40

9C

1D

51

9C80

14

7B

FE

FE

D0

18

CC

21

7C

9C88

00

58

11

01

58

01

FF

02

E8

9C90

36

01

ED

B0

11

FF

00

1C

2C

9C98

1C

D5

CD

53

9C

D1

7B

FE

2B

9CA0

DF

C8

18

F3

C9

00

00

00

B7

© Андрей Нефедов, г. Новокузнецк, 1994.

Хочу поделиться с читателями некоторыми процедурами, взятыми из разных игровых и прикладных программ. Эти процедуры позволяют создавать разные звуковые эффекты, которые играют немаловажную роль в различных программах, создаваемых любителями сделать что-нибудь своими руками.

Процедуры эти довольно простые, как в написании, так и в обращении. Они, при различных значениях изменяемых параметров, помеченных в листингах как "var", помогут создать довольно обширный спектр звуковых

эффектов.

Процедура 1.

00010

ORG

40000

00020

ENT

00030

LD

A, (23624)

00040

RRA

00050

RRA

00060

RRA

00070

LD

B, 240

;

var

00080

LD

C,254

00090

LB

DEC

H

00100

JR

NZ, LA

00110

XOR

16

00120

OUT

(C) , A

00130

LD

H, 238

;

var

00140

LA

DEC

L

00150

JR

NZ, LB

00160

XOR

16

00170

OUT

(C) , A

00180

LD

L,254

;

var

00190

DJNZ

LB

00200

RET

Start

of object

: # 9C4 0

(40000)

Length

: #001F

(00031)

Executes

: # 9C4 0

(40000)

9C4 0 I

3A 48

5C

1F

9C4 8

0E FE

25

20

1F

06

9C50 9C58

ORG ENT LD LD LD

PUSH PUSH PUSH CALL POP POP POP LD SUB LD

DJNZ RET

# 9C4 0 (40000) #0018 (00024)

# 9C4 0 (40000)

79 ED

26 79

40000

2D FE

20 10

10 00

F4 EC

EE 2E

BE

C9

4B

Процедура 2.

00010

00020

00030

00040

00050

00060 LA

00070

00080

00090

00100

00110

00120

00130

00140

00150

00160

00170

Start of object

Length

Executes

BC,64004

HL,512

DE,2

HL

DE

BC

949

BC

DE

HL

A, L

C

L,A LA

; var ; var ; var

9C4 0

01

04

FA

21

00

02

11

02

11

9C4 8

00

E5

D5

C5

CD

B5

03

C1

A9

9C50

D1

E1

7D

91

6F

10

F2

C9

E 6

1F EE

06 10

F0 ED

0D 26

00010

ORG

40000

00020

ENT

00030

LD

A,(23624)

00040

SRL

A

00050

SRL

A

00060

LD

L,A

00070

LD

E, 0

00080

LD

D,128

00090

LC

PUSH

DE

00100

LB

LD

B, E

00110

LA

DJNZ

LA

00120

LD

A,(BC)

00130

AND

248

00140

OR

L

00150

OUT

(254) , A

00160

INC

C

001л0

DEC

D

00180

JR

NZ, LB

00190

POP

DE

00200

INC

E

00210

DEC

D

00220

JR

NZ, LC

00230

RET

Start

of object

: # 9C4 0

(40000)

Length

: #0020

(00032)

Executes

: # 9C4 0

(40000)

; var ; var

9C4 0

3A

48

5C

CB

3F

CB

3F

6F

3D

9C4 8

1E

00

16

80

D5

43

10

FE

BE

9C50

0A

E6

F8

B5

D3

FE

0C

15

7B

9C58

20

F3

D1

1C

15

20

ED

C9

DF

ORG ENT LD

RRCA RRCA RRCA

Процедура 4.

00010 00020 00030 00040 00050 00060

40000 A, (21320)

00070

00080 LB

00090

00100

00110

00120 LA

00130

00140

00150

00160

Start of object

Length

Executes

53

0F

0F

0F

1E

C8

C4

FE

EE

11

43

10

FE

F8

F5

FB

C9

00

00

00

E2

var

Процедура 5.

00010

00020

00030

00040

00050 LC

00060

00070

00080

00090 LB

00100

00110

00120 LA

00130

00140

00150

00160

Start of object

Length

Executes

0E

C7 B6 58

F7

FE 57 CB A2 CB 20 02 16 18 ED _ 3D 20 EE C9 00

Предоставим читателях возможность самим поэкспериментировать с изменяемыми числовыми параметрами и обратим внимание на другой момент. Так как порт .звукового динамика и бордюра - один и тот же, то звуковые эффекты неизбежно влияют на цвет бордюра. Если Вам не надо, чтобы цвет его менялся, надо предусматривать специальные меры - блокировать 0...2 биты числа, выдаваемого в порт (#FE). Или же, наоборот, звуковой эффект может приводить к изменению цвета бордюра (0-2 биты), если того требует идея. Так, в процедуре 1 попробуйте изменить строки 110 и 160, задавая числовой параметр для XOR в пределах от 16 до 23, да ещё так, чтобы он не обязательно был одинаковым в этих строках.

В Процедуре 2 используется стандартный BEEPER из ПЗУ, поэтому цвел бордюра будет определяться содержимым системной ячейки 23624 (BORDCR).

Процедура 3 тоже использует значение BORDCR. От её значения будет зависеть цвет бордюра в момент звукового сигнала. Например, при белом бордюре, он станем жёлтым, при жёлтом - изменится на зелёный и т.д. Если Вы измените строку 130, например, так: 00130 XOR 255

то при изначально зеленом бордюре в момент звукового сигнала получите полосы всех цветов.

Не менее интересные результаты дадут эксперименты с процедурой 4. Здесь вообще в качестве переменной используется ячейка дисплейного файла. Видимо, в оригинале процедуры цвет бордюра в момент звукового сигнала зависел от того, что в этот момент находилось в этом месте экрана. Можете переделать программу: 00030 LD A, N ; var

а строки 40-60 - удалите (это, кстати, сократит процедуру на 4 байта). Попробуйте менять параметр N в диапазоне 0.7, меняя также при этом и параметр в строке 100 от 16 до 23 - Вы получите различные цвета полос на бордюре в момент звукового сигнала.

А в процедуре 5 в момент звукового сигнала Вы увидите все цвета радуги на экране.

Андрей тоже просит напечатать его адрес - он надеется, что вместе с новыми друзьями они смогут разгадать какие-нибудь секреты ZX-Spectrum:

E,200

(254), 17 B, E LA E

NZ, LB

LD

DI

OUT

XOR

LD

DJNZ

DEC

JR

EI

RET

# 9C4 0 #0015

# 9C4 0 9C4 0 9C4 8 9C50

ORG

ENT

LD

LD

LD

RES

RES

LD

CP

JR

LD

OUT

DJNZ

DEC

JR

RET

# 9C4 0 #0017

# 9C4 0 9C4 0 9C4 8 9C50

: var

A

(40000) (00021) (40000) 3A 48 F3 D3 1D 20

40000

E, 50

C,254

D,A 4,D 3,D B, E B

NZ, LA D,24 (C),D LB A

NZ, LC

(40000) (00023) (40000) 1E 32 9A 43 51 10

654006, Кемеровская обл., г. Новокузнецк, ул. Филиппова, 16-9, Нефедов Андрей.

© Вячеслав Пономарев, г. Черногорец (Хакасия), 1994.

Предлагаю Вам программу, которую написал под впечатлением от многочисленных "музыкалок". Эта программа выводит любой текст произвольным (загруженным) символьным набором. Особенность программы в том, что текст выводится в нижней трети экрана и буквы по высоте равны одной трети экрана. Вся хитрость в том, что буквы рисуются не в дисплейном файле, а в файле атрибутов, цветом PAPER и INK, то есть Вы можете нарисовать в нижней трети любой рисунок любым цветом INK и буквы будут "бежать" по рисунку, а рисунок как бы просвечиваться через буквы.

00010

ORG

40000

00020

ENT

00030

BEGIN

LD

HL,ADR

00040

LD

(TEXT),HL

00050

MN

LD

DE, (23606)

00060

LD

HL,(TEXT)

00070

LD

A,(HL)

00080

CP

13

00090

JR

Z,BEGIN

00100

CP

16

00110

JP

Z, Ll

00120

CP

17

00130

JP

Z,L2

00140

LD

H, 0

00150

LD

L,A

00160

ADD

HL, HL

00170

ADD

HL, HL

00180

ADD

HL, HL

00190

ADD

HL, DE

00200

LD

BC, 8

00210

LD

DE,BUFFER

00220

LDIR

00230

LD

B, 8

00240

мз

PUSH

BC

00250

PAUSE

LD

B, 1

00260

MM

HALT

00270

DJNZ

MM

00280

LD

DE,#5AlF

00290

LD

B, 8

00300

LD

HL,BUFFER

00310

LD

(POINTB),HL

00320

Ml

LD

HL, (POINTB)

00330

LD

A,(HL)

00340

SLA

A

00350

JR

C,MSET

00360

LD

A,(DE)

00370

AND

#C7

00380

PAPER

OR

#20

00390

LD

(DE),A

00400

M0

LD

HL,#20

00410

ADD

HL, DE

00420

EX

DE, HL

00430

LD

HL, (POINTB)

00440

INC

HL

00450

LD

(POINTB),HL

00460

DJNZ

M1

00470

LD

HL,BUFFER

00480

LD

B, 8

00490

M2

LD

A,(HL)

00500

SLA

A

00510

LD

(HL),A

00520

INC

HL

00530

DJNZ

M2

00540

LD

HL, #5A00

00550

LD

C,8

00560

NEXTL

LD

B, 31

00570

NEXTC

INC

HL

00580

LD

A,(HL)

00590

AND

#38

00600

LD

E,A

00610

DEC

HL

00620

LD

A,(HL)

00630

AND

#C7

00640

OR

E

00650

LD

(HL),A

00660

INC

HL

00670

DJNZ

NEXTC

00680

INC

HL

00690

DEC

C

00700

JR

NZ,NEXTL

00710

POP

BC

00720

DJNZ

M3

00730

PROD

LD

HL,(TEXT)

00740

INC

HL

00750

LD

(TEXT),HL

00760

LD

A, #7F

00770

IN

A, (#FE)

00780

AND

1

00790

RET

Z

00800

JP

MN

00810

MSET

LD

A,(DE)

00820

AND

#C7

00830

INK

OR

#10

00840

LD

(DE),A

00850

JR

M0

00860

L1

CALL

LLL

00870

LD

(INK+1),A

00880

JR

PROD

00890

L2

CALL

LLL

00900

LD

(PAPER+1),A

00910

JR

PROD

00920

LLL

LD

HL,(TEXT)

00930

INC

HL

00940

LD

(TEXT),HL

00950

LD

A,(HL)

00960

LD

HL,POICOL

00970

LD

D,0

00980

LD

E,A

00990

ADD

HL, DE

01000

LD

A,(HL)

01010

RET

01020

BUFFER

DEFW

0, 0,0, 0

01030

TEXT

DEFW

0

01040

POINTB

DEFW

0

01050

POICOL

DEFB

0,8,16,24

01060

DEFB

32,40,48,56

01080

ADR

DEFB

16,2,17,5

01090

DEFM

" HELLO, "

01100

DEFB

16,7,17,2

01110

DEFM

"ALL USERS"

01120

DEFB

16,2,17,5

01130

DEFM

" !!! "

01140

DEFB

17, 1

01150

DEFM

" "

01160

DEFB

13

Start

of object

: # 9C4 0

(40000)

Length

: #00F9

(00249)

Executes

: # 9C4 0

(40000)

В строке 30 задается адрес текста в ОЗУ. В строке 40 его значение сохраняется в переменной TEXT. В строке 50 задается значение CHARS того символьного набора, которым должна выполняться печать. Далее анализируются символы текста. В строке 80 проверяется признак конца текста. Если он зафиксирован, программа зацикливается и текст печатается сначала. В строке 100 анализируется код управления цветом INK, а в строке 120 - код управления PAPER.

Строки 140-190 находят образ символа по его коду, а 200-220 переносят восемь его байтов в служебный

буфер.

В строках 250-270 организована задержка, определяющая скорость движения бегущей строки, она зависит от числового параметра, задаваемого в регистре B. Однако при других значениях B слишком заметными становятся рывки при перемещении букв.

В строке 540 задается адрес начала нижней трети экрана в файле атрибутов. В строках 550-700 происходит сдвиг атрибутов (PAPER) нижней трети - влево.

В строках 760-790 выполняется опрос клавиши SPACE, если она нажата, то происходит выход из программы.

Текст кодируется - как обычно, но в конце текста обязательно должен стоять маркер CHR$ 13. Чтобы сменить цвет букв или фона (не забывайте, что цвет букв PAPER!), нужно задать управляющие коды CHR$ 16; CHR$... - для цвета INK (фон букв) или CHR$ 17; CHR$... - для цвета PAPER (цвет букв).

А теперь шестнадцатеричный дамп:

9C4 0

21

10

9D

22

04

9D

ED

5B

B5

9C4 8

36

5C

2A

04

9D

7E

FE

0D

CA

9C50

28

EE

FE

10

CA

DB

9C

FE

4F

9C58

11

CA

E3

9C

26

00

6F

29

0C

9C60

29

29

19

01

08

00

11

FC

7D

9C68

9C

ED

B0

06

08

C5

06

01

17

9C7 0

76

10

FD

11

1F

5A

06

08

27

9C7 8

21

FC

9C

22

06

9D

2A

06

C2

9C80

9D

7E

CB

27

38

4D

1A

E6

AE

9C88

C7

F6

20

12

21

20

00

19

6D

9C90

EB

2A

06

9D

23

22

06

9D

CC

9C98

10

E4

21

FC

9C

06

08

7E

6D

9CA0

CB

27

77

23

10

F9

21

00

F2

9CA8

5A

0E

08

06

1F

23

7E

E6

60

9CB0

38

5F

2B

7E

E6

C7

B3

77

63

9CB8

23

10

F2

23

0D

20

EC

C1

76

9CC0

10

AB

2A

04

9D

23

22

04

2B

9CC8

9D

3E

7F

DB

FE

E6

01

C8

46

9CD0

C3

46

9C

1A

E6

C7

F6

10

DE

9CD8

12

18

B1

CD

EB

9C

32

D7

AC

9CE0

9C

18

DF

CD

EB

9C

32

8A

1F

9CE8

9C

18

D7

2A

04

9D

23

22

1F

9CF0

04

9D

7E

21

08

9D

16

00

87

9CF8

5F

19

7E

C9

00

00

00

00

53

9D00

00

00

00

00

00

00

00

00

9D

9D08

00

08

10

18

20

28

30

38

85

9D10

10

02

11

05

20

48

45

4C

CE

9D18

4C

4F

2C

20

10

07

11

02

C6

9D2 0

41

4C

4C

20

55

53

45

52

F5

9D2 8

53

10

02

11

05

20

21

21

A2

9D30

21

20

11

01

20

20

20

20

A0

9D38

0D

00

00

00

00

00

00

00

E2

© Сергей Гуляев, республика Коми, 1994 г.

Очень люблю Ваш новый раздел ЭТЮДЫ. Решив поддержать идею А.А.Иванова из г. Печора, я высылаю Вам две программы.

Программа 1. Действие её таково: от центра экрана к его краям расходятся разноцветные полосы.

00010

ORG

40000

00020

ENT

00030

LD

IX,#000F

00040

LD

HL,#0010

00050

LD

B, #10

00060 L1

PUSH

BC

00070

PUSH

HL

00080

CALL

L2

00090

PUSH

IX

00100

POP

HL

00110

CALL

L2

00120

POP

HL

00130

POP

BC

00140

INC

HL

00150

DEC

IX

00160

LD

A, #FF

00170

LD

(L11),A

00180

DJNZ

L1

00190

RET

00200

L2

LD

B, #18

00210

LD

A, (L10)

00220

ADD

A,2

00230

LD

(L10),A

00240

L3

PUSH

BC

00250

PUSH

HL

00260

CALL

L4

00270

POP

HL

00280

LD

A, (L10)

00290

AND

#7F

00300

LD

C,A

00310

LD

A, #20

00320

CALL

L6

00330

LD

DE,#0020

00340

ADD

HL, DE

00350

POP

BC

00360

DJNZ

L3

00370

RET

00380

L4

LD

A,(L11)

00390

CP

0

00400

RET

Z

00410

DEC

A

00420

LD

(L11),A

00430

LD

C,A

00440

LD

B, A

00450

LD

A, #10

00460

L5

OUT

(#FE),A

00470

DJNZ

L5

00480

LD

B, C

00490

XOR

A

00500

OUT

(#FE),A

00510

RET

00520

L6

PUSH

HL

00530

PUSH

AF

00540

EX

DE, HL

00550

LD

HL,#5800

00560

ADD

HL, DE

00570

LD

(HL),C

00580

LD

HL,#4000

00590

LD

A, D

00600

OR

A

00610

JR

Z, L7

00620

LD

H, #47

00630

L7

CP

2

00640

JR

NZ, L8

00650

LD

H, #4E

00660

L8

ADD

HL, DE

00670

POP

AF

00680

PUSH

HL

00690

LD

L,A

00700

LD

H, 0

00710

ADD

HL, HL

00720

ADD

HL, HL

00730

ADD

HL, HL

00740

EX

DE, HL

00750

LD

HL,(#5C3

00760

ADD

HL, DE

00770

EX

DE, HL

00780

POP

HL

00790

LD

B, 8

00800

L9

LD

A,(DE)

00810

INC

DE

00820

LD

(HL),A

00830

INC

H

00840

DJNZ

L9

00850

POP

HL

00860

RET

00870

L10

DEFB

0

00880

L11

DEFB

0

Start

of object

: # 9C4 0

(40000)

Length

: #008E

(00142)

Executes

: # 9C4 0

(40000)

Эффект происходит со звуковым сопровождением.

Мы хотим обратить вникание читателей на строку 310 листинга: здесь задается код ПРОБЕЛА, печать которого разными цветами и создает эффект цветных полос. Значение CHARS символьного набора для печати задается в строке 750.

Шестнадцатеричный дамп процедуры:

9C4 0

DD

21

0F

00

21

10

00

06

20

9C4 8

10

C5

E5

CD

61

9C

DD

E5

2A

9C50

E1

CD

61

9C

E1

C1

23

DD

39

9C58

2B

3E

FF

32

CD

9C

10

E9

F0

9C60

C9

06

18

3A

CC

9C

C6

02

4D

9C68

32

CC

9C

C5

E5

CD

84

9C

35

9C7 0

E1

3A

CC

9C

E6

7F

4F

3E

81

9C7 8

20

CD

9B

9C

11

20

00

19

82

9C80

C1

10

E8

C9

3A

CD

9C

FB

3F

9C88

00

C8

3D

32

CD

9C

4F

47

5A

9C90

3E

10

D3

FE

10

FC

41

AF

47

9C98

D3

FE

C9

E5

F5

EB

21

00

B4

9CA0

58

19

71

21

00

40

7A

B7

B0

9CA8

28

02

26

47

FE

02

20

02

FD

9CB0

26

4E

19

F1

E5

6F

26

00

44

9CB8

29

29

29

EB

2A

36

5C

19

8F

9CC0

EB

E1

06

08

1A

13

77

24

FE

9CC8

10

FA

E1

C9

00

00

00

00

18

на является разновидностью программы "Гашение экрана".

Эта программа аналогична уже опубликованной нами (в РЕВЮ-94 ' 3, стр. 45) процедуре, имитирующей действие FADE_0) MEGABASIC. Отличие предлагаемой сейчас в том, что происходящее на экране сопровождается

звуковым эффектом.

00010

ORG

40000

00020

ENT

00030

LD

HL,LABEL1

00040

ADD

A,(HL)

00050

LD

(LABEL1) , A

00060

LD

A, R

00070

AND

#7F

00080

ADD

A,(HL)

00090

LD

(LABEL1) , A

00100

LD

HL,(LABEL3)

00110

INC

HL

00120

LD

A, H

00130

AND

#03

00140

LD

H, A

00150

LD

(LABEL3),HL

00160

LD

A,(HL)

00170

LD

HL, LABEL1

00180

ADD

A,(HL)

00190

LD

(LABEL1) , A

00200

LD

L,A

00210

LD

H, 0

00220

ADD

HL, HL

00230

ADD

HL, HL

00240

LD

DE,#5800

00250

LD

BC,#0300

00260

LDIR

00270

L1

LD

HL,#5800

00280

LD

D,0

00290

LD

BC,#0300

00300

L2

LD

A,(HL)

00310

CP

0

00320

JR

z,l3

00330

LD

D, #FF

00340

DEC

(HL)

00350

LD

A, #10

00360

OUT

(#FE),A

00370

XOR

A

00380

OUT

(#FE),A

00390

L3

DEC

BC

00400

INC

HL

00410

LD

A, B

00420

OR

C

00430

JR

NZ, L2

00440

CP

D

00450

JR

NZ, L1

00460

LD

HL,#4000

00470

LD

DE,#4001

00480

LD

(HL),0

00490

LD

BC,#1800

00500

LDIR

00510

RET

00520

LABEL1

DEFB

0

00530

LABEL2

DEFB

0

00540

LABEL3

DEFB

0

00550

LABEL4

DEFB

0

Start

of object

: # 9C4 0

(40000)

Length

: #0061

(00097)

Executes

: # 9C4 0

(40000)

Шестнадцатеричный дамп:

9C4 0

21

9D

9C

86

32

9D

9C

ED

14

9C4 8

5F

E6

7F

86

32

9D

9C

2A

C3

9C50

9F

9C

23

7C

E6

03

67

22

38

9C58

9F

9C

7E

21

9D

9C

86

32

BF

9C60

9D

9C

6F

26

00

29

29

11

2D

9C68

00

58

01

00

03

ED

B0

21

1E

9C7 0

00

58

16

00

01

00

03

7E

FC

9C7 8

FE

00

28

0A

16

FF

35

3E

CC

9C80

10

D3

FE

AF

D3

FE

0B

23

AB

9C88

78

B1

20

EB

BA

20

E0

21

33

9C90

00

40

11

01

40

36

00

01

F5

9C98

00

18

ED

B0

C9

00

00

00

B2

9CA0

00

00

00

00

00

00

00

00

3C

© Евгений Любимов, г. Новокузнецк, 1994.

Хочу предложить в рубрику "Этюды" программу, действие которой аналогично команде Мега-Бейсика FADE_0. Она релоцируемая, может загружаться в любой адрес и стартовать с адреса загрузки.

00010 00020 00030 00040 00050 00060 00070 00080 L3

40000

BC,768 DE,22528 HL,768

B, 255 BC

ORG

ENT

LD

LD

LD

LDIR LD

PUSH

00090

LD

HL,22528

00100

LD

ВС,768

00110

L2

LD

A,(HL)

00120

CP

1

00130

CALL

NC, L1

00140

INC

HL

00150

DEC

ВС

00160

LD

А, В

00170

OR

С

00180

JR

NZ, L2

00190

POP

ВС

00200

DJNZ

L3

00210

RET

00220

L1

DEC

A

00230

LD

(HL),A

00240

RET

Start of object : #9C40 (40000) Length : #0027 (00039)

Executes : #9C40 (40000)

9C4 0

01

00

03

11

00

58

21

00

6A

9C4 8

03

ED

B0

06

FF

C5

21

00

6F

9C50

58

01

00

03

7E

FE

01

D4

99

9C58

64

9C

23

0B

78

B1

20

F4

5F

9C60

C1

10

EA

C9

3D

77

C9

00

FD

Эта процедура по эффекту похожа на аналогичную, предложенную в РЕВЮ-94 № 3, хотя, справедливости ради, следует заметить, что эффект всё же отличается.

© Алексей Прокопенко, г. Ростов-на-Дону, 1994. Предлагаю Вам свою программу для скроллинга всего экрана внутри знакомест.

00010

ORG

40000

00020

ENT

00030

LD

HL,16384

00040

LD

BC,6144

00050 LOOP

LD

A,(HL)

00060

RLCA

00070

LD

(HL),A

00080

INC

HL

00090

DEC

BC

00100

LD

A, B

00110

OR

C

00120

JR

NZ,LOOP

00130

RET

Start of object

: # 9C4 0

(40000)

Length

: #0010

(00016)

Executes

: # 9C4 0

(40000)

В строке 60 может стоять любая циклическая или нециклическая команда сдвига регистра А. В зависимости от этого можно получать различные эффекты.

Например, при использовании команда SRL A или SLA A получим интересную очистку экрана, а при использовании RRCA или RLCA - интересный эффект с экраном. Для этого добавьте строки: 00022 LD В,24

00024 L1 PUSH ВС

00122 POP ВС

00124 DJNZ L1

Получим вариант программыг, "вращающей" изображение внутри каждого знакоместа экрана три раза. Параметры блока кодов станут при этом следующими:

Start of object

: # 9C4 0

(40000)

Length

: #0016

(00022)

Executes

: # 9C4 0

(40000)

9C4 0

06 18

C5

21

00

40

01

00

21

9C4 8

18 7E

07

77

23

0B

78

B1

4F

9C50

20 F7

C1

10

ED

C9

00

00

8A

© Руслан Пак, г.

Климовск Тул

ьской

области, 1994.

Я испытал программу "ВОТ ТАК!", опубликованную в РЕВЮ-94 № 3 (стр.47). Картинку она проявляет

хорошо, а вот атрибутов на ней нет. Предлагаю усовершенствование этой программы.

00010

ORG

50000

00020 W1

LD

F, 1

00030

AND

A

00040

EX

AF,AF'

00050

LD

B, 9

00060 W2

LD

DE,#1800

00070

LD

HL,#DF38

00080 W3

DEC

HL

00090

DEC

DE

00100

LD

A, D

00110

OR

E

00120

JR

Z,W4

00130

SET

6, D

00140

EX

AF,AF'

00150

RLA

00160

RLA

00170

RLA

00180

RLA

00190

PUSH

AF

00200

AND

(HL)

00210

EX

DE, HL

00220

OR

(HL)

00230

EX

DE, HL

00240

LD

(DE),A

00250

POP

AF

00260

EX

AF,AF'

00270

RES

6, D

00280

JR

W3

00290 W4

DJNZ

W2

00300

RET

00310

ENT

00320

LD

DE,#5800

00330

LD

HL,#DF38

00340

LD

BC,#0300

00350

LDIR

00360

JR

W1

Start of object : #C350 (50000) Length : #0035 (00053)

Executes : #C378 (50040)

Загрузите заставку под адрес 51000, затем запустите программу с адреса 50040. Шестнадцатеричный дамп процедуры:

C350

3E

01

A7

08

06

09

11

00

21

C358

18

21

38

DF

2B

1B

7A

B3

DE

C360

28

13

CB

F2

08

17

17

17

68

C368

17

F5

A6

EB

B6

EB

12

F1

6C

C370

08

CB

B2

18

E7

10

DF

C9

6F

C378

11

00

58

21

38

DF

01

00

DD

C380

03

ED

B0

18

CB

00

00

00

C6




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Игры - Плюсы и минусы игры "Операция Р.Р."
Форум - За истекшую неделю от абонентов не было получено ни одного, даже устного сообщения !
Обратная связь - контакты редакции.
P.S. - Post Scriptum - о изменениях в данной версии оболочки.
Аторы журнала - ZX-Format No.7

В этот день...   24 ноября