Page 1 of 3

CLi² (Command Line Interface 2)

PostPosted: Wed, 10.09.2014 00:37:45
by LessNick
Доброго вечера господа спектрумисты, сектанты и им сочувствующие!!

Image


Позвольте в этот Сырный день (день рождения Cirno 9.9), да и ещё и в полнолуние, представить свой долгий опус под названием «Command Line Interface 2» или сокращённо CLi². Почему вдруг я решил создать отдельную тему? Потому, что новая версия 2 (или по билду это 0.16) в корне отличается от предыдущих релизов. Дело в том, что по ясным причинам меня не устраивал тот «бардак» что творился внутри предыдущих версий и я затеял страшную вещь под названием «рефакторинг». Для тех кто не в курсе, что это такое, поясню. Рефакторинг, это когда вы переписываете, оптимизируете и выкидываете половину (если не больше) своего проекта в помойку и пишете код практически с нуля. Отсюда вытекает, что такой подвиг под силу не каждому, поскольку в первую очередь теряется интерес и абсолютно не хочется писать одно и тоже по второму кругу. Плюс, как показывает практика попутно появляются новые проблемы, баги и вопросы, которые тоже надо решать и всё это ведёт к тому, что в конце концов всё замерзает. Не обошла стороной и меня эта участь. Затеяв рефакторинг в прошлом (2013) году и столкнувшись с трудностями, всё это дело погрязло в пучине отчаянья и нечего неделания. Но! Не так давно, не безызвестный Koshi усиленно принялся выпускать новые версии Wild Commander и это стало хорошим толчком к тому, что бы закончить начатое.

Но хватит лирики. Что же появилось такого нового, чего не было раньше?

keyscan.png
keyscan.png (6.22 KiB) Viewed 41148 times

Одна из вещей которой мне не хватало в API WC, это скан-коды клавиатуры. Именно эта вещь стала краеугольным камнем, из-за чего всё «замерзло» и из-за чего всё стало по другому. Не буду утомлять вас деталями, но написав свой драйвер PS/2 клавиатуры, я столкнулся с трудностями. Решив их уже в этом году, я и не подозревал, что это только верхушка айсберга. Помимо скан-кодов, мне не нравилось, что по не понятным мне причинам при работе прерываний WC портилась банка #00. То есть если включил с #0000 какую-то свою банку и LDIR'ами пытался туда копировать данные, то в один прекрасный момент я мог словить «сюрприз». Половина данных была моих, а половина данных была затёрта WC. Баг это или фича я не знаю, и тогда мне абсолютно не хотелось в этом разбираться. Я переключил прерывания на себя, проблема исчезла, но вместе с ней появилась другая. Вместе с прерываниями перестал работать опрос клавиатуры, что послужило поводом продолжить работу над своим драйвером. Драйвер был готов и тут меня ждал второй «сюрприз».

Как выяснилось позже в WildCommander нельзя ни при каких условиях трогать вектор прерывания. API WC так устроено, что очень много функций завязаны в нём на «выравнивание» по инту, и при вызове просто подготавливают переданные данные, а когда приходит прерывание операция выполняется. Как не трудно догадаться в ходе своих экспериментов я остался, если не без 90, то уж без 80% функционала WC точно.

С ростом функционала CLi² я дошел до потолка и мне стало не хватать уже одной банки. И это послужило, как это не прискорбно, толчком в сторону некоторой «самостоятельности» и виде выделения в отдельный проект. На данный момент плагин для WildCommander представляет собой загрузчик (Loader), который ищет на SD-карте файл /system/kernel.sys, загружает его и передаёт уже управление ему. CLi² до сих пор использует вызовы API FAT-драйвера для чтения/записи файлов и немного его расширяет своими командами. Так же задействована принятая нумерация и функционал переключения банок с помощью API WC. Система не портит WildCommander и с помощью комбинации ATL+X или команды exit можно выйти обратно.

О технической стороне я расскажу отдельно. Здесь же мне хотелось бы немного рассказать о «нововведениях»:

rus.png
rus.png (3.56 KiB) Viewed 41148 times

  • Управление осталось практически таким же. То есть помимо ввода и подтверждения строки с помощью ENTER, появилось переключение на раскладку с русским языком. Переключается с помощью CTRL+SHIFT (пока «прибито гвоздями» в будущем думаю это будет настраиваемо).
  • Так же помимо режима замены (курсор «_») появился долгожданный режим вставки (курсор «|»). Однако с ним есть глюк с обновлением строки. Надо ещё разбираться, поэтому почти не юзабельно. Переключаются режимы клавишей Insert.
  • Так же появились fKeys. На клавишах F1…F11 висят команды и при нажатии клавиши они вставляются в командную строку. Для каждой клавиши отведено 16 байт и последствии их можно будет настраивать. Сейчас же команды такие:
    • F1 - "help\n"
    • F2 - "ls\n"
    • F3 - "type "
    • F4 - "edit "
    • F5 - "cd "
    • F6 - "rename "
    • F7 - "mkdir "
    • F8 - "delete "
    • F9 - "find "
    • F10 - "sh "
    • F11 - "pwd\n"
  • Немного изменилось и сочетание клавиш: теперь с помощью сочетания ALT+F1…F4 можно переключать 4 экрана. На 0м находится консоль, на 1,2,3 графическая область.
  • Как я уже говорил выше, из-за нехватки памяти пришлось многие «встроенные» команды выкинуть и сделать их внешними. Поэтому изменилась структура каталогов. Теперь для работы системы требуется всего две директории: «/bin» где расположены «внешние» команды и директория «/system», где находятся все файлы проекта.
  • После запуска /system/kernel.sys подружаются ещё два файла, это файл драйверов /system/drivers.sys (на данный момент там находятся драйвер мыши и драйвер для работы с NeoGS) и файл /system/gli.sys (графическая библиотека которая находится пока в зачаточном состоянии). После чего подгружается файл /system/startup.sh и передаётся управление уже ему. В нём можно прописать необходимые настройки, загрузку палитры, своего шрифта, или просто вывести логотип.
  • Шрифт тоже немного претерпел изменения. За основу был взят шрифт r0bat'а (который используется в WC) и немного видоизменены некоторые символы. В частности там появились «ёлочки», изменилась немного длина символов «_» и «—», расположение точек ковычек итд. Всё это было сделано для большей совместимости с амижными шрифтами для корректного отображения ASCII заставок.

    help.png
    help.png (6.27 KiB) Viewed 41148 times
  • Но вернёмся к функционалу. К базовым («встроенным») командам относятся следующие:
    • cd - change directory — смена текущего каталога
    • cls - clear screen - очиска экрана (с ключом -g n) очищается графический экран. где n номер экрана 1,2,3
    • dir, так же как и ls - выводят содержимое текущего каталога
    • exit - выйти в WildCommander
    • help - выводит список доступных команд
    • pwd - выводит полный путь текущей директории
    • rehash - пересканирует директорию /bin на наличие новых команд.
    • screen - переключает активный экран (удобно пользоваться в скриптах)
    • sh - запускает файл скрипта с расширением sh. На данный момент скрипт sh переставляет собой просто набор команд одной строкой, как если бы их просто набирали в консоли. В будущем конечно будет развиваться дальше для реализации уже более сложных конструкций, но пока тоже можно немного автоматизировать некоторые вещи.

    К «внешним» командам, которые располагаются в «/bin» относятся:
    • echo - выводит строку текста в консоль. Используется в основном в скриптах для вывода различной текстовой информации. Поддерживает управляющие коды через \xNN, где NN шестнадцатеричный код команды.

      red.png
      red.png (3.86 KiB) Viewed 41148 times
    • keyscan - данная утилита показывает скан код нажатой клавиши
    • loadfont - как ясно из названия, данная утилита позволяет загрузить шрифт.

      loadmod.png
      loadmod.png (7.86 KiB) Viewed 41148 times
    • loadmod - эта программа позволяет загружать mod-файлы в NeoGS и управлять воспроизведением.
    • loadpal- данная утилита загружает палитру для CLi, а если задан ключ -g позволяет загрузить палитру для одного из графических экранов.
    • loadsxg- программа загружает графическое изображение в формате SXG (Spectrum eXtended Graphics). Более подробно об этом формате будет рассказано отдельно несколько позже.

      micetest.png
      micetest.png (5.81 KiB) Viewed 41148 times
    • micetest - инструмент для тестирования kempston mouse. Отображает текущие координаты мыши, как вы сыром виде (RAW) так и положение относительно экрана. Программа рисует курсор поверх текстового режима и работает через API CLI с драйвером мыши.
    • mkdir - создаёт каталог в текущей директории. Это экспериментальная программа для тестирования функций записи.

      nvram.png
      nvram.png (9.68 KiB) Viewed 41148 times
    • nvram - уже более «серьёзная» законченная утилита. Позволяет работать с ячейками памяти CMOS (nvram): читать, писать, отображать дамп.
    • sleep - небольшая утилита, которая ожидает заданное количество секунд или нажатия любой клавиши, если задать 0.
    • type - выводит текстовый файл игнорируя все управляющие коды, кроме перевода строки. Если файл большой и задан ключ -s, то на экран будет выводится 1 страница, после чего будет задан классический вопрос «Scroll?»

      scroll.png
      scroll.png (3.89 KiB) Viewed 41148 times

На этом мне бы хотелось закончить «вводную» часть. Здесь не описаны приложения для тестов и недоделанные, однако вы можете их найти в архиве. Так же в архиве есть примеры скриптов, музыка mod и картинка в формате SXG.

Во второй части мы поговорим о внутренней структуре. Примерах итд. Ну а пока все желающие могут потестировать систему CLI². Для этого надо на карточку скопировать две директории «bin» и «system» и про писать в wc.ini:

Code: Select all
[PLUGINS]
CLI2    .WMF


и если всё удачно, вы увидите строку с приглашением:

welcome.png
welcome.png (8.59 KiB) Viewed 41148 times


p.s. Для работы необходим WildCommander версии не ниже 0.62!

Re: CLi² (Command Line Interface 2)

PostPosted: Wed, 10.09.2014 06:41:10
by Den1982
Вау! Круть! :pank: Жаль, что ща на работе. Приду домой обязательно потестю. Отдельный мегареспект за подробное и развернутое ридми! :ok2:

Re: CLi² (Command Line Interface 2)

PostPosted: Wed, 02.09.2015 13:01:12
by creator
breeze, новая версия будет? Под LongNames?

Re: CLi² (Command Line Interface 2)

PostPosted: Wed, 02.09.2015 17:28:48
by LessNick
creator wrote:новая версия будет? Под LongNames?


к сожалению не всё так простынь. много изменилось в api wc. хоть с ходу и удалось поправить многое, но появились фантомные глюки :( а это печальнее всего. последние несколько месяцев был аврал и за компом вообще не было времени сидеть. ничего не буду обещать, но по возможности буду дебажить чё за херня творится :(

Re: CLi² (Command Line Interface 2)

PostPosted: Wed, 02.09.2015 17:39:15
by LessNick
Вот например:

Image


Загружается MOD, даже с русскими именами, но[!] играет совершенно не верно :bang: и в чём дело хрен его знает.

Re: CLi² (Command Line Interface 2)

PostPosted: Thu, 18.02.2016 02:38:58
by LessNick
Вот так вот тихо и мирно спустя совсем не три года…

sshot000001.png

Под современную версию WildCommader…

sshot000000.png


Под чутким руководством моральной поддержкой VBI :agree: удалось выпустить версию 0.18a. Это не совсем то, что планировалось, но начинать с чего-то надо. Тут исправлены некоторые разногласия с новым API WC. Отображения длинных имён нет, поскольку вся работа с каталогами совершенно своя (CLI) и надо ещё оооочень сильно думать как это всё дело (длинные имена) разрулить.

Пока приведено всё в более менее божеский вид. App должны все работать. В комплекте идёт Bramble, и некоторое количество музыки MOD и картинок SXG для тестов. Так же есть тествое App, на основе которого я попозже расскажу как писать под CLi2.

Изначально в версии 0.18 должна была появится поддержка резидентов, но она как понимаете не дописана и к сожалению внесла ещё больше проблем с поиском ошибок. Но теперь вроде всё должно быть ок.

Для тех, кто первый раз видит CLI2: необходимо распаковать содержимое папки install в корень SD карты. Переписать поверх WC/WC.ini или добавить ручками «CLI2.WMF» по аналогии с другими плагинами. После загрузки WC, нажать F10 и выбрать соответствующий пункт меню.

Список всех доступных команд/app можно набрав help или нажав F1.

Часть команд встроенная в ядро (внутренние):
cd — как и в больших компьютерах перейти в другую директорию
cls — очистить экран
dir — отобразить текущий каталог (можно задать путь и отобразить содержимое любого каталога)
exit — выход в WC
help — список доступных команд
ls — тоже самое что и dir
loadres — пока не работает
pwd — показать текущий путь (где мы находимся?)
rehash — принудительно перечитать содержимое /bin (внешние команды)
screen — переключится на экран 0-3 (используется в скриптах)
sh — запускает скрипт указанный в качестве параметра

Часть команд подгружаемая из /bin (внешние):
echo — выводит в консоль тестовую строку (поддерживаются цветовые коды)
hello — пример программы
keyscan — опрашивает ps/2 клавиатуру и выводит в консоль сканкоды
loadfont — загружает шрифт в консоль
loadmod — загружает MOD файл в GeneralSound
loadpal — загружает файл раскраски (палитры) консоли (или графический для экранов 1-3)
loadsxg — загружается картинку в формате SXG
micetest — небольшая утилита для тестирования мыши
nvram — небольшая утилита для работы с ячейками CMOS
screenfx — небольшая утилита для эффектов с экранами
sleep — ожидание в секундах. 0 ждать нажатия клавиши (используется в скриптах)
test — выводит текстовые строки разными цветами
type — выводит на экран текстовый файл

Доступные ключи можно узнать запустив команды без параметров. Файлы скриптов (*.sh) представляют из себя список команд как бы если вы их набирали в консоли. После выполнения очередной команды, SH переходит к следующей, и так пока не закончится весь файл. Для запуска скрипта (например artpack'a «Bramble») нужно набрать в консоли команду: 1>sh /demo/bramble/run.sh

Ну вот собственно пока и всё :vodka:

Re: CLi² (Command Line Interface 2)

PostPosted: Thu, 25.02.2016 15:53:11
by amixgris
Повторный запуск CLI невозможен. WC вешается.

Re: CLi² (Command Line Interface 2)

PostPosted: Thu, 25.02.2016 16:43:56
by LessNick
amixgris wrote:Повторный запуск CLI невозможен. WC вешается.


Нежданчик :) Бум разбираться. Хотя по большому счёту, WC уже чисто как loader ;)

Да и честно говоря, F12 имхо уже быстрее :eating:

Re: CLi² (Command Line Interface 2)

PostPosted: Sat, 27.08.2016 17:24:25
by Mor-Da
Огонь. Запустил на U16. Но... клава как бешенная дублирует символы (как это называется, дребезг?). Можно это как-то пофиксить?

Re: CLi² (Command Line Interface 2)

PostPosted: Sat, 27.08.2016 20:46:04
by LessNick
Mor-Da wrote:Можно это как-то пофиксить?


Честно сказать сложно в чём там дело ибо на PentEvo (TS-Conf) всё как бы работало. Единственное, что могу предложить потестировать версию 0.20. Она доступна на github.

Не смотря на то, что 0.20 ещё не готова (по этой собственно причине я и не анонсирую её), но это уже совершенно самостоятельная система. Для запуска не требуется наличие WildCommander'а с плагином. Просто содержимое Install копируется в корень SD-карты вместе с boot.$c. Бут не простой, и если при запуске (F12) удерживать клавишу W вместо CLI² загружается WC/wc.$c и управление передаётся ему.

По мимо отделения от WC, в новой версии появилось много нововведений:

Появились как новые команды, так и новый тип — операторы, которые начинаются с точки:

Image

Пока это всё ещё в процессе написания, но в будущем, с их помощью можно значительно расширить возможности Shell-скриптов:

Image

Так же появилась нативная поддержка мышки. Можно включать/отключать отображение курсора на различных экранах (ALT+F1…F4):

Image

А так же зажав левую кнопку мыши выделить текст на экране, что бы затем затем с помощью средней уже вставить. Текст копируется в буфер (256б) и вставляется столько раз сколько нужно. Единственно что пока это работает только после сброса. Если текста становится много и он скроллируется вверх с выделением и копированием происходят глюки. Поэтому это пока больше для понту, чем реальная польза.

Так же теперь меняется внешний вид курсора при «занятости» системы. На скрине пример загрузки MOD-файла:

Image

Ну и конечно же долгожданная поддержка длинных имён файлов:

Image

Ну и теперь команды LS и DIR отображают содержимое директории несколько по разному. DIR как и аналог команды LL отображается список файлов с атрибутами, датой создания итд. Команда LS отображает просто 2 колонки имён файлов:

Image

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

Re: CLi² (Command Line Interface 2)

PostPosted: Sat, 27.08.2016 20:57:58
by Mor-Da
О-о-о, блин, какой охренительный рулез. Завтра же испробую и отпишусь.

Re: CLi² (Command Line Interface 2)

PostPosted: Sat, 27.08.2016 22:35:45
by MVV
Mor-Da wrote:Огонь. Запустил на U16. Но... клава как бешенная дублирует символы (как это называется, дребезг?). Можно это как-то пофиксить?

Остается попросить вынести драйвер клавиатуры, т.к. вместо устаревшего PS/2 уже USB HID клавиатура и мышь. Мышь получилось подружить, а вот с клавиатурой сложнее, там сканкоды и их последовательности отличаются, программно это решается в разы проще, чем еще прикручивать для этого лишнее аппаратное преобразование.

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 00:22:14
by LessNick
MVV wrote:Остается попросить вынести драйвер клавиатуры,


драйвер клавиатуры и так в принципе как отдельный модуль.

MVV wrote:сканкоды и их последовательности отличаются


вот это честно скажу очень странно :( Дело в том, что на этом завязана структура keymap и поменять сходу всё это будет не просто.

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

Единственное, что приходит в голову, если глюки с автоповтором, то по идее можно его отключить. Тогда клавиша будет обрабатываться только тогда, когда её физически отпустили. Ну опять же всё зависит от того как происходит «эмуляция» PS/2

Кстати, Mor-Da, можно в скрипте загрузки системы (system/startup.sh), раскомментировать 7ю строку (убрав ; ) там где запускается keyscan и понажимав кнопки посмотреть как валятся коды. Можно даже сделать фото экрана.

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 08:53:04
by Mor-Da
Очень кратковременно нажата клавиша "А"В левом верхнем углу такой артефакт при загрузке. По W-F12 WC не грузится.

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 09:03:49
by MVV
LessNick, вот табличка преобразования клавиш http://www.hiemalis.org/~keiji/PC/scanc ... nslate.pdf
На стр.60 описан report http://www.usb.org/developers/hidpage/HID1_11.pdf
У меня сделано просто, я передаю 6 байт репорта клавиатуры через порт #nnxx (порт можно любой не конфликтующий), программно уже просматривая их по очереди и по табличке определяя что за клавиша. Клавиша считается удерживаемой, если она присутствует в репорте.
Вот как выглядит аппаратное преобразование https://github.com/mvvproject/ReVerSE-U ... alizer.vhd

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 15:32:54
by LessNick
Mor-Da wrote:артефакт при загрузке


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

Mor-Da wrote:По W-F12 WC не грузится.


Ну что бы он загрузился, собственно его надо туда скопировать. Тоесть то что раньше было boot.$c переименовать в wc.$c и положить в папку WC рядом с плагинами.

Image

По поводу кодов, это полная каша. Во первых код нажатой "A" должен определяться как #1C #00 #00 #00, и соответственно код отжатой "A" будет #F0 #1C #00 #00. А то что я вижу на экране это явно не то. Причём непонятно что за код #FF #00 #00 #00 ? Это явно не правильный ответ. Собственно драйвер и не понимает, что клавишу отпустили. Любой код отпущенной клавиши начинается с #F0 и далее код клавиши.

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 15:43:06
by LessNick
MVV wrote:вот табличка преобразования клавиш


Ну собственно всё и правильно:

Image

MVV wrote:я передаю 6 байт репорта клавиатуры


ну тут два варианта, либо ты отдаёшь несколько «не те» сканкоды, либо заковырка в самих байтах репорта.

И судя по коду #FF #00 #00 #00, я подозреваю что преобразование идёт по первой группе кодов, а #FF означает «Overrun Error»? :smoke:

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 17:56:18
by Mor-Da
WC лежит там. Скан-коды бегут без остановки. Ну и потом, у меня же не Evo, а U16. ;)

Re: CLi² (Command Line Interface 2)

PostPosted: Sun, 28.08.2016 21:13:31
by LessNick
Mor-Da wrote:WC лежит там.


хм. тогда получается что-то с опросом не так. надо разбираться подробнее.

Code: Select all
      ld   bc,#fbfe
      in   a,(c)
      bit   1,a               ; Если удерживается «W» значит надо грузить Wild Commander
      jr   nz,sbCont


вот кусок, тут вообще опрос порта ZX-клавиатуры. Надеюсь с этим вопросов нет?

Mor-Da wrote:Скан-коды бегут без остановки.


Бегут потому что не правильно возвращаются скан коды, и система думает что клавиша залипла. Я уже писал выше, какие значения она ожидает.

Mor-Da wrote:Ну и потом, у меня же не Evo, а U16.


Это понятно, именно поэтому и обсуждали с MVV процесс преобразования USB->PS/2

Re: CLi² (Command Line Interface 2)

PostPosted: Fri, 02.09.2016 08:55:21
by Mor-Da
Жаль, что так и не договорились, кто должен внести правки в код. Пичалька. :(

Re: CLi² (Command Line Interface 2)

PostPosted: Fri, 02.09.2016 13:22:25
by LessNick
Mor-Da wrote:Жаль, что так и не договорились


Ну сложно договорится, с тем кто не поддерживает диалог. Я понятия зелёного не имею почему как работает код коши в wc. Но скажу только так как реализовано у него получить нативные 4 кода PS/2 было не реально, как и прикрутить сменную раскладку клавиатуры (на момент написания CLI). Именно по этой самой причине и был написан СВОЙ драйвер PS/2.

Скорее всего в кошином драйвере не было строгой проверки соответствия, и реализация в U16 это подгон под ответ — «а у меня всё работает © KOE»

Пока U16 не будет возвращать чётко 4 кода через ячейки CMOS говорить тут больше не о чём. На лицо явно проблема «эмуляции» железа PentEvo.

Re: CLi² (Command Line Interface 2)

PostPosted: Fri, 02.09.2016 19:49:23
by MVV
В build 20160830 сделал возможность чтения HID Keyboard Report [modifier, Key1, Key2, Key3, Key4, Key5, Key6]
Port #0004 = modifier:
bit 0: left control
bit 1: left shift
bit 2: left alt
bit 3: left GUI (Win/Apple/Meta key)
bit 4: right control
bit 5: right shift
bit 6: right alt
bit 7: right GUI

Port #0104 = Key1
...
Port #0604 = Key6

Сразу получаем состояние восьми функциональных клавиш + 6 обычных, драйвер в разы меньше и проще, а не как в PS/2 - 4 кода только одной клавиши ))

Re: CLi² (Command Line Interface 2)

PostPosted: Fri, 02.09.2016 22:39:53
by VBI
Чем больше костылей - тем надёжнее система!

Re: CLi² (Command Line Interface 2)

PostPosted: Fri, 02.09.2016 23:09:47
by MVV
VBI wrote:Чем больше костылей - тем надёжнее система!

Купи слона.

Re: CLi² (Command Line Interface 2)

PostPosted: Mon, 05.09.2016 14:18:27
by Mor-Da
Господа гуру, а нам-то простым смертным што делать-то. Хэлпингуйте плиз, пока интерес не отпал-то.