ZX-Ревю 1995 №2 1994 г.

Этюды - Предлагаю несколько небольших программ на ассемблере, которые я сам придумал.


 (С) Михаил Бульканов,              
            Московская обл., 1995.  
                                    
    Предлагаю несколько  небольших  
 программ на ассемблере, которые я  
 сам придумал. Каждую из них я от-  
 лаживал и  старался  сделать  как  
 можно короче.                      
                                    
    1. Эта программа распечатывает  
 двухбайтовое    шестнадцатиричное  
 число   (#0000...#FFFF),  которое  
 задается в регистре HL на входе в  
 процедуру. Печать выполняется при  
 помощи RST 16,  поэтому перед  ее  
 использованием должен быть открыт  
 канал печати (для экрана: LD A,2:  
 CALL #1601).                       
                                    
    00010 PRH    LD   C,#04         
    00020 PH0    LD   B,#04         
    00030        XOR  A             
    00040 PH1    RL   L             
    00050        RL   H             
    00060        RLA                
    00070        DJNZ PH1           
    00080        CP   #0A           
    00090        JR   C,PH2         
    00100        ADD  A,#07         
    00110 PH2    ADD  A,#30         
    00120        RST  16            
    00130        DEC  C             
    00140        JR   NZ,PH0        
    00150        RET                
                                    
                                    
    2. Эта    программа   печатает  
 строку символов,  причем с  диск-  
 ретностью в 1 пиксел по Y-коорди-  
 нате. Символ может быть как стан-  
 дартным (непосредственно  из сим-  
 вольного набора), так и сформиро-  
 ванный самой процедурой в процес-  
 се вывода.                         
                                    
    00010        ORG  40000         
    00020 PRT    LD   A,(HL)        
    00030        OR   A             
    00040        RET  Z             
    00050        DEC  A             
    00060        JR   NZ,PT1        
    00070        INC  HL            
    00080        LD   E,(HL)       
    00090        INC  HL           
    00100        LD   A,(HL)       
    00110        INC  HL           
    00120        CP   #58          
    00130        JR   NC,PT1       
    00140        LD   D,A          
    00150 PT1    PUSH HL           
    00160        LD   L,(HL)       
    00170        CALL PRS          
    00180        POP  HL           
    00190        INC  E            
    00200        INC  HL           
    00210        JR   PRT          
    00220 PRS    PUSH DE           
    00230        LD   H,0          
    00240        ADD  HL,HL        
    00250        ADD  HL,HL        
    00260        ADD  HL,HL        
    00270        LD   BC,#3C00     
    00280        ADD  HL,BC        
    00290        LD   B,8          
    00300 PSL    LD   A,(HL)       
    00310        RRCA              
    00320        OR   (HL)         
    00330        RRA               
    00340        OR   (HL)         
    00350        LD   (DE),A       
    00360        CALL YINC         
    00370        INC  HL           
    00380        DJNZ PSL          
    00390        POP  DE           
    00400        RET               
    00410 YINC   INC  D            
    00420        LD   A,D          
    00430        AND  7            
    00440        RET  NZ           
    00450        LD   A,E          
    00460        ADD  A,#20        
    00470        LD   E,A          
    00480        RET  C            
    00490        LD   A,D          
    00500        SUB  8            
    00510        LD   D,A          
    00520        RET               
                                   
    На входе в процедуру в регист- 
 ре HL должен быть задан адрес на- 
 чала строки текста,  а в регистре 
 DE - адрес  в  дисплейном  файле, 
 соответствующий  верхней пиксель- 
 ной линии первого символа строки. 
 Для  упрощения  процедуры  расчет 
 этого адреса  исключен,  хотя,  в 
 принципе может быть выполнен (см. 
 например, ZX-РЕВЮ-94,N3,стр.44).  
    Строка текста  должна   завер- 
 шаться нулевым символом.          
    Еще в  процедуре  предусмотрен  
 код для изменения позиции печати.  
 Если в строке встретился код #01,  
 то следом за ним должен находить-  
 ся новый адрес в дисплейном файле  
 (2 байта для регистра DE).         
    Блок строк с 330 по 350  может  
 иметь несколько вариантов для по-  
 лучения   различных   модификаций  
 шрифтов. Например такой:           
                                    
    00330        BIT  2,B           
    00335        JR   NZ,PSM        
    00340        RRA                
    00345        OR   (HL)          
    00350 PSM    LD   (DE),A        
                                    
    Или такой:                      
                                    
    00330        BIT  1,B           
    00335        JR   Z,PSM         
    00340        RRA                
    00345        OR   (HL)          
    00350 PSM    LD   (DE),A        
                                    
    Кроме того,  если  Вы добавите  
 несколько новых строк, то получи-  
 те двукратное увеличение символов  
 по высоте:                         
                                    
    00355        LD   C,A           
    00356        CALL YINC          
    00357        LD   A,C           
    00358        LD   (DE),A        
                                    
    А следующая   замена  позволит  
 сделать символы удвоенной  высоты  
 "полосатыми":                      
                                    
    00355 ;                         
    00356        CALL YINC          
    00357        XOR  A             
    00358        LD   (DE),A        
                                    
                                    
    3. Следующая программа доволь-  
 но  красиво выводит на экран кар-  
 тинку,  предварительно помещенную  
 в буфер (по адресу BUFF). Картин-  
 ка выводится вместе с атрибутами.  
 Причем  программа  имеет  особен-  
 ность: изменяя число в строке 40,  
 вывод  картинки будет происходить  
 новым способом, то есть эта прог-  
 рамма  является  малодетерминиро-  
 ванной.  Для этого надо генериро-  
 вать  это число случайным образом 
 - это значительно повышает  инте- 
 рес  к  процедуре.  Число  должно 
 быть в диапазоне от  1  до  6911, 
 оно  должно  быть  нечетным  и не 
 кратным  трем  (например,  5,  7, 
 11...), иначе вывод "зацикливает- 
 ся" на некоторых байтах.  Искомое 
 число Х можно найти по формуле:   
                                   
        X=(INT(N/2)+N)*2-1         
                                   
 где N лежит в диапазоне от  1  до 
 2304 (то есть возможно 2304 вари- 
 анта вывода  картинки).           
                                   
  00010 BUFF   EQU  41000          
  00020        ORG  40000          
  00030        ENT                 
  00040        LD   HL,#4000       
  00050        LD   BC,#1B00       
  00060 SC1    LD   DE,701         
  00070        ADD  HL,DE          
  00080        LD   A,H            
  00090        CP   #5B            
  00100        JR   C,SC2          
  00110        LD   DE,#E500       
  00120        ADD  HL,DE          
  00130 SC2    PUSH HL             
  00140        LD   DE,BUFF-#4000  
  00150        ADD  HL,DE          
  00160        EX   DE,HL          
  00170        LD   L,#20          
  00180 SC3    DEC  L              
  00190        JR   NZ,SC3         
  00200        POP  HL             
  00210        LD   A,(DE)         
  00220        LD   (HL),A         
  00230        DEC  BC             
  00240        LD   A,B            
  00250        OR   C              
  00260        JR   NZ,SC1         
  00270        RET                 
                                   
  Start of object: #9C40 (40000)   
  Length         : #0027 (00039)   
  Executes       : #9C40 (40000)   
                                   
 9C40: 21 00 40 01 00 1B 11 BD :27 
 9C48: 02 19 7C FE 5B 38 04 11 :21 
 9C50: 00 E5 19 E5 11 28 60 19 :81 
 9C58: EB 2E 20 2D 20 FD E1 1A :72 
 9C60: 77 0B 78 B1 20 E0 C9 00 :70 
                                   
    Если загрузить картинку по ад- 
 ресу  41000,  а  сам блок кодов - 
 40000,  то продемонстрировать его   
 работу поможет Бейсик-программа:    
                                     
   100 FOR n=1 TO 2304               
   110 LET x=(INT (n/2)+n)*2-1       
   120 RANDOMIZE x: POKE 40007,PEE   
  K 23670: POKE 40008,PEEK 23671     
   130 RANDOMIZE USR 40000: BEEP 0   
  .1,20: PAUSE 20: CLS : PAUSE 20:   
  NEXT n                             
                                     
    От себя  мы можем порекомендо-   
 вать воспользоваться  этой   Бей-   
 сик-программой для нахождения на-   
 иболее эффектных  значений  пара-   
 метра х,  для последующего их ис-   
 пользования в этой процедуре.       
    А вообще,  нам  очень понрави-   
 лись программы, присланные Михаи-   
 лом.  От  всей души желаем автору   
 дальнейших успехов.                 
                                     
    Теперь еще пара программ,  вы-   
 полняющих действия с экраном.       
                                     
                                     
 (C) Евгений Сайфутдинов,            
            г.Усинск (Коми), 1995.   
                                     
    Программа выводит   на   экран   
 картинку, предварительно   загру-   
 женную в память.                    
    Эта программа,  видимо, заимс-   
 твована из какой-то игры, поэтому   
 мы приводим ее с небольшими изме-   
 нениями, заключающимися в некото-   
 ром упрощении ее структуры (раск-   
 рытие операторов CALL).             
    Действие программы  похоже  на   
 программу "ВОТ ТАК!" (см.  ZX-РЕ-   
 ВЮ-94, N3,  стр.47 и N6, стр.47),   
 однако, немного отличается.         
                                     
    00010        ORG  40000          
    00020        ENT                 
    00030        DI                  
    00040        LD   A,0            
    00050        OUT  (254),A        
    00060        LD   HL,16384       
    00070        LD   DE,16385       
    00080        LD   BC,6143        
    00090        LD   (HL),0         
    00100        LDIR                
    00110        LD   HL,22528       
    00120        LD   DE,22529       
    00130        LD   (HL),7         
    00140        LD   BC,767       
    00150        LDIR              
    00160        LD   A,1          
    00170 L1     PUSH AF           
    00180        LD   HL,BUFF-1    
    00190        LD   DE,16383     
    00200 L2     INC  HL           
    00210        INC  DE           
    00220        PUSH AF           
    00230        LD   A,E          
    00240        CP   3            
    00250        JR   NZ,L3        
    00260        POP  AF           
    00270        JR   L7           
    00280 L3     POP  AF           
    00290        LD   BC,2047      
    00300        PUSH HL           
    00310        PUSH DE           
    00320 L4     PUSH AF           
    00330        AND  (HL)         
    00340        EX   DE,HL        
    00350        OR   (HL)         
    00360        EX   DE,HL        
    00370        PUSH BC           
    00380        LD   B,1          
    00390 L5     DJNZ L5           
    00400        POP  BC           
    00410        LD   (DE),A       
    00420        DEC  BC           
    00430        LD   A,B          
    00440        OR   C            
    00450        JR   Z,L6         
    00460        POP  AF           
    00470        RLCA              
    00480        RLCA              
    00490        RLCA              
    00500        RLCA              
    00510        INC  HL           
    00520        INC  HL           
    00530        INC  HL           
    00540        INC  DE           
    00550        INC  DE           
    00560        INC  DE           
    00570        JR   L4           
    00580 L6     POP  AF           
    00590        POP  DE           
    00600        POP  HL           
    00610        JR   L2           
    00620 L7     POP  AF           
    00630        RLCA              
    00640        RLCA              
    00650        RLCA              
    00660        CP   1            
    00670        JR   NZ,L1        
    00680        LD   HL,BUFF+6144 
    00690        LD   DE,22528     
    00700        LD   BC,768         
    00710        LDIR                
    00720        EI                  
    00730        RET                 
    00740 BUFF   DEFS 6912           
    00750 ; ADDRESS SCR=40113        
                                     
    Start of object: #9C40 (40000)   
    Length         : #1B71 (07025)   
    Executes       : #9C40 (40000)   
                                     
    Длина программы (7025  байтов)   
 указана с учетом картинки,  нахо-   
 дящейся сразу же за ней (по адре-   
 су BUFF).  Длина собственно прог-   
 раммы равна 113 байтов.             
                                     
 9C40: F3 3E 00 D3 FE 21 00 40 :3F   
 9C48: 11 01 40 01 FF 17 36 00 :83   
 9C50: ED B0 21 00 58 11 01 58 :6C   
 9C58: 36 07 01 FF 02 ED B0 3E :0E   
 9C60: 01 F5 21 B0 9C 11 FF 3F :AE   
 9C68: 23 13 F5 7B FE 03 20 03 :CE   
 9C70: F1 18 29 F1 01 FF 07 E5 :1B   
 9C78: D5 F5 A6 EB B6 EB C5 06 :DB   
 9C80: 01 10 FE C1 12 0B 78 B1 :32   
 9C88: 28 0D F1 07 07 07 07 23 :89   
 9C90: 23 23 13 13 13 18 E2 F1 :96   
 9C98: D1 E1 18 CC F1 07 07 07 :D0   
 9CA0: FE 01 20 BD 21 B1 B4 11 :AF   
 9CA8: 00 58 01 00 03 ED B0 FB :38   
 9CB0: C9 00 00 00 00 00 00 00 :15   
                                     
    С адреса 40113 (#9СВ1)  разме-   
 щается картинка.                    
                                     
    Следующая процедура  взята  из   
 программы  CRYSTAL QUEST.  При ее   
 вызове по экрану сверху вниз про-   
 бегает полоса шириной в 1 пиксел,   
 стирая  находящееся   на   экране   
 изображение.                        
                                     
    Программа также  приводится  с   
 небольшими изменениями.             
                                     
    00010        ORG  40000          
    00020        ENT                 
    00030        LD   HL,16384       
    00040        LD   A,191          
    00050 L1     HALT                
    00180        EX   AF,AF'         
    00190        PUSH HL             
    00200        LD   D,H            
    00210        LD   E,L            
    00220        INC  E              
    00230        LD   BC,31        
    00240        LD   (HL),B       
    00250        LDIR              
    00260        POP  HL           
    00270        PUSH HL           
    00280        CALL L2           
    00290        LD   D,H          
    00300        LD   E,L          
    00310        INC  E            
    00320        LD   BC,31        
    00330        LD   (HL),85      
    00340        LDIR              
    00350        POP  HL           
    00360        CALL L2           
    00370        EX   AF,AF'       
    00380        DEC  A            
    00390        JR   NZ,L1        
    00400        LD   HL,22496     
    00410        LD   DE,22497     
    00420        LD   BC,31        
    00430        LD   (HL),0       
    00440        LDIR              
    00450        LD   HL,22528     
    00460        LD   DE,22529     
    00470        LD   BC,767       
    00480        LD   (HL),0       
    00490        LDIR              
    00550        RET               
    00560 L2     INC  H            
    00570        LD   A,H          
    00580        AND  7            
    00590        RET  NZ           
    00600        LD   A,H          
    00610        SUB  8            
    00620        LD   H,A          
    00630        LD   A,L          
    00640        ADD  A,32         
    00650        LD   L,A          
    00660        RET  NC           
    00670        LD   A,H          
    00680        ADD  A,8          
    00690        LD   H,A          
    00700        RET               
                                   
    Start of object: #9C40 (40000) 
    Length         : #0056 (00086) 
    Executes       : #9C40 (40000) 
                                   
 9C40: 21 00 40 3E BF 76 08 E5 :9D 
 9C48: 54 5D 1C 01 1F 00 70 ED :2E 
 9C50: B0 E1 E5 CD 83 9C 54 5D :FF 
 9C58: 1C 01 1F 00 36 55 ED B0 :58 
 9C60: E1 CD 83 9C 08 3D 20 DD :0B 
 9C68: 21 E0 57 11 E1 57 01 1F :C5 
 9C70: 00 36 00 ED B0 21 00 58 :58 
 9C78: 11 01 58 01 FF 02 36 00 :B6 
 9C80: ED B0 C9 24 7C E6 07 C0 :CF  
 9C88: 7C D6 08 67 7D C6 20 6F :B7  
 9C90: D0 7C C6 08 67 C9 00 00 :76  
                                    
           *     *     *            
                                    
                                    
    В последнем  номере  РЕВЮ   за  
 прошлый  год мы немного "подзадо-  
 рили" наших  отечественных  прог-  
 раммистов - предложили побить ре-  
 корд длины процедуры плавного за-  
 тухания  экрана (при помощи мани-  
 пуляции с атрибутами). Рекорд был  
 39   байтов  (программа  TERMINA-  
 TOR-2). С радостью можем сообщить  
 о том,  что НАШИ программисты от-  
 реагировали молниеносно.  Предос-  
 тавляем  слово  корреспонденту из  
 Нижегородской области.             
                                    
                                    
 (С) Владимир Зореев,               
                 г.Заволжье, 1995.  
                                    
    Вот Вам релоцируемая процедура  
 гашения экрана длиной в 33 байта,  
 а достиг этого я благодаря  вашей  
 книге "Элементарная графика", там  
 в описании процедуры расчета  ад-  
 реса в дисплейном файле есть объ-  
 яснение логической    конструкции  
 "XOR-AND-XOR", которую я и приме-  
 нил в  своей  процедуре.  Советую  
 всем почаще  заглядывать  в книги  
 ИНФОРКОМА!                         
                                    
    00010 ; (C) ULTRASOFT           
    00020        ORG  40000         
    00030        ENT                
    00040        EI                 
    00050        LD   E,255         
    00060 L1     LD   HL,22528      
    00070        LD   BC,768        
    00080        AND  A             
    00090        RR   E             
    00100 L2     LD   A,(HL)        
    00110        XOR  E             
    00120        AND  E             
    00130        XOR  E             
    00140        LD   (HL),A        
    00150        INC  HL            
    00160        DEC  BC            
    00170        LD   A,B           
    00180        OR   C             
    00190        JR   NZ,L2         
    00200        LD   B,4          
    00210 L3     HALT              
    00220        DJNZ L3           
    00230        XOR  A            
    00240        CP   E            
    00250        JR   NZ,L1        
    00260        RET               
                                   
    Start of object: #9C40 (40000) 
    Length         : #0021 (00033) 
    Executes       : #9C40 (40000) 
                                   
 9C40: FB 1E FF 21 00 58 01 00 :6E 
 9C48: 03 A7 CB 1B 7E AB A3 AB :EB 
 9C50: 77 23 0B 78 B1 20 F5 06 :D5 
 9C58: 04 76 10 FD AF BB 20 E3 :E8 
 9C60: C9 00 00 00 00 00 00 00 :C5 
                                   
    В строке  50 в регистр Е поме- 
 щается маска. Строка 80 обеспечи- 
 вает сброс флага переноса. Строка 
 90 выключает  по-очереди  биты  в 
 маске  с  7 по 0.  Строки 110-130 
 образуют ту самую  вышеупомянутую 
 конструкцию - обмен битов, замас- 
 кированных  нулями  при  операции 
 AND маски с аккумулятором А.  Па- 
 раметр в строке 200  задает  вре- 
 менную   задержку,   определяющую 
 скорость эффекта.                 
                                   
    Что скрывать,  всегда  приятно 
 услышать  высокую  оценку  своего 
 труда. Приятно, что наши читатели 
 пошли дальше  нас  - так всегда и 
 должно быть.  Спасибо,  Владимир, 
 за письмо, и успехов тебе.        
                                   
    И еще  одна программа,  посвя- 
 щенная очистке экрана.            
                                   
                                   
 (C) Олег Лобов, С.Петербург,1995. 
                                   
    Предлагаю небольшую,  но   эф- 
 фектную  программку  для  очистки 
 экрана,  нередко  используемую  в 
 различных играх.                  
                                   
    00010        ORG  40000        
    00020        ENT               
    00030        LD   HL,#5800     
    00040        LD   DE,#5801     
    00050        LD   (HL),#47     
    00060        LD   BC,#02FF     
    00070        LDIR              
    00080        XOR  A             
    00090        OUT  (#FE),A       
    00100 LOOP   LD   D,0           
    00110        LD   BC,#1800      
    00120        LD   HL,#4000      
    00130 LOOP2  LD   A,R           
    00140        AND  (HL)          
    00150        RRA                
    00160        LD   (HL),A        
    00170        INC  HL            
    00180        AND  A             
    00190        JR   Z,LOOP1       
    00200        LD   D,#FE         
    00210 LOOP1  DEC  BC            
    00220        LD   A,B           
    00230        OR   C             
    00240        JR   NZ,LOOP2      
    00250        LD   A,D           
    00260        AND  A             
    00270        JR   NZ,LOOP       
    00280        RET                
                                    
    Start of object: #9C40 (40000)  
    Length         : #002D (00045)  
    Executes       : #9C40 (40000)  
                                    
 9C40: 21 00 58 11 01 58 36 47 :3C  
 9C48: 01 FF 02 ED B0 AF D3 FE :03  
 9C50: 16 00 01 00 18 21 00 40 :7C  
 9C58: ED 5F A6 1F 77 23 A7 28 :6E  
 9C60: 02 16 FE 0B 78 B1 20 F0 :56  
 9C68: 7A A7 20 E4 C9 00 00 00 :F2  
                                    
    Вначале устанавливаются  атри-  
 буты:  черный бордюр,  черный PA-  
 PER, яркий белый INK, затем изоб-  
 ражение плавно и попиксельно  ис-  
 чезает.                            
                                    
           *     *     *            
                                    
                                    
    Теперь от графики переходим  к  
 тексту. Перед нами лежат несколь-  
 ко писем  с  процедурами  печати,  
 которые  могут  использоваться  в  
 Ваших програмах.                   
                                    
                                    
 (С) Игорь Комаров, Иркутск, 1995.  
                                    
    В ZX-РЕВЮ-94, N3 (стр.45), бы-  
 ла  опубликована программа В.Ако-  
 пова, которая печатает до 32 сим-  
 волов  двойной высоты.  Предлагаю  
 другую версию  процедуры.  Я  ис-  
 пользую  ее  в своих загрузчиках. 
 Она распечатывает текст,  находя- 
 щийся  в начальной Бейсик-строке, 
 сразу же за REM. Например:        
                                   
    1 REM IRKUTSK HOUSE & MEGA ART 
  S'94                             
    10 ...                         
                                   
    00010        ORG  40000        
    00020        ENT               
    00030        LD   HL,(23635)   
    00040        INC  HL           
    00050        INC  HL           
    00060        INC  HL           
    00070        INC  HL           
    00080        INC  HL           
    00090        PUSH HL           
    00100        LD   B,32         
    00110 L1     LD   A,(HL)       
    00120        CP   13           
    00130        JR   Z,L2         
    00140        INC  HL           
    00150        DJNZ L1           
    00160 L2     LD   A,32         
    00170        SUB  B            
    00180        LD   B,A          
    00190        LD   A,32         
    00200        SUB  B            
    00210        SRL  A            
    00220        LD   D,A          
    00230        LD   E,22         
    00240        LD   A,E          
    00250        AND  #18          
    00260        ADD  A,#40        
    00270        LD   H,A          
    00280        LD   A,E          
    00290        AND  7            
    00300        RRCA              
    00310        RRCA              
    00320        RRCA              
    00330        ADD  A,D          
    00340        LD   L,A          
    00350        LD   D,H          
    00360        LD   E,L          
    00370        POP  HL           
    00380 KRUG   LD   A,(HL)       
    00390        CP   13           
    00400        RET  Z            
    00410        PUSH HL           
    00420        PUSH DE           
    00430        PUSH DE           
    00440        POP  IX           
    00450        LD   L,A          
    00460        LD   H,0          
    00470        ADD  HL,HL        
    00480        ADD  HL,HL         
    00490        ADD  HL,HL         
    00500        LD   B,H           
    00510        LD   C,L           
    00520        LD   HL,(23606)    
    00530        ADD  HL,BC         
    00540        CALL PRINT         
    00550        LD   BC,32         
    00560        ADD  IX,BC         
    00570        PUSH IX            
    00580        POP  DE            
    00590        CALL PRINT         
    00600        POP  DE            
    00610        INC  E             
    00620        POP  HL            
    00630        INC  HL            
    00640        JR   KRUG          
    00650 PRINT  LD   B,4           
    00660 L3     LD   A,(HL)        
    00670        INC  HL            
    00680        LD   (DE),A        
    00690        INC  D             
    00700        LD   (DE),A        
    00710        INC  D             
    00720        DJNZ L3            
    00730        RET                
                                    
    Start of object: #9C40 (40000)  
    Length         : #0064 (00100)  
    Executes       : #9C40 (40000)  
                                    
 9C40: 2A 53 5C 23 23 23 23 23 :64  
 9C48: E5 06 20 7E FE 0D 28 03 :A3  
 9C50: 23 10 F8 3E 20 90 47 3E :8A  
 9C58: 20 90 CB 3F 57 1E 16 7B :B4  
 9C60: E6 18 C6 40 67 7B E6 07 :CF  
 9C68: 0F 0F 0F 82 6F 54 5D E1 :B4  
 9C70: 7E FE 0D C8 E5 D5 D5 DD :C9  
 9C78: E1 6F 26 00 29 29 29 44 :49  
 9C80: 4D 2A 36 5C 09 CD 99 9C :30  
 9C88: 01 20 00 DD 09 DD E5 D1 :BE  
 9C90: CD 99 9C D1 1C E1 23 18 :37  
 9C98: D7 06 04 7E 23 12 14 12 :EE  
 9CA0: 14 10 F8 C9 00 00 00 00 :21  
                                    
    Программа может работать как с  
 подключенным  дисковым  интерфей-  
 сом,  так и без него, так как на-  
 чальный адрес текстового  сообще-  
 ния    рассчитывается    строками  
 30-80.  Если Вы захотите располо-  
 жить текст в другом месте,  изме-  
 ните эти строки,  задав  адрес  в  
 HL.                                
    Y-координата для печати  зада-  
 ется  в  строке 230 и может иметь  
 значение от 0  по  22.  Процедура 
 сама  рассчитывает  X-координату, 
 стараясь  расположить   текстовое 
 сообщение посередине экрана.      
    В загрузчиках, написанных PHO- 
 NEX'ом, символы имеют еще и двой- 
 ную толщину линий. Получить такой 
 эффект можно,  введя дополнитель- 
 ные строки:                       
                                   
    00662        RRA               
    00664        OR   (HL)         
                                   
    У PHONEX'а встречается  еще  и 
 такой эффект:                     
                                   
    00675        OR   (HL)         
                                   
    Программу можно использовать и 
 с загружаемым символьным набором, 
 изменив строку 520.               
                                   
           *     *     *           
                                   
                                   
 (C) Роман Торбан,                 
                С.Петербург, 1995. 
                                   
    Предлагаю  программку-знакоге- 
 нератор, печатающую символы  раз- 
 мером 2х2 знакоместа с заполнени- 
 ем их текстурой.                  
                                   
    00010        ORG  40000        
    00020        ENT               
    00030        LD   A,(LETTER)   
    00040        LD   L,A          
    00050        LD   H,0          
    00060        ADD  HL,HL        
    00070        ADD  HL,HL        
    00080        ADD  HL,HL        
    00090        LD   BC,(23606)   
    00100        ADD  HL,BC        
    00110        EX   DE,HL        
    00120        LD   HL,(ROW)     
    00130        CALL VADDR        
    00140        LD   B,4          
    00150 BIG1   PUSH BC           
    00160        CALL BIG          
    00170        INC  DE           
    00180        POP  BC           
    00190        DJNZ BIG1         
    00200        LD   HL,(ROW)     
    00210        INC  L            
    00220        CALL VADDR        
    00230        LD   B,4          
    00240 BIG2   PUSH BC            
    00250        CALL BIG           
    00260        INC  DE            
    00270        POP  BC            
    00280        DJNZ BIG2          
    00290        RET                
    00300 BIG    LD   A,(DE)        
    00310        LD   C,2           
    00320 BIG3   LD   B,4           
    00330 BIGLIN RLA                
    00340        RL   (HL)          
    00350        SCF                
    00360        CCF                
    00370        RL   (HL)          
    00380        DJNZ BIGLIN        
    00390        INC  HL            
    00400        DEC  C             
    00410        JR   NZ,BIG3       
    00420        DEC  HL            
    00430        DEC  HL            
    00440        LD   A,(HL)        
    00450        INC  H             
    00460        RRA                
    00470        LD   (HL),A        
    00480        PUSH AF            
    00490        DEC  H             
    00500        INC  HL            
    00510        LD   B,(HL)        
    00520        INC  H             
    00530        POP  AF            
    00540        LD   A,B           
    00550        RRA                
    00560        LD   (HL),A        
    00570        DEC  HL            
    00580        INC  H             
    00590        RET                
    00600 VADDR  LD   A,L           
    00610        AND  7             
    00620        RRCA               
    00630        RRCA               
    00640        RRCA               
    00650        ADD  A,H           
    00660        LD   H,L           
    00670        LD   L,A           
    00680        LD   A,H           
    00690        AND  #18           
    00700        OR   #40           
    00710        LD   H,A           
    00720        RET                
    00730 ROW    DEFB 10            
    00740 COL    DEFB 10            
    00750 LETTER DEFM "A"           
                                    
    Start of object: #9C40 (40000)  
    Length         : #0068 (00104)  
    Executes       : #9C40 (40000)  
 9C40: 3A A7 9C 6F 26 00 29 29 :40 
 9C48: 29 ED 4B 36 5C 09 EB 2A :F5 
 9C50: A5 9C CD 95 9C 06 04 C5 :FA 
 9C58: CD 71 9C 13 C1 10 F8 2A :D4 
 9C60: A5 9C 2C CD 95 9C 06 04 :71 
 9C68: C5 CD 71 9C 13 C1 10 F8 :7F 
 9C70: C9 1A 0E 02 06 04 17 CB :EB 
 9C78: 16 37 3F CB 16 10 F7 23 :AB 
 9C80: 0D 20 F1 2B 2B 7E 24 1F :51 
 9C88: 77 F5 25 23 46 24 F1 78 :AB 
 9C90: 1F 77 2B 24 C9 7D E6 07 :44 
 9C98: 0F 0F 0F 84 65 6F 7C E6 :1B 
 9CA0: 18 F6 40 67 C9 0A 0A 41 :0F 
                                   
    Вот для  примера  символ  "А", 
 распечатанный этой процедурой:    
                                   
             1                     
                                   
                                   
                                   
                                   
    Печатаемый символ задан в  ак- 
 кумуляторе.  Это  позволяет легко 
 модифицировать   программу    для 
 подключения ее к собственному по- 
 току,  что позволит выполнять пе- 
 чать привычным способом при помо- 
 щи RST #10 (и с помощью всех про- 
 цедур  для этого предназначенных, 
 например, для печати строки текс- 
 та PR_STRING #203C), открыв пред- 
 варительно этот новый поток.      
                                   
           *     *     *           
                                   
                                   
    Вы уже прочитали,  наверное, в 
 этом номере  РЕВЮ  статью  Лыхина 
 Д.В.,   посвященную  модернизации 
 шрифта.  А сейчас предлагаем вни- 
 манию читателей несколько практи- 
 ческих программ,  полученных нами 
 от начинающих программистов.      
                                   
                                   
 (С) Андрей Рубин, г.Энгельс,1995. 
                                   
    Программы,  приводимые   ниже, 
 создают символьный набор с адреса 
 41000 (задается в строке 10). Для 
 этого  вначале  символьный  набор 
 перебрасывается  в  эту  область. 
 Затем  с ним выполняются преобра- 
 зования. В конце CHARS переключа- 
 ется на полученный символьный на- 
 бор (можно сделать при помощи PO-  
 KE 23606,40: POKE 23607,159).      
    Первая   программа   позволяет  
 создать шрифт с утолщенной только  
 левой частью:                      
                                    
    00010 FONT   EQU  41000         
    00020        ORG  40000         
    00030        ENT                
    00040        LD   HL,(#5C36)    
    00050        INC  H             
    00060        LD   DE,FONT       
    00070        LD   BC,768        
    00080        PUSH BC            
    00090        PUSH DE            
    00100        PUSH HL            
    00110        LDIR               
    00120        POP  DE            
    00130        POP  HL            
    00140        POP  BC            
    00150 LABEL  LD   A,(HL)        
    00160        SLA  A             
    00170        AND  #F0           
    00180        EX   DE,HL         
    00190        OR   (HL)          
    00200        EX   DE,HL         
    00210        LD   (HL),A        
    00220        INC  HL            
    00230        INC  DE            
    00240        DEC  BC            
    00250        LD   A,B           
    00260        OR   C             
    00270        JR   NZ,LABEL      
    00280        LD   HL,FONT-256   
    00290        LD   (#5C36),HL    
    00300        RET                
                                    
    Start of object: #9C40 (40000)  
    Length         : #0029 (00041)  
    Executes       : #9C40 (40000)  
                                    
 9C40: 2A 36 5C 24 11 28 A0 01 :96  
 9C48: 00 03 C5 D5 E5 ED B0 D1 :D4  
 9C50: E1 C1 7E CB 27 E6 F0 EB :BF  
 9C58: B6 EB 77 23 13 0B 78 B1 :76  
 9C60: 20 F0 21 28 9F 22 36 5C :A8  
 9C68: C9 00 00 00 00 00 00 00 :CD  
                                    
    Можно также  выполнить модифи-  
 кацию:                             
                                    
    00160        SRL  A             
    00170        AND  #0F           
                                    
    Следующая  программа   создает  
 шрифт,  похожий  на тот,  который  
 приведен   в   ZX-РЕВЮ-94,    N4, 
 стр.37, однако  немного  отличаю- 
 щийся:                            
                                   
    00010 FONT   EQU  41000        
    00020        ORG  40000        
    00030        ENT               
    00040        LD   HL,15616     
    00050        LD   DE,FONT      
    00060        LD   BC,768       
    00070        LDIR              
    00080        LD   HL,FONT      
    00090        LD   DE,768       
    00100 LOOP   INC  HL           
    00110        INC  HL           
    00120        INC  HL           
    00130        INC  HL           
    00140        LD   B,4          
    00150 LOOP1  LD   A,(HL)       
    00160        SRA  A            
    00170        LD   (HL),A       
    00180        SLA  A            
    00190        SLA  A            
    00200        OR   (HL)         
    00210        LD   (HL),A       
    00220        INC  HL           
    00230        DEC  DE           
    00240        DJNZ LOOP1        
    00250        LD   A,D          
    00260        OR   E            
    00270        JR   NZ,LOOP      
    00280        LD   HL,FONT-256  
    00290        LD   (#5C36),HL   
    00300        RET               
                                   
    Start of object: #9C40 (40000) 
    Length         : #0030 (00048) 
    Executes       : #9C40 (40000) 
                                   
 9C40: 21 00 3D 11 28 A0 01 00 :14 
 9C48: 03 ED B0 21 28 A0 11 00 :7E 
 9C50: 03 23 23 23 23 06 04 7E :03 
 9C58: CB 2F 77 CB 27 CB 27 B6 :FF 
 9C60: 77 23 1B 10 F2 7A B3 20 :00 
 9C68: E8 21 28 9F 22 36 5C C9 :51 
                                   
    Оригинальный шрифт  получается 
 при помощи  следующей  программы. 
 Попробуйте, - не пожалеете:       
                                   
    00010 FONT   EQU  41000        
    00020        ORG  40000        
    00030        ENT               
    00040        LD   HL,15616     
    00050        LD   DE,FONT      
    00060        LD   BC,768       
    00070        LDIR               
    00080        LD   HL,FONT       
    00090        LD   B,0           
    00100 LOOP2  CALL LOOP          
    00110        CALL LOOP          
    00120        INC  HL            
    00130        INC  HL            
    00140        INC  HL            
    00150        INC  HL            
    00160        CALL LOOP          
    00170        CALL LOOP          
    00180        DJNZ LOOP2         
    00190        LD   DE,768        
    00200        LD   HL,FONT       
    00210        JR   LOOP5         
    00220 LOOP   LD   A,(HL)        
    00230        SRL  A             
    00240 LOOP4  LD   (HL),A        
    00250        INC  HL            
    00260        RET                
    00270 LOOP5  LD   A,(HL)        
    00280        LD   C,A           
    00290        SRL  A             
    00300        OR   C             
    00310        CALL LOOP4         
    00320        DEC  DE            
    00330        LD   A,D           
    00340        OR   E             
    00350        JR   NZ,LOOP5      
    00360        LD   HL,FONT-256   
    00370        LD   (#5C36),HL    
    00380        RET                
                                    
    Start of object: #9C40 (40000)  
    Length         : #0044 (00068)  
    Executes       : #9C40 (40000)  
                                    
 9C40: 21 00 3D 11 28 A0 01 00 :14  
 9C48: 03 ED B0 21 28 A0 06 00 :73  
 9C50: CD 6A 9C CD 6A 9C 23 23 :D8  
 9C58: 23 23 CD 6A 9C CD 6A 9C :E0  
 9C60: 10 EE 11 00 03 21 28 A0 :F7  
 9C68: 18 06 7E CB 3F 77 23 C9 :0D  
 9C70: 7E 4F CB 3F B1 CD 6D 9C :6A  
 9C78: 1B 7A B3 20 F3 21 28 9F :57  
 9C80: 22 36 5C C9 00 00 00 00 :99  
                                    
    Возможна замена в строках  230  
 и 290 SRL A на SLA A.              
                                    
                                    
 (С) Артур Привалов (ART PRI),      
             Иркутская обл., 1995.  
                                    
    Предлагаю  программу из серии   
 модификации шрифтов.               
    Нижеприведенная программа выт- 
 воряет  следующее:   сдвигает   4 
 верхних  байта  символа  вправо и 
 объединяет (по ИЛИ)  с  тем,  что 
 было.  То же самое делается с че- 
 тырьмя  нижними  байтами,  но  со 
 сдвигом влево.  Получается прият- 
 ный на вид  утолщенный  наклонный 
 шрифт.                            
                                   
    00010 FONT   EQU  41000        
    00020        ORG  40000        
    00030        ENT               
    00040        LD   HL,#3D00     
    00050        LD   DE,FONT      
    00060        LD   BC,#0300     
    00070        LDIR              
    00080        LD   HL,FONT      
    00090        LD   B,#60        
    00100 ONE    PUSH BC           
    00110        LD   B,4          
    00120 TWO    LD   A,(HL)       
    00130        LD   C,A          
    00140        SRL  A            
    00150        OR   C            
    00160        LD   (HL),A       
    00170        INC  HL           
    00180        DJNZ TWO          
    00190        LD   B,4          
    00200 THREE  LD   A,(HL)       
    00210        LD   C,A          
    00220        SLA  A            
    00230        OR   C            
    00240        LD   (HL),A       
    00250        INC  HL           
    00260        DJNZ THREE        
    00270        POP  BC           
    00280        DJNZ ONE          
    00290        LD   HL,FONT-256  
    00300        LD   (#5C36),HL   
    00310        RET               
                                   
    Start of object: #9C40 (40000) 
    Length         : #0031 (00049) 
    Executes       : #9C40 (40000) 
                                   
 9C40: 21 00 3D 11 28 A0 01 00 :14 
 9C48: 03 ED B0 21 28 A0 06 60 :D3 
 9C50: C5 06 04 7E 4F CB 3F B1 :43 
 9C58: 77 23 10 F7 06 04 7E 4F :6C 
 9C60: CB 27 B1 77 23 10 F7 C1 :01 
 9C68: 10 E6 21 28 9F 22 36 5C :96 
 9C70: C9 00 00 00 00 00 00 00 :D5 
                                   



СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



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

Похожие статьи:
От редакции - Содержание номера.
Lotus - прозрачные мысли о любимом Спектруме.
Новости - Мир японской анимации.
Bugs! - какае-та хрень сожрала первую полосу экрана, тоесть самые верхний ряд pixels.
AD&D - описания монстров AD&D (часть первая).

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