FreeBasic
Posted: Mon Jan 28, 2013 3:34 am
Попробовал написать на FreeBasic приложение для KolibriOS.
Программа "Test_Window.bas" просто выводит окно по центру экрана.
Исходный код для FreeBasic:
Теперь делаем:
В папке с проектом появляются файлы "Test_Window.asm" и "Test_Window.o"
Для удобства создадим "make.bat":
Изначально objcopy в той папке нет, но я его туда закинул.
Так выглядит "LScript.x":
Теперь запускаем "make.bat". Создаются файлы "Test_Window.bin" и "Test_Window.kex".
Вот так выглядит окно полученной программы:
Программа "Test_Window.bas" просто выводит окно по центру экрана.
Исходный код для FreeBasic:
Spoiler:
Code: Select all
' Event Constants
Const REDRAW_EVENT = 1
Const KEY_EVENT = 2
Const BUTTON_EVENT = 3
' Window Style Constants
Const WS_SKINNED_FIXED = &H4000000
Const WS_SKINNED_SIZABLE = &H3000000
Const WS_FIXED = &H0000000
Const WS_SIZABLE = &H2000000
Const WS_FILL_TRANSPARENT = &B1000000000000000000000000000000
Const WS_FILL_GRADIENT = &B10000000000000000000000000000000
Const WS_COORD_CLIENT = &B100000000000000000000000000000
Const WS_CAPTION = &B10000000000000000000000000000
' Color Constants
Const COLOR_BLUE = &H000000FF
Const COLOR_RED = &H00FF0000
Const COLOR_GREEN = &H0000FF00
Const COLOR_WHITE = &H00FFFFFF
Const COLOR_BLACK = &H00000000
Dim Shared Window_width As Long = 200
Dim Shared Window_height As Long = 300
Dim Shared Window_left As Long
Dim Shared Window_top As Long
Type Size
height As UShort
width As UShort
End Type
Dim Shared Scr As Size
Dim Shared Caption As ZString Ptr = @"Hello, FreeBasic!"
Declare Sub On_Redraw()
Declare Sub Event_Processor()
Declare Sub On_KeyPress()
Declare Sub On_ButtonPress()
Declare Function WAIT_EVENT() As Long
Declare Function GET_KEY_CODE() As Long
Declare Function GET_BUTTON_NUMBER() As Long
Declare Function GET_SCREEN_SIZE() As size
Declare Sub DRAW_WINDOW(Window_left As Long, Window_top As Long, Window_width As Long, Window_height As Long, Caption As ZString, BackColor As Long, Style As Long)
#Macro PROGRAM_TERMINATE()
Asm
or eax, -1
int 64
End Asm
#EndMacro
#Macro REDRAW_START()
Asm
mov eax, 12
mov ebx, 1
int 64
End Asm
#EndMacro
#Macro REDRAW_FINISH()
Asm
mov eax, 12
mov ebx, 2
int 64
End Asm
#EndMacro
Sub Main()
Scr = GET_SCREEN_SIZE()
Window_width = Scr.width Shr 1
Window_height = Scr.height Shr 1
Window_left = (Scr.width - Window_width) Shr 1
Window_top = (Scr.height - Window_height) Shr 1
On_Redraw
Do
Event_Processor
Loop
End Sub
'========================================================='
' Обработка Событий
'========================================================='
Sub Event_Processor()
Select Case WAIT_EVENT()
Case REDRAW_EVENT
On_Redraw
Case KEY_EVENT
On_KeyPress
Case BUTTON_EVENT
On_ButtonPress
End Select
End Sub
'========================================================='
' Нажатие Клавиатуры
'========================================================='
Sub On_KeyPress()
GET_KEY_CODE
End Sub
'========================================================='
' Нажатие Кнопки
'========================================================='
Sub On_ButtonPress()
Select Case GET_BUTTON_NUMBER()
Case 1
PROGRAM_TERMINATE()
End Select
End Sub
'========================================================='
' Перерисовка
'========================================================='
Sub On_Redraw()
REDRAW_START()
DRAW_WINDOW Window_left, Window_top, Window_width, Window_height, *Caption, COLOR_WHITE, WS_SKINNED_SIZABLE + WS_COORD_CLIENT + WS_CAPTION
REDRAW_FINISH()
End Sub
Sub DRAW_WINDOW(Window_left As Long, Window_top As Long, Window_width As Long, Window_height As Long, Caption As ZString, BackColor As Long, Style As Long)
Asm
xor eax, eax
mov ebx, [Window_left]
shl ebx, 16
add ebx, [Window_width]
mov ecx, [Window_top]
shl ecx, 16
add ecx, [Window_height]
mov edx, [Style]
or edx, [BackColor]
mov edi, [Caption]
int 64
End Asm
End Sub
Function WAIT_EVENT() As Long
Asm
mov eax, 10
int 64
mov [Function], eax
End Asm
End Function
Function GET_KEY_CODE() As Long
Asm
mov eax, 2
int 64
mov [Function], eax
End Asm
End Function
Function GET_BUTTON_NUMBER() As Long
Asm
mov eax, 17
int 64
shr eax, 8
mov [Function], eax
End Asm
End Function
Function GET_SCREEN_SIZE() As size
Asm
mov eax, 61
mov ebx, 1
int 64
mov [Function], eax
End Asm
End Function
Code: Select all
fbc -R -c "Test_Window.bas"
В папке с проектом появляются файлы "Test_Window.asm" и "Test_Window.o"
Для удобства создадим "make.bat":
Code: Select all
Set Name=Test_Window
"..\..\FreeBASIC\bin\win32\ld" -T"LScript.x" "%Name%.o" -o "%Name%.bin"
"..\..\FreeBASIC\bin\win32\objcopy" -O binary -j .text -j .data -j .bss "%Name%.bin" "%Name%.kex"
pause
Так выглядит "LScript.x":
Spoiler:
Code: Select all
PATH_SIZE = 1024;
PARAMS_SIZE = 256;
STACK_SIZE = 256;
SECTIONS
{
.text : AT(0) {
code = .;
LONG(0x554e454D);
LONG(0x31305445);
LONG(1);
LONG(start);
LONG(end);
LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
LONG(end + PATH_SIZE);
LONG(end);
start = .;
*(.text)
}
.data : AT(data - code) {data = .; *(.data)}
.bss : AT(bss - code) {bss = .; *(.bss)}
end = .;
}
Вот так выглядит окно полученной программы: