ZX-Ревю 1995 №5 1995 г.

Этюды - Сегодняшний выпуск ЭТЮДОВ начнем с непрекращающегося потока писем по поводу "гасилки" экрана.


Сегодняшний выпуск ЭТЮДОВ начнем с непрекращающегося потока писем по поводу "гасилки" экрана (вот уж не думали, что эта тема вызовет такой резонанс!).

Некоторые читатели недоумевают по поводу того, что мы пользуемся командой HALT, предварительно не разрешив прерывания командой EI. Друзья. Не будьте буквоедами. Если пойти еще дальше, то можно упомянуть предварительную установку черного цвета бордюра (который может быть и белым, а погасший экран с белым бордюром смотрится нелепо). Еще дальше -установку стека, чтобы он не оказался в одних адресах с программой и т.д. и т.п. Давайте остановимся - все хорошо в меру. Все это - внешние условия работы процедуры. Первоначальный запуск любой программы все равно происходит из Бейсика, при этом прерывания разрешены. И если Вы в своей основной программе их запрещаете, то Вам придется потрудиться разрешить их перед вызовом подпрограмм, содержащих HALT. Это естественно. Однако Вы можете в каждую такую подпрограмму вставить собственный EI, предшествующий HALT, чтобы потом не заботиться о состоянии режима прерываний. И то, и другое верно -поступайте, кому как нравится. Мы не указываем команду EI только потому, чтобы поставить разные варианты в одинаковые условия при подсчете количества байтов.

Теперь конкретно о письмах. В основном, это повторение уже опубликованных приемов и идей по поводу сокращения программ. Пришло несколько писем с длиной процедуры 23 байта, однако это теперь уже не рекорд. Тем не менее рассмотрим пару идей.

Владимир Зореев прислал очередной вариант, длиной 23 байта. Но длина - даже не главное. Он придумал новый способ реализации задержка *

1

org

50000

2

ent

$

3

pause

equ

5

4

ld

c,%01111111

5

l3

ld

b,pause

6

l2

ld

hl,#5800

7

l1

ld

a, (hl)

8

and

с

9

ld

(hl),a

10

inc

hl

11

ld

a, #5b

12

cp

h

13

jr

nz, li

14

djnz

l2

15

srl

с

16

jr

с, l3

17

ret

В его процедуре задержка выполняется при помощи многократного выполнения одного и того же активного действия. То есть в данном варианте пять раз гасится 7-й бит, пять раз 6-й и т.д. Величина задержки задается в PAUSE. Ко всему прочему, процедура одинаково хорошо работает и с разрешенными и с запрещенными прерываниями.

Алексей Леготин взял за основу процедуру А.Палоусова (ZX-PE-ВЮ-95, N3, стр.40) и сократил ее на 1 байт. Он догадался, что разумнее регистры Н и L загружать одной командой, объединив строки 50 и 90 (см.листинг в указанном номере РЕВЮ) в одну команду (результат 23 байта):

1 2

3

4

5

6

7

8 9

10 l3

11 12

13

14

15

16 17

org ent ld ld

halt

dec

jr

srl

ret

ld

and

ld

inc

ld

cp

jr

jr

l1 l2

50000 $

de,#5bff hl,#5805

l

nz, l2 E

nc

a,(hl) E

(hl),a hl a,h d

nz, l3 li

Берем письмо с очередной "га-силкой". И вдруг... что это? Новая заявка на рекорд! А мы-тр уж было усомнились в том, что результат Сергея Колотова может быть побит. Но он продержался, по традиции, тоже два месяца. Новым победителем стал Максим Лупан из Адлера. Длина его процедуры 22

байта.

! Вот

она:

1

ORG

50000

2

ENT

$

3

PAUSE

EQU

5

4

LD

C, #FF

5

LI

LD

H, #5A

6

L2

LD

A,(HL)

7

AND

С

8

LD

(HL),A

9

DEC

HL

10

BIT

2 ,H

11

JR

Z ,L2

12

SRL

С

13

RET

NC

14

LD

В,PAUSE

15

L3

HALT

16

DJNZ

L3

17

JR

LI

Чем вызван успех? Так-так, опять декремент регистра HL. Однако контроль 2-го, а не 3-го (как в процедуре Сергея Колотова) бита регистра Н, что, в сущности, то же самое "с точностью до наоборот*' :

per. Н per. L 23295: 01011010 11111111 22528: 01011000 00000000

22527: 01010111 11111111 %%

3-Й бит -1 1- 2-Й бит

А вот и оригинальная идея! Не

расходуется память на задание содержимого регистра L. Ведь при циклическом повторении команды DEC HL - регистр L все равно пробегает все 256 значений. И если даже начало работы будет при произвольном значении регистра L (например, 0, то есть HL-фЗАОО), то при сравнении по AND с маской, "недообнуленные" при самом первом проходе старшие биты некоторых атрибутов (это FLASH) обнулятся уже при втором проходе, после чего "порядок" восстановится. На глаз такое "недообнуление при первом проходе" совершенно незаметно (ведь FLASH практически не встречается в картинках, да еще конкретное место играет роль). Однако этот прием дал победный байт!

Кстати, Максим приводит понравившуюся ему и усовершенствованную им процедуру Антона Сидоренко (не претендуя на ее авторство, см. гХ-РЕВЮ-94, N3, стр.40). С применением того же приема ее

1 2

3

4

5

6

7

8 9

10 11

ORG

ENT

EQU

LD

LD

LD

LD

AND

LD

DEC

BIT

PAUSE

L3 L2 L1

длина

стала

23 байта:

1

ORG

50000

2

ENT

$

3

PAUSE

EQU

#50

4

LD

C,#FF

5

LI

LD

H,#5A

6

L2

LD

A,(HL)

7

AND

С

8

LD

(HL),A

9

DEC

HL

10

BIT

2 ,H

11

JR

Z,L2

12

SRL

С

13

RET

NC

14

L3

DEC

HL

15

LD

A,H

16

CP

PAUSE

17

JR

NZ, L3

18

JR

LI

Сколько идей по поводу одной и той же маленькой процедуры! Вот бы взять, да и объединить самые лучшие идеи - может удастся еще сократить процедуру? Ну вот, например, замечательная 23-байтная процедура Владимира Зореева (см. выше). Попробуем реализовать в ней идею, которую предложил Максим Лупан:

50000 $

5

C, #FF В,PAUSE H,#5A A,(HL) С

(HL),A

HL

3,H

ЭТЮДЫ

12 JR NZ,L1

13 DJNZ L2

14 SRL С

15 JR C,L3

16 RET

Но что это? Выходит, мы установили новый рекорд. Длина полученной процедуры 21 байт! Да еще независимость от назойливых прерываний, которые то - разрешены, то - запрещены!

Нет, конечно, мы не можем претендовать на победу, используя ваши идеи, друзья. Ведь мы находимся в привилегированном положении по сравнению с вами. Такую процедуру Владимир Зореев наверняка написал бы и сам, получив этот номер журнала. Не отнимать же у него рекорд!

Результат оказался возможным благодаря совместным усилиям. Ну что же, подтвердилась еще одна прописная истина: "Одна голова -хорошо, а две - лучше". Поэтому справедливо будет признать, что сегодня победу разделили две головы: Максим Лупан из г.Адлер и Александр Зореев из г.Заволжье Нижегородской обл.

Но уточняем, что все вышеизложенное справедливо только по отношению к упрощенному алгоритму гашения экрана, а не к оригинальному, применяющемуся в процедуре из TERMINATOR' а - об этом Mil писали в прошлом номере. Этот вопрос пока остается открытым.

Письма, письма... Что-то в последнее время все реже стали попадаться эффекты, заслуживающие внимания. В основном, это повторение уже опубликованных вариантов. Неужели хаккерский потенциал так оскудел? Разве нет достойных внимания эффектов в западных программах? Что, боязно "копнуть поглубже"? Или не хватает знаний для создания собственных программ?

На этом фоне очень приятное впечатление производит процедура, присланная корреспондентом, имя которого уже встречалось на страницах ЭТЮДОВ.

(С) Антон Сидоренко, пос.Мурмаши, Мурманская обл., 1995.

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

ЭТЮДЫ

1

; (с)

LOGIC

GAMES, 1

2

ORG

50000

3

ENT

$

4

LD

HL, 0

5

LD

DE,16384

6

М4

PUSH

DE

7

LD

B,PAUSE

8

HALT

9

М5

PUSH

BC

10

PUSH

DE

11

LD

C,B

12

LD

B, 8

13

М7

PUSH

BC

14

LD

В, 8

15

М8

PUSH

DE

16

М9

LD

A,(DE)

17

AND

(HL)

18

LD

(DE),A

19

AND

16

20

OUT

(#FE),A

21

LD

А,С

22

CP

PAUSE

23

JR

NZ ,M3

24

XOR

A

25

LD

(DE),A

26

PUSH

DE

27

LD

A,D

28

RRCA

29

RRCA

30

RRCA

31

AND

3

32

OR

88

33

LD

D, A

34

LD

A,CLR

35

LD

(DE),A

36

POP

DE

37

МЗ

LD

A, D

38

ADD

A,8

39

LD

D, A

40

CP

88

41

JR

C,M9

42

POP

DE

43

INC

D

44

INC

HL

45

DJNZ

M8

46

LD

A, D

47

SUB

8

48

LD

D, A

49

LD

A, E

50

ADD

A,32

51

LD

E, A

52

POP

ВС

53

DJNZ

M7

54

POP

DE

55

POP

ВС

56

RES

6,H

57

INC

E

58

LD

A, E

59

AND

31

60

JR

Z,M6

61

DJNZ

M5

62

M6

POP

DE

63

INC

E

64

LD

A, E

65

AND

31

66

RET

Z

67

JR

M4

68

PAUSE

EQU

6

69

CLR

EQU

7

Параметр в строке 68 задает скорость исполнения эффекта. В строке 69 задан атрибут, которым будет заполняться экран после

очистки.

Длина

блока

кодов

90

байт:

C350

21

00

00

11

00

40

D5

06

60

C358

06

76

С5

D5

48

06

08

С5

C360

06

08

D5

А6

12

Е6

10

СЕ

C368

D3

FE

79

FE

06

20

10

AF

58

C370

12

D5

0F

0F

0F

Е6

03

АА

C378

F6

58

57

ЗЕ

07

12

D1

82

C380

С6

08

57

FE

58

38

DC

D1

A3

C388

14

23

10

D6

D6

08

57

17

C390

С6

20

5F

С1

10

С8

D1

7D

C398

С1

СВ

В4

Е6

1F

28

5F

C3A0

02

10

В7

D1

Е6

1F

99

C3A8

С8

18

АВ

00

00

00

00

00

F6

И

еще

несколько программ, лос-

вященных очистке экрана, полученных от нашего 15-летнего корреспондента из г.Улан-Удэ.

(С) Сергей Жуков,

г.Улан-Удэ, 1995.

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

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

1 ; (С) CONDOR SOFT, 1995.

2

ORG

50000

3

ENT

$

4

LD

HL,#5800

5

LD

D,H

6

LD

E,L

7

INC

DE

8

LD

BC,#02FF

9

LD

(HL),7

10

LDIR

11

LD

B,10

12 L2

PUSH

ВС

13

LD

HL,16384

14

LD

ВС,6144

15 L1

LD

A, R

16

AND

(HL)

17

LD

(HL),A

18

INC

HL

19

DEC

ВС

20

LD

А,В

21

OR

С

22

JR

NZ, LI

23

POP

ВС

24

DJNZ

L2

25

RET

Длина блока кодов 36 байт (со строками 4-10):

С350: 21 00 58 54 5D 13 01 FF :50

С358: 02 36 07 ED ВО 06 OA С5 :СС

С360: 21 00 40 01 00 18 ED 5F :Е9

С368: А6 77 23 0В 78 В1 20 F6 :В5

С370: С1 10 ЕС С9 00 00 00 00 :В9

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

1 ; (С) CONDOR SOFT, 1995.

2 ORG 50000

3 ENT $

4 LD HL,#4000

5 LD DE,#5800

6 LD ВС,#0300

7 LDIR

8 LD В,255

9 L5 PUSH ВС

10 LD C,B

11 LD A,21

ЭТЮДЫ

12

L1

OUT

(254), A

13

DJNZ

LI

14

LD

B,C

15

LD

A,5

16

L2

OUT

(254) ,A

17

DJNZ

L2

18

POP

BC

19

LD

HL,22528

20

LD

DE,768

21

М

LD

A,(HL)

22

CP

45

23

JR

Z,L3

24

DEC

(HL)

25

L3

INC

HL

26

DEC

DE

27

LD

A,D

28

OR

E

29

JR

NZ,L4

30

DJNZ

L5

31

RET

Длина блока кодов 50 байт:

С350: 21 00 40 11 00 58 01 00 :DE

С358: 03 ED ВО 06 FF С5 48 ЗЕ :0В

С360: 15 D3 FE 10 FC 41 ЗЕ 05 :99

С368: D3 FE 10 FC С1 21 00 58 :42

С370: 11 00 03 7Е FE 2D 28 01 :19

С378: 35 23 IB 7А ВЗ 20 F4 10 :FF

С380: DC С9 00 00 00 00 00 00 :Е8

Для черного цвета (вместо голубого) надо сделать следующие изменения:

11 LD А,16

15 LD А,0

22 CP 7

Следующая программа тоже предназначена для гашения экрана. Процесс каждый раз будет происходить по-разному за счет программной переменной, значение которой каждый раз меняется.

Листинг приводится с непринципиальными изменениями (раскрыта подпрограмма, что позволило сделать модуль релоцируемым).

ЭТЮДЫ

i ; (c)

CONDOR SOFT,

2

ORG 50000

3

ENT $

4

LD C,#7F

5 LI

PUSH HL

6

LD HL,(L6)

7

LD A,H

8

AND #1F

9

LD

H, A

10

LD

A,(HL)

11

INC

HL

12

ADD

A,(HL)

13

INC

HL

14

XOR

(HL)

15

INC

HL

16

LD

(L6),HL

17

POP

HL

18

OR

1

19

LD

E, A

20 L2

SUB

3

21

JR

Z,L1

22

JR

NC,L2

23 L3

LD

HL,#4000

24

LD

B,E

25

LD

D, 0

26 L4

LD

A,(HL)

27

AND

С

28

LD

(HL),A

29

RRC

С

30

ADD

HL,DE

31

LD

A,H

32

CP

#5B

33

JR

C,L4

34

LD

H, #40

35

DJNZ

L4

36

RRC

С

37

RRC

С

38

RRC

С

39

JR

С, L3

40

RET

41 L6

DEFS

2

Длина

блока

КОДОВ

61

байт:

С350:

7F

Е5

СЗ

Еб

: 5F

С358:

IF

67

23

86

23

АЕ

23

: ВС

С360:

22

СЗ

Е1

F6

01

5F

D6

: АО

С368:

03

28

Е7

30

FA

21

00

40

: С8

С370:

43

16

00

А1

77

СВ

09

: F6

С378:

19

FE

38

F5

26

40

: ВС

С380:

10

F1

СВ

09

СВ

09

СВ

09

: СО

С388:

38

ЕЗ

С9

00

00

00

00

00

: 2F

Следует добавить пару слов об этом эффекте. При использовании его для стирания экрана-заставки, он может быть, и не произведет на Вас впечатления. Однако поверьте, картина совершенно меняется, если Вы используете предложенную процедуру для текста! Попробуйте сами, и Вы все поймете. Одним словом, этот небольшой эффект украсит любую адвентюру или инструкцию к программе - там, где происходит вывод текста на экран.

ЭТЮДЫ

А теперь

предлагаем программу

41

LD

L, А

для вывода коротких текстовых со

42

LD

Н,0

общений .

43

ADD

HL,HL

44

ADD

HL,HL

(С) А.В.Захваткин

Удмуртия,1995.

45

ADD

HL,HL

46

EX

DE,HL

Программа

рассчитана для печа-

47

LD

HL,(23606)

ти на экране, но слово "печать"

48

ADD

HL,DE

здесь не совсем уместно, так как

49

LD

A,(HL)

эта программа во всех позициях

50

POP

HL

печати (знакоместах) сдвигает

51

LD

(HL),A

изображение

на 1 пиксел вверх, а

52

INC

HL

на освободившееся

место печатает

53

DJNZ

L4

следующую пиксельную линию (всего

54

POP

HL

сообщения).

В общем, получается

55

LD

HL,(23606)

как на счетчике,

когда "девятки"

56

INC

HL

сменяются на

"нули".

57

LD

(23606),HL

58

POP

DE

1

ORG

50000

59

POP

ВС

2

ENT

$

60

POP

HL

3

LD

HL,TEXT

61

4

LD

E,END_TX-TEXT

62

HALT

5

EI

63

DJNZ

SCR

6

LD

В,8

64

LD

HL,(23606)

7 ;-----

65

LD

DE, 8

8 SCR

PUSH

HL

66

SBC

HL,DE

9

PUSH

ВС

67

LD

(23606),HL

10

LD

С, E

68

RET

11

LD

HL,(23684)

69

TEXT

DEFM

"DEMO-Printing"

12 L2

PUSH

HL

70

END ТХ DEFS

0

13

LD

В,7

14 L3

INC

H

Ha

входе

в процедуру задаются:

15

LD

A,(HL)

в регистре

HL -

адрес начала

16

DEC

H

текстового сообщения в памяти;

в

17

LD

(HL),A

регистре

Е -

- длина сообщения.

18

INC

H

Место

печати на экране опреде-

19

DJNZ

L3

ляется текущим значением AT (бе

20

POP

HL

рется

из систенной переменной

21

INC

HL

DF_CC

(23684). После отработки

22

DEC

С

процедуры эта величина не изменя

23

JR

NZ ,L2

ется j

то

есть позиция печати ос-

24

POP

ВС

тается той же, что была до вызова

25

POP

HL

процедуры.

26 ;------

Длина

блока кодов 104 байта:

27 ART

PUSH

HL

28

PUSH

ВС

С350

21

АВ

СЗ IE

0D FB 06 08

D6

29

PUSH

DE

С358

Е5

С5

4В 2А

84 5C E5 06

05

30

LD

B,E

С360

07

24

7Е 25

77 24 10 F9

95

31

PUSH

HL

С368

Е1

23

0D 20

F1 CI El E5

D4

32

LD

HL,(23684)

С370

С5

D5

43 Е5

2A 84 5C 3E

3D

33

LD

A,7

С378

07

84

67 ЕЗ

7E 23 ЕЗ E5

79

34

ADD

A,H

С380

6F

26

00 29

29 29 ЕВ 2A

68

35

LD

H, A

С388

36

19 7Е

El 77 23 10

FF

36 L4

EX

(SP),HL

С390

ЕА

Е1

2А 36

5C 23 22 36

55

37

LD

A,(HL)

С398

D1

CI Е1

76 10 B9 2A

93

38

INC

HL

C3A0

36

11 08

00 ED 52 22

6F

39

EX

(SP),HL

СЗА8

36

С9 44

45 4D 4F 2D

18

40

PUSH

HL

СЗВО

50

72

69 6Е

74 69 6E 67

BE

ЭТЮДЫ

Теперь порадуем обладателей музыкального сопроцессора.

21 60 48 20 F5 С9 19 С6 04 Е5 11 F1 С9 ED 52 CD FE 00 28 36 00 С9

F5 CD 01 FD 08 ED C5 CD 00 A7 04 11 9B EA 04 36 00 00

: 53 : 77 :A2 :C1 :5B : 96 :B4 :B0 : 0D

ЕА60: ЕА68: ЕА70: ЕА78: ЕА80: ЕА88: ЕА90: ЕА98: ЕААО:

5F 06 El

(С) Александр Соловьев,

г.Андреаполь,

20 06

1995.

Элементом оформления музыкальных заставок, в которых используется музыка для музыкального сопроцессора, может являться индикатор амплитуды каналов, который я и предлагаю Вашему вниманию.

ЗЕ 03 3D 6Е EA F1 FF 16 00 79 ED 78 8D EA С1 ED 52 10 00 02 А7 10 F5 С9 7Е 3D С9

Сохраните блок кодов: SAVE "music"CODE 60000,70 Если при помощи SOUND TRACKER

1

ORG

60000

скомпилировать музыку под адрес

2

; (С) ORIONSOFT 1995.

49152 (пусть имя блока имя будет

3

ENT

$

"SONG"), то продемонстрирует ра

4

LD

A, 3

боту индикатора Бейсик-программа

5

MAIN

DEC

A

(автостарт со 2 строки):

6

LD

HL,18528

7

PUSH

AF

1 GO ТО 10

8

CALL

START

2 BORDER 0: PAPER 0: INK 7: С

9

POP

AF

LEAR 49151: RANDOMIZE USR 15619:

10

JR

NZ,MAIN

REM : LOAD "music"CODE 60000

11

RET

3 RANDOMIZE USR 15619: REM :

12

START

LD

BC,65533

LOAD "SONG"CODE 49152

13

LD

D, 0

10 RANDOMIZE USR 49152

14

LD

E,A

20 RANDOMIZE USR 49158: RANDOM

15

ADD

HL,DE

IZE USR 60000: PAUSE 1: IF INKEY

16

ADD

A,8

$="" THEN GO TO 20

17

OUT

(C),A

30 RANDOMIZE USR 49152

18

IN

A,(C)

19

LD

B, 4

В заключение, ответы на "за

20

LABEL2

PUSH

HL

гадки" для начинающих, заданные в

21

PUSH

BC

предыдущем выпуске ЭТЮДОВ

22

CALL

Ml

(см.ZX-РЕВЮ-95, N4, стр.47).

23

POP

BC

1. Кнопка "MAGIC" активно ра

24

POP

HL

ботает со стеком, а занести зна

25

LD

DE, 32

чения стека в ПЗУ невозможно, по

26

AND

A

этому работа программы MAGIC на

27

SBC

HL,DE

рушается, что приводит к сбросу.

28

DJNZ

LABEL2

2. Приведенный блок кодов, в

29

RET

принципе, не имеет смысла. Прог

30

Ml

LD

B, 4

рамма "крутится" на одном месте

31

LABELl

LD

DE,512

вокруг метки L1. А во время пре

32

AND

A

рывания происходит переход на

33

SBC

HL,DE

"пустую" подпрограмму PROG, тоже

34

CALL

CP1

ничего не выполняющую. В резуль

35

DJNZ

LABELl

тате имеем просто зависший компь

36

RET

ютер. А убедиться в том, что об

37

CP1

CP

0

работка прерываний все-таки идет,

38

JR

Z ,CP2

можно так:

39

LD

(HL),126

40

DEC

A

PROG LD HL,#100

41

RET

LD DE,#10

42

CP 2

LD

(HL),0

CALL #03B5 ; BEEPER

43

RET

RET

Длина блока кодов 70 байт:




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Наш смак - Сегодня я научу вас готовить салат из консеpвиpованной pыбы.
Video - "Титаник".
News games - Алгоритм прохождения игры UFO-2 v2.10 Дьяволы бездны от COPPER FEET.
Юмор - Объявления.
Проекты - обзор готовящихся проектов: игра "Угадай Мелодию", новый клон Спектрума, журнал Deja Vu #A, новая ОС для Спектрума - Doors 2002 Aqua.

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