5. Подпрограммы сдвига. 5.1 Сдвиг атрибутов влево.
Длина: 23
Количество переменных: 1 Контрольная сумма: 1574
Назначение: эта программа сдвигает атрибуты всех символов экрана влево на одно знакоместо.
Переменные: Имя: new attr Длина: 1 Ячейка: 23296
Комментарий: это атрибут, вводимый в крайнюю правую колонку. Вызов программы:
RANDOMIZE USR адрес Контроль ошибок: Нет
Комментарий: Эта программа полезна для выделения области текста или графики. Для прокручивания только 22 верхних строк 24* должно быть изменено на 22.
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
LD HL,22528 |
33 |
0 |
LD A,(23296) |
58 |
0 |
LD C,24 |
14 |
24* |
LD B, 31 |
6 |
31 |
INC HL |
35 |
|
LD E,(HL) |
94 |
|
DEC HL |
43 |
|
LD (HL),E |
115 |
|
INC HL |
35 |
|
DJNZ NEXT C |
16 |
249 |
LD (HL),A |
119 |
|
INC HL |
35 |
|
DEC C |
13 |
|
JR NZ,NEXT L |
32 |
242 |
91
Как она работает:
В пару регистров HL загружается адрес области атрибутов. Аккумулятор загружается значением атрибута, вводимым в правую колонку. В регистр C загружается количество строк для сдвига - он теперь может быть использован, как счетчик строк. В регистр B заносится число на 1 меньшее, чем число символов в строке, чтобы он использовался, как счетчик. HL увеличивается, чтобы указать на следующий атрибут, который загружается в E-регистр. HL уменьшается и по адресу HL помещается значение из E-регистра. HL увеличивается вновь, чтобы указать на следующий атрибут. Регистр B уменьшается и, если он не равен 0, то происходит переход к NEXT_C'. HL теперь указывает на правую колонку и по адресу HL помещается значение из аккумулятора. HL увеличивается, чтобы указать на следующую строку - NEXT_L. Счетчик строк (регистр C) уменьшается. Если значение результата не равно 0, подпрограмма возвращается назад к NEXT_L.
По окончании работы программа возвращается в BASIC.
5.2 Сдвиг атрибутов вправо.
Длина: 23
Количество переменных: 1
Контрольная сумма: 1847
Назначение: Эта программа сдвигает атрибуты всех символов экрана вправо на одно знакоместо.
Переменные:
Имя: new attr
Длина: 1
Ячейка: 23296
Комментарий: это атрибут, вводимый в крайнюю левую колонку. Вызов программы:
RANDOMIZE USR адрес
Контроль ошибок: нет
Комментарий: Эта программа полезна для выделения области текста или графики. Для прокручивания только 22 верхних строк 24* должно быть изменено на 22.
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА |
ДЛЯ |
LD HL,23295 |
33 |
255 |
LD A,(23296) |
58 |
0 |
LD C,24 |
14 |
24* |
LD B, 31 |
6 |
31 |
DEC HL |
43 |
|
LD E,(HL) |
94 |
|
INC HL |
35 |
|
LD (HL),E |
115 |
|
DEC HL |
43 |
|
DJNZ,NEXT C |
16 |
249 |
LD (HL),A |
119 |
|
DEC HL |
43 |
|
DEC C |
13 |
|
JR NZ,NEXT L |
32 |
242 |
RET |
201 |
|
88 91
Как она работает:
В пару регистров HL загружается адрес последнего байта области атрибутов. Аккумулятор загружается значением атрибута для ввода в левую колонку. В регистр C загружается количество строк для сдвига - он используется, как счетчик строк. В регистр B заносится число на 1 меньшее, чем число символов в строке для использования его в качестве счетчика.
HL увеличивается, чтобы указать на следующий атрибут. Значение этого атрибута загружается в E-регистр. HL увеличивается, и по адресу HL помещается значение из E-регистра. HL уменьшается снова для указания адреса следующего атрибута. Счетчик в регистре B уменьшается и, если он не равен 0, то - возврат назад к NEXT_^ HL теперь указывает на крайнюю левую колонку, и в ячейку с адресом HL, помещается значение из аккумулятора. HL уменьшается для указания правого конца следующей строки. Счетчик строк уменьшается, и если он не равен 0, - возврат назад к NEXT_L.
Программа возвращается в BASIC.
5.3 Сдвиг атрибутов вверх.
Длина: 21
Количество переменных: 1
Контрольная сумма: 1591
Назначение: Эта программа сдвигает атрибуты всех символов экрана вверх на одно знакоместо.
Переменные:
Имя: new attr
Длина: 1
Ячейка: 23296
Комментарий: это атрибут, вводимый в нижнюю строку.
Вызов программы:
RAMDOMIZE USR адрес
Контроль ошибок: нет
Комментарий: эта программа полезна для выделения области текста или графики. Для прокручивания только 22 верхних строк 224* должно быть изменено на 160.
ЛИСТИНГ МАШИННЫХ КОДОВ
МЕТКА АССЕМБЛЕР
LD HL,22560 LD DE,22526 LD ВС,736 LDIR
LD A,(23296) LD B,32 6 NEXT_C LD (DE),A INC DE DJNZ NEXT_C RET 201 Как она работает
В пару регистров HL загружается адрес второй строки атрибутов, в DE загружается адрес первой строки, и BC загружается числом байтов для перемещения.
Количество байтов, определенное в регистровой паре ВС, копируются в ячейки памяти с адресом, находящимся в DE из ячеек, начинающихся с адреса в HL, используя инструкцию LDIR. Эти результаты в DE указывают на нижнюю строку атрибутов. Аккумулятор загружается кодом атрибута для ввода в нижнюю строку. B-регистр загружается числом символов на одной строке - он используется, как счетчик.
По адресу DE помещается значение из аккумулятора, а затем DE увеличивается для указания на следующий байт. Счетчик уменьшается и, если он не равен 0, подпрограмма возвращается к NEXT_^
Затем программа возвращается в BASIC.
5.4 Сдвиг атрибутов вниз.
Длина: 21
Количество переменных: 1 Контрольная сумма: 2057
Назначение: эта программа сдвигает атрибуты всех символов экрана вниз на одно знакоместо.
Переменные: Имя: new attr Длина: 1 Ячейка: 23296
Комментарии: это атрибут, вводимый в верхнюю строку. Вызов программы:
RANDOMIZE USR адрес
Контроль ошибок: нет
ЧИСЛА ДЛЯ |
ВВОДА |
33 |
32 |
88 |
17 |
0 |
88 |
1 |
224' |
* 2 |
237 |
176 |
|
58 0 |
91 |
|
32 |
|
|
18 |
|
|
19 |
|
|
16 |
252 |
|
Комментарий: эта программа полезна для выделения области текста или графики, для прокручивания только 22 верхних строк должны быть изменены: 223* на 159 255* на 191 224* на 160
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
ВВОДА |
LD HL,23263 |
33 |
223 |
90 |
LD DE,23295 |
17 |
255 |
90 |
LD ВС,736 |
1 |
224 |
2 |
LDDR |
237 |
184 |
|
LD A,(23296) |
58 |
0 |
91 |
LD B,32 |
6 |
32 |
|
LD (DE),A |
18 |
|
|
DEC DE |
27 |
|
|
ЛИСТИНГ МАШИННЫХ КОДОВ
Как она работает:
В HL загружается адрес последнего атрибута 23-й строки. В DE загружается адрес последнего атрибута 24-й строки. В BC загружается число байтов для перемещения, затем команда LDDR перемещает байты (их количество указано в регистровой паре ВС) из адреса в HL по адресу в DE. Эти результаты в DE хранят адрес последнего атрибута первой строки.
В аккумулятор загружается значение атрибута для ввода в верхнюю строку. В B регистр загружается число байтов в верхней строке - он используется, как счетчик. В ячейку с адресом DE помещается значение из аккумулятора и DE уменьшается для указания на следующий байт. Счетчик уменьшается и, если он не равен 0, подпрограмма возвращается к NEXT_^ Программа затем возвращается в BASIC.
5.5 Сдвиг влево на один символ.
Длина:21
Количество переменных:0
Контрольная сумма:1745
Назначение: эта программа прокручивает графику экрана на один символ влево. Вызов подпрограммы:
RANDOMIZE USR адрес
Контроль ошибок: Нет
Комментарий:
Эта программа полезна при организации экрана в качестве "окна", показывающего в данный момент меньшую часть большой дисплейной области. Это "окно" перемещается, используя подпрограммы сдвига.
ЛИСТИНГ МАШИННЫХ КОДОВ
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
LD HL,16384 |
33 |
0 |
LD D,L |
85 |
|
LD A,192 |
62 |
192 |
LD B,31 |
6 |
31 |
INC HL |
35 |
|
LD E,(HL) |
94 |
|
DEC HL |
43 |
|
LD (HL),E |
115 |
|
INC HL |
35 |
|
DJNZ NEXT B |
16 |
249 |
LD (HL),D |
114 |
|
INC HL |
35 |
|
DEC A |
61 |
|
JR NZ,NEXT L |
32 |
242 |
RET |
201 |
|
Как она работает:
В пару регистров HL загружается адрес дисплейного файла, а D-регистр устанавливается в 0. В аккумулятор загружается число строк на экране. В B-регистр загружается значение на 1 меньшее, чем число символов в строке - оно является числом байтов для копирования.
HL увеличивается для указания на следующий адрес и содержимое из этой ячейки загружается в E-регистр. HL уменьшается и в ячейку с адресом HL загружается значение из E-регистра. HL увеличивается для адресации следующего байта и счетчик в B-регистре уменьшается. Если он не равен 0, подпрограмма возвращается к NEXT_B.
Если регистр B равен 0, это означает, что последний байт строки скопирован и HL указывает на крайний правый байт. По этому адресу в регистровой паре HL помещается 0 и
HL увеличивается, указывая на следующую строку. Счетчик строк - аккумулятор -уменьшается, и, если он не равен нулю, происходит переход к NEXT_L.
Программа возвращается в BASIC.
5.6 Сдвиг вправо на один символ.
Длина:22
Количество переменных:0
Контрольная сумма:1976
Назначение: эта программа прокручивает содержимое дисплейного файла на один символ вправо.
Вызов подпрограммы:
RANDOMIZE USR адрес
Контроль ошибок: нет
Комментарий:
Эта программа полезна при организации экрана в качестве "окна", показывающего в данный момент меньшую часть большой дисплейной области. Это "окно" перемещается, используя подпрограммы сдвига.
Листинг машинных кодов
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
LD HL,22527 |
33 |
255 |
LD D,0 |
22 |
0 |
LD A,192 |
62 |
192 |
LD B,31 6 |
31 |
|
DEC HL |
43 |
|
LD R,(HL) |
94 |
|
INC HL |
35 |
|
LD (HL),E |
115 |
|
DEC HL |
43 |
|
DJNZ NEXT B |
16 |
249 |
LD (HL),D |
114 |
|
DEC HL |
35 |
|
DEC A |
61 |
|
JR NZ,NEXT L |
32 |
242 |
RET |
201 |
|
87
Как она работает:
В пару регистров HL загружается адрес последнего байта дисплейного файла, а D-регистр устанавливается в 0. В аккумулятор загружается число строк на экране. В B-регистр загружается значение на 1 меньшее, чем число символов в строке, - он используется, как счетчик.
HL уменьшается, указывая на следующий байт, и его значение загружается в E-регистр. HL затем увеличивается, и в ячейку с адресом HL загружается значение E-регистра. HL уменьшается, указывая на следующий байт, и счетчик (B-регистр) уменьшается. Если он не равен 0, подпрограмма возвращается к NEXT_B.
Если регистр B равен 0, это означает, что HL указывает на крайний левый байт строки. Затем по адресу в регистровой паре HL помещается 0, и HL уменьшается, указывая на следующую строку. Счетчик строк (аккумулятор) уменьшается и, если он не равен 0, происходит переход к NEXT_L.
Программа возвращается в BASIC
5.7 Сдвиг вверх на один символ
Длина: 68
Количество переменных:0
Контрольная сумма: 6326
Назначение: программа сдвигает содержимое дисплейного файла вверх на восемь
пикселей.
Вызов подпрограммы:
RANDOMIZE USR адрес
Контроль ошибок: Нет Комментарий: нет
Листинг машинных кодов
АССЕМБЛЕР |
ЧИСЛА ДЛЯ |
LD HL,16364 |
33 |
0 |
LD DE,16416 |
17 |
32 |
PUSH HL |
229 |
|
PUSH DE |
213 |
|
LD C,23 |
14 |
23 |
LD B,32 |
6 |
32 |
LD A,(DE) |
26 |
|
LD (HL),A |
119 |
|
LD A,C |
121 |
|
AND 7 |
230 |
7 |
CP 1 |
254 |
1 |
JR NZ,NEXT B |
32 |
2 |
SUB A |
151 |
|
LD (DE),A |
18 |
|
INC HL |
35 |
|
INC DE |
19 |
|
DJNZ COPY B |
16 |
241 |
DEC C |
13 |
|
JR Z,REST |
40 |
19 |
LD A,C |
121 |
|
AND 7 |
230 |
7 |
CP 0 |
254 |
0 |
JR Z,N BLOCK |
40 |
22 |
CP 7 |
254 |
7 |
JR NZ,NEXT L |
32 |
225 |
PUSH DE |
213 |
|
LD DE,1792 |
17 |
0 |
ADD HL,DE |
25 |
|
POP DE |
209 |
|
JR NEXT L |
24 |
217 |
POP DE |
209 |
|
POP HL |
225 |
|
INC D |
20 |
|
INC H |
36 |
|
LD A,H |
124 |
|
CP 72 |
254 |
72 |
JR NZ,SAVE |
32 |
204 |
RET |
201 |
|
PUSH HL |
229 |
|
LD HL,1792 |
33 |
0 |
ADD HL,DE |
25 |
|
EX DE,HL |
235 |
|
POP HL |
225 |
|
JR NEXT L |
24 |
198 |
64 64
7
7
Как она работает:
В пару регистров HL загружается адрес начала дисплейного файла, а в DE загружается адрес байта через восемь линий вниз. HL и DE сохраняются в стеке, в C-регистр загружается число на 1 меньшее, чем число строк на экране. В B-регистр загружается количество байтов на одной линии дисплея - он используется, как счетчик.
В аккумулятор загружается байт, адресованный DE, и это значение загружается в ячейку по адресу HL. В аккумулятор загружается содержимое C-регистра и, если оно равно
1, 9 или 17, то в ячейку по адресу DE помещается 0. HL и DE увеличиваются, указывая на следующий байт, счетчик в B-регистре уменьшается и, если он не равен 0, происходит переход к 'COPY_B'.
Счетчик строк в регистре C затем уменьшается. Если он равен 0, происходит переход к 'RESTORE'. Если C содержит 8 или 16, то происходит переход к 'N_BLOCK'. Если C не содержит 7 или 15, подпрограмма переходит к 'NEXT_L'. Затем 1792 прибавляется к HL -теперь HL указывает на следующий блок экрана. Подпрограмма переходит к 'NEXT_L'.
В процедуре 'REST' DE и HL берутся из стека и 256 прибавляется к каждому из них. Т.о., DE и HL указывают на строку, позиция которой ниже, чем та, что была в предыдущем цикле. Если HL содержит значение 18432, подпрограмма возвращается в BASIC, иначе происходит переход к процедуре 'SAVE'. В процедуре 'N_BLOCK' 1792 прибавляется к DE -таким образом DE указывает на следующий блок экрана. Подпрограмма затем возвращается к 'NEXT_L'.
По окончании работы происходит возврат в БЕЙСИК.
Продолжение следует
Алексеев А. Г.