Pyk wrote:Нет, это еще тормознее традиционного способа получилось, чуть позже постараюсь привести пример.
Pyk wrote:Да, стало значительно лучше, но тормоза все равно ощущаются...
Парсинг текста на предмет табуляции много времени требует.
А ещё сейчас подсчёт первой экранной строки буфера происходит нудным сканированием обратно: Можете проверить, указав через X в DE произвольный адрес в интервале до 2EFF.
Этим на начальных стадиях обеспечилась устойчивость кода и универсальность, так как помимо отображения развёрнутого текста в окне с подсчётом номеров строк, ещё заполняется буфер указателей на каждую строку.
Конечно, сейчас очевидно, что пока каретка не выходила за верхний/нижний край экрана, пересчёт строк делать не нужно. Это дело добавления ещё одного флажка.
Pyk wrote:Неплохо бы вообще от F812 избавиться, как источника тормозов. А в идеале избавиться и от F803 и постараться сделать все на F81B

Но это непросто, я думаю, особенно без прерываний от таймера...
Ну, почему же?
Например, директива D Монитора обращается к F812 по 58 раз за строку - это норма. Это тормозит до нажатия любой клавиши.
У меня это - вынужденная мера. Попробуйте занулить три ячейки по адресам 03D1-03D3 и сравните: Вывод быстрее, но перемещаться курсором становится тормознее.
А вот обращение к F81B - тоже не панацея. В ZX-Spectrum'е существовали игры, где в опциях по переназначению клавиш забыли добавить антидребезг и хоть какую-то паузу. Как итог, одна клавиша назначалась махом на все действия и в игру невозможно было играть. Видимо, владельцы Kempstone-джойстиков тестировали и не заметили такой баг.
Переписать код, чтобы стрелочные клавиши работали через F81B можно, но это трата драгоценных байтов редактора (под вариант для ПЗУ F000-F7FF).
Pyk wrote:Типа такого (см. вложения).
Один вариант очень быстрый, но большой по объему, второй - чуть медленнее, но более компактный.
(перед запуском заполнить чем-нибудь экран)
Ну, если так, то можно:
Code: Select all
0000: 2A F2 7F 31 D0 76 01 E9-00 AF E3 33 E3 33 E3 33
0010: E3 33 E3 33 E3 33 E3 33-E3 33 E3 33 E3 33 0B B0
0020: F2 0A 00 C3 03 00
На стеке только вертикальную прокрутку можно сделать, но не отображение строки: Горизонтальная прокрутка не ускорится.
А в целом...
Необходимо именно редактируемую строку в отдельном подбуфере изменять и отображать. При переходе к другой строке текущую следует в общий буфер вставить, предварительно его раздвинув/ужав.
Это же в Бейсиках происходит в манипуляциях листинга.
И об этом я думал, но хотелось просто хоть как-то код заставить работать.
Но, именно заточка под ПЗУ, когда
портить ОЗУ промежуточными буферами нежелательно, отодвинуло это на второй план.
Все эти недели я только и боролся с тем, чтобы код - элементарно не падал.
Фрагменты с корректированием табуляции - самое больное место: Весь текст искажается в случае просчёта.
А ещё есть
страшные подпрограммы возвращения указателя на текст по координате каретки с учётом табуляции - вот настоящий адский уголок!!!
Сейчас я побаиваюсь что-то оптимизировать.
Нужно продумать базовую логику и переписать всё с чистого листа.
Хотя...
Можете
запустить промежуточный вариант где мышью работает прокрутка вниз/вверх скроллингом и отображением одной ключевой строки.
Выглядит шустро и весело, но имеются баги и все 2 Кб памяти занято уже.
(Сравните текст приветствия по G0).
P.S.: А если вдуматься, редакторы "Микрон" и "WEL" значительно уступают в скорости, но тысячи пользователей как-то справлялись.
