Вход

Просмотр полной версии : Оконный интерфейс для asm, может кто помнит?



asve79
09.12.2018, 15:17
В свое время, помню, вроде была какая-то либа реализующая оконный интерфейс, который использовалася во многих boot-ах.
Никто не помнит что это было? Хотя в целом подойдет любая )

Идея писать что-то свое мне как-то не нравится. Хочется быстрого решения... какой-то готовой библиотеки.. Их же много кто писал.

Сам когда-то писал такую, давно было дело, свободного время было в избытке. ) Сейчас такой роскоши себе позволить увы, не могу. :(


(i) Для тех, кому лень перечитывать весь топик привожу выдержку по оконным системам на 27-12-2018:

https://github.com/asve79/xasconv
https://zx-pk.ru/threads/2307-okonny...spektrume.html
Virtual TR-DOS > System > Операционные системы: Micro Windows v1.1 by Welcome Corporation'96
Оконная система ZX Turbo Assembler
Послушайте, зайдите сюда https://zx-pk.ru/threads/29356-zx-turbo-assembler.html, скачайте ZX Turbo Assembler v2.5 лучше 2.6, файл a2.5_1 (a2.6_1) содержит все что вам нужно, вывод окна (без сохранения подложки), печать / вывод символа и/или строки, система MENU, система INPUT - ввод всякого, естественно опрос клавиатуры, пп. SCROLLи разные мелкие пп. необходимые для работы всего этого. И - Пользуйтесь.
з.ы. Каким пользоваться ассемблер-компилятором дело личное, любая версия ZAsm`а (кроме 48к) импортирует файл в формат обычного текста.

goodboy
09.12.2018, 15:23
https://zx-pk.ru/threads/2307-okonnye-interfejsy-na-spektrume.html

Shiny
09.12.2018, 17:28
я свой вариант написал. Когда выйдет в свет неизвестно.

AndTorp
09.12.2018, 21:50
https://zx-pk.ru/threads/2307-okonnye-interfejsy-na-spektrume.html
Бегло просмотрел тему, может не заметил.

Virtual TR-DOS > System > Операционные системы:
Micro Windows v1.1 by Welcome Corporation'96
Техническая информация прилагается.

Barmaley_m
10.12.2018, 01:39
Я делал собственный оконный интерфейс в 1996г. Была одна из лучших моих работ. На его основе построены следующие программы:
- GUI для программатора "OMNIPROG" с hex-редактором (под неё изначально делалась библиотека);
- GUI-программа XAS->TXT;
- начал, но не доделал, Multi-Format Disk Doctor

По сути речь идет не только об оконном интерфейсе, но о крупном фреймворке, куда входят также драйверы дисковода, клавиатуры, менеджер кучи, файловая система TR-DOS.

Даже написал в те годы документацию. Выкладываю всё, что есть. Образцы прикладных программ, приведенных выше, тоже могу выложить. Все исходники компилировались под ASC CP/M ассемблером M80 (ранее выкладывал на форуме в разделе "Софт").

Содержимое файлов:
WIND.MAC - библиотека окон, а также вывода символов и сообщений (42 символа в строке)
SPKEYB.MAC - весьма навороченный драйвер клавиатуры для использования совместно с оконной библиотекой. Он поддерживает только расширенную клавиатуру "Орель БК-08". К счастью, его легко заменить любым другим драйвером, т.к. он имеет только 2 точки входа: INTKEY (вызывается по прерываниям для опроса клавиатуры) и CONIN (ждёт нажатия клавиши).
EDZNAK.MAC - знакогенератор, автором которого являются, предположительно, Андрей Сендецкий (ASC) и Александр Шафир. Я "украл" этот знакогенератор из ASC CP/M. Он поддерживает русскую кодировку CP866 и графические "рамочные" символы.
AZKEYB.MAC - драйвер стандартной 40-клавишной клавиатуры из ASC CP/M, исходник которого мне предоставил ASC. На его основе был разработан драйвер SPKEYB.MAC, так что есть вариант адаптации этого драйвера вместо SPKEYB. Драйвер очень навороченный, имеет много вкусностей.
DMM.MAC - менеджер кучи. Не очень хорошая реализация, рекомендую заменить чем-нибудь получше, если есть.

Исходники взял с образов старых дискет. Компилируются ли они, работают ли, последняя ли версия - не проверял. Если будут вопросы - пишите.

- - - Добавлено - - -

Выкладываю образ диска с примерами приложений на основе моего оконного интерфейса. Использовать по назначению эти программы вряд ли удастся, так как они требуют нестандартных расширений компьютера; но полазить по менюшкам и увидеть возможности библиотеки - вполне. Управление - стрелками. Также считается, что клавиши True Video/Inv Video - это PgUp/PgDn, а Edit имеет ту же функцию, что Esc, то есть выход из меню.

asve79
11.12.2018, 08:40
Выкладываю образ диска с примерами приложений на основе моего оконного интерфейса. Использовать по назначению эти программы вряд ли удастся, так как они требуют нестандартных расширений компьютера; но полазить по менюшкам и увидеть возможности библиотеки - вполне. Управление - стрелками. Также считается, что клавиши True Video/Inv Video - это PgUp/PgDn, а Edit имеет ту же функцию, что Esc, то есть выход из меню.

Ооо! Решение выглядит как раз таким, каким надо! Многие спектрумисты писали свою ОС, а надо-то легкую и понятную либу, которая умеет показывать окошки, меню и полей ввода! )

Но в демках у меня почему-то навигация по меню не работает. :(
Запускаю через эмуль.

Barmaley_m
11.12.2018, 19:39
Но в демках у меня почему-то навигация по меню не работает. :(
Запускаю через эмуль.
Точно стрелки пробовал нажимать? Поддерживаются только клавиши-стрелки, джойстики не поддерживаются, мышь тоже. Или попробуй другой эмулятор. У меня работает на FUSE и Unreal.

asve79
12.12.2018, 09:17
Точно стрелки пробовал нажимать? Поддерживаются только клавиши-стрелки, джойстики не поддерживаются, мышь тоже. Или попробуй другой эмулятор. У меня работает на FUSE и Unreal.

Хм.. Да, оч похоже на глюк эмуля. В инреале рабоатает. Будем разбираться.

Barmaley_m, вопрос к тебе: если дойдет до использования, можно менять твой код и выложить его в гитхаб (естественно с сохранением упоминания об авторе)? Ну как минимум поддержка мыши тут ну прям очень напрашивается. )

Barmaley_m
13.12.2018, 02:44
если дойдет до использования, можно менять твой код и выложить его в гитхаб (естественно с сохранением упоминания об авторе)?
Да, конечно, буду только рад! Считай, что действует лицензия BSD.

Если будут вопросы по использованию библиотеки, тоже обращайся! Вплоть до того, что помогу с доработкой, самому стало интересно, если такие вещи еще кому-нибудь нужны.

- - - Добавлено - - -


поддержка мыши тут ну прям очень напрашивается. )
До мыши тут далековато :) В библиотеке не поддерживается перемещение и изменение размера окон на лету. Все размеры заданы жестко. Хотя можно и допилить.

Если бы использовал эту библиотеку сегодня, я бы в первую очередь делал следующее:
1) Адаптация драйвера клавиатуры от ASC (AZKEYB) для поддержки стандартных клавиатур или переход на какую-то более развитую архитектуру. Каким образом сейчас на реалах поддерживаются клавиатуры PS/2 и USB, как сделан программный интерфейс?
2) Замена менеджера кучи. Может быть, где-то уже есть доступные, или переписать. Нехороший менеджер, хотя и работает;
3) Ускорение процедур библиотеки, в первую очередь печать символов. Как-то я спрашивал ASC, как он сделал такую быструю печать символов в своем муз. редакторе. Он ответил, что печатаются не отдельные символы, а сразу строки. Действительно, это позволяет отказаться от обработки маски для каждого символа. Можно очистить сразу всю строку (или ее часть), а потом печатать символы по OR. Также не нужно считать координаты в памяти для каждого символа, а можно это делать только один раз. Словом, идея может быть развита.
4) И вообще рефакторинг, там много что может быть улучшено. Главный плюс - что оно уже отлажено и работает, а новую библиотеку, написанную с нуля, пришлось бы еще отлаживать.

Barmaley_m
14.12.2018, 05:47
Вот, дошли руки. Адаптировал драйвер стандартной клавиатуры, выбросив из него все CP/M функции.

Также проверил, что все компоненты оконного интерфейса компилируются без ошибок.

Теперь при компиляции программ с моим оконным интерфейсом можно использовать либо драйвер клавиатуры SPKEYB40.MAC (стандартная), либо SPKEYB.MAC ("Орель БК-08").

Barmaley_m
15.12.2018, 04:08
Нашел остатки исходников Multi-Format Disk Doctor. Удалось скомпилировать и запустить их с приведенными выше исходниками оконного интерфейса. Выкладываю недостающие исходные файлы и образ дискеты с компилированной программой. В этот раз использовал драйвер SPKEYB40, так что все функции будут работать и со стандартной клавиатурой. Также в архиве приводится подробная документация на оба драйвера клавиатуры и сам MFDD. Проект не завершен, но может пригодиться как исходник примера использования оконной библиотеки.

В комплекте также идет драйвер диска (чтение/запись секторов).

Компилировал под эмулятором CP/M Z80MU. Нужна модифицированная версия ассемблера M80 - её я ранее выкладывал в теме "ASC CP/M".

Компиляция файлов проста. К примеру, нужно набрать "M =WIND" для компиляции wind.mac

Для компоновки нужно набрать "L STARTUP,MFDD,SPKEYB40,EDZNAK[L8300[NR". Образуется файл "STARTUP.COM", который грузится с адреса 0x8300 и запускается из-под TR-DOS.

Rubts0FF
15.12.2018, 20:29
Послушайте, зайдите сюда https://zx-pk.ru/threads/29356-zx-turbo-assembler.html, скачайте ZX Turbo Assembler v2.5 лучше 2.6, файл a2.5_1 (a2.6_1) содержит все что вам нужно, вывод окна (без сохранения подложки), печать / вывод символа и/или строки, система MENU, система INPUT - ввод всякого, естественно опрос клавиатуры, пп. SCROLLи разные мелкие пп. необходимые для работы всего этого. И - Пользуйтесь.

з.ы. Каким пользоваться ассемблер-компилятором дело личное, любая версия ZAsm`а (кроме 48к) импортирует файл в формат обычного текста.

Barmaley_m
17.12.2018, 03:23
Имею вопрос к присутствующим кодерам, в особенности к ув. Lethargeek.

Какие нынче в моде быстрые способы вывода текста с 42 символами в строке? Но не слишком большие по размеру кода. Хочу улучшить свою оконную библиотеку.

Barmaley_m
18.12.2018, 03:10
По просьбам телезрителей выкладываю полный комплект исходников XAS->TXT - еще один развитый пример использования моей оконной библиотеки. Здесь используются все функции, самая интересная из которых - Listbox. С ее помощью реализован выбор файла в каталоге дискеты. При этом работают клавиши Up, Down, PgUp (CS+SS+Q) и PgDn (CS+SS+A). Также используются функции ввода и редактирования текста, менюшки.

В комплект входит:
1) Оконный интерфейс, компоненты и драйверы, которые были описаны выше;
2) Модуль TRFIL.MAC - функции файловой системы TR-DOS. Обращается к драйверу дисковода RADISK (или урезанному RADXAS). Набор функций очень ограничен, реализация так себе, но сойдет для небольших проектов, вроде этого.
3) образ диска TR-DOS с компилированной и рабочей этой программой. На этот раз применен драйвер стандартной клавиатуры, а не "Орель-БК". Основные функции программы я проверить не смог, т.к. под моим эмулятором (FUSE) доступ к диску почему-то не работает. На реале работало всегда, на Unreal - тоже.

Компиляция исходников - под CP/M. Для компоновки набрать "L STARTUP,XASCONV,SPKEYB40[L8300[NR"

asve79
20.12.2018, 08:27
По просьбам телезрителей выкладываю полный комплект исходников XAS->TXT - еще один развитый пример использования моей оконной библиотеки. Здесь используются все функции, самая интересная из которых - Listbox. С ее помощью реализован выбор файла в каталоге дискеты. При этом работают клавиши Up, Down, PgUp (CS+SS+Q) и PgDn (CS+SS+A). Также используются функции ввода и редактирования текста, менюшки.


Адаптировал под sjasmplus, выложил: https://github.com/asve79/xasconv
Но пока есть косяк с кодировкой в кириллице. Не помню какая кодировка в спеке и как с ней было принято работать. Поэтому на месте кирилицы артефакты. )

Ребят, если ткнете где почитать или так скажете про кодировку кириллицы, буду признателен.

Destr
20.12.2018, 09:30
Ребят, если ткнете где почитать или так скажете про кодировку кириллицы, буду признателен.
CP866 вроде как называется ("OEM - русская" - винды так пишут про неё)
Во, из STORM вроде (0-255)
67390

Shiny
20.12.2018, 14:29
кодовые страницы (http://nozdr.ru/games/quest/crypt/codes) ниже

Barmaley_m
20.12.2018, 14:50
Адаптировал под sjasmplus, выложил:
Спасибо. По выложенному проекту имею следующие замечания:
1) Использована неправильная русская кодировка. Это убило в коде все комментарии и сделало нечитаемыми русские литерные константы. Оригинальные файлы, как верно заметил Destr, были в т.н. "Альтернативной кодировке ГОСТа", также известной как CP866 и DOS-866.

2) Я не рекомендую менять кодировку. CP866 хороша тем, что в ней есть рамочные символы (в Windows-1251 их нет). Также одной только подменой знакогенератора проблема не решается, т.к. нужно еще менять драйвер клавиатуры. Изменений много, а толку мало, теряются рамочные символы и псевдографика.

3) Выложен файл SPKEYB.A80, но не выложен SPKEYB40.A80. Первый - это драйвер "Орелевской" клавиатуры, но она мало у кого есть. Было бы логичнее выложить либо оба файла, либо только SPKEYB40 - драйвер стандартной клавиатуры.

Не помню какая кодировка в спеке и как с ней было принято работать.
На спеке не было единого стандарта на кодировку кириллицы. Каждый делал как хочет. Было много случаев применения КОИ-7 или КОИ-8. Однако наиболее прогрессивные оси (IS-DOS и ASC CP/M) использовали именно CP866, еще и потому, что в те времена люди работали в основном под DOS, и там эта кодировка была наиболее распространенной.

Кодировка Windows-1251 появилась позже (в Windows 95) с подачи фирмы Microsoft и представляет, на мой взгляд, шаг назад, так как в ней плохо с символами псевдографики. Наши ГОСТовцы до этого потрудились лучше. В конце концов, для себя делали.

Большинство современных текстовых редакторов поддерживают выбор кодировки. Например, FAR под Windows или gedit под Линукс. Также можно импортировать исходники в CP866 и сохранить их в формате Unicode, если sjasm это поддерживает. Тогда не будет конфузов при открытии и редактировании исходников.

asve79
20.12.2018, 16:02
Спасибо. По выложенному проекту имею следующие замечания:
1) Использована неправильная русская кодировка. Это убило в коде все комментарии и сделало нечитаемыми русские литерные константы. Оригинальные файлы, как верно заметил Destr, были в т.н. "Альтернативной кодировке ГОСТа", также известной как CP866 и DOS-866.
Исправляю по мере погружения. На тот момент небыло понимания в какой это кодировке, а ждать ответов не хотелось. )


2) Я не рекомендую менять кодировку. CP866 хороша тем, что в ней есть рамочные символы (в Windows-1251 их нет). Также одной только подменой знакогенератора проблема не решается, т.к. нужно еще менять драйвер клавиатуры. Изменений много, а толку мало, теряются рамочные символы и псевдографика.
Посмотрим по мере эксплуатации. Я полагаю что многим удобней писать код вне спека. А тут либо 1251 либо UTF8.


3) Выложен файл SPKEYB.A80, но не выложен SPKEYB40.A80. Первый - это драйвер "Орелевской" клавиатуры, но она мало у кого есть. Было бы логичнее выложить либо оба файла, либо только SPKEYB40 - драйвер стандартной клавиатуры.
Исправил. Выложил файл. Там вроде нет строки, о которой я справшивал про буку "ё". Пример переключил на sbkeyb40. Вроде работает. )

А какая комбинация клавиш переключает рус/лат?

Barmaley_m
20.12.2018, 16:20
Посмотрим по мере эксплуатации. Я полагаю что многим удобней писать код вне спека. А тут либо 1251 либо UTF8.
Да, нелёгкий выбор. Надо еще учитывать (в перспективе, если предполагается работа с текстовыми файлами на спеке), в какой кодировке записано большинство таких файлов. Я думаю, это будет CP866 (IS-DOS).

Как вариант, можно отказаться от читаемых литерных констант и забивать русский текст в исходники в виде чисел с комментариями. Ну или, может быть, в sjasm есть какие-то опции перекодировки.

Исправил. Выложил файл. Там вроде нет строки, о которой я справшивал про буку "ё".
Да, там повезло: обработка регистра для буквы "ё" идет с помощью таблицы TBL_CG (строка 562).

А какая комбинация клавиш переключает рус/лат?
CapsShift-3.

А вообще лучше почитай документацию AZKEYB.TXT (выкладывал в составе архива mfdd.zip выше (https://zx-pk.ru/threads/29850-okonnyj-interfejs-dlya-asm-mozhet-kto-pomnit.html?p=991286&viewfull=1#post991286)). Драйвер клавиатуры сложный и имеет много функций.

Barmaley_m
20.12.2018, 18:50
Имею вопрос ко всем присутствующим.

Раз уж пошла речь о полном фреймворке - у меня еще есть драйвер файловой системы ADS (ASC Disk System), извлеченный и продизассемблированный из ASM 1.12.

Эта файловая система основана на 12-bit FAT, имеет формат 10 секторов по 512 байт на дорожке, ёмкость корневого каталога 256 файлов; на каждый файл есть 4 бита флагов (Read-only, Deleted, Hidden, Reserved). Поле размера файла имеет 3 байта (максимальная длина файла - 16Мб). За счет флага Reserved можно было бы сделать подкаталоги (ASC собирался, но не успел). Имена файлов - 8+3. Эффективность представления каталогов и FAT выше, чем у MS-DOS, что повышает полезную ёмкость диска. Качество кода очень высокое, можно одновременно открывать и работать с несколькими файлами, имеются высокоуровневые функции доступа. Драйвер ФС включает в себя драйвер ВГ93.

Интерес, скорее всего, чисто академический, т.к. это нестандартная, мало где используемая ФС, хотя и высокого качества, особенно по меркам 90х гг. А так, при разработке новых приложений было бы логичнее использовать драйвер MS-DOS FAT12/exFAT.

Если кого-нибудь интересует ADS - могу выложить дизассемблер с комментариями.

Dart Alver
20.12.2018, 22:48
Во, из STORM вроде (0-255)
Не, не STORM, а BGE. Набор 5x8, первые 4 символа после 0-го типичны только для интерфейса BGE, псевдографика при 5x8 только для отмазки ))


Большинство современных текстовых редакторов поддерживают выбор кодировки. Например, FAR под Windows или gedit под Линукс.
gedit без пинков не очень, под линь лучший вариант kwrite или kate.


Также можно импортировать исходники в CP866 и сохранить их в формате Unicode, если sjasm это поддерживает.
Вроде как не поддерживает, если только в новье не запилили. Но, если пользуете только текст, то можно писать в cp1251 а компилировать с ключем перекодировки --dos866 , а если с псевдографикой, то тут увы, либо непосредственно dos866 (с редакторами его поддерживающими), либо номерами символов в DB.

krt17
20.12.2018, 22:54
Какую-то непонятную ересь про сиджасм вы тут пишите. Сделайте файл в 866 и компильте, какая асму разница че там за коды в db?

Dart Alver
20.12.2018, 22:57
Какую-то непонятную ересь про сиджасм вы тут пишите. Сделайте файл в 866 и компильте, какая асму разница че там за коды в db?
Так про то и пишут, что не хотят в 866 ))

Black Cat / Era CG
20.12.2018, 23:27
Любой адекватный текстовый едитор под виндой вполне себе понимает 866.

Dart Alver
20.12.2018, 23:39
Любой адекватный текстовый едитор под виндой вполне себе понимает 866.
Увы ! Crimson Editor, которым я пользуюсь - неадекватный ! )) Но я к нему привык, поэтому ключ --dos866 - мой выбор ))

Black Cat / Era CG
20.12.2018, 23:45
там есть не только ключ. есть еще

ENCODING <encoding>Useful only for non-English users (Cyrillic-encodings-specific)
Set the current encoding, i.e. if you set DOS, SjASMPlus will automatically convert strings from ANSI to DOS-866. Encoding may be DOS(DOS-866) or WIN(ANSI/Win-1251). Default is WIN.
ENCODING "WIN"
DB "тексттекст" ;will be тексттекст
ENCODING "DOS"
DB "тексттекст" ;will be ⥪бв⥪бв

Destr
21.12.2018, 18:01
Не, не STORM, а BGE. Набор 5x8, первые 4 символа после 0-го типичны только для интерфейса BGE, псевдографика при 5x8 только для отмазки ))
Не сторм, но суть та-же.
Вообще кодировка мозговыносящая (на предмет писания текстового экрана) но вообще умерла и хрен с ней. utf-8 не лучше.
Царю Петру низкий поклон за не-латиницу, подкузмил, а всё равно алгоритмизация окошек и прочего стаффа - до сих пор не решена...
:(

Barmaley_m
21.12.2018, 20:01
Царю Петру низкий поклон за не-латиницу, подкузмил
Китайцам еще меньше повезло. Однако держатся за свою письменность и не жужжат.

Но еще не все потеряно. Вон в Молдавии перешли на латиницу, в Казахстане собираются, во многих других постсоветских странах. Может, еще и Россия когда-нибудь на латиницу перейдёт. A nekotorym ludyam uzhe seichas udobnee pechatat v transliteracii.

а всё равно алгоритмизация окошек и прочего стаффа - до сих пор не решена...
Это ты что имеешь в виду?

Destr
22.12.2018, 09:10
Это ты что имеешь в виду?
Это имею в виду что даже на зачуханом i286 сумели надстроить дос до окон 3.11 а мы с тырдосом так и чухаемся...
Затомыпишимдемыкакихнивид илсвет!

CodeMaster
22.12.2018, 09:31
на зачуханом i286 сумели надстроить дос до окон 3.11
Это делали ремесленники за зарплату.


Затомыпишимдемыкакихнивид илсвет!
А свободные художники только так ;-)

Shiny
22.12.2018, 10:25
по кодировкам. можно писать русские буквы в 866 и включать в db ""(любимый Emeditor, ага). ужясм хавает и не плачет. только ему слэши не нравятся.

Barmaley_m
22.12.2018, 17:47
Это имею в виду что даже на зачуханом i286 сумели надстроить дос до окон 3.11 а мы с тырдосом так и чухаемся...
А чем не нравится IS-DOS? Полный набор: оконный интерфейс, система перемещаемых драйверов памяти, дисков, клавиатуры, файловая система, куча прикладного софта. Есть и другие оси. DOORS - не щупал, не знаю, но наверняка тоже все атрибуты ОС имеются. Просто данная тема форума - про собственный, отдельный оконный интерфейс.

CodeMaster
22.12.2018, 20:26
Просто данная тема форума - про собственный, отдельный оконный интерфейс.
Тема да, но пост Destr про то, что вместе с мелкомягкими окнами (на самом деле задолго до них) на ПЦ появилась и оконная экосистема, которой мог пользоваться каждый, а не выдумывать каждый раз свою. Как ТС использовать окна IS-DOS для своей задачи?

asve79
25.12.2018, 16:19
Barmaley_m, Вопрос по твоей оконной системе.
В модуле работы с клавиатурой есть код:


CST: LD HL,(ULBUF)
LD A,L
CP H
LD A,0
RET Z
CPL
RET

CONIN: EI
CONIN0: CALL CST
JR Z,CONIN0
DI
LD A,L
INC A
CP LENBUF-1
JR NZ,CONIN1
XOR A
CONIN1: LD (ULBUF),A
LD DE,BUFKLA
LD H,0
ADD HL,DE
LD A,(HL)
EI
RET

Физический смысл его это ожидания нажатия на клавишу, код которой в ULBUF, пришедший в буфер из ф-ции прерывания?

Barmaley_m
25.12.2018, 18:30
Barmaley_mВ модуле работы с клавиатурой есть код:
Физический смысл его это ожидания нажатия на клавишу, код которой в ULBUF, пришедший в буфер из ф-ции прерывания?
Да, смысл данного кода - это ожидание нажатия на клавишу. В данном драйвере используется буфер клавиатуры, в который подпрограмма INTKEY, работающая по прерываниям, помещает коды клавиш по мере их нажатия. Если подпрограмма CONIN (ожидание нажатия на клавишу) долго не вызывалась - то в буфере может быть несколько кодов. Они будут по одному извлечены из буфера за несколько вызовов CONIN. Переменные ULBUF и USBUF - это не коды клавиш, а указатели в пределах буфера. Сам буфер расположен в области памяти BUFKLA.

Устройство буфера - типичный кольцевой буфер (https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BB%D1%8C%D1%86%D0%B5%D0%B2%D0%BE%D 0%B9_%D0%B1%D1%83%D1%84%D0%B5%D1%80) (Ring buffer, Circular Buffer). Имеется два указателя - один на запись, второй на считывание. Тот, который на запись, изменяется только по прерываниям. Тот указатель, который на считывание, изменяется только в подпрограмме CONIN.

Замечу, что эта функция составлена неэффективно. Вероятно, авторы драйвера (и я в 1996г) не понимали, что кольцевой буфер относится к структурам данных с возможностью неблокирующего доступа (https://ru.wikipedia.org/wiki/%D0%9D%D0%B5%D0%B1%D0%BB%D0%BE%D0%BA%D0%B8%D1%80%D 1%83%D1%8E%D1%89%D0%B0%D1%8F_%D1%81%D0%B8%D0%BD%D1 %85%D1%80%D0%BE%D0%BD%D0%B8%D0%B7%D0%B0%D1%86%D0%B 8%D1%8F) (Lock-free data structure). Если подпрограмма CONIN составлена грамотно - то неважно, в каком месте она может быть прервана прерыванием, её работа будет в любом случае корректной. Иными словами, можно таким образом изменить функцию CONIN, чтобы в ней не надо было запрещать прерывания. Это устранит вероятность пропуска прерывания и сделает работу системы более отзывчивой.

К тебе вопрос - ты можешь внести меня на Github в список разработчиков проекта, чтобы я мог вносить свои изменения? А то как раз появилось желание немного оптимизировать код.

asve79
26.12.2018, 06:32
К тебе вопрос - ты можешь внести меня на Github в список разработчиков проекта, чтобы я мог вносить свои изменения? А то как раз появилось желание немного оптимизировать код.

Да не вопрос! В xasconv? Добавил.

asve79
26.12.2018, 13:43
Да, смысл данного кода - это ожидание нажатия на клавишу. В данном драйвере используется буфер клавиатуры, в который подпрограмма INTKEY, работающая по прерываниям, помещает коды клавиш по мере их нажатия. Если подпрограмма CONIN (ожидание нажатия на клавишу) долго не вызывалась - то в буфере может быть несколько кодов. Они будут по одному извлечены из буфера за несколько вызовов CONIN. Переменные ULBUF и USBUF - это не коды клавиш, а указатели в пределах буфера. Сам буфер расположен в области памяти BUFKLA.

Добавил в код ф-цию CONINW, которая не ждет нажатия на клавишу. а возвращает 0, если пусто.
В моем случае в это возможность опросить порт на предмет входящих данных.

Постепенно прихожу к мысли. что было бы здорово иметь возможность "переключаться" в область вывода другого окна, как будто текущее закрылось, а потом возвращаться в область координат текущего с текущим положением курсора. При этом перекрыванием окон можно пренебречь и оставить на совести пользователя. Но тут похоже не такая малая доделка нужна.

Barmaley_m
26.12.2018, 15:47
Добавил в код ф-цию CONINW, которая не ждет нажатия на клавишу. а возвращает 0, если пусто.
В моем случае в это возможность опросить порт на предмет входящих данных.
Такая функция имеет ограниченную область применения. А именно - во время длительной операции обработки данных или рисования смотреть, не нажата ли клавиша, которая должна прервать этот процесс. Во всех остальных случаях рекомендуется пользоваться блокирующей функцией CONIN. Это идеология многопоточных систем, в которых следует избегать циклов, где что-то опрашивается и процессор занят на 100%. Хотя в моей библиотеке многопоточности пока нет, но её можно прикрутить (см., например, мою тему в этом разделе "вытесняющая многозадачность").

Постепенно прихожу к мысли. что было бы здорово иметь возможность "переключаться" в область вывода другого окна, как будто текущее закрылось, а потом возвращаться в область координат текущего с текущим положением курсора. При этом перекрыванием окон можно пренебречь и оставить на совести пользователя. Но тут похоже не такая малая доделка нужна.
Если перекрыванием пренебречь - то доделка будет умеренной. С перекрыванием - да, сложнее. Попробую покумекать на досуге. Мой план: сначала сделать Diff твоей репозитории на GitHub со своими исходниками, чтобы точно выяснить, что ты поменял; и тогда уже начну вносить свои изменения.

Почему ты, кстати, настаиваешь на отказе от кодировки CP866 в исходниках?

asve79
26.12.2018, 16:55
Почему ты, кстати, настаиваешь на отказе от кодировки CP866 в исходниках?

Да я не то, чтобы настаиваю. Я работаю под linux, система работает в UTF-8 и не надо ничего придумывать с IDE. Плюс если делать pull/merce реквесты в github-е, то изменения проще сравнивать когда кодировки UTF8, не уверен что там будет корректно отображаться другие кодировки. Но Это не проверял, поэтому высказываю лишь свои предположения.
Посмотрел что будет если кириллицу попробовать вывести - мда, выводит коряво, видимо ассемблер не переводит кодировку, что наверное и не удивительно. На этот счет не размышлял еще.


сделать Diff твоей репозитории на GitHub со своими исходниками, чтобы точно выяснить, что ты поменял
В целом, я только устранял несоответствие между синтаксисом zasm/sjasm. Т.е удалял CSEG/DSEG. Добавлял описание модулей в файлах модулей. Добавлял названия модулей в CALL-ах, ссылающихся на ф-ции в других модулях. Удалил упоминания EXTERN/PUBLIC, добавил Include.

В логический состав кода не лазал.

SfS
26.12.2018, 17:47
Я работаю под linux, система работает в UTF-8 и не надо ничего придумывать с IDE.

Я тоже. Но Kate и KDevelop прекрасно работают и с 866 и с KOI8R. Автораспознавание там есть, кстати, тоже.

Barmaley_m
26.12.2018, 20:37
Я тоже работаю под Linux. Пока что хватало редактора GEdit для работы со спектрумовскими исходниками, он поддерживает CP866. Автораспознавание не работает, т.к. русского текста в исходниках мало, а латинского - много, и это конфузит автораспознаватель. Ну или он просто дубовый.

Раз в ассемблере нет перекодирования из UTF8 в CP866 - то нужно либо на PC использовать CP866, либо на Спектруме от неё отказываться. Русские буквы и псевдографика через DEFB в исходнике - это извращение.

И если отказываться от CP866 на Спеке - то в пользу чего?

Очевидно, CP1251 не имеет никаких преимуществ. Она тоже восьмибитная. Делать UTF-8 на Спектруме - будет тормозить и памяти больше отжирать, а её там и так мало. Я считаю, что CP866 на Спектруме хорошо прижилась в силу исторических и других причин (псевдографика, совместимость с MS-DOS, IS-DOS, CP/M). Отказываться от неё только ради сомнительного удобства при работе на PC? Когда нужно просто немного разобраться в настройках своего текстового редактора?

asve79
27.12.2018, 08:22
Это идеология многопоточных систем, в которых следует избегать циклов, где что-то опрашивается и процессор занят на 100%. Хотя в моей библиотеке многопоточности пока нет, но её можно прикрутить (см., например, мою тему в этом разделе "вытесняющая многозадачность").

ИМХО такие штуки нужно делать при спросе на них. Это уже попахивает своей ОС-ю. :)
Мне нравится твоя оконная система тем, что она простая для использования. Порог вхождения минимальный. Что нужно разработчику приклада? - Правильно - простая ф-ция "открыл окошко, напечатал там, закрыл окошко". Я это дело вынес в макросы. В xasconv не включал этот модуль, включил в z80-telnet.


Если перекрыванием пренебречь - то доделка будет умеренной. С перекрыванием - да, сложнее. Попробую покумекать

Поделюсь своими соображениями: при открытии окна возвращать дескриптор. Ну и сделать ф-цию активации "canvas"-а по дескриптору. Это сохранит обратную совместимость с текущей версии. Если вызывать ф-цию закртытия окна, то на первых порах можно закрывать крайнее открытое, чтобы не заморачиваться со сдвигом сохраненной информации в памяти.

Кстати, не стоит ли открыть отдельный топик, по обсуждению технических особенностей твоего оконного интерфейса? Этот топик вроде "а какие интерфейсы существуют?" )

Rubts0FF
27.12.2018, 14:25
В общем подозревал для чего тема создавалась :-), не подвели.

asve79
10.01.2019, 08:28
Barmaley_m, Решил что уже пора выносить оконную твою систему в отдельный SDK. SDK дополнять разными ф-циями. В xasconv проекте просто добавлю файл билда, вытаскивающий из git-а этот SDK как отдельный проект.
Хочу добиться что бы:
а) все-таки была библиотека ф-ций, которую можно использовать в разных проектах. Речь не только об оконной системе, а например уже добавил ф-циии работы со строками и портами.
б) внесения изменений были централизованными и могли пополняться ф-циями всеми желающими.

PS. Недавно внес небольшие корректировки в знакогенератор, чтобы некоторые прописные буковки были "по-ровнее".

Barmaley_m
10.01.2019, 21:13
Barmaley_m, Решил что уже пора выносить оконную твою систему в отдельный SDK.
Хорошая идея. Я тоже хотел это предложить. В процессе работы над библиотекой было бы желательно поменять некоторые интерфейсы. Чтобы это не сломало проект XASCONV, пришлось бы и его править, а это дело неблагодарное, т.к. подобный конвертор никому не нужен.

Я бы не называл данную библиотеку SDK, а немного скромнее - тем, чем она является: Framework.

Как часть проекта можно было бы создать тест-программу, демонстрирующую основные функции библиотеки: рисование окон, строк, меню, листбоксы, редактирование, доступ к диску. Такую тест-программу уже не лень менять при изменениях библиотеки; да и испытывать библиотеку после изменений на чём-то надо.

asve79
11.01.2019, 08:21
Я бы не называл данную библиотеку SDK, а немного скромнее - тем, чем она является: Framework.

И все-таки SDK, т.к. я туда пихаю еще и либы по работе с портом, ф-ции работы со строками и немного математических ф-ций. )
https://github.com/asve79/z80-sdk


Как часть проекта можно было бы создать тест-программу, демонстрирующую основные функции библиотеки: рисование окон, строк, меню, листбоксы, редактирование, доступ к диску. Такую тест-программу уже не лень менять при изменениях библиотеки; да и испытывать библиотеку после изменений на чём-то надо.

Согласен. Кстати о ф-циях работы с диском я стал все чаще задумываться. Если "взлетит" ftp клиент, они станут как никогда актуальными. ) Пример работы в ts-conf с SD я вроде как нашел, оформлю по мере проработки, а вот как работать с файлами на дискетах забыл напрочь. Тут пример с описанием был бы как нельзя кстати, чтобы не штурмовать книжки ).

Oleg N. Cher
11.01.2019, 20:43
asve79

;zill zero string => fill zero string?

Присмотритесь для поиска нуля в строке к команде CPIR - будет эффективнее по скорости. Вот, например, как это реализовано в SDCC:


unsigned int Strings_Length (unsigned char *str) __z88dk_fastcall {
__asm
XOR A
LD B,A
LD C,A
CPIR
LD HL,#0xFFFF
SBC HL,BC
__endasm;
}

А вот так, если длина строки не более чем len (будет достигнут 0 или строка закончится по длине - без 0). Экзотика, но это я для Оберона делал. Более безопасная работа со строками:


unsigned int Strings_LengthEx (unsigned int len, unsigned char *str) __z88dk_callee {
__asm
POP HL
POP BC ; len
EX (SP), HL ; str
LD E, C
LD D, B
XOR A
CPIR
EX DE, HL
RET NZ
SBC HL, BC
DEC HL
__endasm;
}