/*Example C application for MenutOS, using the tiny 'MACC' C compiler and FASM assembler for DOS. MACC is based on ACC, developed by David Ashley, www.xdr.com/dash. This example developed by Barry Kauler, www.goosee.com/explorer/. macc1.c is complete, no extra files. To compile, type 'macc macc1' This will generate a '.a' asm file. To assemble type 'fasm macc1.a macc1' This will produce a binary file 'macc1' ready to run in Menuetos. Copy macc1 to the Menuetos floppy and reboot.*/ /* NOTE 1: The MeuetOS system calls are coded in asm. obviously they need to be extracted to a separate file for serious work. NOTE 2: This example needs MACC to compile correctly, not ACC. NOTE 3: David stopped maintaining his ACC compiler in 1997. Barry Kauler bkauler@goosee.com has made some bug fixes and mods to work with the FASM assembler and renamed to MACC.*/ typedef unsigned long U32; typedef long S32; typedef unsigned char U8; extern U32 sys_wait_event(void); extern void sys_window_redraw(U32); extern void sys_draw_window(U32,U32,U32,U32,U32,U32,U32); extern void sys_write_text(U32,U32,U32,char *,S32); extern void sys_draw_button(U32,U32,U32,U32,S32,U32); extern U32 sys_get_button_id(void); extern void sys_exit_process(void); #asm use32 ;required for FASM. offset equ ; / ;header section db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd _main ; start of code dd _theend ; size of image dd 0x100000 ; memory for app dd 0x7fff0 ; esp dd 0 ; I_Param dd 0 ; I_Icon _sys_wait_event: ;event sys_wait_event() mov eax,10 ;function 10. int 64 ret ;return eax=0 no event, =1 key, =2 button. _sys_window_redraw: ;sys_window_redraw(nstart) mov eax,12 ; function 12. mov ebx,[esp+4] ; 1=start of draw, 2=end of draw. int 64 ret _sys_draw_window: ;sys_draw_window(x1,y1,xsize,ysize,body_color,grab_color,frame_color) ;push ebp ;mov ebp,esp ;sub esp,# mov ecx,16 mov ebx,[esp+4] ;x1 ;(x start)*65536 + (x size) shl ebx,cl ; / or ebx,[esp+12] ;xsize / mov eax,[esp+8] ;y1 ;y start and size. shl eax,cl ; / or eax,[esp+16] ;ysize / mov ecx,eax ;/ mov edx,[esp+20] ;body_color mov esi,[esp+24] ;grab_color mov edi,[esp+28] ;frame_color xor eax,eax ;function 0. int 64 ;0x40 ;mov esp,ebp ;pop ebp ret _sys_write_text: ;sys_write_text(x,y,color,ptext,len) mov ecx,16 mov ebx,[esp+4] ;x shl ebx,cl or ebx,[esp+8] ;(x start)*65536 + (y start) mov ecx,[esp+12] ;text color 0x00RRGGBB mov edx,[esp+16] ;pointer to text beginning mov esi,[esp+20] ;text length mov eax,4 ;function 0. int 64 ret _sys_draw_button: ;sys_draw_button(x1,y1,xsize,ysize,id,color) mov ecx,16 mov ebx,[esp+4] ;x1 shl ebx,cl or ebx,[esp+12] ;(x start)*65536 + (x size) mov eax,[esp+8] ;y1 shl eax,cl mov ecx,eax or ecx,[esp+16] ;(y start)*65536 + (y size) mov edx,[esp+20] ;button id number mov esi,[esp+24] ;button color 0x 00 RR GG BB mov eax,8 ;function 8. int 64 ret ;nothing changed _sys_get_button_id: ;id sys_get_button_id() mov eax,17 int 64 ;al=0 successful, ah=id number, al=1 no id. mov ecx,8 shr eax,cl ret ;eax=id, eax=0 no id. _sys_exit_process: ;sys_exit() mov eax,-1 int 64 ret #endasm void draw_window(void) { sys_window_redraw(1); sys_draw_window(100,100,300,120,0x001111CC,0x8099BBFF,0x00FFFFFF); sys_write_text(8,8,0xFFFFFF,"MACC C example for Menuetos",27); sys_draw_button(300-19,5,12,12,1,0x5599CC); sys_window_redraw(2); } void main(void) { static U8 i=0; draw_window(); while(1) { i=(U8)sys_wait_event(); switch(i) { case 1: draw_window(); continue; case 2: /*sys_get_key();*/ continue; case 3: if(sys_get_button_id()==1) sys_exit_process(); continue; } } } char theend;