/* Sphinx C-- header file for KolibriOS applications. Based on msys.h-- written by Alexey Sugonyaev and modified by Barry Kauler. This file is rewritten by Ivan Poddubny. e-mail: ivan-yar@bk.ru */ // KeyCode constant #define UP_KEY 130+48 #define DOWN_KEY 129+48 #define LEFT_KEY 128+48 #define RIGHT_KEY 131+48 #define RETURN_KEY 13 #define BACKSPACE_KEY 8 //Button options #define BT_DEL 0x80000000 #define BT_HIDE 0x40000000 #define BT_NOFRAME 0x20000000 // Color constant #define clWhite 0x00ffffff #define clGray 0x00808080 #define clLightGray 0x00c0c0c0 #define clWhiteGray 0x00E2E2E2 #define clDarkGray 0x00707070 #define clBlack 0x00000000 #define clRed 0x00ff0000 #define clGreen 0x0000ff00 #define clBlue 0x000000ff // Events #define evReDraw 1 #define evKey 2 #define evButton 3 #define evMouse 6 #define evIPC 7 #define evStack 8 #define OLD -1 struct FileInfo { dword read, firstBlock, qnBlockRead, retPtr, Work; byte filedir; }; struct ProcessInfo { dword cpu_usage; word winstackpos; word winstackval; word not_used1; byte name[12]; dword memstart, memory_used, PID, xstart, ystart, xsize, ysize; byte not_used2[974]; }; #define SystemColors SystemColours // usa/british struct SystemColours { dword nonset1, nonset2, work_3d_dark, work_3d_light, w_title, w_work, w_work_button, w_work_button_text, w_work_text, w_work_graph; }; /********************************************************* 0 = DEFINE WINDOW {x_start|y_start}, {x_size|y_size}, color_back, color_title, color_frames EBX = [x_start][x_size] ECX = [y_start][y_size] EDX, ESI, EDI = [00RRGGBB] *********************************************************/ inline fastcall void sys_draw_window(dword EBX, ECX, EDX, ESI, EDI) { EAX = 0; // function 0 : define and draw window $int 0x40 } /********************************************************* 01 = PUTPIXEL ebx [x] ecx [y] edx pixel color 0x0XRRGGBB ^ 0 normal put, 1 negative ret: nothing changed *********************************************************/ inline fastcall void sys_put_pixel(dword EBX,ECX,EDX) { EAX=1; $int 0x40 } /********************************************************* 02 = GET KEY ret: al 0 successful -> ah = key al 1 no key in buffer MODIFIED, see below... *********************************************************/ inline fastcall dword sys_get_key() { EAX = 2; // just read it key from buffer $int 0x40 $shr eax,8 } //return eax=key code. /********************************************************* 03 = GET SYSTEM CLOCK ret: eax 0x00SSMMHH sec,min,hour *********************************************************/ #define sys_get_time sys_get_clock inline fastcall dword sys_get_clock() { EAX=3; $int 0x40 } /********************************************************* 04 = WRITE TEXT TO WINDOW ebx [x start]*65536 + [y start] ecx text color 0x00RRGGBB edx pointer to text beginning esi text length return: nothing changed *********************************************************/ #define sys_print_text sys_write_text inline fastcall void sys_write_text(dword EBX, ECX, EDX, ESI) { EAX = 4; $int 0x40; } inline fastcall void sys_write_char(dword EBX, ECX, EDX) { EAX = 4; ESI = 1; $int 0x40 } /********************************************************* 05 = DELAY X/100 SECS ebx delay in 1/100 secs ret: nothing changed *********************************************************/ #define sys_wait sys_delay inline fastcall void sys_delay(dword EBX) { EAX = 5; $int 0x40 } /********************************************************* 06 = OPEN FILE FROM FLOPPY ebx pointer to filename -> 11 capital letters ecx set 0x00000000 - reserved edx set 0xffffffff - reserved esi read to mem position ret: ebx = file size *********************************************************/ inline fastcall dword sys_open_file_floppy(dword EBX, ESI) { ECX = 0; EDX = -1; EAX = 6; $int 0x40 } /********************************************************* 07 = PUTIMAGE ebx pointer to image in memory - RRGGBBRRGGBB.. ecx image size [x]*65536+[y] edx image position in window [x]*65536+[y] ret: eax 0 succesful, 1 overlapped *********************************************************/ inline fastcall dword sys_put_image(dword EBX, ECX, EDX) { EAX = 7; $int 0x40 } /********************************************************* 08 = DEFINE BUTTON ebx [x start]*65536 + [x size] ecx [y start]*65536 + [y size] edx button id number esi button color 0x 00 RR GG BB ret: nothing changed *********************************************************/ inline fastcall void sys_draw_button(dword EBX, ECX, EDX, ESI) { EAX = 8; $int 0x40 } inline fastcall void sys_delete_button(dword EDX) { EAX = 8; EDX |= 0x80000000; $int 0x40 } /********************************************************* 09 = PROCESS INFO ebx pointer to 1024 bytes table ecx process number or -1 = who am I ret: eax number of processes table : +00 dword cpu usage +04 word processes position in windowing stack +06 word window stack value at ecx +10 12 db name of the process +22 dword start of processes memory +26 dword memory used by process +30 dword PID of the process +34 dword window x start +38 dword window y start +42 dword window x size +46 dword window y size *********************************************************/ inline fastcall dword sys_process_info(dword EBX, ECX) { EAX = 9; $int 0x40 } /********************************************************* 10 = WAIT FOR EVENT ret: eax event type, 1 window redraw, 2 key in buffer, 3 button pressed *********************************************************/ inline fastcall dword sys_wait_event() { EAX = 10; // wait here for event $int 0x40 } /********************************************************* 11 = CHECK FOR EVENT, NO WAIT ret: eax 0 no event, 1 window redraw, 2 key in buffer, 3 button pressed *********************************************************/ inline fastcall dword sys_nowait_event() { EAX = 11; $int 0x40 } /********************************************************* 12 = WINDOW REDRAW EBX=1 start of draw, =2 end of draw. *********************************************************/ inline fastcall void sys_window_redraw(dword EBX) { EAX = 12; // function 12:tell os about windowdraw $int 0x40 } inline fastcall void sys_begin_draw() { EAX = 12; EBX = 1; $int 0x40 } inline fastcall void sys_end_draw() { EAX = 12; EBX = 2; $int 0x40 } /********************************************************* 13 = DRAW BAR DrawBar(EBX=[xstart][xsize],ECX=[ystart][ysize],EDX=[0x00RRGGBB]) ebx [x start]*65536 + [x size] ecx [y start]*65536 + [y size] edx color 0x00RRGGBB ret: nothing changed *********************************************************/ inline fastcall void sys_draw_bar(dword EBX, ECX, EDX) { EAX = 13; $int 0x40 } /********************************************************* 14 = GET SCREEN MAX ret: eax [screen x max]*65536 + [screen y max] *********************************************************/ inline fastcall dword sys_get_screen_size() { EAX = 14; $int 0x40 } /********************************************************* 15 = BACKGROUND ebx 1 : set background size ecx x size edx y size ebx 2 : write to background memory - max (0x100000-16) ecx position in memory in bytes edx color 0x00RRGGBB ebx 3 : draw background ebx 4 : type of background draw ecx 1 - tile ecx 2 - stretch ebx 5 : blockmove image to os bgr memory ecx - from edx - to where in os bgr memory esi - count of bytes to move *********************************************************/ inline fastcall void sys_set_background(dword EBX, ECX, EDX, ESI) { EAX = 15; $int 0x40 } /********************************************************* 17 = GET PRESSED BUTTON ID ret: al 0 successful -> ah = id number al 1 no key in buffer. MODIFIED, see below. *********************************************************/ inline fastcall dword sys_get_button_id() { EAX = 17; // Get ID $int 0x40 $shr eax,8 } //eax=id, eax=0 no id. /********************************************************* 18 = SYSTEM SERVICE ebx 1 - system boot ebx 2 - force terminate , ecx process no ebx 4 - idle clock cycles / second ebx 5 - time stamp counter / second - cpu speed HD-> ebx 6 - save ramdisk to /hd/1/menuet.img *********************************************************/ inline fastcall dword sys_service(dword EBX, ECX) { EAX = 18; $int 0x40 } inline fastcall void sys_shutdown() { EAX = 18; EBX = 1; $int 0x40 } inline fastcall void sys_kill(dword ECX) { EAX = 18; EBX = 2; $int 0x40 } inline fastcall dword sys_get_idle() { EAX = 18; EBX = 4; $int 0x40 } inline fastcall dword sys_get_tscsec() { EAX = 18; EBX = 5; $int 0x40 } /********************************************************* 19 = START PROGRAM from RAMDISK ebx point to 11 char filename ecx 0, or point to ASCIIZ start parameters - max 256 bytes ret: eax 0 successful eax other error code *********************************************************/ inline fastcall dword sys_exec_app_ramdisk(dword EBX, ECX) { EAX = 19; $int 0x40 } /********************************************************* 20 = MIDI INTERFACE - MPU401 ebx 1 - reset device ebx 2 - cl midi data to output *********************************************************/ inline fastcall void sys_midi(dword EBX) { EAX = 20; $int 0x40 } /********************************************************* 21 = SETUP FOR DEVICES ebx 1=roland mpu midi base , base io address ebx 2=keyboard 1 base keymap 2 shift keymap (ecx pointer to keymap) 9 country 1eng 2fi 3ger 4rus ebx 3=cd base 1 pri.master 2 pri slave, 3 sec master 4 sec slave ebx 4=sb16 base, base io address ebx 5=system language, 1eng 2fi 3ger 4rus ebx 6=wss base, base io address ebx 7=hd base, 1 pri.master 2 pri slave 3 sec master 4 sec slave ebx 8=fat32 partition in hd *********************************************************/ inline fastcall void sys_setup_devices(dword EBX, ECX) { EAX = 21; $int 0x40 } /********************************************************* 23 = WAIT FOR EVENT WITH TIMEOUT ebx time to delay in hs ret: eax event type: 0 no event, 1 window redraw, 2 key in buffer, 3 button *********************************************************/ inline fastcall dword sys_wait_event_timeout(dword EBX) { EAX = 23; $int 0x40 } /********************************************************* 24 = CD AUDIO ebx 1 - play from ecx 00 FR SS MM ebx 2 - get playlist size of ecx to [edx] ebx 3 - stop/pause play *********************************************************/ inline fastcall void sys_cd_audio(dword EBX, ECX, EDX) { EAX = 24; $int 0x40 } /********************************************************* 25 = SB16 - mixer I ebx 1 - set main volume cl [L]*16+[R] ebx 2 - set cd volume cl [L]*16+[R] *********************************************************/ inline fastcall void sys_sb16_mixer_1(dword EBX, ECX) { EAX = 25; $int 0x40 } /********************************************************* 26 = GET SETUP FOR DEVICES ebx 1=roland mpu midi base , base io address ebx 2=keyboard 1 base keymap 2 shift keymap 9 country 1eng 2fi 3ger 4rus ebx 3=cd base 1 pri.master 2 pri slave, 3 sec master 4 sec slave ebx 4=sb16 base, base io address ebx 5=system language, 1eng 2fi 3ger 4rus ebx 6=wss base, base io address ebx 7=hd base, 1 pri.master 2 pri slave 3 sec master 4 sec slave ebx 8=fat32 partition in hd ebx 9=1/100 timer tics from start -> eax return value in eax *********************************************************/ inline fastcall dword sys_get_setup_devices(dword EBX) { EAX = 26; $int 0x40 } /********************************************************* 27 = WINDOWS SOUND SYSTEM ebx 1 - set main volume to cl 0-255 ebx 2 - set cd volume to cl 0-255 *********************************************************/ inline fastcall void sys_windows_sound_system(dword EBX, ECX) { EAX = 27; $int 0x40 } /********************************************************* 28 = SB16 - mixer II ebx 1 - set main volume to cl 0-255 ebx 2 - set cd volume to cl 0-255 *********************************************************/ inline fastcall void sys_sb16_mixer_2(dword EBX, ECX) { EAX = 28; $int 0x40 } /********************************************************* 29 = GET DATE ret: eax 0x00YYDDMM year date month *********************************************************/ inline fastcall dword sys_get_date() { EAX = 29; $int 0x40 } /********************************************************* 30 = READ HD ebx pointer to file ecx file lenght edx block to read, starts from 1, blocksize = 512 bytes esi reserved, set as 1 edi pointer to return/work area (atleast 20 000 bytes) return: work_area+1024 <- requested block of 512 bytes *********************************************************/ inline fastcall dword sys_read_hd(dword EBX, ECX, EDX, ESI, EDI) { EAX = 30; $int 0x40 } /********************************************************* 31 = START APP FROM HD ebx pointer to file ecx file lenght edx pointer to return/work area (atleast 20 000 bytes) ret eax=0 successful, eax<>0 errorcode *********************************************************/ inline fastcall dword sys_exec_app_hd() { EAX = 31; $int 0x40 } /********************************************************* 32 = DELETE FILE FROM FLOPPY IMAGE IN MEMORY ebx pointer to filename *********************************************************/ inline fastcall dword sys_floppy_delete(EBX) { EAX = 32; $int 0x40 } /********************************************************* 33 = SAVE FILE TO FLOPPY IMAGE IN MEMORY ebx pointer to file name ecx pointer to data edx count to write in bytes esi 0 create new , ( 1 append - not implemented yet ) *********************************************************/ inline fastcall dword sys_floppy_save(EBX,ECX,EDX) { EAX = 33; ESI = 0; $int 0x40 } /********************************************************* 34 = READ DIRECTORY FROM FLOPPY ebx reserved : set as zero ecx reserved : set as zero edx start 512 block to read esi reserved : set as 1 edi pointer to return area *********************************************************/ /********************************************************* 35 = READ SCREEN PIXEL ebx = pixel count from top left of the screen return : eax = 0x00RRGGBB *********************************************************/ inline fastcall dword sys_read_pixel(dword EBX) { EAX = 35; $int 0x40 } /********************************************************* 37 = READ MOUSE POSITION ebx=0 screen relative ebx=1 window relative ebx=2 buttons pressed return in eax *********************************************************/ inline fastcall dword sys_read_mouse(dword EBX) { EAX = 37; $int 0x40 } /********************************************************* 38 = DRAW LINE ebx [x start] shl 16 + [x end] ecx [y start] shl 16 + [y end] edx colour 0x00RRGGBB return : nothing changed *********************************************************/ inline fastcall void sys_draw_line(dword EBX, ECX, EDX) { EAX = 38; $int 0x40 } /********************************************************* 39 = GET BACKGROUND ebx=1 -> eax=[bgr x size] shl 16 + [bgr y size] ebx=2 ecx= postition of backgrounds memorymap to return in eax ebx=4 -> eax=1 tiled, eax=2 stretched *********************************************************/ inline fastcall dword sys_get_background(dword EBX, ECX) { EAX = 39; $int 0x40 } /********************************************************* 40 = SET BITFIELD FOR WANTED EVENTS as default: ebx = 00000000 00000000 00000000 00000111b events: I window draw I key in buffer I button in buffer I (end request) I desktop background draw I mouse change I IPC message I stack I---------------I get irqs data *********************************************************/ //sys_set_event_mask() //{ //} /********************************************************* 41 = GET IRQ OWNER ebx = irq return : PID of the process *********************************************************/ /********************************************************* 42 = GET DATA READ BY IRQ ebx IRQ number return : eax number of bytes in buffer bl data ecx 0 = successful data read 1 = no data in buffer 2 = incorrect IRQ owner *********************************************************/ /********************************************************* 43 = SEND/READ DATA TO/FROM DEVICE SEND: bl : data cx : port return: eax: status of read ( 0 if successful, other if error ) READ: ecx : bit 31 set + port return: eax: 0 status of read ( 0 if successful, other if error ) ebx: low 8 bits : value *********************************************************/ inline fastcall dword sys_read_port(word CX) { EAX = 43; ECX |= 0x80000000; // set bit 31 $int 0x40 } inline fastcall dword sys_read_port_fast(dword ECX) { EAX = 43; $int 0x40 } inline fastcall dword sys_write_port(word CX,byte BL) { EAX = 43; $int 0x40 } /********************************************************* 44 = PROGRAM IRQ's ebx pointer to table ecx irq number *********************************************************/ inline fastcall void sys_program_irqs(dword EBX,ECX) { EAX = 44; $int 0x40 } /********************************************************* 45 = RESERVE/FREE IRQ ebx 0 reserve 1 free ecx IRQ number ret eax 0 successful, 1 error *********************************************************/ inline fastcall dword sys_reserve_irq(dword ECX) { EAX = 45; EBX = 0; $int 0x40 } inline fastcall dword sys_free_irq(dword ECX) { EAX = 45; EBX = 1; $int 0x40 } /********************************************************* 46 = RESERVE/FREE PORT AREA ebx 0 reserve 1 free ecx port area start edx port area end ret eax 0 successful, 1 error *********************************************************/ inline fastcall dword sys_reserve_port_area(dword ECX,EDX) { EAX = 46; EBX = 0; $int 0x40 } inline fastcall dword sys_free_port_area() { EAX = 46; EBX = 1; $int 0x40 } /********************************************************* 47 = DISPLAY NUMBER TO WINDOW ebx = print type, bl=0 -> ecx is number bl=1 -> ecx is pointer bh=0 -> display decimal bh=1 -> display hexadecimal bh=2 -> display binary bits 16-21 = number of digits to display (0-32) bits 22-31 = reserved ecx = number or pointer edx = x shl 16 + y esi = color *********************************************************/ inline fastcall void sys_write_number(dword EBX, ECX, EDX, ESI) { EAX = 47; $int 0x40 } /********************************************************* 48 = DEFINE GENERAL WINDOW PROPERTIES ebx = 0 apply/redraw ecx = 0 , apply/redraw desktop ebx = 1 define button style ecx = 0 , set flat buttons ecx = 1 , set 3d buttons ebx = 2 define window colors ecx = pointer to table edx = number of bytes defined ebx = 3 get define window colors ecx = pointer to table edx = number of bytes to get ebx = 4 get window skin height *********************************************************/ inline fastcall void sys_redraw_desktop() { EAX = 48; EBX = ECX = 0; $int 0x40 } inline fastcall void sys_set_button_style(dword ECX) { EAX = 48; EBX = 1; $int 0x40 } inline fastcall void sys_set_colors(dword ECX,EDX) { EAX = 48; EBX = 2; $int 0x40 } inline fastcall void sys_get_colors(dword ECX,EDX) { EAX = 48; EBX = 3; $int 0x40 } inline fastcall dword sys_get_skin_height() { EAX = 48; EBX = 4; $int 0x40 } /********************************************************* 50 = FREE FORM WINDOW SHAPE AND SCALE ebx = 0 ; shape reference area ecx = pointer to reference area byte per pixel, 0 not used, 1=used, other = reserved ebx = 1 ; scale of reference area (default 1:1) ecx : scale is set to 2^ecx return: nothing changed *********************************************************/ inline void sys_freeform_window(dword EBX,ECX) { EAX = 50; $int 0x40 } /********************************************************* 51 = CREATE THREAD ebx = 1 ; create ecx ; = thread entry point edx ; = thread stack position return : eax = pid or 0xfffffff0+ for error *********************************************************/ inline fastcall dword sys_create_thread(dword ECX,EDX) { EAX = 51; EBX = 1; $int 0x40 } /********************************************************* 52 = STACK DRIVER STATUS - see stack.txt net.h-- 53 = SOCKET INTERFACE - see stack.txt net.h-- *********************************************************/ /********************************************************* 55 = SOUND INTERFACE ebx = 0 ; load sound block ecx = ; pointer to (default size 65536 byte) soundblock ebx = 1 ; play (default 44 khz 8 bit mono) sound block ebx = 2 ; set format ecx = 1 ; set play block length edx = ; block length *********************************************************/ inline fastcall void sys_sound_load(dword ECX) { EAX = 55; EBX = 0; $int 0x40 } inline fastcall void sys_sound_play() { EAX = 55; EBX = 1; $int 0x40 } inline fastcall void sys_sound_format_length(dword EDX) { EAX = 55; EBX = 2; ECX = 1; $int 0x40 } /********************************************************* 56 = WRITE FILE TO HD ebx pointer to 12 char filename ecx bytes to write edx pointer to data to write esi pointer to path path db 0 *********************************************************/ /********************************************************* 57 = DELETE FILE FROM HD ebx pointer to filename : 11 capital letters edx pointer to path : path db 0 *********************************************************/ /********************************************************* 58 = SYSTEM TREE ACCESS ebx pointer to fileinfo block fileinfo: dd 0x0 ; 0=read (/write/delete/append) dd 0x0 ; 512 block to read 0+ dd 0x1 ; blocks to read (/bytes to write/append) dd 0x20000 ; return data pointer dd 0x10000 ; work area for os - 16384 bytes db '/RAMDISK/FIRST/KERNEL.ASM',0 ; ASCIIZ dir & filename *********************************************************/ inline fastcall void sys_tree_access(dword EBX) { EAX = 58; $int 0x40 } /********************************************************* 59 = TRACE FOR SYSTEM CALLS FROM PROCESSES ebx = 0 ; get system events ecx ; pointer to table -> ; 64 bytes/system call descriptor ; +00 PID ; +32 EDI ; +36 ESI ; +40 EBP ; +44 ESP ; +48 EBX ; +52 EDX ; +56 ECX ; +60 EAX edx ; number of bytes to return to table (currently max 16*64) return: eax = number of system calls from start latest call is saved to (eax mod 16)*64 in table ebx = 0 : above format *********************************************************/ inline fastcall void sys_syscall_trace(dword ECX,EDX) { EAX = 59; EBX = 0; $int 0x40 } /********************************************************* 60 = IPC ebx = 1 ; define receive area ecx = pointer to start edx = size of area ebx = 2 ; send message ecx = PID edx = pointer to message esi = length *********************************************************/ inline fastcall void sys_ipc_init(dword ECX, EDX) { EAX = 60; EBX = 1; $int 0x40 } inline fastcall void sys_ipc_send(dword ECX, EDX, ESI) { EAX = 60; EBX = 2; $int 0x40 } /********************************************************* 63 = GENERAL DEBUG BOARD ebx = 1 write byte in cl ebx = 2 read byte : ebx = 1 -> byte in al ; ebx = 0 -> no data *********************************************************/ inline fastcall void sys_debug_write_char(byte CL) { EAX = 63; EBX = 1; $int 0x40 } :fastcall void sys_debug_write_string(dword ESI) { $pusha CL = DSBYTE[ESI]; while(CL!=0) { sys_debug_write_char(CL); ESI++; CL = DSBYTE[ESI]; } $popa } inline fastcall dword sys_debug_read_char(dword EBX) { EAX = 63; EBX = 2; $int 0x40 } inline fastcall dword window_move_size(dword EBX,ECX,EDX,ESI){ EAX = 67; $int 0x40 } /********************************************************* -1 = EXIT PROCESS *********************************************************/ inline fastcall void sys_exit_process() { $or eax,0xffffffff $int 0x40 }