diff --git a/programs/develop/fp/examples/_build.bat b/programs/develop/fp/examples/_build.bat new file mode 100644 index 0000000000..0fca292daf --- /dev/null +++ b/programs/develop/fp/examples/_build.bat @@ -0,0 +1,20 @@ +@echo off + +set NAME=%1 +set NAMEEXE=%NAME%.exe +set NAMEKOS=%NAME% + +set BUILD=-FUbuild +set UNTS=-Fu..\units + +fpc %NAME%.pp -n -Twin32 -Se5 -XXs -Sg -O3pPENTIUM3 -CfSSE -WB0 %BUILD% %UNTS% +if errorlevel 1 goto error + +..\exe2kos\exe2kos.exe %NAMEEXE% %NAMEKOS%.kex +del %NAMEEXE% +goto end + +:error +echo An error occured while building %NAME% + +:end diff --git a/programs/develop/fp/examples/example.bat b/programs/develop/fp/examples/example.bat new file mode 100644 index 0000000000..80564a1ffe --- /dev/null +++ b/programs/develop/fp/examples/example.bat @@ -0,0 +1 @@ +@_build example diff --git a/programs/develop/fp/examples/example.pp b/programs/develop/fp/examples/example.pp new file mode 100644 index 0000000000..f05c97a9b2 --- /dev/null +++ b/programs/develop/fp/examples/example.pp @@ -0,0 +1,99 @@ +{$codepage cp866} +{$mode objfpc} +{$smartlink on} +{$apptype console} + +{ На данный момент рассматривается выполнение прилодения только как консольное, + т.е. директива concole обязательна, поведение программы при отсутствии этой + директивы предопределить нельзя. Гарантированно нельзя использовать функции + Write, WriteLn, Read, ReadLn относительно стандартной консоли ввода/вывода. +} + +program Example; + +{ Все функции имеющие в своем имени префикс 'kos_' являются платформозависимыми + и реализованы только под KolibriOS. Их использование в любых программных + приложениях категорически не рекомендовано, выносите все методы, использующие + эти функции, в отдельные модули (и используйте необходимые абстракции). +} + +procedure DoPaint; +{ Вывод содержимого окна приложения } +begin + kos_begindraw(); + {определение параметров окна (0)} + kos_definewindow(200, 200, 200, 50, $23AABBCC); + {kos_definewindow не имеет параметра для вывода заголовка, + делаем это отдельной функцией} + {kos_setcaption, отображение заголовка окна (71.1)} + kos_setcaption('ПРИМЕР ПРОГРАММЫ'); + {вывод сообщения (4)} + kos_drawtext(3, 8, 'Нажмите любую клавишу...'); + kos_enddraw(); +end; + +procedure DoKey; +{ Обработка события нажатия клавиши } +var + Key: DWord; + Notes: array[0..3] of Byte; +begin + Key := kos_getkey(); + {настраиваем буфер для нот} + Notes[0] := $90; + Notes[1] := Key shr 8; + Notes[2] := $00; + {воспроизводим} + kos_speak(@Notes); +end; + + +function DoButton: Boolean; +{ Обработка события нажатия кнопки GUI } +var + Button: DWord; +begin + {получить код нажатой клиыиши} + Button := kos_getbutton(); + {если X, то завершение приложения} + Result := Button = 1; +end; + + +function ProcessMessage: Boolean; +{ @return: Возвращает False, если было событие к завершению приложения. + @rtype: True или False } +var + Event: DWord; +begin + Result := False; + {ожидаем события от системы} + Event := kos_getevent(); + case Event of + SE_PAINT : DoPaint; {перерисовка окна} + SE_KEYBOARD: DoKey; {событие от клавиатуры} + SE_BUTTON : Result := DoButton; {собыие от кнопки, может определить + завершение приложения, если вернет True} + end; +end; + + +procedure MainLoop; +{ Главный цикл приложения } +var + ThreadSlot: TThreadSlot; +begin + {сделать это окно активным} + ThreadSlot := kos_getthreadslot(ThreadID); + kos_setactivewindow(ThreadSlot); + {настраиваем события, которые мы готовы обрабатывать} + kos_maskevents(ME_PAINT or ME_KEYBOARD or ME_BUTTON); + {главный цикл} + while not ProcessMessage do; +end; + + +begin + WriteLn('Look for a new window, I''m just a konsole, hi mike ;-)'); + MainLoop; +end. diff --git a/programs/develop/fp/examples/readme-ru.txt b/programs/develop/fp/examples/readme-ru.txt new file mode 100644 index 0000000000..dedd288865 --- /dev/null +++ b/programs/develop/fp/examples/readme-ru.txt @@ -0,0 +1,3 @@ +Codepage: cp866 + +Для начала необхожимо собрать RTL и утилиту exe2kos. diff --git a/programs/develop/fp/readme-ru.txt b/programs/develop/fp/readme-ru.txt index c18f2c3bf6..6d5017c0db 100644 --- a/programs/develop/fp/readme-ru.txt +++ b/programs/develop/fp/readme-ru.txt @@ -1,18 +1,18 @@ -Codepage: koi8-r +Codepage: cp866 -Ї┼╦╒▌╔╩ ╦╧─ ┴─┴╨╘╔╥╧╫┴╬ ╔ ╨╥╧╫┼╥╤╠╙╤ ╘╧╠╪╦╧ ╬┴ FreePascal 2.3.1 (SVN 8373) ╨╥╔ -╦╧═╨╔╠╤├╔╔ ╔┌ Windows. +Текущий код адаптирован и проверялся только на FreePascal 2.3.1 (SVN 8373) при +компиляции из Windows. -ф╠╤ ╦╧═╨╔╠╔╥╧╫┴╬╔╤ ╫┼╥╙╔╔ RTL ─╠╤ KolibriOS ╫┴═ ╬┼╧┬╚╧─╔═╧ ╔═┼╘╪ ╒╙╘┴╬╧╫╠┼╬╬┘╩ -╒ ╙┼┬╤ FreePascal ╙ ╔╙╚╧─╬┘═╔ ╦╧─┴═╔ RTL ╒╦┴┌┴╬╬╧╩ ╫┘█┼ ╫┼╥╙╔╔. я╘╦╥╧╩╘┼ ╞┴╩╠ -rtl/build.bat ╔ ╒╦┴╓╔╘┼ ╫ ╨┼╥┼═┼╬╬╧╩ ╧╦╥╒╓┼╬╔╤ FPRTL ╘╧▐╬┘╩ ╨╒╘╪ ╦ ╔╙╚╧─╬╧═╒ -╦╧─╒ ╧╥╔╟╔╬┴╠╪╬╧╩ RTL. ю┴╨╥╔═┼╥, ┼╙╠╔ FreePascal ╒╙╘┴╬╧╫╠┼╬ ╫ c:\fp, ╘╧ -╫┼╥╧╤╘╬┼┼ ╫╙┼╟╧ ╔╙╚╧─╬┘╩ ╦╧─ ╬┴╚╧─╔╘╙╤ ╫ c:\fp\src\rtl. №╘╧╘ ╨╒╘╪ ╔ ╬╒╓╬╧ -╒╦┴┌┴╘╪. Ё╥┼─╨╧╠╧╟┴┼╘╙╤ ▐╘╧ ╔┼╥┴╥╚╔╤ ─╔╥┼╦╘╧╥╔╩ ╔╙╚╧─╬╔╦╧╫ FreePascal ╙╧╚╥┴╬┼╬┴ -╘╧▐╬╧ ╘┴╦╧╩ ╓┼ ╦┴╦ ╫ ╥┼╨╧┌╔╘┴╥╔╔ FreePascal'╤. +Для компилирования версии RTL для KolibriOS вам необходимо иметь установленный +у себя FreePascal с исходными кодами RTL указанной выше версии. Откройте файл +rtl/build.bat и укажите в переменной окружения FPRTL точный путь к исходному +коду оригинальной RTL. Например, если FreePascal установлен в c:\fp, то +вероятнее всего исходный код находится в c:\fp\src\rtl. Этот путь и нужно +указать. Предпологается что иерархия директорий исходников FreePascal сохранена +точно такой же как в репозитарии FreePascal'я. -Ё╧╙╠┼ ╔┌═┼╬┼╬╔╤ rtl/build.bat ┌┴╨╒╙╘╔╘┼ ▄╘╧╘ ╦╧═┴╬─╬┘╩ ╞┴╩╠ ╬┴ ╫┘╨╧╠╬┼╬╔┼. Ё╧╙╠┼ -┌┴╫┼╥█┼╬╔╤ ╥┴┬╧╘┘ ▄╘╧╟╧ ╞┴╩╠┴ ╫ ╨┴╨╦┼ ./units ─╧╠╓╬┘ ╨╧╤╫╔╘╪ ═╧─╒╠╔ ╔ ╧┬▀┼╦╘╬┘┼ -╞┴╩╠┘ RTL. +После изменения rtl/build.bat запустите этот командный файл на выполнение. После +завершения работы этого файла в папке ./units должны появить модули и объектные +файлы RTL. -ы┴╦ ╘┼╨┼╥╪ ╙╧┬╔╥┴╘╪ ╨╥╧╟╥┴══┘ ╤ ╧╨╔█╒ ╨╧┌╓┼. +Как теперь собирать программы я опишу позже. diff --git a/programs/develop/fp/rtl/kos.inc b/programs/develop/fp/rtl/kos.inc index e7e5a64580..cdddfd1b39 100644 --- a/programs/develop/fp/rtl/kos.inc +++ b/programs/develop/fp/rtl/kos.inc @@ -20,6 +20,7 @@ asm movl style, %edx decl %ebx {уменьшить ширину на 1} decl %ecx {уменьшить высоту на 1} + andl $0xEFFFFFFF, %edx int $0x40 popl %edi popl %esi @@ -591,6 +592,24 @@ asm end; +{ Sound } + +function kos_speak(notes: Pointer): Boolean; assembler; register; +asm + pushl %esi + pushl %ebx + movl $55, %esi + movl %esi, %ebx + xchgl %eax, %esi + int $0x40 + {eax = 55 - ошибка} + andl $1, %eax + popl %ebx + popl %esi + xorb $1, %al +end; + + { Work with hardware } function kos_readport(index: DWord): DWord; assembler; register; diff --git a/programs/develop/fp/rtl/kosh.inc b/programs/develop/fp/rtl/kosh.inc index 9c5b6b22e1..ed01831761 100644 --- a/programs/develop/fp/rtl/kosh.inc +++ b/programs/develop/fp/rtl/kosh.inc @@ -140,6 +140,10 @@ function kos_rewritefile(kosfile: PKosFile; var writed: Longint): DWord; function kos_writefile(kosfile: PKosFile; var writed: Longint): DWord; function kos_fileinfo(kosfile: PKosFile): DWord; +{ Sound } + +function kos_speak(notes: Pointer): Boolean; + { Work with hardware } function kos_readport(index: DWord): DWord; procedure kos_writeport(index, value: DWord);