Тема: gainOS
Показать сообщение отдельно
Старый 05.07.2011, 18:05   #2
alexprey
ПроЭктировщик
 
Регистрация: 22.10.2010
Сообщений: 196
Написано 16 полезных сообщений
(для 30 пользователей)
Ответ: gainOS

И так. Выкладываю новую версию
Огромная благодарность 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
Вложения
Тип файла: rar gainOS.rar (185.2 Кб, 853 просмотров)
Тип файла: rar Programs.rar (1.8 Кб, 794 просмотров)
__________________
Для меня нет ничего не реального в кодинге, но мне лень
gainOS - прорыв в проектировании ОС на MIDlet Pascal

Последний раз редактировалось alexprey, 03.12.2011 в 19:41.
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо alexprey за это полезное сообщение:
Romanzes (09.07.2011), YellowAfterlife (07.07.2011)