Если первый байт E6, то предполагаем, что следующие 4 байта это начало и конец. Вычисляю длину, сравниваю с длиной остатка плюс-минус 16 байт. Ну ещё проверяю стартовый адрес, чтобы не выходил за рамки ОЗУ.Pyk wrote:Сделал какую-то проверку в итоге?b2m wrote:Исправил эмулятор. Теперь грузит без ошибки.
ПОБЕДИТ - Редактор текстового буфера
Moderator: Shaos
Re: Маленький Кустарный Экранный Редактор
Страничка эмулятора наших компьютеров
http://bashkiria-2m.narod.ru/
http://bashkiria-2m.narod.ru/
Цикл вертикальной прокрутки
Со светлым праздником Пасхи!
Отладил код вертикальной реверсивной прокрутки посредством SPHL/XTHL.
После запуска выводится дамп и происходит его прокрутка вниз.
При нажатии стрелки вверх производится прокрутка вверх.
На перенос двух символов - 41 такт.
На перенос 50 символов - 220 тактов циклом и 356 - рядом.
Соответственно, 356*32 = 11392 такта на область 64x25.
Вертикальную прокрутку сделать быстрее легче, так как после прокрутки экрана достаточно вывести одну строку листинга вверху или внизу.
А вот при горизонтальной - приходится пробегать по всем строчкам и вынимать по одному скрытому символу.
В общем, стрелками можно прокручивать во всех четырёх направлениях. Причём, стрелка влево работает медленнее, чем вправо, так как отображает все 25 открывшихся символа слева, тогда как справа - только один. Это для сравнения производительности кода и оценки затрат на парсинг строк.
ВАЖНО
По ошибке был вкачан образ файла со сбитым указателем.
Необходимо его перескачать.
БАГ: Обнаружен при прокрутке на 17 знакомест в строке табуляций.
Пока не устраняется никак. Даже в стабильной версии.
P.S.: На сколько ли такая скорость приемлема?
(Думаю, если быстрее директивы D - нормально.)
Отладил код вертикальной реверсивной прокрутки посредством SPHL/XTHL.
После запуска выводится дамп и происходит его прокрутка вниз.
При нажатии стрелки вверх производится прокрутка вверх.
На перенос двух символов - 41 такт.
На перенос 50 символов - 220 тактов циклом и 356 - рядом.
Соответственно, 356*32 = 11392 такта на область 64x25.
Вертикальную прокрутку сделать быстрее легче, так как после прокрутки экрана достаточно вывести одну строку листинга вверху или внизу.
А вот при горизонтальной - приходится пробегать по всем строчкам и вынимать по одному скрытому символу.
В общем, стрелками можно прокручивать во всех четырёх направлениях. Причём, стрелка влево работает медленнее, чем вправо, так как отображает все 25 открывшихся символа слева, тогда как справа - только один. Это для сравнения производительности кода и оценки затрат на парсинг строк.
ВАЖНО
По ошибке был вкачан образ файла со сбитым указателем.
Необходимо его перескачать.
БАГ: Обнаружен при прокрутке на 17 знакомест в строке табуляций.
Пока не устраняется никак. Даже в стабильной версии.
P.S.: На сколько ли такая скорость приемлема?
(Думаю, если быстрее директивы D - нормально.)
- Attachments
- rk86-horz-vert-scroll.rkr.zip
- Оценочный код горизонтальной и вертикальной прокрутки
- (2.97 KiB) Downloaded 172 times
Re: Маленький Кустарный Экранный Редактор
Получилось отлично!
Вверх, вниз и вправо - просто огонь, влево - тоже вполне комфортно, особенно, если прокрутка недалеко (к тому же допускаю, что тут еще возможна оптимизация).
Отзывчивость клавиатуры при опросе через F81B тоже отличная! (хотя не знаю, что будет с дребезгом на реале)
41 такт на пару символов очень неплохо. В моем примере 34, но это не критично, раз оказалось по каким-то причинам удобнее выбрать другой вариант.
Вверх, вниз и вправо - просто огонь, влево - тоже вполне комфортно, особенно, если прокрутка недалеко (к тому же допускаю, что тут еще возможна оптимизация).
Отзывчивость клавиатуры при опросе через F81B тоже отличная! (хотя не знаю, что будет с дребезгом на реале)
41 такт на пару символов очень неплохо. В моем примере 34, но это не критично, раз оказалось по каким-то причинам удобнее выбрать другой вариант.
Маленький Кустарный Экранный Редактор
Для игры было бы нормально. Но это - редактор текста.Pyk wrote:Отзывчивость клавиатуры при опросе через F81B тоже отличная! (хотя не знаю, что будет с дребезгом на реале)

Унификация подпрограммы до реверса (через флаг CF передаётся направление прокрутки).Pyk wrote:В моем примере 34, но это не критично, раз оказалось по каким-то причинам удобнее выбрать другой вариант.
Вот ума не приложу, как оптимизировать ключевую подпрограмму возврата позиции в строке по экранной позиции (когда курсор вдруг попадает в центр табуляции, его нужно выровнять).Pyk wrote:Вверх, вниз и вправо - просто огонь, влево - тоже вполне комфортно, особенно, если прокрутка недалеко (к тому же допускаю, что тут еще возможна оптимизация).
Тормозит как раз на ней, так как никаких промежуточных буферов не используется.
Код подпрограммы до безобразия прост.
- 70 тактов в цикле на очередной печатный символ
- 102 такта цикла на холостом символе табуляции (закрывающем восьмёрку знакомест)
- 135 такта цикла на заполняющем символе табуляции с выравниванием до восьми
При прокрутке назад нужно считать скрытый, но уже открытый символ позиции #0 для отображения слева.
Нажатие стрелки влево производит сканирование всех 25 строк.
А вот стрелкой вправо открывается символ только одной верхней строки - остальное я заглушил из-за диких тормозов.
(Можете по адресу 00BC вписать байт 19 и убедиться.)
Как видно, горизонтальная прокрутка экранным скроллингом - бесполезная трата кодового пространства без видимого ускорения, так как проще обновить весь фрагмент листинга на экране.
И по тактам дешевле, так как все нужные символы из буфера текста сразу копируются на экран, тогда как прокрутка отнимает ещё порцию драгоценных тактов.
Вывод листинга, если прокрутить вправо до позиции 18, даёт сбой табуляции на строке №9.
Прокруткой влево до отказа (не отпуская клавиши) будет видно заполнение знакомест табуляцией (человечками) с верной расстановкой - сбоит код внутри отображения строк листинга: Вот с этим мне нужно разобраться.
ВАЖНО
- Удалось исправить глюк с табуляцией (всего одного условного перехода достаточно кое-где)
- Добавил оперативный инкремент/декремент десятичной нумерации строк при прокрутке
- Attachments
- rk86-horz-vert-scroll.rkr.zip
- Исправленный демонстрационный вариант
- (3.06 KiB) Downloaded 164 times
Re: Маленький Кустарный Экранный Редактор
Тут ещё надо бы в коды F812 и F81B посмотреть - правильно ли сделаны эти функции.Pyk wrote:Неплохо бы вообще от F812 избавиться, как источника тормозов. А в идеале избавиться и от F803 и постараться сделать все на F81BAlikberov wrote:На самом деле, так ещё перед каждым выводом строки стоит вызов F812, иначе клавиатура очень вяло реагирует....
F812 - должна быть короткая и быстрая - есть или нет нажатие.
F81B - более длинная и медленная, так как выдаёт код клавиши.
Но, к примеру, в некоторых вариантах системных ПЗУ, в частности, "Специалиста", это
фактически одна и та же функция.
iLavr
Re: Маленький Кустарный Экранный Редактор
Я бы наверное ввел небольшой буфер и хранил для каждой из 25 отображаемых строк как минимум адрес начала строки, текущие адреса или смещения начала и конца. Наверное, еще какое-то смещение табуляции придется хранить. При каждом скроллинге все это можно быстро обновлять, полное сканирование, да и то конкретной строки, понадобится, наверное только если наталкиваемся на табуляцию. Это навскидку, надо бы додумать эту идею...
...
F812 внутри вызывает F81b, причем неоднократно, так что она точно медленнее, чем F81B. К тому же при нажатии на клавишу F812 отрабатывает с задержкой и пищит, зато потом F803 выполняется без задержки и сразу выдает код.
...
F812 внутри вызывает F81b, причем неоднократно, так что она точно медленнее, чем F81B. К тому же при нажатии на клавишу F812 отрабатывает с задержкой и пищит, зато потом F803 выполняется без задержки и сразу выдает код.
Re: Маленький Кустарный Экранный Редактор
Это в "Радио-86РК" так?Pyk wrote:F812 внутри вызывает F81b, причем неоднократно, так что она точно медленнее, чем F81B. К тому же при нажатии на клавишу F812 отрабатывает с задержкой и пищит, зато потом F803 выполняется без задержки и сразу выдает код.


iLavr
Маленький Кустарный Экранный Редактор
Как говорил выше, редактор затачивается так, чтобы дать пользователю максимальный объём памяти. Потому используются только служебные ячейки Монитора. В частности, 7634-766F служат буфером с указателями на 27 отображаемых строк (25 + одна перед верхней + одна после нижней).Pyk wrote:Я бы наверное ввел небольшой буфер и хранил для каждой из 25 отображаемых строк как минимум адрес начала строки, текущие адреса или смещения начала и конца. Наверное, еще какое-то смещение табуляции придется хранить. При каждом скроллинге все это можно быстро обновлять, полное сканирование, да и то конкретной строки, понадобится, наверное только если наталкиваемся на табуляцию. Это навскидку, надо бы додумать эту идею...
К тому же, не забывать нужно правило оптимизации: По скорости или по объёму памяти.
Очевидно, что конкретно данный код затачивается под компактность и, соответственно, будет притормаживать местами. Увы.

Вот на днях приснился трюк для ускорения редактирования строки.
Сейчас тот код просто двигает целые килобайты вперёд для вставки одного символа. Что жутко медленно.
Есть идея трюка, когда редактируемая строка расширяется до максимальных 256 байтов при переходе на неё и ужимается уходом с неё.
Это позволит обойтись без промежуточных буферов и достаточно быстро редактировать её.
Так как 0D служит завершением строки, предполагается использовать парный код 0A для заполнения свободных ячеек в расширенной редактируемой строке.
Код ещё не пробовал писать, так как сейчас переписываю весь механизм реакции на клавиши, избавившись от F809/F821 и позиционируя курсор напрямую в ВГ75.
Подпрограмма F812 использует ячейку 7609 для хранения кода нажатой клавиши и 760B для задержки перед очередным повтором символа.Pyk wrote:F812 внутри вызывает F81b, причем неоднократно, так что она точно медленнее, чем F81B. К тому же при нажатии на клавишу F812 отрабатывает с задержкой и пищит, зато потом F803 выполняется без задержки и сразу выдает код.
Если в ячейку 760B записывать малые значения при кодах 08/18/19/1A в 7609, то можно добиться скорого срабатывания стрелочных клавиш.
Однако, становится неудобно этим курсором управлять, так как он начинает пол экрана пролетать, не лучше, чем при простом обращении к F81B.
Наверное, нужно следить за позицией курсора и контролировать скорость именно на границах области текста, где производится прокрутка. Но всё это усложнит код.
P.S.: Кому-нибудь нужен текстовый редактор в ПЗУ F000-F7FF или от меня ждут текстовый скроллер-шутер?

Маленький Кустарный Экранный Редактор
В общем, кое-что кое-как получилось.
Правда, глюков пока очень много, но основной функционал реализован.
К сожалению, код вышел очень разбухшим и достиг практически отметки в 2 Кб.
P.S.: Думаю, отзывчивость на клавиши теперь немного выше.
Написал две подпрограммы - EXPAND и SHRINK, выполняющие противоположные действия.
Благодаря этому, активная редактируемая строка заполняется кодом 0A и становится подбуфером.
Соответственно, раздвигать байты в её пределах стало намного быстрее.
Правда, глюков пока очень много, но основной функционал реализован.
К сожалению, код вышел очень разбухшим и достиг практически отметки в 2 Кб.
P.S.: Думаю, отзывчивость на клавиши теперь немного выше.
Написал две подпрограммы - EXPAND и SHRINK, выполняющие противоположные действия.
Благодаря этому, активная редактируемая строка заполняется кодом 0A и становится подбуфером.
Соответственно, раздвигать байты в её пределах стало намного быстрее.
- Attachments
- rk86-editor-raw.rkr.zip
- Сырой вариант чисто для оценки отзывчивости
- (3.76 KiB) Downloaded 163 times
Re: Маленький Кустарный Экранный Редактор
Да, и во многих (если не всех) РК-подобных тоже.Lavr wrote:Это в "Радио-86РК" так?F812 ещё и пищит?
Re: Маленький Кустарный Экранный Редактор
Ну, не скроллер-шутер, конечно, но вполне достойно и юзабельно для эпизодического использования, особенно со световым перомAlikberov wrote:В общем, кое-что кое-как получилось.

Надеюсь, оставшегося места до 2 Кб будет достаточно для исправления глюков...
Маленький Кустарный Экранный Редактор
Практически воссоздал функционал предыдущей версии без использования подпрограмм вывода символа Монитора.
(Подпрограмма F809 может работать отдельным потоком.)
Очень капризный код получился и местами продолжает глючить, хотя и не критично.
После запуска G0 следует предустановить регистры:
Теперь отклик на клавиши стал несколько резвее.
Клавиши F1-F4 или двойной клик мышью по знакоместу вызывает пользовательскую оболочку (здесь она просто чистит экран, сигнализируя о запуске).
Всё остальное работает примерно так же, как и в прошлой (стабильной) версии.
Очень много времени отняли процедуры прохода курсором по позициям с табуляцией и только сегодня удалось разобраться в некоторых нюансах. Теперь стрелки влево-вправо на табуляциях корректно их проскакивают.
За исключением случая, когда экран прокручен, а курсор двигается влево в табуляцию: Там прокрутка идёт очень медленно.
Вот движение вправо и вставка табуляции за правый край области всё нормально отрабатывает.
Вот, как всегда, ссылка на онлайн демонстрацию прямо в ПЗУ через директиву U.
(Готовый повторный запуск через G0 или G1.)
Как видно, через регистры передаётся в пользовательский код вся нужная информация:
(Подпрограмма F809 может работать отдельным потоком.)
Очень капризный код получился и местами продолжает глючить, хотя и не критично.
После запуска G0 следует предустановить регистры:
- PC - Адрес пользовательского кода (на "ленте" - 0800)
- HL - Адрес буфера текста листинга (на "ленте" - 0A00)
- DE - Координаты курсора для предустановки
Теперь отклик на клавиши стал несколько резвее.
Клавиши F1-F4 или двойной клик мышью по знакоместу вызывает пользовательскую оболочку (здесь она просто чистит экран, сигнализируя о запуске).
Всё остальное работает примерно так же, как и в прошлой (стабильной) версии.
Очень много времени отняли процедуры прохода курсором по позициям с табуляцией и только сегодня удалось разобраться в некоторых нюансах. Теперь стрелки влево-вправо на табуляциях корректно их проскакивают.
За исключением случая, когда экран прокручен, а курсор двигается влево в табуляцию: Там прокрутка идёт очень медленно.
Вот движение вправо и вставка табуляции за правый край области всё нормально отрабатывает.
Вот, как всегда, ссылка на онлайн демонстрацию прямо в ПЗУ через директиву U.
(Готовый повторный запуск через G0 или G1.)
Как видно, через регистры передаётся в пользовательский код вся нужная информация:
- BC - Указатель на начало редактируемой строки
- DE - Шестнадцатеричный номер редактируемой строки
- HL - Адрес на первую отображаемую на экран строку в буфере
- A - Столбец под курсором в редактируемой строке (позиция в памяти, а не на экране)
- F - Флаги (CF - обновление листинга на экране; SF - строка редактируется и раздута до 256 байтов; ZF - двойной клик)
- Attachments
- rk86-editor-v2023-0422.rkr.zip
- Более-менее стабильный вариант без обращения к процедурам вывода Монитора
- (4.16 KiB) Downloaded 173 times
Маленький Кустарный Экранный Редактор
В общем, вот стабильная версия.
Файл с ленты запускается по G0
Строго требуется директивой X Монитора установить регистр HL на адрес 0A00 (обязательно) и PC на адрес 0800 (опционально).
По адресу 0A00 размещён буфер текста, а по адресу 0800 расположен набросок отладчика.
При указании адреса входа в отладчик, он будет вызываться при перемещении курсора клавишами или нажатиях световым пером, а в регистрах передаётся информация.
Подпрограмма пользователя обязана установить флаг CF.
Иначе произойдёт обновление экрана и нормализация редактируемой строки с повторным вызовом подпрограммы. Что занимает больше времени и рекомендуется для случаев компиляции.
Вариант для ПЗУ можно посмотреть по ссылке.
При этом, по G0 запускается редактор в обычном режиме, а по G1 - с пользовательским отладчиком.
Клавиша END устанавливает экран и курсор в конец строки.
Повторное нажатие устанавливает курсор в конец экрана.
Последующие нажатия пролистывают текст листинга быстро вперёд на 25 строк.
Клавиша HOME устанавливает курсор в начало строки.
Повторное нажатие устанавливает курсор в начало экрана.
Последующие нажатия прокручивают листинг обратно на одну строку.
P.S.: Редактор практически стабилен, но требует соблюдения некоторых элементарных правил.
Нельзя редактировать текст при холостом пуске, когда на экране редактирования отобразилась версия реализации.
Нельзя превышать предельный размер строки (слиянием строк).
Файл с ленты запускается по G0
Строго требуется директивой X Монитора установить регистр HL на адрес 0A00 (обязательно) и PC на адрес 0800 (опционально).
По адресу 0A00 размещён буфер текста, а по адресу 0800 расположен набросок отладчика.
При указании адреса входа в отладчик, он будет вызываться при перемещении курсора клавишами или нажатиях световым пером, а в регистрах передаётся информация.
- BC - Указатель на начало редактируемой строки
- DE - Шестнадцатеричный номер редактируемой строки
- HL - Адрес на первую отображаемую на экран строку в буфере
- A - Столбец под курсором в редактируемой строке (позиция в памяти, а не на экране)
- F - Флаги (CF - обновление листинга на экране; SF - строка редактируется и раздута до 256 байтов; PF - двойной клик пером; ZF - клавиши F1-F4 или УС+A-Z)
Подпрограмма пользователя обязана установить флаг CF.
Иначе произойдёт обновление экрана и нормализация редактируемой строки с повторным вызовом подпрограммы. Что занимает больше времени и рекомендуется для случаев компиляции.
Вариант для ПЗУ можно посмотреть по ссылке.
При этом, по G0 запускается редактор в обычном режиме, а по G1 - с пользовательским отладчиком.
Клавиша END устанавливает экран и курсор в конец строки.
Повторное нажатие устанавливает курсор в конец экрана.
Последующие нажатия пролистывают текст листинга быстро вперёд на 25 строк.
Клавиша HOME устанавливает курсор в начало строки.
Повторное нажатие устанавливает курсор в начало экрана.
Последующие нажатия прокручивают листинг обратно на одну строку.
P.S.: Редактор практически стабилен, но требует соблюдения некоторых элементарных правил.
Нельзя редактировать текст при холостом пуске, когда на экране редактирования отобразилась версия реализации.
Нельзя превышать предельный размер строки (слиянием строк).
- Attachments
- rk86-editor-v2023-0423.rkr.zip
- Стабильная версия редактора текста листинга
- (4.18 KiB) Downloaded 190 times
Маленький Кустарный Экранный Редактор - практически готов
Доработал и устранил мелкие недочёты.
В частности, если строка занимает всё экранное пространство в 64 символа, стрелка справа не отображается, чтобы не портить вид.
В конце области кода, перед текстом версии, располагаются ячейки с указателями на конкретные экранные позиции: Можно легко сместить область отображения листинга и его прокрутки.
(Смещение позиции курсора - другая ячейка внутри кода и при желании легко найти.)
Файл с ленты запускается только по G0
Строго требуется директивой X Монитора установить регистр HL на адрес 0A00 (обязательно) и PC на адрес 0800 (опционально).
По адресу 0A00 размещён буфер текста, а по адресу 0800 расположен набросок отладчика.
При указании адреса входа в отладчик, он будет вызываться при перемещении курсора клавишами или нажатиях световым пером, а в регистрах передаётся информация.
Когда пользователь не нажимает на клавиши, устанавливается флаг CF. При зажатии какой либо клавиши флаг CF сбрасывается при повторах.
Когда пользователь начинает редактировать строку, создаётся буферная зона, о чём сигнализирует флаг SF. Не рекомендуется к парсингу/трансляции.
При нажатии F1-F4 или УС+A-Z буфер устраняется и пользовательский код может работать с текстом нормально. При этом код клавиши следует прочитать из служебной ячейки подпрограммы обслуживания клавиатуры Монитора.
Вариант для ПЗУ можно посмотреть по ссылке.
При этом, по G0 запускается редактор в обычном режиме, а по G1 - с пользовательским отладчиком.
Клавиша END устанавливает экран и курсор в конец строки.
Повторное нажатие устанавливает курсор в конец экрана.
Последующие нажатия пролистывают текст листинга быстро вперёд на 25 строк.
Клавиша HOME устанавливает курсор в начало строки.
Повторное нажатие устанавливает курсор в начало экрана.
Последующие нажатия прокручивают текст листинга медленно обратно на 25 строк.
P.S.: Редактор практически стабилен, но дорабатывать его становится всё сложнее из-за ограничения на объём занимаемой памяти.
Нельзя редактировать текст при холостом пуске, когда на экране редактирования отобразилась версия реализации.
Нельзя превышать предельный размер строки (слиянием строк).
P.P.S.: Если имеются какие-то критические замечания - выслушаю.
В частности, если строка занимает всё экранное пространство в 64 символа, стрелка справа не отображается, чтобы не портить вид.
В конце области кода, перед текстом версии, располагаются ячейки с указателями на конкретные экранные позиции: Можно легко сместить область отображения листинга и его прокрутки.
(Смещение позиции курсора - другая ячейка внутри кода и при желании легко найти.)
Файл с ленты запускается только по G0
Строго требуется директивой X Монитора установить регистр HL на адрес 0A00 (обязательно) и PC на адрес 0800 (опционально).
По адресу 0A00 размещён буфер текста, а по адресу 0800 расположен набросок отладчика.
При указании адреса входа в отладчик, он будет вызываться при перемещении курсора клавишами или нажатиях световым пером, а в регистрах передаётся информация.
- BC - Указатель на начало редактируемой строки
- DE - Шестнадцатеричный номер редактируемой строки
- HL - Адрес на первую отображаемую на экран строку в буфере
- A - Столбец под курсором в редактируемой строке (позиция в памяти, а не на экране)
- F - Флаги (CF - обновление листинга на экране; SF - строка редактируется и раздута до 256 байтов; PF - двойной клик пером; ZF - клавиши F1-F4 или УС+A-Z)
Когда пользователь не нажимает на клавиши, устанавливается флаг CF. При зажатии какой либо клавиши флаг CF сбрасывается при повторах.
Когда пользователь начинает редактировать строку, создаётся буферная зона, о чём сигнализирует флаг SF. Не рекомендуется к парсингу/трансляции.
При нажатии F1-F4 или УС+A-Z буфер устраняется и пользовательский код может работать с текстом нормально. При этом код клавиши следует прочитать из служебной ячейки подпрограммы обслуживания клавиатуры Монитора.
Вариант для ПЗУ можно посмотреть по ссылке.
При этом, по G0 запускается редактор в обычном режиме, а по G1 - с пользовательским отладчиком.
Клавиша END устанавливает экран и курсор в конец строки.
Повторное нажатие устанавливает курсор в конец экрана.
Последующие нажатия пролистывают текст листинга быстро вперёд на 25 строк.
Клавиша HOME устанавливает курсор в начало строки.
Повторное нажатие устанавливает курсор в начало экрана.
Последующие нажатия прокручивают текст листинга медленно обратно на 25 строк.
P.S.: Редактор практически стабилен, но дорабатывать его становится всё сложнее из-за ограничения на объём занимаемой памяти.
Нельзя редактировать текст при холостом пуске, когда на экране редактирования отобразилась версия реализации.
Нельзя превышать предельный размер строки (слиянием строк).
P.P.S.: Если имеются какие-то критические замечания - выслушаю.
- Attachments
- rk86-editor-v2023-0424.rkr.zip
- Версия от 24 апреля
- (4.27 KiB) Downloaded 156 times
Маленький Кустарный Экранный Редактор
Думаю, теперь можно отдохнуть от активной разработки данной утилиты.
На отладку срабатывания перемещения курсора по табуляции на границах строки ушла практически неделя, так как код критически вырывался за границы в 2 Кб.
Пришлось жёстко его чистить и оптимизировать (стыковать подпрограммы там, где одна вызывает в конце другую), из-за чего код получился достаточно плотным.
При этом имеется несколько универсальных API, которые могут пригодиться в разных случаях:
Чтобы адаптировать редактор к различным дисплеям и устранить "обрезание" краёв текста, имеются следующие адреса:
Клавиши работают следующим образом:
При этом через регистры общего назначения передаётся следующая информация:
Вот несколько подпрограмм, которые могут понадобиться в экстренных случаях:
P.S.: Думаю, версия достаточно стабильная и может уже стать инструментальной (для личных нужд).
Спасибо за участие!
На отладку срабатывания перемещения курсора по табуляции на границах строки ушла практически неделя, так как код критически вырывался за границы в 2 Кб.
Пришлось жёстко его чистить и оптимизировать (стыковать подпрограммы там, где одна вызывает в конце другую), из-за чего код получился достаточно плотным.
При этом имеется несколько универсальных API, которые могут пригодиться в разных случаях:
- 0003 | F003 - помещения указателя на знакоместо в стек, координаты которого указываются непосредственно за CALL и адрес извлекается через POP
- 0023 | F023 - прокрутка экрана (CF=0 - вправо / CF=1 - влево)
- 0057 | F057 - прокрутка экрана (CF=0 - вверх / CF=1 - вниз)
Code: Select all
CALL 00003H
DB 39 ; X-POSITION
DB 15 ; Y-POSITION
POP H ; LOAD POINTER
- 0009/000A | F009/F00A - корректировка на ±2 знакоместа инструкциями DCX D / NOP / INX D
- 0719/071A | F719/F71A - корректировка позиции курсора (обычно 8 по X и 3 по Y)
- 07AA | F7AA - корректировка "светового пера"
- 07FE | F7FE - адрес входа в редактор (сейчас это 00CA/F0CA)
Клавиши работают следующим образом:
- HOME с прокрученным экраном возвращает его на 64 позиций назад
- HOME из любой позиции в строке устанавливает курсор в начало строки
- HOME в начале любой строки устанавливает курсор в начало экрана
- HOME в начале экрана прокручивает его на 25 строк вверх (аналогично Page Up)
- END/СТР устанавливает курсор в конец строки
- END/СТР в конце строки устанавливает курсор в конец экрана
- END/СТР в конце экрана прокручивает его на 25 строк вниз (аналогично Page Down)
- DEL/ПС в любой позиции строки удаляет символ под курсором
- DEL/ПС в конце строки производит слияние со следующей строкой
- BS/ЗАБОЙ в любой позиции строки затирает символ перед курсором
- BS/ЗАБОЙ в начале строки производит слияние с предыдущей строкой
При этом через регистры общего назначения передаётся следующая информация:
- BC - Адрес на начало текущей (редактируемой) строки
- DE - Шестнадцатеричный индекс (редактируемой) текущей строки
- HL - Адрес на начало самой верхней отображаемой строки
- A - Номер столбца по позиции курсора (начало - 01)
- CF флаг - Экран готовится к полной перерисовке (при клике "световым пером" или перемещением стрелками)
- PF флаг - Двойной (повторный) клик "светового пера" по знакоместу с курсором
- ZF флаг - Клавиши F1-F4, АР2 или УС+A-Z (код читается через вызов F803)
- SF флаг - Буферная строка (редактирование в активном состоянии)
Вот несколько подпрограмм, которые могут понадобиться в экстренных случаях:
- 033B / F33B - Прокрутка листинга вперёд/влево (CF=0) или назад/вправо (CF=1)
- 0567 / F567 - Прокрутка листинга вверх (CF=0) или вниз (CF=1)
- 04A7 / F4A7 - Переключение на другой буфер текста (HL - указатель на ячейку буфера)
P.S.: Думаю, версия достаточно стабильная и может уже стать инструментальной (для личных нужд).
Спасибо за участие!
- Attachments
- rk86-editor-v2023-0427.rkr.zip
- Версия от 27 апреля
- (5.27 KiB) Downloaded 158 times