www.boolean.name

www.boolean.name (http://forum.boolean.name/index.php)
-   Проекты на MidletPascal (http://forum.boolean.name/forumdisplay.php?f=88)
-   -   gainOS (http://forum.boolean.name/showthread.php?t=15065)

PacMan 05.07.2011 14:01

gainOS
 
Вложений: 1
Версия 0.3
gainOS - очередной проект "ОС" для мобильных телефонов выполненного на MIDlet Pascal.

Разработчики:
Что примечательного:
  • Ядро
  • Системные сообщения
  • Процессы
  • Интерпретатор
  • Консоль

Вообще gainOS - это доказательство того, что две головы лучше чем одна. Ведь мы создали это "нечто" за сравнительно небольшой промежуток времени, переплюнув проекты других псевдо-ОС.

Что нового?

Версия 0.3
  • Исправлены многочисленные баги
  • Изменено Bootmenu (теперь на Canvas'е)
  • Добавлена визуализация процесса копирования и перемещения
  • Добавлено сворачивание окон

Версия 0.2
Система:
  • Добавлено Bootmenu
gASM:
  • добавлены функции для работы с файлами (подробная информация в файле gASMreadme.txt)
  • теперь можно обратиться к адрессу, который записан в другом ячейке памяти с помощью знака $ (подробно в gASMreadme.txt)
Терминал:
  • добавлена комманда ps
  • улучшена комманда help



Команды терминала:
install - выполнить инсталяцию системы
version - версия терминала
cd [путь] - выбрать текущую папку
ls - содержимое папки
help - список комманд терминала
kill [pid] - уничтожить процесс с указанным айди
create [приложение] - создать процесс
time - текущее время
pwd - путь к текущей папке
dl - список дисков
shutdown - завершение системы
clear - очистка экрана
edit [файл] - текстовый редактор
env [переменная="значение"]- переменные окружения
mkdir [имя папки] - создать папку
rename [имя] [новое имя] - переименовать файл или папку
rm [файл/папка]- удалить файл или папку ( если не пуста )
view [файл] - просмотр текстового файла
copy [адрес файла] [новый адрес файла] - копировать файл
move [адрес файла] [новый адрес файла] - переместить файл


Документация к интерпритатору:
Структура простого приложения
====================
1.| MODE #APPLICATION TYPE#
2.| $APP
3.| Start:
4.| hlt
====================
В 1 строчке идет объявление типа приложения. Всего существует 3 типа
Console - Консольное приложение. Можно запустить только из консоли (Terminal) ОС, запрещена работа с окнами
Window - Оконное приложение. Можно запускать только из графической оболочки (Descktop) ОС, запрещена работа с функциями консольного приложения
Deamon - Демон. Запуск возможен как из консоли (Terminal), так и графической оболочки (Desctop) ОС. Запрещена работа с функциями консольного и оконного приложения
Далее следует набор настроек программы. Настройка приложения идет с помощью специальных деректив, которые имеют следующий синтаксис
====================
1.| #code parameter
====================
Где:
# - обязательный символ, без которого деректива не будет восприниматься
code - имя директивы. Полный список директив смотрите ниже
parameter - список параметров для директивы (отделяются запятой)
Вот основной список директив
include - вставка заголовочного файла, находящегося по пути указанноу в параметрах.В этих файлах указывается список функций, упрощающих работу программиста со сложными функциями. Заголовочные файлы находятся в системной папке "headers" ОС. Пример: #include winapi.h
После того, как были указанны все нужные директивы пишется строка $APP, которая говорит о том, что объевлние настроек программы завершено. Далее следует непосредственный код программы.

! СИНТАКСИС gASM
Весь синтаксис состоит из меток и инструкций. Объевление меток происходит сл. образом
=====================
1.| LabelName:
=====================
Для того чтобы применить исструкцию требуется воспользоваться такой конструкцией
=====================
1.| code par1, par2, ...
=====================
Где:
code - имя инструкции (полный список смотрите ниже)
par1, par2, ... - список передаваемых параметров инструкции. Каждый параметр отделяется с помощью запятой

Для работы с адресами используется 2 символа # и $. Первый (#) - используется для поиска адреса по имени указанному после этого символа, второй - задает конкретный адресс ячейки. Для примера можно рассмотреть следующий листинг
=====================
1.| ...
2.| mov #myVar, $5
3.| ...
=====================
Здесь в переменную по адресу #myVar записывается значение из ячейки находящейся по адрессу 5.
У приложения есть регистры. Они сущуствуют для того, чтобы передавать параметры из-вне функций (подробности ниже). Всего на приложение выделяется 15 регистров. Доступ к ним обеспечивается с помощью имени rN, где N - это номер регистра, который должен находиться в диапозоне [0,14]
Так же gAsm поддерживает комментарии. Комментарий начинается с символа ; и идет на протяжении всей строчки. Например
=====================
1.| ...
2.| ;This is comment
3.| mov #r0, $1 ;This is comment too
4.| mov #r1, "my ;This is comment too string"
5.|
=====================
В четвертой строке мы видим, что ; находится внутри строки. Но в 1 регистр запишется лишь часть строки: my, т.к. остальная часть является комментарием

! ИНСТРУКЦИИ
Вот полный список инструкций
mov a1, a2 - записывает в ячейку по адресу a1, значение из ячейки a2 или же a2, если ячейка не существует. Так же можно записать адресс ячейки по имени, используя @varName. !!!Предупреждение: такая конструкция работает только в этой инструкции
db a1, a2, a3 - выделяет ячейку в памяти и назначеет ей имя a1, тип a2 {0 - integer; 1 - real; 2 - string} и записывает начальное значение a3 (именно значение, а не адресс ячейки)
uns a1 - очищает ячейку в памяти по адрессу a1
call - вызывает функцию по имени (список функций смотрите ниже)
jmp a1 - перемещение на метку или определенное кол-во шагов вперед\назад. Для того чтобы перейти на метку используется такая конструкция ^LabelName. Чтобы перейти на N шагов вперед используйте обычное число, на N шагов назад используйте отрицательное значение. !!!Предупреждение: в a1 пишется конкретное значение, а не адресс ячейки.
Пример:
=====================
1.| jmp ^Start ;переместиться на начало программы
2.| jmp 5 ;перейти на 5 шагов вперед
3.| jmp -3 ;перейти на 3 шага назад
=====================
cmp a1, a2 - сравнение 2 чисел из ячеек по адрессам a1 и a2. Сравнение происходит по методу вычитания из a1 a2. Если в результате получается 0, то пропускается ближняя инструкция jnz. В противном случаее пропускается инструкция jz. (Подробнее ниже)
jz a1 - аналог jmp, но срабатывает только в том случаее, когда cmp возвращает 0
jnz a1 - аналог jmp, но срабатывает только в том случае, когда cmp возвращает число отличное от 0
ret - возвращение к предыдущей точке скачка. Эта инструкция пригодится для создания собственный функций.
Пример:
=====================
1.| MyFunction:
2.| mov #r0, #r1 ;Здесь любые действия
3.| call debug
4.| ret ;возвращаемся к основной программе
5.| Start:
6.| mov #r1, "Hello"
7.| jmp ^MyFunction
=====================
hlt - корректное завершение программы
{В следующем списке инструкций результат записывается в ячейку по адрессу a1. Ячейки обязательно не должны иметь тип string}
sub a1, a2 - a1 - a2
add a1, a2 - a1 + a2
div a1, a2 - a1 / a2 !!!Предупреждение: ячейка по адрессу a1 должна иметь тип real
idiv a1, a2 - a1 div a2 !!!Предупреждение: ячейки по адрессу a1 и a2 должны иметь тип integer
mul a1, a2 - a1 * a2
dec a1 - a1 - 1 !!!Предупреждение: ячейка по адрессу a1 должна иметь тип integer
inc a1 - a1 + 1 !!!Предупреждение: ячейка по адрессу a1 должна иметь тип integer
and a1, a2 - a1 and a2 !!!Предупреждение: ячейки по адрессу a1 и a2 должны иметь тип integer
or a1, a2 - a1 or a2 !!!Предупреждение: ячейки по адрессу a1 и a2 должны иметь тип integer
shl a1, a2 - a1 shl a2 (Побитовое смещение влево) !!!Предупреждение: ячейки по адрессу a1 и a2 должны иметь тип integer
shr a1, a2 - a1 shr a2 (Побитовое смещение вправо) !!!Предупреждение: ячейки по адрессу a1 и a2 должны иметь тип integer
not a1 - not a1 !!!Предупреждение: ячейка по адрессу a1 должна иметь тип integer
neg a1 - смена знака значения ячейки по адрссу a1

! Функции
Функции вызываются с помощью инструкции call. Передача параметров происходит с помощью предварительного занесения значений в регистры. Имена функций не чувствительны к регистру
Список функций доступных только для консольных приложений:
write - вывод текста (r0) в консоль без перехода на новую строчку
writeln - вывод текста (r0) в консоль с переходом на новую строку
read - чтение строки (r1) из консоли с подсказкой (r0) без перехода на новую строчку
readln - чтение строки (r1) из консоли с подсказкой (r0) с переходом на новую строчку
clrscr - очистка экрана консоли
Список основных функций (доступны для любого типа приложения):
fileexists - существует ли файл по пути (r0). Возвращает (r1) 1 - существует; 0 - нет
getdirlist - возвращает (r1) список папок по пути (r0), разделенный символом |
getfilelist - аналогичен getdirlist, только список файлов
getdisklist - возвращает (r0) список дисков, разделенных символом |
sleep - подождать (r0) милисеккунд
strpos - возвращает (r2) позицию символа (r1) в строке (r0). Аналог Pos из MP
strcop - копирует все символы с r1 по r2 из строки r0 и записывает результат в r3. Аналог Copy из MP
strdel - аналогично strcop, только удаляет указанный промижуток из заданной строки
strcmp - сравнивает 2 строки r0 и r1, возвращает (r2) 1 - если равны и 0 - если разные
concat - склеивает 2 строки r0 и r1 и пишет в r2
cos - Принимает r0 в радианах и возвращает r1
sin - Принимает r0 в радианах и возвращает r1


Следующая версия:
В следующей версии будет пользовательский интерфейс.
Вот скриншот:



gainOS 0.3 [ Скачать ]

alexprey 05.07.2011 14:05

Ответ: gainOS
 
Вложений: 2
И так. Выкладываю новую версию
Огромная благодарность YellowAffterLife, а так же barsunduk
Что нового:
  • Добавлен API для работы с окнами в режиме WINDOW
  • Добавлен API для работы с AGL (работа с графикой)
  • Небольшие фиксы в GUI интерфейсе
  • Оптимизация gASM
  • Небольшие нововведения в синтаксисе gASM
Изменения в синтаксисе gASM:
  • Добавлены новые инструкции: gm, fm, jp, jnp, goto
  • Изменен принцип работы jmp, jnz, jz - теперь текущая позиция не сохраняется в стек положения, для этого служит инструкция goto
  • Более подробно по API и новым инструкциям читаем в мануале (gASMReadme.txt)
Как запускать приложения под GUI
  1. Открываем GUI (Из терминала: пишем gui start или же boot)
  2. Переключаемся на окно с полем ввода и кнопкой RUN
  3. Открываем полно экранный ввод (зажимаем курсор на поле ввода)
  4. Вводим полный путь приложения (например: /mmc/explorer.app)
Тестовые приложения для GUI
Explorer.app - простой ФМ с навигацией по папкам

MODE WINDOW
$APP
GetFirstWord:
; Get First word in string and remove
; #r2 - Result
; #r0 - String (var)
; #r1 - Separator
call strpos
mov #r1, 0
call strcop
mov #r4, #r3
inc #r2
call strdel
mov #r0, #r3
mov #r2, #r4
ret

RemoveLastWord:
;Remove last word in string
; #r0 - String (var)
; #r1 - Separator
db pos,0,0
db loc,2,""
db sep,2,""
mov #loc, #r0
mov #sep, #r1
call StrLen
mov #r2, #r1
dec #r2
mov #r1, 0
call StrCop
mov #r0, #r3
_while:
mov #r1, #sep
call StrPos
add #pos, #r2
cmp #r2, 0
inc #r2
mov #r1, 0
call StrDel
jp ^_while
mov #r0, #loc
mov #r1, 0
mov #r2, #pos
call StrCop
mov #r0, #r3
ust #loc
ust #sep
ust #pos
ret

BuildPathList:
; Build Path List and change label caption
; #r0 - path
; #pathlabel - label, where set current path
mov #r3, #r0
mov #r0, #pathlabel
mov #r1, "Text"
mov #r2, 11
call SetWindowData
mov #r0, #r3
db fList, 2, ""
call GetDirList
mov #r2, #r1
call GetFileList
mov #r0, #r2
call concat
mov #fList, #r2
while:
mov #r0, #fList
mov #r1, "|"
goto ^GetFirstWord
mov #fList, #r0
mov #r3, #r2
mov #r2, #list
mov #r0, "TListBox"
mov #r1, "AddItem"
call CallMethod
mov #r3, #r0
mov #r0, #fList
mov #r1, ""
call strcmp
cmp #r2, 0
jz ^while
ust #fList
ret

Start:
db mainwindow,0,0
db list,0,0
db path,2,""
db pathlabel,0,0
db btn,0,0
mov #path, "/"
;Create main form
mov #r0, "TForm"
mov #r1, "ExplrWindow"
mov #r2, 10
mov #r3, 20
mov #r4, 200
mov #r5, 200
mov #r6, 0
mov #r7, "caption=Explorer"
call CreateWindow
mov #mainwindow, #r8
;Create mini-help label
mov #r0, "TLabel"
mov #r1, "Label1"
mov #r2, 5
mov #r3, 15
mov #r6, #mainwindow
mov #r7, "caption=Current catalog:"
call CreateWindow
;Create btn for back directory
mov #r0, "TButton"
mov #r1, "BackDirBtn"
mov #r2, 8
mov #r3, 27
mov #r4, 30
mov #r5, 15
mov #r6, #mainwindow
mov #r7, "caption=Back&align=1&color=13164776"
call CreateWindow
mov #btn, #r8
;Create current catalog label
mov #r0, "TLabel"
mov #r1, "PathLabel"
mov #r2, 40
mov #r3, 30
mov #r6, #mainwindow
mov #r7, "caption=/"
call CreateWindow
mov #pathlabel,#r8
;Create List box
mov #r0, "TListBox"
mov #r1, "FileList"
mov #r2, 5
mov #r3, 45
mov #r4, 190
mov #r5, 145
mov #r6, #mainwindow
mov #r7, ""
call CreateWindow
mov #list, #r8
;Show form
mov #r0, #mainwindow
mov #r1, 1
call ShowWindow
mov #r0, "TListBox"
mov #r1, "Clear"
mov #r2, #list
call CallMethod
mov #r0, #path
goto ^BuildPathList
;Main procedure
MainProc:
call GetMessage
;if WM_CLICK
cmp #r0, 16
jnz ^EndClick
;IF Sender == BackBtn
cmp #r1, #btn
jnz ^btn_fail ;THEN
mov #r0, #path
mov #r1, "/"
goto ^RemoveLastWord
;IF #PATH == ""
mov #path, #r0
mov #r1, ""
call StrCmp
cmp #r2, 1 ; then #PATH = /
jz 1
mov #path, "/"
;ENDIF
mov #path, #r0
mov #r0, "TListBox"
mov #r1, "Clear"
mov #r2, #list
call CallMethod
mov #r0, #path
goto ^BuildPathList
jmp ^MainProc
;ENDIF
btn_fail:
;IF Sender == list
cmp #r1, #list
jnz ^EndClick
mov #r0, "TItem"
mov #r1, "GetText"
call CallMethod
mov #r0, #path
mov #r1, #r4
call concat
;IF NewPath.IsDirectory
mov #r0, #r2
call isDir
cmp #r1, 1
jnz ^EndClick
;THEN show NewPath
mov #path, #r2
mov #r0, "TListBox"
mov #r1, "Clear"
mov #r2, #list
call CallMethod
mov #r0, #path
goto ^BuildPathList
jmp ^MainProc
;ENDIF
EndClick:
;If WM_DESTROY
cmp #r0, 14 ;THEN hlt
jnz ^MainProc
hlt


aglGame.app - простенький пример с AGL. Гоняем прямоугольник по экрану. Управление:
1 - выход
2,4,6,8 - вверх \ влево \ вправо \ вниз

MODE WINDOW
$APP
;#r0 - код нажатой кнопки
func_Render:
;Чистим экран
mov #r0, #cl_black
call agl_SetColor
;Очищаем BackBuffer
call agl_ClearContext
;Рисуем пичальный кубик
;Записываем в структуру данных
mov #r0, #cl_red
call agl_SetColor
mov #r0, #objX
mov #r1, "|"
call concat
mov #r0, #r2
mov #r1, #objY
call concat
mov #r0, #r2
mov #r1, "|30|30"
call concat
mov #r3, #r2
mov #r0, "Rect"
mov #r1, "Draw"
call agl_Render2D
;Переносим BackBuffer на OutContext
call agl_Present
;Сканируем код
call ScanKeyPress
cmp #r0, 4 ;Смещение влево
jnz 2
sub #objX, 5
cmp #r0, 6 ;Смещение вправо
jnz 2
add #objX, 5
cmp #r0, 2 ;Смещение вверх
jnz 2
sub #objY, 5
cmp #r0, 8 ;Смещение вниз
jnz 2
add #objY, 5
ret

Start:
;Инициализация
db objX,0,0
db objY,0,0
mov #r5, 1
call agl_Init
;Создание стандартных цветов
mov #r0, 255
mov #r1, 0
mov #r2, 0
mov #r3, 0
db cl_black, 0, 0
call agl_GetColor
mov #cl_black, #r4
db cl_red, 0, 0
mov #r1, 255
call agl_GetColor
mov #cl_red, #r4
db cl_white, 0, 0
mov #r2, 255
mov #r3, 255
call agl_GetColor
mov #cl_white, #r4
LoopStart:
mov #r0, 10
call sleep
goto ^func_Render
cmp #r0, 1
jnz ^LoopStart
;Обязательно освобождаем устройство вывода
call agl_reset
hlt

JACUK 05.07.2011 21:03

Ответ: gainOS
 
А есть возможность сохранить скрипт и потом его выполнять? А также интер6сует наличия файловой системы(собственная или похожа на существующие?).

alexprey 05.07.2011 23:01

Ответ: gainOS
 
Программы запускаются из файла. А точнее ты их сам запускаешь из терминала, указывая имя файла. ФС есть. Смотри список функций терминала.

PacMan 05.07.2011 23:10

Ответ: gainOS
 
Чтобы создать свой файл выполняешь в нужной директории команду
Код:

edit myfile.app
потом пишешь свой код, сохраняешь и запускаешь
Код:

myfile

JACUK 06.07.2011 10:08

Ответ: gainOS
 
Было бы лутше-ввод команд в Canvas режиме! И если планируете создать граф. оболочку-, то можно замутить что то типа загрузчика:) Три пункта: ОС, Консоль, Выход.

alexprey 06.07.2011 10:17

Ответ: gainOS
 
Графическая оболочка уже начала разрабатываться. Ввод в режиме канвас удобно реализовать, если у тебя клавишный телефон. Но и с этим тоже могут быть проблемы. Например телефон с qwerty клавиатурой. Даже не представляю как там отлавливать нажатие каждой кнопки по отдельности. Для тач скринов придется писать виртуальную клавиатуру (в принципе её и так придется в скором времени писать для гуи).
Насчет твоего предложения про загрузчик не очень понял. Если запуск ГУИ через консоль, то так и есть
ПС. Если кто будет писать приложения на gASM прошу подать голос =) И желательно все тщательно протестировать, чтобы я это все поправил к сл версии

Igor 06.07.2011 10:58

Ответ: gainOS
 
А можно посмотреть исходники? Интересно, да и клавиатуру под сенсор потестирую.

alexprey 06.07.2011 11:27

Ответ: gainOS
 
Все исходники хранятся в строжайшем секрете под паролем. с 1024 битным шифрованием XD
А теперь представь что бы было, если MicroSoft раздавала свои исходники направо и налево?

impersonalis 06.07.2011 12:00

Ответ: gainOS
 
Цитата:

Сообщение от alexprey (Сообщение 194567)
А теперь представь что бы было, если MicroSoft раздавала свои исходники направо и налево?

их бы не воровали?

Igor 06.07.2011 12:07

Ответ: gainOS
 
Цитата:

А теперь представь что бы было, если MicroSoft раздавала свои исходники направо и налево?
linux раздают

PacMan 06.07.2011 13:29

Ответ: gainOS
 
Всему свое время...

_Nox_ 06.07.2011 14:32

Ответ: gainOS
 
WTF?!?!? It is kernel!!! lol xD
Представьте если бы Windows выдавала такие сообщения

PacMan 06.07.2011 14:56

Ответ: gainOS
 
хД Ну а зачем убивать ядро?)

JACUK 07.07.2011 01:25

Ответ: gainOS
 
Говоря о загрузчике, я имел ввиду меню где будут отдельно пункт запустить гуи и работать там, запустить чисто консоль или же просто выйти.
Ну откроют они исходники..и что? появлятся новые проэкты на этой основе-и он уже не будет таким уникальным!


Часовой пояс GMT +1, время: 02:26.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Перевод: zCarot