ZX-Ревю 1993 №1-2 1992 г.

Маленькие хитрости - программа "ТЕНЕВОЙ КОНТУР".


МАЛЕНЬКИЕ ХИТРОСТИ

ПРОГРАММА "ТЕНЕВОЙ КОНТУР"

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

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

Можно даже заготовить "плоскую" картинку при помощи графического редактора. В общем, представим, что имеется изображение, полученное любым способом. Затем, вызывая приведенную ниже программу в кодах, выполняется теневое оконтуривание этого изображения, причем весь экран может быть обработан за один прием, а можно вызывать кодовую программу несколько раз, выполняя оконтуривание в несколько приемов.

Критерием, определяющим то, что надо оконтуривать, а что не надо, является повышенная яркость (BRIGHT 1). Все, что на экране нарисовано с повышенной яркостью, будет оконтурено при вызове блока в машинных кодах. Как это эффективнее всего использовать в программах придумайте сами. Дело за Вашей фантазией. Мы же предлагаем программу в машинных кодах под названием "Теневой контур". Ее БЕЙСИК-загрузчик приведен в Листинге_1, а машинный код с комментариями - в Листинге_2.

ВВВВВВВВВВ^ ВВВВВВВВВВ

ВВВЛШШ!ВВВ|

ввв ввв ввв ввв!

вввввв! В В В Е

ВВВВВВ В В В Е

ВВВВВВ:;:: ВВВЕ

вввввв! ВВВЕ ■^^BBBl ВВВЙ

ввв ввв| ввв! ввв|

ВВВВВВВВВВ!

вввввввввв!

Листинг_1

10 FOR i = 1 TO 211 20 READ a

30 POKE 63999+i, a 40 NEXT i

50 DATA

243,

253,

229,

253,

33

60 DATA

255,

90,

6,

24,

197

70 DATA

6,

32,

197,

253,

126

80 DATA

0,

254,

64,

56,

15

90 DATA

253,

126,

1,

254,

64

100 DATA

220,

82,

250,

253,

126

110 DATA

32,

254,

64,

56,

93

120 DATA

253,

43,

193,

16,

228

130 DATA

193,

16,

222,

253

140 DATA

225,

251,

201,

122,

230

150 DATA

3,

7,

7,

7,

246

160 DATA

64,

103,

107,

201,

36

170 DATA

124,

230,

7,

192,

124

180

DATA

214,

8,

103,

125,

198

190

DATA

32,

111,

208,

124,

198

200

DATA

8,

103,

238,

88,

192

210

DATA

38,

0,

201,

120,

254

220

DATA

32,

200,

253,

229,

209

230

DATA

19,

205,

47,

250,

221

240

DATA

33,

191,

250,

6,

8

250

DATA

62,

64,

253,

190,

33

260

DATA

56,

9,

6,

10,

253

270

DATA

190,

32,

48,

2,

6

280

DATA

12,

221,

126,

0,

182

290

DATA

119,

221,

35,

205,

58

300

DATA

250,

16,

244,

201,

225

310

DATA

241,

245,

229,

254,

24

320

DATA

210,

35,

250,

253,

229

330

DATA

209,

235,

1,

32,

0

340

DATA

9,

235,

14,

2,

221

350

DATA

33,

203,

250,

205,

47

360

DATA

250,

6,

4,

221,

126

370

DATA

0,

182,

119,

221,

35

380

DATA

205,

58,

250,

16,

244

390

DATA

253,

126,

33,

254,

64

400

DATA

210,

35,

250,

241,

245

410

DATA

254,

32,

210,

35,

250

420

DATA

19,

13,

32,

220,

195

430

DATA

35,

250

500

DATA

0,

0,

128,

64,

160

510

DATA

80,

160,

80,

160,

80

520

DATA

160,

80

600

DATA

42,

21,

10,

5,

128

610

DATA

64,

160,

80

Для демонстрации действия блока машинных кодов надо набрать Бейсик-программу, приведенную ниже. Программа имеет автостарт со строки 2, где происходит загрузка необходимых кодов. Сам блок "теневой контур" надо оформить в виде файла "ten" CODE 64000,211. Кроме того, программа русифицирована по методике, приведенной в ZX-РЕВЮ-92 N1,2. стр.31. Русско-латинский символьный набор загружается в виде файла "chr" CODE 64600,768.

ЛИСТИНГ_2

Последний байт файла атрибутов. Организация цикла для 22 строк. Организация цикла для 32 колонок. Наличие BRIGHT 1 в текущем знакоместе. Если нет, то переход на PASS.

Крайнее ли это знакоместо с BRIGHT 1. Если да, то выполнение вертикального оконтуривания - VERT. Если под текущим знакоместом не BRIGHT 1, то выполнение горизонтального оконтуривания HORIZ Финишная процедура, если

FA00 FA01 FA03

FA07 FA09 FA0A FA0C FA0D FA10 FA12

FA14 FA17 FA19

F3

FDE5 FD21FF5

0616 C5

C620 C5

FD7E00

FE40

380F

FD7E01

FE40

DC52FA

DI

PUSH LD

LD

PUSH LD

PUSH LD CP JR

LD CP

CALL

IY

IY,#5AFF

B,#16 BC

B,#20 BC

A,(IY+0) #40

C,#FA23

A,(IY+1) #40

C,#FA52

LOOP LOOP 1

FA1C FA1F FA21

FD7E20

FE40

385D

A,(IY+32) #40

C,#FA80

LD CP JR

FA23 FD2B

PASS

DEC IY

FA25

C1

POP

BC

знакоместо не с BRIGHT 1

FA26

10E4

DJNZ

#FA0C

FA28

C1

POP

BC

FA29

10DE

DJNZ

#FA09

FA2B

FDE1

POP

IY

FA2D

FB

EI

FA2E

C9

RET

FA2F

7A

ADRES

LD

A,D

Эта подпрограмма выполня-

FA30

E603

AND

#03

ет расчет адреса в дисп-

FA32

07

RLCA

лейном файле по известно-

FA33

07

RLCA

му адресу в файле атрибу-

FA34

07

RLCA

тов.

FA35

F640

OR

#40

FA37

67

LD

H,A

FA38

68

LD

L,E

FA39

C9

RET

FA3A

24

OVER

INC

H

Эта подпрограмма выполня-

FA3B

7C

LD

A,H

ет операции, связанные с

FA3C

E607

AND

#07

наложением оконтуривающе-

FA3E

C0

RET

NZ

го изображения на тот ри-

FA3F

7C

LD

A,H

сунок, который имеется на

FA40

D608

SUB

#08

экране.

FA42

67

LD

H,A

FA43

7D

LD

A,L

FA44

C620

ADD

A,#20

FA46

6F

LD

L,A

FA47

D0

RET

NC

FA48

7C

LD

A,H

FA49

0606

ADD

A,#08

FA4B

67

LD

H,A

FA4C

EE58

XOR

#58

FA4E

C0

RET

NZ

FA4F

2600

LD

H,#00

FA51

C9

RET

FA52

78

VERT

LD

A,B

Не последняя ли это коло

FA53

FE20

CP

#20

нка, если да, то возврат,

FA55

C8

RET

Z

т.к. негде оконтуривать.

FA56

FBE5

PUSH

IY

FA58

D1

POP

DE

FA59

13

INC

DE

FA5A

CD2FFA

CALL

#FA2F

FA5D

DD21BFFA

LD

IX,#FABF

Базовый адрес таблицы

для построения оконтури-

вающего рисунка.

FA61

0608

LD

B,#08

FA63

3E40

LD

A,#40

FA65

FDBE21

CP

(IY+33)

Если знакоместо не угло-

FA68

3809

JR

C,#FA73

вое, то переход на LOOP_2

FA6A

060A

LD

A,#0A

если угловое, то оконту-

FA6C

FDBE20

CP

(IY+32)

ривание снизу.

FA6F

3002

JR

NC,#FA73

FA71

060C

LD

B,#0C

FA73

DD7E00

LOOP_2

LD

A, (IX+0)

Проверка необходимости

FA76

B6

OR

(HL)

выполнения наложения

FA77

77

LD

(HL),A

на имеющееся на экране

FA78

DD23

INC

IX

изображение.

FA7A

CD3AFA

CALL

#FA3A

Выполнение наложения.

FA7D

10F4

DJNZ

#FA73

FA7F

C9

RET

FA80

E1

HORIZ

POP

HL

FA81

F1

POP

AF

FA82

F5

PUSH

AF

FA83

E5

PUSH

HL

FA84

FE18

CP

#18

Не последняя ли строка.

FA86

D223FA

JP

NC,#FA23

Если да, то негде окон-

туривать и переход на

PASS.

FA89

FDE5

PUSH

IY

FA8B

D1

POP

DE

FA8C

EB

EX

DE,HL

FA8D

012000

LD

BC,#0020

FA90

09

ADD

HL,BC

FA91

EB

EX

DE,HL

FA92

0E02

LD

C,#02

FA94

DD21CBFA

LD

IX,#FACB

Базовый адрес в таблице

определяющей оконтурива

ющий рисунок.

FA98

CD2FFA

CALL

#FA2F

FA9B

0604

LD

B,#04

FA9D

DD7E00

LD

A,(IX+0)

Проверка необходимости

FAA0

B6

OR

(HL)

выполнения наложения

FAA1

77

LD

(HL),A

на имеющееся на экране

FAA2

DD23

INC

IX

Изображение.

FAA4

CD3AFA

CALL

#FA3A

Выполнение наложения.

FAA7

10F4

DJNZ

#FA9D

FAA9

FD7E21

LD

A,(IY+33)

FAAC

FE40

CP

#40

FAAE

D223FA

JP

NC,#FA23

FAB1

F1

POP

AF

FAB2

F5

PUSH

AF

FAB3

FE20

CP

#20

FAB5

D223FA

JP

NC,#FA23

FAB8

13

INC

DE

FAB9

0D

DEC

C

FABA

20DC

JR

NZ,#FA98

FABC

C323FA

JP

#FA23

FABF

000080

PICTURE

DEFB

#00,#00,#80

Базовая таблица, по ко-

FAC2

40A050

DEFB

#40,#A0,#50

торой строится оконтури

FAC5

A050AO

DEFB

#A0,#50,#A0

вающий рисунок.

FAC8

50A050

DEFB

#50,#A0,#50

FACB

2A150A

DEFB

#2A,#15,#0A

FACE

058040

DEFB

#05,#80,#40

FAD1

A050

DEFB

#A0,#50

1 GO

TO 100

2 CLEAR 63999:

LOAD "ten"

CODE 64000

3 LOAD "chr" CODE 64600

4 POKE 23606,88: POKE 23607,251: REM RUS 100 BORDER 1: PAPER 1: INK 7: BRIGHT 0: CLS 200 BRIGHT 1

300 LET A$="B"

1000 FOR Y=8 TO 12: FOR N=0 TO 15: PRINT AT Y, 1+N;A$;: NEXT N: NEXT Y

1010 FOR Y=3 TO 17: FOR N=0 TO 9: PRINT AT Y, 4+N;A$: NEXT N: NEXT Y

1020 FOR Y=5 TO 15: PRINT BRIGHT 0;AT Y,7;" ":NEXT Y

1030 PRINT BRIGHT 0;AT 10,3;" "

2000 FOR N=5 TO 15: PRINT AT N, 18;" ": NEXT N

2010 PRINT AT 8, 20; "ПРОГРАММА"

2020 PRINT AT 9, 20; "ДЕМОНСТРИ-"

2030 PRINT AT 10, 22; "РУЮЩАЯ"

2040 PRINT AT 12, 20; ......ТЕНЕВОЙ"

2050 PRINT AT 13, 23; "КОНТУР......

2100 PAUSE 50: PLOT 145,48: DRAW 0,86: DRAW 102,0 3000 PAUSE 50: RANDOMIZE USR 64000 4000 BRIGHT 0

После старта программы со строки 2, загрузки кодовых блоков и включения русского символьного набора, происходит формирование изображения на экране, которое в дальнейшем будет оконтурено. Для этого перед подачей команд PRINT происходит включение режима повышенной яркости BRIGHT 1 (строка 200). Обратите взимание, что отверстие в левой фигуре, состоящей из букв "В", прорисовывается в режиме BRIGHT 0. В правой части экрана получен прямоугольник, подлежащий оконтуриванию. Это выполняется печатью нескольких строк пробелов в режиме BRIGHT 1 (строка 2000), а текст впечатывается уже потом. Для завершенности фигуры этот прямоугольник слева и сверху замкнут прорисовкой прямых линий (строка 2100), так как оконтуривание производится только справа и снизу.

Если оконтуривание должно быть выполнено поверх символов, напечатанных на экране и имеющих BRIGHT 0, то происходит наложение оконтуривающего фона на имеющееся изображение, это можно наблюдать, если добавить в программу строку:

150 FOR N=1 TO 32*22: PRINT "+"; : NЕХТ N

Итак, дело за Вашей фантазией, уважаемые читатели!




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Рассказ - Ну, юзер, погоди! (продолжение).
Список BBS - ZX-Net 095.
MY CITY - Пeрeвaлкa. Это тaкой интeрeсный рaён, дa кaк интeрeсный - ничё особeного.
Война - Контроль над "информационной войной" завтрашнего дня
NEOS - Описание новой Операционной системы для Спектрума.

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