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

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

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


+-----------------------------+ 
|    --- ПРОГРАММИСТАМ ---    |#
+-----------------------------+#
  ##############################
                                
           ЧАСТь #2             
      -------------------       
                                
   Magic на Scorpion'e ZS 256   
  ----------------------------  
Вы наверное встречали таки прог-
раммы или игры в которых при на-
жатии на  кнопку Magic ничего не
происходит или  авторы этих про-
изведений   прикалываются , т.е.
если вы нажмете  на Magic, то на
экране  появляется    прикольная
надпись или что - то вроде того.
Так вот , если вы хотите сделать
тоже  такой  прикол и у вас есть
компьютер Scorpion ZS-256, то Вы
можете прочитать эту главу, а те
у  кого  нет  этого  компьютера,
могут   просто  пропустить  пару
страниц.                        
Для тех  кто  не знает как можно
переключать  банки памяти (стра-
ницы) я покажу как это делается.
Для переключения  страниц с 0 по
7 нужно использовать порт #7FFD.
Для   того   чтобы   переключить
2 страницу нужно записать в порт
#7FFD число #12 :               
( число  в   порт   записывается
командой OUT (С),А , где С-номер
порта , в аккумуляторе А-число )
                                
     LD    А,#12                
     LD    ВС,#7FFD             
     OUT   (С),А                
     RET                        
                                
При  помощи  этой  процедуры  Вы
можете  переключать  страницы  в
обычном ZX-Spectrum'е 128кб.    
+------------------------------+
|           Таблица            |
|          ---------           |
| страница    число которое вы |
|             будете записывать|
|             в порт #7FFD.    |
|    0              #10        |
|    1              #11        |
|    2              #12        |
|    З              #1З        |
|    4              #14        |
|    5              #15        |
|    6              #16        |
|    7              #17        |
+------------------------------+
Страница 5 всегда  расположена в
области #4000-#7FFF.            
Страница 2 в области #8000-#BFFF
А  в  области  #С000-#FFFF может
находиться  любая  из  страниц с
номером 0...7.                  
Для того чтобы переключить стра-
ницы  с  номерами  8...15  нужно
использовать дополнительный порт
#1FFD. Например, если  вы хотите
переключить 10  страницу, то вам
сначала   нужно   переключить  2
страницу, а затем записать число
#10 в порт #1FFD                
                                
     LD    А,#12    ;2 страница 
     LD    ВС,#7FFD             
     OUT   (С),А                
     LD    А,#10                
     LD    ВС,#1FFD             
     OUT   (С),А                
     RET                        
                                
В  результате  переключиться  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              
     OUT  (С),А                 
     RET                        
                                
Вместо LD А,0 можно использовать
XOR А  (обнуление аккумулятора).
                                
Если вы хотите чтобы при нажатии
на Magic компьютер просто завис,
то  можете воспользоваться  про-
цедурой:                        
                                
     LD    А,#10                
     LD    ВС,#7FFD             
     OUT   (С),А                
     LD    ВС,#1FFD             
     OUT   (С),А                
     LD    HL,#С000             
     LD    DE,#С001             
     LD    ВС,#ЗFFF             
     LD    (HL),0               
     LDIR                       
     LD    А,0                  
     LD    ВС,#1FFD             
     OUT   (С),А                
     RET                        
                                
Эта защита основана на затирании
8  страницы  ,  где  расположена
основная часть теневого монитора
Как она работает:               
Переключается 0 страница,затем 8
-ая  В HL устанавливаем адрес на
чала (буфера) 8 страницы. В DE -
адрес второго байта буфера. А ВС
- счетчик (длина страницы-#ЗFFF)
Командой LD (HL),0  очистили пер
вый байт буфера, а потом  перед-
винули все содержимое буфера на 
один байт и в итоге очистили вто
рой байт.                       
Во  время  работы  команды  LDIR
содержимое  HL,DE,ВС не остаются
неизменными.  После   переброски
каждого  очередного  байта HL  и
DE увеличивается  на  единицу, а
ВС   на   единицу   уменьшается.
Благодаря этому после переброски
первого байта  во второй, DE уже
укажет на третий,а HL "подхавит"
нулевой байт из  второй ячейки и
так далее.  В общем, весь  буфер
будет затерт. Вместо нуля можно 
использовать  любое  число  от 0
до 255 (#0-#FF).                
 Затем снова переключаестя 0-ая 
страница.                       
                                
Если вы хотите чтобы при нажатии
на Magic  запускалась ваша прог-
рамма  то эта  процедура как раз
для вас :                       
                                
     LD   HL,ADDR               
     LD   А,#10                 
     LD   ВС,#7FFD              
     OUT  (С),А                 
     LD   ВС,#1FFD              
     OUT  (С),А                 
     LD   А,255                 
     LD   (#СOбЗ),А             
     LD   (#С064),HL            
     XOR   А                    
     OUT  (С),А                 
     RET                        
ADDR DI                         
     IM   1                     
     LD   А,#10    ;нужная вам  
                   ; страница   
     LD   ВС,#7FFD              
     OUT  (С),А                 
     XOR  А                     
     LD   ВС,#1FFD              
     OUT  (С),А                 
     EI                         
; Начало вашей программы...     
                                
Как она работает:               
В  HL  загружается  адрес  вашей
программы. Переключается 8 стра-
ница. В аккумулятор А записываем
255 и  заносим  это  значение по
адресу #СOбЗ. Адрес  вашей прог-
раммы   записывается   в  #С064.
Переключается 0 страница.       
                                
    ИНВЕРТИРОВАНИЕ СИМВОЛА      
         ВЕРТИКАЛЬНО            
   ------------------------     
                                
Эта процедура инвертирует символ
вертикально .   Например    если
стрелка направлена вверх, должна
стать стрелкой,направленной вниз
и наоборот.                     
                                
     LD   HL,ADDR ;адрес символа
                  ;в ОЗУ (ПЗУ)  
     LD   D,Н                   
     LD   Е,L                   
     LD   В,8                   
LOP1 LD   А,(HL)                
     INC  HL                    
     PUSH AF                    
     DJNZ LOP1                  
     LD   В,8                   
LOP2 РОР  AF                    
     LD   (DE),А                
     INC  DE                    
     DJNZ LOP2                  
     RET                        
                                
Как она работает:               
  В пару регистров HL загружает-
ся адрес данных символа. Этот же
адрес  затем  копируется в DE. В
регистр В загружается значение 8
для использования регистра в ка-
честве счетчика.                
 Для каждого байта в аккумулятор
загружается имеющееся  в  насто-
ящий  момент значение. HL увели-
чивается, указывая  на следующей
байт, а содержимое  аккумулятора
помещается  на  стек.    Счетчик
уменьшается, и, если он не равен
0,  подпрограмма   возвращается,
чтобы повторить процесс для сле-
дующего байта. В регистр "В" по-
вторно  загружается  значение 8,
чтобы  снова использовать  его в
качестве  счетчика.  Изображение
символа   сохранено   на  стеке.
Процедура LOP2  возвращает  дан-
нные со стека на  то  же  знако-
место,но уже в обратном порядке.
Байт за байтом  берутся со стека
и через  аккумулятор  помещаются
по адресу, содержашемуся  в  DE.
DE увеличивается, чтобы  указать
на следующий  байт,  а   счетчик
уменьшается. Если он не равен 0,
процедура  возвращается  к LOP2.
В  противном   случае  процедура
завершает свою работу.          
                                
     ИНВЕРТИРОВАНИЕ СИМВОЛА     
         ГОРИЗОНТАЛЬНО          
    ------------------------    
                                
Эта процедура инвертирует символ
горизонтально. Если стрелка нап-
равлена влево,становится направ-
ленной вправо.                  
                                
     LD   HL,ADDR ;адрес символа
     LD   А,8                   
LOP1 LD   В,8                   
LOP2 RR   (HL)                  
     RL   С                     
     DJNZ LOP2                  
     LD   (HL),С                
     INC  HL                    
     DEC  А                     
     OR   А                     
     JR   NZ,LOP1               
     RET                        
                                
Как она работает:               
 В пару регистров HL загружается
адрес данных символа,а в аккуму-
лятор   загружается   количество
байтов, которые должны быть  ин-
вертированы.В регистр В загружа-
ется число битов в каждом  байте
он используется, как счетчик.   
Байт с адресом  в HL  сдвигается
вправо таким образом,что крайний
правый бит  копируется  во  флаг
переноса. С - регистр сдвигается
влево так, что флаг переноса ко-
пируется в  крайний правый  бит.
Счетчик уменьшается.            
Если счетчик не  равен 0, проис-
ходит  переход к LOP2 для работы
со следующем пикселом.          
Инвертированный   байт , который
находится в  регистре С, помеща-
ется в ячейку, из которой он был
взят.                           
  HL увеличивается, указывая  на
следующий  байт , а  аккумулятор
уменьшается.Если он не  равен 0,
происходит переход к LOP1, иначе
процедура завершает свою работу.
                                
    СДВИГ АТРИБуТОВ  ВЛЕВО      
   ------------------------     
                                
Эта процедура  сдвигает атрибуты
экрана на одно знакоместо влево.
                                
     LD    HL,22528             
     LD    А,* ;значение 0-255  
     LD    С,24                 
LOP1 LD    В,З1                 
LOP2 INC   HL                   
     LD    Е,(HL)               
     DEC   HL                   
     LD    (HL),Е               
     INC   HL                   
     DJNZ  LOP2                 
     LD    (HL),А               
     INC   HL                   
     DEC   С                    
     JR    NZ,LOP1              
     RET                        
                                
Как она работает:               
В пару  регистров HL загружается
адрес области атрибутов. Аккуму-
лятор загружается значением  ат-
рибута,вводимым в правую колонку
В регистр  С  загружается  коли-
чество строк для сдвига. В реги-
стр В заносится число на 1 мень-
шее,чем число символов в строке,
чтобы он использовался,как счет-
чик.HL увеличивается, чтобы ука-
зать   на   следующий   атрибут,
который загружается в Е-регистр.
HL уменьшается   и по  адресу HL
помещается значение  из  Е-реги-
стра. HL  увеличивается   вновь,
чтобы показать  на следующий ат-
рибут.Регистр  В  уменьшается и,
если он не  равен 0, то происхо-
дит  переход  к  LOP2. HL теперь
указывает на правую колонку и по
адресу HL помещается значение из
аккумулятора. HL  увеличивается,
чтобы   показать   на  следующую
строку.Счетчик строк уменьшается
и если он не равен 0,то происхо-
дит переход к LOP1, иначе проце-
дура завершает свою работу.     
                                
    СДВИГ АТРИБуТОВ ВПРАВО      
   ------------------------     
                                
Эта процедура  сдвигает атрибуты
экрана на одно знакоместо вправо
                                
     LD   HL,2З295              
     LD   А,* ;значение 0-255   
     LD   С,24                  
LOP1 LD   В,З1                  
LOP2 DEC  HL                    
     LD   Е,(HL)                
     INC  HL                    
     LD   (HL),Е                
     DEC  HL                    
     DJNZ LOP2                  
     LD   (HL),А                
     DEC  HL                    
     DEC  С                     
     JR   NZ,LOP1               
     RET                        
                                
Если вы разобрались с процедурой
"Сдвиг атрибутов влево" , то  вы
без труда разберетесь и  с  этой
процедурой.Эти процедуры  похожи
друг на друга и я не  стал пере-
писывать одно  и тоже  два раза.
Разбирайтесь сами.              
                                
   ПЕЧАТЬ СООБЩЕНИЯ НА ЭКРАНЕ   
  ----------------------------  
                                
Эта процедура поможет вам вывес-
ти на экран ваше сообщение.     
                                
      LD    А,2                 
      CALL  5бЗЗ                
      LD    HL,ТЕХТ             
      CALL  PRINT               
      RET                       
PRINT LD    А,(HL)              
      СР    255                 
      RET   Z                   
      RST   16                  
      INC   HL                  
      JR    PRINT               
ТЕХТ  DEFB  22,10,10            
      DEFM  "SCORPION ZS 256"   
      DEFB  255                 
                                
Как он работает:                
В   аккумулятор   А    загружаем
номер потока 2  (вывод на основ-
ной экран). Устанавливаем  поток
номер 2 при помощи  подпрограммы
расположеной  в  ПЗУ  по  адресу
5бЗЗ.В регистровую пару HL зано-
сим адрес вашего сообщения.Вызы-
ваем  процедуру PRINT. Эта  про-
цедура осуществляет вывод симво-
ла в текущий  поток  при  помощи
RST 16  (вывод символа в поток).
А сейчас  разберем с чего должно
начинаться и  заканчиваться ваше
сообщение. В этом примере первым
стоит код  управлением  позицией
печати АТ.Как в обычном  BASIC'е
после него указываются координа-
ты   печати.  Сообщение   должно
заканчиватся кодом 255.         
                                
   ВВОД СИМВОЛА C КЛАВИАТуРЫ    
  ---------------------------   
                                
Для опроса клавиатуры чаще всего
используют переменную 2З560, она
содержит код  последней  нажатой
клавиши.                        
                                
     XOR   А                    
     LD    (2З560),А            
KLOP LD    А,(2З560)            
     OR    А                    
     JR    Z,KLOP               
     RET                        
                                
Как она работает:               
Обнуляем   аккумулятор , заносим
его значение в переменную 2З560.
Проверяем эту переменную  на  0,
если она  равна 0, то происходит
переход к KLOP.                 
Так будет продолжаться без конца
пока  не будет нажата какая либо
клавиша.                        
                                
       ЗВуКОВОЙ СИГНАЛ          
      -----------------         
                                
Подпрограмма расположена в ПЗУ с
адреса 949 (#OЗВ5).             
Перед вызовом подпрограммы необ-
ходимо занести в регистровы пары
HL и DE значение  от 0 до 655З5,
пропорциональные,соответственно,
частоте  звукового сигнала и его
длительности.При этом нужно учи-
тывать   линейную    зависимость
между частотой и длительностью -
чем выше тон, тем  короче  звук.
Необходимые значения рассчитыва-
ются следующем образом :        
HL=(4З7500/f)-З0.125   DE=f*t   
где f-частота в Гц,t-время в сек
Например, для  воспроизведения в
течении 1  секунды  ноты  <<ДО>>
первой октавы  (частота примерно
261 Гц) в HL помещаем число 1646
а в DE число 261.               
                                
     LD   HL,1646               
     LD   DE,261                
     CALL 949                   
     RET                        
                                
                                
   Текст написал Когун Олег.    
        из ChemneSoft+          
__________________________________________



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

От редакции - второй номер журнала "ТНЕ 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 и дисковода.


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

Похожие статьи:
Кто там кодит? - Chanky flame: описание алгоритма чанкового огня.
GFX - Фотореализм: способы передать ненасыщенные цвета, присущие реальным фотографиям
Новости - Челябинск: X-Raizor вернулся на спектрум, Wocen пишет boot, Blade отдахыет, Steelzer вступил в Triumph, Crite доделал альфа версию "Мира тьмы", Bytic купил GS, Edison делает сайт, Ironman хочет купить спектрум.
Epilogue - эпилог.
WANTED - Розыск программ...

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