ZX-Ревю 1997 №1-2 1997 г.

Этюды - процедура проявления экрана.


Командны Илья (ZX-MANIACS) из проявления экрана - картинка вы-

г.Калуга. езжает из-под нижней кромки.

КОРР* Предлагаю одну до- Самое любопытное в этой проце-

вольно интересную процедуру дуре то, что, изменив всего 4 стро-

60000

40000 $

HL.ADR DE, 16384 HL.DE

(DIFFER),HL (DIFF).HL B.192 HL,0

жать сверху. Но об этом позже. Вот листинг процедуры.

1 ; ZX-MANIACS'1996

2 ; SPECIAL FOR INFORCOM

ЭТЮДЫ

t- 450

LD

ВС,32

460

LDIR

470

POP

HL

480

POP

AF

490

POP

ВС

500

DJNZ

SCR1

510

RET

520DIFFER

DEFW

0

530 DIFF

DEFW

0

10

20 addr 30 40 50 60 70 80 90

100 loop 110 120 130 140 150 160 170 180 190 200 210 220 230 240 250 260 270

280 scr

290

300

310

320

330

340

350

360 scr1

370

380

390

400

410

420

430

440

ORG

EQU

ENT

LD

LD

SBC

LD

LD

LD

LD

LD

(DIFFER),HL

LD

LD

LD

LDIR

LD

LD

PUSH ВС CALL SCR

HL.ADR DE.22496 ВС,32

HL,(DIFF) (DIFFER),HL

LD

LD

LD

LDIR

RET

LD

LD

POP LD ADD LD

CALL SCR POP ВС DJNZ LOOP

HL.ADDR+6144 DE,22528 ВС,768

A,0 C,0

PUSH AF CALL 8880

AF

DE,(DIFFER) HL,DE ВС,48896

8880

DE,(DIFFER)

HL,DE

DE

PUSH ВС INC A PUSH AF PUSH HL CALL LD ADD POP

PUSH HL

Длина процедуры 107 байт.

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

Теперь, как обещал, расскажу о том, что нужно сделать, чтобы картинка выезжала не снизу, а сверху. Для этого, повторюсь, достаточно заменить всего 4 строки:

140 150

280 SCR 370

LD LD LD DEC

HL.ADDR+6112 DE, 16384 А,191 А

КОРР.: Хочу предложить вам еще одну процедуру проявления экрана: довольно медленная, но очень эффектная (картинка выезжает одновременно с двух сторон и постепенно сливается в одно целое). Подобный эффект можно наблюдать в игре HUNT FOR THE RED OCTOBER, но туда я не заглядывл, так что программа-полностью авторская.

1 (с) ZX-MANIACS'1996

2 SPECIAL FOR INFORCOM

10

20 ADDR 30 40 50 60

ORG

EQU

ENT

LD

LD

SBC

60000

40000 $

HL.ADDR DE, 16384 HL,DE

70

LD

(DIFFER),HL

80

LD

B,0

90 LOOP

PUSH

ВС

100

LD

A, 1

110

LD

ВС,24826

120 SCRL1

PUSH

ВС

130

PUSH

AF

140

CALL

8880

150

PUSH

HL

160

LD

DE,(DIFFER)

170

ADD

HL,DE

180

LD

B,32

190

XOR

A

200 SCRL2

RL

(HL)

210

DEC

HL

220

DJNZ

SCRL2

230

POP

HL

240

LD

B,32

250 SCRL3

RL

(HL)

260

DEC

HL

270

DJNZ

SCRL3

280

POP

AF

290

INC

A

300

INC

A

310

POP

ВС

320

DJNZ

SCRL1

330

LD

A,0

340

LD

ВС,24577

350 SCRR1

PUSH

ВС

360

PUSH

AF

370

CALL

8880

380

PUSH

HL

390

LD

DE,(DIFFER)

400

ADD

HL.DE

410

LD

B,32

420

XOR

A

430 SCRR2

RR

(HL)

440

INC

HL

450

DJNZ

SCRR2

460

POP

HL

470

LD

B,32

480 SCRR3

RR

(HL)

490

INC

HL

500

DJNZ

SCRR3

510

POP

AF

520

INC

A

530

INC

A

540

POP

ВС

550

DJNZ

SCRR1

ЭТЮДЫ

560

POP

ВС

570

DJNZ

LOOP

580

LD

HL.ADDR +

6144

590

LD

DE,22528

600

LD

BC.768

610

LDIR

620

RET

630 DIFFER

DEFW

0

Длина процедуры 107 байт.

Теперь расскажу немного об этих процедурах. Во-первых, у них есть один недостаток они окончательно и бесповоротно портят картинку, загруженную в ADDR. Не забывайте об этом, если захотите использовать их в своих программах. Во-вторых, надо все же немного рассказать, на каком принципе обе эти программки построении. В обеих процедурах активно используется подпрограмма ПЗУ с точкой входа 8880. Эта подпрограмма вычисляет адрес байта в видеобуфере по координатам точки, заданным в пикселях. Началом отсчета считается левый верхний угол экрана. На входе в подпрограмму в аккумулятор загружается вертикальная координата точки, а в регистр С горизонтальная. На выходе: в HL вычисленный адрес в видеобуфере, в А - величина смещения точки в пикселах от левого края вычисленного байта. Об этой подпрограмме я узнал из книги издательства "Питер" "Как написать игру на ассемблере" Советую всем приобрести эту книгу. Вместе с небезызвестной книгой "Инфоркома" она является отличным пособием и справочником для тех, кто программирует на ассемблере.

Вообще, подпрограмма 8880 довольно интересна и 'может с ус-пехом использоваться в процеду-pax, работающих с экраном. Так например, широкоизвестную процедуру "Штора" с помощью этой подпрограммы удалось сократить до 49 байтов: 1; (с) ZX-MANIACS'1996 2; SPECIAL FOR INFORCOM

10

org

60000

20

ent

$

30

ld

hl.addr

40

ld

de, 16384

50

sbc

hl.de

60

ld

b.h

70

ld

c,e

80

ld

a,191

90 loop

push

af

100

push

вс

110

ld

c,0

120

call

8880

130

pop

вс

140

pop

af

150

push

вс

160

ld

d,h

170

ld

e,l

180

add

hl.bc

190

ld

bc.32

200

ldir

210

halt

220

pop

вс

230

dec

a

240

cp

255

250

jr

nz.loop

260

ld

hl.addr +

6144

270

ld

de,22528

280

ld

вс,768

290

ldir

300

ret

Вполне возможно, что можно сократить программу еще больше - я не очень старался сделать это, т.к моя основная задача была несколько иной показать преимущества подпрограммы 8880.

Также, очень даже хорошо сократилась (до 92 байтов) процедура Николая Губина (ZX РЕВЮ 96/1-2, стр. 77). Правда я сделал ее без IM2, и моя процедура отлично работает на компьютерах с ОЗУ 48К. Я надеюсь, что уважаемый автор не обвинит меня в плагиате, т.к. в наших программах общая только идея (да и то она не наша):

1; (с) ZX-MANIACS'1996 2; SPECIAL FOR INFORCOM

10

ORG

60000

20

ENT

$

30

LD

A,95

40

LD

(SCRUP).A

50

INC

A

60

LD

(SCRDN),A

70

LD

HL.ADDR

80

LD

DE, 16384

90

SBC

HL,DE

100

LD

(DIFF).HL

110

LD

B,96

120 LOOP

PUSH

ВС

130

LD

A.(SCRUP)

140

PUSH

AF

150

CALL

8880

160

POP

AF

170

PUSH

HL

180

LD

DE.(DIFF)

190

ADD

HL,DE

200

POP

DE

210

LD

ВС,32

220

LDIR

230

DEC

A

240

LD

(SCRUP).A

250

LD

A,(SCRDN)

260

PUSH

AF

270

CALL

8880

280

POP

AF

290

PUSH

HL

300

LD

DE.(DIFF)

310

ADD

HL,DE

320

POP

DE

330

LD

ВС,32

340

LDIR

350

IMC

A

360

LD

(SCRDN),A

370

HALT

380

HALT

390

POP

ВС

400

DJNJZ

LOOP

410

420 430 440 450

460 SCRUP 470 SCRDN 480 DIFF

LD

LD

LD

LDIR

RET

DEFB

DEFB

DEFW

HL.ADDR + 6144 DE.22528 BC.768

10

ORG

64000

20

ENT

$

30

LD

HL. 16384

40

LD

DE,(23296)

50

LD

B,32

60 МЗ

PUSH

ВС

70

PUSH

HL

80

LD

B,8

90 М2

PUSH

ВС

100

PUSH

HL

110

LD

B,8

120 М1

LD

A,(DE)

130

LD

(HL),A

140

INC

DE

150

INC

H

160

DJNZ

M1

170

POP

HL

180

LD

ВС,32

190

ADD

HL.BC

200

POP

ВС

210

DJNZ

M2

220

POP

HL

230

INC

HL

240

POP

ВС

250

DJNZ

МЗ

260

RET

ЭТЮДЫ

Перед запуском процедуры надо занести в ячейки 23296/97 необходимый адрес.

(с) Колотов Сергей, SerzhSoft from Shadrinsk, Х.1996

КОРР: Добрый день! В ZX РЕВЮ 96/4-5 в ЭТЮДАХ на стр. 80 была опубликована процедура Прокопенко А.В. LOAD-MERGE (дисковый вариант). Задумка, конечно, неплохая, но во время набора и тестирования данной процедуры был обнаружен ряд досадных ошибок

1. При установке числа байт, по которому происходит поиск име>ни в каталоге вместо переменной #5D0 6 изменяется ячейка памяти по адресу #5С06. Но это ведь системная переменная KSTATE6, используемая при ОПРОСЕ КЛАВИШ!

2. Непонятно, зачем по адресу #5DA0 заносится 0. Эта ячейка памяти не является ни системной переменной, ни переменной TR DOS! Скорей всего в листинг закралась опечатка, причем, двойная и в ассемблерной команде, и в комментарии. На самом же деле, вместо #5DA0. должно быть #5D10 - адрес переменной TR DOS, которая обязательно обнуляется перед чтением В ASIC-файла (функция #0Е для точки входа в TR DOS #3D13).

3. При печати на экране сообщения O.K. после загрузки файла, выдается не номер строки автостарта (как в магнитофонном варианте), а номер последней выполненной BASIC-строки. Следовательно, строки LD HL,(#5C42): LD (#5C45),HL можно безболезненно из программы выкинуть.

Еще одна положительная особенность этой программы - она многоразовая.

Ну и на последок я отвлекусь от темы проявления экрана и предложу процедурку, которая поможет Вам в поиске символьного набора и шаблонов спрайтов. В верхней трети экрана она выводит столбцами по 8 знакомест содержимое памяти компьютера. За один раз она выводит 2048 байт. 1; (с) ZX-MANIACS' 1996 2; SPECIAL FOR INFORCOM

Номер строки автостарта узнавать довольно-таки громоздко, да и не очень-то нужно. Главное просто загрузить программу, не дав ей запуститься.

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

Процедура релоцируема и занимает 64 байта. ld mrg

LD С,# 18 CALL #3D13 LD А, #09 LD (#5D06),A XOR A LD (#5CF9),A LD DE,(#5C5D) INC DE LD HL,#5CDD LD B,#08 LP_LM 1 INC DE

LD A.(DE) CP #0D JR NZ.GOJ.M1 LP LM2 LD (HL)," " INC HL DJNZ LP.LM2 JR GO_LM2 GO LM1 LD (HL),A INC HL DJNZ LP_LM 1 GO LM2 LD (HL),"B" LD C,#0A CALL #3D13 INC С JR Z,ER_LM1 XOR A

LD (#5D10),A LD C,#0E CALL #3D13

RST DB

ER_LM 1 RST DB




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Программистам - Теория: передача данных на компьютере.
Assembly - отчет Петра Соболева с буржуйского пати Assembly 1999 (Часть 1).
General Sound - X-Player - первый нормальный плеер модов для General Sound.
Sega online - описания и порты к сеговским играм.
Виртуальный Spectrum - Тестирование эмуляторов ZX-Spectrum.

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