На английском сайте также есть более новая версия 2.6 beta. А я использовал 2.51.
Пример программы "test.mod", которая выводит окно по центру экрана.
Исходный код:
Spoiler:
Code: Select all
<* OBJFMT='coff' *>
<* +M2EXTENSIONS *>
<* +M2ADDTYPES *>
<* +NOOPTIMIZE *>
<* -GENDEBUG *>
<* -GENHISTORY *>
<* +ONECODESEG *>
<* -USEDLL *>
<* -GENPTRINIT *>
<* -DEFLIBS *>
<* -IMPLIB *>
<* -GENDEBUG *>
<* +M2BASE16 *>
<* -IOVERFLOW *>
<* -COVERFLOW *>
<* -CHECKRANGE *>
<* +SPACE *>
<* -CHECKINDEX *>
<* -CHECKDIV *>
<* -CHECKDINDEX *>
<* -CHECKNIL *>
<* -CHECKPROC *>
MODULE test;
TYPE
SIZE = RECORD height, width : CARDINAL END;
VAR
Window_left, Window_top, Window_width, Window_height : LONGCARD;
Scr : SIZE;
CONST
(* Window Style Constants *)
WS_SKINNED_FIXED = 4000000H;
WS_SKINNED_SIZABLE = 3000000H;
WS_FIXED = 0000000H;
WS_SIZABLE = 2000000H;
WS_FILL_TRANSPARENT = 40000000H;
WS_FILL_GRADIENT = 80000000H;
WS_COORD_CLIENT = 20000000H;
WS_CAPTION = 10000000H;
(* Event Constants *)
REDRAW_EVENT = 1;
KEY_EVENT = 2;
BUTTON_EVENT = 3;
(* Color Constants *)
COLOR_BLUE = 000000FFH;
COLOR_RED = 00FF0000H;
COLOR_GREEN = 0000FF00H;
COLOR_WHITE = 00FFFFFFH;
COLOR_BLACK = 00000000H;
sz_hello = 'Hello, XDS!';
PROCEDURE ["StdCall"] main();FORWARD;
PROCEDURE ["StdCall"] REDRAW_START(); FORWARD;
PROCEDURE ["StdCall"] REDRAW_FINISH();FORWARD;
PROCEDURE ["StdCall"] DRAW_WINDOW(Window_left, Window_top, Window_width, Window_height : LONGCARD; Caption : ARRAY OF CHAR; BackColor, Style: LONGCARD); FORWARD;
PROCEDURE ["StdCall"] WAIT_EVENT():LONGCARD;FORWARD;
PROCEDURE ["StdCall"] GET_KEY_CODE():LONGCARD;FORWARD;
PROCEDURE ["StdCall"] GET_BUTTON_NUMBER():LONGCARD;FORWARD;
PROCEDURE ["StdCall"] PROGRAM_TERMINATE();FORWARD;
PROCEDURE ["StdCall"] GET_SCREEN_SIZE():SIZE;FORWARD;
PROCEDURE ["StdCall"] Event_Processor();FORWARD;
PROCEDURE ["StdCall"] On_Redraw(); FORWARD;
PROCEDURE ["StdCall"] On_KeyPress(); FORWARD;
PROCEDURE ["StdCall"] On_ButtonPress(); FORWARD;
PROCEDURE ["StdCall"] main();
BEGIN
Scr := GET_SCREEN_SIZE();
Window_width := Scr.width >> 2;
Window_height := Scr.height >> 2;
Window_left := (Scr.width - Window_width) >> 1;
Window_top := (Scr.height - Window_height) >> 1;
On_Redraw;
LOOP
Event_Processor
END;
END main;
PROCEDURE ["StdCall"] Event_Processor();
BEGIN
CASE WAIT_EVENT() OF
|REDRAW_EVENT : On_Redraw;
|KEY_EVENT : On_KeyPress;
|BUTTON_EVENT : On_ButtonPress;
END;
END Event_Processor;
PROCEDURE ["StdCall"] On_Redraw();
BEGIN
REDRAW_START;
DRAW_WINDOW(Window_left, Window_top, Window_width, Window_height, sz_hello, COLOR_WHITE, WS_SKINNED_FIXED + WS_COORD_CLIENT + WS_CAPTION);
REDRAW_FINISH;
END On_Redraw;
PROCEDURE ["StdCall"] On_KeyPress();
BEGIN
GET_KEY_CODE;
END On_KeyPress;
PROCEDURE ["StdCall"] On_ButtonPress();
BEGIN
CASE GET_BUTTON_NUMBER() OF
|1 : PROGRAM_TERMINATE;
END;
END On_ButtonPress;
PROCEDURE ["StdCall"] REDRAW_START();
BEGIN
ASM
mov eax, 12
mov ebx, 1
int 64
END;
END REDRAW_START;
PROCEDURE ["StdCall"] REDRAW_FINISH();
BEGIN
ASM
mov eax, 12
mov ebx, 2
int 64
END;
END REDRAW_FINISH;
PROCEDURE ["StdCall"] DRAW_WINDOW(Window_left, Window_top, Window_width, Window_height : LONGCARD; Caption : ARRAY OF CHAR; BackColor, Style: LONGCARD);
BEGIN
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, dword ptr [Caption]
int 64
END;
END DRAW_WINDOW;
PROCEDURE ["StdCall"] WAIT_EVENT():LONGCARD;
VAR RESULT : LONGCARD;
BEGIN
ASM
mov eax, 10
int 64
mov [RESULT], eax
END;
RETURN RESULT;
END WAIT_EVENT;
PROCEDURE ["StdCall"] GET_KEY_CODE():LONGCARD;
VAR RESULT : LONGCARD;
BEGIN
ASM
mov eax, 2
int 64
mov [RESULT], eax
END;
RETURN RESULT;
END GET_KEY_CODE;
PROCEDURE ["StdCall"] GET_BUTTON_NUMBER():LONGCARD;
VAR RESULT : LONGCARD;
BEGIN
ASM
mov eax, 17
int 64
shr eax, 8
mov [RESULT], eax
END;
RETURN RESULT;
END GET_BUTTON_NUMBER;
PROCEDURE ["StdCall"] PROGRAM_TERMINATE();
BEGIN
ASM
or eax, -1
int 64
END;
END PROGRAM_TERMINATE;
PROCEDURE ["StdCall"] GET_SCREEN_SIZE():SIZE;
VAR RESULT : SIZE;
BEGIN
ASM
mov eax, 61
mov ebx, 1
int 64
mov dword ptr [RESULT], eax
END;
RETURN RESULT;
END GET_SCREEN_SIZE;
BEGIN
main;
END test.
У меня так просто не получилось, пришлось использовать заглушки.I have made some very preliminary tests and it seems that XDS MODULA 2 can create directly native applications for KOLIBRI OS.
Исходный код для заглушек:
Spoiler:
Code: Select all
section .text
GLOBAL X2C_InitFPP
GLOBAL X2C_BEGIN
GLOBAL X2C_HALT
GLOBAL X2C_TRAP_F
GLOBAL X2C_TRAP_RANGE
GLOBAL X2C_TRAP_NIL
X2C_InitFPP:
X2C_BEGIN:
X2C_HALT:
X2C_TRAP_F:
X2C_TRAP_RANGE:
X2C_TRAP_NIL:
ret
Code: Select all
nasm -f coff "fake.asm" -o "fake.obj"
make.bat:
Code: Select all
Set Name=test
..\..\BIN\xc %name%.mod
ld -T"LScript.x" "%Name%.obj" "fake.obj" -o "%Name%.bin"
objcopy -O binary -j .text -j .data -j .bss "%Name%.bin" "%Name%.kex"
pause
И получается вот такое окошко: