ZX Format #08
31 декабря 1997

Программистам - IRIS: Описание и разбор эффекта.

<b>Программистам</b> - IRIS: Описание и разбор эффекта.
IRIS.ss            
                               
music by IRONMAN               
(C)Иван Рощин, Москва, 1998    
_______________________________
                               
   Впервые увидев этот красивый эффект на
PC  в программе Dos Navigator (screen sa-
ver 'iris.ss') я перенес его на Спектрум.
Вот  полный  текст программы с подробными
комментариями:                           
                               
M_X     EQU     7   ;     Масштаб по X                        
M_Y     EQU     7   ;     Масштаб по Y                        
                               
        ORG     #6000                                         
                               
;Устанавливаем атрибуты:                                      
                               
        HALT                                                  
        LD      HL,#5800                                      
        LD      DE,#5801                                      
        LD      BC,#2FF                                       
        LD      (HL),L                                        
        LDIR                                                  
                               
;Рисуем сетку:                                                
                               
        LD      HL,#4000                                      
LP1     LD      A,%01010101                                   
        BIT     0,H                                           
        JR      NZ,NE_FF                                      
        CPL                                                   
NE_FF   LD      (HL),A                                        
        INC     HL                                            
        LD      A,H                                           
        CP      #58                                           
        JR      NZ,LP1                                        
                               
;Главный цикл:                                                
                               
MAIN_LP LD      IX,BUFER+#2FF                                 
                               
;Буфер заполняется "от конца к началу",                       
и в таком же порядке будет выводиться                         
;на экран в процедуре TO_SCR.                                 
                               
        LD      H,TAB/#100                                    
        LD      DE,(M_3)                                      
        LD      A,24                                          
                               
LOOP_V  EX      AF,AF'                                        
        LD      BC,(M_1)                                      
        EXX                                                   
        LD      B,32                                          
                               
LOOP_H  EXX                                                   
        LD      A,(MEM_BP)                                    
        LD      L,C                                           
        ADD     A,(HL)                                        
        LD      L,B                                           
        ADD     A,(HL)                                        
        LD      L,E                                           
        ADD     A,(HL)                                        
        LD      L,D                                           
        ADD     A,(HL)                                        
        AND     #7F                                           
                               
;Старший бит аккумулятора обнулен, и буфер заполняется значе- 
;ниями #00-#7F. Это пригодится в процедуре TO_SCR.            
                               
        LD      (IX),A                                        
        DEC     IX                                            
                               
        INC     C     ;     !                                 
ADR_MX  LD      A,M_X                                         
        ADD     A,B                                           
        LD      B,A                                           
                               
        EXX                                                   
        DJNZ    LOOP_H                                        
                               
        EXX                                                   
                               
ADR_MY  LD      A,M_Y                                         
        ADD     A,E                                           
        LD      E,A                                           
        INC     D     ;     !                                 
                               
        EX      AF,AF'                                        
        DEC     A                                             
        JP      NZ,LOOP_V                                     
                               
        LD      HL,(MEM_BP)                                   
        DEC     HL          ;     !!                          
        LD      (MEM_BP),HL                                   
                               
        LD      A,L                                           
        XOR     H                                             
        LD      HL,BUFER+#2FF                                 
        XOR     (HL)                                          
        XOR     E                                             
        XOR     C                                             
        ADD     A,D                                           
        ADD     A,B                                           
        LD      B,A                                           
                               
        LD      HL,NAPR                                       
        AND     3                                             
        LD      D,0                                           
        LD      E,A                                           
        ADD     HL,DE                                         
        LD      A,(HL)                                        
                               
        BIT     3,B                                           
        JR      NZ,TO_DEC                                     
                               
        CP      3                                             
        JP      P,TO_END                                      
        INC     (HL)                                          
        JR      TO_END                                        
                               
TO_DEC  CP      #FD                                           
        JP      M,TO_END                                      
        DEC     (HL)                                          
                               
TO_END  LD      A,(NAPR)                                      
        LD      HL,M_1                                        
        ADD     A,(HL)                                        
        LD      (HL),A                                        
                               
        LD      A,(M_2)                                       
        LD      HL,NAPR+1                                     
        SBC     A,(HL)                                        
        LD      (M_2),A                                       
                               
        LD      A,(NAPR+2)                                    
        LD      HL,M_3                                        
        ADD     A,(HL)                                        
        LD      (HL),A                                        
                               
        LD      A,(M_4)                                       
        LD      HL,NAPR+3                                     
        SBC     A,(HL)                                        
        LD      (M_4),A                                       
                               
        CALL    TO_SCR  ;     Вывод на экран                  
                               
        XOR     A       ;     Что-то                          
        IN      A,(254) ;     нажато?                         
        CPL                                                   
        AND     31                                            
        JR      NZ,OBR_Z                                      
                               
;Если не нажато, восстанавливаем масштаб по X и Y:            
                               
        CALL    INC_M                                         
        JP      MAIN_LP                                       
                               
;Нажата клавиша Z (Zoom) ?                                    
                               
OBR_Z   LD      A,#FE                                         
        IN      A,(254)                                       
        BIT     1,A                                           
        RET     NZ   ;     Если нет - выходим                 
                               
;Если нажата - изменяем масштаб:                              
                               
        CALL    DEC_M                                         
        JP      MAIN_LP                                       
                               
MEM_BP  DW  0                                                 
M_1     DB  0                                                 
M_2     DB  0                                                 
M_3     DB  0                                                 
M_4     DB  0                                                 
NAPR    DB  2,1,3,4                                           
                               
;Процедуры INC_M и DEC_M увеличивают и уменьшают масштаб:     
                               
INC_M   LD      HL,ADR_MX+1                                   
        LD      A,(HL)                                        
        CP      M_X                                           
        JR      NC,INC_Y                                      
        INC     (HL)                                          
INC_Y   LD      HL,ADR_MY+1                                   
        LD      A,(HL)                                        
        CP      M_Y                                           
        RET     NC                                            
        INC     (HL)                                          
        RET                                                   
                               
DEC_M   LD      HL,ADR_MX+1                                   
        LD      A,(HL)                                        
        AND     A                                             
        JR      Z,DEC_Y                                       
        DEC     (HL)                                          
DEC_Y   LD      HL,ADR_MY+1                                   
        LD      A,(HL)                                        
        AND     A                                             
        RET     Z                                             
        DEC     (HL)                                          
        RET                                                   
                               
;Процедура TO_SCR перекодирует байты из буфера с помощью па-  
;литры и выводит результат в файл атрибутов:                  
                               
TO_SCR  LD      HL,PALETTE    ;     палитра                   
        LD      DE,#5800      ;     экран                     
        LD BC,BUFER+#2FF      ;     конец буфе-               
                               ;ра                            
                               
        HALT                                                  
LP_S    LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
                               
;T.е.  берем  байт из буфера и помещаем в регистр L. Это будет
;смещение  в палитре (вот почему она должна начинаться с адре-
;са,  кратного #100). Команда LDI возьмет байт из палитры (HL)
;и  поместит на экран по адресу (DE), который увеличится на 1.
;Положение  в  буфере  (BC)  уменьшится на 1. То, что HL также
;увеличивается на 1, никакой роли не играет, т.к. H не изменя-
;ется (потому что в буфере находятся значения 0..#7F), а L все
;равно изменится на следующем шаге.                           
                               
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,(BC)                                        
        LD      L,A                                           
        LDI                                                   
        LD      A,D                                           
        CP      #5B                                           
        JP      NZ,LP_S                                       
                               
        RET                                                   
                               
;Вспомогательные буферы и таблицы:                            
                               
        ORG     #C000                                         
                               
;Вспомогательная таблица, начинается с адреса, кратного #100: 
                               
TAB     DB #40,#40,#40,#40,#40,#40,#40,#40                    
        DB #3F,#3F,#3F,#3F,#3F,#3E,#3E,#3E                    
        DB #3E,#3D,#3D,#3D,#3C,#3C,#3B,#3B                    
        DB #3B,#3A,#3A,#39,#39,#38,#38,#37                    
        DB #37,#3б,#35,#35,#34,#34,#33,#32                    
        DB #32,#31,#30,#30,#2F,#2E,#2E,#2D                    
        DB #2C,#2C,#2B,#2A,#29,#29,#28,#27                    
        DB #2б,#25,#25,#24,#23,#22,#22,#21                    
        DB #20,#1F,#1E,#1E,#1D,#1C,#1B,#1B                    
        DB #1A,#19,#18,#17,#17,#1б,#15,#14                    
        DB #14,#13,#12,#12,#11,#10,#10,#0F                    
        DB #0E,#0E,#0D,#0C,#0C,#0B,#0B,#0A                    
        DB #09,#09,#08,#08,#07,#07,#0б,#0б                    
        DB #05,#05,#05,#04,#04,#03,#03,#03                    
        DB #02,#02,#02,#02,#01,#01,#01,#01                    
        DB #01,#00,#00,#00,#00,#00,#00,#00                    
        DB #00,#00,#00,#00,#00,#00,#00,#00                    
        DB #01,#01,#01,#01,#01,#02,#02,#02                    
        DB #02,#03,#03,#03,#04,#04,#05,#05                    
        DB #05,#0б,#0б,#07,#07,#08,#08,#09                    
        DB #09,#0A,#0B,#0B,#0C,#0C,#0D,#0E                    
        DB #0E,#0F,#10,#10,#11,#12,#12,#13                    
        DB #14,#14,#15,#1б,#17,#17,#18,#19                    
        DB #1A,#1B,#1B,#1C,#1D,#1E,#1E,#1F                    
        DB #20,#21,#22,#22,#23,#24,#25,#25                    
        DB #2б,#27,#28,#29,#29,#2A,#2B,#2C                    
        DB #2C,#2D,#2E,#2E,#2F,#30,#30,#31                    
        DB #32,#32,#33,#34,#34,#35,#35,#3б                    
        DB #37,#37,#38,#38,#39,#39,#3A,#3A                    
        DB #3B,#3B,#3B,#3C,#3C,#3D,#3D,#3D                    
        DB #3E,#3E,#3E,#3E,#3F,#3F,#3F,#3F                    
        DB #3F,#40,#40,#40,#40,#40,#40,#40                    
                               
;Палитра, определяющая цвет эффекта, начинается с адреса,     
;кратного #100:                                               
                               
PALETTE DB #09,#09,#09,#09,#09,#09,#09,#09                    
        DB #09,#09,#09,#0B,#0B,#0B,#0B,#0B                    
        DB #0B,#0B,#0B,#0B,#0B,#0B,#1B,#1B                    
        DB #1B,#1B,#1B,#1B,#1B,#1B,#1B,#1B                    
        DB #1A,#1A,#1A,#1A,#1A,#1A,#1A,#1A                    
        DB #1A,#1A,#1A,#12,#12,#12,#12,#12                    
        DB #12,#12,#12,#12,#12,#12,#1б,#1б                    
        DB #1б,#1б,#1б,#1б,#1б,#1б,#1б,#1б                    
        DB #3б,#3б,#3б,#3б,#3б,#3б,#3б,#3б                    
        DB #3б,#3б,#3б,#34,#34,#34,#34,#34                    
        DB #34,#34,#34,#34,#34,#34,#24,#24                    
        DB #24,#24,#24,#24,#24,#24,#24,#24                    
        DB #25,#25,#25,#25,#25,#25,#25,#25                    
        DB #25,#25,#25,#2D,#2D,#2D,#2D,#2D                    
        DB #2D,#2D,#2D,#2D,#2D,#2D,#29,#29                    
        DB #29,#29,#29,#29,#29,#29,#29,#29                    
                               
;Промежуточный буфер, может начинаться с любого адреса:       
                               
BUFER   DS  #300                                              
             _____             
                               
   Как  можно экспериментировать  с  этой
программой:                              
   - изменить  масштаб  (константы  M_X и
M_Y). Это можно сделать и непосредственно
во время работы программы, нажав  клавишу
'Z'.                                     
   -  вместо  команд INC C и INC D, поме-
ченных "!", можно поставить команды, уве-
личивающиe (или уменьшающие) регистры C и
D не на 1, а на любое другое число.      
   -  команду  DEC  HL,  помеченную "!!",
можно  заменить на несколько таких команд
(или, например, команд INC HL).          
   - изменить содержимое таблицы ТАВ.    
   -  изменить набор цветов с помощью па-
литры (массив PALETTE).                  
   Можно  изменять все указанные выше па-
раметры и непосредственно во время работы
программы,  если сделать ee самoмoдифици-
рующeйся.                                
                               
_______________________________



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

Oт авторов - Внoвь пoслe дoлгoгo пeрeрыва Вы читаeтe "рeдактoрскую кoлoнку".

Авторы журнала - ZX-Format No.8

Содержание номера - краткое содержание журнала ZX-Format No.8

Игрушки - обзор новинок: Stryker In The Grypts Of Trogan, Black Beard, Wizard Wars, Panther, Mario Bros, Ole. Toro!, Flip It!, Угoлки, Battlefield Germany.

Игрушки - Адвентюры: The Boggit. Он же болотник. Памяти пoчившeй пoлиграфичeскoй вeрсии ZX-Peвю пoсвящаeтся...

Игрушки - Адвентюры: Детали. Мысли на околоадвентюрные темы.

Игрушки - Lone Wolf: Новелла по игре.

Игрушки - По полочкам: Чeрный ворон - описание эпизодов.

Программистам - Basic - 8: Окончание описания Beta-Basic. Мeга-Бeйсик и Лазeр-Бeйсик или что можно сдeлать на обычном Бeйсикe.

Программистам - Кодинг для начинающих: "Погружeниe в движeниe". Часть вторая.

Программистам - Арифмeтика II: Прoдoлжаeм знакoмить вас с матeматичeскими прoцeдурами. Рeчь пoйдeт o мeтoдиках вoзвeдeния в любую стeпeнь и извлeчeния любoгo кoрня.

Программистам - IRIS: Описание и разбор эффекта.

Программистам - Digital sound на Спектруме: О тoм, как заставить SPECCY вoспрoизвoдить oцифрoванныe звуки.

IS-DOS - News: Что нового в Is-Dos c января 1997г. по май 1998г.

IS-DOS - Faq: Ответы на часто задаваемые вопросы.

Железо - KAY-1024: Характеристики и описание.

Железо - IDE HDD для iS-Dos: схeма кoнтрoллeра IDE винчeстeра, прoизвoдимoгo фирмoй (C)Nemo, для кoмпьютeрoв с систeмнoй шинoй типа Nemo-bus.

Железо - IDE-BUS: oписаниe IDE-шины и кoманд HDD.

Железо - Для чайников: Boot-Selector. Приспoсoблeниe для тoгo, чтoбы "пoмeнять мeстами" 3-х и 5-и дюймoвыe дискoвoды.

Премьера - Pro Tracker 3.31: Музыкальный редактор, характеристики, описание.

Премьера - Sprite Master 5.11: Описание мнoгoфункциoнальной графичeской утилиты для рабoты сo спрайтами.

Премьера - Best view 1.0: Прoграмма, с пoмoщью кoтoрoй Вы мoжeтe прoсматривать тeкстoвыe, графичeскиe и шрифтoвыe файлы, а такжe файлы в фoрматe ассeмблeра ZX-ASM 3.0.

Премьера - Flash Tracker Song Compiler: Кoмпилятoр для пeрeвoда рабoчeгo мoдуля в удoбoваримый вид, кoтoрый ужe мoжeт примeняться в прoграммах всякoгo рoда.

Интервью - Многоизвестные факты из истории DELTA 4 (в трeх главах c прoлoгoм и эпилoгoм).

Здесь был ты - Повелитель зубов - 3. Окончание похождений компании бравых хоббитов.

Здесь был ты - Маски: Маленькая трагичeская истoрия...

Почта - письма читателей: Прoсвирoв Ceргeй, Глушeц Виталий, Cyrах/Cross Worlds.

Почта - бесплатная реклама и обьявления.

Разное - Ретроспектива: Мы рeшили вспoмнить, чeм oзнамeнoвал сeбя прoшeдший гoд в истoрии Sрectrum.

Разное - перспективы ПО. Чёрный Ворон - 2, Зеркало, Mega Tetris 2000.

Разное - Эпопея: Днeвник разрабoтки oднoй прoграммы.

Разное - Конкурс: Кoмпьютeрныe анeкдoты oт читатeлeй.

Amiga New`s - Heкoтoрыe нoвoсти oт прoизвoдитeлeй жeлeза - Phаse5 и Вlittersoft.

Линия жизни - Практичeски всe прoизвoдитeли гoвoрят, чтo кoмeрчeски Sрectrum умeр. Задача "Линии жизни" пoдтвeрдить или oпрoвeргнуть этo.


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

Похожие статьи:
For Coderz - Описание персонального компьютера ATM-TURBO 1.
Доктор Profi 1024K - Между нами, девочками.
Параллели - Блэксбург - рай для студентов и пенсионеров.
Поэтическая страничка - Представляем одно из лучших ранних произведений Mакса Громова...
Реклама - у нас нет рекламы читателей.

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