ZX-Forum №1 1993 г.

Обмен опытом - Генерация шаблонов 2x2 с использованием статического RND.


Генерация шаблонов 2x2 с использованием статического RND.

© Владимир Витвинов, р.п. Пышма, Свердловская область

Очень много памяти компьютера при использовании графики занимают шаблоны. К примеру, шаблон 2x2 знакоместа занимает 32 байта. Зачастую приходится для экономии памяти ограничивать количество различных шаблонов, что приводит к однообразию игровых локаций. Программисты используют различные "хитрости" для экономии памяти.

Здесь реализован один из подходов для генерации шаблонов 2x2. Принцип работы программы таков:

1. Инициализируются три переменные для RND - R1, R2, R3. Значения можете выбрать сами. После вызова предлагаемой процедуры шаблоны пойдут в строгой последовательности. Переменная, указывающая на начало UDG-графики, устанавливается на начало буфера BUFF - это для демонстрации.

2. Последовательно вызывается процедура RND, забивая 8 байтов случайными числами. Если сейчас Вы напечатаете полученный символ, то получите ерунду в виде бессистемно

разбросанных точек. "Хитрость" заключается в том, что это знакоместо слева направо зеркально копируется во второе, а затем эти два зеркально сверху вниз в следующие два. В результате получается шаблон 2x2 знакоместа вполне приемлемый для последующего использования в программах (например, для построения из них каких-нибудь объектов, лабиринтов и пр.).

В приведенной ниже программе реализована генерация 4-х видов шаблонов. Процедура построена с 5-ю точками входа: 1 - инициализация, 2 - разворачивает шаблон, как описано выше, 3 - оконтуривает его вдобавок, 4 - включает биты в виде "+", 5 - в виде "х". Последние операции придают законченность шаблону. Один раз, вызвав процедуру, можно сколько угодно печатать полученный шаблон из буфера. Вызвав её ещё раз, получите следующий по порядку и так далее. Листинг генератора шаблонов, набранный в ZEUS ASSEMBLER.

00010

ORG

40000

00020

ENT

00030

/ 1

- инициализация.

00040

LD

HL,RNEW

/Три начальных значение

00050

LD

DE, R1

/копируются в переменные

00060

LD

BC,3

/ R1, R2, R3 .

00070

LDIR

00080

LD

HL,BUFF

/Переключаем переменную UDG на

00090

LD

(23675) , HL

/начало буфера (граф. A,B,C,D /будут использ.для демонстрации

00100

RET

00110

/ 2

- разворачивание шаблона.

00120

LD

HL,BUFF

/8 байтов буфера заполняются

00130

LD

B, 8

/случайными числами

00140

L0

CALL

RND

/по статическому RND,

00150

LD

(HL),A

/что будет соответствовать

00160

INC

HL

/ "А" в графическом режиме.

00170

DJNZ

L0

00180

JR

PROD

/Переход на развертку символов.

00190

/ 3

- оконтуривание шаблона.

00200

LD

HL, BUFF

00210

LD

B, 8

/То же, но с включением

00220

LD

A, #FF

/верхних и левых пикселов.

00230

JR

L2

00240

L1

CALL

RND

00250

SET

7,A

00260

L2

LD

(HL),A

00270

INC

HL

00280

DJNZ

L1

00290

JR

PROD

00300

; 4 -

включение

битов в виде

00310

LD

HL,BUFF

00320

LD

B, 7

;То же, но с включением

00330

L3

CALL

RND

;нижних и правых пикселов.

00340

SET

0,A

00350

LD

(HL),A

00360

INC

HL

00370

DJNZ L3

00380

LD

A, #FF

00390

LD

(HL),A

00400

JR

PROD

00410

; 5 -

включение

битов в виде

"х".

00420

LD

HL,BUFF

00430

LD

B, 8

;То же, но с включением

00440

LD

C, #80

;пикселов по диагонали:

00450

L4

CALL

RND

;с верхнего левого

00460

OR

C

;к нижнему правому.

00470

RR

C

;#80=10000000 - побитовая рас-

00480

LD

(HL),A

;кладка, эту единицу мы будем

00490

INC

HL

;вращать и накладывать по OR.

00500

DJNZ

L4

00510

; Развертка полученного знакоместа.

00520

PROD

LD

HL,BUFF

;Откуда.

00530

LD

DE,BUFF+ 8

;Куда.

00540

LD

BC,#0808

^^чётчик битов, C=счетчик байтов.

00550

L5

PUSH

BC

00560

LD

A,(HL)

; Принимаем байт.

00570

L6

RRA

;Переносим 0 бит в флаг CARRY.

00580

RL

C

;Подхватываем его в регистр С.

00590

DJNZ

L6

;Разворачиваем 8 битов.

00600

LD

A, C

;Зеркальный байт перебрасываем

00610

LD

(DE) ,A

;в новое место.

00620

INC

HL

;Увеличиваем

00630

INC

DE

;указатели.

00640

POP

BC

00650

DEC

C

;Проверяем, все ли 8 байтов

00660

JR

NZ,L5

;переброшены. Символ "В" готов.

00670

LD

HL,BUFF

;Откуда.

00680

LD

DE,BUFF+23

;Куда, здесь перебрасываем

00690

LD

C, 2

;с конца, развернуть надо

00700

JUMP

LD

B,8

;два символа.

00710

L7

LD

A,(HL)

;Переброска

00720

LD

(DE) ,A

;задом-наперед.

00730

INC

HL

;Изменяем

00740

DEC

DE

;указатели.

00750

DJNZ

L7

;Все ли байты переброшены,

00760

DEC

C

;оба ли символа "C" и "D"

00770

RET

Z

;развернуты, если ДА, то выход.

00780

LD

HL,BUFF+8

;Указатели для

00790

LD

DE,BUFF+ 31

;символа "D".

00800

JR

JUMP

00810

RND

LD

A,(R1)

;Процедура взята из

00820

LD

D, A

;№ 7-8, 1993 г., стр.154.

00830

LD

A, (R2)

;Можете составить свою.

/Начальные значения для RND. /Можете

/подставить свои. /Резервируем 32 байт для буфера. Приведенная ниже BASIC-программа демонстрирует возможности процедур.

10 CLEAR 39999: LOAD "rnd" CODE 40000 20 RANDOMIZE USR 40000: LET z=40018 30 GO SUB 500: CLS 40 FOR y=0 TO 18 STEP 3 50 FOR x=0 TO 30 STEP 3 60 RANDOMIZE USR z

70 PRINT AT y,x/"AB": PRINT AT y+1,x/"CD" 80 NEXT x 90 NEXT y 100 GO TO 30

500 PAUSE 0: IF INKEY$="0" THEN STOP 510 IF INKEY$="1" THEN LET z=40018: RETURN 520 IF INKEY$="2" THEN LET z=40032: RETURN 530 IF INKEY$="3" THEN LET z=40052: RETURN 540 IF INKEY$="4" THEN LET z=40071: RETURN 550 RETURN

00840

LD

(R1),A

00850

ADD

A, D

00860

LD

D, A

00870

LD

A, (R3)

00880

LD

(R2),A

00890

ADD

A, D

00900

RLCA

/

00910

LD

(R3),A

00920

RET

00930

R1

DEFB

0

00940

R2

DEFB

0

00950

R3

DEFB

0

00960

RNEW

DEFB

5

00970

DEFB

90

00980

DEFB

37

00990

BUFF

DEFS

32

Подчёркнутые символы в строке 70 набираются в графическом регистре.

'1'

Типы шаблонов переключаются клавишами продолжить генерацию шаблонов старого типа.

Результат работы генератора шаблонов Вы можете увидеть на рисунках.

0" - стоп, остальные клавиши

Для тех, кто не владеет (пока) ассемблером ZEUS, приводим шестнадцатеричный дамп (с контрольными суммами) кодового блока программы. Нули в последних адресах дампа - это зарезервированный 32-байтный буфер для работы программы.

Дамп файла "rnd"CODE 40000

,200.

9C40

21

E5

9C

11

E2

9C

01

03

11

9C48

00

ED

B0

21

E8

9C

22

7B

C3

9C50

5C

C9

21

E8

9C

06

08

CD

91

9C58

CA

9C

77

23

10

F9

18

38

4D

9C60

21

E8

9C

06

08

3E

FF

18

04

9C68

05

CD

CA

9C

CB

FF

77

23

A0

9C70

10

F7

18

24

21

E8

9C

06

FA

9C78

07

CD

CA

9C

CB

C7

77

23

7A

9C80

10

F7

3E

FF

77

18

11

21

21

9C88

E8

9C

06

08

0E

80

CD

CA

DB

9C90

9C

B1

CB

19

77

23

10

F6

FD

9C98

21

E8

9C

11

F0

9C

01

08

7F

9CA0

08

C5

7E

1F

CB

11

10

FB

8D

9CA8

79

12

23

13

C1

0D

20

F1

E4

9CB0

21

E8

9C

11

FF

9C

0E

02

AD

9CB8

06

08

7E

12

23

1B

10

FA

3A

9CC0

0D

C8

21

F0

9C

11

07

9D

93

9CC8

18

EE

3A

E2

9C

57

3A

E3

96

9CD0

9C

32

E2

9C

82

57

3A

E4

AF

9CD8

9C

32

E3

9C

82

07

32

E4

60

9CE0

9C

C9

00

00

00

05

5A

25

65

9CE8

00

00

00

00

00

00

00

00

84

9CF0

00

00

00

00

00

00

00

00

8C

9CF8

00

00

00

00

00

00

00

00

94

9D00

00

00

00

00

00

00

00

00

9D




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Party Zone - обзор пиксельной графики с ascii'o2.
Demoscene - новая Новгородоская группа "RaZZLeRS".
От авторов - Вступительное слово.
Продолжение следует
Последний штрих - ZX-Net.

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