Info Guide #05
30 апреля 2004

For Coderz - Маленькие программерские хитрости.

<b>For Coderz</b> - Маленькие программерские хитрости.
                  Этюды

     1. Инкремент 32-разрядного числа

    Делается так:
       INC (HL),HL
      JR Z,$-2
...и  всё :) Причём, как видите, процедура
универсальна - для 16/32/64/nn..-разрядных
чисел - если переход через ноль гарантиро-
ванно не происходит. (Именно  в таком виде
фрагмент  удобен для подсчёта проходов не-
коего куска программы.)
   Декремент при тех же условиях реализуе-
 тся сложнее:
       XOR A
       CP (HL)
       DEC (HL)
       INC HL
      JR NC,$-3
    Или, если вероятен переход через ноль:
       SCF
       LD B,4 ;количество байт в числе
       LD A,(HL)
       SBC A,0
       LD (HL),A
       INC HL
      DJNZ $-5
    И инкремент для того же случая:
       SCF
       LD B,4 ;количество байт в числе
       LD A,0
       ADC A,(HL)
       LD (HL),A
       INC HL
      DJNZ $-5
   Ноль  можно занести в C, если его нет в
других регистрах. INC HL в частных случаях
можно заменять на INC L или INC H.

   В регистрах  же, как вы сами понимаете,
 обе операции выглядят ещё проще:
     инкремент:           декремент:
       INC HL               LD A,H
       LD A,H               OR L
       OR L                 DEC HL
       JR NZ,$+3            JR NZ,$+3
      INC DE               DEC DE


     2. Как избежать лишних INCBIN'ов

   Знаете, как  можно  в аласме подгрузить
файл одним INCBIN'ом в два разных места? А
то и больше? ;) Мне такое как раз требова-
лось  для  Pro Tracker'а: плейер у меня на
диске  лежит  целый, но в памяти он должен
быть разрезан.А делается это с помощью ко-
 пирования памяти через фигурные скобки:
       ORG куда_копировать,стр_куда_откуда
       DISP откуда_копировать
       DUP длина/16
       DW {$}
       DW {$}
       DW {$}
       DW {$}
       DW {$}
       DW {$}
       DW {$}
       DW {$}
       EDUP
      ENT
   Страница  памяти "откуда_копировать"  и
страница "куда_копировать" должны быть од-
ной и той же страницей "стр_куда_откуда".
   Я пробовал все варианты группировки DW:
через DUP&REPEAT/UNTIL, через перечисление
{$},{$+2} и т.д., пробовал менять $ на пе- 
ременную, но оказалось,что приведенный ва-
риант самый быстрый. К тому же, он короче,
чем {$},{$+2} ... :) Скорость на 3.5 MHz -
около 1.5 кбайт/с. Для сравнения, скорость
DS - около 8 кбайт/с. 


         3. Одно важное замечание

   Оказалось, способы выравнивания на гра-
ницу параграфа (256 байт),которые я описы-
вал  в ZX-Guide, устарели. В новых аласмах
 допустима еще более короткая конструкция:
      DS .(-$)
   Вся  её хитрость в том, что DS 0 ничего
не делает :)
   Выравнивание на чётный байт в этом слу-
 чае записывается так:
      DS -$&1
    А выравнивание на байт, кратный 8:
      DS -$&7
и т.п.
   А вот  выравнивание на ближайший адрес,
 младший байт которого равен #F0:
      ORG $+15/256<8+#F0
    или
      ORG $+15&#FF00+#F0
(в общем случае $+a&#FF00+b, где a=255-b )


  4. Контроль памяти при ассемблировании

   Вам никогда не приходилось делать в ис-
ходнике  контроль  переполнения памяти для
программы? Чтобы  при  превышении  размера
программы компиляция выводила на экран ка-
кое-то  сообщение? Обычно это делают через
IF, в  котором  присутствует  сравнение. А 
сравнение  в синтаксисе аласма - это вычи-
тание  и  проверка  старшего  бита. Но  не
&#8000, как  можно было бы  подумать, а... 
<1&1. Значительно короче :) Автор - Capry. 
   Теперь, когда  наше условие в IF выпол-
нилось (проверить   его  работоспособность
можно,искусственно удлинив программу каки-
ми-нибудь DS'ами),нужно вывести сообщение.
Это  делает  DISPLAY. А потом можно (но не
обязательно) и  прервать  компиляцию - это
сделает  директива  INCBIN  с каким-нибудь
диким названием файла.

                         А. Кодер 08.03.04



Другие статьи номера:

CacheVox - Пакет программ для импорта и последующего проигрывания с дискет цифровой музыки.

For Coderz - RAYCASTING - сделай себе немного DOOM'a. Алгоритм трассировки 3D лабиринта как в игре WOLF.

Inferno - О журнале.

DIY - Приспосабливаем мышь от Amiga к ZX Spectrum.

Sofтинка - обзор экранных упаковщиков для ZX Spectrum.

Inferno - Авторы и контакты редакции.

Gameland - описание игры Stronghold (Бастион).

Sofтинка - Пакет CacheVox v1.0 для импорта и проигрывания с дискет цифровой музыки.

Интервью - интервью с Disabler'ом - кодером, художником и железячником из Ростова-на-Дону.

Others - Глюки записи на дискеты. Причины и методы борьбы.

Gameland - Краткое описание проблем игры Dune: Imperia 2.

Inferno - Ошибки в предыдущих номерах.

For Coderz - Маленькие программерские хитрости.

Spectrum - Форматы упакованных данных на ZX Spectrum.

Gameland - об игре Hexagonal Filler.

Sofтинка - Hrum 3.5i - самый быстрый LZ-распаковщик с битовым потоком.

DIY - Изготовление хвоста для мышки.

Железо - Исследуем микросхему К561ИЕ10A.

Железо - Исследуем микросхему КР1533ИЕ7.

Железо - Исследуем микросхему К561ТЛ1. .

Sofтинка - экранный компрессор Laser Compact 4.0.

Inferno - Письма в редакцию.

Sofтинка - компрессор текстов MS Pack 01.96.

Inferno - Об оболочке.

Sofтинка - преимущества архиватора Rar.

Sofтинка - Упаковщик RGB картинок Powerful Code Decreaser v6.2.

Ликбез - Что такое плюс и минус напряжения.

Ликбез - Как работает защита элементов цепи.

For Coderz - Нюансы Raycasting-а.

Sofтинка - Real Information Packer 0.2x - один из самых мощных компрессоров на ZX.

For Coderz - Автосборка программы. Оптимизируем процесс сборки.

Inferno - Вступление.

Others - Результаты анкетирования.

Others - The Compo. Об анкетировании.

О Спектруме - размышления о будущем спектрума.

Железо - Еще раз о защите микросхемы КР1818ВГ93.


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

Похожие статьи:
Пасха 1995 - как DEМON пасху отмечал :)
Game - Описание игры "Towdie".
Тема - Новый перекресток - кое-что из сложностей игры The Castle.
Новости - Hippiman/Conscience выпустил новогоднюю игру Dizzy Rescues Santa, Польский культуролог Пётр Марецки прислал большой опросник для будущей книги, Сергей Смирнов (Gogin) возродил свой проект по портированию игры Super Mario для Спектрума.
Gamedev - 3D проецирование пола/трассы в играх.

В этот день...   15 мая