Board.KolibriOS.org

Official KolibriOS board
It is currently Sat Feb 22, 2020 8:20 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 23 posts ]  Go to page Previous 1 2
Author Message
 Post subject:
PostPosted: Thu May 25, 2006 3:18 pm 
Offline

Joined: Mon Apr 10, 2006 7:22 am
Posts: 76
При чтении, он написан под MenuetOS и не понимает /HD#/#, только /RD/1
Вот example.c :
Code:
#asm
use32
org 0x0
   
 db 'MENUET01'
 dd 0x01
 dd _main
 dd I_END
 dd 0x100000
 dd 0x7fff0
 dd 0x0,0x0
   
include 'INTRINS.ASM'
#endasm
   
/********* C library *********/
   
s_get_event()
{
#asm
  mov  eax,10
  int  0x40
#endasm
}
   
s_get_key()
{
#asm
  mov  eax,2
  int  0x40
  and  eax,0x0000ff00
  shr  eax,8
#endasm
}
   
s_get_button()
{
#asm
  mov  eax,17
  int  0x40
  shr  eax,8
#endasm
}
   
s_begin_draw()
{
#asm
  mov  ebx,1
  mov  eax,12
  int  0x40
#endasm
}
   
s_end_draw()
{
#asm
  mov  ebx,2
  mov  eax,12
  int  0x40
#endasm
}
   
s_draw_window(x1,y1,w,h,c_area,c_grab,c_fram)
int x1,y1,w,h;            /* esp +32 +28 +24 +20 */
int c_area,c_grab,c_fram; /* esp +16 +12 +8 */
{
#asm
  ; color of frames
  mov  edi,[esp+8]
   
  ; color of grab bar bit 8->color gl
  mov  esi,[esp+12]
   
  ; color of work area bit 8-> color gl
  mov  edx,[esp+16]
   
  ;left / width
  mov  ebx,[esp+32]
  shl  ebx,16
  mov  bx,[esp+24]
  ;top / height
  mov  ecx,[esp+28]
  shl  ecx,16
  mov  cx,[esp+20]
   
  ;execute
  mov  eax,0
  int  0x40
#endasm
}
   
s_print_text(x,y,color,p_string)
int x,y,color;  /* esp +20 +16 +12 */
char *p_string; /* esp +8 */
{
#asm
  mov  ebx,[esp+20]
  shl  ebx,16
  mov  bx,[esp+16]
  mov  ecx,[esp+12]
  mov  edx,[esp+8]
   
  ;find text lenght
  xor  esi,esi
.next:
  cmp  byte [edx+esi],0
  jz   .good
  inc  esi
  jmp  .next
.good:
   
  mov  eax,4
  int  0x40
#endasm
}
   
s_draw_button(x1,y1,w,h,color,id)
int x1,y1,w,h;  /* esp +28 +24 +20 +16 */
int color,id;   /* esp +12 +8 */
{
#asm
  ;left / width
  mov  ebx,[esp+28]
  shl  ebx,16
  mov  bx,[esp+20]
  ;top / height
  mov  ecx,[esp+24]
  shl  ecx,16
  mov  cx,[esp+16]
   
  mov  edx,[esp+8]
  mov  esi,[esp+12]
   
  mov  eax,8
  int  0x40
#endasm
}
   
s_quit()
{
#asm
  mov  eax,-1
  int  0x40
#endasm
}
   
/*
   
 s_get_event()
 s_get_key()
 s_get_button()
 s_begin_draw()
 s_end_draw()
 s_draw_window(x1,y1,w,h,c_area,c_grab,c_fram)
 s_print_text(x,y,color,p_string)
 s_draw_button(x1,y1,w,h,color,id)
 s_quit()
   
*/
   
/*****************************/
   
void main()
{int  event;
 int  button_id;
   
 draw_window();
 while(1)
 {event=s_get_event();
  switch(event)
  {case 1: draw_window(); break;
   case 2: s_get_button(); break;
   case 3: button_id=s_get_button();
     if(button_id==1) s_quit();
   break;
  }
 }
}
   
char text1[50]="THIS IS AN EXAMPLE PROGRAM YOU COULD";
char text2[50]="SYSTEM FUNCTIONS ARE IN FILE SYSFUNCS.TXT";
char text3[50]="";
char text4[50]="SUCCESS";
int  p_text[4];
   
draw_window()
{int i; /* for index */
 int y;y=25;
   
 p_text[0]=&text1[0];
 p_text[1]=&text2[0];
 p_text[2]=&text3[0];
 p_text[3]=&text4[0];
   
 s_begin_draw();
   
 s_draw_window(100,100,300,120,0x02ffffff,0x805080d0,0x005080d0);
 s_print_text(8,8,0x10ddeeff,"Example application");
 s_draw_button(300-19,5,12,12,0x6688dd,1);
   
 for(i=0;i<4;i++)
     s_print_text(20,y+=10,0x000000,p_text[i]);
   
 s_end_draw();
}
   
#asm
I_END:
#endasm

в результате получается файл.asm
к нему нужен INTRINS.ASM и всё нормально компилимруется.
Я собрался переписать все сисколы Kolibri (благо доки есть) в kolibri.h, но Ccomp не работает с #include пишет open error


Top
   
 Post subject:
PostPosted: Thu May 25, 2006 4:04 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Ладно что хотябы такой компилятор есть.
O01eg,проверь возможность создания больших массивов типа flot array[200][200] (можно больщего размера).А то кто занает - может там тот же сюрпириз,что и в XScompiler.То,что под этот компилятор нет библиотеки stdlib.h - это не страшно.Можно взять реализацию malloc от Халявина Андрея(halyvin)(при помощи 64 функции).
А менять путь /rd/1/ на /hd/1/ можно.Для этого нужно в CCOMP.ASM сделать так:
inp_path: times 100 db '/hd/1/',0

Компилятор читает файлы через 58-ю функцию,а она не привязана к конкретному типу диска.
O01eg,попробуй вместо #include "file.h" писать include "file.h" иразмещать file.h в той же папке,где и запущенный SmallC
Даже если не сработает,то можно покопаться в исходниках и изменить тот участок кода,который ответственнен за include(автор всёравно не узнает да и не до этого ему наверно).Ради дела можно пойти на маленькие эксперименты.
Если заставить работать include и написать стандартные библиотеки: stdio.h,stdlib.h.string.h и т.д.,то можно им попробовать tcc скомпилировать.А потом процесс пойдет по экспоненте.


Top
   
 Post subject:
PostPosted: Thu May 25, 2006 4:43 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
nn2,а тв где брал tccboot.h для компиляции ?
Он ведь configure не создается.


Top
   
 Post subject:
PostPosted: Fri May 26, 2006 6:38 am 
Offline

Joined: Mon Apr 10, 2006 7:22 am
Posts: 76
2 andrew_programmer: Массивы щас посмотрю, похоже каждый файл исходника надо компилировать отдельно, а потом уже в ассемблерном коде делать include
Есть небольшой пример:
Code:
#asm
use32
org 0x0

 db 'MENUET01'
 dd 0x01
 dd _main
 dd I_END
 dd 0x100000
 dd 0x7fff0
 dd 0x0,0x0

include 'KOLIBRI.INC'

#endasm

void main()
{
  k_delay(100);
  k_quit();
}

#asm
I_END:
#endasm

и к нему KOLIBRI.INC, там все вызовы системных функций, я пока написал до пятой:
Code:
_k_quit: ;-1 k_quit()
  mov eax,-1
  int 0x40

  ;0-4 skipped

_k_delay: ;5 k_delay(time)
  mov ebx,[esp+8]
  mov eax,5
  int 0x40


Top
   
 Post subject:
PostPosted: Sat May 27, 2006 1:06 pm 
Offline

Joined: Mon Apr 10, 2006 7:22 am
Posts: 76
Двухмерные массивы не созаются(ошибки), include тоже никак не работает. Похоже SmallC придётся дорабатывать, потому что если использовать структуры, то они понадобятся и в сисколах, и в программе.
Как делать возврат значения функцией?


Top
   
 Post subject:
PostPosted: Mon May 29, 2006 7:56 am 
O01eg
В си обычно это делается с помощью return. В ассемблере командой mov eax,<результат> в случае int'a.


Top
   
 Post subject:
PostPosted: Mon May 29, 2006 7:36 pm 
Offline

Joined: Mon Mar 27, 2006 6:33 am
Posts: 675
Странно что обсуждение портрирования Си
компилятора попало в оффтопик.
В топике кодинга тоже были близкие темы?!

Ассемблер хороший язык, если его приблизить
по возможностям к высокоуровневым языкам!!!


Top
   
 Post subject:
PostPosted: Tue May 30, 2006 6:21 am 
Offline

Joined: Mon Apr 10, 2006 7:22 am
Posts: 76
2 andrew_programmer:open error SmallC пишет, потому что пути не разбирает, перенеси свой файл на /RD/1 и всё заработает.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 23 posts ]  Go to page Previous 1 2

All times are UTC+03:00


Who is online

Users browsing this forum: Google [Bot] and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited