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

Читатель - читателю - Полезные советы.


ПОЛЕЗНЫ1Е СОВЕТЫ © Вадим Пыльцов, г. Надым, 1994.

Все листинги кодовых блоков, приведенные ниже, были набраны в ассемблере ZEUS и расположены с адреса 40000 только для примера - Вы можете задавать им любые удобные Вам адреса.

Поворот символа.

В книге "40 лучших процедур" была процедура поворота символа на 90°. Как мне кажется, она чересчур сложна. Предлагаю другой вариант процедуры поворота символа на 90° по часовой стрелке:

00010

ORG

40000

00020

ENT

00030

SUB

A

00040

LD

DE,18177

00050

LD

C,9

00060

LOOP

LD

HL,16384

00070

LD

B, 9

00080

LOOP2

RR

(HL)

00090

RRA

00100

INC

H

00110

DJNZ

LOOP2

00120

LD

(DE),A

00130

DEC

D

00140

DEC

C

00150

JR

NZ,LOOP

00160

RET

В строке 60 задается адрес верхней пиксельной линии того знакоместа, символ в котором должен быть повернут (в данном случае это позиция AT 0,0;). В строке 40 задан адрес нижней пиксельной линии того знакоместа, где будет нарисован повернутый на 90° символ (в данном случае это знакоместо в позиции AT 0,1;). Демонстрирует работу процедуры простейшая Бейсик-программа:

1 GO ТО 10

2 CLEAR 39999: RANDOMIZE USR15619: REM : LOAD "rotate" CODE 40000 10 PRINT AT 0,0;"A": RANDOMIZE USR 40000

Гашение экрана.

Довольно эффектная очистка экрана применяется в программах FREDDY HARDEST 2, SANXION и др. Начинают гаснуть случайным образом отдельные точки, пока не погаснет весь экран (весь процесс занимает пару секунд). Выполняется такое гашение следующей процедурой :

00010

ORG

40000

00020

ENT

0C030

C1

CALL

C4

00040

LD

DE,0

00050

LD

B, #14

00060

C2

PUSH

BC

00070

LD

HL,#4000

00080

C3

LD

A,(DE)

00090

AND

(HL)

00100

LD

(HL),A

00110

INC

DE

00120

INC

HL

00130

LD

A, H

00140

CP

#58

00150

JR

NZ,C3

00160

EX

DE, HL

00170

LD

BC,#1770

00180

AND

A

00190

SBC

HL, BC

00200

EX

DE, HL

00210

POP

BC

00220

DJNZ

C2

00230

LD

C,7

00240

CALL

C6

00250

RET

00260

C4

LD

HL,#5800

00270

C5

LD

(HL),6

00280

INC

HL

00290

LD

A, H

00300

CP

#5B

00310

JR

NZ, C5

00320

RET

00330

C6

LD

HL,#5800

00340

C7

LD

(HL),C

00350

INC

HL

00360

LD

A, H

00370

CP

#5B

00380

JR

NZ, C7

00390

RET

Контурный шрифт.

Предлагаю процедуру формирования "контурного" шрифта. Такого шрифта ещё не было на страницах ZX-РЕВЮ. Идея такая: шаблон букв! или другого символа смещаем влево-вверх, затем вправо-вверх, влево-вниз и вправо-вниз, все это складываем командой OR, и, наконец, вырезаем командой XOR шаблон исходного символа.

Эту процедуру я сделал для своих загрузчиков. Смотрится довольно эффектно (я пишу названия программ этим шрифтом, вставляя по пробелу между соседними буквами для удобочитаемости).

Вот процедура, выполняющая преобразование символьного набора, расположенного сразу же следом за этой

процедурой:

00010 BUFF

EQU

END+1

00020

ORG

40000

00030

ENT

00040

CALL

UST

00050

LDIR

00060

CALL

UST

00070

INC

HL

00080

LD

A,39

00090

LD

(NOK),A

00100

CALL

LOOP

00110

LD

A,63

00120

LD

(NOK),A

00130

CALL

LOOP

00140

INC

DE

00150

CALL

LOOP

00160

LD

A,39

00170

LD

(NOK),A

00180

CALL

LOOP

00190

WYREZ

LD

A,(DE)

00200

XOR

(HL)

00210

LD

(DE),A

00220

INC

HL

00230

INC

DE

00240

DEC

BC

00250

LD

A, B

00260

OR

C

00270

JR

NZ,WYREZ

00280

LD

HL,BUFF

00290

DEC

H

00300

LD

(23606),HL

00310

RET

00320

LOOP

PUSH

BC

00330

LD

B, 8

00340

LOOP2

LD

A, (HL)

00350

DB

203

00360

NOK

DB

0

00370

EX

DE, HL

00380

OR

(HL)

00390

EX

DE, HL

00400

LD

(DE),A

00410

INC

HL

00420

INC

DE

00430

DJNZ

LOOP2

00440

POP

BC

00450

DEC

BC

00460

DEC

BC

00470

DEC

BC

00480

DEC

BC

00490

DEC

BC

00500

DEC

BC

00510

DEC

BC

00520

DEC

BC

00530

LD

A, B

00540

OR

C

00550

JR

NZ,LOOP

00560

UST

LD

HL,15616

00570

LD

DE,BUFF

00580

LD

BC,7 68

00590

END

RET

Если Вас не устраивает место расположения символьного набора, измените в строке 10 значение адреса его расположения BUFF.

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

00105 INC HL

00155 INC DE

Шрифт, полученныш с такими изменениями, немного по-другому смотрится на экране.

Увеличение символа.

Программа, подобная этой, уже была напечатана в книге "Прикладная графика". Основное отличие моей процедуры от предложенной в книге, заключается в следующем: у меня шаблон печатается без атрибутов, но в любой точке экране (по X и по Y), с различным увеличением (в 2.20 и более раз). Я Если часть изображения выходит за экран, то она просто не рисуется.

00010 ORG 4 0000

00020 CHAS EQU 8

00030 SHIR EQU 1

00040 SPRITE EQU 15880

00050 Y0 EQU 150

00060

X0

EQU

20

00070

DY

EQU

5

00080

DX

EQU

3

00090

ENT

00100

LD

HL,SPRITE

00110

LD

IX,STORE

00120

LD

A, (IX)

00130

LD

(IX+5) , A

00140

SUB

A

00150

SNAP

LD

B, (IX+2)

00160

LOOP

PUSH

HL

00170

LD

E,SHIR

00180

LD

C, (IX+1)

00190

LD

(IX+4) , C

00200

KURI

BIT

7,(HL)

00210

CALL

INBIT

00220

BIT

6,(HL)

00230

CALL

INBIT

00240

BIT

5, (HL)

00250

CALL

INBIT

00260

BIT

4,(HL)

00270

CALL

INBIT

00280

BIT

3, (HL)

00290

CALL

INBIT

00300

BIT

2,(HL)

00310

CALL

INBIT

00320

BIT

1, (HL)

00330

CALL

INBIT

00340

BIT

0, (HL)

00350

CALL

INBIT

00360

DEC

E

00370

JR

Z,LOOK

00380

INC

HL

00390

JR

KURI

00400

LOOK

POP

HL

00410

DEC

(IX)

00420

RET

Z

00430

DJNZ

LOOP

00440

INC

A

00450

CP

CHAS

00460

RET

Z

00470

LD

B,SHIR

00480

ROUT

INC

HL

00490

DJNZ

ROUT

00500

jr

SNAP

00510

INBIT

JR

Z,LOOP5

00520

CALL

UST

00530

RET

00540

LOOP5

CALL

REUST

00550

RET

00560

REUST

PUSH

BC

00570

LD

B,(IX+3)

00580

LOM

INC

(IX+4)

00590

JR

Z,LOOP2

00600

DJNZ

LOM

00610

POP

BC

00620

RET

00630

UST

PUSH

BC

00640

LD

b,(ix+3)

00650

KOP

PUSH

BC

00660

LD

B, (IX)

00670

LD

C, (IX+4)

00680

PUSH

HL

00690

PUSH

AF

00700

PUSH

DE

00710

CALL

8933

00720

POP

DE

00730

POP

AF

00740

POP

HL

00750

POP

BC

00760

INC

(IX+4)

00770

JR

Z,LOOP2

00780

DJNZ

KOP

00790

LOOP2

POP

BC

00800

RET

00810

STORE

DEFB

Y0

00820

DEFB

X0

00830

DEFB

DY

00840

DEFB

DX

00850

DEFB

0

00860

DEFB

0

В строке 20 задается высота исходного шаблона (в пикселях), в строке 30 - ширина (в байтах), в строке 40 -адрес размещения этого спрайта (в данном примере задана буква "А" из символьного набора ПЗУ). в строках 50 и 60 задаются координаты левого верхнего угла будущего изображения (в пикселях). В строках 70 и 80 - коэффициенты увеличения по вертикали и горизонтали. При работе программы используются рабочие ячейки, хранящие копии Y0 и Х0 -строки 850, 860.

Изображение строится по точкам процедурой PLOT из ПЗУ. Если взять процедуру PLOT из книги "Элементарная графика", и в строке 710 сделать ссылку на нее, то скорость построения шаблона увеличится примерно

в 1,8 раза. Процедура довольно быстро строит букву размером во весь экран.

* * *




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Из книг - Домашняя библиотека: Состав домашней библиотеки. Порядок на книжной полке.
Обмен опытом - Исправляем STS v5.1
Стихи - стихи или про спектрумистов.
ZX-PROFI - Управление ресурсами. Карта компьютера в системе SP-DOS. Подключение дисководов 5.25/1.2Мб, 3.5/1.44 к SPECCY.
Опрос - Вашему вниманию предлагается опрос населения на тему конфигурации компьютера.

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