Lprint #12
25 июля 1997

Программирование - Быстрый и компактный драйвер печати 42 символов в строке.

<b>Программирование</b> - Быстрый и компактный драйвер печати 42 символов в строке.
┌----------------------------------------┐
│░░░░░░░░░░ Программирование ░░░░░░░░░░░░│
└----------------------------------------┘
                                          
                              (C) PAWEL/RS
                                          
         В библиотеку программиста        
                                          
       Быстрый и компактный драйвер       
     печати 42 (..) символов в строке     
                                          
                                          
   На  протяжении  многих месяцев мной со-
вершенствовался  и обкатывался драйвер вы-
вода  42 символов в строке. Перед вами ко-
нечный продукт, и я надеюсь с этого момен-
та мне больше не придется смотреть на мед-
ленно печатающися текст. Принцип использо-
ванный  в  этом  драйвере если разобраться
очень  прост, можно даже сказать несколько
банальную  фразу: -"Как и все гениальное".
Конечно я не претендую на авторское право,
он в том или ином варианте был использован
и  раньше, но мне кажется удалось добиться
наилучших результатов при небольшом разме-
ре  программы.  Ну  конечно если вам нужна
еще большая скорость, то вы можете раскру-
тить  вывод символа в каждой возможной по-
зиции, это по моим рассчетам займет не бо-
лее  500  байт. Можете  также использовать
ZX-ASM'овский  метод - выводить сразу по 4
символа. Для быстрого рассчета адреса сим-
вола  в  фонте  здесь применен специальный
формат,  отличный  от  ZX-ASM'овского. Не-
большая  процедурка  конвертирования фонта
приводится.  Фонт  должен располагаться по
ровному  адресу,  то есть адресу с младшим
байтом  равным  нулю, также как и табличка
масок. Я надеюсь вы понимаете, что драйвер
необходимо  компилировать  в  быструю  па-
мять.  Программа   набрана   в  ассемблере
ZX-ASMЗ. Загрузите  текст, удалите все не-
нужное, выполните функцию "Import".       
                                          
;42 Symbols driver by Pawel/RS/NHG        
Печать текста, HL -Адрес (код 0 -конец)   
WRITE   LD      A,(HL)                    
        INC     HL                        
        AND     A                         
        RET     Z                         
        CP      32                        
        JR      C,WRIT2                   
WRIT1   PUSH    HL                        
        CALL    PRSYM                     
        POP     HL                        
        JR      WRITE                     
                                          
Обработка управляющих кодов:              
;(Здесь приведены только два упр.кода,но  
ничто не помешает вам дописать свои)      
WRIT2   CP      13                        
        JR      Z,PR13                    
        CP      22                        
        JR      Z,PR22                    
        LD      A,63                      
        JR      WRIT1                     
PR13    PUSH    HL                        
        LD      HL,(PSA)                  
        LD      A,L                       
        AND     224                       
        ADD     A,#20                     
        LD      L,A                       
        JR      NZ,PR13_1                 
        LD      A,H                       
        ADD     A,8                       
        LD      H,A                       
        CP      #58                       
        JR      C,PR13_1                  
        LD      H,#40                     
PR13_1  LD      (PSA),HL                  
        XOR     A                         
        LD      (LBT),A                   
        POP     HL                        
        JR      WRITE                     
PR22    LD      A,(HL)                    
        INC     HL                        
        PUSH    DE                        
        PUSH    HL                        
        CALL    3742                      
        POP     DE                        
        LD      A,(DE)                    
        INC     DE                        
        ADD     A,L                       
        LD      L,A                       
        LD      (PSA),HL                  
        XOR     A                         
        LD      (LBT),A                   
        POP     HL                        
        EX      DE,HL                     
        JP      WRITE                     
                                          
Собственно драйвер, в A -код символа      
PRSYM   LD      HL,0                      
PSA     EQU     $-2 ;текущ.экранный адр.  
        LD      E,A                       
LS      LD      D,FONT/256                
LBT EQU $+1:LD  A,0 ;колич.сдв.битов      
        AND     A                         
        JP      Z,LSб                     
        LD      C,A                       
        NEG                               
        SUB     JPSSL-SSL+2               
        LD      (JPSSL+1),A               
        SLA     C                         
        LD      B,TABLS/256               
        LD      A,(BC)                    
        LD      (LS1+1),A                 
        INC     C                         
        LD      A,(BC)                    
        LD      (LS2+1),A                 
        LD      B,9                       
        JP      LSS                       
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
SSL     LD      C,A                       
LS1     AND     0                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     L                         
        LD      A,C                       
LS2     AND     0                         
        OR      (HL)                      
        LD      (HL),A                    
        DEC     L                         
        INC     H                         
LSS     LD      A,(DE)                    
        INC     D                         
JPSSL   DJNZ    SSL                       
LSбA  ;сюда можно вставить вывод атриб.   
        LD      A,(LBT)                   
        ADD     A,6                       
        LD      (LBT),A                   
        CP      8                         
        RET     C                         
        AND     7                         
        LD      (LBT),A                   
        LD      HL,(PSA)                  
        INC     L                         
        JP      NZ,PRSЗ                   
        LD      A,H                       
        ADD     A,8                       
        LD      H,A                       
PRSЗ    LD      (PSA),HL                  
        RET                               
                                          
Раскрученная печать символа без сдвига,   
можно совсем убрать или использовать цикл 
LSб     LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        JP      LSбA                      
                                          
По ровному адресу:                        
FONT    INSERT  "Font10M" ;Ckohb.фонт     
                                          
Таблица, располагается по адресу с        
младшим байтом равным 0 (для быстрого     
расчета, но можно и по неровному адресу,  
предварительно подкорректировав расчет).  
TABLS   DB      %11111100,%00000000       
        DB      %01111110,%00000000       
        DB      %00111111,%00000000       
        DB      %00011111,%10000000       
        DB      %00001111,%11000000       
        DB      %00000111,%11100000       
        DB      %00000011,%11110000       
        DB      %00000001,%11111000       
                                          
Если вам необходимо печатать символы с    
атрибутами, то вставьте следующую про-    
цедурку:                                  
                                          
        LD      HL,(PSA)                  
        LD      A,H                       
        AND     #18                       
        RRCA                              
        RRCA                              
        RRCA                              
        ADD     A,#58                     
        LD      H,A                       
ATR EQU $+1:LD A,7 ;текущие атрибуты      
        LD      (HL),A                    
                                          
   Кстати  стандартный код изменения атри-
бутов 16, во втором  байте атрибут. Именно
этот формат будет поддерживать VIEW'ер но-
вой версии REAL COMMANDER'а.              
                                          
 Для печати с очисткой предыдущего изобра-
жения   нужна  несколько  модифицированная
процедура:                                
                                          
LS      LD      E,A                       
        LD      D,FONT/256                
PSA     EQU     $+1                       
        LD      HL,0                      
LBT EQU $+1:LD  A,0                       
        AND     A                         
        JP      Z,LSб                     
        LD      C,A                       
        NEG                               
        SUB     JPSSL-SSL+2               
        LD      (JPSSL+1),A               
        SLA     C                         
        LD      B,TABLS/256               
        LD      A,(BC)                    
        LD      (LS1+1),A                 
        CPL                               
        LD      (LSЗ+1),A                 
        INC     C                         
        LD      A,(BC)                    
        LD      (LS2+1),A                 
        CPL                               
        LD      (LSЧ+1),A                 
        LD      B,9                       
        JP      LSS                       
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
        RRCA                              
SSL     LD      C,A                       
        LD      A,(HL)                    
LSЗ     AND     0                         
        LD      (HL),A                    
        LD      A,C                       
LS1     AND     0                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     L                         
        LD      A,(HL)                    
LSЧ     AND     0                         
        LD      (HL),A                    
        LD      A,C                       
LS2     AND     0                         
        OR      (HL)                      
        LD      (HL),A                    
        DEC     L                         
        INC     H                         
LSS     LD      A,(DE)                    
        INC     D                         
JPSSL   DJNZ    SSL                       
LSбA    LD      A,(LBT)                   
        ADD     A,6                       
        LD      (LBT),A                   
        CP      8                         
        RET     C                         
        AND     7                         
        LD      (LBT),A                   
        LD      HL,(PSA)                  
        INC     L                         
        JP      NZ,PRSЗ                   
        LD      A,H                       
        ADD     A,8                       
        LD      H,A                       
PRSЗ    LD      (PSA),HL                  
        RET                               
                                          
Здесь заключено в цикл                    
LSб     LD      B,8                       
LSбB    LD      A,(HL)                    
        AND     %00000011                 
        LD      (HL),A                    
        LD      A,(DE)                    
        INC     D                         
        OR      (HL)                      
        LD      (HL),A                    
        INC     H                         
        DJNZ    LSбB                      
        JP      LSбA                      
                                          
КОНВЕРТОР ФОНТОВ ZX-ASM'а:                
        ORG     #6000                     
        LD      HL,FONT1                  
        LD      DE,FONT2                  
        LD      C,0                       
N1      LD      B,8                       
        PUSH    DE                        
N2      LD      A,(HL)                    
        LD      (DE),A                    
        INC     HL                        
        INC     D                         
        DJNZ    N2                        
        POP     DE                        
        INC     E                         
        DEC     C                         
        JP      NZ,N1                     
        LD      HL,FONT2                  
        LD      DE,#4000                  
        LD      BC,2048                   
        LDIR                              
        JP      7997                      
        ORG     #8000                     
FONT1   INSERT  "Font8"                   
FONT2   EQU     $                         
                                          
   Программа сконвертирует и покажет фонт,
для  его  записи  узнайте  значение  метки
FONT2 и выйдя в TR-DOS запишите его (длина
2048 байт).                               
                                          
P.S.: Данный драйвер с успехом был исполь-
зован в моей последней программе REAL COM-
MANDER.  Если его кому-нибудь удасться еще
ускорить, то  пишите  мне  или  в редакцию
газеты LPRINT.                            



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

От редакции - Как связаться с редакцией газеты.

Новости - Главный редактор уезжает на Черное море... ON-LINE закрылся. Игра ПЛУТОНИЯ от группы TWIN PEAKS.

Demo - Мнение брестских синклеристов относительно демостроения.

SPECCY FOREVER - Спекки - выход из кризиса.

SPECCY FOREVER - Дискуссия: Speccy - жизни или смерть.

Таланты - Сочинение на тему "Загадочная надпись".

Программирование - Быстрый и компактный драйвер печати 42 символов в строке.

Металлургия - Как настроить модем на поднятие трубки телефона.

График BBS - График работы BBS на неделю.


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

Похожие статьи:
Вокруг света - Все что вы хотели знать о "Силиконе".
Кодерам - Обмен двух областей памяти.
Разбиралка - Описание игры INTO the EAGLES NEST.

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