Перекодировщик 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