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

Читатель-читателю - Перекодировщик PASCAL-TEXT.


   Перекодировщик PASCAL-TEXT
 ---------------------------------
  (C) Архипов Н.Г.,
             г.Чебоксары, 1995.
----------------------------------

    Предлагаю вниманию   читателей  
 ZX-РЕВЮ программку.  Ее я написал  
 еще в прошлом году для себя. Тре-  
 бовалось из  файла  с  исходником  
 ПАСКАЛЬ-программы получить  текс-  
 товый файл, годный для редактиро-  
 вания в текстовом редакторе. Пер-  
 воначально предполагалось исполь-  
 зовать TLW2+, но потом оказалось,  
 что и IS-EDITOR его неплохо пере-  
 варивает. Небольшая    неучтенная  
 накладочка -   последнюю   строку  
 текста надо удалять вручную.  Это 
 происходит потому,  что последний 
 сектор  текстового  файла   может 
 быть заполнен не полностью. А там 
 может быть все, что угодно. Можно 
 было бы   добить  остаток  текста 
 пробелами или заполнить  ими  все 
 исходное поле для текста - можете 
 поэкспериментировать. К  тому  же 
 саму программу можно укоротить за 
 счет введения подпрограмм  вместо 
 отдельных участков. Это то место, 
 где идет работа с группой  парных 
 регистров. Так что есть поле дея- 
 тельности и тренажер  для  нович- 
 ков. Для отладки советую изменить 
 адрес ассемблирования.            
    Теперь о самой программе.  Как 
 я уже говорил,  она поможет отре- 
 дактировать (написать комментарии  
 и сообщения на русском языке) от-  
 лаженную ПАСКАЛЬ-программу  и вы-  
 вести ее на принтер.  Как извест-  
 но, HP4TM16 позволяет выводить на  
 принтер только сообщения  пользо-  
 вательской программы  при подклю-  
 чении соответствующего    канала.  
 Распечатать же  листинг  - это не  
 предусмотрено. Предвижу   простой  
 вопрос -    зачем   эта   игрушка  
 HP4TM16 нужна?   Ведь   приличной  
 программы на   нем  не  написать.  
 Согласен, но для изучения  самого  
 языка - вещь незаменимая.  Вы мо-  
 жете выполнять  домашние  задания  
 или лабораторные работы на дому и  
 выводить листинг на принтер вмес-  
 то утомительного списывания его с  
 экрана. Именно эти цели я и прес-  
 ледовал. Теперь с работами у меня  
 нет проблем.  Листинг  печатаю  в  
 IS-DOS, а результаты работы выво-  
 жу во время работы программы.  Да  
 и скорость работы оттранслирован-  
 ной  программы  на  порядок  выше  
 скорости аналога    на   Бейсике.  
 Всем, у кого  подобные  проблемы,  
 рекомендую мою программу.          
    В первую  очередь  я   выяснил  
 формат хранения   ПАСКАЛЬ-текста.  
 Оказалось, что первые  два  байта  
 отвечают за номер строки, их мож-  
 но заменить пробелами сразу,  без  
 проблем, или  вообще  пропустить.  
 Следующий байт является табулято-  
 ром, его надо распаковать,  чтобы  
 сохранить "ступенчатый" вид  лис-  
 тинга. Ключевые слова ПАСКАЛЯ ти-  
 па PROGRAM или BEGIN заменены  на  
 токены с кодами больше 129. Далее  
 следуют токены и обыкновенные ко-  
 ды ASCII.  Строка завершается ко-  
 дом 13. Все это учтено.           
    Было решено  программу  писать 
 на ассемблере,  так как  скорость 
 Бейсика невелика.   Но  вспомога- 
 тельную часть  как-то  ввод  имен 
 файлов исходного и готового, заг- 
 рузка исходного - проще  написать 
 на Бейсике.   Отгрузку   готового 
 текста, из-за сложности  передачи 
 параметров в  Бейсик,  решил осу- 
 ществлять в кодах.  Надо сказать, 
 что программа работает моменталь- 
 но. На перекодировку исходника  в 
 20 блоков  уходит  около секунды. 
 Еще через мгновение программа го- 
 това для приема следующего файла. 
 Так как  ПАСКАЛЬ-программы  имеют 
 ограниченную длину,  введена про- 
 верка. Программа активно  исполь- 
 зует системные  переменные TR-DOS 
 и BASIC.  Так,  имя  отгрузочного 
 файла в области переменных должно 
 находиться в определенном месте и 
 это надо учитывать тем, кто будет 
 модифицировать Бейсик-часть.  При 
 повторном входе в программу выво- 
 дится сообщение в тот канал,  ко- 
 торый остался   текущим,  поэтому 
 перед входом   оператором   PRINT 
 подключаем основной экран.        
    Название программы  происходит 
 от полного слова КОНВЕРТЕР.       
    В заключение хочу сказать, что 
 в IS-DOS  есть подобная процедур- 
 ка, но перекачивающая  тексты  из 
 GENS в  IS-ASSEMBLER.  В GENS ис- 
 ходник хранится в виде  сплошного 
 текста, без токенов. Может кто-то 
 сможет адаптировать программу под 
 данную систему и тогда все опера- 
 ции можно  проводить  с   большим 
 комфортом.                        
                                   
 --------------------------------------------------------------------- 
          Программа "КОНВЕРТ" для перекодировки файлов                 
             HP4TM16 в формат текстового редактора.                    
        (С) Архипов Н.Г. (Rojersoft)  г.Чебоксары, 1994.               
                                                                       
   00010        ORG  23872       ;                                     
   00020        LD   A,%01001110 ;                                     
   00030        LD   (23693),A   ;Постоянные атрибуты.                 
   00040        LD   A,2         ;                                     
   00050        CALL #1601       ;Печать в главную часть экрана.       
   00060        LD   B,24        ;                                     
   00070        CALL #E44        ;Очистка экрана.                      
   00080        LD   A,1         ;                                     
   00090        LD   BC,254      ;BORDER 1.                            
   00100        OUT  (C),A       ;                                     
   00110        LD   HL,#3D00    ;                                     
   00120        LD   DE,27904    ;                                     
   00130        PUSH DE          ;                                     
   00140        LD   BC,#300     ;                                     
   00150        LDIR             ;                                     
   00160        POP  HL          ;      Процедура                      
   00170        PUSH HL          ;                                     
   00180        LD   DE,#300     ;        формирования                 
   00190        LD   B,#60       ;                                     
   00200 FONT2  PUSH BC          ;          стилизованного             
   00210        INC  HL          ;                                     
   00220        INC  HL          ;            шрифта.                  
   00230        INC  HL          ;                                     
   00240        INC  HL          ;                                     
   00250        LD   B,4         ;                                     
   00260 FONT1  LD   A,(HL)      ;                                     
   00270        LD   C,A         ;                                     
   00280        SRL  A           ;                                     
   00290        OR   C           ;                                     
   00300        LD   (HL),A      ;                                     
   00310        INC  HL          ;                                     
   00320        DJNZ FONT1       ;                                     
   00330        POP  BC          ;                                     
   00340        DJNZ FONT2       ;                                     
   00350        POP  HL          ;                                     
   00360        DEC  H           ;                                     
   00370        LD   (23606),HL  ;                                     
   00380        RET              ;Возврат в Бейсик.                    
   00390        LD   DE,TEXT1    ;Точка повторного входа.              
   00400        LD   BC,38       ;Печать "фирменного"                  
   00410        CALL #203C       ; сообщения.                          
   00420        LD   BC,(23784)  ;Взять длину загруженного             
   00430        LD   A,B         ; файла и сравнить                    
   00440        CP   77          ; с допустимой.                       
   00450        JR   C,NOER      ;                                     
   00460        RST  8           ;Если превышение, то печать           
   00470        DEFB 3           ; "Out of memory".                    
   00480 NOER   LD   HL,44286    ;Если нет, то в HL-начало PASCAL.     
   00490        LD   IX,28925    ;Начало выходного текста.             
   00500        LD   DE,0        ;Счетчик.                             
   00510 CR     LD   A,32        ;1-й байт PASCAL (N строки)           
   00520        LD   (IX+0),A    ; заменяем на пробел.                 
   00530        INC  IX          ;                                     
   00540        INC  HL          ;                                     
   00550        INC  DE          ;Приращения.                          
   00560        DEC  BC          ;Не конец ли PASCAL-текста?           
   00570        LD   A,B         ;                                     
   00580        OR   C           ;                                     
   00590        JR   Z,SAVE      ;Если да, то выгрузить результат.     
   00600        LD   A,32        ;То же и со вторым байтом.            
   00610        LD   (IX+0),A    ;                                     
   00620        INC  IX          ;                                     
   00630        INC  HL          ;                                     
   00640        INC  DE          ;                                     
   00650        DEC  BC          ;                                     
   00660        LD   A,B         ;                                     
   00670        OR   C           ;                                     
   00680        JR   Z,SAVE      ;                                     
   00690        XOR  A           ;                                     
   00700        CP   (HL)        ;Проверить 3-й байт                   
   00710        JR   Z,NIL       ; (табулятор).                        
   00720 SPACE  LD   A,32        ;Табуляторы заменяем на пробелы       
   00730        LD   (IX+0),A    ; без уменьшения счетчика длины       
   00740        INC  IX          ; PASCAL-текста.                      
   00750        INC  DE          ;                                     
   00760        DEC  (HL)        ;                                     
   00770        JR   NZ,SPACE    ;                                     
   00780 NIL    LD   A,32        ;Байт табулятора -> тоже пробел.      
   00790        LD   (IX+0),A    ;                                     
   00800 LOOP   INC  IX          ;                                     
   00810 NEXT   INC  IX          ;                                     
   00820        INC  DE          ;                                     
   00830        DEC  BC          ;                                     
   00840        LD   A,B         ;                                     
   00850        OR   C           ;                                     
   00860        JR   Z,SAVE      ;                                     
   00870        LD   A,(HL)      ;Не ENTER ли следующий байт?          
   00880        CP   13          ;                                     
   00890        JR   NZ,NOCR     ;Если нет, то дальше.                 
   00900        LD   (IX+0),A    ;                                     
   00910        INC  IX          ;                                     
   00920        INC  HL          ;                                     
   00930        INC  DE          ;                                     
   00940        DEC  BC          ;                                     
   00950        LD   A,B         ;                                     
   00960        OR   C           ;                                     
   00970        JR   Z,SAVE      ;                                     
   00980        JR   CR          ;Иначе - принять меры.                
   00990 NOCR   CP   129         ;Если очередной байт .129,            
   01000        JR   C,NOTOK     ; то это токен PASCAL                 
   01010        CALL TOKEN       ; развернуть его. После возврата      
   01020        JR   NEXT        ; перейти к следующему байту.         
   01030 NOTOK  LD   (IX+0),A    ;Иначе - это код ASCII, нужно         
   01040        JR   LOOP        ; просто скопировать его.             
   01050 TOKEN  PUSH HL          ;Сохранить регистры.                  
   01060        PUSH BC          ;                                     
   01070        AND  127         ;Получили порядковый номер токена.    
   01080        LD   B,A         ;                                     
   01090        LD   HL,TEXTS    ;Начало таблицы токенов.              
   01100 BITS   BIT  7,(HL)      ;Токены разделены инверсным           
   01110        JR   NZ,COUNT    ; байтом, считаем такие байты.        
   01120        INC  HL          ;                                     
   01130        JR   BITS        ;                                     
   01140 COUNT  INC  HL          ;                                     
   01150        DJNZ BITS        ;Кончили считать, в HL-адрес          
   01160 COPY   BIT  7,(HL)      ; начала токена.                      
   01170        JR   NZ,END      ;Копируем токен, пока не встретится   
   01180        LD   A,(HL)      ; еще один инверсный байт.            
   01190        LD   (IX+0),A    ;                                     
   01200        INC  IX          ;                                     
   01210        INC  HL          ;                                     
   01220        INC  DE          ;                                     
   01230        JR   COPY        ;                                     
   01240 END    POP  BC          ;Если таковой встретился, то          
   01250        POP  HL          ; восстанавливаемся и возврат.        
   01260        RET              ;                                     
   01270 SAVE   LD   HL,(23627)  ;Начало области VARS.                 
   01280        LD   BC,6        ;Пропускаем 6 байтов.                 
   01290        ADD  HL,BC       ;Получим имя файла для отгрузки.      
   01300        PUSH DE          ;Длину полученного текста на стек.    
   01310        LD   DE,23773    ;В переменную переносим имя файла.    
   01320        LD   BC,8        ;                                     
   01330        LDIR             ;                                     
   01340        LD   HL,28925    ;Адрес начала готового текста.        
   01350        POP  DE          ;Длина текста.                        
   01360        LD   C,11        ;                                     
   01370        CALL 15635       ;Отгрузка текста на диск.             
   01380        RET              ;Возврат.                             
   01390 TEXT1  DEFB 22,0,1,19,1                                       
   01400        DEFB 16,4,17,0,32                                      
   01410        DEFB 32,127                                            
   01420        DEFM " 1994"                                           
   01430        DEFM ".09.28 by "                                      
   01440        DEFM "RojerSoft  "                                     
   01450 TEXTS  DEFB 128           ;Шаблоны токенов.                   
   01460        DEFM "Program"     ;  Их можно задавать                
   01470        DEFB 128           ;    по своему вкусу.               
   01480        DEFM "Div"         ;                                   
   01490        DEFB 128         Ъ---------------------------------    
   01500        DEFM "Const"     і   01820        DEFM "Repeat"        
   01510        DEFB 128         і   01830        DEFB 128             
   01520        DEFM "Procedure" і   01840        DEFM "Case"          
   01530        DEFB 128         і   01850        DEFB 128             
   01540        DEFM "Function"  і   01860        DEFM "While"         
   01550        DEFB 128         і   01870        DEFB 128             
   01560        DEFM "Not"       і   01880        DEFM "For"           
   01570        DEFB 128         і   01890        DEFB 128             
   01580        DEFM "Or"        і   01900        DEFM "If"            
   01590        DEFB 128         і   01910        DEFB 128             
   01600        DEFM "And"       і   01920        DEFM "Begin"         
   01610        DEFB 128         і   01930        DEFB 128             
   01620        DEFM "Mod"       і   01940        DEFM "With"          
   01630        DEFB 128         і   01950        DEFB 128             
   01640        DEFM "Var"       і   01960        DEFM "GoTo"          
   01650        DEFB 128         і   01970        DEFB 128             
   01660        DEFM "Of"        і   01980        DEFM "Set"           
   01670        DEFB 128         і   01990        DEFB 128             
   01680        DEFM "To"        і   02000        DEFM "Array"         
   01690        DEFB 128         і   02010        DEFB 128             
   01700        DEFM "DownTo"    і   02020        DEFM "Forward"       
   01710        DEFB 128         і   02030        DEFB 128             
   01720        DEFM "Then"      і   02040        DEFM "Record"        
   01730        DEFB 128         і   02050        DEFB 128             
   01740        DEFM "Until"     і   02060        DEFM "Type"          
   01750        DEFB 128         і   02070        DEFB 128             
   01760        DEFM "End"       і   02080        DEFM "In"            
   01770        DEFB 128         і   02090        DEFB 128             
   01780        DEFM "Do"        і   02100        DEFM "Label"         
   01790        DEFB 128         і   02110        DEFB 128             
   01800        DEFM "Else"      і   02120        DEFM "Nil"           
   01810        DEFB 128         і   02130        DEFB 128             



СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Вступление - содержание номера.
Новости - ББС НОВОСТИ
От авторов - издание Sinclair Club продолжает свою деятельность.

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