Page 13 of 15

Re: C--

Posted: Thu Jan 07, 2016 7:08 pm
by Insolor
Что интересно, некоторые кадры гифки попадают на середину перерисовки кнопок.

Re: C--

Posted: Thu Jan 07, 2016 7:16 pm
by Pathoswithin
Это из-за того, что при использовании элемента окно становится неактивным, а потом полностью перерисовывается.

Re: C--

Posted: Mon Oct 31, 2016 12:28 am
by Leency
Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
Может кто может помочь? Может есть у кого-то идеи?

Re: C--

Posted: Mon Oct 31, 2016 1:16 am
by punk_joker
Leency wrote:Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
Может кто может помочь? Может есть у кого-то идеи?
Ты про editbox?

Re: C--

Posted: Mon Oct 31, 2016 1:31 am
by Pathoswithin
Например, в Eolite Ctrl+C / Ctrl+V не работает при именовании нового файла.

Re: C--

Posted: Mon Oct 31, 2016 1:50 am
by Leency
Да, про editbox.

Re: C--

Posted: Mon Oct 31, 2016 10:43 am
by Siemargl
Leency wrote:Не могу понять почему Ctrl+C / Ctrl+V не работают в С-- программах.
Может кто может помочь? Может есть у кого-то идеи?
editbox работает только в ASCII mode, соответственно ждет коды 46, 47

Re: C--

Posted: Mon Oct 31, 2016 10:45 am
by 0CodErr
Leency wrote: Ctrl+C / Ctrl+V
Ну ты хоть бы код привёл тогда.

Re: C--

Posted: Mon Oct 31, 2016 1:22 pm
by Leency
Я нашел проблему.

Re: C--

Posted: Mon Oct 31, 2016 1:47 pm
by punk_joker
Leency wrote:Я нашел проблему.
Ждемс описания :) Я вчера пытался разобраться с этим, но не преуспел пока.

Re: C--

Posted: Mon Oct 31, 2016 2:39 pm
by Leency
Суть
serwerge.png
serwerge.png (25.04 KiB)
Viewed 13088 times
В программах использовать или так:

Code: Select all

GetKeys();
edit_box_key stdcall(#edit1);	
или так

Code: Select all

GetKeys();
SomeCodeBlaBlaBla();
SomeCodeBlaBlaBla();
EAX = key_editbox;
edit_box_key stdcall(#edit1);	

Re: C--

Posted: Mon Oct 31, 2016 3:38 pm
by Leency
Исправлено для всех программ С--.

Re: C--

Posted: Wed Nov 02, 2016 6:51 pm
by Leency
Устав заново изобретать элемент список, сделал его паттерном SelectList.
cmm/lib/patterns/select_list.h

Теперь запилить любую программу со списком на С-- проще простого. :D

Re: C--

Posted: Sat Jul 15, 2017 11:54 pm
by 0CodErr
Решил попробовать использовать вместе с С-- KolibriOS.lib(её можно взять из темы "Delphi7 examples"), а заодно и статическую libc.

Оказалось, что С-- не делает COFF, хотя
вон там http://masm32.com/board/index.php?&topi ... 9#msg66479
товарищ Emil_halim пишет
So SphinxC-- ,HJWasm , fasm always compile to Coff object file
C-- делает OMF, действительно, это можно посмотроеть, например, с помощью TDUMP.
Но сконвертировть OMF->COFF это не проблема.

Есть вот эти ключи:

Code: Select all

/SOBJ       создать ведомый OBJ файл (slave)
/OBJ        создать основной модуль (master)
Но при использовании /OBJ при попытке сконвертровать ругается вот так:
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
Думаю, можно вынести константы и определения в отдельный файл.
Downloaded 357 times
Попробовал таким способом(LD+OBJCOPY) собрать Eolite:

Пришлось закомментировать

Code: Select all

//#startaddress 0
А то ругалось
this option only for COM output files.
Думаю, надо было ещё поправить размер памяти в линкер-скрипте (исправить на MEMSIZE)
наверное, из-за этого некоторые надписи и цвета были неправильные, но кое-что работало.
Spoiler:
eolite_16_07.PNG
eolite_16_07.PNG (42.92 KiB)
Viewed 10918 times
И ещё #param и #program_path, может ещё что-то.
Почему-то размер программы получился аж целых 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)}  
}

Re: C--

Posted: Sun Jul 16, 2017 10:04 am
by Pathoswithin
Нулевые данные в конце не вставляются в бинарник, но если расположить после них переменные со значениями, размер бинарника резко увеличится. Вопрос только в том, как на С-- контролировать расположение переменных.