Динамическая графика 1994 г.

Анимаци в растровой графике - Вертикальный скроллинг экрана.


2.2.2 Вертикальный скроллинг экрана.

Формат процедуры для выполнения вертикального скроллинга экрана - следующий: FN m(l,d).

1 - length - паранетр, указывающий на какую величину- (в пикселах ) следует исполнить скроллинг.

a direction параметр, определяющий направление перемеще

ния .

d=0 - скроллинг вниз. d=l - скроллинг вверх.

Листинг 21

Загрузчик машинного кода процедуры вертикального скроллинга

10 REM *»* Загрузчик машинного кода

20 LET adr=50900: LET long=215: LET check=68798: LET sum=0 30 FOR k=0 TO long-1: READ a 40 POKE (adr+k),a: LET sum=sum+a 50 NEXT k

60 IF sumocheck THEN PRINT "??": STOP 100 REM **« Данные для машинного кода

110 DATA 243,042,011,092,017 120 DATA 004,000,025,070,030 130 DATA 008,025,126,230,001 140 DATA 040,091,197,001,032 150 DATA 000,033,000,064,017 160 DATA 162,199,126,018,035 170 DATA 019,016,250,001,175 180 DATA 000,033,000,064,017 190 DATA 000,065,213,229,006 200 DATA 032,026,119,035,019

210 DATA 016,250,225,209,036 220 DATA 062,007,164,032.010 230 DATA 062,032,133,111,040 240 DATA 004,124,214,008,103 250 DATA 020,062,007,162,032 260 DATA 010,062,032,131,095 270 DATA 040,004,122,214,008 280 DATA 087,013,032,209,006 290 DATA 032,033,162,199,017 300 DATA 160,087,126,018,035

310 DATA 019,016,250.193,016 320 DATA 167,251,201,197,033 330 DATA 160,087,017,162,199 340 DATA 006,032,126,018,035 350 DATA 019,016,250,001,175 360 DATA 000,033,160,086,017 370 DATA 160,087,213,229,006 380 DATA 032,126,018,035,019 390 DATA 016,250,225,209,037 400 DATA 124,230,007,254,007

410 DATA 032,012,125,214,032

420 DATA 111,254,224,040,004

430 DATA 062,008,132,103,021

440 DATA 122,230,007,254,007

450 DATA 032,012,123,214,032

460 DATA 095,254,224,040,004

470 DATA 062,008,130,087,013

480 DATA 032,201,017,000,064

490 DATA 033,162,199,006,032

500 DATA 126,018,035,019,016

510 DATA 250,193,016,160,251 520 DATA 201,000,000,000,000 530 DATA 000,000.000,000,000

Листинг 22 Процедура, управляющая вертикальным скроллингом

Адрес Маш-код Метка Мнемоника__Комментарий 

C6D4 F3 C6D5 2А0ВЬС

110400

19

46

1Е08

19

Е601

285В

С5

012000

LINE1

13

10FA

01AF00 210040

C6FB 110041

С6Е9 210040

С6ЕС 11А2С7 C6EF 7Е C6F0 12 C6F1 23 C6F2 C6F3 C6F5 C6F8

C6D8 C6DB C6DC C6DD C6DF С6Е0 С6Е1

С6ЕЗ С6Е5 С6Е6

MAIN

DE,#0004 HL, DE B,(HL) E, #08 HL.DE A.(HL) #01

OR Z, TOWN PUSH ВС LD ВС,#0020

LD HL,#4000

LD LD LD

DE, #C7A2 A,(HL) (DE),A

INC HL INC DE DONZ LINE1 LD ВС,#00AF LD HL,#4000

LD DE,#4100 ;Запрет прерываний Указание на адрес, в ко ;тором располагаются па -;раметры функции пользователя FN m(). ;Вычисление адреса первого параметра. ;Прием параметра 1 ;Переход ко второму ;параметру. ;Прием параметра d Определяем направление ;скроллинга ;Переход, если вверх. ;Сохранение на стеке ;32 байта длина одной ;линии экрана. ;Начало экранной области ;в оперативной памяти. ;Адрес временного буфера. ;Переброска первой ;линии ; экрана ;во временный ;буфер

DI LD

HL,(#5C0B)

LD

ADD

LD

LD

ADD

LD

AND

;Высота экрана. ;Адрес начала первой ;линии экрана. ;Адрес начала второй ;линии экрана.

Адрес Маш.код Метка Мнемоника

Комментарии.

PUSH DE PUSH HL LD В,#20 A,(DE) (HL),A HL DE

DONZ LINE2 POP HL DE H

LD

AND

OR

POP INC

A,#07 H

NZ,NOSEG

С710 С712 С713 С714

ЗЕ20

85

6F

2804

LD ADD LD JR

A,#20

A,L

L,A

Z,NOSEG

С716 С717 С719

D608 67

LD

SUB

LD

С71А С71В C71D С71Е С720

14

ЗЕ07 А2

200А ЗЕ20

N0SEG

INC

LD

AND

OR

LD

A,H #08 H, A

D

A,#07 D

NZ,NEXT A,#20

C6FE C6FF С700 С702 С703 С704 С705 С706 С708 С709 С70А

С70В C70D С70Е

D5

Е5

0620

77

23 13

10FA

Е1

D1

24

ЗЕ07 А4

200А

AGAIN

LD LD INC INC

;Сохранили на ;стеке. ; Переброска ;второй ;линии ;экрана ;в

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

Адрес Наш.код Метка Мнемоника

Комментарий

С722 С723 С724 С726 С727 С729

83 5F

2804 7А

D608 57

0D 20D1

С72А С72В

NEXT

С735 С736 С737 С738 С739 С7 3В

LOOP

C72D 0620 C72F 21А2С7

С732 11А057

12 23 13

10FA С1

FB

C9

С73С 10А7

С73Е C73F

A,E E,A Z,NEXT A,D #08 D,A

DEC С

JR NZ,AGAIN

LD LD

В, #20 HL,#C7A2

LD DE,#57A0

LD A,(HL) LD (DE),A INC HL INC DE DJNZ LOOP POP ВС

ADD

LD

JR

LD

SUB

LD

DJNZ MAIN

EI RET

Уменьшаем счетчик строк. ;Если не исчерпан,то ;возврат

;Счетчик на 20 байтов. :Адрес временного буфера, ;в который отправлялась ;самая верхняя строка ;экрана.

;Адрес начала последней ;строки экрана. ;Замена последней ;строки экрана ;на первую путем ;копирования ;через буфер. ;Восстановление счетчика ;дистанции. ,Если не весь путь ;пройден, то возврат ;к началу самого внешне-;го цикла

;Разрешение прерываний. ;Выход.

;Сохранили на стеке ;путь, который осталось ;пройти.

С740

С5 DOWN

PUSH ВС

Адрес Маш.код Метка Мнемоника

Комментарий

С741 21А057

С744 11А2С7

С747 0620

12 23 13

10FA

01AF00

21А056

11А057 D5 Е5 0620 12 23 13

10FA Е1 D1 25

С749 С74А С74В С74С C74D C74F С752

С755 С758 С759 С75А С75С C75D С75Е C75F С760 С762 С763 С764

С765 С766 С768 С76А

7С Е607 FE07 200С

C76C 7D C76D D620

LD HL,#57A0 LD DE,#С7А2

LD В,#20

LINE3 LD A,(HL)

LD (DE),A

INC HL

INC DE

DJNZ LINE3

LD BC,#00AF

LD HL, # 5 6AO

LD DE. #57A0 AGAIN2 PUSH DE PUSH HL LD В,#20 LINE4 LD LD INC INC

A,(HL) (DE),A HL DE

DONZ LINE4 POP HL POP DE DEC H

LD A.H

AND #07

CP #07

JR NZ,N0SEG2

LD A,L SUB #20

;Адрес последней линии ;экрана.

:Адрес временного буфера ;для сохранения последней линии.

;32 байта - длина одной ;линии экрана. ;Переброска ;последней ;линии экрана во ;временный ;буфер.

;Высота экрана. ;Адрес предпоследней ;линии.

;Адрес последней линии.

;Переброска ;предпоследней ;линии ;экрана ;в последнюю.

;Переход к соседней :линии сверху. ;Если три младших бита ;регистра Н не равны ;семи, то переход через ;границу экранного сегмента не произошел. ;Если же они равны нулю. ;то надо проверить, то

Адрес

Маш.код

Нетка

Мнемоника Комментарий.

C76F

6F

LD

L,A

ли нам нужен переход

С770

FEE0

CP

#E0

в предыдущий сегмент,

С772

2804

JR

Z,NOSEG2

то ли достаточно перейти в предыдущий ряд из восьми линий.

С774

ЗЕ08

LD

A,#08

Переход в предыдущий

С776

84

ADD

A,H

сегмент не нужен -

С777

67

LD

H,A

прибавляем 08 к Н и остаемся в старом сегменте, но в предыдущем ряду.

С778

15

N0SEG2

DEC

D

Все то же самое для

С779

LD

A,D

строки, из которой

С77А

Е607

AND

#07

происходит копирова

С77С

FE07

CP

#07

ние .

С77Е

200С

OR

NZ,NEXT2

С780

LD

A,E

С781

D620

SUB

#20

С783

5F

LD

E,A

С784

FEE0

CP

#E0

С786

2804

DR

Z,NEXT2

С788

ЗЕ08

LD

A,#08

С78А

82

ADD

A,D

С78В

57

LD

D,A

С78С

0D

NEXT 2

DEC

С

Уменьшаем счетчик

;строк.

C78D

20С9

JR

NZ,AGAIN2

; Если не исчерпан, то

;возврат.

C78F

110040

LD

DE,#4000

;Начало экранного файла

С792

21А2С7

LD

HL.#C7A2

;Адрес временного буфера

С795

0620

LD

В,#20

;Длина одной линии

С797

LD

A,(HL)

;Замена первой

С798

12

LD

(DE),А

;строки экрана

С799

23

INC

HL

;на последнюю путем

С79А

13

INC

DE

;копирования

Адрес маш.код Метка Мнемоника

Коннентарий

DJNZ LOOP1 ;через буфер.

POP ВС ;Восстановление счетчика

;дистанции.

С79Е

10А0

DJNZ

DOWN

;Если не весь путь

;пройден, то возврат

;к началу внешнего

;цикла.

С7А0

FB

EI

;Разрешение прерываний

С7А1

С9

RET

;Выход.

С7А2

00000000

BUFFER DEFM

00

00

00

00

С7А6

00000000

DEFM

00

00

00

00

С7АА

00000000

DEFM

00

00

00

00

С7АЕ

00000000

DEFM

00

00

00

00

С7В2

00000000

DEFM

00

00

00

00

С7В6

00000000

DEFM

00

00

00

00

С7ВА

00000000

DEFM

00

00

00

00

С7ВЕ

00000000

DEFM

00

00

00

00




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Антибог - О великий Астрал!
Вступление - содержание номера.
Doomdarks Revenge - полное описание ролевой игры, в которой вам предстоит сражаться со злом.
Дебют - подробно рассматривается одна из самых увлекательных адвентюр - "Robin of Sherwood".
Послесловие - Реклама.

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