Позвольте в этот Сырный день (день рождения Cirno 9.9), да и ещё и в полнолуние, представить свой долгий опус под названием «Command Line Interface 2» или сокращённо CLi². Почему вдруг я решил создать отдельную тему? Потому, что новая версия 2 (или по билду это 0.16) в корне отличается от предыдущих релизов. Дело в том, что по ясным причинам меня не устраивал тот «бардак» что творился внутри предыдущих версий и я затеял страшную вещь под названием «рефакторинг». Для тех кто не в курсе, что это такое, поясню. Рефакторинг, это когда вы переписываете, оптимизируете и выкидываете половину (если не больше) своего проекта в помойку и пишете код практически с нуля. Отсюда вытекает, что такой подвиг под силу не каждому, поскольку в первую очередь теряется интерес и абсолютно не хочется писать одно и тоже по второму кругу. Плюс, как показывает практика попутно появляются новые проблемы, баги и вопросы, которые тоже надо решать и всё это ведёт к тому, что в конце концов всё замерзает. Не обошла стороной и меня эта участь. Затеяв рефакторинг в прошлом (2013) году и столкнувшись с трудностями, всё это дело погрязло в пучине отчаянья и нечего неделания. Но! Не так давно, не безызвестный Koshi усиленно принялся выпускать новые версии Wild Commander и это стало хорошим толчком к тому, что бы закончить начатое.
Но хватит лирики. Что же появилось такого нового, чего не было раньше?
Одна из вещей которой мне не хватало в 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 можно выйти обратно.
О технической стороне я расскажу отдельно. Здесь же мне хотелось бы немного рассказать о «нововведениях»:
- Управление осталось практически таким же. То есть помимо ввода и подтверждения строки с помощью 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 заставок.
- Но вернёмся к функционалу. К базовым («встроенным») командам относятся следующие:
- 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 шестнадцатеричный код команды.
- keyscan - данная утилита показывает скан код нажатой клавиши
- loadfont - как ясно из названия, данная утилита позволяет загрузить шрифт.
- loadmod - эта программа позволяет загружать mod-файлы в NeoGS и управлять воспроизведением.
- loadpal- данная утилита загружает палитру для CLi, а если задан ключ -g позволяет загрузить палитру для одного из графических экранов.
- loadsxg- программа загружает графическое изображение в формате SXG (Spectrum eXtended Graphics). Более подробно об этом формате будет рассказано отдельно несколько позже.
- micetest - инструмент для тестирования kempston mouse. Отображает текущие координаты мыши, как вы сыром виде (RAW) так и положение относительно экрана. Программа рисует курсор поверх текстового режима и работает через API CLI с драйвером мыши.
- mkdir - создаёт каталог в текущей директории. Это экспериментальная программа для тестирования функций записи.
- nvram - уже более «серьёзная» законченная утилита. Позволяет работать с ячейками памяти CMOS (nvram): читать, писать, отображать дамп.
- sleep - небольшая утилита, которая ожидает заданное количество секунд или нажатия любой клавиши, если задать 0.
- type - выводит текстовый файл игнорируя все управляющие коды, кроме перевода строки. Если файл большой и задан ключ -s, то на экран будет выводится 1 страница, после чего будет задан классический вопрос «Scroll?»
На этом мне бы хотелось закончить «вводную» часть. Здесь не описаны приложения для тестов и недоделанные, однако вы можете их найти в архиве. Так же в архиве есть примеры скриптов, музыка mod и картинка в формате SXG.
Во второй части мы поговорим о внутренней структуре. Примерах итд. Ну а пока все желающие могут потестировать систему CLI². Для этого надо на карточку скопировать две директории «bin» и «system» и про писать в wc.ini:
- Code: Select all
[PLUGINS]
CLI2 .WMF
и если всё удачно, вы увидите строку с приглашением:
p.s. Для работы необходим WildCommander версии не ниже 0.62!