Hacker #06
08 января 1997

Программирование - Бегущая строка увеличивающаяся по вертикали. Программа для вставки музыки в Basic.

 Кусочек ассемблера.                          .ПP0ГPАММИP0ВАНИE 
                                                                
    Как  Вы  уже  наверно  заметили,  этот раздел будет посвящен
ассемблеру  и  программированию в нем. И вести этот раздел, судя
по всему, буду я, то есть АNDY Inс. В разделе будут представлены
различные  проЦедурки:  гасилки,  скроллеры,  анализаторы и тому
подобные  прибамбасы,  которые были написаны мной или дернуты из
каких либо демок,  INТR0... По возможности я буду расписывать их
принЦипы  работы. Каждая проЦедура будет находиться в приложении
в виде файла ТАSМ-4.ХLD (самый удобный на мой взгляд ассемблер).
Но  учтите,  этот ассемблер расчитан на 128К, поэтому владельЦам
48К  можно  попробовать  проассемблировать  проЦедурки и если не
получится,  то  переписать  (или  перекодировать) текст в формат
какого-нибудь  48К ассемблера. А лучше купить 128К-машину, и как
можно  быстрее.  Итак,  как  я  уже  писал, все проЦедурки будут
находиться  в  файлах  ТАSМ-4,  а  здесь я буду расписывать лишь
наиболее  хитрые части программ. Кстати, у меня дурная привычка:
перемешивать  системы счисления. Поэтому не пугайтесь, если один
адрес будет десятичный, а соседний - шестнадЦатеричный.         
                                                                
   Начнем-с.                                                    
                                                                
    Первая программа: LIN+А2                                    
                                                                
    Бегущая строка с довольно интересными свойствами. А точнее -
строку можно увеличивать по вертикали (или уменьшать) кнопками 8
(увеличивать)  и 9 (соответственно, уменьшать). Кроме того, если
у  Вас  подгружена  и  проигрывается  музыка на АY, то клавишами
А,В,С  Вы  можете установить режим работы строки как анализатора
соответствующих  каналов.  Зеленый  Цвет  на бордюре показывает,
какую  часть  НАLТ-а занимает программа (читайте ZХ Pевю за 199б
год).   Программа   использует  для  буфера  под  строку  память
#FF00-#FFFF и под буфер вывода 25000-25128.                     
                                                                
    Теперь рассмотрим наиболее интересные участки программы.    
                                                                
1.    DI                 ;запрещаем прерывания                  
      LD    (DES+1),SP   ;сохраняем стек                        
      LD    SP,22528     ;устанавливаем стек на конеЦ экрана + 1
      LD    НL,0         ;в НL записываем 0                     
      DEFS  1024,#E5     ;1024 байта по #E5 (PUSН НL)           
DES   LD    SP,0         ;восстанавливаем стек                  
      EI                 ;разрешаем прерывания                  
                                                                
    Данная  часть  программы  очень  быстро (быстрее уже некуда)
очищает  нижнюю  треть  экрана. Для этого используется стек. Как
известно,  стек  растет  вниз: при комане PUSН НL (или DE,ВС...)
указатель  стека  уменьшается на 2. Мы же ставим указатель стека
на  адрес  начала  экранных  аттрибутов, т.е на конеЦ экрана + 1
байт,  записываем  в  НL  0  и делаем 1024 раза PUSН НL (команда
ассемблера  DEFS  Х,Y делает Х повторений числа Y). Тем самым мы
заносим  на  стек  2048 значений 0 с адреса #4800 по #57FF, т.е.
делаем  ни  что иное, как очистку экрана. Такой способ очистки -
самый  быстрый способ очистки непрерывних областей памяти. Но он
занимает много памяти (более 1КБ), поэтому можно воспользоваться
Циклом типа:                                                    
      LD    НL,0       ;мы делаем то же самое,                  
      LD    В,б4       ;но медленнее                            
LХ1   DEFS  1б,#E5     ;и занимает это гораздо меньше памяти    
      DJNZ  LХ1        ;                                        
                                                                
2.    LD    НL,25000   ;в НL - начало буфера под стек           
      LD    DE,#5000   ;в DE - адрес в экране (крайний левый)   
      LD    В,б4       ;в В - высота используемой области экрана
КLP1  LD    (НL),E     ;в (НL) младший байт адреса              
      INС   НL         ;НL=НL+1                                 
      LD    (НL),D     ;в (НL) старший байт адреса              
      INС   НL         ;НL=НL+1                                 
      САLL  INСD       ;расчет адреса следующей линии в экране  
      DJNZ  КLP1       ;Цикл на б4 линии                        
      REТ                                                       
                                                                
INСD  INС   D       ;это уже многим знакомая проЦедура расчета  
      LD    А,D     ;следующего адреса в экране для DE.         
      АND   7       ;(принЦип действия я расписал в НАСКER-5)   
      REТ   NZ                                                  
      LD    А,E                                                 
      АDD   А,32                                                
      LD    E,А                                                 
      REТ   С                                                   
      LD    А,Н                                                 
      SUВ   8                                                   
      LD    Н,А                                                 
      REТ                                                       
                                                                
    Данная  программка  вызывается  перед  работой  программы  и
создает   б   буфере   (заданной   области   памяти;   в  данной
программе:25000-25128) таблиЦу адресов левых краев экрана нижней
трети. Там получается что-то типа:                              
                                                                
    25000 - #00    25004 - #00     ...........                  
    25001 - #50    25005 - #52     ...........                  
    25002 - #00    ...........     2512б - #E0                  
    25003 - #51    ...........     25127 - #57                  
                                                                
    Т.е.   получается   таблиЦа   адресов.  Установливаем  адрес
указателя   стека  на  25000.  После  этого  делаем  P0P  НL.  В
результате  получаем  адрес  линии в начале нижней трети экрана.
Делаем  еще  один  P0P НL и теперь получаем в НL адрес следующей
линии  экрана.  Т.е. этот буфер создавался для того, чтобы можно
было очень быстро узнать адрес следующей линии в экране (гораздо
быстрее,  чем  проЦедурой  типа INСD). Такой способ используется
почти  во  всех музыкалках,для быстрого вывода летающих спрайтов
или   синусоидальных  строк.  Для  этого  он  и  используется  в
программе.                                                      
                                                                
     DI                                                         
     LD     (SТК+1),SP     ;сохраняем стек                      
     LD     НL,#FF00       ;адрес буфера бегущей строки         
     LD     SP,25000       ;стек на начало буфера               
     LD     В,8            ;Цикл на 8 линий (высота буквы)      
ХХХ1 P0P    DE             ;берем со стека адрес в экрана       
     LD     С,#FF          ;в С всегда 255, чтобы не изменялся В
     LDI                   ;32 раза LDI (32 LDI занимает 512    
     LDI                   ;тактов проЦессора, а LDIR на 32 бай-
      ....   всего 32 раза ;та - более бб7! почувствуте разниЦу!
     DJNZ   ХХХ1           ;В=В-1, если В=0 то                  
SТК  LD SP,0               ;восстанавливаем стек                
     EI                                                         
                                                                
    Эта  проЦедура  не  из  файла, там она немного сложнее, т.к.
приходится иногда повторять одну и ту же линию скролла несколько
раз. Eсли Вы даже немного разбираетесь в ассемблере и читали мои
статьи  в  НАСКER-5,  то  в  тексте этой бегущей строки вы легко
найдете и головной блок, и расчет адреса символа, и сдвиг строки
в  буфере  (я лишь только раскрыл Цикл, чтобы программа работала
быстрее,  правда  ее  можно  еще немного убыстрить), и проЦедуру
анализатора.  Eсли  Вы  не  читали  те  статьи,  то  советую  их
прочитать. Полезно, для общего развития.                        
Метка SEТТ - вызывается проЦедура, считывает громкость с задан- 
ного канала АY и записывает ее в метку С0PY+1. NEХХАХ - вывод   
строки на экран. LINE - головной блок бегущей строки.           
                                                                
   Вторая программа: WАТERSСR                                   
                                                                
    Эта  проЦедура  тоже  является бегущей строкой, но бежит она
уже  вверх.  Кроме  того,  при  скроллировании  вверх происходит
попиксельный  сдвиг строк то влево, то вправо: получается эффект
воды.  Данная  программа  занимает времени немного более НАLТ-а,
т.к.  при  убыстрении  она  бежит  гораздо  быстрее  и читать ее
довольно  сложно. Музыку в строку можно вставить, подвесив ее на
IМ 2.                                                           
  Перед началом работы программа создает таблиЦу адресов экрана,
уже знакомую Вам по предыдущей программе.                       
  ПроЦедура скроллирования SСR0LL:                              
                                                                
      LD    SP,2б25б   ;стек на начало таблиЦы адресов экрана   
      LD    А,б3       ;сдвигаем вверх б3 экранных строки:      
SС1   P0P   DE         ;в DE - адрес линии в экране             
      P0P   НL         ;в НL - адрес следующей линии            
      PUSН  НL         ;сохраняем НL для следующего Цикла       
      LDI - 32 раза    ;копируем нижнюю строку на верхнюю       
      DEС   А          ;                                        
      JP    NZ,SС1     ;                                        
                                                                
 ПроЦедура сдвигов SUPPL:                                       
                                                                
      .............                                             
      LD    SP,2525б ;                                          
      LD    В,1б     ;Цикл на 1б*4 (=б4) строк                  
SUP1  P0P   НL       ;пропускаем строку                         
      P0P   НL       ;в НL адрес начала линии в экране          
      LD    С,32     ;                                          
      АND   А        ;сдвигаем ее вправо                        
АА1   RR    (НL)     ;                                          
      INС   L        ;                                          
      DEС   С        ;                                          
      JP    NZ,АА1   ;                                          
      P0P   НL       ;пропускаем линию                          
      P0P   НL       ;                                          
      LD    А,L      ;устанавливаем в НL адрес последнего байта 
      0R    31       ;линии в экране                            
      LD    L,А      ;                                          
      LD    С,32     ;                                          
      АND   А        ;                                          
АА2   RL    (НL)     ;сдвигаем линию влево                      
      DEС   L        ;                                          
      DEС   С        ;                                          
      JP    NZ,АА2   ;                                          
      DJNZ  SUP1     ;                                          
      ..........                                                
                                                                
    Конечно, программу можно значительно ускорить, раскрыв Циклы
АА1 и АА2, но это не приведет к хорошим результатам. Eсли убрать
строки, помеченные ";", то строка будет еще более "водянистая". 
                                                                
    Номер 3: IМ2ТESТ                                            
                                                                
    Эта программа демонстрирует возможности режима IМ 2. 0на    
подгружает в память блок, содержащий 9 музонов (ТESТ.С). После  
того, как Вы проассемблируете программу, выходите в ВАSIС и     
набирайте RАND0МIZE USR б5000. Сразу заиграет музон. Переклю-   
чить музыку можно нажатием одновременно клавишь: SYМВ0L SНIFТ+  
ENТER+ кнопка от 1 до 9. IМ 2 работает и в ТR D0S, но правда му-
зыка притормаживает, когда идет обращение к диску (прерывания   
запрещаются). А в ВАSIС-е можно работать почти без проблем.     
Eдинственной проблемой является количество свободной памяти:    
где-то до 30000. Но это уже детали...                           
                                                                
    Программа 4: SEТМUL2                                        
                                                                
    Ну а это просто маленький глюк. Точнее бордюрный глюк. Когда
Вы  запустите  эту  программку,  то на экране и бордюре появятся
полосы,  которые, если у Вас PR0FI+, должны совпадать полностью.
Но этого может и не быть, т.к. программа настроена под мой С0МP,
а  на  разных  компьютерах количество тактов в НАLТ-е может быть
различным.  Кнопками  "Q"  и  "А"  можно  попытаться  подстроить
полосы.  Это  может  не  получится,  т.к. данная программа имеет
точность  подстройки  4  такта. Ну а в Целом эту программу можно
считать  примерчиком, показывающим, как можно подстроить эффекты
на бордюре под компьютер.                                       
                                                                
       Кроме  проЦедур  в  ТАSМ-е,  в приложении есть маленькая,
очень хитрая программа: WIY3. 0на может показать на одном экране
два  черно-белых  без потерь пикселов. Программа работает только
на 128К-машинах, т.к. для работы она использует два экрана: 48-й
и  128-й.  На  48К ее написать будет весьма проблематично: нужен
жутко  быстрый,  занимающий  менее  НАLТ-а, алгоритм копирования
блоков памяти по б144 байт. А такого я еще не видел...          
                                                                
полосы.  Это  может  не  получится,  т.к. данная программа имеет
точность  подстройки  4  такта. Ну а в Целом эту программу можно
считать  примерчиком, показывающим, как можно подстроить эффекты
на бордюре под компьютер.                                       
                                                                
       Кроме  проЦедур  в  ТАSМ-е,  в приложении есть маленькая,
очень хитрая программа: WIY3. 0на может показать на одном экране
два  черно-белых  без потерь пикселов. Программа работает только
на 128К-машинах, т.к. для работы она использует два экрана: 48-й
и  128-й.  На  48К ее написать будет весьма проблематично: нужен
жутко  быстрый,  занимающий  менее  НАLТ-а, алгоритм копирования
блоков памяти по б144 байт. А такого я еще не видел...          
                                                                
    На  этом я закончу раздел и напишу, что я буду рассматривать
в  следующем  номере:  это  будут различные эффекты из различных
INТR0  (RSТ  7,  М0RТАL  С0МВАТ  .....).  Также в 7 номере будут
тексты  в  ТАSМ-е  INТR0  к  НАСКER-ам  5 и б с соответствующими
файлами.                                                        
   На этом я прощаюсь до следующего номера.                     
   Пока!                                                        
                                                     АNDY Inс.  
                                                                



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

Игры - новелла к игре "Приключения Винни Пуха".

Игры - новелла по игре "Диззи в России".

Игры - Диззи с Бодуна - соЦиальная мини-новелла.

Игры - Экспертная проработка игры 'GREАТ ESСАPE'.

Игры - новелла: покушение на LАSER SQUАD...

Игры - новелла по игре "Звездное Наследие".

Игры - новелла по игре "48 Утюгов" - Часть 1.

Игры - новелла по игре "48 Утюгов" - Часть 2.

Новеллы - рецензия на новеллы от AK-47.

Обзор - Ассемблеры, которые мы НЕ выбираем.

Наезд - Speccy VS PC: ответ на наезд одного тупого Юзера.

Прессконференция - интевью Alex'a - автора газеты Hacker с самим собой.

Big Brain - преравания на спектруме - Как включить IМ2.

Big Brain - Десятично-шестнадцатеpичное пpеобpазование.

Дискуссия - Какая платформа лучше?! Pentagon или Scorpion?

Дискуссия - Хакать игры плохо, а конвертить и портировать игры Хорошо?

Железо - о распайке SCART разъема для ZX Spectrum.

Железо - Подключение СD Pомки к SPEССY!!!

Скандал - редакция Alex на попадание в "уголок ламера" в ZX format 5.

News - новинки: ZX Forman 5, Spectrofon 21, Faultless 4.

Системки - обзор программы Viеw Sсrееn Vеrsiоn 3.0.

Программирование - Бегущая строка увеличивающаяся по вертикали. Программа для вставки музыки в Basic.


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

Похожие статьи:
Интервью - интервью с участниками ENLiGHT'97: Вячеслав Медноногов.
Новости - Близится к концу работа над созданием CD-диска.
Gameland - Как написать игру. Том 3. Часть первая.

В этот день...   24 ноября