Редактор для ищущих проблемы - Multi-Edit 2 / Foton

Софт только для использования в DOS

Редактор для ищущих проблемы - Multi-Edit 2 / Foton

Сообщение Gawobeka » 19 дек 2019, 23:42

Никогда не работал с Multi-Edit'ом, но, ознакомившись с эпическим трудом SergeCpp viewtopic.php?f=4&t=263, решил, что получу немалое удовольствие от процесса овладения этим шедевром. Версия 7 показалась мне слишком роскошной, и я решил заняться более суровой, но, наверное, более простой 2й версией. Не сказать, чтобы это мое мнение о 2-й версии оказалось совсем неверным. Но ...
В общем ME 2/Foton оказался своеобразной головоломкой, способной порадовать любителей экстрима. В этом плане у него много! много! достоинств. Самое первое, с чем сталкиваешься сразу - это мощный, богатый макроязык и объемистая библиотека весьма полезных макросов в файле MESYS/FTSYS.MAC. И сразу начинаются положительные эмоции - огромная часть этого богатства или не работает, или работает не так как задумывалось.
После принятия решения разобраться в причинах такого неправильного поведения легендарного редактора положительные эмоции становятся еще более яркими, так как обнаруживается, что документации по языку нет, декомпилятора тоже нет. Есть документация к 4-й версии ME. Однако там оговорено, что в язык не только добавляются новые возможности, но и удаляются какие-то старые, перечня этих изменений со 2й версии ожидаемо тоже нет )
В общем, есть где мозги поломать.

Мое внимание сначала привлекла несуразная работа макроса, осуществлящего форматирование абзацев. Но потом я подумал, что неработающий макрос рисования таблиц - более необходимая с практической точки зрения вещь.
Суть проблемы: клавиши AltL должны переводить ME2/Foton в режим рисования линий псевдографикой с автоматической корректировкой сочленений (как в последних версиях Лексикона). Но на практике можно лишь без толку гонять курсор по экрану. Линии и не рисуются, и не стираются, что в Foton'e, что в ME. Долго я предполагал, что дело в ошибке программиста, писавшего макрос. Но настоящая причина оказалась совсем другой, и она меня озадачила еще больше. Возможно, те, кто длительно работал на ME смогут ее разъяснить.
В общем, откуда все берется. В макросе linedraw рисование осуществляют комбинацией Shift'a с клавишами перемещения курсора, а перемещение курсора без рисования - теми же клавишами, но без Shift'a. В макросе производится обработка скан-кодов нажатых клавиш, в зависимости от чего осуществляются различные операции. Согласно документации к 4-й версии ME, нажатие клавиши, к примеру, "курсор влево" выдает скан-коды 0 и 77, при одновременном нажатии с клавишей Shift - 54 и 77, с клавишей Ctrl - 0 и 116. На самом же деле редактор выдает (даже вне макроса) в первом случае 0 и 77, во втором - ТОЖЕ 0 и 77, в третьем 0 и 116 (проверено по AltK). Соответственно, скан-код, вызывающий рисование, в макрос просто не поступает! Это справедливо и для остальных клавиш управления движением курсора. В то же время, сочетания букво-цифровых клавиш с Shift и Ctrl обрабатываются совершенно правильно.

Что это - ошибка в самом ME? Или изменение его настроек, до которых я не добрался? Во всяком случае, отключение руссификатора тоже не меняет дела.
В общем, очень интересно. Ведь макрос испытывали же в свое время (в 1988 году), и он, наверное, работал нормально?
Выход есть - переписать макрос на сочетание управляющих клавиш с Ctrl, но загадка останется. И, чувствую, подобных загадок в ME 2 еще не одна.

P.S. Можно было бы перенести сообщения за ноябрь 2019 г. из темы "Multi-Edit 7.0" сюда, так как они там смотрятся чужеродными.
Аватара пользователя
Gawobeka
Мастер Даунгрейда
 
Сообщения: 350
Зарегистрирован: 08 дек 2012, 22:11
Откуда: Кострома

Клавиатура

Сообщение SergeCpp » 20 дек 2019, 08:31

Gawobeka, спасибо, что помянули добрым словом мой труд!

А сама клавиатура и система что выдают?

В KeyRus (кажется) или ещё где-то есть утилита, подобная Alt+K в ME — выдаёт скан-коды плюс все модификаторы (и левые и правые отдельно должна выдавать).

Возможно:
1) Стрелки на цифровом квадратике нажимались (от NumLock зависит).
2) Левый-правый Shift/Control/Alt могут по-разному обрабатываться.
3) Иногда Shift/Control/Alt могут как-то "западать" — возвращать постоянную нажатость/отжатость, но это сколь помню только в Windows 9x встречалось и редко (решение — понажимать только модификаторы вместе: Control+Shift+Alt, убрав из фокуса DOS-окно).

С Фотоном и ME до 5 версии я почти не работал (или уже не помню), с 5 версией работал в основном как пользователь.

Документация по языку и в 7 версии имеет проблемы. Сейчас вот даже помню — недокументированность функции POS (это упрощённая версия XPOS, работающая немного быстрее); причём, даже разработчики, судя по исходникам, про неё забыли совсем (POS там встречается или единично или совсем её не было /не помню, как я узнал о её существовании/ — а должна бы вызываться очень много раз). Достаточно было и другого, но уже не помню.

Вспомнил, что с обработкой int 9 в ME (там перехватывается и есть свой обработчик) что-то было; нечётко помню, что-то с обработкой, кажется, комбинаций модификаторов. Я там изменял этот обработчик в 7 версии. Таблицу кодов (есть там в помощи) тоже дополнил/поправил.
Последний раз редактировалось SergeCpp 20 дек 2019, 09:01, всего редактировалось 6 раз(а).
Аватара пользователя
SergeCpp
Мастер Даунгрейда
 
Сообщения: 527
Зарегистрирован: 11 апр 2011, 13:49
Откуда: At Home

Re: Редактор для ищущих проблемы - Multi-Edit 2 / Foton

Сообщение Gawobeka » 21 дек 2019, 00:04

Проверил - от конкретного компьютера это не зависит. У меня не рисует ни на 286, ни на P166. На обоих ПК у меня MSDOS5.
Может, дело в версии ОС?

Сделал загрузочную дискету с PCDOS33 и подключил к DosBox'y 0.65, который стоит у меня на ноутбуке с Win7 - опять не работает. Значит дело не в версии ОС.
Запустил в DosBox'e 0.73 - не рисует.

Неожиданно! Та же версия Foton'a, запущенная в DosBox'e версий 0.57 - 0.61, работает абсолютно нормально! Коды тоже выдаются в соответствии с таблицей.

Начиная с версии 0.62 опять ничего не получается.
Вложения
Ft_DosBox57.png
Ft_DosBox57.png (22.67 Кб) Просмотров: 326
Аватара пользователя
Gawobeka
Мастер Даунгрейда
 
Сообщения: 350
Зарегистрирован: 08 дек 2012, 22:11
Откуда: Кострома

INT 9

Сообщение SergeCpp » 21 дек 2019, 07:49

Можно начать с проверки кодов, поступающих в обработку. Можно подключиться к обработчику INT 9 и посмотреть, заходит ли он в код редактора. А там уже посмотреть, что делается. В Win 9x можно использовать TRW2000 (так много удобнее), в DOS — одну из старых версий SoftIce (а так уже менее удобно).

Лучше, конечно, сразу же — в дополнение — использовать дизассемблер. Если предполагается и дальше разбираться, то, в конечном счёте, с дизассемблером будет много легче. Хотя на начальном периоде будет больше работы в сравнении с только отладчиком.

В ME7 была, помню, весьма норовистая ошибка (пропадание 51-й строки), связанная то ли с переносом то ли с копированием квадратного блока между окнами в особой и достаточно редкой на практике ситуации. Помогло разобраться именно сочетание дизассемблера и отладчика. (Оказалось использование уже занятого строкового буфера, пришлось хитроумить с организацией отдельного 2 КБ буфера строки на стеке.)
Последний раз редактировалось SergeCpp 21 дек 2019, 07:51, всего редактировалось 1 раз.
Аватара пользователя
SergeCpp
Мастер Даунгрейда
 
Сообщения: 527
Зарегистрирован: 11 апр 2011, 13:49
Откуда: At Home

Re: Редактор для ищущих проблемы - Multi-Edit 2 / Foton

Сообщение Gawobeka » 25 дек 2019, 23:05

Проблема решена: оказалось, что скан-коды, приписываемые ME'ом комбинациям Shift'а с клавишами управления курсором соответствуют нажатиям "серых" клавиш управления курсором (без Shift'a), только нужно выбрать нужный режим NumLock'ом. Не думаю, что так задумывалось изначально, ведь в подсказке прямо указывается Shift. Возможно, дело в изменении самой клавиатуры (вроде бы в это время происходил переход с 83-клавишной на расширенную), я в этом не специалист.

P.S. Оказалось, что макрос Linedraw перекочевал из ME2 в ME4 абсолютно без изменений!
Формат макросов, также, от 2й версии к 4й изменился минимально.
Формат макросов ME весьма несложен. Для сравнения могу посоветовать попробовать декомпилировать макросы из Smooth Editora :) Никак не пойму, для чего его автору пришло в голову придумывать такой ужас.
Аватара пользователя
Gawobeka
Мастер Даунгрейда
 
Сообщения: 350
Зарегистрирован: 08 дек 2012, 22:11
Откуда: Кострома

Re: Редактор для ищущих проблемы - Multi-Edit 2 / Foton

Сообщение Gawobeka » 10 янв 2020, 02:29

Некоторые технические подробности
---------------------------------------------------
Структура макро LineDraw на самом деле не такая запутанная, какой кажется на первый взгляд. В упрощенном виде:

.....................Определение и инициализация переменных и констант
========> WAIT_FOR_KEYPRESS:
|....................Read_Key;.................................Чтение скан-кодов нажатой клавиши
|............GET_KEY_CODES:
|....................Если это <Esc>, то выход из макро
|....................Если это <PgUp>, <PgDn>, <Home>, <End>, то перемещение курсора без рисования
|....................Если это клавиша перемещения курсора
|...............................Если она нажата без клавиши <Shift>, то перемещение курсора без рисования
|...............................Если одновременно нажата клавиша <Shift>, то
|.....................................Выполняется подпрограмма LOOK_AROUND, определяющая тип символа в соседних с текущим
|............................................знакоместах (сверху, снизу, справа и слева)
|.....................................Командой TEXT(символ) печатается нужный символ
|............Возврат на WAIT_FOR_KEYPRESS
|=====================|

Некоторую запутанность макросу придает строковая функция COPY(), формирующая аргумент директивы TEXT(). Она определяет, какой из перечисленных в списке символов будет печататься:
TEXT( COPY( <строка, содержащая перечень символов>, <номер символа в строке>, <число выводимых символов>) )

То, что будет напечатано, зависит от значения <номер символа в строке>, которое определяется значениями переменных, установленных в подпрограмме LOOK_AROUND, режимом работы макроса (Вставка/Замена; рисование Одинарной линией / Двойной / Стирание), наличием изменения перемещения курсора и т.д.

 Развернуть: macro
К сожалению, макрос отображается не совсем правильно из-за присутствия в нем ДОС-символов псевдографики, а переделывать на Юникод некогда

$MACRO LINEDRAW TRANS;

{ This macro allows the user to draw the single and double line characters
using the arrow keys to create lines and boxes etc. }

{ Define variables }

Def_Char(U_Char,D_Char,L_Char,R_Char);
Def_Int(Temp_Integer,Present_Direction,A_Left,A_Right,A_Up,A_Down,
Mode,Temp_Insert,D_Mode,U_Mode,L_Mode,R_Mode);

{ Store current status of certain stuff so we can restore it upon exit. }
Temp_Insert := INSERT_MODE;
Insert_Mode := False;
Undo_Stat := False;
Push_Labels;

{ Initialize variables }

Present_Direction := 0;
A_Left := 1;
A_Right := 2;
A_Up := 3;
A_Down := 4;

Mode := 1;
MAKE_MESSAGE('SINGLE LINE: |26 = move, Shift |26 = draw, F2 = О, Esc = quit.');
FLABEL('Double',2,$FF);
{
FLABEL('Box',3,$FF);
}
Goto WAIT_FOR_KEYPRESS;

GO_LEFT:
Left;

WAIT_FOR_KEYPRESS:
READ_KEY;
Insert_Mode := False;


GET_KEY_CODES:

If (KEY1 = 27) Then
Clr_Line(1,2,80);
Goto END_OF_MAC; { If so, then user hit <ESC> so...}
End;
IF KEY2 = 59 THEN
Help('LD');
END;
IF KEY2 = 60 THEN
IF (Mode < 3) THEN
Mode := Mode + 1;
End
Else
Mode := 1;
END;

MAKE_MESSAGE(Copy(
'SINGLE LINE: |26 = move, Shift |26 = draw, F2 = О, Esc = quit. DOUBLE LINE: |26 = move, Shift |26 = draw, F2 = erase, Esc = quit.ERASE: |26 = move, Shift |26 = erase, F2 = Е, Esc = quit. '
,((Mode - 1) * 68) + 1,68));
FLABEL(Copy('DoubleErase Single',((Mode - 1) * 6) + 1,6),2,$FF);
Goto WAIT_FOR_KEYPRESS;
END;

IF (KEY2 = 73) THEN
Page_Up;
End;

IF (KEY2 = 81) THEN
Page_Down;
End;

IF (KEY2 = 71) THEN
Home;
End;

IF (KEY2 = 79) THEN
Eol;
End;
{
IF KEY2 = 61 THEN
Run_Macro('BOX','');
End;
}
IF (KEY2 = 77) Then {Right arrow}
If C_Col > 252 Then {Don't allow cursor to wrap down}
Goto WAIT_FOR_KEYPRESS;
End;
If (KEY1 = 0) Then {If unshifted, then move right}
Right;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If KEY1 = 54 then {If shifted, then insert the appropriate char}
IF (Mode = 3) THEN
Text(' ');
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If Present_Direction = A_Right Then {If we were previously going a
different direction, then insert char at current cusror position. Otherwise,
insert char in the next right position}
Right;
End;
Present_Direction := A_Right;
Call LOOK_AROUND;

Temp_Integer := XPos(L_Char,'ї·ё»ЩѕЅјґ¶№µ',1);
If (Temp_Integer) Then
Left;
Text(Copy('ВТВТББРРЕЧЧЕЛЛСЛКПККОООШ',((Mode - 1) * 12) + Temp_Integer,1));
Goto GO_LEFT;
End;

If ((L_Mode > 0) and ((D_Mode + U_Mode + R_Mode) = 0)) Then
Text(Copy('ДН',Mode,1));
Goto GO_LEFT;
End;

If ((D_Mode = 1) And (U_Mode = 1)) Then
Text(Copy('ГЖГЖЖМГЖґ№ЕОґ№ГЖµµµµШО',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If ((D_Mode = 2) And (U_Mode = 2)) Then
Text(Copy('ЗМЗМЗМЗМ¶№ЧОЗМЗМґ№ґ№ЕО',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (D_Mode = 1) Then
Text(Copy('ЪХЪХїёЪХї»ВЛї»ЪХїёЪХВС',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (D_Mode = 2) Then
Text(Copy('ЦЙЦЙЦЙЦЙ·»ТЛ·»ЦЙ·»ЦЙТЛ',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (U_Mode = 2) Then
Text(Copy('УИУИУИУИЅјРКЅјУИЅјУИРК',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (U_Mode = 1) Then
Text(Copy('АФАФЩѕАФЩјБКЩјАФЩѕАФБП',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

{If no other condition exists...}
Text(Copy('ДН',Mode,1));
Goto GO_LEFT;
END;
END;

IF (KEY2 = 75) Then {Left arrow}
If C_Col = 1 Then {Don't allow cursor to wrap up}
Goto WAIT_FOR_KEYPRESS;
End;
If (KEY1 = 0) Then {If unshifted, then move left}
Left;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If KEY1 = 52 then {If shifted, then insert the appropriate char}
IF (Mode = 3) THEN
Text(' ');
Left;
Left;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If Present_Direction = A_Left Then {If we were previously going a
different direction, then insert char at current cusror position. Otherwise,
insert char in the next left position}
Left;
End;
Present_Direction := A_Left;
Call LOOK_AROUND;

Temp_Integer := XPos(R_Char,'ЪЦХЙАФУИГЗМЖ',1);
If (Temp_Integer) Then
Right;
Text(Copy('ВТВТББРРЕЧЧЕЛЛСЛКПККОООШ',((Mode - 1) * 12) + Temp_Integer,1));
Goto GO_LEFT;
End;

If ((R_Mode > 0) and ((D_Mode + U_Mode + L_Mode) = 0)) Then
Text(Copy('ДН',Mode,1));
Goto GO_LEFT;
End;

If ((D_Mode = 1) And (U_Mode = 1)) Then
Text(Copy('ґµГМЖЖґµґµЕОґµґµµ№ГМШО',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;


If ((D_Mode = 2) And (U_Mode = 2)) Then
Text(Copy('¶№ЗМГМ¶№¶№ЧОГМ¶№¶№¶№ЕО',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (D_Mode = 1) Then
Text(Copy('їёЪЙЪХїёїёВЛїёїёЪХЪЙВС',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (D_Mode = 2) Then
Text(Copy('·»ЦЙЦЙ·»·»ТЛ·»·»·»ЦЙТЛ',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (U_Mode = 2) Then
Text(Copy('ЅјУИУИЅјЅјРКЅјЅјЅјУИРК',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (U_Mode = 1) Then
Text(Copy('ЩѕАИАФЩѕЩѕБКЩѕЩѕЩѕАИБП',((L_Mode * 8) + (R_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

{If no other condition exists...}
Text(Copy('ДН',Mode,1));
Goto GO_LEFT;
END;
END;

IF (KEY2 = 72) Then {Up arrow}
If C_Line = 1 Then
Goto WAIT_FOR_KEYPRESS;
End;
If (KEY1 = 0) Then {If unshifted, then move left}
Up;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If KEY1 = 56 then {If shifted, then insert the appropriate char}
IF (Mode = 3) THEN
Text(' ');
Left;
Up;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If Present_Direction = A_Up Then {If we were previously going a
different direction, then insert char at current cusror position. Otherwise,
insert char in the next left position}
Up;
End;
Present_Direction := A_Up;
Call LOOK_AROUND;

Temp_Integer := XPos(D_Char,'їё·»ЪЦХЙВСЛТ',1);
If (Temp_Integer) Then
Down;
Text(Copy('ґµґµГГЖЖЕШШЕ№№¶№МЗММОООЧ',((Mode - 1) * 12) + Temp_Integer,1));
Goto GO_LEFT;
End;

If ((D_Mode > 0) and ((R_Mode + U_Mode + L_Mode) = 0)) Then
Text(Copy('іє',Mode,1));
Goto GO_LEFT;
End;

If ((L_Mode = 1) And (R_Mode = 1)) Then
Text(Copy('БРВЛТТБРБРЕОБРБРРКВЛЧО',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If ((L_Mode = 2) And (R_Mode = 2)) Then
Text(Copy('ПКСЛВЛПКПКШОВЛПКПКПКЕО',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (L_Mode = 1) Then
Text(Copy('ЩЅї»ї·ЩЅЩЅґ№ЩЅЩЅЩЅї»ґ¶',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (L_Mode = 2) Then
Text(Copy('ѕјё»ё»ѕјѕјµ№ѕјѕјѕјё»µ№',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (R_Mode = 2) Then
Text(Copy('ФИХЙХЙФИФИЖМФИФИФИХЙЖМ',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (R_Mode = 1) Then
Text(Copy('АУЪЙЪЦАУАУГМАУАУАУЪЙГЗ',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

{If no other condition exists...}
Text(Copy('іє',Mode,1));
Goto GO_LEFT;
END;
END;

IF (KEY2 = 80) Then {Down arrow}
If (KEY1 = 0) Then {If unshifted, then move right}
Down;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If KEY1 = 50 then {If shifted, then insert the appropriate char}
IF (Mode = 3) THEN
Text(' ');
Left;
Down;
Present_Direction := 0;
Goto WAIT_FOR_KEYPRESS;
END;
If Present_Direction = A_Down Then {If we were previously going a
different direction, then insert char at current cusror position. Otherwise,
insert char in the next right position}
Down;
End;
Present_Direction := A_Down;
Call LOOK_AROUND;

Temp_Integer := XPos(U_Char,'ЩѕЅјАУФИБПКР',1);
If (Temp_Integer) Then
Up;
Text(Copy('ґµґµГГЖЖЕШШЕ№№¶№МЗММОООЧ',((Mode - 1) * 12) + Temp_Integer,1));
Goto GO_LEFT;
End;

If ((U_Mode > 0) and ((R_Mode + D_Mode + L_Mode) = 0)) Then
Text(Copy('іє',Mode,1));
Goto GO_LEFT;
End;

If ((L_Mode = 1) And (R_Mode = 1)) Then
Text(Copy('ВТВТТЛВТБКЕОБКВТРРВТЧО',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;


If ((L_Mode = 2) And (R_Mode = 2)) Then
Text(Copy('СЛСЛСЛСЛПКШОСЛСЛБКБКЕО',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (L_Mode = 1) Then
Text(Copy('ї·ї·ї·ї·Щјґ№Щјї·ЩЅї·ґ¶',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (L_Mode = 2) Then
Text(Copy('ё»ё»ё»ё»ѕјµ№ѕјё»ѕјё»µ№',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (R_Mode = 2) Then
Text(Copy('ХЙХЙХЙХЙФИЖМФИХЙФИХЙЖМ',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

If (R_Mode = 1) Then
Text(Copy('ЪЦЪЦЪЦЪЦАИГМАИЪЦАУЪЦГЗ',((U_Mode * 8) + (D_Mode * 2)) + Mode,1));
Goto GO_LEFT;
End;

{If no other condition exists...}
Text(Copy('іє',Mode,1));
Goto GO_LEFT;
END;
END;


{*****************************************************************************}
Goto WAIT_FOR_KEYPRESS;


LOOK_AROUND:
{ This subroutine looks at all chars surrounding CUR_CHAR and stores them into
variables }

If (((C_Row + 2) > Win_Y1) And ((C_Row + 4) < Win_Y2)) Then
Refresh := False;
End;

If C_Line > 1 Then
UP;
U_Char := Cur_Char;
RIGHT;
DOWN;
End
Else
U_Char := '|0';
Right;
End;
R_Char := Cur_Char;
DOWN;
LEFT;
D_Char := Cur_Char;
If C_COL > 1 Then
LEFT;
UP;
L_Char := Cur_Char;
RIGHT;
End
Else
L_Char := '|0';
Up;
End;
Refresh := True;
D_mode := XPos(D_Char,'іЕБГґАЩєОКМ№Иј',1);
D_mode := (D_Mode > 0) + (D_Mode > 7);
U_mode := XPos(U_Char,'іЕВГґЪїєОЛМ№Й»',1);
U_mode := (U_Mode > 0) + (U_Mode > 7);
L_mode := XPos(L_Char,'ЕБГАДЪВОКМИНЙЛ',1);
L_mode := (L_Mode > 0) + (L_Mode > 7);
R_mode := XPos(R_Char,'ЕБґїДЩВОК№»НјЛ',1);
R_mode := (R_Mode > 0) + (R_Mode > 7);

RET;

END_OF_MAC:

INSERT_MODE := Temp_Insert; { Switch previous insert/overwrite mode }
Pop_Labels;
Undo_Stat := True;

END_MACRO;
Последний раз редактировалось Gawobeka 10 янв 2020, 02:34, всего редактировалось 1 раз.
Аватара пользователя
Gawobeka
Мастер Даунгрейда
 
Сообщения: 350
Зарегистрирован: 08 дек 2012, 22:11
Откуда: Кострома

LINEDRAW

Сообщение SergeCpp » 10 янв 2020, 17:57

Как всегда, всё кроется "в деталях".

Скорее всего, все те "хитрые последовательности" перешли и в ME7. Так вот, когда я всё это там изучал, то углядел в разных местах этих последовательностей неточности, это было и практически заметно при рисовании (это-то и побудило исследовать). Сколь помню, я тогда даже неполностью всё поправил. Что ж, останется для желающих, всё это найти и поправить. Там не так всё просто, как думается (вот, авторы же недоглядели, а это же авторы! и несколько лет сопровождения!).

Это всё чрезвычайно времязатратное дело, выискивать там и высматривать неточности. Я тогда наметил начало, но, видно, нехватило усидчивости или отложил, а позже уже и сил не стало. Это как с макроотладчиком, за раз не справиться (мне). Там, чтобы поправить всего один знак в одной из этих хитрых последовательностей, необходимо много потрудиться, в основном рутинно.

Также при рисовании постоянно возникают всякие неудобности и шероховатости, верно, малозаметные менее требовательному пользователю. А также усматриваются различные усовершенствования.

Сейчас вот скачал свой тот ME_PLUS, там макрофайл LINEDRAW.S занимает 42.7 КБ и состоит из 2289 строк. Причём и в модернизациях там я многое не доделал, припоминаю, и ещё что-то.

Чтобы более-менее всё доделать в моей модификации ME7, причём не начиная нового (а это крайне сложно, ибо там проблема на проблеме сидит и проблемой погоняет, уж я-то знаю), нужно прикидочно года три, причём именно мне и "мне лет 20 назад", а не сегодняшнему. Не ежедневно, конечно. Но, вспоминаю, было и несколько месяцев ежедневного труда да по многу часов (там же ещё неописанного много сделано, плюс невключённого в эти исходники много /скорее, исключённого/). Новому человеку (да и мне уже сейчас) разбираться достаточно сложно, хотя я там основное упорядочил. Шанс, что кто-то этим займётся, плюс этот кто-то будет не по верхам скакать (как, порой, делали сами разработчики), оцениваю почти строго ноль.

Командная работа здесь совершенно не подходит, ибо всё связано очень. Часто при простом выравнивании-форматировании исходников видишь такое, что сразу же нужно изменить, а это требует изменения многих файлов.

Объём считаю вполне охватываем одним человеком, который не занят рабочим программированием.

Что-то я тут уже уклоняюсь куда-то... Да ладно. Вот, для удобства, прикрепляю LINEDRAW.S из ME_PLUS.

LINEDRAW.ZIP
(8.29 Кб) Скачиваний: 7
Последний раз редактировалось SergeCpp 10 янв 2020, 18:32, всего редактировалось 1 раз.
Аватара пользователя
SergeCpp
Мастер Даунгрейда
 
Сообщения: 527
Зарегистрирован: 11 апр 2011, 13:49
Откуда: At Home


Вернуться в Программы для DOS

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1