C--
-
Что интересно, некоторые кадры гифки попадают на середину перерисовки кнопок.
Это из-за того, что при использовании элемента окно становится неактивным, а потом полностью перерисовывается.
Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
Может кто может помочь? Может есть у кого-то идеи?
Может кто может помочь? Может есть у кого-то идеи?
Из хаоса в космос
Ты про editbox?Leency wrote:Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
Может кто может помочь? Может есть у кого-то идеи?
to infinity and beyond
Например, в Eolite Ctrl+C / Ctrl+V не работает при именовании нового файла.
Да, про editbox.
Из хаоса в космос
editbox работает только в ASCII mode, соответственно ждет коды 46, 47Leency wrote:Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
Может кто может помочь? Может есть у кого-то идеи?
Last edited by Siemargl on Mon Oct 31, 2016 10:46 am, edited 1 time in total.
Ну ты хоть бы код привёл тогда.Leency wrote: Ctrl+C / Ctrl+V
Я нашел проблему.
Из хаоса в космос
Ждемс описания Я вчера пытался разобраться с этим, но не преуспел пока.Leency wrote:Я нашел проблему.
to infinity and beyond
Сутьили так
В программах использовать или так:
Code: Select all
GetKeys();
edit_box_key stdcall(#edit1);
Code: Select all
GetKeys();
SomeCodeBlaBlaBla();
SomeCodeBlaBlaBla();
EAX = key_editbox;
edit_box_key stdcall(#edit1);
Из хаоса в космос
Исправлено для всех программ С--.
Из хаоса в космос
Устав заново изобретать элемент список, сделал его паттерном SelectList.
cmm/lib/patterns/select_list.h
Теперь запилить любую программу со списком на С-- проще простого.
cmm/lib/patterns/select_list.h
Теперь запилить любую программу со списком на С-- проще простого.
- Attachments
-
-
Screenshot_1.png (62.79 KiB)Viewed 13005 times
-
Из хаоса в космос
Решил попробовать использовать вместе с С-- KolibriOS.lib(её можно взять из темы "Delphi7 examples"), а заодно и статическую libc.
Оказалось, что С-- не делает COFF, хотя
вон там http://masm32.com/board/index.php?&topi ... 9#msg66479
товарищ Emil_halim пишет
Но сконвертировть OMF->COFF это не проблема.
Есть вот эти ключи:
Но при использовании /OBJ при попытке сконвертровать ругается вот так:
Однако, другой ключ /SOBJ вполне работает.
То есть, получается, что вместе с С-- можно использовать и KolibriOS.lib, и libc, ну и что-нибудь другое тоже.
Вот некоторые примеры:Собирается это вот так:
Думаю, можно вынести константы и определения в отдельный файл.
Попробовал таким способом(LD+OBJCOPY) собрать Eolite:
Пришлось закомментировать
А то ругалось
наверное, из-за этого некоторые надписи и цвета были неправильные, но кое-что работало.
И ещё #param и #program_path, может ещё что-то.
Почему-то размер программы получился аж целых 564 КБ, зато сжатый KPACK-ом 28 КБ.
Вот так собирал:
Линкер-скрипт:
Оказалось, что С-- не делает COFF, хотя
вон там http://masm32.com/board/index.php?&topi ... 9#msg66479
товарищ Emil_halim пишет
C-- делает OMF, действительно, это можно посмотроеть, например, с помощью TDUMP.So SphinxC-- ,HJWasm , fasm always compile to Coff object file
Но сконвертировть OMF->COFF это не проблема.
Есть вот эти ключи:
Code: Select all
/SOBJ создать ведомый OBJ файл (slave)
/OBJ создать основной модуль (master)
Наверное, С-- сделал кривой объектник.fatal error LNK1178: missing MODEND record; file is invalid or corrupt
Однако, другой ключ /SOBJ вполне работает.
То есть, получается, что вместе с С-- можно использовать и KolibriOS.lib, и libc, ну и что-нибудь другое тоже.
Вот некоторые примеры:
Spoiler:
Code: Select all
/* Event Constants */
#define REDRAW_EVENT 1
#define KEY_EVENT 2
#define BUTTON_EVENT 3
/* Window Style Constants */
#define WS_SKINNED_FIXED 0x4000000
#define WS_COORD_CLIENT 0x20000000
#define WS_CAPTION 0x10000000
/* Caption Style Constants */
#define CS_MOVABLE 0
struct TButtonInput{
byte MouseButton;
word ID;
byte HiID;
};
// Import from KolibriOS.lib:
extern dword stdcall GetButton();
extern dword stdcall GetKey();
extern dword stdcall WaitEvent();
extern void stdcall BeginDraw();
extern void stdcall EndDraw();
extern void stdcall DrawWindow(int Left, Top, Right, Bottom; char* Caption; dword BackColor, Style, CapStyle);
extern void stdcall ThreadTerminate();
void Main(){
TButtonInput Button;
while(){
switch (WaitEvent()){
case BUTTON_EVENT:
Button = GetButton();
if (Button.ID == 1) ThreadTerminate();
break;
case KEY_EVENT:
GetKey();
break;
case REDRAW_EVENT:
BeginDraw();
DrawWindow(300, 200, 400, 250, "C-- with KolibriOS.lib", 0x00C0DDEE, WS_SKINNED_FIXED | WS_COORD_CLIENT | WS_CAPTION, CS_MOVABLE);
EndDraw();
break;
}
}
}
Spoiler:
Code: Select all
// Import from libc:
extern char* cdecl _strcpy(char* dst, char* src);
extern char* cdecl _strupr(char* str);
extern char* cdecl _strlwr(char* str);
// Import from KolibriOS.lib:
extern void stdcall ThreadTerminate();
extern int stdcall RunFile(char* Path, CmdLine);
#define NOTIFY_APP "/sys/@notify"
void Main(){
char* Str0 = "The String For a Testing!";
char Str1[30];
char Str2[30];
_strcpy(#Str1, Str0);
_strcpy(#Str2, Str0);
_strlwr(#Str1);
_strupr(#Str2);
RunFile(NOTIFY_APP, Str0);
RunFile(NOTIFY_APP, #Str1);
RunFile(NOTIFY_APP, #Str2);
ThreadTerminate();
}
Spoiler:
Code: Select all
// Import from libc:
extern int cdecl _atoi(char* str);
// Import from KolibriOS.lib:
extern void stdcall ThreadTerminate();
extern int stdcall CreateFile(char* Path);
extern int stdcall WriteFile(char* Path, Buffer; dword Count, LoPos, HiPos; dword* BytesWritten);
extern int stdcall RunFile(char* Path, CmdLine);
#define STR_EQUAL "Equal"
#define STR_NOT_EQUAL "Not equal"
#define FILE_PATH "/sys/!test.txt"
void Main(){
dword BytesWritten;
char* StrResult;
dword SizeOfStrResult;
CreateFile(FILE_PATH);
if (_atoi(" -100500 ") == -100500)
{
StrResult = STR_EQUAL;
SizeOfStrResult = sizeof(STR_EQUAL);
}
else
{
StrResult = STR_NOT_EQUAL;
SizeOfStrResult = sizeof(STR_NOT_EQUAL);
}
WriteFile(FILE_PATH, StrResult, SizeOfStrResult - 1, 0, 0, #BytesWritten);
RunFile("/sys/txtread", FILE_PATH);
ThreadTerminate();
}
Spoiler:
Code: Select all
// Import from libc:
extern int cdecl _snprintf(char* s; dword n; char* format, ... );
// Import from KolibriOS.lib:
extern void stdcall ThreadTerminate();
extern dword stdcall LoadLibrary(char* Path);
extern dword stdcall GetProcAddress(dword hLib; char* ProcName);
dword hConsole;
void stdcall (*ConsoleInit)(dword WndWidth, WndHeight, ScrWidth, ScrHeight; char* Caption);
void stdcall (*ConsoleExit)(dword bCloseWindow);
void stdcall (*WriteN)(char* string, dword length);
void Main(){
char buffer[60];
hConsole = LoadLibrary("/sys/lib/console.obj");
ConsoleInit = GetProcAddress(hConsole, "con_init");
ConsoleExit = GetProcAddress(hConsole, "con_exit");
WriteN = GetProcAddress(hConsole, "con_write_string");
ConsoleInit(0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, "Test");
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "test\n")); // no specifier
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "d = %d\n", 100500)); // decimal signed
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "u = %u\n", -1)); // desimal unsigned
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "s = %s\n", "string")); // character string
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "c = %c\n", 'h')); // single character
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "x = %x\n", 0x1a3b5c7d)); // hexadecimal lower case
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "X = %X\n", 0x1A3B5C7D)); // hexadecimal upper case
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "o = %o\n", 0o1234567)); // octal number
WriteN(#buffer, _snprintf(#buffer, sizeof(buffer), "f = %f\n", (double)1234.56789)); // floating-point number
ConsoleExit(0);
ThreadTerminate();
}
Spoiler:
Code: Select all
Set NAME=test
C-- %NAME%.c-- /w32 /sobj
LINK -edit %NAME%.obj
LD -T LScript.x %NAME%.obj -o %NAME%.kex -L %LIBC% -l libc -L %KolibriOS% -l KolibriOS
OBJCOPY -O binary -j .all %NAME%.kex
Del %NAME%.obj
Pause
%LIBC% директория, в которой находится libc
%KolibriOS% директория, в которой находится KolibriOS.lib
LScript линкер-скрипт для GNU-линкера LD
Пришлось закомментировать
Code: Select all
//#startaddress 0
Думаю, надо было ещё поправить размер памяти в линкер-скрипте (исправить на MEMSIZE)this option only for COM output files.
наверное, из-за этого некоторые надписи и цвета были неправильные, но кое-что работало.
Spoiler:
Почему-то размер программы получился аж целых 564 КБ, зато сжатый KPACK-ом 28 КБ.
Вот так собирал:
Spoiler:
Code: Select all
Set NAME=eolite
@echo #define LANG_ENG 1 >lang.h--
C-- %NAME%.c /w32 /sobj
LINK -edit %NAME%.obj
LD -T LScript.x %NAME%.obj -o %NAME%.kex
OBJCOPY -O binary -j .all %NAME%.kex
Del %NAME%.obj
Pause
Spoiler:
Code: Select all
PATH_SIZE = 1024;
PARAMS_SIZE = 256;
STACK_SIZE = 1024;
SECTIONS{
.all : AT(0){
LONG(0x554e454D);
LONG(0x31305445);
LONG(1);
LONG("main");
LONG(end);
LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
LONG(end + PATH_SIZE + PARAMS_SIZE + STACK_SIZE);
LONG(end + PATH_SIZE);
LONG(end);
*(.text) *(.text$*)
*(.rdata) *(.rdata$*)
*(.data) *(.data$*)
*(.bss)
end = .;
}
/DISCARD/ : {*(.eh_frame)}
}
Нулевые данные в конце не вставляются в бинарник, но если расположить после них переменные со значениями, размер бинарника резко увеличится. Вопрос только в том, как на С-- контролировать расположение переменных.
Who is online
Users browsing this forum: No registered users and 5 guests