Page 2 of 2

Posted: Thu May 25, 2006 3:18 pm
by O01eg
При чтении, он написан под MenuetOS и не понимает /HD#/#, только /RD/1
Вот example.c :

Code: Select all

#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

Posted: Thu May 25, 2006 4:04 pm
by andrew_programmer
Ладно что хотябы такой компилятор есть.
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 скомпилировать.А потом процесс пойдет по экспоненте.

Posted: Thu May 25, 2006 4:43 pm
by andrew_programmer
nn2,а тв где брал tccboot.h для компиляции ?
Он ведь configure не создается.

Posted: Fri May 26, 2006 6:38 am
by O01eg
2 andrew_programmer: Массивы щас посмотрю, похоже каждый файл исходника надо компилировать отдельно, а потом уже в ассемблерном коде делать include
Есть небольшой пример:

Code: Select all

#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: Select all

_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

Posted: Sat May 27, 2006 1:06 pm
by O01eg
Двухмерные массивы не созаются(ошибки), include тоже никак не работает. Похоже SmallC придётся дорабатывать, потому что если использовать структуры, то они понадобятся и в сисколах, и в программе.
Как делать возврат значения функцией?

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

Posted: Mon May 29, 2006 7:36 pm
by Kopa
Странно что обсуждение портрирования Си
компилятора попало в оффтопик.
В топике кодинга тоже были близкие темы?!

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

Posted: Tue May 30, 2006 6:21 am
by O01eg
2 andrew_programmer:open error SmallC пишет, потому что пути не разбирает, перенеси свой файл на /RD/1 и всё заработает.