From fbdccce9a4e73a39837fe15ae57d7557416a72c7 Mon Sep 17 00:00:00 2001 From: CleverMouse Date: Mon, 15 Sep 2014 09:42:01 +0000 Subject: [PATCH] * gcc flags: add -march=pentium-mmx -fno-rtti * menuetlibc: fix printf, sprintf * menuetlibc: alias clock() to sysfn 26.9. Not exactly what is required by POSIX, but better than zero * autobuild games/checkers git-svn-id: svn://kolibrios.org@5123 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/Tupfile.lua | 2 +- data/eng/games/checkers | Bin 24758 -> 0 bytes data/et/games/checkers | Bin 24758 -> 0 bytes data/it/games/checkers | Bin 24758 -> 0 bytes data/rus/games/checkers | Bin 24851 -> 0 bytes data/sp/games/checkers | Bin 24758 -> 0 bytes .../libraries/menuetlibc/include/assert.h | 4 + .../libraries/menuetlibc/include/time.h | 5 +- .../libraries/menuetlibc/src/libc/Tupfile.lua | 2 +- .../menuetlibc/src/libc/ansi/stdio/printf.c | 1 + .../menuetlibc/src/libc/ansi/stdio/sprintf.c | 1 + .../libraries/menuetlibc/src/libc/crt0/crt1.c | 1 - .../menuetlibc/src/libc/pc_hw/timer/clock.c | 4 +- .../menuetlibc/src/libcpp/Tupfile.lua | 2 +- .../libraries/menuetlibc/src/libm/Tupfile.lua | 2 +- .../libraries/menuetlibc/src/libm/k_standa.c | 2 +- programs/games/checkers/trunk/board.h | 4 +- programs/games/checkers/trunk/buttons.h | 2 - programs/games/checkers/trunk/checkers.cpp | 394 +----- programs/games/checkers/trunk/compile.txt | 13 +- programs/games/checkers/trunk/compile_eng.bat | 7 - programs/games/checkers/trunk/compile_ru.bat | 7 - programs/games/checkers/trunk/cpp2asm.bat | 3 - programs/games/checkers/trunk/dos-draw.h | 3 +- programs/games/checkers/trunk/gnu-draw.h | 3 +- programs/games/checkers/trunk/gr-draw.h | 81 +- programs/games/checkers/trunk/history.h | 24 +- .../games/checkers/trunk/include/me_func.inc | 1135 ----------------- .../games/checkers/trunk/include/me_heap.h | 90 -- .../games/checkers/trunk/include/me_heap.inc | 284 ----- .../games/checkers/trunk/include/me_lib.h | 16 - .../games/checkers/trunk/include/me_lib.inc | 118 -- .../games/checkers/trunk/include/me_start.inc | 90 -- .../games/checkers/trunk/include/memheap.h | 626 --------- .../games/checkers/trunk/include/menuet.h | 536 -------- .../games/checkers/trunk/include/stdarg.h | 13 - .../checkers/trunk/include/write_macro.inc | 49 - programs/games/checkers/trunk/me_make.inc | 10 - programs/games/checkers/trunk/mt-draw.h | 79 -- programs/games/checkers/trunk/player.h | 2 - programs/games/checkers/trunk/position.h | 6 +- programs/games/checkers/trunk/qsort.c | 331 ----- programs/games/checkers/trunk/sysproc.h | 12 +- programs/games/checkers/trunk/t2fasm.exe | Bin 5120 -> 0 bytes programs/games/checkers/trunk/win-draw.h | 3 +- programs/use_gcc.lua | 6 +- 46 files changed, 146 insertions(+), 3827 deletions(-) delete mode 100644 data/eng/games/checkers delete mode 100644 data/et/games/checkers delete mode 100755 data/it/games/checkers delete mode 100644 data/rus/games/checkers delete mode 100644 data/sp/games/checkers delete mode 100644 programs/games/checkers/trunk/compile_eng.bat delete mode 100644 programs/games/checkers/trunk/compile_ru.bat delete mode 100644 programs/games/checkers/trunk/cpp2asm.bat delete mode 100644 programs/games/checkers/trunk/include/me_func.inc delete mode 100644 programs/games/checkers/trunk/include/me_heap.h delete mode 100644 programs/games/checkers/trunk/include/me_heap.inc delete mode 100644 programs/games/checkers/trunk/include/me_lib.h delete mode 100644 programs/games/checkers/trunk/include/me_lib.inc delete mode 100644 programs/games/checkers/trunk/include/me_start.inc delete mode 100644 programs/games/checkers/trunk/include/memheap.h delete mode 100644 programs/games/checkers/trunk/include/menuet.h delete mode 100644 programs/games/checkers/trunk/include/stdarg.h delete mode 100644 programs/games/checkers/trunk/include/write_macro.inc delete mode 100644 programs/games/checkers/trunk/me_make.inc delete mode 100644 programs/games/checkers/trunk/mt-draw.h delete mode 100644 programs/games/checkers/trunk/qsort.c delete mode 100644 programs/games/checkers/trunk/t2fasm.exe diff --git a/data/Tupfile.lua b/data/Tupfile.lua index c5e6578ac4..cc785c2700 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -51,7 +51,6 @@ img_files = { {"File Managers/EOLITE.INI", "common/File Managers/eolite.ini"}, {"File Managers/ICONS.INI", "common/File Managers/icons.ini"}, {"File Managers/KFM.INI", "common/File Managers/kfm.ini"}, - {"GAMES/CHECKERS", build_type .. "/games/checkers"}, {"GAMES/MEGAMAZE", build_type .. "/games/megamaze"}, {"LIB/PIXLIB.OBJ", "common/lib/pixlib.obj"}, {"LIB/ICONV.OBJ", "common/lib/iconv.obj"}, @@ -456,6 +455,7 @@ if tup.getconfig('NO_GCC') ~= 'full' then tup.append_table(img_files, { {"3D/CUBELINE", PROGS .. "/demos/cubeline/trunk/cubeline"}, {"3D/GEARS", PROGS .. "/demos/gears/trunk/gears"}, + {"GAMES/CHECKERS", PROGS .. "/games/checkers/trunk/checkers"}, {"GAMES/REVERSI", PROGS .. "/games/reversi/trunk/reversi"}, {"SHELL", PROGS .. "/system/shell/shell"}, }) diff --git a/data/eng/games/checkers b/data/eng/games/checkers deleted file mode 100644 index ddf9409e5e81a34ac4bf702001be887d6cb93e21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24758 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 KGsunv000CWbUtmkUm%Mv}wNu9G@F~+xeo*Hn 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 diff --git a/programs/develop/libraries/menuetlibc/src/libc/Tupfile.lua b/programs/develop/libraries/menuetlibc/src/libc/Tupfile.lua index 2bb0a0ed67..3803964b82 100644 --- a/programs/develop/libraries/menuetlibc/src/libc/Tupfile.lua +++ b/programs/develop/libraries/menuetlibc/src/libc/Tupfile.lua @@ -68,7 +68,7 @@ FOLDERS = { "termios", } -CFLAGS="-Os -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -fno-ident -fomit-frame-pointer -fno-asynchronous-unwind-tables -mpreferred-stack-boundary=2" +CFLAGS="-Os -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -fno-ident -fomit-frame-pointer -fno-asynchronous-unwind-tables -mpreferred-stack-boundary=2 -march=pentium-mmx" OBJS={} for i,v in ipairs(FOLDERS) do tup.append_table(OBJS, diff --git a/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/printf.c b/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/printf.c index 1356a46b2f..38b0abf0fa 100644 --- a/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/printf.c +++ b/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/printf.c @@ -1,5 +1,6 @@ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ #include +#include #include int diff --git a/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/sprintf.c b/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/sprintf.c index 9fd48b9d46..b3833c90e5 100644 --- a/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/sprintf.c +++ b/programs/develop/libraries/menuetlibc/src/libc/ansi/stdio/sprintf.c @@ -1,5 +1,6 @@ /* Copyright (C) 1994 DJ Delorie, see COPYING.DJ for details */ #include +#include #include #include diff --git a/programs/develop/libraries/menuetlibc/src/libc/crt0/crt1.c b/programs/develop/libraries/menuetlibc/src/libc/crt0/crt1.c index c5a2d12635..f7839536b5 100644 --- a/programs/develop/libraries/menuetlibc/src/libc/crt0/crt1.c +++ b/programs/develop/libraries/menuetlibc/src/libc/crt0/crt1.c @@ -36,7 +36,6 @@ extern char __menuet__app_param_area[]; void __crt1_startup(void) { init_brk(); - if(__menuet__app_param_area[0]!='\0') __crt0_setup_arguments(); dosemu_inithandles(); init_dir_stack(); diff --git a/programs/develop/libraries/menuetlibc/src/libc/pc_hw/timer/clock.c b/programs/develop/libraries/menuetlibc/src/libc/pc_hw/timer/clock.c index c8f39cfda6..6ebde15686 100644 --- a/programs/develop/libraries/menuetlibc/src/libc/pc_hw/timer/clock.c +++ b/programs/develop/libraries/menuetlibc/src/libc/pc_hw/timer/clock.c @@ -6,5 +6,7 @@ clock_t clock(void) { - return 0; + unsigned result; + __asm__ __volatile__("int $0x40" : "=a"(result) : "a"(26), "b"(9)); + return result; } diff --git a/programs/develop/libraries/menuetlibc/src/libcpp/Tupfile.lua b/programs/develop/libraries/menuetlibc/src/libcpp/Tupfile.lua index b7220a101f..d3f3e8b362 100644 --- a/programs/develop/libraries/menuetlibc/src/libcpp/Tupfile.lua +++ b/programs/develop/libraries/menuetlibc/src/libcpp/Tupfile.lua @@ -1,5 +1,5 @@ if tup.getconfig('NO_GCC') ~= "" then return end -CFLAGS = "-Os -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -fno-ident -fomit-frame-pointer -fno-asynchronous-unwind-tables -mpreferred-stack-boundary=2" +CFLAGS = "-Os -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -fno-ident -fomit-frame-pointer -fno-asynchronous-unwind-tables -mpreferred-stack-boundary=2 -march=pentium-mmx" OBJS = tup.foreach_rule({"*.cpp", extra_inputs = {"../../config.h"}}, 'kos32-gcc -c -I../../include -D__DEV_CONFIG_H=\\"../../config.h\\" ' .. CFLAGS .. " -o %o %f", "%B.o") diff --git a/programs/develop/libraries/menuetlibc/src/libm/Tupfile.lua b/programs/develop/libraries/menuetlibc/src/libm/Tupfile.lua index feeceeefe4..3c3a26936d 100644 --- a/programs/develop/libraries/menuetlibc/src/libm/Tupfile.lua +++ b/programs/develop/libraries/menuetlibc/src/libm/Tupfile.lua @@ -1,5 +1,5 @@ if tup.getconfig('NO_GCC') ~= "" then return end -CFLAGS="-D_USE_LIBM_MATH_H -Os -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -fno-ident -fomit-frame-pointer -fno-asynchronous-unwind-tables -mpreferred-stack-boundary=2" +CFLAGS="-D_USE_LIBM_MATH_H -Os -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -fno-ident -fomit-frame-pointer -fno-asynchronous-unwind-tables -mpreferred-stack-boundary=2 -march=pentium-mmx" OBJS = tup.foreach_rule({"*.c", extra_inputs = {"../../config.h"}}, 'kos32-gcc -c -I../../include -D__DEV_CONFIG_H=\\"../../config.h\\" ' .. CFLAGS .. ' -o %o %f', "%B.o") diff --git a/programs/develop/libraries/menuetlibc/src/libm/k_standa.c b/programs/develop/libraries/menuetlibc/src/libm/k_standa.c index 46b51624de..4b2f5ed766 100644 --- a/programs/develop/libraries/menuetlibc/src/libm/k_standa.c +++ b/programs/develop/libraries/menuetlibc/src/libm/k_standa.c @@ -28,7 +28,7 @@ static char rcsid[] = "$Id: k_standard.c,v 1.4 1994/08/10 20:31:44 jtc Exp $"; #undef fflush #endif /* !defined(_USE_WRITE) */ -inline int fputs(const char* str, FILE* f) { return -1; } +#define fputs /*nothing*/ #ifdef __STDC__ static const double zero = 0.0; /* used as const */ diff --git a/programs/games/checkers/trunk/board.h b/programs/games/checkers/trunk/board.h index 59f3edfb28..cb64f25fce 100644 --- a/programs/games/checkers/trunk/board.h +++ b/programs/games/checkers/trunk/board.h @@ -1,14 +1,12 @@ #ifndef _HEADER_BOARD_H #define _HEADER_BOARD_H -#ifndef __MENUET__ #include #include #include #include #include #include -#endif #include "position.h" #include "history.h" #include "gr-draw.h" @@ -527,7 +525,7 @@ int TChBoard::GetTextLineY() const return (y + height - delta_size.y) / 2; } -#ifdef BUILD_RUS +#ifdef LANG_RUS #define aCheckersGame "ˆ£à  ¢ è èª¨." #define aRedMoves "Šà á­ë¥ 室ïâ." #define aBlueMoves "‘¨­¨¥ 室ïâ." diff --git a/programs/games/checkers/trunk/buttons.h b/programs/games/checkers/trunk/buttons.h index ac0dbba432..a52790dc4a 100644 --- a/programs/games/checkers/trunk/buttons.h +++ b/programs/games/checkers/trunk/buttons.h @@ -1,11 +1,9 @@ #ifndef _HEADER_BUTTONS_H #define _HEADER_BUTTONS_H -#ifndef __MENUET__ #include #include #include -#endif #include "gr-draw.h" struct TXButton diff --git a/programs/games/checkers/trunk/checkers.cpp b/programs/games/checkers/trunk/checkers.cpp index e6c7e3ff79..210b396587 100644 --- a/programs/games/checkers/trunk/checkers.cpp +++ b/programs/games/checkers/trunk/checkers.cpp @@ -1,254 +1,32 @@ - -#ifndef AUTOBUILD -#include "lang.h" -#endif -//#define BUILD_RUS -#ifndef __MENUET__ +//#define LANG_RUS +#define NDEBUG #include #include #include #include #include -#else -#include -#include -using namespace Menuet; -#define strlen StrLen -#define strcpy StrCopy -#define memcpy MemCopy -#include -const unsigned dectab[] = { 1000000000, 100000000, 10000000, 1000000, 100000, - 10000, 1000, 100, 10, 0 }; -int sprintf( char *Str, char* Format, ... ) -{ - int i, fmtlinesize, j, k, flag; - unsigned head, tail; - char c; - va_list arglist; - // - va_start(arglist, Format); - // - fmtlinesize = strlen( Format ); - // - if( fmtlinesize == 0 ) return 0; - - // - for( i = 0, j = 0; i < fmtlinesize; i++ ) - { - // - c = Format[i]; - // - if( c != '%' ) - { - Str[j++] = c; - continue; - } - // - i++; - // - if( i >= fmtlinesize ) break; - - // - flag = 0; - // - c = Format[i]; - if (c == 'l') c = Format[++i]; - // - switch( c ) - { - // - case '%': - Str[j++] = c; - break; - // ˜„ Ÿ‰• - case 's': - char* str; - str = va_arg(arglist, char*); - for( k = 0; ( c = str[k] ) != 0; k++ ) - { - Str[j++] = c; - } - break; - // ˜„ Ÿ•‹Šž - case 'c': - Str[j++] = va_arg(arglist, int) & 0xFF; - break; - // ˜„ „ˆŒ– ŸŠž „…Ÿš•‚Œ‹ •„… - case 'u': - case 'd': - head = va_arg(arglist, unsigned); - for( k = 0; dectab[k] != 0; k++ ) - { - tail = head % dectab[k]; - head /= dectab[k]; - c = head + '0'; - if( c == '0' ) - { - if( flag ) Str[j++] = c; - } - else - { - flag++; - Str[j++] = c; - } - // - head = tail; - } - // - c = head + '0'; - Str[j++] = c; - break; - default: - break; - } - } - // - Str[j] = 0; - return j; -} -int isdigit(int c) +// sprintf is too heavy +int itoa(char* dst, int number) { - return (c>='0' && c<='9'); -} -int atoi(const char* string) -{ - int res=0; - int sign=0; - const char* ptr; - for (ptr=string; *ptr && *ptr<=' ';ptr++); - if (*ptr=='-') {sign=1;++ptr;} - while (*ptr >= '0' && *ptr <= '9') - { - res = res*10 + *ptr++ - '0'; + int result = 0; + if (number < 0) { + result++; + *dst++ = '-'; + number = -number; } - if (sign) res = -res; - return res; -} -int islower(int c) -{ - return (c>='a' && c<='z'); -} -int abs(int n) -{ - return (n<0)?-n:n; -} -int memcmp(const void* buf1, const void* buf2, unsigned count) -{ - const char* ptr1 = (const char*)buf1; - const char* ptr2 = (const char*)buf2; - unsigned i=0; - while (i' -#define XK_minus '-' -#define XK_equal '=' -#define XK_underscore '_' -#define XK_plus '+' -#define XK_Delete 0xB6 -#define XK_F8 0x39 -#define XK_l 'l' -#define XK_L 'L' -#define XK_F2 0x33 -#define XK_s 's' -#define XK_S 'S' -#define XK_slash '/' -#define XK_question '?' -#define XK_n 'n' -#define XK_N 'N' -#define XK_t 't' -#define XK_T 'T' -#define XK_r 'r' -#define XK_R 'R' -#define XK_b 'b' -#define XK_B 'B' -#define XK_f 'f' -#define XK_F 'F' -#define assert(a) /* nothing */ -#include "qsort.c" -#endif #include "gr-draw.h" #include "board.h" #include "player.h" @@ -272,7 +50,7 @@ public: void Add(const PlayWrite &pl); PlayWrite &operator[](int i) {return play[i];} int GetNPlay() const {return nplay;} -#ifndef __MENUET__ +#ifndef NO_FILES int OpenFile(const char *name, int kind); int MsgOpenFile(const char *name, int kind); int SaveFile(const char *name, int num, int kind); @@ -285,7 +63,7 @@ protected: PlayWrite *play; int nplay, mplay; protected: -#ifndef __MENUET__ +#ifndef NO_FILES static const char *const search[]; static int AnalizeKind(FILE *f, const int w[], const char *smb = 0); static int ReadFileTo(FILE *f, char c); @@ -294,8 +72,7 @@ protected: #endif }; -#ifndef __MENUET__ -#if LANG_RUS //Pending Russian Translations +#ifdef LANG_RUS //Pending Russian Translations #define CHECKERS_CANT_OPEN_STR "\n˜ èª¨: ¥ ¬®£ã ®âªàëâì ä ©« \"%s\".\n" #define CHECKERS_FILE_EMPTY_STR "\n˜ èª¨: ” ©« \"%s\" ¯ãáâ.\n" #define CHECKERS_INVALID_FILE_STR "\n˜ èª¨: ” ©« \"%s\" ®è¨¡®ç­ë©.\n" @@ -325,8 +102,10 @@ protected: #define EXIT_STR "exit" #define CHECKERS_INVALID_STR "Checkers: Invalid key %s\n" +#ifndef NO_FILES const char *const TPlayArray::search[] = {"checkers-", "play:", "text", "bin_1.0\n", "history_", "1.0", "1.1"}; +#endif #else /*For all other languages except RUS*/ #define CHECKERS_CANT_OPEN_STR "\nCheckers: Can't open the file \"%s\".\n" @@ -357,10 +136,12 @@ const char *const TPlayArray::search[] = #define ROTATE_BOARD_STR "rotate board" #define EXIT_STR "exit" #define CHECKERS_INVALID_STR "Checkers: Invalid key %s\n" + +#ifndef NO_FILES const char *const TPlayArray::search[] = {"checkers-", "play:", "text", "bin_1.0\n", "history_", "1.0", "1.1"}; - #endif + #endif void TPlayArray::Clear() { @@ -392,7 +173,7 @@ void TPlayArray::Add(const PlayWrite &pl) nplay++; } -#ifndef __MENUET__ +#ifndef NO_FILES int TPlayArray::AnalizeKind(FILE *f, const int w[], const char *smb) { int i, L, was1 = 1; @@ -880,22 +661,22 @@ protected: void TMainDraw::InitButton() { - char newgame_literal[] = NEW_GAME_STR; - char list_literal[] = LIST_STR; - char delete_literal[] = DELETE_STR; - char clear_literal[] = CLEAR_STR; - char save_literal[] = SAVE_STR; - char rotateboard_literal[] = ROTATE_BOARD_STR; - char exit_literal[] = EXIT_STR; + static char newgame_literal[] = NEW_GAME_STR; + static char list_literal[] = LIST_STR; + static char delete_literal[] = DELETE_STR; + static char clear_literal[] = CLEAR_STR; + static char save_literal[] = SAVE_STR; + static char rotateboard_literal[] = ROTATE_BOARD_STR; + static char exit_literal[] = EXIT_STR; - char one_literal[] = "1"; - char dash_literal[] = "-"; - char plus_literal[] = "+"; - char leftshift_literal[] = "<<"; - char rightshift_literal[] = ">>"; - char lessthan_literal[] = "<"; - char greaterthan_literal[] = ">"; - char xor_literal[] = "^"; + static char one_literal[] = "1"; + static char dash_literal[] = "-"; + static char plus_literal[] = "+"; + static char leftshift_literal[] = "<<"; + static char rightshift_literal[] = ">>"; + static char lessthan_literal[] = "<"; + static char greaterthan_literal[] = ">"; + static char xor_literal[] = "^"; button.Add(1, 80, 22, newgame_literal); button.Add(6, 60, 22, list_literal); @@ -909,7 +690,7 @@ void TMainDraw::InitButton() play_list->SetDefW(); button.Add(play_list); button.Add(24, 50, 22, clear_literal); -#ifndef __MENUET__ +#ifndef NO_FILES button.Add(25, 50, 22, save_literal); #endif button.Add(2, 120, 22, player_str[0]); @@ -970,7 +751,7 @@ void TMainDraw::SetButtonKind(const TChBoard &board) if (bt1) bt1->drw = is_drw; bt1 = button.GetButton(7); if (bt1) bt1->drw = !is_drw; -#ifndef __MENUET__ +#ifndef NO_FILES bt1 = button.GetButton(25); if (bt1) bt1->drw = !is_drw; #endif @@ -982,20 +763,18 @@ void TMainDraw::SetButtonKind(const TChBoard &board) if (is_drw) { play_num[0][0] = 0; play_num[1][0] = 0; - if (cur_play >= 0) sprintf(play_num[0], "%d", cur_play + 1); - sprintf(play_num[1], "%d", play.GetNPlay()); + if (cur_play >= 0) itoa(play_num[0], cur_play + 1); + itoa(play_num[1], play.GetNPlay()); thick = (cur_play <= 0) ? 0 : 3; -#define dynamic_cast static_cast - txb = dynamic_cast(play_list->a.GetButton(21)); + txb = static_cast(play_list->a.GetButton(21)); if (txb) txb->thick = thick; - txb = dynamic_cast(play_list->a.GetButton(26)); + txb = static_cast(play_list->a.GetButton(26)); if (txb) txb->thick = thick; thick = (cur_play >= play.GetNPlay() - 1) ? 0 : 3; - txb = dynamic_cast(play_list->a.GetButton(22)); + txb = static_cast(play_list->a.GetButton(22)); if (txb) txb->thick = thick; - txb = dynamic_cast(play_list->a.GetButton(27)); + txb = static_cast(play_list->a.GetButton(27)); if (txb) txb->thick = thick; -#undef dynamic_cast } } @@ -1073,7 +852,7 @@ void TMainDraw::PressLS(int n, TChBoard &board, TGraphDraw *drw) } } else if (n == 24) {play.Clear(); cur_play = 0; need_redraw = 1;} -#ifndef __MENUET__ +#ifndef NO_FILES else if (n == 25) { if (play.GetNPlay() > 0) play.MsgSaveFile(def_savefile, -1, def_savekind); @@ -1313,7 +1092,7 @@ int TMainData::EventFunction(const TGraphDraw::event &ev) else if (ev.key.k == XK_Delete) data.main_draw.PressLS(7, data.board, ev.button.drw); else if (ev.key.k == XK_F8) data.main_draw.PressLS(24, data.board, ev.button.drw); else if (ev.key.k == XK_l || ev.key.k == XK_L) data.main_draw.PressLS(6, data.board, ev.button.drw); -#ifndef __MENUET__ +#ifndef NO_FILES else if (ev.key.k == XK_F2) data.main_draw.PressLS(25, data.board, ev.button.drw); #endif else if (ev.key.k == XK_s || ev.key.k == XK_S) data.main_draw.PressLS(28, data.board, ev.button.drw); @@ -1342,11 +1121,12 @@ int TMainData::EventFunction(const TGraphDraw::event &ev) return ret; } -#ifndef __MENUET__ int main(int argc, char **argv) { randomize(); +#ifndef NO_FILES THistory::InitHFile(argv[0]); +#endif TMainData data(-1); if (argv && argc >= 2) { @@ -1376,7 +1156,9 @@ int main(int argc, char **argv) } else if (kx == 0 || kx == 1) { +#ifndef NO_FILES data.main_draw.play.MsgOpenFile(argv[i], -1); +#endif } } } @@ -1391,65 +1173,3 @@ int main(int argc, char **argv) 450 + 100 * ssf, 528); return 0; } -#else - -TMainData* mdata; -TMainGraphDraw* graph; - -bool MenuetOnStart(TStartData &me_start, TThreadData) -{ - mdata = new TMainData(-1); - graph = new TMainGraphDraw; - randomize(); - mdata->InitDef(); - static TTimerDraw timer_draw(&mdata->board, graph); - mdata->player.draw = TTimerDraw::draw; mdata->player.data = &timer_draw; - graph->data = mdata; - me_start.WinData.Title = CHECKERS_STR; - me_start.Width = 450 + 100*ssf; - me_start.Height = 528; - return true; -} -bool MenuetOnClose(TThreadData) -{ - delete mdata; - delete graph; - return true; -} -int MenuetOnIdle(TThreadData) -{return -1;} -void MenuetOnSize(int window_rect[], TThreadData) -{mdata->board.Resize(window_rect[2]-window_rect[0], window_rect[3]-window_rect[1]);} -void MenuetOnKeyPress(TThreadData) -{ - TGraphDraw::event ev; - ev.type = TGraphDraw::event::key_down; - ev.any.drw = graph; - ev.key.k = GetKey(); - mdata->EventFunction(ev); -} -void MenuetOnDraw(void) -{ - TGraphDraw::event ev; - ev.type = TGraphDraw::event::draw; - ev.any.drw = graph; - mdata->EventFunction(ev); -} -void MenuetOnMouse(TThreadData) -{ - short x,y; - GetMousePosition(x,y); - int m = GetMouseButton() & 1; - static int mprev = 0; - if (m == mprev) - return; - mprev = m; - TGraphDraw::event ev; - ev.type = m ? TGraphDraw::event::button_down : TGraphDraw::event::button_up; - ev.any.drw = graph; - ev.button.n = 1; - ev.button.x = x; - ev.button.y = y; - mdata->EventFunction(ev); -} -#endif diff --git a/programs/games/checkers/trunk/compile.txt b/programs/games/checkers/trunk/compile.txt index 43175c8c18..85c35812ba 100644 --- a/programs/games/checkers/trunk/compile.txt +++ b/programs/games/checkers/trunk/compile.txt @@ -1,18 +1,13 @@ 1. Êîìïèëÿöèÿ ïîä Êîëèáðè. -Äëÿ êîìïèëÿöèè íåîáõîäèì Borland C++ (èç âñåãî ïàêåòà íóæåí òîëüêî êîìïèëÿòîð -êîìàíäíîé ñòðîêè), à òàêæå FASM âåðñèè íå áîëåå 1.64. -cpp2asm.bat êîìïèëèðóåò Ñ++-èñõîäíèê â TASM-èñõîäíèê, - à ïîòîì ïðåâðàùàåò åãî â FASM-èñõîäíèê. -Ïîñëå ýòîãî, âîçìîæíî, ïîíàäîáèòñÿ ïåðåíåñòè â f_checkers.asm ñòðîêè ñ equ - â íà÷àëî ôàéëà. -Êîìïèëÿöèÿ áèíàðíèêà - êàê îáû÷íî, fasm f_checkers.asm checkers. +Ñòàíäàðòíàÿ äëÿ ïðîãðàìì, èñïîëüçóþùèõ menuetlibc. 2. Êîìïèëÿöèÿ ïîä Linux. Ïðîñòî ñêàæèòå make. Ïî êðàéíåé ìåðå â îäíîé Linux-ñèñòåìå ýòî ðàáîòàåò.  äðóãèõ ìîãóò ïîíàäîáèòüñÿ íåêîòîðûå èçìåíåíèÿ.  èñõîäíèêàõ ðóññêèå áóêâû çàïèñàíû â êîäèðîâêå DOS (cp866). Òàê ÷òî äëÿ -âðàçóìèòåëüíûõ ñîîáùåíèé ëèáî çàêîììåíòèðóéòå ïåðâóþ ñòðîêó â checkers.cpp -("#define BUILD_RUS"), ëèáî ïðîãîíèòå âñå *.cpp è *.h ôàéëû ÷åðåç dos2unix. +âðàçóìèòåëüíûõ ñîîáùåíèé íà ðóññêîì íóæíî, ïîìèìî ðàñêîììåíòèðîâàíèÿ ïåðâîé +ñòðîêè â checkers.cpp ("#define LANG_RUS"), +åù¸ ïðîãíàòü âñå *.cpp è *.h ôàéëû ÷åðåç dos2unix. 3. Êîìïèëÿöèÿ ïîä DOS/Windows. Äëÿ êîìïèëÿöèè íåîáõîäèì ïàêåò Borland C++ for DOS/Windows ñîîòâåòñòâåííî. diff --git a/programs/games/checkers/trunk/compile_eng.bat b/programs/games/checkers/trunk/compile_eng.bat deleted file mode 100644 index 97b98629dc..0000000000 --- a/programs/games/checkers/trunk/compile_eng.bat +++ /dev/null @@ -1,7 +0,0 @@ -del *.o - -echo #define LANG_ENG 1 > lang.h - -g++ -c checkers.cpp -g++ -L/usr/X11R6/lib -lX11 -o checkers checkers.o -pause \ No newline at end of file diff --git a/programs/games/checkers/trunk/compile_ru.bat b/programs/games/checkers/trunk/compile_ru.bat deleted file mode 100644 index 9aea44410b..0000000000 --- a/programs/games/checkers/trunk/compile_ru.bat +++ /dev/null @@ -1,7 +0,0 @@ -del *.o - -echo #define LANG_RUS 1 > lang.h - -g++ -c checkers.cpp -g++ -L/usr/X11R6/lib -lX11 -o checkers checkers.o -pause diff --git a/programs/games/checkers/trunk/cpp2asm.bat b/programs/games/checkers/trunk/cpp2asm.bat deleted file mode 100644 index 279fe4a332..0000000000 --- a/programs/games/checkers/trunk/cpp2asm.bat +++ /dev/null @@ -1,3 +0,0 @@ -bcc32 -S -v- -R- -6 -a4 -O2 -Og -Oi -Ov -OS -k- -x- -D__MENUET__ -Iinclude checkers.cpp -echo include "me_make.inc" > f_checkers.asm -t2fasm < checkers.asm >> f_checkers.asm \ No newline at end of file diff --git a/programs/games/checkers/trunk/dos-draw.h b/programs/games/checkers/trunk/dos-draw.h index b1d530f51b..c863d9a39c 100644 --- a/programs/games/checkers/trunk/dos-draw.h +++ b/programs/games/checkers/trunk/dos-draw.h @@ -10,8 +10,9 @@ #include #include -class TDosGraphDraw : public TGraphDraw +class TDosGraphDraw : public TBaseGraphDraw { + typedef TBaseGraphDraw TGraphDraw; public: TDosGraphDraw(const char *s = 0); ~TDosGraphDraw() {} diff --git a/programs/games/checkers/trunk/gnu-draw.h b/programs/games/checkers/trunk/gnu-draw.h index 5ef95207a9..dbac7d154b 100644 --- a/programs/games/checkers/trunk/gnu-draw.h +++ b/programs/games/checkers/trunk/gnu-draw.h @@ -8,8 +8,9 @@ #ifndef _GNU_GRAPHIC_DRAW_H #define _GNU_GRAPHIC_DRAW_H -class TGnuGraphDraw : public TGraphDraw +class TGnuGraphDraw : public TBaseGraphDraw { + typedef TBaseGraphDraw TGraphDraw; public: TGnuGraphDraw(const char *s = 0); ~TGnuGraphDraw(); diff --git a/programs/games/checkers/trunk/gr-draw.h b/programs/games/checkers/trunk/gr-draw.h index 4d86003f94..e0b3024de4 100644 --- a/programs/games/checkers/trunk/gr-draw.h +++ b/programs/games/checkers/trunk/gr-draw.h @@ -1,19 +1,15 @@ #ifndef _GRAPHIC_DRAW_H #define _GRAPHIC_DRAW_H -#ifndef __MENUET__ #include #include #ifdef _Windows # include #endif -#else -#define LONG_MIN (-2147483647L-1) /* minimum signed long value */ -#define INT_MIN LONG_MIN -#endif -class TGraphDraw +template +class TBaseGraphDraw { public: union event @@ -24,7 +20,7 @@ public: struct evany { evtype type; - TGraphDraw *drw; + TRealGraphDraw *drw; } any; struct evbutton : public evany @@ -43,41 +39,41 @@ public: enum {ret_setcapture = 0x10}; public: - TGraphDraw(const char *s = 0) : title(0), about_info(0), + TBaseGraphDraw(const char *s = 0) : title(0), about_info(0), evfunc(0), id(0), data(0) {CopyTitle(s);} - ~TGraphDraw() {FreeTitle();} + ~TBaseGraphDraw() {FreeTitle();} - virtual unsigned long GetBlackColor() {return 0;} - virtual unsigned long GetWhiteColor() {return 0xFFFFFFL;} - virtual unsigned long CreateColor(unsigned short red, + unsigned long GetBlackColor() {return 0;} + unsigned long GetWhiteColor() {return 0xFFFFFFL;} + unsigned long CreateColor(unsigned short red, unsigned short green, unsigned short blue); - virtual void FreeColor(unsigned long c) {} - virtual unsigned long GetBgColor() {return GetWhiteColor();} - virtual void SetBgColor(unsigned long c) {} + void FreeColor(unsigned long c) {} + unsigned long GetBgColor() {return GetWhiteColor();} + void SetBgColor(unsigned long c) {} - virtual void SetTitle(const char *s) {CopyTitle(s);} + void SetTitle(const char *s) {CopyTitle(s);} const char *GetTitle() const {return title;} - virtual int GetStatus() {return 0;} //1 - can draw, 0 - can't draw, <0 - error - virtual int Init() {return 0;} - virtual void UnInit() {} - virtual int Run(int evmask = 0, int w = INT_MIN, int h = INT_MIN) {return -100;} + int GetStatus() {return 0;} //1 - can draw, 0 - can't draw, <0 - error + int Init() {return 0;} + void UnInit() {} + int Run(int evmask = 0, int w = INT_MIN, int h = INT_MIN) {return -100;} - virtual void GetSize(int &w, int &h) {w = 200; h = 200;} - virtual int OpenDraw() {return 0;} - virtual int IsDraw() {return 0;} - virtual void CloseDraw() {} + void GetSize(int &w, int &h) {w = 200; h = 200;} + int OpenDraw() {return 0;} + int IsDraw() {return 0;} + void CloseDraw() {} - virtual int SetColor(unsigned long c) {return 0;} - virtual int DrawLine(int x0, int y0, int x1, int y1) {return 0;} - virtual int DrawText(int x0, int y0, char *text) {return 0;} - virtual int DrawClear() {return 0;} - virtual int GetTextH(const char *s) {return 16;} - virtual int GetTextW(const char *s) {return 8 * strlen(s);} - virtual void Quit(int q = 1) {} - virtual void ResReinit(int w = INT_MIN, int h = INT_MIN) {} - virtual int GetAboutInfo() {return about_info;} - virtual void SetAboutInfo(int inf) {about_info = inf;} + int SetColor(unsigned long c) {return 0;} + int DrawLine(int x0, int y0, int x1, int y1) {return 0;} + int DrawText(int x0, int y0, char *text) {return 0;} + int DrawClear() {return 0;} + int GetTextH(const char *s) {return 16;} + int GetTextW(const char *s) {return 8 * strlen(s);} + void Quit(int q = 1) {} + void ResReinit(int w = INT_MIN, int h = INT_MIN) {} + int GetAboutInfo() {return about_info;} + void SetAboutInfo(int inf) {about_info = inf;} protected: void FreeTitle() {if (title) {delete[] title; title = 0;}} void CopyTitle(const char *s); @@ -89,25 +85,27 @@ public: void *data; }; -unsigned long TGraphDraw::CreateColor(unsigned short red, +template +unsigned long TBaseGraphDraw::CreateColor(unsigned short red, unsigned short green, unsigned short blue) { return (unsigned long)(red >> 8) + ((unsigned long)(green >> 8) << 8) + ((unsigned long)(blue >> 8) << 16); } -void TGraphDraw::CopyTitle(const char *s) +template +void TBaseGraphDraw::CopyTitle(const char *s) { FreeTitle(); if (s) {title = new char[strlen(s) + 1]; strcpy(title, s);} } -#if defined __GNUC__ +#if defined _KOLIBRI +# include "kolibri-draw.h" + typedef TKlbrGraphDraw TMainGraphDraw; +#elif defined __GNUC__ # include "gnu-draw.h" typedef TGnuGraphDraw TMainGraphDraw; -#elif defined __MENUET__ -# include "mt-draw.h" - typedef TKlbrGraphDraw TMainGraphDraw; #elif defined _Windows # include "win-draw.h" typedef TWinGraphDraw TMainGraphDraw; @@ -115,7 +113,8 @@ void TGraphDraw::CopyTitle(const char *s) # include "dos-draw.h" typedef TDosGraphDraw TMainGraphDraw; #else - typedef TGraphDraw TMainGraphDraw; +#error "Unknown platform" #endif +typedef TMainGraphDraw TGraphDraw; #endif //_GRAPHIC_DRAW_H diff --git a/programs/games/checkers/trunk/history.h b/programs/games/checkers/trunk/history.h index 5ba1f7199d..6aa6f17f59 100644 --- a/programs/games/checkers/trunk/history.h +++ b/programs/games/checkers/trunk/history.h @@ -1,19 +1,13 @@ #ifndef _HEADER_HISTORY_H #define _HEADER_HISTORY_H -#ifndef __MENUET__ -#include -#include -#include -#include -#endif #include "position.h" #include "hash.h" #include "sysproc.h" class THistory { -#ifndef __MENUET__ +#ifndef NO_FILES public: static char FileName[1024]; #endif @@ -27,7 +21,7 @@ public: int Move(const Position &pos, const unsigned char mv[], int nmove) const; int Play(const PlayWrite &play) const; -#ifndef __MENUET__ +#ifndef NO_FILES static int InitHFile(char *dname = 0); static int HRead(FILE *f, PlayWrite *&play); protected: @@ -119,12 +113,12 @@ protected: }; }; -#ifndef __MENUET__ +#ifndef NO_FILES char THistory::FileName[1024] = "history.che"; #endif int THistory::NHid = 0; -#ifndef __MENUET__ +#ifndef NO_FILES int THistory::Print(const char *str) const { char *line = new char[30 + strlen(str)]; @@ -150,9 +144,9 @@ int THistory::Print(const char *str) const int THistory::Start(const Position &pos) const { +#ifndef NO_FILES char str[20 + NUM_CELL] = "Start "; if (!pos.Write(str + strlen(str), 1)) return 0; -#ifndef __MENUET__ if (!Print(str)) return 0; #endif return 1; @@ -160,14 +154,14 @@ int THistory::Start(const Position &pos) const int THistory::Move(const Position &pos, const unsigned char mv[], int nmove) const { +#ifndef NO_FILES char *str = new char[15 + pos.GetLenMvEx(mv, 11)]; if (!str) return 0; sprintf(str, "%d.%s ", (nmove + 1) / 2, (nmove % 2 == 0) ? ".." : ""); pos.WriteMvEx(mv, str + strlen(str), 11); -#ifndef __MENUET__ if (!Print(str)) {delete[] str; return 0;} -#endif delete[] str; +#endif return 1; } @@ -188,7 +182,7 @@ int THistory::Play(const PlayWrite &play) const return 1; } -#ifndef __MENUET__ +#ifndef NO_FILES int THistory::InitHFile(char *dname) { if (dname && dname[0]) @@ -262,7 +256,7 @@ int THistory::THash::operator()(const TStr &str) const return r; } -#ifndef __MENUET__ +#ifndef NO_FILES int THistory::HRead(FILE *f, PlayWrite *&play) { const int MAX_INP_WORD = 100; diff --git a/programs/games/checkers/trunk/include/me_func.inc b/programs/games/checkers/trunk/include/me_func.inc deleted file mode 100644 index f0fab935ce..0000000000 --- a/programs/games/checkers/trunk/include/me_func.inc +++ /dev/null @@ -1,1135 +0,0 @@ -;const int -MENUET_BORDER_SIZE = 4; -;const int -MENUET_HEADER_SIZE = 20; - -;const int -MENUET_THREAD_DATA_USER = 0; // Thread data begin from the user dword -;const int -MENUET_THREAD_DATA_ST_BEGIN = 1; // Stack beginning follows after the user dword -;const int -MENUET_THREAD_DATA_NEXT = 2; -;const int -MENUET_THREAD_DATA_PID = 3; -;const int -MENUET_THREAD_DATA_FLAG = 4; -;const int -MENUET_THREAD_DATA_X = 5; -;const int -MENUET_THREAD_DATA_Y = 6; -;const int -MENUET_THREAD_DATA_C_WINDOW = 7; -;const int -MENUET_THREAD_DATA_C_HEADER = 8; -;const int -MENUET_THREAD_DATA_C_BORDER = 9; -;const int -MENUET_THREAD_DATA_C_TITLE = 10; -;const int -MENUET_THREAD_DATA_TITLE = 11; -;const int -MENUET_THREAD_DATA_PICTURE = 12; -;const int -MENUET_THREAD_DATA_SZ_PICT = 13; -;const int -MENUET_THREAD_DATA_LAST_SX = 14; -;const int -MENUET_THREAD_DATA_LAST_SY = 15; -;const int -MENUET_THREAD_DATA_LEN = 16; - -;const int -MENUET_MUTEX_MAX_TIME_WAIT = 20; - -;const int -MENUET_FILE_BLOCK_SIZE = 512; - -;const int -MENUET_FILE_MEMORY_OS_NEED = 4096; - -;/*** - -macro segment name -{ - segment name - if name eq _init_ | name eq _INIT_ -Menuet_SegmentInit: - else if name eq _exit_ | name eq _EXIT_ -Menuet_SegmentExit: - end if -} - -macro endseg name -{ - if name eq _init_ | name eq _INIT_ -Menuet_SegmentInitEnd: - else if name eq _exit_ | name eq _EXIT_ -Menuet_SegmentExitEnd: - end if - endseg name -} - -macro Menuet_Put_MovEaxVal_Ret address,val -{ - mov byte [address],0xB8 - mov dword [address+4],0xC089C300 - mov dword [address+1],val -} - -define @Menuet@Main$qv -nextdef MenuetEntryPoint - and esp,not 3 - sub esp,1024 - mov eax,9 - mov ebx,esp - mov ecx,-1 - int 0x40 - mov ebx,[esp+26] - mov edx,[esp+30] - lea eax,[ebx-0x20] - add esp,1024 - cmp esp,eax - cmova esp,eax - and esp,not 3 - xor eax,eax - cld - mov edi,@Menuet@_ThreadTable - mov ecx,256 - rep stos dword [edi] - mov esi,@Menuet@GetPid$qv - mov edi,@Menuet@_ThreadSavedBegProc - movs dword [edi],[esi] - movs dword [edi],[esi] - mov esi,@Menuet@GetThreadData$qv - movs dword [edi],[esi] - movs dword [edi],[esi] - Menuet_Put_MovEaxVal_Ret @Menuet@GetPid$qv,edx -if defined MenuetHeapInit - mov ecx,esp - push ebx - push ecx - push U_END - call MenuetHeapInit ; Initialize a dynamic heap and create new memory in its begin. - pop ecx ; Parameters: begin of a new heap, end of data to create in - mov [esp+4],eax ; the begin of a heap. Return address of the created data. - mov dword [esp],0 -else - xor eax,eax - push eax - push eax -end if - call @Menuet@ThreadMain$qpvt1 -nextdef Menuet_ThreadFinish - add esp,8 -if defined MenuetHeapFreeAndThreadFinish - test eax,eax - jz Menuet_ThreadFinish_end - push dword @Menuet@_ExitProcessNow - push eax - call MenuetHeapFreeAndThreadFinish ; Free the given memory and finish the thread, -end if ; should exit process if second argument points to not zero. -Menuet_ThreadFinish_end: - or eax,-1 - int 0x40 -enddef - -define @Menuet@ThreadMain$qpvt1 - xchg ebx,[esp+4] - xchg ebp,[esp+8] - push esi - push edi - sub esp,MENUET_THREAD_DATA_LEN*4 - mov [esp],ebx - mov [esp+4],ebp - mov eax,40 - mov ebx,0x27 - int 0x40 - mov ebx,esp - cmp byte [@Menuet@_ThreadSavedBegProc],0x90 - jz Menuet_main_else_first_check - Menuet_Put_MovEaxVal_Ret @Menuet@GetThreadData$qv,esp -if defined Menuet_SegmentInit & defined Menuet_SegmentInitEnd - push Menuet_SegmentInitEnd - push Menuet_SegmentInit - jmp Menuet_main_after_first_check -end if -Menuet_main_else_first_check: - xor eax,eax - push eax - push eax -Menuet_main_after_first_check: - push ebx - call @@Menuet@_CallStart$qppvpvt2 - add esp,12 - test al,al - jnz Menuet_main_test_close_first - jmp Menuet_main_end -Menuet_main_close_first: - btr dword [esp+MENUET_THREAD_DATA_FLAG*4],31 - push esp - call @@MenuetOnClose$qppv - pop ecx - test al,al - jnz Menuet_main_end -Menuet_main_test_close_first: - cmp dword [esp+MENUET_THREAD_DATA_FLAG*4],0 - jl Menuet_main_close_first -; push esp -; push dword 1 -; call @Menuet@Redraw$qippv -; add esp,8 -Menuet_main_paint_msg: - or dword [esp+MENUET_THREAD_DATA_FLAG*4],3 - sub esp,1024 - mov eax,9 - mov ebx,esp - mov ecx,-1 - int 0x40 - mov eax,[esp+34] - mov ebx,[esp+38] - mov ecx,[esp+42] - mov edx,[esp+46] - add esp,1024 - cmp ecx,[esp+MENUET_THREAD_DATA_LAST_SX*4] - jnz Menuet_main_size - cmp edx,[esp+MENUET_THREAD_DATA_LAST_SY*4] - jz Menuet_main_paint -Menuet_main_size: - mov [esp+MENUET_THREAD_DATA_LAST_SX*4],ecx - mov [esp+MENUET_THREAD_DATA_LAST_SY*4],edx - push edx - push ecx - push ebx - push eax - lea ecx,[esp+16] - mov edx,esp - push ecx - push edx - call @@MenuetOnSize$qpippv - add esp,24 - test dword [esp+MENUET_THREAD_DATA_FLAG*4],3 - jz Menuet_main_cycle -Menuet_main_paint: - cmp dword [esp+MENUET_THREAD_DATA_FLAG*4],0 - jl Menuet_main_close - push esp - push dword 0 - call @Menuet@Redraw$qippv - add esp,8 -Menuet_main_cycle: - mov eax,11 -Menuet_main_message: - cmp dword [esp+MENUET_THREAD_DATA_FLAG*4],0 - jl Menuet_main_close - int 0x40 - test eax,eax - jnz Menuet_main_on_message - cmp dword [esp+MENUET_THREAD_DATA_FLAG*4],0 - jne Menuet_main_paint - push esp - call @@MenuetOnIdle$qppv - pop ecx - test eax,eax - jz Menuet_main_cycle - jl Menuet_main_wait_message - mov ebx,eax - mov eax,23 - jmp Menuet_main_message -Menuet_main_wait_message: - mov eax,10 - jmp Menuet_main_message -Menuet_main_key_press: - push esp - call @@MenuetOnKeyPress$qppv - pop ecx - jmp Menuet_main_cycle -Menuet_main_mouse: - push esp - call @@MenuetOnMouse$qppv - pop ecx - jmp Menuet_main_cycle -Menuet_main_on_message: - dec eax - jz Menuet_main_paint_msg - dec eax - jz Menuet_main_key_press - cmp eax,4 - jz Menuet_main_mouse - dec eax - jnz Menuet_main_cycle -Menuet_main_button: - mov eax,17 - int 0x40 - test al,al - jnz Menuet_main_cycle -Menuet_main_close: - btr dword [esp+MENUET_THREAD_DATA_FLAG*4],31 - push esp - call @@MenuetOnClose$qppv - pop ecx - test al,al - jz Menuet_main_button -Menuet_main_end: - mov ebx,esp - lock dec dword [@Menuet@_ThreadNumber] -if defined Menuet_SegmentExit & defined Menuet_SegmentExitEnd - jnz Menuet_main_else_last_check - push Menuet_SegmentExitEnd - push Menuet_SegmentExit - jmp Menuet_main_after_last_check -end if -Menuet_main_else_last_check: - xor eax,eax - push eax - push eax -Menuet_main_after_last_check: - push ebx - call @@Menuet@_RemoveThreadData$qppvpvt2 - add esp,12 - lock inc dword [@Menuet@_ThreadScanCount+4] - mov ebx,1 - jmp Menuet_main_end_wait -Menuet_main_end_wait_loop: - mov eax,5 - int 0x40 - shl ebx,1 - cmp ebx,MENUET_MUTEX_MAX_TIME_WAIT - jna Menuet_main_end_wait - mov ebx,MENUET_MUTEX_MAX_TIME_WAIT -Menuet_main_end_wait: - cmp dword [@Menuet@_ExitProcessNow],0 - jnz @Menuet@ExitProcess$qv - cmp dword [@Menuet@_ThreadScanCount],0 - jnz Menuet_main_end_wait_loop - lock dec dword [@Menuet@_ThreadScanCount+4] - mov ebp,[esp+4] - mov ebx,[esp] - add esp,MENUET_THREAD_DATA_LEN*4 - mov eax,ebp - pop edi - pop esi - xchg ebp,[esp+8] - xchg ebx,[esp+4] - ret -enddef - -macro call func -{ - if func eq __chkstk - sub esp,eax - else - call func - end if -} - -define @Menuet@Redraw$qippv - push ebp - mov ebp,[esp+12] - mov edx,[ebp+MENUET_THREAD_DATA_FLAG*4] - cmp dword [esp+8],0 - jl Menuet_redraw_only_inv - jz Menuet_redraw_no_frame - or dl,2 -Menuet_redraw_no_frame: - bt edx,30 - jnc Menuet_redraw_begin - or dl,1 - mov [ebp+MENUET_THREAD_DATA_FLAG*4],edx - jmp Menuet_redraw_end -Menuet_redraw_only_inv: - test dl,3 - jnz Menuet_redraw_no_frame -Menuet_redraw_end: - pop ebp - ret -Menuet_redraw_begin: - push ebx - push esi - push edi - and dword [ebp+MENUET_THREAD_DATA_FLAG*4],0xFFFFFFFC - mov eax,12 - mov ebx,1 - int 0x40 - test dl,2 - jz Menuet_redraw_picture - push 48 - pop eax - push 4 - pop ebx - int 0x40 - mov ebx,[ebp+MENUET_THREAD_DATA_X*4] - add ebx,2*5-1 - mov ecx,[ebp+MENUET_THREAD_DATA_Y*4] - add cx,ax - add ecx,5-1 - mov edx,[ebp+MENUET_THREAD_DATA_C_WINDOW*4] -; mov esi,[ebp+MENUET_THREAD_DATA_C_HEADER*4] -; mov edi,[ebp+MENUET_THREAD_DATA_C_BORDER*4] - mov edi,[ebp+MENUET_THREAD_DATA_TITLE*4] - xor eax,eax - int 0x40 -; mov edx,[ebp+MENUET_THREAD_DATA_TITLE*4] -; test edx,edx -; jz Menuet_redraw_picture -; mov edi,edx -; mov ecx,0xFFFFFFFF -; xor al,al -; cld -; repnz scas byte [edi] -; not ecx -; mov esi,ecx -; dec esi -; jz Menuet_redraw_picture -; mov eax,4 -; mov ebx,0x00070007 -; mov ecx,[ebp+MENUET_THREAD_DATA_C_TITLE*4] -; int 0x40 -Menuet_redraw_picture: -; mov esi,[ebp+MENUET_THREAD_DATA_PICTURE*4] -; test esi,esi -; jz Menuet_redraw_end_draw -; mov ecx,[ebp+MENUET_THREAD_DATA_SZ_PICT*4] -; jecxz Menuet_redraw_end_draw -; mov al,byte [ebp+MENUET_THREAD_DATA_C_WINDOW*4+3] -; and al,15 -; mov edx,MENUET_BORDER_SIZE*65536+MENUET_HEADER_SIZE -; cmp al,3 -; jnz Menuet_redraw_no_skin -; mov eax,48 -; mov ebx,4 -; int 0x40 -; mov dx,ax -;Menuet_redraw_no_skin: -; mov eax,7 -; mov ebx,esi -; int 0x40 - call @@MenuetOnDraw$qv -Menuet_redraw_end_draw: - mov eax,12 - mov ebx,2 - int 0x40 - pop edi - pop esi - pop ebx - pop ebp - ret -enddef - -define @Menuet@MoveWindow$qxpxi - push ebx - push esi - mov eax,[esp+12] - mov ebx,[eax] - mov ecx,[eax+4] - mov edx,[eax+8] - mov esi,[eax+12] - mov eax,67 - int 0x40 - pop esi - pop ebx - ret -enddef - -define @Menuet@Abort$qv - push dword [@Menuet@DebugPrefix] - call @Menuet@DebugPutString$qpxc - mov dword [esp],Menuet_abort_string - call @Menuet@DebugPutString$qpxc - pop ecx -nextdef @Menuet@ExitProcess$qv - lock bts dword [@Menuet@_ExitProcessNow],0 - jc Menuet_exit_process_wait - sub esp,1024 - mov eax,9 - mov ebx,esp - mov ecx,-1 - int 0x40 - mov esi,eax - mov edi,[esp+30] -Menuet_exit_process_loop: - mov eax,9 - mov ebx,esp - mov ecx,esi - int 0x40 - mov eax,[esp+30] - cmp eax,edi - jz Menuet_exit_process_continue - mov ebx,eax - or bl,15 - inc ebx - jz Menuet_exit_process_continue - mov ebx,eax - call Menuet_HashInt - movzx eax,al - mov eax,dword [@Menuet@_ThreadTable+eax*4] - jmp Menuet_exit_process_test -Menuet_exit_process_next: - mov eax,dword [eax+MENUET_THREAD_DATA_NEXT*4] -Menuet_exit_process_test: - test eax,eax - jz Menuet_exit_process_continue - cmp ebx,[eax+MENUET_THREAD_DATA_PID*4] - jnz Menuet_exit_process_next - mov eax,18 - mov ebx,2 - mov ecx,esi - int 0x40 -Menuet_exit_process_continue: - dec esi - jnl Menuet_exit_process_loop - add esp,1024 - mov dword [@Menuet@_ExitProcessNow],-1 -if defined EMULATOR - int3 - call 0x76543210 -end if -Menuet_exit_process_end: - mov dword [@Menuet@_ThreadMutex],0 - or eax,-1 - int 0x40 -Menuet_exit_process_wait: - mov eax,5 - mov ebx,1 -Menuet_exit_process_wait_loop: - cmp dword [@Menuet@_ExitProcessNow],0 - jl Menuet_exit_process_end - int 0x40 - shl ebx,1 - cmp ebx,MENUET_MUTEX_MAX_TIME_WAIT - jna Menuet_exit_process_wait_loop - mov ebx,MENUET_MUTEX_MAX_TIME_WAIT - jmp Menuet_exit_process_wait_loop -enddef - -define @Menuet@ExitThread$qppv,@Menuet@ThreadMain$qpvt1 - mov esp,[esp+4] - jmp Menuet_main_end -enddef - -define @Menuet@ReturnMessageLoop$qppv,@Menuet@ThreadMain$qpvt1 - mov esp,[esp+4] - bt dword [esp+MENUET_THREAD_DATA_FLAG*4],30 - jc Menuet_main_end - jmp Menuet_main_cycle -enddef - -define @Menuet@Delay$qui - push ebx - mov eax,5 - mov ebx,[esp+8] - int 0x40 - pop ebx - ret -enddef - -define @Menuet@Clock$qv - push ebx - mov eax,26 - mov ebx,9 - int 0x40 - pop ebx - ret -enddef - -define @Menuet@GetPackedTime$qv - mov eax,3 - int 0x40 - ret -enddef - -define @Menuet@GetTime$qpi - mov eax,3 - int 0x40 - mov edx,[esp+4] - movzx ecx,al - shr ecx,4 - and al,0x0F - imul ecx,10 - add cl,al - mov dword [edx+8],ecx - mov cl,ah - shr ecx,4 - and ah,0x0F - imul ecx,10 - add cl,ah - mov dword [edx+4],ecx - bswap eax - mov cl,ah - shr ecx,4 - and ah,0x0F - imul ecx,10 - add cl,ah - mov dword [edx],ecx - ret -enddef - -define @Menuet@GetPackedDate$qv - mov eax,29 - int 0x40 - ret -enddef - -define @Menuet@GetDate$qpi - mov eax,29 - int 0x40 - mov edx,[esp+4] - movzx ecx,al - shr ecx,4 - and al,0x0F - imul ecx,10 - add cl,al - mov dword [edx+4],ecx - mov cl,ah - shr ecx,4 - and ah,0x0F - imul ecx,10 - add cl,ah - mov dword [edx],ecx - bswap eax - mov cl,ah - shr ecx,4 - and ah,0x0F - imul ecx,10 - add cl,ah - mov dword [edx+8],ecx - ret -enddef - -define @Menuet@ReadCommonColors$qpui - push ebx - mov eax,48 - mov ebx,3 - mov ecx,[esp+8] - mov edx,40 - int 0x40 - pop ebx - ret -enddef - -define @Menuet@GetProcessInfo$qpuipct1t1piui - push ebx - push esi - push edi - sub esp,1024 - mov eax,9 - mov ebx,esp - mov ecx,[1024+12+24+esp] - int 0x40 - xor edi,edi - or edi,[1024+12+4+esp] - jz Menuet_get_proc_info_no_usecpu - mov ecx,[esp] - mov [edi],ecx - xor edi,edi -Menuet_get_proc_info_no_usecpu: - or edi,[1024+12+8+esp] - jz Menuet_get_proc_info_no_name - lea esi,[esp+10] - cld - movs dword [edi],[esi] - movs dword [edi],[esi] - movs dword [edi],[esi] - mov byte [edi],0 - xor edi,edi -Menuet_get_proc_info_no_name: - or edi,[1024+12+12+esp] - jz Menuet_get_proc_info_no_mem - mov ecx,[esp+26] - mov [edi],ecx - xor edi,edi -Menuet_get_proc_info_no_mem: - or edi,[1024+12+16+esp] - jz Menuet_get_proc_info_no_pid - mov ecx,[esp+30] - mov [edi],ecx - xor edi,edi -Menuet_get_proc_info_no_pid: - or edi,[1024+12+20+esp] - jz Menuet_get_proc_info_no_rect - lea esi,[esp+34] - cld - movs dword [edi],[esi] - movs dword [edi],[esi] - movs dword [edi],[esi] - movs dword [edi],[esi] - xor edi,edi -Menuet_get_proc_info_no_rect: - add esp,1024 - pop edi - pop esi - pop ebx - ret -enddef - -define @Menuet@GetPid$qv - push ebx - sub esp,1024 - mov eax,9 - mov ebx,esp - mov ecx,-1 - int 0x40 - mov eax,[esp+30] - add esp,1024 - pop ebx - ret -enddef - -define @Menuet@GetPid$qppv - mov ecx,[esp+4] - mov eax,[ecx+MENUET_THREAD_DATA_PID*4] - ret -enddef - -define @Menuet@_HashByte$qui -nextdef @Menuet@_HashWord$qui -nextdef @Menuet@_HashDword$qui - mov eax,[esp+4] -nextdef Menuet_HashInt - mul dword [Menuet_hash_int_val0] - xor eax,edx - bswap eax - mul dword [Menuet_hash_int_val1] - shrd eax,edx,14 - bswap eax - lea eax,[eax+4*eax] - ror eax,9 - ret -Menuet_hash_int_val0: - dd 0xA82F94C5 -Menuet_hash_int_val1: - dd 0x9193780B -enddef - -define @Menuet@GetThreadData$qv - call @Menuet@GetPid$qv - push eax - call @Menuet@GetThreadData$qui - pop ecx - ret -enddef - -define @Menuet@GetThreadData$qui - mov eax,[esp+4] - call Menuet_HashInt - movzx eax,al - cmp dword [@Menuet@_ThreadScanCount+4],0 - jnz Menuet_get_thread_data_wait -Menuet_get_thread_data_nowait: - lock inc dword [@Menuet@_ThreadScanCount] - mov eax,dword [@Menuet@_ThreadTable+eax*4] - mov ecx,[esp+4] - jmp Menuet_get_thread_data_test -Menuet_get_thread_data_loop: - mov eax,dword [eax+MENUET_THREAD_DATA_NEXT*4] -Menuet_get_thread_data_test: - test eax,eax - jz Menuet_get_thread_data_end - cmp ecx,[eax+MENUET_THREAD_DATA_PID*4] - jnz Menuet_get_thread_data_loop -Menuet_get_thread_data_end: - lock dec dword [@Menuet@_ThreadScanCount] - ret -Menuet_get_thread_data_wait: - push eax - push ebx - mov eax,5 - mov ebx,1 -Menuet_get_thread_data_wait_loop: - int 0x40 - cmp dword [@Menuet@_ThreadScanCount+4],0 - jz Menuet_get_thread_data_wait_end - shl ebx,1 - cmp ebx,MENUET_MUTEX_MAX_TIME_WAIT - jna Menuet_get_thread_data_wait_loop - mov ebx,MENUET_MUTEX_MAX_TIME_WAIT - jmp Menuet_get_thread_data_wait_loop -Menuet_get_thread_data_wait_end: - pop ebx - pop eax - jmp Menuet_get_thread_data_nowait -enddef - -define @Menuet@_GetSkinHeader$qv - push ebx - mov eax,48 - mov ebx,4 - int 0x40 - pop ebx - ret -enddef - -define @Menuet@GetScreenSize$qrust1 - mov eax,14 - int 0x40 - mov ecx,[esp+8] - mov word [ecx],ax - mov ecx,[esp+4] - shr eax,16 - mov word [ecx],ax - ret -enddef - -define Menuet_MutexLockNoWait - pop eax - xor al,al - ret -enddef - -define Menuet_MutexLockWait - push ebx - mov eax,5 - xor ebx,ebx -Menuet_lock_wait_cycle: - int 0x40 - shl byte [ecx],1 - jz Menuet_lock_wait_cycle - pop ebx - mov al,1 - ret -enddef - -define Menuet_MutexLockWaitTime - cmp dword [esp+12],0 - jng Menuet_MutexLockWait - push ebx - push edx - mov edx,[esp+20] - mov eax,26 - mov ebx,9 - int 0x40 - add edx,eax -Menuet_lock_wait_time_cycle: - mov eax,5 - xor ebx,ebx - int 0x40 - shl byte [ecx],1 - jnz Menuet_lock_wait_time_ret_true - mov eax,26 - mov ebx,9 - int 0x40 - cmp eax,edx - js Menuet_lock_wait_time_cycle - pop edx - pop ebx - pop eax - xor al,al - ret -Menuet_lock_wait_time_ret_true: - pop edx - pop ebx - mov al,1 - ret -enddef - -define Menuet_MutexLock - shl byte [ecx],1 - jnz Menuet_lock_first - call eax -Menuet_lock_first: - mov al,1 - ret -enddef - -define @Menuet@TryLock$qp13Menuet@TMutex - mov eax,Menuet_MutexLockNoWait - mov ecx,[esp+4] - jmp Menuet_MutexLock -enddef - -define @Menuet@Lock$qp13Menuet@TMutex - mov eax,Menuet_MutexLockWait - mov ecx,[esp+4] - jmp Menuet_MutexLock -enddef - -define @Menuet@LockTime$qp13Menuet@TMutexi - mov eax,Menuet_MutexLockWaitTime - mov ecx,[esp+4] - jmp Menuet_MutexLock -enddef - -define @Menuet@UnLock$qp13Menuet@TMutex - mov ecx,[esp+4] - shr byte [ecx],1 - jz Menuet_unlock_pause - ret -Menuet_unlock_pause: - mov byte [ecx],0x40 - push ebx - mov eax,5 - xor ebx,ebx - int 0x40 - pop ebx - ret -enddef - -define Menuet_MutexLockRec - shl byte [ecx],1 - jng Menuet_lock_first - cmp dword [ecx+4],edx - jz Menuet_lock_rec_self - call eax -Menuet_lock_rec_first: - mov al,1 - mov dword [ecx+4],edx - ret -Menuet_lock_rec_self: - mov al,1 - add dword [ecx],0x100 - jc Menuet_lock_rec_overflow - ret -Menuet_lock_rec_overflow: - push dword [@Menuet@DebugPrefix] - call @Menuet@DebugPutString$qpxc - mov dword [esp],Menuet_try_lock_rec_overflow_string - call @Menuet@DebugPutString$qpxc - pop ecx - jmp @Menuet@Abort$qv -enddef - -define @Menuet@TryLock$qp16Menuet@TRecMutexui - mov eax,Menuet_MutexLockNoWait - mov ecx,[esp+4] - mov edx,[esp+8] - jmp Menuet_MutexLockRec -enddef - -define @Menuet@Lock$qp16Menuet@TRecMutexui - mov eax,Menuet_MutexLockWait - mov ecx,[esp+4] - mov edx,[esp+8] - jmp Menuet_MutexLockRec -enddef - -define @Menuet@LockTime$qp16Menuet@TRecMutexiui - mov eax,Menuet_MutexLockWaitTime - mov ecx,[esp+4] - mov edx,[esp+12] - jmp Menuet_MutexLockRec -enddef - -define @Menuet@UnLock$qp16Menuet@TRecMutexui - mov ecx,[esp+4] - mov edx,[esp+8] - cmp dword [ecx+4],edx - jnz Menuet_unlock_rec_notlocked - sub dword [ecx],0x100 - jnc Menuet_unlock_rec_end - add dword [ecx],0x100 - shl byte [ecx],1 - shr byte [ecx],2 - jng Menuet_unlock_rec_pause -Menuet_unlock_rec_end: - ret -Menuet_unlock_rec_pause: - mov byte [ecx],0x20 - push ebx - mov eax,5 - xor ebx,ebx - int 0x40 - pop ebx - ret -Menuet_unlock_rec_notlocked: - push dword [@Menuet@DebugPrefix] - call @Menuet@DebugPutString$qpxc - mov dword [esp],Menuet_unlock_rec_notlocked_string - call @Menuet@DebugPutString$qpxc - pop ecx - jmp @Menuet@Abort$qv -enddef - -define @Menuet@DebugPutChar$qc - mov cl,byte [esp+4] - cmp cl,13 - jz Menuet_debug_put_char_ret - push ebx - cmp cl,10 - jz Menuet_debug_put_char_enter -Menuet_debug_put_char_after_cmp: - mov eax,63 - mov ebx,1 - int 0x40 - pop ebx -Menuet_debug_put_char_ret: - ret -Menuet_debug_put_char_enter: - mov cl,13 - mov eax,63 - mov ebx,1 - int 0x40 - mov cl,10 - jmp Menuet_debug_put_char_after_cmp -enddef - -define @Menuet@DebugPutString$qpxc - push esi - push dword 0 - mov esi,dword [esp+12] - jmp Menuet_debug_put_string_test -Menuet_debug_put_string_loop: - mov dword [esp],eax - call @Menuet@DebugPutChar$qc - inc esi -Menuet_debug_put_string_test: - xor eax,eax - or al,[esi] - test al,al - jnz Menuet_debug_put_string_loop - pop ecx - pop esi - ret -enddef - -define @Menuet@GetKey$qv - mov eax,2 - int 0x40 - test al,al - jnz Menuet_get_key_eof - movzx eax,ah - ret -Menuet_get_key_eof: - mov eax,-1 - ret -enddef - -define @Menuet@GetMouseButton$qv - push ebx - mov eax,37 - mov ebx,2 - int 0x40 - pop ebx - ret -enddef - -define @Menuet@GetMousePosition$qrst1o - push ebx - mov eax,37 - xor ebx,ebx - cmp byte [esp+16],0 - jnz Menuet_get_mouse_pos_absolute - inc ebx -Menuet_get_mouse_pos_absolute: - int 0x40 - mov ecx,[esp+12] - mov word [ecx],ax - mov ecx,[esp+8] - shr eax,16 - mov word [ecx],ax - pop ebx - ret -enddef - -define @Menuet@WasThreadCreated$qv - cmp byte [@Menuet@_ThreadSavedBegProc],0x90 - setz al - ret -enddef - -define @Menuet@CreateThread$qpvuit1 - push ebx - mov edx,[esp+16] - mov ebx,[esp+12] - test edx,edx - jnz Menuet_create_thread_after_new -if defined MenuetHeapAlloc - cmp ebx,4096 - jnb Menuet_create_thread_alloc - mov ebx,STACKSIZE -Menuet_create_thread_alloc: - push ebx - call MenuetHeapAlloc ; Create new dynamic memory of the given size - pop ecx - test eax,eax - jnz Menuet_create_thread_mem_created -end if - or eax,-1 - jmp Menuet_create_thread_end -Menuet_create_thread_mem_created: - lea edx,[eax+ebx] -Menuet_create_thread_after_new: - neg ebx - jz Menuet_create_thread_test_first - add ebx,edx -Menuet_create_thread_test_first: - cmp byte [@Menuet@_ThreadSavedBegProc],0x90 - jnz Menuet_create_thread_init -Menuet_create_thread_fill_stack: - lock inc dword [@Menuet@_ThreadNumber] - and edx,not 3 - sub edx,12 - mov ecx,[esp+8] - mov dword [edx+8],ebx - mov dword [edx+4],ecx - mov dword [edx],Menuet_ThreadFinish - mov eax,51 - mov ebx,1 - mov ecx,@Menuet@ThreadMain$qpvt1 - int 0x40 - mov ebx,eax - or bl,15 - inc ebx - jnz Menuet_create_thread_end - lock dec dword [@Menuet@_ThreadNumber] -if defined MenuetHeapFree - or ebx,[edx+8] - jz Menuet_create_thread_end - push ebx - call MenuetHeapFree ; Delete the given dynamic memory - pop ecx -end if -Menuet_create_thread_end: - pop ebx - ret -Menuet_create_thread_init: - push esi - push edi - cld - mov esi,@Menuet@_ThreadSavedBegProc - mov edi,@Menuet@GetPid$qv - movs dword [edi],[esi] - movs dword [edi],[esi] - mov edi,@Menuet@GetThreadData$qv - movs dword [edi],[esi] - movs dword [edi],[esi] - mov eax,0x90909090 - mov edi,@Menuet@_ThreadSavedBegProc - stos dword [edi] - stos dword [edi] - stos dword [edi] - stos dword [edi] - pop edi - pop esi - jmp Menuet_create_thread_fill_stack -enddef - -define @Menuet@_FileAccess$qpv - push ebx - mov eax,58 - mov ebx,[esp+8] - int 0x40 - mov ecx,[esp+8] - mov [ecx],ebx - pop ebx - cmp eax,5 - jz Menuet_file_access_ret_zero - ret -Menuet_file_access_ret_zero: - xor eax,eax - ret -enddef - -__pure_error_: - jmp $ - -define Menuet_abort_string - db 'Abnormal program termination.',10,0 -newdef Menuet_try_lock_rec_overflow_string - db 'Recursive mutex lock count overflow.',10,0 -newdef Menuet_unlock_rec_notlocked_string - db 'Recursive mutex unlock error.',10,0 -enddef - -include "me_lib.inc" - -;/**/ - diff --git a/programs/games/checkers/trunk/include/me_heap.h b/programs/games/checkers/trunk/include/me_heap.h deleted file mode 100644 index 5954d8edfc..0000000000 --- a/programs/games/checkers/trunk/include/me_heap.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef __MENUET_HEAP_H_INCLUDED_ -#define __MENUET_HEAP_H_INCLUDED_ - -#include -#include - -// Menuet memory heap interface. - -namespace Menuet // All menuet functions, types and data are nested in the (Menuet) namespace. -{ - void *Alloc(unsigned int size); - void *ReAlloc(void *mem, unsigned int size); - void Free(void *mem); -} - -#ifdef __MENUET__ - -namespace Menuet -{ - -// Global variables - - MemoryHeap::TFreeSpace _MenuetFreeSpace; - MemoryHeap::TMemBlock _MenuetMemBlock; - TMutex _MemHeapMutex = MENUET_MUTEX_INIT; - -// Functions - - void *_HeapInit(void *begin, void *use_end, void *end) - { - MemoryHeap::InitFreeSpace(_MenuetFreeSpace); - _MenuetMemBlock = MemoryHeap::CreateBlock(begin, end, _MenuetFreeSpace); - unsigned int use_beg = (unsigned int)MemoryHeap::BlockBegin(_MenuetMemBlock) + - MemoryHeap::BlockAddSize - MemoryHeap::BlockEndSize; - unsigned int use_size = (unsigned int)use_end; - if (use_size <= use_beg) return 0; - else use_size -= use_beg; - return MemoryHeap::Alloc(_MenuetFreeSpace, use_size); - } - - bool _SetUseMemory(unsigned int use_mem); - - int _RecalculateUseMemory(unsigned int use_mem); - - void *Alloc(unsigned int size) - { - if (!size) return 0; - Lock(&_MemHeapMutex); - void *res = MemoryHeap::Alloc(_MenuetFreeSpace, size); - if (!res) - { - unsigned use_mem = (unsigned int)MemoryHeap::BlockEndFor(_MenuetMemBlock, size); - if (_SetUseMemory(_RecalculateUseMemory(use_mem))) - { - res = MemoryHeap::Alloc(_MenuetFreeSpace, size); - } - } - UnLock(&_MemHeapMutex); - return res; - } - - void *ReAlloc(void *mem, unsigned int size) - { - Lock(&_MemHeapMutex); - void *res = MemoryHeap::ReAlloc(_MenuetFreeSpace, mem, size); - if (!res && size) - { - unsigned use_mem = (unsigned int)MemoryHeap::BlockEndFor(_MenuetMemBlock, size); - if (_SetUseMemory(_RecalculateUseMemory(use_mem))) - { - res = MemoryHeap::ReAlloc(_MenuetFreeSpace, mem, size); - } - } - UnLock(&_MemHeapMutex); - return res; - } - - void Free(void *mem) - { - Lock(&_MemHeapMutex); - MemoryHeap::Free(_MenuetFreeSpace, mem); - UnLock(&_MemHeapMutex); - } - - void _FreeAndThreadFinish(void *mem, int *exit_proc_now); -} - -#endif // def __MENUET__ - -#endif // ndef __MENUET_HEAP_H_INCLUDED_ diff --git a/programs/games/checkers/trunk/include/me_heap.inc b/programs/games/checkers/trunk/include/me_heap.inc deleted file mode 100644 index 6a32667508..0000000000 --- a/programs/games/checkers/trunk/include/me_heap.inc +++ /dev/null @@ -1,284 +0,0 @@ -;/*** - -MenuetHeapInit = @@Menuet@_HeapInit$qpvt1t1 - -MenuetHeapAlloc = @@Menuet@Alloc$qui - -MenuetHeapReAlloc = @@Menuet@ReAlloc$qpvui - -MenuetHeapFree = @@Menuet@Free$qpv - -MenuetHeapFreeAndThreadFinish = @Menuet@_FreeAndThreadFinish$qpvpi - -define @Menuet@_SetUseMemory$qui - push ebx - mov eax,64 - mov ebx,1 - mov ecx,[esp+8] - int 0x40 - pop ebx - test eax,eax - jnz Menuet_set_use_memory_nomem - push ecx - push dword [@Menuet@_MenuetMemBlock] - call @@MemoryHeap@ResizeBlock$q20MemoryHeap@TMemBlockpv - add esp,8 - mov al,1 - ret -Menuet_set_use_memory_nomem: - xor al,al - ret -enddef - -define @Menuet@_RecalculateUseMemory$qui - mov eax,dword [esp+4] - mov ecx,(U_END + 3) and not 3 - cmp eax,ecx - jna Menuet_recalculate_use_memory_min - push ebx - sub eax,ecx - mov ebx,6 - mul ebx - dec ebx - div ebx - add eax,((U_END + 3) and not 3) + 3 - and eax,not 3 - pop ebx - ret -Menuet_recalculate_use_memory_min: - mov eax,ecx - ret -enddef - -define @Menuet@_FreeAndThreadFinish$qpvpi - mov ebx,1 - mov ecx,[esp+8] - jmp Menuet_heap_free_tf_wait -Menuet_heap_free_tf_wait_loop: - mov eax,5 - int 0x40 - shl ebx,1 - cmp ebx,MENUET_MUTEX_MAX_TIME_WAIT - jna Menuet_heap_free_tf_wait - mov ebx,MENUET_MUTEX_MAX_TIME_WAIT -Menuet_heap_free_tf_wait: - cmp dword [ecx],0 - jnz @Menuet@ExitProcess$qv - lock bts dword [@Menuet@_MemHeapMutex],0 - jc Menuet_heap_free_tf_wait_loop - push dword [esp+4] - push @Menuet@_MenuetFreeSpace - call @@MemoryHeap@Free$qr21MemoryHeap@TFreeSpacepv - add esp,8 - mov byte [@Menuet@_MemHeapMutex],0x40 - or eax,-1 - int 0x40 -enddef - -macro call func -{ - if func eq @MemoryHeap@_FirstNotZeroBit$qui - bsf eax,[esp] - else if func eq @MemoryHeap@_CopyMemItemArray$quiuiui - xchg edi,[esp] - xchg esi,[esp+4] - mov ecx,[esp+8] - cld - sub ecx,esi - shr ecx,2 - rep movs dword [edi],[esi] - xchg edi,[esp] - xchg esi,[esp+4] - else - call func - end if -} - -@$bnwa$qui = @@Menuet@Alloc$qui -@$bnew$qui = @@Menuet@Alloc$qui - -@$bdla$qpv = @@Menuet@Free$qpv -@$bdele$qpv = @@Menuet@Free$qpv - -define @_vector_new_ldtc_$qpvuiuiuit1uit1 -.var_2C = -0Ch -.var_28 = -8 -.var_24 = -4 -.arg_0 = 8 -.arg_4 = 0Ch -.arg_8 = 10h -.arg_C = 14h -.arg_10 = 18h - push ebp - mov ebp, esp - add esp, -0Ch - push ebx - push esi - push edi - mov edi, [ebp+.arg_10] - mov esi, [ebp+.arg_C] - cmp dword [ebp+.arg_0], 0 - jnz .loc_10070 - mov edx, [ebp+.arg_4] - imul edx, [ebp+.arg_8] - test esi, 10h - jz @f - add edx, 4 -@@: - push edx - call @$bnwa$qui - pop ecx - mov [ebp+.arg_0], eax - test eax, eax - jz .ret - mov dword [ebp+.var_2C], 1 - jmp @f -.loc_10070: - and dword [ebp+.var_2C], 0 -@@: - test esi, 10h - jz @f - mov edx, [ebp+.arg_0] - mov ecx, [ebp+.arg_8] - mov [edx], ecx - add dword [ebp+.arg_0], 4 -@@: - mov eax, [ebp+.arg_0] - test edi, edi - jz .ret - mov ecx, [ebp+.arg_8] - mov [ebp+.var_28], ecx - mov ebx, eax - jmp .loc_100EF -.loc_100B0: - mov eax, esi - and eax, 7 - dec eax - jz .loc_100CB - dec eax - jz .loc_100D1 - dec eax - jz .loc_100D6 - dec eax - dec eax - jz .loc_100DC - jmp $ -.loc_100CB: - push ebx - call edi - pop ecx - jmp .loc_100EC -.loc_100D1: -.loc_100DC: - push ebx - call edi - jmp .loc_100EC -.loc_100D6: - mov eax, ebx - call edi -.loc_100EC: - add ebx, [ebp+.arg_4] -.loc_100EF: - dec dword [ebp+.var_28] - jns .loc_100B0 - mov eax, [ebp+.arg_0] -.ret: - pop edi - pop esi - pop ebx - mov esp, ebp - pop ebp - ret -enddef - -define @_vector_delete_ldtc_$qpvuiuiuit1 -.arg_0 = 8 -.arg_4 = 0Ch -.arg_8 = 10h -.arg_C = 14h -.arg_10 = 18h - push ebp - mov ebp, esp - push ebx - push esi - push edi - mov edi, [ebp+.arg_C] - mov esi, edi - and esi, 10h - and edi, 8 - cmp dword [ebp+.arg_0], 0 - jz .ret - test esi, esi - jz @f - mov ecx, [ebp+.arg_0] - mov eax, [ecx-4] - mov [ebp+.arg_8], eax -@@: - mov ebx, [ebp+.arg_8] - dec ebx - imul ebx, [ebp+.arg_4] - add ebx, [ebp+.arg_0] - jmp .loc_100D3 -.loc_1008B: - mov eax, [ebp+.arg_C] - and eax, 7 - dec eax - jz .loc_1009E - dec eax - jz .loc_100A9 - dec eax - jz .loc_100B1 - dec eax - dec eax - jz .loc_100BD - jmp $ -.loc_1009E: - push 2 - push ebx - call dword [ebp+.arg_10] - add esp, 8 - jmp .loc_100D0 -.loc_100A9: - push 2 - push ebx - call dword [ebp+.arg_10] - jmp .loc_100D0 -.loc_100B1: - mov edx, 2 - mov eax, ebx - call dword [ebp+.arg_10] - jmp .loc_100D0 -.loc_100BD: - push 2 - push ebx - call dword [ebp+.arg_10] -.loc_100D0: - sub ebx, [ebp+.arg_4] -.loc_100D3: - dec dword [ebp+.arg_8] - jns .loc_1008B - test esi, esi - jz @f - sub dword [ebp+.arg_0], 4 -@@: - test edi, edi - jz @f - push dword [ebp+.arg_0] - call @$bdla$qpv - pop ecx - jmp .ret -@@: - mov eax, [ebp+.arg_0] - jmp .reteax -.ret: - xor eax, eax -.reteax: - pop edi - pop esi - pop ebx - mov esp, ebp - pop ebp - ret -enddef - -;/**/ diff --git a/programs/games/checkers/trunk/include/me_lib.h b/programs/games/checkers/trunk/include/me_lib.h deleted file mode 100644 index 48cebb6c7b..0000000000 --- a/programs/games/checkers/trunk/include/me_lib.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __MENUET_LIB_H_INCLUDED_ -#define __MENUET_LIB_H_INCLUDED_ - -// Menuet interface. - -namespace Menuet // All menuet functions, types and data are nested in the (Menuet) namespace. -{ - unsigned int StrLen(const char *str); - char *StrCopy(char *dest, const char *src); - void *MemCopy(void *dest, const void *src, unsigned int n); - void *MemSet(void *s, char c, unsigned int n); - - double Floor(double x); -} - -#endif // __MENUET_LIB_H_INCLUDED_ diff --git a/programs/games/checkers/trunk/include/me_lib.inc b/programs/games/checkers/trunk/include/me_lib.inc deleted file mode 100644 index 7be9ab3fac..0000000000 --- a/programs/games/checkers/trunk/include/me_lib.inc +++ /dev/null @@ -1,118 +0,0 @@ -define @Menuet@StrLen$qpxc - push edi - cld - mov edi,[esp+8] - mov ecx,-1 - xor al,al - repnz scas byte [edi] - not ecx - lea eax,[ecx-1] - pop edi - ret -enddef - -define @Menuet@StrCopy$qpcpxc - push esi - push edi - cld - mov edi,[esp+16] - mov ecx,-1 - mov esi,edi - xor al,al - repnz scas byte [edi] - not ecx - mov edi,[esp+12] - mov edx,ecx - mov eax,edi - shr ecx,2 - rep movs dword [edi],[esi] - mov ecx,edx - and ecx,3 - rep movs byte [edi],[esi] - pop edi - pop esi - ret -enddef - -define @Menuet@MemCopy$qpvpxvui - push esi - push edi - cld - mov edi,[esp+12] - mov eax,edi - mov ecx,[esp+20] - mov esi,[esp+16] - mov edx,ecx - shr ecx,2 - rep movs dword [edi],[esi] - mov ecx,edx - and ecx,3 - rep movs byte [edi],[esi] - pop edi - pop esi - ret -enddef - -define @Menuet@MemSet$qpvcui - push edi - cld - mov edi,[esp+8] - mov al,[esp+12] - mov ah,al - mov dx,ax - shl eax,16 - mov ax,dx - mov ecx,[esp+16] - mov edx,ecx - shr ecx,2 - rep stos dword [edi] - mov ecx,edx - and ecx,3 - rep stos byte [edi] - pop edi - mov eax,[esp+4] - ret -enddef - -define __ftol - sub esp,12 - wait - fstcw word [esp+8] - wait - mov al,[esp+9] - or byte [esp+9],0x0c - fldcw word [esp+8] - fistp qword [esp] - mov [esp+9],al - fldcw word [esp+8] - mov eax,[esp] - mov edx,[esp+4] - add esp,12 - ret -enddef - -define @Menuet@Floor$qd - fld qword [esp+4] - mov ax,[esp+10] - shl ax,1 - cmp ax,0x8680 - ja Menuet_floor_end - mov ch,4 - sub esp,2 - wait - fstcw word [esp] - mov ax,0xf3ff - wait - mov dx,[esp] - and ax,dx - or ah,ch - mov [esp],ax - fldcw word [esp] - frndint - mov [esp],dx - fldcw word [esp] - add esp,2 -Menuet_floor_end: - ret -enddef - diff --git a/programs/games/checkers/trunk/include/me_start.inc b/programs/games/checkers/trunk/include/me_start.inc deleted file mode 100644 index 36e1bcf24b..0000000000 --- a/programs/games/checkers/trunk/include/me_start.inc +++ /dev/null @@ -1,90 +0,0 @@ -use32 -org 0x0 - db 'MENUET01' - dd 0x1 - dd MenuetEntryPoint - dd I_END - dd U_END+STACKSIZE+HEAPSIZE - dd U_END+STACKSIZE - dd 0x0,0x0 - -ptr equ -offset equ -short equ -tbyte equ tword - -PTR equ -OFFSET equ -SHORT equ -TBYTE equ TWORD - -macro movsb a,b -{ - if a eq & b eq - movsb - else - movsx a,b - end if -} - -macro movsw a,b -{ - if a eq & b eq - movsw - else - movsx a,b - end if -} - -macro segment name {} - -macro endseg name {} - -macro usedef [link] -{ - common - if ~link eq - virtual at 0 - forward - dd link - common - end virtual - end if -} - -macro define x,[link] -{ - common - if x eq - else if used x - x: - usedef link -} - -macro enddef [link] -{ - common - usedef link - end if -} - -macro newdef x,[link] -{ - common - end if - if x eq - else if used x - x: - usedef link -} - -macro nextdef x,[link] -{ - common - usedef x - end if - if x eq - else if used x - x: - usedef link -} diff --git a/programs/games/checkers/trunk/include/memheap.h b/programs/games/checkers/trunk/include/memheap.h deleted file mode 100644 index bf8aa101fc..0000000000 --- a/programs/games/checkers/trunk/include/memheap.h +++ /dev/null @@ -1,626 +0,0 @@ -#ifndef __MEMORY_HEAP_RBTREE_H_INCLUDED_ -#define __MEMORY_HEAP_RBTREE_H_INCLUDED_ - -namespace MemoryHeap -{ - typedef unsigned int TMemItem; - - enum {NumTreeSmall = 8 * sizeof(TMemItem)}; - -// Memory heap interface. - - struct TFreeSpace - { - TMemItem Small[NumTreeSmall], Min, SmallMask; - }; - - struct TMemBlock - { - TMemItem *Begin; - }; - - bool BlockValid(const TMemBlock &block); // Is the given memory block valid? - void *BlockBegin(const TMemBlock &block); // Return the beginning address of the block. - void *BlockEnd(const TMemBlock &block); // Return the ending address of the block. - TFreeSpace &BlockFreeSpace(const TMemBlock &block); // Return the free space of the block. - - void InitFreeSpace(TFreeSpace &fs); // Initialize the free space. - TMemBlock NullBlock(); // Return null invalid block. - TMemBlock CreateBlock(void *begin, void *end, TFreeSpace &fs); - // Create a memory block with the given begin and end and add free space of it to (fs), - //_ give (BlockAddSize) bytes of the block for it's data. - //_ (Program can alloc (end - begin - BlockAddSize) bytes after it, - //_ that must be not less than (MemMinSize) ). - TMemBlock CreateBlock(void *begin, void *end); - // Create a memory block with the given begin and end and new free space for it, - //_ give (BlockAddSizeFS) bytes of the block for it's data. - //_ (Program can alloc (end - begin - BlockAddSizeFS) bytes after it, - //_ that must be not less than (MemMinSize) ). - void ResizeBlock(TMemBlock block, void *new_end); // Resize the memory block to the given new end. - void RemoveBlock(TMemBlock block); // Remove the given memory block. - - void *BlockEndFor(TMemBlock block, unsigned int size); - // Return the new end of the block needed for (ResizeBlock) to alloc the given size of memory. - unsigned int BlockSize(TMemBlock block); // Return the size of the given block. - unsigned int MemSize(void *mem); // Return the size of the allocced memory. - - void *Alloc(TFreeSpace &fs, unsigned int size); - // Alloc a memory in the given free space, give (MemAddSize) bytes for it's data. - void *ReAlloc(TFreeSpace &fs, unsigned int size, void *mem); - // ReAlloc the given memory, it must lie in the block with the given free space. - void Free(TFreeSpace &fs, void *mem); - // Free the given memory, it must lie in the block with the given free space. - -// Macro definitions. - -#define MEMORY_HEAP_ALIGN_DOWN(s) (MemoryHeap::TMemItem(s) & ~(MemoryHeap::MemAlign - 1)) -#define MEMORY_HEAP_ALIGN_UP(s) ((MemoryHeap::TMemItem(s) + (MemoryHeap::MemAlign - 1)) & ~(MemoryHeap::MemAlign - 1)) -#define MEMORY_HEAP_ITEM(s,k) ( ((MemoryHeap::TMemItem*)(s))[(k)] ) -#define MEMORY_HEAP_NEXT(s) (MEMORY_HEAP_ITEM((s),-1)) -#define MEMORY_HEAP_PREV(s) (MEMORY_HEAP_ITEM((s),-2)) -#define MEMORY_HEAP_FREE(s) (MEMORY_HEAP_ITEM((s),-1) & 1) - -// Constants. - - enum {MemAlign = sizeof(TMemItem)}; - enum {MemAddSize = MEMORY_HEAP_ALIGN_UP(2 * sizeof(TMemItem))}; - enum {BlockEndSize = MemAddSize}; - enum {BlockAddSize = MEMORY_HEAP_ALIGN_UP(4 * sizeof(TMemItem)) + BlockEndSize}; - enum {BlockAddSizeFS = BlockAddSize + BlockEndSize + MEMORY_HEAP_ALIGN_UP(sizeof(TFreeSpace))}; - enum {MemMinSize = MEMORY_HEAP_ALIGN_UP(2 * sizeof(TMemItem))}; - -// Inline functions. - - inline bool BlockValid(const TMemBlock &block) {return block.Begin != 0;} - - inline void *BlockBegin(const TMemBlock &block) {return (void*)block.Begin;} - - inline void *BlockEnd(const TMemBlock &block) {return block.Begin ? (void*)block.Begin[1] : 0;} - - inline TFreeSpace &BlockFreeSpace(const TMemBlock &block) {return *(TFreeSpace*)block.Begin[0];} - - inline TMemBlock NullBlock() {TMemBlock block; block.Begin = 0; return block;} - - inline void *BlockEndFor(TMemBlock block, unsigned int size) - { - TMemItem last = (TMemItem)block.Begin[1]; - TMemItem prevlast = MEMORY_HEAP_PREV(last); - return (void*)( (MEMORY_HEAP_FREE(prevlast) ? prevlast : last) + MemAddSize + - ((size <= MemMinSize) ? MemMinSize : MEMORY_HEAP_ALIGN_UP(size)) ); - } - - inline unsigned int BlockSize(TMemBlock block) - { - if (!block.Begin) return 0; - return (unsigned int)(block.Begin[1] - (TMemItem)block.Begin); - } - - inline unsigned int MemSize(void *mem) - { - if (!mem) return 0; - TMemItem c = (TMemItem)mem; - return MEMORY_HEAP_NEXT(c) - c - MemAddSize; - } - -// Free space item functions. - - TMemItem _FirstNotZeroBit(TMemItem i) - { - TMemItem r = 0; - while ((i >>= 1) != 0) r++; - return r; - } - - void _RBTreeRotate(TMemItem parent, TMemItem item, int side) - { - TMemItem temp = MEMORY_HEAP_ITEM(parent,0); - MEMORY_HEAP_ITEM(item,0) = temp; - if (temp) - { - if (MEMORY_HEAP_ITEM(temp,2) == parent) - { - MEMORY_HEAP_ITEM(temp,2) = item; - } - else MEMORY_HEAP_ITEM(temp,3) = item; - } - temp = MEMORY_HEAP_ITEM(item,side^1); - if (temp) MEMORY_HEAP_ITEM(temp,0) = parent; - MEMORY_HEAP_ITEM(parent,side) = temp; - MEMORY_HEAP_ITEM(parent,0) = item; - MEMORY_HEAP_ITEM(item,side^1) = parent; - temp = MEMORY_HEAP_ITEM(parent,1); - MEMORY_HEAP_ITEM(parent,1) = MEMORY_HEAP_ITEM(item,1); - MEMORY_HEAP_ITEM(item,1) = temp; - } - - void InitFreeSpace(TFreeSpace &fs) - { - TMemItem i; - for (i = 0; i <= NumTreeSmall; i++) fs.Small[i] = 0; - fs.Min = 0; fs.SmallMask = 0; - } - - void _FreeAdd(TFreeSpace &fs, TMemItem item) - { - TMemItem size = MEMORY_HEAP_NEXT(item) - item; - if (size < MemAddSize + MemMinSize + MemAlign * NumTreeSmall) - { - TMemItem s = (size - (MemAddSize + MemMinSize)) / MemAlign; - TMemItem &addto = fs.Small[s]; - MEMORY_HEAP_ITEM(item,1) = (TMemItem)(&addto); - MEMORY_HEAP_ITEM(item,0) = (TMemItem)addto; - if (addto) MEMORY_HEAP_ITEM(addto,1) = item; - addto = item; - fs.SmallMask |= TMemItem(1) << s; - return; - } - TMemItem addto = fs.Min, parent, temp; - MEMORY_HEAP_ITEM(item,2) = 0; - MEMORY_HEAP_ITEM(item,3) = 0; - if (!addto) - { - MEMORY_HEAP_ITEM(item,0) = 0; - MEMORY_HEAP_ITEM(item,1) = 1; - fs.Min = item; - return; - } - MEMORY_HEAP_ITEM(item,1) = 0; - TMemItem side = 2; - if (MEMORY_HEAP_NEXT(addto) - addto >= size) fs.Min = item; - else - { - for (;;) - { - parent = MEMORY_HEAP_ITEM(addto,0); - if (!parent) break; - if (MEMORY_HEAP_NEXT(parent) - parent < size) addto = parent; - else break; - } - for (;;) - { - if (MEMORY_HEAP_NEXT(addto) - addto < size) - { - temp = MEMORY_HEAP_ITEM(addto,3); - if (!temp) {side = 3; break;} - addto = temp; - } - else - { - temp = MEMORY_HEAP_ITEM(addto,2); - if (!temp) break; - addto = temp; - } - } - } - MEMORY_HEAP_ITEM(item,0) = addto; - MEMORY_HEAP_ITEM(addto,side) = item; - for (;;) - { - if (MEMORY_HEAP_ITEM(addto,1) != 0) return; - parent = MEMORY_HEAP_ITEM(addto,0); - temp = MEMORY_HEAP_ITEM(parent,2); - if (temp == addto) - { - temp = MEMORY_HEAP_ITEM(parent,3); - side = 2; - } - else side = 3; - if (!temp || MEMORY_HEAP_ITEM(temp,1) != 0) break; - MEMORY_HEAP_ITEM(addto,1) = 1; - MEMORY_HEAP_ITEM(temp,1) = 1; - item = parent; - addto = MEMORY_HEAP_ITEM(item,0); - if (!addto) return; - MEMORY_HEAP_ITEM(item,1) = 0; - } - if (MEMORY_HEAP_ITEM(addto,side) != item) - { - temp = MEMORY_HEAP_ITEM(item,side); - if (temp) MEMORY_HEAP_ITEM(temp,0) = addto; - MEMORY_HEAP_ITEM(addto,side^1) = temp; - MEMORY_HEAP_ITEM(addto,0) = item; - MEMORY_HEAP_ITEM(item,side) = addto; - MEMORY_HEAP_ITEM(item,0) = parent; - MEMORY_HEAP_ITEM(parent,side) = item; - } - else item = addto; - _RBTreeRotate(parent, item, side); - } - - void _FreeDel(TFreeSpace &fs, TMemItem item) - { - TMemItem size = MEMORY_HEAP_NEXT(item) - item; - if (size < MemAddSize + MemMinSize + MemAlign * NumTreeSmall) - { - TMemItem prev = MEMORY_HEAP_ITEM(item,1); - TMemItem next = MEMORY_HEAP_ITEM(item,0); - MEMORY_HEAP_ITEM(prev,0) = next; - if (next) MEMORY_HEAP_ITEM(next,1) = prev; - else - { - TMemItem s = (size - (MemAddSize + MemMinSize)) / MemAlign; - if (!fs.Small[s]) fs.SmallMask &= ~(TMemItem(1) << s); - } - return; - } - TMemItem parent, temp, second, add; - TMemItem side = 2; - temp = MEMORY_HEAP_ITEM(item,3); - if (temp) - { - for (;;) - { - second = temp; - temp = MEMORY_HEAP_ITEM(temp,2); - if (!temp) break; - } - if (fs.Min == item) fs.Min = second; - add = MEMORY_HEAP_ITEM(second,3); - parent = MEMORY_HEAP_ITEM(second,0); - if (parent == item) {parent = second; side = 3;} - else - { - temp = MEMORY_HEAP_ITEM(item,3); - MEMORY_HEAP_ITEM(second,3) = temp; - MEMORY_HEAP_ITEM(temp,0) = second; - } - temp = MEMORY_HEAP_ITEM(item,2); - MEMORY_HEAP_ITEM(second,2) = temp; - if (temp) MEMORY_HEAP_ITEM(temp,0) = second; - temp = MEMORY_HEAP_ITEM(item,0); - MEMORY_HEAP_ITEM(second,0) = temp; - if (temp) - { - if (MEMORY_HEAP_ITEM(temp,2) == item) - { - MEMORY_HEAP_ITEM(temp,2) = second; - } - else MEMORY_HEAP_ITEM(temp,3) = second; - } - MEMORY_HEAP_ITEM(parent,side) = add; - if (add) MEMORY_HEAP_ITEM(add,0) = parent; - bool color = MEMORY_HEAP_ITEM(second,1); - MEMORY_HEAP_ITEM(second,1) = MEMORY_HEAP_ITEM(item,1); - if (!color) return; - } - else - { - if (fs.Min == item) fs.Min = MEMORY_HEAP_ITEM(item,0); - add = MEMORY_HEAP_ITEM(item,2); - parent = MEMORY_HEAP_ITEM(item,0); - if (add) MEMORY_HEAP_ITEM(add,0) = parent; - if (parent) - { - if (MEMORY_HEAP_ITEM(parent,2) == item) - { - MEMORY_HEAP_ITEM(parent,2) = add; - } - else - { - MEMORY_HEAP_ITEM(parent,3) = add; - side = 3; - } - } - else - { - if (add) MEMORY_HEAP_ITEM(add,1) = 1; - return; - } - if (!MEMORY_HEAP_ITEM(item,1)) return; - } - if (add && !MEMORY_HEAP_ITEM(add,1)) - { - MEMORY_HEAP_ITEM(add,1) = 1; - return; - } - for (;;) - { - second = MEMORY_HEAP_ITEM(parent,side^1); - if (!MEMORY_HEAP_ITEM(second,1)) - { - _RBTreeRotate(parent, second, side^1); - second = MEMORY_HEAP_ITEM(parent,side^1); - } - temp = MEMORY_HEAP_ITEM(second,side^1); - if (temp && !MEMORY_HEAP_ITEM(temp,1)) - { - MEMORY_HEAP_ITEM(temp,1) = 1; - break; - } - temp = MEMORY_HEAP_ITEM(second,side); - if (temp && !MEMORY_HEAP_ITEM(temp,1)) - { - _RBTreeRotate(second, temp, side); - MEMORY_HEAP_ITEM(second,1) = 1; - second = temp; - break; - } - MEMORY_HEAP_ITEM(second,1) = 0; - if (!MEMORY_HEAP_ITEM(parent,1)) - { - MEMORY_HEAP_ITEM(parent,1) = 1; - return; - } - second = parent; - parent = MEMORY_HEAP_ITEM(second,0); - if (!parent) return; - if (MEMORY_HEAP_ITEM(parent,2) == second) side = 2; - else side = 3; - } - _RBTreeRotate(parent, second, side^1); - } - - TMemItem _FreeFindAfter(TMemItem item, TMemItem size) - { - if (!item) return 0; - TMemItem paritem, s; - if (MEMORY_HEAP_NEXT(item) - item >= size) return item; - for (;;) - { - paritem = MEMORY_HEAP_ITEM(item,0); - if (!paritem) break; - s = MEMORY_HEAP_NEXT(paritem) - paritem; - if (s == size) return paritem; - if (s < size) item = paritem; - else break; - } - MEMORY_HEAP_ITEM(item,3); - for (;;) - { - if (!item) return paritem; - s = MEMORY_HEAP_NEXT(item) - item; - if (s == size) return item; - if (s < size) item = MEMORY_HEAP_ITEM(item,3); - else - { - paritem = item; - item = MEMORY_HEAP_ITEM(item,2); - } - } - } - - TMemItem _FreeFind(TFreeSpace &fs, TMemItem size) - { - TMemItem item, nextitem, s; - if (size < MemAddSize + MemMinSize + MemAlign * NumTreeSmall) - { - TMemItem m, t; - s = (size - (MemAddSize + MemMinSize)) / MemAlign; - item = fs.Small[s]; - if (item) return item; - if (size < MemAlign * NumTreeSmall) - { - t = size / MemAlign; - m = fs.SmallMask >> t; - if (m) return fs.Small[t + _FirstNotZeroBit(m)]; - else if (fs.Min) return fs.Min; - } - else - { - item = _FreeFindAfter(fs.Min, size + 1 + MemAddSize + MemMinSize); - if (item) return item; - } - m = fs.SmallMask >> s; - if (m) return fs.Small[s + _FirstNotZeroBit(m)]; - else return fs.Min; - } - item = _FreeFindAfter(fs.Min, ++size); - if (!item) return 0; - s = MEMORY_HEAP_NEXT(item) - item; - if (s == size) return item; - size += MemAddSize + MemMinSize; - if (s >= size) return item; - nextitem = _FreeFindAfter(item, size); - return nextitem ? nextitem : item; - } - -// Block functions. - - inline void _CreateBlockEnd(TMemBlock &block, TFreeSpace &fs, TMemItem c, TMemItem e) - { - block.Begin[0] = (TMemItem)(&fs); - if (e - c < TMemItem(MemAddSize + MemMinSize)) - { - MEMORY_HEAP_NEXT(c) = 0; - block.Begin[1] = c; - } - else - { - MEMORY_HEAP_NEXT(c) = e + 1; - _FreeAdd(fs, c); - MEMORY_HEAP_PREV(e) = c; - MEMORY_HEAP_NEXT(e) = 0; - block.Begin[1] = e; - } - } - - TMemBlock CreateBlock(void *begin, void *end, TFreeSpace &fs) - { - TMemBlock block = {0}; - TMemItem b = MEMORY_HEAP_ALIGN_UP(begin); - TMemItem e = MEMORY_HEAP_ALIGN_DOWN(end); - if (e <= b || e - b < TMemItem(BlockAddSize - MemAddSize)) return block; - block.Begin = (TMemItem*)b; - b += MEMORY_HEAP_ALIGN_UP(4 * sizeof(TMemItem)); - MEMORY_HEAP_PREV(b) = 0; - _CreateBlockEnd(block, fs, b, e); - return block; - } - - TMemBlock CreateBlock(void *begin, void *end) - { - TMemBlock block = {0}; - TMemItem b = MEMORY_HEAP_ALIGN_UP(begin); - TMemItem e = MEMORY_HEAP_ALIGN_DOWN(end); - if (e <= b || e - b < TMemItem(BlockAddSizeFS - MemAddSize)) return block; - block.Begin = (TMemItem*)b; - b += MEMORY_HEAP_ALIGN_UP(4 * sizeof(TMemItem)); - TMemItem c = b + MemAddSize + MEMORY_HEAP_ALIGN_UP(sizeof(TFreeSpace)); - MEMORY_HEAP_PREV(b) = 0; - MEMORY_HEAP_NEXT(b) = c; - MEMORY_HEAP_PREV(c) = b; - InitFreeSpace(*(TFreeSpace*)b); - _CreateBlockEnd(block, *(TFreeSpace*)b, c, e); - return block; - } - - void ResizeBlock(TMemBlock block, void *new_end) - { - if (!BlockValid(block)) return; - TMemItem e = MEMORY_HEAP_ALIGN_DOWN(new_end); - TMemItem c = block.Begin[1]; - TFreeSpace &fs = *(TFreeSpace*)block.Begin[0]; - do - { - if (c == e) return; - else if (c > e) - { - while ((c = MEMORY_HEAP_PREV(c)) > e) - { - if (MEMORY_HEAP_FREE(c)) _FreeDel(fs, c); - } - if (!c) {block.Begin = 0; return;} - if (MEMORY_HEAP_FREE(c)) - { - _FreeDel(fs, c); - if (e - c < TMemItem(MemAddSize + MemMinSize)) e = c; - else - { - MEMORY_HEAP_NEXT(c) = e + 1; - _FreeAdd(*(TFreeSpace*)block.Begin[0], c); - break; - } - } - else if (e - c >= TMemItem(MemAddSize + MemMinSize)) - { - MEMORY_HEAP_NEXT(c) = e; break; - } - MEMORY_HEAP_NEXT(c) = 0; - block.Begin[1] = c; - if (c == e) return; - } - TMemItem pc = MEMORY_HEAP_PREV(c); - if (pc && MEMORY_HEAP_FREE(pc)) _FreeDel(fs, c = pc); - else if (e - c < TMemItem(MemAddSize + MemMinSize)) return; - MEMORY_HEAP_NEXT(c) = e + 1; - _FreeAdd(fs, c); - } while(false); - MEMORY_HEAP_PREV(e) = c; - MEMORY_HEAP_NEXT(e) = 0; - block.Begin[1] = e; - } - - void RemoveBlock(TMemBlock block) - { - if (!BlockValid(block)) return; - TMemItem e = block.Begin[1]; - TFreeSpace &fs = *(TFreeSpace*)block.Begin[0]; - while ((e = MEMORY_HEAP_PREV(e)) != 0) - { - if (MEMORY_HEAP_FREE(e)) _FreeDel(fs, e); - } - block.Begin = 0; - } - -// Free space functions. - - void _CopyMemItemArray(TMemItem dest, TMemItem src, TMemItem end) - { - TMemItem k = (end - src) / sizeof(TMemItem); - TMemItem *d = (TMemItem*)dest; - TMemItem *s = (TMemItem*)src; - while (k--) *(d++) = *(s++); - } - - void *Alloc(TFreeSpace &fs, unsigned int size) - { - if (!size) return 0; - TMemItem s = MEMORY_HEAP_ALIGN_UP(size) + MemAddSize; - if (s < MemAddSize + MemMinSize) s = MemAddSize + MemMinSize; - TMemItem c = _FreeFind(fs, s); - if (!c) return 0; - _FreeDel(fs, c); - TMemItem nc = --MEMORY_HEAP_NEXT(c); - TMemItem mc = c + s; - if (nc - (MemAddSize + MemMinSize) >= mc) - { - MEMORY_HEAP_NEXT(c) = mc; - MEMORY_HEAP_PREV(mc) = c; - MEMORY_HEAP_NEXT(mc) = nc + 1; - MEMORY_HEAP_PREV(nc) = mc; - _FreeAdd(fs, mc); - } - return (void*)c; - } - - void *ReAlloc(TFreeSpace &fs, void *mem, unsigned int size) - { - if (!mem) return Alloc(fs, size); - if (!size) {Free(fs, mem); return 0;} - TMemItem s = MEMORY_HEAP_ALIGN_UP(size) + MemAddSize; - TMemItem c = (TMemItem)mem; - TMemItem mc = MEMORY_HEAP_NEXT(c); - TMemItem nc = MEMORY_HEAP_NEXT(mc); - if (--nc & 1) nc = mc; - if (s < MemAddSize + MemMinSize) s = MemAddSize + MemMinSize; - if (nc - c < s) - { - mem = Alloc(fs, size); - if (mem) - { - _CopyMemItemArray((TMemItem)mem, c, mc - MemAddSize); - Free(fs, (void*)c); - return mem; - } - else - { - TMemItem pc = MEMORY_HEAP_PREV(c); - if (pc && MEMORY_HEAP_FREE(pc) && nc - pc >= s) - { - _FreeDel(fs, pc); - _CopyMemItemArray(pc, c, mc - MemAddSize); - c = pc; - } - else return 0; - } - } - if (mc < nc) _FreeDel(fs, mc); - mc = c + s; - if (nc - (MemAddSize + MemMinSize) >= mc) - { - MEMORY_HEAP_NEXT(c) = mc; - MEMORY_HEAP_PREV(mc) = c; - MEMORY_HEAP_NEXT(mc) = nc + 1; - MEMORY_HEAP_PREV(nc) = mc; - _FreeAdd(fs, mc); - } - else - { - MEMORY_HEAP_NEXT(c) = nc; - MEMORY_HEAP_PREV(nc) = c; - } - return (void*)c; - } - - int free_a = 0; - - void Free(TFreeSpace &fs, void *mem) - { - TMemItem c = (TMemItem)mem; - if (!c) return; - TMemItem pc = MEMORY_HEAP_PREV(c); - TMemItem mc = MEMORY_HEAP_NEXT(c); - TMemItem nc = MEMORY_HEAP_NEXT(mc); - if (--nc & 1) nc = mc; - else _FreeDel(fs, mc); - if (free_a == 1) return; - if (pc && MEMORY_HEAP_FREE(pc)) _FreeDel(fs, c = pc); - MEMORY_HEAP_NEXT(c) = nc + 1; - MEMORY_HEAP_PREV(nc) = c; - if (free_a == 2) return; - _FreeAdd(fs, c); - } -} - -#endif // ndef __MEMORY_HEAP_RBTREE_H_INCLUDED_ - diff --git a/programs/games/checkers/trunk/include/menuet.h b/programs/games/checkers/trunk/include/menuet.h deleted file mode 100644 index 74e0bff50f..0000000000 --- a/programs/games/checkers/trunk/include/menuet.h +++ /dev/null @@ -1,536 +0,0 @@ -#ifndef __MENUET_H_INCLUDED_ -#define __MENUET_H_INCLUDED_ - -#include - -// Menuet interface. - -namespace Menuet // All menuet functions, types and data are nested in the (Menuet) namespace. -{ - const char *DebugPrefix = "User program: "; - - struct TWindowData // Data for drawing a window. - { - unsigned short WindowType, HeaderType; - unsigned long WindowColor, HeaderColor, BorderColor, TitleColor; - const char *Title; - }; - - struct TStartData // This structure is used only for MenuetOnStart function. - { - unsigned short Left, Width, Top, Height; // Initial window rectangle. - TWindowData WinData; - }; - - typedef void **TThreadData; // Thread data are the fast identifier of thread, contains user dword in - //_ the zero element and stack beginning (or zero if it is unknown) in the first element. - //_ The stack will be deleted from dynamic memory at the finish of the thread if stack beginning is not zero. - - struct TMutex; // Simple mutex can be locked only once at a time. -#define MENUET_MUTEX_INIT {} // Simple mutex initializer, cat be redefined in a realization of the library - - struct TRecMutex; // Recursive mutex can be locked many times by a single thread at a time. -#define MENUET_REC_MUTEX_INIT {} // Recursive mutex initializer, cat be redefined in a realization of the library - - // Some functions have two forms: the fast form with (thread_data) parameter and the form without it. - // Note: pass only thread data of current thread as (thread_data) parameter to these functions. - - void Main(); // Main function is called at program startup. - void* ThreadMain(void *user = 0, void *stack_begin = 0); - // Called at thread startup, (user) is placed in thread data as a user dword, - //_ (stack_begin) is placed in thread data as a stack beginning. - //_ Return new value of stack beginning that can be changed in the thread data. - void GetWindowData(TWindowData &win_data); // Write current window data to (win_data). - void GetWindowData(TWindowData &win_data, TThreadData thread_data); - void SetWindowData(const TWindowData &win_data); // Replace current window data by (win_data). - void SetWindowData(const TWindowData &win_data, TThreadData thread_data); - void CloseWindow(); // Close current window when returning to message loop. - void CloseWindow(TThreadData thread_data); - void Redraw(int frame = 0); // Redraw current window immediately, if (frame) is positive redraw the frame too, - void Redraw(int frame, TThreadData thread_data); //_ if (frame) is negative redraw only invalideted window. - void Invalidate(int frame = 0); // Redraw current window when no message will be is the queue, - void Invalidate(int frame, TThreadData thread_data); //_ if (frame) is positive redraw the frame too, - //_ if (frame) is negative do nothing. - void MoveWindow(const int window_rect[/* 4 */]); // Move and resize current window. - - void Abort(); // Abnormally terminate a program. - void ExitProcess(); // Exit from the process, don't call any destructors of global varyables - void ExitThread(); // Exit from the current thread - void ExitThread(TThreadData thread_data); - void ReturnMessageLoop(); // Return to the message loop of the thread. Exit from the thread - void ReturnMessageLoop(TThreadData thread_data); //_ if it is called from (MenuetOnStart). - - void Delay(unsigned int time); // Delay the execution of the program during (time) hundredth seconds. - unsigned int Clock(); // Return the time from starting of the system to this moment in hundredth of seconds. - int GetPackedTime(); // Return the current time of day in binary-decimal format 0x00SSMMHH. - void GetTime(int t[/* 3 */]); // Write the current time to (t): t[0] = second, t[1] = minute, t[2] = hour. - int GetPackedDate(); // Return the current date in binary-decimal format 0x00YYDDMM. - void GetDate(int d[/* 3 */]); // Write the current date to (d): d[0] = day, d[1] = month, d[2] = year. - void GetTimeDate(int t[/* 6 */]); // Write the current time and date to (t): t[0] = second, - //_ t[1] = minute, t[2] = hour, t[3] = day, t[4] = month, t[5] = year. - void ReadCommonColors(unsigned int colors[/* 10 */]); // Writes standart window colors to (colors). - unsigned int GetProcessInfo(unsigned int *use_cpu, char process_name[/* 13 */], unsigned int *use_memory, - unsigned int *pid, int window_rect[/* 4 */], unsigned int pid_for = -1); - // Write (pid_for) process information to variables parameters points, return - //_ the number of processes. (pid_for) equal to (-1) means current process. - unsigned int GetPid(); // Return the current thread identifier (pid). - unsigned int GetPid(TThreadData thread_data); - TThreadData GetThreadData(); // Return the thread data of the current thread. - TThreadData GetThreadData(unsigned int pid); // Return the thread data of the thread with the given pid. - - void* GetPicture(unsigned short &width, unsigned short &height); - void* GetPicture(unsigned short &width, unsigned short &height, TThreadData thread_data); - // Return the picture on the window and write its width and height to (width) and (height). - void SetPicture(void *picture, unsigned short width, unsigned short height); - void SetPicture(void *picture, unsigned short width, unsigned short height, TThreadData thread_data); - // Replace the picture on the window by the given picture with the given width and height. - void GetBorderHeader(unsigned short &border_size, unsigned short &header_size); - void GetBorderHeader(unsigned short &border_size, unsigned short &header_size, TThreadData thread_data); - // Write the border thickness to (border_size) and header height to (header_size). - void GetClientSize(unsigned short &width, unsigned short &height); - void GetClientSize(unsigned short &width, unsigned short &height, TThreadData thread_data); - // Write the client area width and height to (width) and (height) parameters. - void GetClientSize(unsigned short &width, unsigned short &height, int win_width, int win_height); - void GetClientSize(unsigned short &width, unsigned short &height, int win_width, int win_height, TThreadData thread_data); - // Write the client area size of window with the width (win_width) - //_ and height (win_height) to (width) and (height) parameters. - void GetScreenSize(unsigned short &width, unsigned short &height); - // Write the screen width and height to (width) and (height) parameters. - - void InitMutex(TMutex *mutex); // Initialize the simple mutex. - void InitRecMutex(TRecMutex *mutex); // Initialize the recursive mutex. - bool TryLock(TMutex *mutex); // Try to lock the mutex without waitting, return true if lock. - bool TryLock(TRecMutex *mutex); - bool TryLock(TRecMutex *mutex, TThreadData thread_data); - bool TryLock(TRecMutex *mutex, unsigned int pid); - void Lock(TMutex *mutex); // Lock mutex and wait for it if this necessary. - void Lock(TRecMutex *mutex); - void Lock(TRecMutex *mutex, TThreadData thread_data); - void Lock(TRecMutex *mutex, unsigned int pid); - bool LockTime(TMutex *mutex, int time); - bool LockTime(TRecMutex *mutex, int time); // Lock mutex and wait for it during (time) hundredth seconds. - bool LockTime(TRecMutex *mutex, int time, TThreadData thread_data); - bool LockTime(TRecMutex *mutex, int time, unsigned int pid); - void UnLock(TMutex *mutex); // Unlock mutex - void UnLock(TRecMutex *mutex); - void UnLock(TRecMutex *mutex, TThreadData thread_data); - void UnLock(TRecMutex *mutex, unsigned int pid); - - void DebugPutChar(char c); // Put the character to the debug board. - void DebugPutString(const char *s); // Put the string to the debug board. - int GetKey(); // Return key pressed by user or -1 if no key was pressed. - int GetMouseButton(); // Return buttons pressed: 0 - no buttons, 1 - left button, 2 - right button, 3 - both buttons. - void GetMousePosition(short &x, short &y, bool absolute = false); - // Write mouse position to (x) and (y): absolute if (absolute) is true and relative the window otherwise. - void GetMousePosPicture(short &x, short &y); - - int GetThreadNumber(); // Return the number of threads currently executing. - bool WasThreadCreated(); // Return true if there was created at least one thread except the main thred. - unsigned int CreateThread(void *user = 0, unsigned int stack_size = 0, void *stack_end = 0); - // Create a new thread with the user dword (user) and stack pointer (stack_end). - //_ If (stack_end) is zero, create stack in dynamic memory of size (stack_size) or - //_ the same size as the main thread if (stack_size) less that 4096. Set the beginning - //_ of the stack if (stack_end) is zero or (stack_size) is not zero, in this case stack - //_ will be deleted automaticaly from dynamic memory at the finish of the thread. -} - -// Function, defined outside. - -bool MenuetOnStart(Menuet::TStartData &me_start, Menuet::TThreadData thread_data); - // Window will be created iff return value is true. -bool MenuetOnClose(Menuet::TThreadData thread_data); // Window will be closed iff return value is true. -int MenuetOnIdle(Menuet::TThreadData thread_data); // Return the time to wait next message. -void MenuetOnSize(int window_rect[/* 4 */], Menuet::TThreadData thread_data); // When the window is resized. -void MenuetOnKeyPress(Menuet::TThreadData thread_data); // When user press a key. -void MenuetOnMouse(Menuet::TThreadData thread_data); // When user move a mouse. - -#ifdef __MENUET__ - -namespace Menuet -{ -// Structures. - - struct TMutex // Simple mutex can be locked only once at a time. - { - unsigned int mut; - }; -#undef MENUET_MUTEX_INIT -#define MENUET_MUTEX_INIT {0x40} // Simple mutex initializer, cat be redefined in a realization of the library - - struct TRecMutex // Recursive mutex can be locked many times by a single thread at a time. - { - unsigned int mut, pid; - }; -#undef MENUET_REC_MUTEX_INIT -#define MENUET_REC_MUTEX_INIT {0x20,-1} // Recursive mutex initializer, cat be redefined in a realization of the library - -// Global variables. - - volatile TThreadData _ThreadTable[256]; - volatile unsigned int _ThreadScanCount[2] = {0, 0}; - volatile int _ThreadNumber = 1; - volatile int _ExitProcessNow = 0; - TMutex _ThreadMutex = MENUET_MUTEX_INIT; - unsigned int _ThreadSavedBegProc[4]; - -// Inline functions. - - inline void GetWindowData(TWindowData &win_data) {GetWindowData(win_data, GetThreadData());} - - inline void SetWindowData(const TWindowData &win_data) {SetWindowData(win_data, GetThreadData());} - - inline void CloseWindow() {CloseWindow(GetThreadData());} - - inline void Redraw(int frame) {Redraw(frame, GetThreadData());} - - inline void Invalidate(int frame) {Invalidate(frame, GetThreadData());} - - inline void* GetPicture(unsigned short &width, unsigned short &height) - { - return GetPicture(width, height, GetThreadData()); - } - - inline void SetPicture(void *picture, unsigned short width, unsigned short height) - { - SetPicture(picture, width, height, GetThreadData()); - } - - inline void GetBorderHeader(unsigned short &border_size, unsigned short &header_size) - { - GetBorderHeader(border_size, header_size, GetThreadData()); - } - - inline void GetClientSize(unsigned short &width, unsigned short &height) - { - unsigned int pid; - int rect[4]; - GetProcessInfo(0, 0, 0, &pid, rect); - GetClientSize(width, height, rect[2], rect[3], GetThreadData(pid)); - } - - inline void GetClientSize(unsigned short &width, unsigned short &height, TThreadData thread_data) - { - int rect[4]; - GetProcessInfo(0, 0, 0, 0, rect); - GetClientSize(width, height, rect[2], rect[3], thread_data); - } - - inline void GetClientSize(unsigned short &width, unsigned short &height, int win_width, int win_height) - { - GetClientSize(width, height, win_width, win_height, GetThreadData()); - } - - inline void GetTimeDate(int t[/* 6 */]) {GetTime(t); GetDate(t + 3);} - - inline void InitMutex(TMutex *mutex) {mutex->mut = 0;} - - inline void InitRecMutex(TRecMutex *mutex) {mutex->mut = 0; mutex->pid = -1;} - - inline bool TryLock(TRecMutex *mutex) {return TryLock(mutex, GetPid());} - - inline bool TryLock(TRecMutex *mutex, TThreadData thread_data) {return TryLock(mutex, GetPid(thread_data));} - - inline void Lock(TRecMutex *mutex) {Lock(mutex, GetPid());} - - inline void Lock(TRecMutex *mutex, TThreadData thread_data) {Lock(mutex, GetPid(thread_data));} - - inline bool LockTime(TRecMutex *mutex, int time) {return LockTime(mutex, time, GetPid());} - - inline bool LockTime(TRecMutex *mutex, int time, TThreadData thread_data) - {return LockTime(mutex, time, GetPid(thread_data));} - - inline void UnLock(TRecMutex *mutex) {UnLock(mutex, GetPid());} - - inline void UnLock(TRecMutex *mutex, TThreadData thread_data) {UnLock(mutex, GetPid(thread_data));} - - inline int GetThreadNumber() {return _ThreadNumber;} - -// Constants from fasm. - -#include - -// Functions. - - unsigned char _HashByte(unsigned int value); - unsigned short _HashWord(unsigned int value); - unsigned int _HashDword(unsigned int value); - - void _GetStartData(TStartData &start_data, TThreadData thread_data) - { - start_data.Left = (unsigned short)((unsigned long)thread_data[MENUET_THREAD_DATA_X] >> 16); - start_data.Width = (unsigned short)((unsigned long)thread_data[MENUET_THREAD_DATA_X]); - start_data.Top = (unsigned short)((unsigned long)thread_data[MENUET_THREAD_DATA_Y] >> 16); - start_data.Height = (unsigned short)((unsigned long)thread_data[MENUET_THREAD_DATA_Y]); - GetWindowData(start_data.WinData, thread_data); - } - - void _SetStartData(const TStartData &start_data, TThreadData thread_data) - { - (unsigned long&)thread_data[MENUET_THREAD_DATA_X] = - ((unsigned int)start_data.Left << 16) | start_data.Width; - (unsigned long&)thread_data[MENUET_THREAD_DATA_Y] = - ((unsigned int)start_data.Top << 16) | start_data.Height; - SetWindowData(start_data.WinData, thread_data); - } - - void _ApplyCommonColors(TWindowData &win_data) - { - unsigned int colors[10]; - ReadCommonColors(colors); - win_data.WindowColor = colors[5]; - win_data.HeaderColor = colors[1]; - win_data.BorderColor = colors[0]; - win_data.TitleColor = colors[4]; - } - - void _SetValueFunctionPriority(void *beg, int n) - { - int k, i; - unsigned char num[256]; - for (i = 0; i < 256; i++) num[i] = 0; - for (k = 0; k < n; k++) - { - i = ((unsigned char*)beg + 6*k)[1]; - ((unsigned char*)beg + 6*k)[0] = num[i]; - if (num[i] != 255) num[i]++; - } - } - - void _CallFunctionPriority(void *beg, void *end, bool reverse = false) - { - struct _Local - { - static int cmp(void *beg, int i, int j) - { - unsigned char *x = (unsigned char*)beg + 6*i; - unsigned char *y = (unsigned char*)beg + 6*j; - if (*(unsigned short*)x < *(unsigned short*)y) return -1; - if (*(unsigned short*)x > *(unsigned short*)y) return 1; - return 0; - } - - static void swap(void *beg, int i, int j) - { - unsigned char *x = (unsigned char*)beg + 6*i; - unsigned char *y = (unsigned char*)beg + 6*j; - short s; - int t; - s = *(short*)x; *(short*)x = *(short*)y; *(short*)y = s; - x += 2; y += 2; - t = *(int*)x; *(int*)x = *(int*)y; *(int*)y = t; - } - - static void call(void *beg, int i) - { - unsigned char *x = (unsigned char*)beg + 6*i; - (*(void(**)())(x+2))(); - } - }; - - if (!beg || !end || end <= beg) return; - int i, j, k, m, n; - n = ((unsigned char*)end - (unsigned char*)beg) / 6; - if (n <= 0) return; - _SetValueFunctionPriority(beg, n); - m = n; k = n; - while (m > 1) - { - if (k > 0) k--; - else _Local::swap(beg, 0, --m); - j = k; - for (;;) - { - i = j; - if (2*i + 1 >= m) break; - if (_Local::cmp(beg, 2*i + 1, j) > 0) j = 2*i + 1; - if (2*i + 2 < m && _Local::cmp(beg, 2*i + 2, j) > 0) j = 2*i + 2; - if (i == j) break; - _Local::swap(beg, i, j); - } - } - if (!reverse) - { - for (k = 0; k < n; k++) _Local::call(beg, k); - } - else - { - for (k = n-1; k >= 0; k--) _Local::call(beg, k); - } - } - - bool _CallStart(TThreadData thread_data, void *init = 0, void *init_end = 0) - { - struct _TThreadDataTemplate - { - unsigned int data[12]; - }; - static const _TThreadDataTemplate _ThreadDataTemplate = - {{3, 0x00320100, 0x00320100, 0x33FFFFFF, 0x806060FF, 0x00000000, 0x00FFFF40, 0, 0, 0, -1, -1}}; - - unsigned int pid = GetPid(); - volatile TThreadData *thread_table_item; - Lock(&_ThreadMutex); - if (_ExitProcessNow) ExitProcess(); - thread_table_item = &_ThreadTable[_HashByte(pid)]; - thread_data[MENUET_THREAD_DATA_NEXT] = (void*)*thread_table_item; - (unsigned int&)thread_data[MENUET_THREAD_DATA_PID] = pid; - *(_TThreadDataTemplate*)(thread_data + MENUET_THREAD_DATA_FLAG) = _ThreadDataTemplate; - *thread_table_item = thread_data; - UnLock(&_ThreadMutex); - if (_ExitProcessNow) ExitProcess(); - _CallFunctionPriority(init, init_end, false); - TStartData start_data; - _GetStartData(start_data, thread_data); -// _ApplyCommonColors(start_data.WinData); - (unsigned int&)thread_data[MENUET_THREAD_DATA_FLAG] |= 0x40000000; - thread_data[MENUET_THREAD_DATA_TITLE] = (void*)(&start_data); - if (!MenuetOnStart(start_data, thread_data)) return false; - (unsigned int&)thread_data[MENUET_THREAD_DATA_FLAG] &= ~0x40000000; - _SetStartData(start_data, thread_data); - return true; - } - - void _RemoveThreadData(TThreadData thread_data, void *exit = 0, void *exit_end = 0) - { - _CallFunctionPriority(exit, exit_end, true); - volatile TThreadData *thread_table_item; - Lock(&_ThreadMutex); - if (_ExitProcessNow) ExitProcess(); - thread_table_item = &_ThreadTable[_HashByte(GetPid(thread_data))]; - while (*thread_table_item) - { - if (*thread_table_item == thread_data) - { - *thread_table_item = (TThreadData)thread_data[MENUET_THREAD_DATA_NEXT]; - break; - } - thread_table_item = (TThreadData*)(*thread_table_item + MENUET_THREAD_DATA_NEXT); - } - UnLock(&_ThreadMutex); - if (_ExitProcessNow) ExitProcess(); - } - - void GetWindowData(TWindowData &win_data, TThreadData thread_data) - { - if ((unsigned int)thread_data[MENUET_THREAD_DATA_FLAG] & 0x40000000) - { - win_data = ((TStartData*)thread_data[MENUET_THREAD_DATA_TITLE])->WinData; - return; - } - win_data.WindowType = (unsigned short)((unsigned int)thread_data[MENUET_THREAD_DATA_C_WINDOW] >> 24); - win_data.HeaderType = (unsigned short)((unsigned int)thread_data[MENUET_THREAD_DATA_C_HEADER] >> 24); - win_data.WindowColor = (unsigned int)thread_data[MENUET_THREAD_DATA_C_WINDOW] & 0xFFFFFF; - win_data.HeaderColor = (unsigned int)thread_data[MENUET_THREAD_DATA_C_HEADER] & 0xFFFFFF; - win_data.BorderColor = (unsigned int)thread_data[MENUET_THREAD_DATA_C_BORDER] & 0xFFFFFF; - win_data.TitleColor = (unsigned int)thread_data[MENUET_THREAD_DATA_C_TITLE] & 0xFFFFFF; - win_data.Title = (char*)thread_data[MENUET_THREAD_DATA_TITLE]; - } - - void SetWindowData(const TWindowData &win_data, TThreadData thread_data) - { - if ((unsigned int)thread_data[MENUET_THREAD_DATA_FLAG] & 0x40000000) - { - ((TStartData*)thread_data[MENUET_THREAD_DATA_TITLE])->WinData = win_data; - return; - } - (unsigned int&)thread_data[MENUET_THREAD_DATA_C_WINDOW] = - ((unsigned int)win_data.WindowType << 24) | (win_data.WindowColor & 0xFFFFFF); - (unsigned int&)thread_data[MENUET_THREAD_DATA_C_HEADER] = - ((unsigned int)win_data.HeaderType << 24) | (win_data.HeaderColor & 0xFFFFFF); - (unsigned int&)thread_data[MENUET_THREAD_DATA_C_BORDER] = win_data.BorderColor & 0xFFFFFF; - (unsigned int&)thread_data[MENUET_THREAD_DATA_C_TITLE] = win_data.TitleColor & 0xFFFFFF; - thread_data[MENUET_THREAD_DATA_TITLE] = (void*)win_data.Title; - Invalidate(1, thread_data); - } - - void CloseWindow(TThreadData thread_data) - { - (unsigned int&)thread_data[MENUET_THREAD_DATA_FLAG] |= 0x80000000; - } - - void Invalidate(int frame, TThreadData thread_data) - { - if (frame < 0) return; - (unsigned int&)thread_data[MENUET_THREAD_DATA_FLAG] |= (frame ? 3 : 1); - } - - void* GetPicture(unsigned short &width, unsigned short &height, TThreadData thread_data) - { - width = (unsigned short)((unsigned int)thread_data[MENUET_THREAD_DATA_SZ_PICT] >> 16); - height = (unsigned short)((unsigned int)thread_data[MENUET_THREAD_DATA_SZ_PICT]); - return (void*)thread_data[MENUET_THREAD_DATA_PICTURE]; - } - - void SetPicture(void *picture, unsigned short width, unsigned short height, TThreadData thread_data) - { - thread_data[MENUET_THREAD_DATA_PICTURE] = (void*)picture; - (unsigned int&)thread_data[MENUET_THREAD_DATA_SZ_PICT] = - (width == 0 || height == 0) ? 0 : (((unsigned int)width << 16) | height); - Invalidate(0, thread_data); - } - - int _GetSkinHeader(); - - void GetBorderHeader(unsigned short &border_size, unsigned short &header_size, TThreadData thread_data) - { - int win_type = ((unsigned int)thread_data[MENUET_THREAD_DATA_FLAG] & 0x40000000) ? - ((TStartData*)thread_data[MENUET_THREAD_DATA_TITLE])->WinData.WindowType : - ((unsigned int)thread_data[MENUET_THREAD_DATA_C_WINDOW] >> 24); - border_size = MENUET_BORDER_SIZE; - header_size = short(((win_type & 15) == 3) ? _GetSkinHeader() : MENUET_HEADER_SIZE); - } - - void GetClientSize(unsigned short &width, unsigned short &height, - int win_width, int win_height, TThreadData thread_data) - { - const int MAX_SIZE = 32767; - unsigned short border_size, header_size; - GetBorderHeader(border_size, header_size, thread_data); - win_width -= 2 * border_size; - win_height -= border_size + header_size; - if (win_width < 0) win_width = 0; - else if (win_width > MAX_SIZE) win_width = MAX_SIZE; - if (win_height < 0) win_height = 0; - else if (win_height > MAX_SIZE) win_height = MAX_SIZE; - width = (unsigned short)win_width; - height = (unsigned short)win_height; - } - - void GetMousePosPicture(short &x, short &y) - { - unsigned short dx, dy; - GetMousePosition(x, y); - GetBorderHeader(dx, dy); - x -= dx; y -= dy; - } -} - -#else // def __MENUET__ - -namespace Menuet -{ - struct TMutex - { - unsigned int mut; - - TMutex(); - ~TMutex(); - }; -#undef MENUET_MUTEX_INIT -#define MENUET_MUTEX_INIT TMutex() - - struct TRecMutex - { - unsigned int mut; - - TRecMutex(); - ~TRecMutex(); - }; -#undef MENUET_REC_MUTEX_INIT -#define MENUET_REC_MUTEX_INIT TRecMutex() -} - -#endif // else: def __MENUET__ - -#endif // ndef __MENUET_H_INCLUDED_ - diff --git a/programs/games/checkers/trunk/include/stdarg.h b/programs/games/checkers/trunk/include/stdarg.h deleted file mode 100644 index 7abd7592eb..0000000000 --- a/programs/games/checkers/trunk/include/stdarg.h +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef __STDARG_H -#define __STDARG_H - -typedef void *va_list; - -#define __size(x) ((sizeof(x)+sizeof(int)-1) & ~(sizeof(int)-1)) - -#define va_start(ap, parmN) ((void)((ap) = (va_list)((char *)(&parmN)+__size(parmN)))) -#define va_arg(ap, type) (*(type *)(((*(char **)&(ap))+=__size(type))-(__size(type)))) -#define va_end(ap) ((void)0) - - -#endif /* __STDARG_H */ diff --git a/programs/games/checkers/trunk/include/write_macro.inc b/programs/games/checkers/trunk/include/write_macro.inc deleted file mode 100644 index 3015f65896..0000000000 --- a/programs/games/checkers/trunk/include/write_macro.inc +++ /dev/null @@ -1,49 +0,0 @@ -macro writestr [arg] -{ - common - - local straddr - local strend - pushad - push straddr - push strend - jmp @Menuet@DebugPutString$qpxc - straddr db arg,0 - strend: - pop eax - popad -} - -macro writeint arg -{ - push dword arg - xchg eax,[esp] - pushad - push eax - call @DebugPutNumber$qi - pop eax - popad - pop eax -} - -macro write [arg] -{ - forward - - if arg eq - else if arg eq endline - writestr 10 - else if arg eqtype '' - writestr arg - else - writeint arg - end if -} - -macro writeln [arg] -{ - common - - write arg,endline -} - diff --git a/programs/games/checkers/trunk/me_make.inc b/programs/games/checkers/trunk/me_make.inc deleted file mode 100644 index 173c2eb927..0000000000 --- a/programs/games/checkers/trunk/me_make.inc +++ /dev/null @@ -1,10 +0,0 @@ -;//NAME// checkers.cpp -;//COMPILER// bcc32 -S -v- -R- -6 -a4 -O2 -Og -Oi -Ov -OS -k- -D__MENUET__ -Iinclude -;//UTIL_PATH// . - -STACKSIZE equ 102400 -HEAPSIZE equ 102400 - -include "include\me_start.inc" -include "include\me_func.inc" -include "include\me_heap.inc" diff --git a/programs/games/checkers/trunk/mt-draw.h b/programs/games/checkers/trunk/mt-draw.h deleted file mode 100644 index 3adce2b73a..0000000000 --- a/programs/games/checkers/trunk/mt-draw.h +++ /dev/null @@ -1,79 +0,0 @@ -unsigned long cur_color; -class TKlbrGraphDraw : public TGraphDraw -{ -public: - virtual int SetColor(unsigned long c) {cur_color=c;return 1;} - virtual int DrawLine(int x0, int y0, int x1, int y1); - virtual int DrawText(int x0, int y0, char* text); - virtual int IsDraw(void) {return 1;} - virtual int DrawClear(); - virtual unsigned long CreateColor(unsigned short red, - unsigned short green, unsigned short blue); - virtual void GetSize(int &w, int &h); - virtual int GetTextH(const char *s) {return 10;} - virtual int GetTextW(const char *s) {return 6 * strlen(s);} - virtual void Quit(int q = 1) {CloseWindow();} -}; -int TKlbrGraphDraw::DrawLine(int x0, int y0, int x1, int y1) -{ - asm mov ebx, x0 - asm shl ebx, 16 - asm add ebx, x1 - asm mov ecx, y0 - asm shl ecx, 16 - asm add ecx, y1 - asm mov edx, [cur_color] - asm push 38 - asm pop eax - asm int 40h - return 1; -} -int TKlbrGraphDraw::DrawText(int x0, int y0, char* text) -{ - asm mov ebx, x0 - asm shl ebx, 16 - asm add ebx, y0 - asm mov ecx, [cur_color] - asm or ecx, 0xC0000000 - asm mov edx, text - asm mov edi, 0xFFFFFF - asm push 4 - asm pop eax - asm int 40h - return 1; -} -int TKlbrGraphDraw::DrawClear(void) -{ - int w,h; - GetSize(w,h); - asm mov ebx, w - asm mov ecx, h - asm mov edx, 0xFFFFFF - asm push 13 - asm pop eax - asm int 40h - return 1; -} -unsigned long TKlbrGraphDraw::CreateColor(unsigned short red, - unsigned short green, unsigned short blue) -{ - return (unsigned long)(blue >> 8) + ((unsigned long)(green >> 8) << 8) + - ((unsigned long)(red >> 8) << 16); -} -void TKlbrGraphDraw::GetSize(int &w, int &h) -{ - int width, height; - asm sub esp, 1024 - asm mov ebx, esp - asm or ecx, -1 - asm push 9 - asm pop eax - asm int 40h - asm mov eax, [esp+62] - asm mov width, eax - asm mov eax, [esp+66] - asm mov height, eax - asm add esp, 1024 - w = width; - h = height; -} diff --git a/programs/games/checkers/trunk/player.h b/programs/games/checkers/trunk/player.h index 8362d45b23..d1a673c48b 100644 --- a/programs/games/checkers/trunk/player.h +++ b/programs/games/checkers/trunk/player.h @@ -3,11 +3,9 @@ #include "position.h" #include "sysproc.h" -#ifndef __MENUET__ #include #include #include -#endif template class TBaseCompPlayer : public TChPlayer diff --git a/programs/games/checkers/trunk/position.h b/programs/games/checkers/trunk/position.h index 30599a773f..127051c091 100644 --- a/programs/games/checkers/trunk/position.h +++ b/programs/games/checkers/trunk/position.h @@ -1,12 +1,10 @@ #ifndef _HEADER_POSITION_H #define _HEADER_POSITION_H -#ifndef __MENUET__ #include #include #include #include -#endif #define NELEM(a) (sizeof(a) / sizeof((a)[0])) @@ -226,7 +224,7 @@ char *Position::WriteMv(const unsigned char mv[], char WP[], int how) int x, y; NumToPole(mv[i], x, y); WP[j++] = char('a' + NW_CELL - 1 - x); - int r = sprintf(WP + j, "%d", 1 + y); + int r = itoa(WP + j, 1 + y); if (r > 0) j += r; if (i != nmv) WP[j++] = '-'; } @@ -333,7 +331,7 @@ int Position::WriteMvEx(const unsigned char mv[], char WP[], int how) const if (WP) { WP[L++] = char('a' + NW_CELL - 1 - x0); - int r = sprintf(WP + L, "%d", 1 + y0); + int r = itoa(WP + L, 1 + y0); if (r > 0) L += r; } else diff --git a/programs/games/checkers/trunk/qsort.c b/programs/games/checkers/trunk/qsort.c deleted file mode 100644 index 6edc89a627..0000000000 --- a/programs/games/checkers/trunk/qsort.c +++ /dev/null @@ -1,331 +0,0 @@ -static void shortsort(char *lo, char *hi, unsigned width, - int (*comp)(const void *, const void *)); - -static void swap(char *p, char *q, unsigned width); - -/* this parameter defines the cutoff between using quick sort and - insertion sort for arrays; arrays with lengths shorter or equal to the - below value use insertion sort */ - -#define CUTOFF 8 /* testing shows that this is good value */ - -#define STKSIZ (8*sizeof(void*) - 2) - -/*** -*qsort(base, num, wid, comp) - quicksort function for sorting arrays -* -*Purpose: -* quicksort the array of elements -* side effects: sorts in place -* maximum array size is number of elements times size of elements, -* but is limited by the virtual address space of the processor -* -*Entry: -* char *base = pointer to base of array -* unsigned num = number of elements in the array -* unsigned width = width in bytes of each array element -* int (*comp)() = pointer to function returning analog of strcmp for -* strings, but supplied by user for comparing the array elements. -* it accepts 2 pointers to elements. -* Returns neg if 1<2, 0 if 1=2, pos if 1>2. -* -*Exit: -* returns void -* -*******************************************************************************/ - -void qsort ( - void *base, - unsigned num, - unsigned width, - int (*comp)(const void *, const void *) - ) -{ - /* Note: the number of stack entries required is no more than - 1 + log2(num), so 30 is sufficient for any array */ - char *lo, *hi; /* ends of sub-array currently sorting */ - char *mid; /* points to middle of subarray */ - char *loguy, *higuy; /* traveling pointers for partition step */ - unsigned size; /* size of the sub-array */ - char *lostk[STKSIZ], *histk[STKSIZ]; - int stkptr; /* stack for saving sub-array to be processed */ - - if (num < 2) - return; /* nothing to do */ - - stkptr = 0; /* initialize stack */ - - lo = (char *)base; - hi = (char *)base + width * (num-1); /* initialize limits */ - - /* this entry point is for pseudo-recursion calling: setting - lo and hi and jumping to here is like recursion, but stkptr is - preserved, locals aren't, so we preserve stuff on the stack */ -recurse: - - size = (hi - lo) / width + 1; /* number of el's to sort */ - - /* below a certain size, it is faster to use a O(n^2) sorting method */ - if (size <= CUTOFF) { - shortsort(lo, hi, width, comp); - } - else { - /* First we pick a partitioning element. The efficiency of the - algorithm demands that we find one that is approximately the median - of the values, but also that we select one fast. We choose the - median of the first, middle, and last elements, to avoid bad - performance in the face of already sorted data, or data that is made - up of multiple sorted runs appended together. Testing shows that a - median-of-three algorithm provides better performance than simply - picking the middle element for the latter case. */ - - mid = lo + (size / 2) * width; /* find middle element */ - - /* Sort the first, middle, last elements into order */ - if (comp(lo, mid) > 0) { - swap(lo, mid, width); - } - if (comp(lo, hi) > 0) { - swap(lo, hi, width); - } - if (comp(mid, hi) > 0) { - swap(mid, hi, width); - } - - /* We now wish to partition the array into three pieces, one consisting - of elements <= partition element, one of elements equal to the - partition element, and one of elements > than it. This is done - below; comments indicate conditions established at every step. */ - - loguy = lo; - higuy = hi; - - /* Note that higuy decreases and loguy increases on every iteration, - so loop must terminate. */ - for (;;) { - /* lo <= loguy < hi, lo < higuy <= hi, - A[i] <= A[mid] for lo <= i <= loguy, - A[i] > A[mid] for higuy <= i < hi, - A[hi] >= A[mid] */ - - /* The doubled loop is to avoid calling comp(mid,mid), since some - existing comparison funcs don't work when passed the same - value for both pointers. */ - - if (mid > loguy) { - do { - loguy += width; - } while (loguy < mid && comp(loguy, mid) <= 0); - } - if (mid <= loguy) { - do { - loguy += width; - } while (loguy <= hi && comp(loguy, mid) <= 0); - } - - /* lo < loguy <= hi+1, A[i] <= A[mid] for lo <= i < loguy, - either loguy > hi or A[loguy] > A[mid] */ - - do { - higuy -= width; - } while (higuy > mid && comp(higuy, mid) > 0); - - /* lo <= higuy < hi, A[i] > A[mid] for higuy < i < hi, - either higuy == lo or A[higuy] <= A[mid] */ - - if (higuy < loguy) - break; - - /* if loguy > hi or higuy == lo, then we would have exited, so - A[loguy] > A[mid], A[higuy] <= A[mid], - loguy <= hi, higuy > lo */ - - swap(loguy, higuy, width); - - /* If the partition element was moved, follow it. Only need - to check for mid == higuy, since before the swap, - A[loguy] > A[mid] implies loguy != mid. */ - - if (mid == higuy) - mid = loguy; - - /* A[loguy] <= A[mid], A[higuy] > A[mid]; so condition at top - of loop is re-established */ - } - - /* A[i] <= A[mid] for lo <= i < loguy, - A[i] > A[mid] for higuy < i < hi, - A[hi] >= A[mid] - higuy < loguy - implying: - higuy == loguy-1 - or higuy == hi - 1, loguy == hi + 1, A[hi] == A[mid] */ - - /* Find adjacent elements equal to the partition element. The - doubled loop is to avoid calling comp(mid,mid), since some - existing comparison funcs don't work when passed the same value - for both pointers. */ - - higuy += width; - if (mid < higuy) { - do { - higuy -= width; - } while (higuy > mid && comp(higuy, mid) == 0); - } - if (mid >= higuy) { - do { - higuy -= width; - } while (higuy > lo && comp(higuy, mid) == 0); - } - - /* OK, now we have the following: - higuy < loguy - lo <= higuy <= hi - A[i] <= A[mid] for lo <= i <= higuy - A[i] == A[mid] for higuy < i < loguy - A[i] > A[mid] for loguy <= i < hi - A[hi] >= A[mid] */ - - /* We've finished the partition, now we want to sort the subarrays - [lo, higuy] and [loguy, hi]. - We do the smaller one first to minimize stack usage. - We only sort arrays of length 2 or more.*/ - - if ( higuy - lo >= hi - loguy ) { - if (lo < higuy) { - lostk[stkptr] = lo; - histk[stkptr] = higuy; - ++stkptr; - } /* save big recursion for later */ - - if (loguy < hi) { - lo = loguy; - goto recurse; /* do small recursion */ - } - } - else { - if (loguy < hi) { - lostk[stkptr] = loguy; - histk[stkptr] = hi; - ++stkptr; /* save big recursion for later */ - } - - if (lo < higuy) { - hi = higuy; - goto recurse; /* do small recursion */ - } - } - } - - /* We have sorted the array, except for any pending sorts on the stack. - Check if there are any, and do them. */ - - --stkptr; - if (stkptr >= 0) { - lo = lostk[stkptr]; - hi = histk[stkptr]; - goto recurse; /* pop subarray from stack */ - } - else - return; /* all subarrays done */ -} - - -/*** -*shortsort(hi, lo, width, comp) - insertion sort for sorting short arrays -*shortsort_s(hi, lo, width, comp, context) - insertion sort for sorting short arrays -* -*Purpose: -* sorts the sub-array of elements between lo and hi (inclusive) -* side effects: sorts in place -* assumes that lo < hi -* -*Entry: -* char *lo = pointer to low element to sort -* char *hi = pointer to high element to sort -* unsigned width = width in bytes of each array element -* int (*comp)() = pointer to function returning analog of strcmp for -* strings, but supplied by user for comparing the array elements. -* it accepts 2 pointers to elements, together with a pointer to a context -* (if present). Returns neg if 1<2, 0 if 1=2, pos if 1>2. -* void *context - pointer to the context in which the function is -* called. This context is passed to the comparison function. -* -*Exit: -* returns void -* -*Exceptions: -* -*******************************************************************************/ - -static void shortsort ( - char *lo, - char *hi, - unsigned width, - int (*comp)(const void *, const void *) - ) -{ - char *p, *max; - - /* Note: in assertions below, i and j are alway inside original bound of - array to sort. */ - - while (hi > lo) { - /* A[i] <= A[j] for i <= j, j > hi */ - max = lo; - for (p = lo+width; p <= hi; p += width) { - /* A[i] <= A[max] for lo <= i < p */ - if (comp(p, max) > 0) { - max = p; - } - /* A[i] <= A[max] for lo <= i <= p */ - } - - /* A[i] <= A[max] for lo <= i <= hi */ - - swap(max, hi, width); - - /* A[i] <= A[hi] for i <= hi, so A[i] <= A[j] for i <= j, j >= hi */ - - hi -= width; - - /* A[i] <= A[j] for i <= j, j > hi, loop top condition established */ - } - /* A[i] <= A[j] for i <= j, j > lo, which implies A[i] <= A[j] for i < j, - so array is sorted */ -} - -/*** -*swap(a, b, width) - swap two elements -* -*Purpose: -* swaps the two array elements of size width -* -*Entry: -* char *a, *b = pointer to two elements to swap -* unsigned width = width in bytes of each array element -* -*Exit: -* returns void -* -*Exceptions: -* -*******************************************************************************/ - -static void swap ( - char *a, - char *b, - unsigned width - ) -{ - char tmp; - - if ( a != b ) - /* Do the swap one character at a time to avoid potential alignment - problems. */ - while ( width-- ) { - tmp = *a; - *a++ = *b; - *b++ = tmp; - } -} diff --git a/programs/games/checkers/trunk/sysproc.h b/programs/games/checkers/trunk/sysproc.h index caba2c2d71..d3e76e0c1d 100644 --- a/programs/games/checkers/trunk/sysproc.h +++ b/programs/games/checkers/trunk/sysproc.h @@ -1,19 +1,23 @@ #ifndef _HEADER_SYSTEM_PROCESS_H #define _HEADER_SYSTEM_PROCESS_H -#ifndef __MENUET__ #include #include -#endif -#if defined __GNUC__ +#if defined _KOLIBRI +# define DIR_SEPARATOR ('/') + inline long GetProcessId() {return 0;} + inline long DuplicateProcess() {return -1;} + inline int random(int m) {return ((unsigned long)rand()) % m;} + inline void randomize() {srand(__menuet__getsystemclock());} +#elif defined __GNUC__ # include # define DIR_SEPARATOR ('/') inline long GetProcessId() {return (long)getpid();} inline long DuplicateProcess() {return (long)fork();} inline int random(int m) {return ((unsigned long)rand()) % m;} inline void randomize() {srand(time(0));} -#elif defined __TURBOC__ && !defined __MENUET__ +#elif defined __TURBOC__ # include # define DIR_SEPARATOR ('\\') inline long GetProcessId() {return (long)getpid();} diff --git a/programs/games/checkers/trunk/t2fasm.exe b/programs/games/checkers/trunk/t2fasm.exe deleted file mode 100644 index cad968b59c30c9d87435fff16b56329525f91022..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5120 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 bnlMlBH5?oqp3I2>_W;0R%X_=O|7-r=B|{F| diff --git a/programs/games/checkers/trunk/win-draw.h b/programs/games/checkers/trunk/win-draw.h index af9cd06688..d9e353494f 100644 --- a/programs/games/checkers/trunk/win-draw.h +++ b/programs/games/checkers/trunk/win-draw.h @@ -19,8 +19,9 @@ #define main OwlMain -class TWinGraphDraw : public TGraphDraw +class TWinGraphDraw : public TBaseGraphDraw { + typedef TBaseGraphDraw TGraphDraw; public: TWinGraphDraw(const char *s = 0); ~TWinGraphDraw(); diff --git a/programs/use_gcc.lua b/programs/use_gcc.lua index 7c304b0336..c1b02f489a 100644 --- a/programs/use_gcc.lua +++ b/programs/use_gcc.lua @@ -1,4 +1,6 @@ -CFLAGS = "-Os -fno-ident -fomit-frame-pointer -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -mpreferred-stack-boundary=2 -fno-exceptions -fno-asynchronous-unwind-tables -ffast-math -mno-ms-bitfields" +CFLAGS = "-Os -fno-ident -fomit-frame-pointer -fno-stack-check -fno-stack-protector -mno-stack-arg-probe -mpreferred-stack-boundary=2 -fno-exceptions -fno-asynchronous-unwind-tables -ffast-math -mno-ms-bitfields -march=pentium-mmx" +CFLAGS_c = "" -- extra flags for *.c +CFLAGS_cpp = " -fno-rtti" -- extra flags for *.cpp LDFLAGS = "-nostdlib -n --file-alignment=16 --section-alignment=16" INCLUDES = "" LIBS = "" @@ -8,7 +10,7 @@ OBJS = {} function compile_gcc(input, output) if not output then output = '%B.o' end tup.append_table(OBJS, - tup.foreach_rule(input, "kos32-gcc -c " .. CFLAGS .. " " .. INCLUDES .. " -o %o %f", output) + tup.foreach_rule(input, "kos32-gcc -c " .. CFLAGS .. "$(CFLAGS_%e) " .. INCLUDES .. " -o %o %f", output) ) end