ZX-Ревю 1992 №1-2 1991 г.

40 лучших процедур - подпрограммы сдвига.


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

МЕТКА

NEXT_L NEXT C

Как она работает:

В пару регистров 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

МЕТКА

NEXT_L NEXT C

Как она работает:

В пару регистров 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

МЕТКА

NEXT C

АССЕМБЛЕР

ЧИСЛА ДЛЯ

ВВОДА

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 адрес

Контроль ошибок: Нет

Комментарий:

Эта программа полезна при организации экрана в качестве "окна", показывающего в данный момент меньшую часть большой дисплейной области. Это "окно" перемещается, используя подпрограммы сдвига.

ЛИСТИНГ МАШИННЫХ КОДОВ

DJNZ NEXT_C RET

16 252 201

АССЕМБЛЕР

ЧИСЛА ДЛЯ

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

МЕТКА

NEXT_L NEXT B

Как она работает:

В пару регистров 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

МЕТКА

NEXT_L NEXT B

Как она работает:

В пару регистров 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

МЕТКА

SAVE

NEXT_L COPY B

NEXT B

REST

N-BLOCK

Как она работает:

В пару регистров 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'.

По окончании работы происходит возврат в БЕЙСИК.

Продолжение следует

Алексеев А. Г.




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Аперативчик - О новой оболочке журнала.
Кубизм mustdie ФАРЭВЫР - формулы построения додэкаэдра, икосаэдра, тетрадра.
Эпилог - заключение и контакты редакции.

В этот день...   29 марта