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
7Е
Е601
285В
С5
012000
С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
DE,#0004 HL, DE B,(HL) E, #08 HL.DE A.(HL) #01
OR Z, TOWN PUSH ВС LD ВС,#0020
LD HL,#4000
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 байта длина
одной ;линии экрана. ;Начало экранной области ;в оперативной памяти.
;Адрес временного буфера. ;Переброска первой ;линии ; экрана ;во
временный ;буфер
;Высота экрана. ;Адрес начала первой ;линии экрана. ;Адрес начала второй ;линии экрана.
Адрес Маш.код Метка Мнемоника
PUSH DE PUSH HL LD В,#20 A,(DE) (HL),A HL DE
DONZ LINE2 POP HL DE H
POP INC
A,#07 H
NZ,NOSEG
A,#20
A,L
L,A
Z,NOSEG
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
1А
77
23 13
10FA
Е1
D1
24
ЗЕ07 А4
200А
;Сохранили на ;стеке. ; Переброска ;второй ;линии ;экрана ;в
;первую -;Восстановление ;данных со стека.
;Переход к соседней ;линии снизу. ;Если три младших бита ;регистра Н не
равны ;нулю, то переход через ;границу экранного сегмента не произошел.
;Если же они равны нулю, ;то надо проверить, то ;ли нам нужен переход
;в очередной сегмент, ;то ли достаточно ;перейти в очередной ;ряд из
восьми линий. ;Переход в очередной ;сегмент не нужен -;вычитаем 08 из Н
и ;остаемся в старом сег-;менте, но в следующем :ряду. Все то же самое
для строки, из которой происходит копирование .
Адрес Наш.код Метка Мнемоника
С722 С723 С724 С726 С727 С729
83 5F
2804 7А
D608 57
0D 20D1
С72А С72В
С735 С736 С737 С738 С739 С7 3В
C72D 0620 C72F 21А2С7
С732 11А057
7Е 12 23 13
10FA С1
С73С 10А7
С73Е C73F
A,E E,A Z,NEXT A,D #08 D,A
DEC С
JR NZ,AGAIN
В, #20 HL,#C7A2
LD DE,#57A0
LD A,(HL) LD (DE),A INC HL INC DE DJNZ LOOP POP ВС
DJNZ MAIN
EI RET
Уменьшаем счетчик строк. ;Если не исчерпан,то ;возврат
;Счетчик на 20 байтов. :Адрес временного буфера, ;в который отправлялась ;самая верхняя строка ;экрана.
;Адрес начала последней ;строки экрана. ;Замена
последней ;строки экрана ;на первую путем ;копирования ;через буфер.
;Восстановление счетчика ;дистанции. ,Если не весь путь ;пройден, то
возврат ;к началу самого внешне-;го цикла
;Разрешение прерываний. ;Выход.
;Сохранили на стеке ;путь, который осталось ;пройти.
Адрес Маш.код Метка Мнемоника
С741 21А057
С744 11А2С7
С747 0620
7Е 12 23 13
10FA
01AF00
21А056
11А057 D5 Е5 0620 7Е 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
|
7А
|
|
LD
|
A,D
|
строки, из которой
|
С77А
|
Е607
|
|
AND
|
#07
|
происходит копирова
|
С77С
|
FE07
|
|
CP
|
#07
|
ние .
|
С77Е
|
200С
|
|
OR
|
NZ,NEXT2
|
|
С780
|
7В
|
|
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
|
7Е
|
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
|
|