О текстовом редакторе "ZX-WORD"
© Макарычев В.П., г. Москва, 1994 г.
Год назад на рынке программ я повстречался с весьма заманчивым текстовым редактором "ZX-WORD" Редактор удобен во многих отношениях, даже его версия 1.01. В настоящее время существует уже версия 2.1 (автор Елисеев Владимир), обладающая еще большими возможностями. На мой восторг быстро прошел, когда я убедился,
что принтер в этих редакторах ничего печатать не хочет. Аналогичный результат получили и мои знакомые (думаю, многие читатели ZX-ревю тоже). В ходе работ я пришел к следующим выводам.
Редактор рассчитан на работу с интерфейсом типа CENTRONICS на базе программируемого порта КР580ВВ55. На этот порт имеются ссылки в описании редактора, на него рассчитан встроенный драйвер (INSIDE DRIVER); драйвер пользователя (USER) описан применительно к нему же. Работа с этим интерфейсом проста и надежна, рекомендации по его реализации будут приведены ниже. Но, как выяснилось обе версии редактора могут работать и с ZX-Lprint III. Соответствующий драйвер приведен в листинге 1.
Указанный драйвер должен иметь название "DRIVER". Под этим именем ZX-WORD ищет драйвер пользователя (USER) и загружает его в область буфера принтера. Имеющийся на диске одноименный файл необходимо удалить или переименовать при помощи программы INSTALL, входящей в комплект поставки ZX-WORD, или любой сервисной программы.
Здесь следует отметить следующее. Драйвер пользователя (любой) загружается в область буфера принтера, а в режиме 128К (при его наличии) там находятся системные переменные. Поэтому драйвер пользователя можно использовать только в режиме 48К. Встроенный драйвер (INSIDE) расположен внутри тела редактора, поэтому при его использовании режим печати на принтер по стыку "CENTRONICS" прекрасно работает как в 48К, так и в 128К. На мой взгляд использование стыка RS-232 для 128К машин - весьма неудобное решение. Авторы, которым придется самим разрабатывать драйверы для своих конкретных условий, должны учитывать следующие особенности.
1. Соблюдение адресов точек входа. Драйвер состоит из двух частей: программы инициализации (INIT) и собственно программы печати знака (PRINT). При инициализации, например, программируется микросхема КР580ВВ55, там же удобно разместить управляющие коды принтера для включения альтернативной кодовой таблицы. Адрес входа в INIT - 23296, адрес входа в PRINT - 23299. Поэтому обязательно наличие нулевой команды NOP по адресу 23298 (можно разместить NOP в 23296, а вход в INIT - 23297).
2. Встроенный драйвер принтера для КР580ВВ55 (INSIDE) при печати знака тестирует 5-й бит данных при чтении сигналов управления из порта PC-II. Нулевое значение бита интерпретируется как наличие сигнала ошибки, выдаваемого принтером, при этом ZX-WORD осуществляет выход из режима печати. Таким образом, если в интерфейсе этот контроль не реализован, печать на принтер будет заблокирована. Можно заменить три команды драйвера, реализующие этот контроль, на нулевые байты, но лучше подключить вывод 12 микросхемы КР580ВВ55 через резистор 2 ком к шине +5В.
3. В отличие от интерфейса ZX-Lprint III, где сигнал BUSY опрашивается по 7 разряду шины данных, ZX-WORD опрашивает его по 4 разряду. Следует обеспечить соответствие программы и схемной части. В ZX-WORD 2.1 для опроса 7 разряда следует изменить содержимое ячейки 32469 с #67 на #7F.
Все вышесказанное относится к версиям 1.01 и 2.1. В листинге 2 приведен драйвер пользователя (USER) для работы с портом КР580ВВ55 в следующей конфигурации: порт РА - для подключения KEMPSTON джойстика; порт РВ - выдача информации на принтер; порт PCI бит 1 - выдача сигнала STROBE на принтер; порт PCII - приём управляющих сигналов от принтера. Дальнейшие рассуждения касаются только версии 2.1.
4. В тексте программы имеется ошибка. По адресам 28110-28122 находятся команды, заполняющие область атрибутов 22560-23296 включительно байтом #0F, причем затрагивается и ячейка буфера принтера 23296, являющаяся точкой входа программы INIT принтерного драйвера пользователя. По этой причине следует переход по неверному адресу и "зависание" программы печати. Для устранения не достатка необходимо изменить содержимое ячейки с адресом 28111 с #E0 на #DF.
5. К сожалению, программа требует реализации в компьютере KEMPSTON джойстика. При его отсутствии (из порта с адресом 31 считывается байт #FF) происходит непрерывное перемещение курсора главного меню по опциям.
__Таблица 1.
адрес ячейки |
старое значение |
новое значение |
33962 |
#27 |
#1F |
32508 |
#27 |
#1F |
32879 |
#67 |
#57 |
6. На мой взгляд, весьма неудачно выбраны атрибуты некоторых подменю, например, SETUP и др.: PAPER 4, INK 7. В итоге "читаема" только опция, выделенная курсором. Предлагаемая в таблице 1 замена устраняет этот недостаток.
7. Не совсем рационально выбрана регулировка интервалов печати строк. Используется команда управления принтера "ESC А" (27-65-n), выставляющая размер интервала n/72 дюйма. В редакторе n изменяется дискретно по формуле: n=8+4*z, где z = 0;1;2;3;4 для размера интервала редактора 0.5;1.0;1.5;2.0;2.5 строк соответственно. Таким образом, интервалу редактора 0.5 соответствует интервал принтера 8/72 дюйма, интервалу 1.0 - 12/72 и т.д. При этом даже при интервале 0.5 вертикальные линии из элементов псевдографики получаются прерывистыми, а интервалы 2.0 и 2.5 вообще теряют смысл (крупный интервал можно обеспечить вставкой пустой строки). Более удобно использовать команду управления принтера "ESC 3" (27-51-m), где т изменяется по формуле: m=13+4*z (z=0...4), что соответствует интервалу строк принтера m/216 дюйма. Для реализации указанной замены следует изменить содержимое ячеек, как указано в таблице 2.
Все вышесказанное ни в коей мере не снижает прекрасное впечатление от редактора. Прошу авторов ZX-WORD извинить меня за переделки программного продукта и в свою очередь хочу поблагодарить его создателей за весьма удачную работу.
адрес ячейки |
старое значение |
новое значение |
32223 |
#41 |
#33 |
32224 |
#0C |
#11 |
32236 |
#08 |
#0D |
00010 00020 00030 00040
00050 INIT
00060
00070
00080
00090 LP1
00100
00110
00120
00130 PRINT
00140
00150
00160
00170
00180
00010 ORG
00020 JR
00030 NOP
00040 JR
00050 INIT LD
00060
00070
00080
00090
00100 OUT
00110 LD
00120 OUT
00130 RET 00140 PRINT OUT 00150 PRINT1 CALL
00160 JR
00170 IN
00180 BIT
00190 JR
00200 BIT
00210 JR
00220 XOR
00230 OUT
00240 INC
00250 NOP
00260 NOP
00270 OUT
00280 SCF
00290 CCF
00300 RET 00310 PRINTQ SCF
00320 RET
#5B00 INIT
PRINT А,3 #1601
C,A
A, (#7B) 7,A
Z,PRIN1 LP1 A, C (#7B)
ORG
JR
NOP
JR
LD
CALL
RET
LD
IN
BIT
JR
JR
LD
OUT
NOP
OUT
NOP
OUT
(#7B),А
(#7B),A
#5B00 INIT
PRINT A,#98
(#7F),A A,1
(#5F),A
(#3F),A #1F54 NC,PRINTQ A,(#5F) 5,A
Z,PRINTQ 7,A
NZ,PRINT1 A
(#5F),A A A
(#5F),A
Листинг 1 (для ZX-Lprint III).
АДРЕС ТРАНСЛЯЦИИ ТОЧКА ВХОДА ИНИЦИАЛИЗАЦИИ ПАУЗА ДЛЯ JR PRINT = #5B03 ТОЧКА ВХОДА ПЕЧАТИ БАЙТА
ПРОВЕРКА НА ГОТОВНОСТЬ ПРИНТЕРА BUSY ПО 7 РАЗРЯДУ
ВОЗВРАТ, ЕСЛИ НЕ ГОТОВ ВОССТАНОВИТЬ ИНФОРМАЦИИ ВЫСТАВИТЬ НА ШИНУ БАЙТ ИНФОРМАЦИИ
ВЫСТАВИТЬ STROBE В 0
ВЕРНУТЬ STROBE В 1 (завершить)
Листинг 2 (Для КР580ВВ55А).
АДРЕС ТРАНСЛЯЦИИ ТОЧКА ВХОДА ИНИЦИАЛИЗАЦИИ ПАУЗА ДЛЯ JR PRINT = #5B03 ТОЧКА ВХОДА ПЕЧАТИ БАЙТА
НАСТРОЙКА АДАПТЕРА: результат побитовой PA - ВВОД раскладки шины данных
PB - ВЫВОД упр. слова порта ВВ55
PC(0-3) - ВЫВОД в режиме 0 PC ( 0-4) - ВВОД
вывод упр. слова УСТАНОВИТЬ STROBE В 1 (исх. сост.)-LT вывод 1 по РСО (STROBE)
ВЫСТАВИТЬ БАЙТ НА ШИНУ (вывод РВ из А) ПРОВЕРКА НА BREAK ВЫХОД ПО BREAK
СЧИТАТЬ СОСТОЯНИЕ ПРИНТЕРА (Ввод PC 4-7) test на ERROR принтера (BIT 5 = 0) ВЫХОД ПО ОШИБКЕ
test на готовность принтера (BUSY)
ПОВТОРИТЬ, ЕСЛИ НЕ ГОТОВ
ОБНУЛИТЬ РЕГИСТР A (для выдачи строба)
ВЫДАТЬ СТРОБ ПО PC 0
A=1
ПАУЗА ДЛЯ ДЛИТЕЛЬНОСТИ СТРОБА
ВОССТАНОВИТЬ STROBE В 1 (завершить) УСТАНОВИТЬ ФЛАГ C
ИЗМЕНИТЬ ФЛАГ НА ПРОТИВОПОЛОЖНЫЙ НОРМАЛЬНОЕ ЗАВЕРШЕНИЕ ПРИ С=0 УСТАНОВИТЬ ФЛАГ C НЕНОРМАЛЬНОЕ ЗАВЕРШЕНИЕ ПРИ C=1