******************************************************************************* ***********+----------------------------------------+************************** ***********| |!************************* ***********| В е с т н и к K o l i b r i O S |!************************* ***********| |!************************* ***********+---+-------------+----------------------+!************************* ************!!!| | |!************************* ***************| Выпуск 3 | 29 августа 2008 года |!************************* ***************| | |!************************* ***************+-------------+----------------------+!************************* ****************!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!************************* ******************************************************************************* Третий выпуск журнала, посвящённого операционной системе Kolibri. =============================================================================== Содержание =============================================================================== Some info about KolibriOS MeView от Nable Table - программа обработки электронных таблиц Очень функциональный шелл Общесистемный буфер обмена для ОС Колибри. Информация для разработчиков Полезные ссылки Информация будущим авторам =============================================================================== Some info about KolibriOS Albom, albom85@yandex.ru =============================================================================== 1) KolibriOS (KOS) is an alternative MenuetOS-based operating system. It runs on IA-32 processors (IA - Intel architecture). 2) It is an open source project (GPL). 3) The system has a built-in Graphical User Interface (GUI) similar to Windows. 4) The kernel, drivers, libraries and most of programs are written in assembler. 5) You can use FASM under KOS. Under other platforms besides assembler (FASM, NASM, MASM, TASM, ...) you can use high-level language compilers (GCC, MSVC, FreePascal, MBasic, Menuet Pascal Compiler, Sphinx C--, ...). 6) Some programs are already ported to KOS. There are some games (Doom and Quake), assembler FASM, DOS-emulator DOSbox and ScummVM emulator. 7) KOS has own programs such as:  - file managers (KFAR, KFM, LC, SysXTree, Eolite)  - simple shells (SHELL, CMD)  - text editor (tinypad)  - painting tools (animage, paint)  - calculator (calc)  - screenshot maker (screenshot)  - WAV and MP3 player (AC97SND)  - development tools (BOARD, H2D2B, KEYASCII, SCANCODE, cObj)  - FORTH (meforth)  - archivers and packers (kpack, KERPACK, MHC, MtApPack)  - simple antivirus program (AV)  - ICQ client (ki)  - simple HTML viewer (HTMLv)  - ZX Spectrum emulator (e80)  - many network applications (AIRC, FTPS, DNSR, JMAIL, HTTPC, HTTPS, MP3S, POPC, PPP, SMTPS, TELNET, TERMINAL, ...)  - utilites to view BMP, GIF, JPEG, PNG, ICO, CUR (MV, @RCHER, GIFVIEW, JPEGVIEW, imgview)  - a lot of simple games (tetris, mine, pong, arcanii, xonix, socoban, piton, mblocks, 15, checkers, click, fara, pipes, lines, kox, kosilka, donkey, ...)  - demos (aclock, eyes, fire, life2, plasma, tinyfrac, tube, ...)  - 3D demos (3DCUBE2, CUBETEXT, CROWNSCR, FLATWAV, VIEW3DS, ...) 8) Some programs are still required. For example developers need a C compiler such as port of GCC, a Pascal compiler such as Free Pascal, a BASIC interpreter. And of course users need some utilites. 9) Possible using of KolibriOS: in schools and universities for learning computers and assembler... 10) It is possible to run KOS programs under Windows using KOS-emulator (KlbrInWin, meosemul, meosdebug). =============================================================================== MeView от Nable Nable =============================================================================== Меня, да и не только, не очень радует, что в КолибриОС (да и в МенуэтОС, который в прошлом) для каждого формата изображений отдельный просмотровщик, в общем у меня долго чесались лапки сделать универсальную прогу, чтобы была одна программа для всех форматов. За основу я взял MeView (который изначально предполагался как просмотровщик только BMP) потому, что JpegView совсем грубо заточен под одну цель, да и другие причины, многие другие просмотровщики (@rcher, Bmp Viewer из MenuetOS, GifView, и т.д.) тоже имели недостатки подобного плана. В общем, методом исключения выбрал MeView. Для начала я хорошенько почистил и структурировал код и разбил его на части, даже почти на модули, так что теперь его легко модифицировать и оптимизировать (хотя второе у вас вряд ли получится, так как я до предела придирчиво и аккуратно чистил и оптимизировал код). Единственная часть, которую я почти не трогал, это распаковщик GIF от Willow (Willow - Андрей Ивушкин). Но изменённый мной 'gif_lite.inc' отдельно от MV работать без переделки не будет, так как в оригинале передавались параметры для функций, а у меня же в целях оптимизации они фиксированы. Второй вещью, которую я сделал было добавление поддержки GIF (сначала статических, а потом и анимированых, всё с помощью 'gif_lite.inc' от Willow), затем я добавил поддержку BMP 32bpp и поддержку 4-х проходных ('interlaced') картинок GIF (не буду здесь объяснять, что это такое, необходимая документация прилагается, да и если интересно, Интернет вас ждёт). Были попытки сделать поддержку JPEG (JFIF), но всё тщетно, уж очень проблематичный формат для реализации на ассемблере (но в ближайшем будущем обязательно будет и его поддержка). Затем я добавил поддержку изображений PCX 8 и 24bpp, код распаковщика PCX был почти полностью написан мной самим, по той причине, что сложно найти нормальный и работающий пример реализации на ассемблере просмотровщика PCX. Оказалось проще прочитать документацию и сделать самому. Сейчас список поддерживаемых форматов значительно расширился. Кроме BMP, PCX и GIF файлов поддерживаются ICO и CUR, TGA, а также файлы, представляющие собой снимки экранной памяти Спектрума (SCR, S и $C). Интересной особенностью является то, что тип изображения, которое надо открыть, определяется не из расширения файла, а посредством сигнатур. Этот метод имеет некоторые преимущества, а единственным недостатком является то, что некоторые форматы не имеют сигнатур. И ещё, если картинку, которая поддерживается, упаковать KPack'ом, она всё равно будет поддерживаться, т.е. открываться. В MeView работает прокрутка изображений. Курсорные клавиши по кругу прокручивают картинку по одной точке, PgUp и PgDn прокручивают по вертикали по 100 точек вверх или вниз, ну а кнопка Home в комментариях не нуждается. MeView можно использовать в качестве графического бэк-энда, т.е. использовать его вместо того, чтоб включать в каждую программу соответствующий декодер. Есть возможность автоматически устанавливать фон рабочего стола при запуске системы. Формат изображения при этом должен быть в списке поддерживаемых. Итак, уже сейчас можно утверждать, что MeView - это программа, которая может стать универсальным средством просмотра изображений в операционной системе Колибри. На будущее же есть планы добавить поддержку других форматов изображений и изменить интерфейс программы в лучшую сторону. =============================================================================== Table - программа обработки электронных таблиц barsuk =============================================================================== Язык разработки: C (точнее, C++ без классов). Среда разработки: MS Visual C++ 6.0. Возможности: - редактирование таблицы, в каждой ячейке которой записана строка; - изменение размеров столбцов и строк; - сохранение и загрузка таблиц; - обработка математических выражений. Планы: В Table 1.0 должны быть следующие функции: - чтение и загрузка файлов CSV (comma-separated values); - заполнение ячеек значением (с использованием арифметической прогрессии и замены ссылок на другие ячейки); - экспорт данных в graph (моя программа для построения графиков); - сортировка данных; - доработка пользовательского интерфейса (для обеспечения большего удобства и меньшего мелькания). Интерфейс: Интерфейс я старался сделать похожим на интерфейс других программ работы с электронными таблицами, в частности MS Excel и OpenOffice Calc. Здесь поясню некоторые неясные моменты. - после ввода данных в ячейку нажмите Enter; - ячейка, в которой записана неверно введенная или содержащая ссылки на пустые ячейки формула, выделяется красным; - чтобы переключить режим отображения формул вместо их значений, нажмите CTRL-F. Математические выражения: Чтобы указать, что в ячейке записана формула, а не текст, первым символом следует указать "=". В этом случае вместо введенного текста будет отображаться результат вычисления. 1. Типы данных Только один - double. Истине соответствует 1.0 (или любое значение, не равное 0.0), лжи - 0.0. Сравнение производится с учетом эпсилон (сейчас 1e-6). Значения бесконечности и не-числа отсутствуют (хотя при вычислении формулы со ссылкой на ячейку с неверной формулой возникнет ошибка). 2. Операции 2.1. Арифметика: +, -, *, /, ^ (степень), % (остаток от деления), унарные + и -. 2.2. Сравнения (результат - логический): =, !=, # (тоже "не равно", но в стиле Оберона), <, <=, >, >=. 2.3. Логика: унарное отрицание !. Логические значения можно умножать (операция "И") или складывать (операция "ИЛИ"). Есть, впрочем, логические функции. 3. Функции 3.1. Фиксированные. pi() возвращает значение числа пи. eps() возвращает текущее значение эпсилон. 3.2. Округление. ceil, floor и round (последний округляет 2.5 к 3). 3.3. Логика. and, or, xor (очевидно). 3.4. Тригонометрия. sin, cos, tg, ctg, arcsin, arccos. 3.5. Экспонента и логарифм. exp, log. Степень pow(x,y) = x^y. Также sqrt(x) = x^0.5. 3.6. Проверка. isnull(имя_переменной) возвращает 1.0, если переменной нет, и 0.0, если она есть и определена. Если указать не имя переменной, вернет, как правило, 1.0. В Table под именем переменной понимается имя ячейки, состоящее из имени столбца и имени строки, например: B5, AA17. Перед именем столбца или строки может стоять знак $ (в текущей реализации ни на что не влияет). 3.7. Статистика. sum, min, max, avg. Принимают любое количество аргументов. 3.8. Проверка условия. if(условие, значение_если_истина, значение_если_ложь). Вычисляет условие. Если оно равно 0.0, возвращает значение_если_ложь, иначе возвращает значение_если_истина. И case(значение, количество_вариантов, вариант1, вариант2, ..., вариантN, значение1, значение2, ..., значение_N [, значение_по_умолчанию]). Если среди вариантов 1..N встретится значение, то возвращается значение с соответствующим индексом. Иначе - значение_по_умолчанию (необязательный параметр, но если он понадобится, а не указан, то будет ошибка). 3.9. Хаос. rand(макс_значение) - генератор вещественных случайных чисел от 0 до макс_значения. Пересчет происходит при изменениях любых ячеек. 4. Ошибки Ошибка возвращается при неверном синтаксисе, делении на 0, извлечении корня из отрицательного числа и т.д., а также если функции передать неверное количество аргументов или если используется неизвестная переменная или функция. Все, что есть, чувствительно к регистру(!). Примеры верных выражений: =A1*sin(B5) =1 =sin(pi()) + exp(1) =ceil($AA$34) =if(A4>A5,A4,A5) =max(A4,A5,A6,A7) =if(isnull(B5),0,B5) =if(or(isnull(D9),isnull(D2)),0,D9*D2) =case(B4,4,1,2,3,4,B5,B6,B7,B8,-1) =============================================================================== Очень функциональный шелл Albom, albom85@yandex.ru =============================================================================== Наверное, никто не станет спорить, что командная строка CMD в KolibriOS мало функциональна. Поэтому я решил написать собственный шелл. Что же из этого получилось? Постановка задания: 1) Язык разработки - Си; компилятор - gcc (MinGW). 2) Минимальный набор команд из мира UNIX. 3) Использование библиотеки console.obj. 4) Поддержка скриптов собственного формата. 5) Возможная реализация консольных приложений. Условие 5 выполнено не было и вряд ли будет когда-нибудь выполнено. Что реализовано в текущей версии (0.4): 1) Запуск шелла с возможностью указания параметров. 2) Ввод команд с помощью собственной процедуры (которая используется вместо con_gets). 3) История из 5 (можно изменить при компиляции) введённых команд. 4) 19 команд: about, alias, cd, date, echo, exit, free, help, kill, ls, mkdir, more, ps, pwd, reboot, rm, rmdir, touch, ver. 5) Схема псевдонимов, построенная на команде alias (до 256 команд), в которой, впрочем, обнаружились серьёзные баги. 6) Возможность запуска скриптов (при запуске шелла автоматически запускается скрипт .shell, скрипт должен начитаться с #SHS, если строка начинается с #, то вся строка игнорируется). 7) Реализованная команда more позволяет просматривать содержимое небольших текстовых и бинарных файлов (если же просматриваемый файл имеет большой размер, то вывод занимает много времени, а информация не помещается на экране). Что будет реализовано в ближайших версиях: 1) Новый парсер командной строки, разбивающий введённую команду на int argc и char* argv[]. При этом все команды (about, alias, cd, date, ...) будут принимать эти параметры. 2) Автоподстановка при нажатии кнопки Tab. 3) Ещё несколько команд. В ходе разработки и использования шелла были обнаружены следующие недостатки библиотеки console.obj: 1) Невозможность очистки консоли. 2) Невозможность получения/установки текущего положения курсора. 3) Некорректное завершение программы при нажатии кнопки закрытия окна. 4) Непрезентабельный вид полосы прокрутки. 5) Малое количество шрифтов (например, 8x16 для меня маловат, а 10х20 - великоват; хотелось бы и 9x18, но где его взять?). Из недостатков консоли вытекают недостатки шелла: 1) Невозможность реализации таких команд как clear и top. 2) Для корректного завершения шелла необходимо вводить команду exit. Кроме того шелл пока сыроват и обладает недостатками более существенными, нежели вышеприведенные. Но, надеюсь, большую их часть удастся устранить. =============================================================================== Общесистемный буфер обмена для ОС Колибри. Информация для разработчиков. barsuk =============================================================================== Кратко: Буфер реализован через процесс-демон и IPC-сообщения. Для проверки нужно запустить @clip (демон), а также cliptest и доску отладки или test2 (можно несколько). 1. Демон @clip и его команды Демон @clip реализован как процесс, не создающий окон (зачем они ему), а только слушающий IPC-сообщения. Демон поддерживает до 16 (MAX_FORMAT) буферов для различных форматов данных, и до 16,7 Мб (MAX_SIZE) данных в каждом буфере (память отводится динамически). Id формата данных - число от 0 до 65534 (значение 65535 зарезервировано). При запуске демон завершает все другие процессы @clip. Команды, передаваемые демону, имеют формат: [ Cmd: word | Format: word | Reserved: Dword | Data: ...] Здесь Cmd - код команды, Format - id формата данных, Reserved - что угодно (не используется), и Data - данные, смысл которых зависит от команды. Демон воспринимает следующие команды: Код 1. Set Size. Указать необходимый размер буфера для приема данных. По этой команде демон при необходимости расширяет свой буфер для IPC-сообщений (способа уменьшить буфер в текущей реализации нет). Параметр Data: 1 Dword, содержащий размер данных для передачи. Длина команды: 12 байт. Код 2. Set. Передача данных. По этой команде данные копируются в память демона. Параметр Data: данные, которые нужно скопировать. Длина команды: 8 + (длина данных) байт. Код 3. Get Size. Получить размер данных, хранящихся в буфере с указанным id формата. По этой команде демон отправляет ответное IPC-сообщение длиной 4 байта, содержащее размер данных в буфере. Если данные в буфере отсутствуют, в сообщении указывается размер 0. Длина команды: 8 байт. Код 4. Get. Получить данные из буфера с указанным id формата. По этой команде демон отправляет ответное IPC-сообщение нужной длины с данными из буфера. Если данные в буфере отсутствуют, ответное сообщение не отправляется. Длина команды: 8 байт. Код 5. Delete. Очистить буфер с указанным id формата. Если указать id формата = 0xFFFF, будут очищены все буферы. Длина команды: 8 байт. Исходный файл - @clip.asm. Если раскомментировать строчку ;define DEBUG TRUE и закомментировать следующую, то демон начнет писать на доску отладки, и можно будет что-то понять о возникающих ошибках. DEFAULT_SIZE - начальный размер IPC-буфера MAX_SIZE - ограничение на буфер MAX_FORMAT - число различных форматов, которые можно засунуть в демона одновременно (а если больше, сглючит. Тоже надо пофиксить). DELAY - задержка между попытками отправки сообщения, * 1/100 сек. ATTEMPT - количество попыток отправки сообщения занятому или не готовому процессу. 2. clip.inc - набор функций для более высокоуровнего общения с демоном @clip Реализовано чтение буфера и запись в буфер. Пример использования - cliptest.asm (вывод на доску отладки) и test2.asm. При использовании clip.inc необходимо указать следующие значения (числа, естественно, могут быть другие): DEFAULT_MASK = 7 ;Маска событий (см. функцию 40) по умолчанию для ;текущего потока. Нужна, чтобы после приема ;IPC-сообщения (когда маска меняется на 01000000b) ;восстановить старую маску SEND_DELAY = 10 ;пауза между попытками при отправке сообщения ;демону RECV_DELAY = 100 ;время ожидания ответа от демона (если за это время ;не пришел ответ, то ошибка); ;время - в сотых секунды (как для функции 5) ATTEMPT = 5 ;количество попыток отправки сообщения, если ;демон занят После включения clip.inc становятся доступными функции: clipboard_init() - поиск процесса @clip. Эту функцию можно вызывать многократно (например, если демон не нашелся или был перезапущен), но 1 раз вызвать нужно обязательно. Возвращает 1 при успехе и 0 при неудаче (не найден демон). clipboard_write( esi указывает на буфер в формате CLIP_BUFFER (см. далее), ax (слово) - id формата ) - запись данных в буфер обмена. Выполняет команды 1 и 2. Возвращает 1 при успехе и 0 при неудаче (причины бывают разные: демон не был найден или занят и т.д.). clipboard_read( esi указывает на буфер в формате CLIP_BUFFER (см. далее), ax (слово) - id формата ) - чтение данных из буфера обмена. Выполняет команды 3 и 4. Возвращает в eax 1 при успехе, -1 при нехватке места в буфере-приемнике (который в этом случае не меняется) и 0 при прочих ошибках. В edx (при eax=1 или -1) возвращается действительный размер данных в буфере. Замечание. Если приложение использует входящие IPC не только для работы с буфером обмена, следует обрабатывать сообщения демона @clip вручную, т.к. иначе может возникнуть такая ситуация: сообщение от другого приложения попадет в буфер этого приложения для сообщений от демона буфера и будет проигнорировано. Также можно использовать (после вызова clipboard_init) следующие функции более низкого уровня: _ipc_send ( esi указывает на обычный буфер, edx - количество байт ) - отправляет IPC-сообщение демону. Отличие от функции 60/2 в том, что _ipc_send повторяет несколько (точнее, ATTEMPTS) раз попытку отправки, если буфер демона занят (код 2) или переполнен (код 3), с паузой в SEND_DELAY/100 секунд. Возвращает 1 при успехе, 0 при ошибке. _ipc_recv( esi указывает на буфер в формате CLIP_BUFFER (см. далее), edx - маска событий потока по умолчанию) - ждёт сообщения от демона в течение RECV_DELAY/100 секунд. При успехе результат сохраняется в esi. Возвращает 1 при успехе, 0 при ошибке. Формат буфера для работы с буфером обмена: CLIP_BUFFER (+0) .size dd ? ; здесь должен быть записан размер ; собственно буфера (N) ; при записи данных в буфер, если нужно ; отправить меньшее количество байт, ; временно запишите это количество сюда ; (см. пример test2) (+4) .sys1 dd ? ; \ эти поля используются модулем clip.inc ; - для внутренних целей и не должны (+8) .sys2 dd ? ; / модифицироваться приложением (+12) .data db N dup(?); собственно данные буфера Удачи в программировании и отладке! =============================================================================== Полезные ссылки =============================================================================== http://kolibrios.org/ - официальный сайт KolibriOS. http://board.kolibrios.org/ - официальный форум KolibriOS. http://www.wasm.ru/ - сайт, посвящённый ассемблеру. http://flatassembler.net/ - сайт ассемблера FASM. http://www.c--sphinx.narod.ru/ - компилятор языка C--. =============================================================================== Информация будущим авторам Albom, albom85@yandex.ru =============================================================================== Прошло больше полугода с момента выхода второго номера журнала. За это время многое изменилось в самой системе КолибриОС, многое изменилось в сообществе разработчиков, многое изменилось и в журнале. Статей, честно говоря, маловато. Поэтому, у кого есть возможность и желание - пишите. Условий пока не много: 1) Статьи нужно присылать на мой адрес. 2) Объём статьи - 3-6 килобайт в формате txt. 3) Скриншоты в формате PNG. Разрешение - до 320 на 320. Удачи!