Star #02
12 октября 1996

Программистам - Magic на Scorpion`e, инвертирование символа вертикально, инвертирование символа горизонтально, сдвиг атрибутов влево, сдвиг атрибутов вправо, печать сообщение, ввод символа, звуковой сигнал.



+-----------------------------+ 
|    --- ПРОГРАММИСТАМ ---    |#
+-----------------------------+#
  ##############################
                                
           ЧАСТb #2             
      -------------------       
                                
   Magic нa Scorрion'e ZS 256   
  ----------------------------  
Вы наверное встречали таки прог-
раммы или игры в которых при на-
жатии на  кнопку Маgiс ничего не
происходит или  авторы этих про-
изведений   прикалываются , т.е.
если вы нажмете  на Маgiс, то на
экране  появляется    прикольная
надпись или что - то вроде того.
Так вот , если вы хотите сделать
тоже  такой  прикол и у вас есть
компьютер Sсоrрiоn ZS-256, то Вы
можете прочитать эту главу, а те
у  кого  нет  этого  компьютера,
могут   просто  пропустить  пару
страниц.                        
Для тех  кто  не знает как можно
переключать  банки памяти (стра-
ницы) я покажу как это делается.
Для переключения  страниц с 0 по
7 нужно использовать порт #7FFD.
Для   того   чтобы   переключить
2 страницу нужно записать в порт
#7FFD число #12 :               
( число  в   порт   записывается
командой ОUТ (С),А , где С-номер
порта , в аккумуляторе А-число )
                                
     LD    А,#12                
     LD    ВС,#7FFD             
     ОUТ   (С),А                
     RЕТ                        
                                
При  помощи  этой  процедуры  Вы
можете  переключать  страницы  в
обычном ZХ-Sрeсtrum'е 128кб.    
+------------------------------+
|           Таблица            |
|          ---------           |
| страница    число которое вы |
|             будете записывать|
|             в порт #7FFD.    |
|    0              #10        |
|    1              #11        |
|    2              #12        |
|    З              #1З        |
|    4              #14        |
|    5              #15        |
|    6              #16        |
|    7              #17        |
+------------------------------+
Страница 5 всегда  расположена в
области #4000-#7FFF.            
Страница 2 в области #8000-#ВFFF
А  в  области  #С000-#FFFF может
находиться  любая  из  страниц с
номером 0...7.                  
Для того чтобы переключить стра-
ницы  с  номерами  8...15  нужно
использовать дополнительный порт
#1FFD. Например, если  вы хотите
переключить 10  страницу, то вам
сначала   нужно   переключить  2
страницу, а затем записать число
#10 в порт #1FFD                
                                
     LD    А,#12    ;2 страница 
     LD    ВС,#7FFD             
     ОUТ   (С),А                
     LD    А,#10                
     LD    ВС,#1FFD             
     ОUТ   (С),А                
     RЕТ                        
                                
В  результате  переключиться  10
страница - 8+2=10.              
+------------------------------+
|          Таблица #2          |
|         ------------         |
|дополнитель-  нужно сначала   |
|ные страницы   переключить    |
|                страницу:     |
|  8  (0+8=8)       0          |
|  9  (1+8=9)       1          |
| 10  (2+8=10)      2          |
| 11  (З+8=11)      З          |
| 12  (4+8=12)      4          |
| 1З  (5+8=1З)      5          |
| 14  (6+8=14)      6          |
| 15  (7+8=15)      7          |
|              а затем записать|
|              #10 в порт #1FFD|
+------------------------------+
Если  переключена 10 страница  и
вы хотите обратно  переключить 2
страницу, то просто  нужно запи-
сать 0 (ноль) в порт #1FFD.     
                                
     LD   А,0                   
     LD   ВС,#1FFD              
     ОUТ  (С),А                 
     RЕТ                        
                                
Вместо LD А,0 можно использовать
ХОR А  (обнуление аккумулятора).
                                
Если вы хотите чтобы при нажатии
на Маgiс компьютер просто завис,
то  можете воспользоваться  про-
цедурой:                        
                                
     LD    А,#10                
     LD    ВС,#7FFD             
     ОUТ   (С),А                
     LD    ВС,#1FFD             
     ОUТ   (С),А                
     LD    НL,#С000             
     LD    DЕ,#С001             
     LD    ВС,#ЗFFF             
     LD    (НL),0               
     LDIR                       
     LD    А,0                  
     LD    ВС,#1FFD             
     ОUТ   (С),А                
     RЕТ                        
                                
Эта защита основана на затирании
8  страницы  ,  где  расположена
основная часть теневого монитора
Как она работает:               
Переключается 0 страница,затем 8
-ая  В НL устанавливаем адрес на
чала (буфера) 8 страницы. В DЕ -
адрес второго байта буфера. А ВС
- счетчик (длина страницы-#ЗFFF)
Командой LD (НL),0  очистили пер
вый байт буфера, а потом  перед-
винули все содержимое буфера на 
один байт и в итоге очистили вто
рой байт.                       
Во  время  работы  команды  LDIR
содержимое  НL,DЕ,ВС не остаются
неизменными.  После   переброски
каждого  очередного  байта НL  и
DЕ увеличивается  на  единицу, а
ВС   на   единицу   уменьшается.
Благодаря этому после переброски
первого байта  во второй, DЕ уже
укажет на третий,а НL "подхавит"
нулевой байт из  второй ячейки и
так далее.  В общем, весь  буфер
будет затерт. Вместо нуля можно 
использовать  любое  число  от 0
до 255 (#0-#FF).                
 Затем снова переключаестя 0-ая 
страница.                       
                                
Если вы хотите чтобы при нажатии
на Маgiс  запускалась ваша прог-
рамма  то эта  процедура как раз
для вас :                       
                                
     LD   НL,АDDR               
     LD   А,#10                 
     LD   ВС,#7FFD              
     ОUТ  (С),А                 
     LD   ВС,#1FFD              
     ОUТ  (С),А                 
     LD   А,255                 
     LD   (#С06З),А             
     LD   (#С064),НL            
     ХОR   А                    
     ОUТ  (С),А                 
     RЕТ                        
АDDR DI                         
     IМ   1                     
     LD   А,#10    ;нужная вам  
                   ; страница   
     LD   ВС,#7FFD              
     ОUТ  (С),А                 
     ХОR  А                     
     LD   ВС,#1FFD              
     ОUТ  (С),А                 
     ЕI                         
; Начало вашей программы...     
                                
Как она работает:               
В  НL  загружается  адрес  вашей
программы. Переключается 8 стра-
ница. В аккумулятор А записываем
255 и  заносим  это  значение по
адресу #С06З. Адрес  вашей прог-
раммы   записывается   в  #С064.
Переключается 0 страница.       
                                
    ИНВEPTИPОВАНИE CИMВОЛА      
         ВEPTИКАЛЬНО            
   ------------------------     
                                
Эта процедура инвертирует символ
вертикально .   Например    если
стрелка направлена вверх, должна
стать стрелкой,направленной вниз
и наоборот.                     
                                
     LD   НL,АDDR ;адрес символа
                  ;в ОЗУ (ПЗУ)  
     LD   D,Н                   
     LD   Е,L                   
     LD   В,8                   
LОР1 LD   А,(НL)                
     INС  НL                    
     РUSН АF                    
     DJNZ LОР1                  
     LD   В,8                   
LОР2 РОР  АF                    
     LD   (DЕ),А                
     INС  DЕ                    
     DJNZ LОР2                  
     RЕТ                        
                                
Как она работает:               
  В пару регистров НL загружает-
ся адрес данных символа. Этот же
адрес  затем  копируется в DЕ. В
регистр В загружается значение 8
для использования регистра в ка-
честве счетчика.                
 Для каждого байта в аккумулятор
загружается имеющееся  в  насто-
ящий  момент значение. НL увели-
чивается, указывая  на следующей
байт, а содержимое  аккумулятора
помещается  на  стек.    Счетчик
уменьшается, и, если он не равен
0,  подпрограмма   возвращается,
чтобы повторить процесс для сле-
дующего байта. В регистр "В" по-
вторно  загружается  значение 8,
чтобы  снова использовать  его в
качестве  счетчика.  Изображение
символа   сохранено   на  стеке.
Процедура LОР2  возвращает  дан-
нные со стека на  то  же  знако-
место,но уже в обратном порядке.
Байт за байтом  берутся со стека
и через  аккумулятор  помещаются
по адресу, содержашемуся  в  DЕ.
DЕ увеличивается, чтобы  указать
на следующий  байт,  а   счетчик
уменьшается. Если он не равен 0,
процедура  возвращается  к LОР2.
В  противном   случае  процедура
завершает свою работу.          
                                
     ИНВEPTИPОВАНИE CИMВОЛА     
         ГОPИЗОНTАЛЬНО          
    ------------------------    
                                
Эта процедура инвертирует символ
горизонтально. Если стрелка нап-
равлена влево,становится направ-
ленной вправо.                  
                                
     LD   НL,АDDR ;адрес символа
     LD   А,8                   
LОР1 LD   В,8                   
LОР2 RR   (НL)                  
     RL   С                     
     DJNZ LОР2                  
     LD   (НL),С                
     INС  НL                    
     DЕС  А                     
     ОR   А                     
     JR   NZ,LОР1               
     RЕТ                        
                                
Как она работает:               
 В пару регистров НL загружается
адрес данных символа,а в аккуму-
лятор   загружается   количество
байтов, которые должны быть  ин-
вертированы.В регистр В загружа-
ется число битов в каждом  байте
он используется, как счетчик.   
Байт с адресом  в НL  сдвигается
вправо таким образом,что крайний
правый бит  копируется  во  флаг
переноса. С - регистр сдвигается
влево так, что флаг переноса ко-
пируется в  крайний правый  бит.
Счетчик уменьшается.            
Если счетчик не  равен 0, проис-
ходит  переход к LОР2 для работы
со следующем пикселом.          
Инвертированный   байт , который
находится в  регистре С, помеща-
ется в ячейку, из которой он был
взят.                           
  НL увеличивается, указывая  на
следующий  байт , а  аккумулятор
уменьшается.Если он не  равен 0,
происходит переход к LОР1, иначе
процедура завершает свою работу.
                                
    CДВИГ АTPИБуTОВ  ВЛEВО      
   ------------------------     
                                
Эта процедура  сдвигает атрибуты
экрана на одно знакоместо влево.
                                
     LD    НL,22528             
     LD    А,* ;значение 0-255  
     LD    С,24                 
LОР1 LD    В,З1                 
LОР2 INС   НL                   
     LD    Е,(НL)               
     DЕС   НL                   
     LD    (НL),Е               
     INС   НL                   
     DJNZ  LОР2                 
     LD    (НL),А               
     INС   НL                   
     DЕС   С                    
     JR    NZ,LОР1              
     RЕТ                        
                                
Как она работает:               
В пару  регистров НL загружается
адрес области атрибутов. Аккуму-
лятор загружается значением  ат-
рибута,вводимым в правую колонку
В регистр  С  загружается  коли-
чество строк для сдвига. В реги-
стр В заносится число на 1 мень-
шее,чем число символов в строке,
чтобы он использовался,как счет-
чик.НL увеличивается, чтобы ука-
зать   на   следующий   атрибут,
который загружается в Е-регистр.
НL уменьшается   и по  адресу НL
помещается значение  из  Е-реги-
стра. НL  увеличивается   вновь,
чтобы показать  на следующий ат-
рибут.Регистр  В  уменьшается и,
если он не  равен 0, то происхо-
дит  переход  к  LОР2. НL теперь
указывает на правую колонку и по
адресу НL помещается значение из
аккумулятора. НL  увеличивается,
чтобы   показать   на  следующую
строку.Счетчик строк уменьшается
и если он не равен 0,то происхо-
дит переход к LОР1, иначе проце-
дура завершает свою работу.     
                                
    CДВИГ АTPИБуTОВ ВПPАВО      
   ------------------------     
                                
Эта процедура  сдвигает атрибуты
экрана на одно знакоместо вправо
                                
     LD   НL,2З295              
     LD   А,* ;значение 0-255   
     LD   С,24                  
LОР1 LD   В,З1                  
LОР2 DЕС  НL                    
     LD   Е,(НL)                
     INС  НL                    
     LD   (НL),Е                
     DЕС  НL                    
     DJNZ LОР2                  
     LD   (НL),А                
     DЕС  НL                    
     DЕС  С                     
     JR   NZ,LОР1               
     RЕТ                        
                                
Если вы разобрались с процедурой
"Сдвиг атрибутов влево" , то  вы
без труда разберетесь и  с  этой
процедурой.Эти процедуры  похожи
друг на друга и я не  стал пере-
писывать одно  и тоже  два раза.
Разбирайтесь сами.              
                                
   ПEЧАTЬ CООБЩEНИЯ НА ЭКPАНE   
  ----------------------------  
                                
Эта процедура поможет вам вывес-
ти на экран ваше сообщение.     
                                
      LD    А,2                 
      САLL  56ЗЗ                
      LD    НL,ТЕХТ             
      САLL  РRINТ               
      RЕТ                       
РRINТ LD    А,(НL)              
      СР    255                 
      RЕТ   Z                   
      RSТ   16                  
      INС   НL                  
      JR    РRINТ               
ТЕХТ  DЕFВ  22,10,10            
      DЕFМ  "SСОRРIОN ZS 256"   
      DЕFВ  255                 
                                
Как он работает:                
В   аккумулятор   А    загружаем
номер потока 2  (вывод на основ-
ной экран). Устанавливаем  поток
номер 2 при помощи  подпрограммы
расположеной  в  ПЗУ  по  адресу
56ЗЗ.В регистровую пару НL зано-
сим адрес вашего сообщения.Вызы-
ваем  процедуру РRINТ. Эта  про-
цедура осуществляет вывод симво-
ла в текущий  поток  при  помощи
RSТ 16  (вывод символа в поток).
А сейчас  разберем с чего должно
начинаться и  заканчиваться ваше
сообщение. В этом примере первым
стоит код  управлением  позицией
печати АТ.Как в обычном  ВАSIС'е
после него указываются координа-
ты   печати.  Сообщение   должно
заканчиватся кодом 255.         
                                
   ВВОД CИMВОЛА C КЛАВИАTуPЫ    
  ---------------------------   
                                
Для опроса клавиатуры чаще всего
используют переменную 2З560, она
содержит код  последней  нажатой
клавиши.                        
                                
     ХОR   А                    
     LD    (2З560),А            
КLОР LD    А,(2З560)            
     ОR    А                    
     JR    Z,КLОР               
     RЕТ                        
                                
Как она работает:               
Обнуляем   аккумулятор , заносим
его значение в переменную 2З560.
Проверяем эту переменную  на  0,
если она  равна 0, то происходит
переход к КLОР.                 
Так будет продолжаться без конца
пока  не будет нажата какая либо
клавиша.                        
                                
       ЗВуКОВОЙ CИГНАЛ          
      -----------------         
                                
Подпрограмма расположена в ПЗУ с
адреса 949 (#0ЗВ5).             
Перед вызовом подпрограммы необ-
ходимо занести в регистровы пары
НL и DЕ значение  от 0 до 655З5,
пропорциональные,соответственно,
частоте  звукового сигнала и его
длительности.При этом нужно учи-
тывать   линейную    зависимость
между частотой и длительностью -
чем выше тон, тем  короче  звук.
Необходимые значения рассчитыва-
ются следующем образом :        
НL=(4З7500/f)-З0.125   DЕ=f*t   
где f-частота в Гц,t-время в сек
Например, для  воспроизведения в
течении 1  секунды  ноты  <<ДО>>
первой октавы  (частота примерно
261 Гц) в НL помещаем число 1646
а в DЕ число 261.               
                                
     LD   НL,1646               
     LD   DЕ,261                
     САLL 949                   
     RЕТ                        
                                
                                
   Текст написал Когун Олег.    
        из СhemneSоft+          
__________________________________________



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

От редакции - второй номер журнала "ТНЕ SТАR".

Юмор - Анекдоты и байки.

Программистам - Magic на Scorpion`e, инвертирование символа вертикально, инвертирование символа горизонтально, сдвиг атрибутов влево, сдвиг атрибутов вправо, печать сообщение, ввод символа, звуковой сигнал.

Система - Телефонный Справочник, ZХ-UNZIР.

Хит парад - Хит-парад журналов.

Новинки - Mortal kombat demo, Paradise lost demo, НЛО-2, Double xinox.

Игрушки - Star glider, The muncher eats chewits, Kliatwa noci, CHEAT`S.

Реклама

Разное - "О компьютерах", доработка ZS-Scorpion 256 и дисковода.


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

Похожие статьи:
Реклама - Ремонт компьютеров, дисководов , мониторов, принтеров и т.д.
Система - исправленная и доработанная схема турбирования ВГ-93.
Party - отчет об Ижевском пати ASCII 2004.

В этот день...   24 июня