Soviet Union ZX Spectrum CommunityВоскресенье, 24.11.2024, 17:32
Вы вошли как Гость | Группа "Гости" | RSS
 [ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
40 Лучших процедур для Z80
HazarДата: Четверг, 10.05.2018, 06:36 | Сообщение # 1
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
Лучшая книга по программированию
Дж. Хардман, Э. Хьюзон.    Перевод Тихоновой Н.А.

Книга содержит полезные примеры программирования в машинном коде с подробным
описанием принципа работы.   (Формат Word 2003. в архиве)

******************************************************************

Сдвиг вниз на один символ.Длина: 73 Количество переменных: 0

Контрольная сумма: 7987

Назначение: Эта программа сдвигает содержимое дисплейного файла вниз на 8 пикселей.

Вызов подпрограммы:RANDOMIZE USR X
адрес  Контроль ошибок: Нет Комментарий: Нет

ЛИСТИНГ МАШИННЫХ КОДОВ МЕТКА АССЕМБЛЕР ЧИСЛА ДЛЯ ВВОДА  (DEC)
LD HL,22527 /33 255 87
LD DE,22495 /17 223 87
SAVE PUSH HL /229
PUSH DE /213
LD C,23 /14 23
NEXT_L LD B,32 /6 32
COPY_B 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
NEXT_B DEC HL /43
DEC DE /27
DJNZ COPY_B /16 241
DEC C /13
JR Z,REST /40 21
LD A,C /121
AND 7 /230 7
CP 0 /254 0
JR Z,N_BLOCK /40 24
CP 7 /254 7
JR NZ,NEXT_L /32 225
PUSH DE /213
LD DE,1792 /17 0 7
AND A /167
SBC HL,DE /237 82
POP DE /209
JR NEXT_L /24 215
REST POP DE /209
POP HL /225
DEC D /21
DEC H /37
LD A,H /124
CP 79 /254 79
RET Z /200
JR SAVE /24 201
N_BLOCK PUSH HL /229
LD HL,1792 /33 0 7
EX DE,HL /235
AND A /167
SBC HL,DE /237 82
EX DE,HL /235
POP HL /225
JR NEXT_L /24 193

Как она работает:В пару регистров HL загружается адрес последнего байта дисплейного файла, а в
DE загружается адрес байта, соответствующего изображению, отстоящему на восемь линий вверх.
HL и DE сохраняются на стеке. В C регистр загружается число, на 1 меньшее, чем число
строк на экране. Затем в B регистр загружается количество байтов на одной линии
дисплея он используется, как счетчик. В аккумулятор загружается байт с адресом
DE и это значение пересылается в ячейку по адресу HL. В аккумулятор загружается
(для проверки) содержимое регистра C и, если оно равно 1, 9 или 17, то в ячейку
по адресу DE помещается0.HL и DE уменьшаются на единицу, указывая на следующий байт дисплея.
Счетчик байтов в регистре B уменьшается и, если и он не равен 0, происходит переход к COPY_В. Далее уменьшается
счетчик строк в регистре C. Если он равен0,происходит переход к процедуре 'REST'. Если C содержит 8 или 16, то
происходит переход к процедуре 'N_BLOCK'. Если C не содержит 7 или 15, подпрограмма переходит к 'NEXT_L'.
Затем из HL вычитается 1792 теперь HL указывает на следующую треть экрана и подпрограмма переходит к 'NEXT_L'.
В процедуре REST значения DE и HL берутся из стека и из них вычитается число 256. В итоге DE и
HL указывают на строку, позиция которой выше, чем та, что была в предыдущем
цикле. Если HL содержит 20479, подпрограмма возвращается в BASIC, иначе
происходит переход к процедуре SAVE.Впроцедуре N_BLOCK,1792 вычитается из DE т.е. после этого DE указывает на
следующий блок экрана.
Подпрограмма затем переходит к NEXT_L.
Прикрепления: 40__.zip (165.5 Kb) · 8523192.doc (73.5 Kb)


Spectrum жив в нашей душе навсегда

Сообщение отредактировал Hazar - Четверг, 10.05.2018, 06:47
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2006Сайт управляется системой uCoz