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

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


ЭТЮДЫ

С интересным предложением обратился к нам А.А.Иванов из г. Печора (республика Коми). Цитируем дословно. Уверены, что это предложение поддержат все наши читатели.

© А. А. Иванов, г. Печора, 1994г.

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

Общеизвестно, что существуют мастера игры в шахматы, но существуют и мастера шахматных этюдов.

Конечно, у Вас есть и "Маленькие хитрости", и "Форум", и "Читатель читателю", и это очень интересные разделы, но. Но! Одну и ту же проблему можно решить разными путями. Это может быть скучный путь следования классическим (но проверенным) путем программирования и это может быть (пусть не всегда удачный), путь отыскания собственного решения.

В "Этюдах" мы могли бы делиться друг с другом своими "перлами" и "алмазами" в области совершенствования приемов и методов программирования.

Можно устраивать конкурсы (с призами!) в решении тех или иных задач.

Эти задачи Вы можете давать сами, в своих целях.

Эти задачи могут объявлять и читатели, в своих целях.

Итогами конкурсов могли бы пользоваться все, в своих целях.

И ещё. Писать умеет огромное количество людей на Планете, однако многие ли могут похвастаться тем, что написали что-нибудь вроде "Войны и Мира".

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

Чтобы не быть голословным, хочу предложить разработанные мной (до Ваших публикаций) различные

методы расчета адресов в области экрана (для "Спектрума").

Процедура расчета адреса знакоместа самая быстрая и короткая.

7B

LD

A, E

E 6 18

AND

18H

C6 40

ADD

A, 40H

67

LD

H, A -

H сформирован

7B

LD

A, E

E6 07

AND

7

0F

RRCA

0F

RRCA

0F

RRCA

82

ADD

A, D

6F

LD

L,A -

L сформирован

На входе: E - номер строки, D

- номер столбца.

На выходе: DE -

без изменения; HL - адрес верхнего байта в знакоместе;

Если нужен адрес другого байта в том же знакоместе, то следует ADD A,40H заменить на ADD A,40H+n где

n=0-7. Процедура занимает 14 байт.

Другая процедура, использующая только HL и A.

7D

LD

A, L

E6 07

AND

7

0F

RRCA

0F

RRCA

0F

84

RRCA ADD

A, H

65

LD

H, L

6F

LD

L,A -

L сформирован

7C

LD

A, H

E6 18

AND

18H

F6 40

OR

40H

67

LD

H, A -

H сформирован

На входе: L - строка, H столбец.

На выходе: HL -

адрес верхнего байта в знакоместе.

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

они короче и быстрее данных Вами, а это очень существенно для больших циклов.

У меня есть еще процедуры определения адреса байта атрибутов по адресу байта знакоместа; своя процедура

(короче

и быстрее) рисования точки; процедура рисования линии, отличающаяся от Вашей; своя процедура печати

всех символов и т.д.

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

* * *

Развивая плодотворную этюдную идею, мы не можем не привести несколько этюдов, присланных нам другим корреспондентом.

© В.Акопов, г. Ужур, 1994г.

Свои первые успехи в машинных кодах я сделал, когда прочитал в ZX-РЕВЮ "40 Лучших Процедур". Мне 15 лет и я мечтаю стать программистом. Предлагаю на суд читателей несколько собственных этюдов. Они перемещаемы и потому адреса не указаны.

Программа "ЗАТУХАНИЕ".

Эта программа была написана под впечатлением от работы с языком "MEGA-BASIC", в частности, с функцией FADE_0. Программа исполняет постепенное гашение экрана, манипулируя с атрибутами.

F3

DI

010000

LD

BC,#0000

165B

LD

D, #5B

210058

AGAIN

LD

HL,#5800

7E

NEXT_A

LD

A,(HL)

B9

CP

C

2801

JR

Z,NEXT_B

35

DEC

(HL)

23

NEXT_B

INC

HL

7C

LD

A, H

BA

CP

D

20F6

JR

NZ,NEXT_A

10F1

DJNZ

AGAIN

FB

EI

C9

RET

Программа "KODEK".

Программа "КОДЕК" (КОдер-ДЕКодер) при первом вызове кодирует блок кодов с помощью "ключа", а при повторном - декодирует. "Ключом" является произвольная последовательность символов любой длины. Маркером конца "ключа" служит байт с включенным седьмым битом. В начале программы в HL задается начальный адрес блока кодов, подлежащего кодированию или декодированию; в ВС - длина кодируемого блока кодов; а в DE - начальный

адрес "ключа".

210000

LD

HL,START

010000

LD

BC,LENGTH

110000

NEXT

_A

LD

DE,KEY-ADR

1A

NEXT

_B

LD

A,(DE)

AE

XOR

(HL)

77

LD

(HL),A

23

INC

HL

0B

DEC

BC

78

LD

A, B

B1

OR

C

C8

RET

Z

13

INC

DE

1A

LD

A,(DE)

CB7F

BIT

7,A

28F2

JR

Z,NEXT_B

18ED

JR

NEXT_A

ПЕЧАТЬ СИМВОЛОВ ДВОЙНОЙ ВЫСОТЫ

Эта программа является машиннокодовым вариантом программы, опубликованной в одном из выпусков журнала "Радиолюбитель" за 1992 г. Она быстро распечатывает сообщение из 32-х (максимум) знаков в заданных координатах с двойной высотой.

Для работы программы предварительно необходимо занести данные в ячейки памяти, начиная с 5В00Н (23296). Это можно сделать при помощи POKE из Бейсика.

23296 - координата Y (от 0 до 21).

23297 - координата X (от 0 до 31).

23298 - длина текста (от 1 до 32).

23299 - начальный адрес текста.

ED5B005B LD DE, (#5B00)

7B LD A,E

E618 AND #18

F640 OR #40

67 LD H,A

7B LD A,E

E607

AND

#07

B7

OR

A

1F

RRA

1F

RRA

1F

RRA

1F

RRA

82

ADD

A, D

6F

LD

L,A

2B

DEC

HL

22005B

LD

(#5B00),HL

3A025B

LD

A,(#5B02)

47

LD

B, A

0E01

LD

C, #01

C5

N_

_LETTER

PUSH

BC

DD2A005B

LD

IX, (#5B00)

DD23

INC

IX

DD22005B

LD

(#5B00),IX

1600

LD

D, #00

59

LD

E, C

21025B

LD

HL,#5B02

19

ADD

HL, DE

7E

LD

A,(HL)

2600

LD

H, #00

6F

LD

L,A

29

ADD

HL, HL

29

ADD

HL, HL

29

ADD

HL, HL

54

LD

D, H

5D

LD

E, L

2A365C

LD

HL, (#5C36)

19

ADD

HL, DE

DDE5

PUSH

IX

D1

POP

DE

0604

LD

B, #04

7E

N_

LINE1

LD

A,(HL)

12

LD

(DE),A

14

INC

D

12

LD

(DE),A

14

INC

D

23

INC

HL

10F8

DJNZ

N_LINE1

112000

LD

DE,#0020

DD19

ADD

IX, DE

DDE5

PUSH

IX

D1

POP

DE

0604

N_

LINE2

LD

B, #04

7E

LD

A,(HL)

12

LD

(DE),A

14

INC

D

12

LD

(DE),A

14

INC

D

23

INC

HL

10F8

DJNZ

N_LINE2

C1

POP

BC

0C

INC

C

10BE

DJNZ

N_LETTER

C9

RET

1 CLEAR 5 9999

5 LOAD "screen" CODE 16384 10 FOR x=60000 TO 60031

2 0 READ a: POKE x,a: NEXT x

30 DATA 6,6,197,33,255,87,14,32,167,0,203,38,0,203,6,0 40 DATA 203,38,0,43,13,32,242,62,63,188,32,234,193,16,227,201 50 PAUSE 0: RANDOMIZE USR 60000

Приводим дисассемблер блока кодов, формируемого программой.

EA60

0606

LD

b, #06

EA62

C5

PUSH

BC

EA63

21FF57

LD

HL,#57FF

EA66

0E20

LD

C, #20

EA68

A7

AND

A

EA69

00

NOP

EA6A

CB2 6

SLA

(HL)

EA6C

00

NOP

EA6D

CB06

RLC

(HL)

EA6F

00

NOP

EA7 0

CB2 6

SLA

(HL)

EA72

00

NOP

EA7 3

2B

DEC

HL

EA7 4

0D

DEC

C

EA7 5

20F2

JR

NZ,#EA69

EA7 7

3E3F

LD

A, #3F

EA7 9

BC

CP

H

EA7A

2 0EA

JR

NZ,#EA66

EA7C

C1

POP

BC

EA7D

10E3

DJNZ

#EA62

EA7F

C9

RET

Вторая программа называется "ВОТ ТАК!". Она попала к нашему корреспонденту от неизвестного автора. Приводим её также с непринципиальными изменениями.

ВОТ ТАК!

1 BORDER 0: PAPER 0: INK 0: CLEAR 4 9999 5 LOAD "screen"CODE 16384 10 FOR f=50000 TO 50051 20 READ a: POKE f,a 30 NEXT f

4 0 DATA 62,1,167,8,6,9,17,0,24 50 DATA 33,56,223,43,27,122,179 60 DATA 40,19,203,242,8,23,23 70 DATA 23,23,245,166,235,182 80 DATA 235,18,241,8,203,178,24 DATA 231,16,223,201,17,56 DATA 199,33,0,64,1,0,24,237

90 100 110 120 130 140

DATA 17 6,201 RANDOMIZE USR 50040 INK 7: CLS : PAUSE 0 RANDOMIZE USR 50000

В строке 5, как и в предыдущей программе, для наглядности загружается любая картинка-экран. В строке 120 содержимое дисплейного файла перебрасывается в буфер, затем экран очищается. После нажатия на любую клавишу происходит интересный эффект. Для тех, кто заинтересовался им, приводим дисассемблер формируемого программой

блока кодов.

C350

3E01

LD

A, #01

C352

A7

AND

A

C353

08

EX

AF,AF'

C354

0609

LD

B, #09

C356

110018

LD

DE,#1800

C359

2138DF

LD

HL,#DF38

C35C

2B

DEC

HL

C35D

1B

DEC

DE

C35E

7A

LD

A, D

C35F

B3

OR

E

C360

2813

JR

Z,#C37 5

C362

CBF2

SET

6, D

C364

08

C3 65

17

C366

17

C367

17

C3 68

17

C369

F5

C3 6A

A6

C36B

EB

C36C

B6

C36D

EB

C36E

12

C36F

F1

C37 0

08

C371

CBB2

C373

18E7

C375

10DF

C377

C9

EX

AF,AF'

RLA

RLA

RLA

RLA

PUSH

AF

AND

(HL)

EX

DE, HL

OR

(HL)

EX

DE, HL

LD

(DE),A

POP

AF

EX

AF,AF'

RES

6, D

JR

#C35C

DJNZ

#C356

RET

C378 1138C7

LD

DE,#C738

C37B 210040

LD

HL,#4000

C37E 010018

LD

BC,#1800

C381 EDB0

LDIR

C383 C9

RET

* * *

Прочитав в

первом номере ZX-РЕВЮ "Бегущую строку" М. Титова,

придумал другую подобную программу и предлагает её нашим читателям.

Строками 16, 76 и 77 можно изменить скорость исполнения программы.

© Лесняк В.А., Северодвинск,1994.

TITRE

1

CALL

INIT

2 LOOP

CALL

TITRE

3

LD

A, #7F

4

IN

A,(#FE)

5

RR

A

6

JR

C,LOOP

7

RET

8 INIT

LD

HL,TEXT

9

LD

(STARTLET),HL

10

LD

(COUNTLET),HL

11

XOR

A

12

LD

(LINEINCHAR),A

13

RET

14 TITRE

DI

15

CALL

SCROLL

16

CALL

SCROLL ; можно удалить

17

LD

HL,(COUNTLET)

18

LD

IX,BUFFER

19

LD

A,(HL)

20

CP

0

21

JR

NZ, LABEL1

22

LD

HL,(STARTLET)

23

LD

(COUNTLET),HL

24 LABEL1

LD

B,16

25 LOOP3

PUSH

BC

26

PUSH

HL

27

LD

L,(HL)

28

LD

H, 0

29

ADD

HL, HL

30

ADD

HL, HL

31

ADD

HL, HL

32

LD

A,(LINEINCHAR)

33

LD

C,A

34

LD

B, 0

35

ADD

HL, BC

36 LD BC,(#5C36)

37 ADD HL, BC

38 LD A, (HL)

39 POP HL

40 LD BC,#0402

41 LOOP2 PUSH BC

42 LOOP1 RLA

43 PUSH AF

44 RL (IX+0)

45 POP AF

46 RL (IX+0)

47 DJNZ LOOP1

48 INC IX

49 POP BC

50 DEC C

51 JR NZ,LOOP2

52 POP BC

53 INC HL

54 DJNZ LOOP3

55 LD DE,#56E0

5 6 LD HL,BUFFER

57 LD BC,32

58 LDIR

59 LD DE,#55E0

60 LD HL,BUFFER

61 LD BC,32

62 LDIR

63 LD A, (LINEINCHAR)

64 INC A

65 CP 08

66 JR NZ,LABEL2

67 LD BC,16

68 LD HL,(COUNTLET)

69 ADD HL, BC

70 LD (COUNTLET),HL

71 XOR A

72 LABEL2 LD (LINEINCHAR),A

73 EI

74 RET

75 SCROLL LD HL,#4000

76 LD DE,#4100 ; При удалении строки 16, здесь надо

77 LD C,191 ;поставить LD DE,#4200 и LD C,190.

78 L4 PUSH HL

79 PUSH DE

80 LD B,32

81 L1 LD A, (DE)

82 LD (HL),A

83 INC HL

84 INC DE

85 DJNZ L1

86 POP DE

87 POP HL

88 INC D

8 9 LD A, D

90 AND 07

91 JR NZ,L2

92 LD A, E

93 ADD A,32

94 LD E,A

95 JR C,L2

96 LD A, D

97 SUB 08

98 LD D,A

99 L2 INC H

100

LD

101

AND

102

JR

103

LD

104

ADD

105

LD

106

JR

107

LD

108

SUB

109

LD

110

L3

DEC

111

JR

112

RET

113

STARTLET

DEFW

114

COUNTLET

DEFW

115

LINEINCHAR

DEFB

116

BUFFER

DEFS

117

TEXT

DEFM

118

DEFM

119

DEFM

120

DEFM

121

DEFM

122

DEFM

123

DEFM

124

NOP

A, H

07

NZ, L3 A, L A,32 L,A

c, l3

A, H

08 H, A

C

NZ, L4

XXXX XXXX 0

32

"(C) Lesnjak V.A."

Special for ZX-REVIEW magazine 19.03.94

* * *




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Горячий привет - юмористический рассказ на компьютерную тематику "Виртуальный Театр".
News - AmoNik has measured the power consumption of IDE different devices, I am mostly occupied with NedoLang compiler
SPECCY - Хай живет Спектрум.
Анкета - Анкета от организаторов Paradox 2001.
Юмор - Тут вот небольшой прикол, насчёт писюка.

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