diff --git a/programs/games/mine/trunk/changelog.txt b/programs/games/mine/trunk/changelog.txt deleted file mode 100644 index f779b6ec4..000000000 --- a/programs/games/mine/trunk/changelog.txt +++ /dev/null @@ -1,15 +0,0 @@ -v0.3a (11/08/2003) - - fixed a bug on old kernels - -v0.3 (09/08/2003) - - fixed some bugs - - new timer - - better random number generator - - user can't blow up after first mouse click - - uses system colors - -v0.2 (29/06/2003) - - fixed a lot of bugs - -v0.1 (22/06/2003) - - first public version \ No newline at end of file diff --git a/programs/games/mine/trunk/draw.h-- b/programs/games/mine/trunk/draw.h-- index 000cc5954..0c21497a1 100644 --- a/programs/games/mine/trunk/draw.h-- +++ b/programs/games/mine/trunk/draw.h-- @@ -1,7 +1,7 @@ /******************************************************************************* MenuetOS MineSweeper - Copyright (C) 2003 Ivan Poddubny + Copyright (C) 2003, 2004 Ivan Poddubny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -22,7 +22,6 @@ void draw_window() // Процедура отрисовки окна { - mouse_disable(); sys_window_redraw(1); sys_get_colors(#colors, 40); @@ -33,7 +32,7 @@ void draw_window() sys_draw_window(EBX, ECX, 0x02CCCCCC, colors.w_grab | 0x80000000, colors.w_frames); // LABEL - sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "MeOS MineSweeper", 16); + sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "MineSweeper", 11); // BUTTON (1) EBX = xsize - 19; EBX = EBX<<16 + 12; @@ -44,11 +43,16 @@ void draw_window() EBX = EBX << 16 + 20; sys_draw_button(EBX, 25<<16+20, 911, clLightGray); + //
BUTTON (1000) +// EBX = ncx * XPX; EBX += XST << 16; +// ECX = ncy * YPX; ECX += YST << 16; +// sys_draw_button(EBX, ECX, 1000, 0x60000000); + // BUTTON (1001) sys_draw_button(10<<16+7, 23<<16+7, 1001, 0x118811); // BUTTON (1002) - //sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44); +// sys_draw_button(20<<16+7, ECX, EDX+1, 0xddbb44); // BUTTON (1003) // sys_draw_button(); @@ -65,7 +69,6 @@ void draw_window() draw_minesi(); // draw mines draw_squares(); // draw field - mouse_enable(); } dword num_colors[8]= @@ -80,12 +83,13 @@ dword num_colors[8]= 0x808080 // 8 }; -void draw_square(int x, y) + // Отрисовка одной клетки +void draw_square(int x, y) { - int xl, xr, yt, yb; - dword tcolor = clBlack; - byte tchar,tval; + int xl, xr, yt, yb; // слева, справа, сверху, снизу + dword tcolor = clBlack; // цвет значения клетки по умолчанию черный + byte tchar, tval; xl = XPX * x + XST; xr = xl + XPX - 1; @@ -96,10 +100,11 @@ void draw_square(int x, y) ECX = yt << 16 + yb - yt; $inc ebx $inc ecx - sys_draw_bar(EBX, ECX, clLightGray); + sys_draw_bar(EBX, ECX, clLightGray); // рисует закрашенный прямоугольник if (!get_open(x, y)) { + // рисуем рамку ECX = yt << 16 + yb - 1; sys_draw_line(xl<<16+xl, ECX, clWhite); EBX = xl << 16 + xr - 1; @@ -125,56 +130,54 @@ void draw_square(int x, y) else // get_open(x,y)==TRUE { tval = get_value(x, y); - IF (tval == 0) + IF (tval != 0) { - //tcolor=clLightGray; - //tchar=' '; - GOTO NOCHAR; + IF (tval == MINE) + { + tcolor = 0xee1111; + tchar = '*'; + } + ELSE + { + tchar = tval + '0'; + tcolor = num_colors[tval-1]; + } + EBX = xl + 5; EBX <<= 16; EBX += yt + 5; + sys_write_text(EBX, tcolor, #tchar, 1); + EBX += 0x00010000; + sys_write_text(EBX, ECX, EDX, ESI); } - ELSE IF (tval == MINE) - { - tcolor = 0xee1111; - tchar = '*'; - } - ELSE - { - tchar = tval + '0'; - tcolor = num_colors[tval-1]; - } - - EBX = xl + 5; EBX <<= 16; EBX += yt + 5; - sys_write_text(EBX, tcolor, #tchar, 1); - EBX += 0x00010000; - sys_write_text(EBX, ECX, EDX, ESI); -NOCHAR: sys_draw_line(xl << 16 + xl, yt << 16 + yb, clDarkGray); sys_draw_line(xl << 16 + xr, yt << 16 + yt, EDX); } } -void draw_time() + // Таймер +void draw_time() { sys_draw_bar(XST<<16+25, 31<<16+10, 0xCCCCCC); EBX = 0x00030000; sys_write_number(EBX, time, XST<<16+32, 0x10ff0000); } -void draw_minesi() + // Индикатор количества нерасставленных мин +void draw_minesi() { EBX = xsize - XST - 25; $PUSH EBX EBX = EBX << 16 + 25; - sys_draw_bar(EBX, 31<<16+12, 0xCCCCCC); + sys_draw_bar(EBX, 31<<16+10, 0xCCCCCC); $POP EDX - EDX <<= 16; EDX += 30; + EDX <<= 16; EDX += 32; EBX = 0x00030000; sys_write_number(EBX, cmines, EDX, 0x10ff0000); } -void draw_squares() + // Отрисовка минного поля +void draw_squares() { int x,y; diff --git a/programs/games/mine/trunk/make.bat b/programs/games/mine/trunk/make.bat new file mode 100644 index 000000000..534ad0837 --- /dev/null +++ b/programs/games/mine/trunk/make.bat @@ -0,0 +1,2 @@ +@E:\C--\bin\c-- mine.c-- /meos +@pause > nul \ No newline at end of file diff --git a/programs/games/mine/trunk/mine.c-- b/programs/games/mine/trunk/mine.c-- index c7fe5c6cf..5b98be43f 100644 --- a/programs/games/mine/trunk/mine.c-- +++ b/programs/games/mine/trunk/mine.c-- @@ -1,7 +1,7 @@ /******************************************************************************* MenuetOS MineSweeper - Copyright (C) 2003 Ivan Poddubny + Copyright (C) 2003, 2004 Ivan Poddubny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,22 +19,22 @@ *******************************************************************************/ -//? pragma option LST // generate ASM listing file - создать ассемблерный листинг -//? warning TRUE // включить режим вывода предупреждений -? pragma option meos +? pragma option LST // generate ASM listing file - создать ассемблерный листинг +? warning TRUE // включить режим вывода предупреждений ? jumptomain NONE -? include "msys.h--" // MenuetOS system functions - системные функции MenuetOS +? include "msys.h--" // MenuetOS system functions - системные функции MenuetOS +//? define DEBUG 1 -? print "\nЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї" -? print "\nі MeOS MineSweeper v0.3 і" -? print "\nі (C) Ivan Poddubny (ivan-yar@bk.ru) 2003 і" -? print "\nАДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ\n\n" +? print "\nЪДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДї" +? print "\nі MenuetOS MineSweeper v0.4 і" +? print "\nі (C) Ivan Poddubny (ivan-yar@bk.ru) 2003,2004 і" +? print "\nАДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДДЩ\n\n" /************************************** DATA **************************************/ ? define XPX 16 // X pixels by square - размер клетки в пикселях ? define YPX 16 // Y pixels by square -? define MINE 255 // значение для мины в поле value +? define MINE 255 // в клетке мина, если value = MINE struct { @@ -59,7 +59,7 @@ struct int XST, // offset of first pixel X - смещение поля от границы окна YST, - ncx, // number of squares in X - размер пол + ncx, // number of squares in X - размер поля ncy, cmines, // mines discovered - количество неоткрытых мин initmines, // number of initial mines - изначальное количество мин @@ -88,6 +88,7 @@ inline void fastcall mouse_enable() $int 0x40 } + inline void fastcall mouse_disable() { $mov eax,40 @@ -95,14 +96,16 @@ inline void fastcall mouse_disable() $int 0x40 } + ? include "timer.h--" // timer functions ? include "draw.h--" // drawing functions ? include "access.h--" // get & set functions ? include "random.h--" // random number generator //? include "uf.h--" // user field window + void init() -// Инициализаци +// Инициализация { XST = 10; YST = 52; // FIELD POSITION IN WINDOW @@ -126,6 +129,7 @@ void init() ysize = ncy * YPX + YST + XST; } // init + void clear_all() // Очистить поле { @@ -135,10 +139,11 @@ void clear_all() $REP $STOSD } // clear_all + void new_game() // Новая игра { - init(); // инициализаци + init(); // инициализация randomize(); // генератор случайных чисел clear_all(); // очистить поле @@ -149,16 +154,22 @@ void new_game() time = 0; // время = 0 } // new_game + void set_mines(int nminas, no_x, no_y) // Расставить мины { int i, x, y, a, b; + #ifdef DEBUG + sys_debug_write_string("MINE: set_mines called\n"); + #endif + sqclosed = ncx * ncy - nminas; // количество НЕоткрытых клеток = площадь поля - кол-во мин FOR (i = nminas; i > 0; i--) // расставить мины { - x = random(ncx); y = random(ncy); + x = random(ncx); + y = random(ncy); WHILE ((get_value(x, y) == MINE) || ((x == no_x) && (y == no_y))) { x = random(ncx); @@ -190,13 +201,18 @@ void set_mines(int nminas, no_x, no_y) } } // set_mines + inline void do_mouse(void) // Обработчик мыши { int x,y; EAX = sys_read_mouse(2); // мышь не нажата -> выход - IF (EAX == 0) return; + IF (EAX == 0) + { +// sys_debug_write_string("Strange\n"); + return; + } mouse_status = AL; @@ -216,8 +232,10 @@ inline void do_mouse(void) IF (firstmine == TRUE) { firstmine = FALSE; - set_mines(cmines, x, y); + set_mines(initmines, x, y); start_timer(); + time = 1; + draw_time(); } IF (get_value(x, y) == MINE) { @@ -252,10 +270,10 @@ inline void do_mouse(void) end_game(); } - if (sqclosed == 0) - // открыты все клетки - // all squares are opened + IF (sqclosed == 0) { + // открыты все клетки + // all squares are opened mouse_en = FALSE; // запретить мышь stop_timer(); stop_game = TRUE; // игра завершена @@ -273,11 +291,16 @@ inline void do_mouse(void) } } // do_mouse + void open_square(int x, y) // Открыть клетку { int a, b, i; + #ifdef DEBUG + sys_debug_write_string("MINE: open_square called\n"); + #endif + set_open(x, y, TRUE); sqclosed--; @@ -305,12 +328,17 @@ void open_square(int x, y) } } // open_square + int open_near_squares(int x, y) // Открыть близлежащие клетки (обе кнопки мыши вместе) { int a, b, i; dword suma = 0; + #ifdef DEBUG + sys_debug_write_string("MINE: open_near_squares called\n"); + #endif + a = x; b = y; FOR (i = 0; i < 8; i++) @@ -349,16 +377,21 @@ int open_near_squares(int x, y) open_square(a, b); } } - RETURN suma; + return suma; } ELSE - RETURN 0; + return 0; } // open_near_squares + void end_game() { int x,y; + #ifdef DEBUG + sys_debug_write_string("MINE: end_game called\n"); + #endif + stop_game = TRUE; stop_timer(); for (x=0; x 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 @@ -113,85 +120,115 @@ inline fastcall dword sys_get_key() $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 - ret: nothing changed -*/ + 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: nothing changed -*/ -inline fastcall void sys_open_file_floppy(dword EBX, ESI) + ret: ebx = file size +*********************************************************/ + +inline fastcall dword sys_open_file_floppy(dword EBX, ESI) { - $xor ecx,ecx + 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 @@ -207,67 +244,99 @@ inline fastcall void sys_draw_button(dword EBX, ECX, EDX, ESI) +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 -*/ + 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 -*/ + 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 + +/********************************************************* +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 @@ -283,7 +352,8 @@ inline fastcall dword sys_get_screen_size() 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; @@ -291,11 +361,12 @@ inline fastcall void sys_set_background(dword EBX, ECX, EDX, ESI) } -/* +/********************************************************* 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 @@ -303,45 +374,80 @@ inline fastcall dword sys_get_button_id() $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) @@ -354,49 +460,57 @@ inline fastcall void sys_midi(dword EBX) 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 @@ -409,48 +523,56 @@ inline fastcall void sys_sb16_mixer_1(dword EBX, ECX) 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 stard -> eax + 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 @@ -458,30 +580,34 @@ inline fastcall dword sys_get_date() 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) { @@ -489,13 +615,15 @@ inline fastcall dword sys_floppy_delete(EBX) $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; @@ -503,60 +631,75 @@ inline fastcall dword sys_floppy_save(EBX,ECX,EDX) $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: @@ -565,15 +708,24 @@ inline fastcall dword sys_get_background(dword EBX, ECX) I button in buffer I (end request) I desktop background draw - I (mouse change) + 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 @@ -581,33 +733,106 @@ inline fastcall dword sys_get_background(dword EBX, ECX) 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 +} -43 = SEND DATA TO DEVICE - bx : port - cl : data - return : eax = if 0 successful, other = error - - +/********************************************************* 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 @@ -619,14 +844,15 @@ inline fastcall dword sys_get_background(dword EBX, ECX) 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 @@ -639,7 +865,8 @@ inline fastcall void sys_write_number(dword EBX, ECX, EDX, ESI) 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() { @@ -669,14 +896,15 @@ inline fastcall void sys_get_colors(dword ECX,EDX) $int 0x40 } -/* -49 = DEFINE APPLICATIONS INTERNAL INTERRUPTS - ebx = 0 - ecx point to dword x 256 table of interrupt entries - inside the application - return : nothing changed +inline fastcall dword sys_get_skin_height(dword) +{ + EAX = 48; + EBX = 4; + $int 0x40 +} +/********************************************************* 50 = FREE FORM WINDOW SHAPE AND SCALE ebx = 0 ; shape reference area ecx = pointer to reference area @@ -684,14 +912,22 @@ inline fastcall void sys_get_colors(dword ECX,EDX) 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) { @@ -700,41 +936,73 @@ inline fastcall dword sys_create_thread(dword ECX,EDX) $int 0x40 } -/* +/********************************************************* 52 = STACK DRIVER STATUS - see stack.txt + net.h-- 53 = SOCKET INTERFACE - see stack.txt + net.h-- +*********************************************************/ -54 = USER EVENTS - - not ready yet - - +/********************************************************* 55 = SOUND INTERFACE - ebx = 0 ; load 44 khz 8 bit mono sound block - ecx ; = pointer to 65536 byte soundblock - ebx = 1 ; play 44 khz 8 bit mono sound block + + 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: @@ -744,14 +1012,15 @@ inline fastcall dword sys_create_thread(dword ECX,EDX) 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 @@ -768,9 +1037,17 @@ inline fastcall void sys_tree_access(dword EBX) 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 @@ -780,7 +1057,7 @@ inline fastcall void sys_tree_access(dword EBX) ecx = PID edx = pointer to message esi = length -*/ +*********************************************************/ inline fastcall void sys_ipc_init(dword ECX, EDX) { @@ -796,11 +1073,48 @@ inline fastcall void sys_ipc_send(dword ECX, EDX, ESI) $int 0x40 } -/* -1 = EXIT PROCESS */ + +/********************************************************* +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 +} + + +/********************************************************* +-1 = EXIT PROCESS +*********************************************************/ inline fastcall void sys_exit_process() { - $xor eax,eax - $dec eax + $or eax,0xffffffff $int 0x40 } diff --git a/programs/games/mine/trunk/random.h-- b/programs/games/mine/trunk/random.h-- index 11b60c117..e78b8342f 100644 --- a/programs/games/mine/trunk/random.h-- +++ b/programs/games/mine/trunk/random.h-- @@ -1,7 +1,7 @@ /******************************************************************************* MenuetOS MineSweeper - Copyright (C) 2003 Ivan Poddubny + Copyright (C) 2003, 2004 Ivan Poddubny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/programs/games/mine/trunk/timer.h-- b/programs/games/mine/trunk/timer.h-- index 59f363feb..409f19183 100644 --- a/programs/games/mine/trunk/timer.h-- +++ b/programs/games/mine/trunk/timer.h-- @@ -1,7 +1,7 @@ /******************************************************************************* MenuetOS MineSweeper - Copyright (C) 2003 Ivan Poddubny + Copyright (C) 2003, 2004 Ivan Poddubny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,12 +26,20 @@ byte timer_life; start_timer() { + #ifdef DEBUG + sys_debug_write_string("MINE: timer started\n"); + #endif + timer_life = TRUE; - ttime = sys_get_clock(); + ttime = sys_get_setup_devices(9); //sys_get_clock(); } stop_timer() { + #ifdef DEBUG + sys_debug_write_string("MINE: timer stopped\n"); + #endif + timer_life = FALSE; } @@ -39,12 +47,11 @@ check_timer() { IF (!timer_life) return; - EAX = sys_get_clock(); - IF (EAX == 0xffffff) return; + ECX = sys_get_setup_devices(9); //sys_get_clock(); - IF (ttime != EAX) + IF (ttime+100 < ECX) { - ttime = EAX; + ttime += 100; IF (time < 999) time++; draw_time(); diff --git a/programs/games/mine/trunk/uf.h-- b/programs/games/mine/trunk/uf.h-- index d6731951e..cf140ab01 100644 --- a/programs/games/mine/trunk/uf.h-- +++ b/programs/games/mine/trunk/uf.h-- @@ -1,7 +1,7 @@ /******************************************************************************* MenuetOS MineSweeper - Copyright (C) 2003 Ivan Poddubny + Copyright (C) 2003, 2004 Ivan Poddubny This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -26,29 +26,69 @@ byte px,py,pm; byte uf_open = FALSE; byte uf_stack[2048]; -byte str1[5]; -byte str2[5]; -byte str3[5]; +dword active_textbox = #str1; -dword uf_x, - uf_y; +byte str1[4] = {'1','1','1',0}; +byte str2[4] = {'2','2','2',0}; +byte str3[4] = {'3','2','1',0}; + +dword uf_x=0, + uf_y=0; + +:fastcall dword str2dword(dword EAX) +// str2byte переводит строку из 3ёх цифр в байт +// IN: EAX = адрес сторки +// OUT: EAX = байт +{ + EDX = 0; + ECX = 0; + WHILE(ECX<3) + { + EDX *= 10; + EBX = DSBYTE[EAX+ECX]; + EBX -= '0'; + EDX += EBX; + ECX++; + } + EAX = EDX; +} + +:fastcall void dword2str(dword EAX,ESI) +{ + $PUSHA + DSDWORD[ESI]=0; +// EAX &= 255; + EDI = 10; + ECX = 2; + WHILE(ECX>=0) + { + IF(!EAX) BREAK; + $XOR EDX,EDX + $DIV EDI // al = div; dl = mod + DL += '0'; + DSBYTE[ESI+ECX] = DL; + ECX--; + } + $POPA +} void draw_uf_window() { + #ifdef DEBUG + sys_debug_write_string("MINE: отрисовка UF\n"w); + #endif + sys_get_colors(#colors, 40); sys_window_redraw(1); EDX = colors.w_work; $bts edx,25 - sys_draw_window(uf_x, uf_y, EDX, colors.w_grab | 0x80000000, colors.w_frames); + EBX = uf_x; + ECX = uf_y; + sys_draw_window(EBX, ECX, EDX, colors.w_grab | 0x80000000, colors.w_frames); ECX = colors.w_grab_text | 0x10000000; - sys_write_text(8<<16+8, colors.w_grab_text | 0x10000000, "USER FIELD", 10); - sys_draw_button(81<<16+12, 5<<16+12, 1, colors.w_grab_button); - - ECX = colors.w_work_text | 0x10000000; - sys_write_text(8<<16+31, ECX, "WIDTH", 5); - sys_write_text(8<<16+49, ECX, "HEIGHT", 6); - sys_write_text(8<<16+67, ECX, "MINES", 5); + sys_write_text(7<<16+8, colors.w_grab_text | 0x10000000, "USER FIELD"n, 10); + sys_draw_button(83<<16+12, 5<<16+12, 1, colors.w_grab_button); // three buttons: // 1) WIDTH 10 @@ -66,17 +106,39 @@ void draw_uf_window() sys_draw_button( 8<<16+38, ECX, 20, ESI); EDX++; sys_draw_button(54<<16+38, ECX, EDX, ESI); - sys_write_text(21<<16+85, colors.w_work_button_text, "OK Cancel", 12); + ECX = colors.w_work_text | 0x10000000; + sys_write_text(8<<16+32, ECX, "WIDTH"n, 5); + sys_write_text(8<<16+50, ECX, "HEIGHT"n, 6); + sys_write_text(8<<16+68, ECX, "MINES"n, 5); + + sys_write_text(72<<16+32, 0, #str1, 3); + sys_write_text(72<<16+50, 0, #str2, 3); + sys_write_text(72<<16+68, 0, #str3, 3); + + sys_write_text(21<<16+86, colors.w_work_button_text, "OK Cancel", 12); sys_window_redraw(2); } + void uf_main() { + #ifdef DEBUG + sys_debug_write_string("MINE: поток создан\n"w); + #endif + +// dword2str(13, #str1); +// EAX = str2dword(#str3); +// dword2str(EAX, #str2); + uf_x <<= 16; uf_x += 100; uf_y <<= 16; uf_y += 104; draw_uf_window(); + #ifdef DEBUG + sys_debug_write_string("MINE: жду событий\n"w); + #endif + WHILE() { SWITCH (sys_wait_event()) @@ -84,10 +146,21 @@ void uf_main() case 1: draw_uf_window(); break; - case 2: IF (sys_get_key() == 27) + case 2: //IF (sys_get_key() == 27) + //{ + // uf_open = FALSE; + // sys_exit_process(); + //} + //EAX = key now! + EAX = sys_get_key(); + if (active_textbox != 0) { - uf_open = FALSE; - sys_exit_process(); + EBX = #str1; //active_textbox; + DSBYTE[EBX] = 'A'; + DSBYTE[EBX] = DSBYTE[EBX+1]; + DSBYTE[EBX+1] = DSBYTE[EBX+2]; + DSBYTE[EBX+2] = AL; + draw_uf_window(); } break; @@ -100,26 +173,50 @@ uf_button() { switch (sys_get_button_id()) { - //case 10: - //case 11: - //case 12: + case 10: + // set [width] INPUT active + active_textbox = #str1; break; + case 11: + // set [height] INPUT active + active_textbox = #str2; break; + case 12: + // set [mines] INPUT active + active_textbox = #str3; break; case 20: + // [string -> byte] three times and save them + px = str2dword(#str1); + py = str2dword(#str2); + pm = str2dword(#str3); + mode = 4; case 21: + // close UF window, forget all changes case 1: - uf_open = FALSE; - sys_exit_process(); + uf_open = FALSE; + sys_exit_process(); } } void start_uf() { + #ifdef DEBUG + sys_debug_write_string("MINE: вызвана start_uf\n"w); + #endif + sys_process_info(#procinfo, -1); uf_x = procinfo.xstart + XST; uf_y = procinfo.ystart + YST; + #ifdef DEBUG + sys_debug_write_string("MINE: создаю поток...\n"w); + #endif + sys_create_thread(#uf_main, #uf_stack + 2048); + + IF(EAX > 0x80000000) + return; + uf_open = TRUE; mouse_disable(); WHILE (uf_open == TRUE)