ZX-Ревю 1996 №1-2 1996 г.

Читатель - читателю - устранение ошибки TLW2.


ЧИТАТЕЛЬ - ЧИТАТЕЛЮ

Устранение ошибки TLW2.

© Виктор Смирнов, г. Воткинск.

Хочу предложить простой способ устранения ошибки форматирования однострочного абзаца в популярном текстовом редакторе TLW2. Ошибка заключается в том, что после каждого форматирования абзаца размером в одну строку, значение левого поля возрастает на величину абзацного отступа, хотя значение, индицируемое в служебном экране не изменяется.

Все дело в том, что форматирование абзаца выполняется в цикле по строкам. Находится начало строки и определяется, первая это строка в абзаце или нет. Если строка первая, к значению левого поля прибавляется значение абзацного отступа, результат запоминается в ячейке, в которой до этого хранилось значение левого поля, которое временно сохраняется в другой ячейке. Если же строка в абзаце не первая, то прибавления величины абзацного отступа не происходит, в остальном выполняются те же операции. Затем производится форматирование строки и её печать на экране. Проверяется, остался ли ещё текст в абзаце, и, если абзац не закончен, восстанавливается значение левого поля в ячейке 65281 и всё повторяется. Таким образом, если значение в ячейке 65281 хотя бы раз восстанавливалось, при выходе из процедуры форматирования там будет содержаться величина левого поля.

Ни разу не восстанавливается это значение в двух случаях: при форматировании с , последней строки абзаца или при форматировании однострочного абзаца. Но в первом случае величина абзацного отступа к величине левого роля не добавляется, и мы просто не замечаем

ошибки. Во втором же случае строка является одновременно и первой и последней и, при выходе из процедуры, в переменной 65281 остается сумма величин левого поля и абзацного отступа. Задача заключается в том, чтобы восстанавливать переменную 65281 в каждом случае. Для этого достаточно запомнить её в дополнительной ячейке в начале форматирования и при выходе сделать переход на небольшую процедуру её восстановления. Замечу, что доработки выполнены для версии редактора, русифицированной фирмой "КОРДИАЛ".

Найти свободное место для размещения этой процедуры мне удалось, просмотрев файл "tlw+" в графическом представлении. Для этих целей я пользуюсь программой SPRINT, с помощью которой легко находить графику и шаблоны, да и вообще получать общее представление о структуре просматриваемых блоков. Оказалось, что в теле блока есть две совершенно одинаковые области длиной по 64 байта, содержащие шаблоны специальных знаков (индикаторы конца строки и абзаца, курсоры и т.п.), причём сама программа пользуется только одним из них, расположенным с адреса 63297. Второй же, по адресу 49900, нигде в программе не применяется. Этого вполне достаточно, чтобы разместить наши доработки.

Следующая табличка поможет легко выполнить все изменения. БЫЛО СТАЛО

60453 LD HL,(652 81) 60453 C3 EC C2 JP 49900

60704 JP 62369 60704 C3 F7 C2 JP 49911

49900 2A 01 FF LD HL,(65281) 49903 22 F5 C2 LD (49909),HL

49906 C3 28 EC JP 60456

49909 левое поле

49910 правое поле

49911 2A F5 C2 LD HL,(49909) 49914 22 01 FF LD (65281),HL 49917 C3 A1 F3 JP 62369

Тем, кто желает во всем разобраться сам, подскажу, что расчёт адресов процедур выполняется по коду команды в регистре A. Рассчитывается адрес в таблице векторов и по содержащемуся там адресу происходит вызов нужной процедуры.

Подпрограмма расчёта начинается с адреса 53209, процедура форматирования с адреса 60418. Величина абзацного отступа, в отличие от других переменных, хранится в виде кода

символа по адресу 51444 вместе с символьной строкой "Абзац X", где X - абзацный отступ. *************************************************************************************




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Рассказ - фэнтэзи-рассказ: Фантазия.
Пикник - Впечатление от Omega Party.
Конкурс - Конкурс GFX - первые работы ...

В этот день...   19 июня