diff --git a/data/Tupfile.lua b/data/Tupfile.lua
index bd538ab7a..c3f2d041a 100644
--- a/data/Tupfile.lua
+++ b/data/Tupfile.lua
@@ -38,7 +38,6 @@ img_files = {
{"UNIMG", SRC_PROGS .. "/fs/unimg/unimg"},
{"3D/HOUSE.3DS", "common/3d/house.3ds"},
{"File Managers/ICONS.INI", "common/File Managers/icons.ini"},
- {"GAMES/FLPYBIRD", SRC_PROGS .. "/games/floppybird/Release/floppybird"},
{"FONTS/TAHOMA.KF", "common/fonts/tahoma.kf"},
-- {"LIB/ICONV.OBJ", "common/lib/iconv.obj"},
{"LIB/KMENU.OBJ", "common/lib/kmenu.obj"},
@@ -725,6 +724,7 @@ tup.append_table(img_files, {
{"NETWORK/WHOIS", VAR_PROGS .. "/network/whois/whois"},
{"SHELL", VAR_PROGS .. "/system/shell/shell"},
{"GAMES/DINO", VAR_PROGS .. "/games/dino/dino"},
+ {"GAMES/FLPYBIRD", VAR_PROGS .. "/games/flpybird/flpybird"},
})
tup.append_table(extra_files, {
{"kolibrios/utils/thashview", VAR_PROGS .. "/other/TinyHashView/thashview"},
diff --git a/programs/games/floppybird/README.md b/programs/games/floppybird/README.md
deleted file mode 100644
index 27536db02..000000000
--- a/programs/games/floppybird/README.md
+++ /dev/null
@@ -1,7 +0,0 @@
-## Floppy Bird for KolibriOS
-
-* [Forum topic](http://board.kolibrios.org/viewtopic.php?f=41&t=4471)
-* [Directory in official KolibriOS GIT repository] kolibrios\programs\games\floppybird
-
-
-
diff --git a/programs/games/floppybird/Release/floppybird b/programs/games/floppybird/Release/floppybird
deleted file mode 100644
index 0a513fb0c..000000000
Binary files a/programs/games/floppybird/Release/floppybird and /dev/null differ
diff --git a/programs/games/floppybird/flappybird.vcxproj b/programs/games/floppybird/flappybird.vcxproj
deleted file mode 100644
index 93b439cb5..000000000
--- a/programs/games/floppybird/flappybird.vcxproj
+++ /dev/null
@@ -1,73 +0,0 @@
-
-
-
-
- Release
- Win32
-
-
-
- {0556BA3E-9447-4000-8613-91AD1CD750D7}
- floppybird
-
-
-
- Application
- false
- true
- MultiByte
-
-
-
-
-
-
-
-
-
- false
- false
-
-
-
- Level3
- MinSpace
- true
- true
- false
- MultiThreaded
- smalllibc
- true
- Size
- false
-
-
- false
- true
- true
- true
- fakeEntry
- Native
- /merge:.data=.text /merge:.rdata=.text /merge:.1seg=.text /section:.bss,E %(AdditionalOptions)
- true
-
-
- set EXENAME=$(TargetPath)
-"C:\kolibri\fasm\FASM.EXE" $(ProjectDir)smalllibc\doexe2.asm $(TargetDir)$(TargetName)
-
-
-
-
-
-
-
- {0D291390-1953-4E1F-BBE2-57F12AFF3214}
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/programs/games/floppybird/flappybird.vcxproj.filters b/programs/games/floppybird/flappybird.vcxproj.filters
deleted file mode 100644
index d798c5512..000000000
--- a/programs/games/floppybird/flappybird.vcxproj.filters
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Файлы исходного кода
-
-
-
-
- Файлы исходного кода
-
-
-
\ No newline at end of file
diff --git a/programs/games/floppybird/floppybird.cpp b/programs/games/floppybird/floppybird.cpp
deleted file mode 100644
index 2e1952621..000000000
--- a/programs/games/floppybird/floppybird.cpp
+++ /dev/null
@@ -1,436 +0,0 @@
-#include
-#include
-#include "images.hpp"
-
-//Global const strings
-const char HEADER_STRING[] = "Floppy bird";
-const char CONTROL_STRING[] = "SPACEBAR TO JUMP";
-const char GAMEOVER_STRING[] = "GAMEOVER";
-const char ANY_KEY_STRING[] = "Press any key for restart";
-const char SELECT_SPEED_STRING[] = "select the speed of the game";
-const char FAST_STRING[] = "1 FAST";
-const char SLOW_STRING[] = "2 SLOW";
-
-//Global const variables
-const int WINDOW_WIDTH = 400;
-const int WINDOW_HEIGHT = 400;
-const int BORDER_TOP = 24;
-const int BORDER_LEFT = 5;
-const int BORDER_RIGHT = 5;
-const int BORDER_DOWN = 5;
-
-enum GameState
-{
- GAMESTATE_MENU,
- GAMESTATE_STARTED,
- GAMESTATE_GAMEOVER
-};
-
-struct ScreenSize
-{
- int width;
- int height;
-};
-
-class Bird
-{
-public:
- static const int sizeX = 19;
- static const int sizeY = 20;
- static const int x = 100;
- int prev_y;
- int y;
- int acceleration;
-
- inline void initialize()
- {
- y = WINDOW_HEIGHT / 2;
- acceleration = 0;
- }
-
- inline void move()
- {
- if (acceleration <= 30)
- acceleration += 2;
- prev_y = y;
- y += acceleration / 10;
- }
-
- inline void jump()
- {
- acceleration = -50;
- }
-
- inline void draw()
- {
- kos_PutImage(birdImage, sizeX, sizeY, x, y);
- }
-};
-
-class Tube
-{
-public:
- static const int width = 50;
- static const int gapHeight = 100;
- static const int headHeight = 18;
- int x;
- int gapY;
-
- inline void randomize()
- {
- x = WINDOW_WIDTH + 1;
- gapY = rtlRand() % 200 + 50;
- }
-
- inline void move()
- {
- x -= 2;
- if (x < -width - 2)
- randomize();
- }
-
- void draw()
- {
- //cleanup
- int pixels = (WINDOW_WIDTH - (BORDER_LEFT + BORDER_RIGHT - 1)) - (x + width + 2);
- if (pixels >= -1)
- {
- pixels = (pixels == -1) ? 1 : 2;
- kos_DrawBar(x + width, gapY - headHeight, pixels, headHeight, 0x00FFFF);
- kos_DrawBar(x + width, gapY + gapHeight, pixels, headHeight, 0x00FFFF);
- }
-
- int offset = x >= 0 ? 0 : -x;
- int trim = x + width >= WINDOW_WIDTH - (BORDER_LEFT + BORDER_RIGHT - 1) ? WINDOW_WIDTH - x - width - (BORDER_LEFT + BORDER_RIGHT - 1) : 0;
- int trimHead = x + width >= WINDOW_WIDTH - (BORDER_LEFT + BORDER_RIGHT - 1) ? WINDOW_WIDTH - x - width - (BORDER_LEFT + BORDER_RIGHT - 1) : 0;
-
- //top
- for (int y = 0; y < gapY - headHeight; ++y)
- kos_PutImage(tubeBodyImage + offset, width - offset + trim, 1, x + offset, y);
- //head top
- for (int y = gapY - headHeight; y < gapY; ++y)
- kos_PutImage(tubeHeadImage + width * (y - (gapY - headHeight)) + offset, width - offset + trimHead, 1, x + offset, y);
- //head down
- for (int y = gapY + gapHeight; y < gapY + gapHeight + headHeight; ++y)
- kos_PutImage(tubeHeadImage + width * (y - (gapY + gapHeight)) + offset, width - offset + trimHead, 1, x + offset, y);
- //down
- for (int y = gapY + gapHeight + headHeight; y < WINDOW_HEIGHT - (BORDER_TOP + BORDER_DOWN - 1); ++y)
- kos_PutImage(tubeBodyImage + offset, width - offset + trim, 1, x + offset, y);
-
- }
-};
-
-//Global variables
-int loopDelay;
-GameState gameState;
-char scoreString[] = "Score: ";
-bool scoreChanged;
-int score;
-Bird bird;
-int tubeNumber;
-Tube tubes[3];
-int windowX;
-int windowY;
-
-//Function prototypes
-void kos_Main();
-void startGame();
-ScreenSize getScreenSize();
-void updateScoreString();
-void WriteBorderedText(Word x, Word y, Byte fontType, Dword textColor, const char* textPtr, Dword textLen, Dword borderColor, int borderSize);
-inline bool checkAddScore(Tube tube);
-inline bool checkCollision(Tube tube);
-
-void drawMenuWindow();
-void drawGameWindow();
-void redrawGameWindow();
-void drawGameoverWindow();
-
-//Functions
-
-void startGame()
-{
- kos_SetMaskForEvents(0x7); /// 111 in binary
-
- bird.initialize();
-
- score = 0;
- memset((Byte*)scoreString + 6, ' ', 3);
- updateScoreString();
-
- tubeNumber = 1;
- tubes[0].randomize();
-
- gameState = GAMESTATE_STARTED;
- drawGameWindow();
-}
-
-ScreenSize getScreenSize()
-{
- Dword result;
- __asm {
- push 14 //System function 14
- pop eax
- int 0x40
- mov result, eax
- }
- ScreenSize screenSize;
- screenSize.height = (result & 0xFFFF) + 1; //last two bytes
- screenSize.width = (result >> 16) + 1; //first two bytes
- return screenSize;
-}
-
-void kos_Main()
-{
- rtlSrand( kos_GetSystemClock() );
-
- //Centring window
- ScreenSize screenSize = getScreenSize();
- windowX = (screenSize.width - WINDOW_WIDTH) / 2;
- windowY = (screenSize.height - WINDOW_HEIGHT) / 2;
-
- gameState = GAMESTATE_MENU;
-
- kos_SetMaskForEvents(0x27); // 100111 in binary
-
- while( true )
- {
- switch (gameState)
- {
- case GAMESTATE_STARTED:
- kos_Pause(loopDelay);
-
- bird.move();
-
- //Adding new tubes
- if ((tubeNumber == 1 || tubeNumber == 2) && (tubes[tubeNumber - 1].x < (WINDOW_WIDTH - WINDOW_WIDTH / 3)))
- tubes[tubeNumber++].randomize();
-
- //Processing all tubes
- scoreChanged = false;
- for (int i = 0; i < tubeNumber; ++i)
- {
- //Adding score
- if (checkAddScore(tubes[i]))
- {
- ++score;
- scoreChanged = true;
- }
-
- //Check collision with bird
- if (checkCollision(tubes[i]))
- {
- gameState = GAMESTATE_GAMEOVER;
- continue;
- }
-
- //Move tube
- tubes[i].move();
- }
-
- if (scoreChanged)
- updateScoreString();
-
- //Cheking the bird is too high or low
- if (bird.y + bird.sizeY > WINDOW_HEIGHT - (BORDER_TOP + BORDER_DOWN - 1) || bird.y < 0)
- {
- gameState = GAMESTATE_GAMEOVER;
- continue;
- }
-
- redrawGameWindow();
-
- switch (kos_CheckForEvent())
- {
- case 1:
- drawGameWindow();
- break;
-
- case 2: // key pressed
- Byte keyCode;
- kos_GetKey(keyCode);
- if (keyCode == 32) //if pressed key is spacebar
- bird.jump();
- break;
-
- case 3: // button pressed; we have only one button, close
- kos_ExitApp();
- }
- break;
-
- case GAMESTATE_GAMEOVER:
- drawGameoverWindow();
-
- switch (kos_WaitForEvent())
- {
- case 1:
- drawGameoverWindow();
- break;
-
- case 2:
- startGame();
- break;
-
- case 3:
- kos_ExitApp();
- }
- break;
-
- case GAMESTATE_MENU:
- switch (kos_WaitForEvent())
- {
- case 1:
- drawMenuWindow();
- break;
-
- case 2:
- Byte keyCode;
- kos_GetKey(keyCode);
- if (keyCode == 0x31 || keyCode == 0x61) //1 or NumPad1
- {
- loopDelay = 1;
- startGame();
- }
- else if (keyCode == 0x32 || keyCode == 0x62) //2 or NumPad2
- {
- loopDelay = 2;
- startGame();
- }
- break;
-
- case 3:
- kos_ExitApp();
-
- case 6:
- Dword result;
- __asm {
- push 37 //Function 37 - work with mouse
- pop eax
- mov ebx, 3 //Subfunction 3 - states and events of the mouse buttons
- int 0x40
- mov result, eax
- }
- result &= 0x100; //bit 8 is set = left button is pressed
- if ( result )
- {
- Dword coordinates;
- __asm {
- push 37 //Function 37 - work with mouse
- pop eax
- mov ebx, 1 //Subfunction 1 - coordinates of the mouse relative to the window
- int 0x40
- mov coordinates, eax
- }
- int clickX = coordinates >> 16;
- int clickY = coordinates & 0xFFFF;
- if (clickX >= 100 && clickX < 390 && clickY >= 170 && clickY < 230)
- {
- loopDelay = 1;
- startGame();
- }
- else if (clickX >= 100 && clickX < 390 && clickY >= 270 && clickY < 330)
- {
- loopDelay = 2;
- startGame();
- }
- }
- break;
- }
- break;
- }
- }
-}
-
-void drawGameWindow()
-{
- kos_DefineAndDrawWindow(windowX, windowY, WINDOW_WIDTH, WINDOW_HEIGHT, 0x33, 0x00FFFF, 0, 0, (Dword)HEADER_STRING);
- bird.draw();
- for (int i = 0; i < tubeNumber; ++i)
- tubes[i].draw();
- kos_WriteTextToWindow(10, 10, 0x81, 0x000000, scoreString, 0);
- kos_WriteTextToWindow(10, 30, 0x81, 0x000000, CONTROL_STRING, 0);
-}
-void redrawGameWindow()
-{
- //cleaning the screen
- if (scoreChanged)
- kos_DrawBar(80, 10, 50, 15, 0x00FFFF);
- if (bird.y > bird.prev_y)
- kos_DrawBar(bird.x, bird.prev_y, bird.sizeX, bird.y - bird.prev_y, 0x00FFFF);
- else
- kos_DrawBar(bird.x, bird.y + bird.sizeY, bird.sizeX, bird.prev_y - bird.y, 0x00FFFF);
-
- bird.draw();
- for (int i = 0; i < tubeNumber; ++i)
- tubes[i].draw();
-
- kos_WriteTextToWindow(10, 10, 0x81, 0x000000, scoreString, 0);
- kos_WriteTextToWindow(10, 30, 0x81, 0x000000, CONTROL_STRING, 0);
-}
-
-void drawGameoverWindow()
-{
- kos_DefineAndDrawWindow(windowX, windowY, WINDOW_WIDTH, WINDOW_HEIGHT, 0x33, 0x000000, 0, 0, (Dword)HEADER_STRING);
- kos_WriteTextToWindow(125, 50, 0x82, 0xFFFFFF, GAMEOVER_STRING, 0);
- kos_WriteTextToWindow(135, 100, 0x81, 0xFFFFFF, scoreString, 0);
- kos_WriteTextToWindow(50, 150, 0x81, 0xFFFFFF, ANY_KEY_STRING, 0);
-}
-
-void WriteBorderedText(Word x, Word y, Byte fontType, Dword textColor, const char *textPtr, Dword textLen, Dword borderColor, int borderSize)
-{
- kos_WriteTextToWindow(x - borderSize, y - borderSize, fontType, borderColor, textPtr, textLen);
- kos_WriteTextToWindow(x - borderSize, y + borderSize, fontType, borderColor, textPtr, textLen);
- kos_WriteTextToWindow(x + borderSize, y - borderSize, fontType, borderColor, textPtr, textLen);
- kos_WriteTextToWindow(x + borderSize, y + borderSize, fontType, borderColor, textPtr, textLen);
- kos_WriteTextToWindow(x, y, fontType, textColor, textPtr, textLen);
-}
-
-void drawMenuWindow()
-{
- kos_DefineAndDrawWindow(windowX, windowY, WINDOW_WIDTH, WINDOW_HEIGHT, 0x33, 0x00FFFF, 0, 0, (Dword)HEADER_STRING);
-
- WriteBorderedText(85, 40, 0x4, 0xFFFFFF, HEADER_STRING, 6, 0x000000, 2);
- WriteBorderedText(185, 80, 0x84, 0xFFFFFF, HEADER_STRING + 7, 0, 0x000000, 2);
-
- RGB* pos = &tubeHeadImage[0];
- for (int x = 100 - 1; x >= 100 - Tube::headHeight; --x)
- for (int y = 170; y < 170 + Tube::width; ++y)
- {
- kos_PutPixel(x, y, (pos->r << 16) + (pos->g << 8) + (pos->b)); //first tube
- kos_PutPixel(x, y+100, (pos->r << 16) + (pos->g << 8) + (pos->b)); //second tube
- ++pos;
- }
-
- //First button
- for(int x = 100; x < WINDOW_WIDTH - (BORDER_LEFT + BORDER_RIGHT - 1); ++x)
- kos_PutImage(tubeBodyImage, 1, Tube::width, x, 170);
- WriteBorderedText(140, 185, 0x82, 0x000000, FAST_STRING, 0, 0xFFFFFF, 1);
-
- //Second button
- for (int x = 100; x < WINDOW_WIDTH - (BORDER_LEFT + BORDER_RIGHT - 1); ++x)
- kos_PutImage(tubeBodyImage, 1, Tube::width, x, 270);
- WriteBorderedText(140, 285, 0x82, 0x000000, SLOW_STRING, 0, 0xFFFFFF, 1);
-}
-
-inline bool checkCollision(Tube tube)
-{
- return ((tube.x <= (bird.x + bird.sizeX) && tube.x + tube.width >= bird.x)
- && (bird.y <= tube.gapY || bird.y + bird.sizeY >= tube.gapY + tube.gapHeight));
-}
-
-inline bool checkAddScore(Tube tube)
-{
- //int diff = bird.x - (tube.x + tube.width);
- //return diff == 0 || diff == 1;
- return ((bird.x - (tube.x + tube.width)) >> 1) == 0;
-}
-
-void updateScoreString()
-{
- int temp = score;
- int index = 9;
- do {
- scoreString[index--] = temp % 10 + '0';
- temp /= 10;
- } while (temp > 0);
-}
\ No newline at end of file
diff --git a/programs/games/floppybird/floppybird.sln b/programs/games/floppybird/floppybird.sln
deleted file mode 100644
index b540c5702..000000000
--- a/programs/games/floppybird/floppybird.sln
+++ /dev/null
@@ -1,20 +0,0 @@
-Microsoft Visual Studio Solution File, Format Version 11.00
-# Visual Studio 2010
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "floppybird", "floppybird.vcxproj", "{0556BA3E-9447-4000-8613-91AD1CD750D7}"
- ProjectSection(ProjectDependencies) = postProject
- {0D291390-1953-4E1F-BBE2-57F12AFF3214} = {0D291390-1953-4E1F-BBE2-57F12AFF3214}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "smalllibc", "smalllibc\smalllibc.vcxproj", "{0D291390-1953-4E1F-BBE2-57F12AFF3214}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Release|Win32 = Release|Win32
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {0556BA3E-9447-4000-8613-91AD1CD750D7}.Release|Win32.ActiveCfg = Release|Win32
- {0556BA3E-9447-4000-8613-91AD1CD750D7}.Release|Win32.Build.0 = Release|Win32
- {0D291390-1953-4E1F-BBE2-57F12AFF3214}.Release|Win32.ActiveCfg = Release|Win32
- {0D291390-1953-4E1F-BBE2-57F12AFF3214}.Release|Win32.Build.0 = Release|Win32
- EndGlobalSection
-EndGlobal
diff --git a/programs/games/floppybird/images.hpp b/programs/games/floppybird/images.hpp
deleted file mode 100644
index 084807f86..000000000
--- a/programs/games/floppybird/images.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#pragma once
-
-#include
-
-static RGB birdImage[] = {
-0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0xC08040, 0xC08040, 0xC08040, 0x608080, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x00FFFF, 0x40C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0xC08040, 0xE0C080, 0xC08040, 0xE0C080, 0x806040, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xC0DCC0, 0xA06040, 0x80C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x80C0C0, 0xE0A040, 0xE0E080, 0xE0C080, 0xE0E080, 0x806040, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xC08040, 0xE0C080, 0xA06040, 0x20C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0xC06040, 0xE0C080, 0xC0A080, 0xC0A080, 0xA0A080, 0x806040, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xC08040, 0xE0C080, 0xE0E080, 0xA06040, 0x20C0C0, 0x00FFFF, 0x00FFFF, 0xA06040, 0xC08040, 0x800040, 0x800040, 0xE02080, 0xE060C0, 0x40C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xA06040, 0xC08040, 0xE0E080, 0xC0DCC0, 0xA06040, 0x20C0C0, 0x20C0C0, 0xC06040, 0x808080, 0xE02080, 0xE020C0, 0xE02080, 0xE0A0C0, 0x804080, 0x40C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xC08040, 0xE0A040, 0xE0C080, 0xE0E080, 0xFFFBF0, 0x806040, 0xC06040, 0xC0DCC0, 0x800040, 0xE040C0, 0xE040C0, 0x002040, 0xE0E080, 0xA0A080, 0x404040, 0x404040, 0x806080, 0x806080, 0xA08080,
-0xA06040, 0xE0A040, 0xC08040, 0xE0C080, 0xFFFBF0, 0xC0DCC0, 0xA06040, 0xC0DCC0, 0xE020C0, 0xE0C080, 0xE0C080, 0xE0E080, 0xE0E000, 0xA0A0A4, 0xC0A080, 0x20A080, 0x40A0C0, 0x40A0C0, 0x60C0C0,
-0x20C0C0, 0xA06040, 0xE0A040, 0xC08040, 0xE0C040, 0xFFFBF0, 0xC0C080, 0x80A040, 0xC00080, 0xFFFF00, 0xFFFF00, 0xE0E080, 0xC0A040, 0xA0A080, 0x60A080, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x00FFFF, 0x80A080, 0xC08040, 0xE0A040, 0xE0A040, 0xE0C080, 0xFFFBF0, 0xC0C0C0, 0xE0C040, 0xE0E040, 0xC0E000, 0xC0C080, 0xA0A080, 0xC0C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x00FFFF, 0x40C0C0, 0x80A080, 0xE0A040, 0xE0C080, 0xE0C040, 0xE0E080, 0x80E080, 0xC0E000, 0xE0E080, 0xE0E080, 0xE0E080, 0xC0A080, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x00FFFF, 0x00FFFF, 0x40C0C0, 0xA06040, 0xA0C040, 0xA0A040, 0xA0C080, 0xC0E000, 0xC0E000, 0xE0E080, 0xE0E080, 0xE0E080, 0xE0E080, 0x40C080, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x60E080, 0xC0DCC0, 0x00FFFF, 0x80C0C0, 0x606080, 0x606080, 0xA0E040, 0xC0E000, 0xE0E000, 0xE0E080, 0xE0E080, 0xE0E080, 0xC0C040, 0x60A040, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xC0E080, 0xC0C000, 0xE0E000, 0xC0DCC0, 0x80A040, 0xA0E040, 0xA0C040, 0xC0E000, 0xE0E080, 0xE0E080, 0xE0E080, 0xC0E000, 0xC0C000, 0x60A040, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xA0A0A4, 0xA0A080, 0xA0E040, 0xC0E000, 0x80A080, 0xA0C040, 0xC0E000, 0xE0E040, 0xE0E080, 0xE0E080, 0xC0E000, 0xA0E040, 0x808040, 0x20C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xC0E080, 0xE0E000, 0xA0A080, 0x80A080, 0xA0C040, 0xE0E040, 0xE0E040, 0xE0E040, 0xC0E040, 0xC0E000, 0xA0E040, 0x808040, 0xA0C080, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x80A080, 0xA0C000, 0xC0E000, 0xA0E040, 0xA0C040, 0xC0E000, 0xC0E000, 0xC0E000, 0xC0E000, 0xA0E040, 0x80A040, 0x80C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xA0C000, 0x6080C0, 0xA0C040, 0xC0E000, 0xC0E000, 0xC0E000, 0xC0E000, 0xA0C040, 0x80A040, 0x808040, 0xA0C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0x80A080, 0xA0C080, 0xC0E000, 0xA0E040, 0xC0E040, 0x808040, 0x808040, 0x808040, 0xA0C0C0, 0x20C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF,
-0xA0E080, 0x808040, 0xA0A040, 0x808040, 0x808040, 0x80C0C0, 0xA0C0C0, 0x20C0C0, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF, 0x00FFFF
-};
-
-static RGB tubeBodyImage[] = {
-0x00FFFF, 0x00FFFF, 0x000000, 0x608040, 0x80E040, 0xE0E080, 0xA0E040, 0xA0E040, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x80E040, 0x60A000, 0x60A000, 0x80E040, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x40A000, 0x60A000, 0x408000, 0x408000, 0x204000, 0x60A000, 0x408000, 0x408000, 0x204000, 0x206000, 0x204000, 0x200040, 0x00FFFF, 0x00FFFF
-};
-
-static RGB tubeHeadImage[] = {
-0x200040, 0x200040, 0x200040, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040,
-0x402000, 0x408000, 0x408000, 0x608040, 0x80A040, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xC0C080, 0xA0C040, 0x60A040, 0x60A040, 0xA0C080, 0xA0C080, 0x60A040, 0x60A040, 0x80A040, 0x60A040, 0x60A040, 0x60A040, 0x60A040, 0x60A040, 0x80A040, 0x80A040, 0x80A040, 0x80A040, 0x608000, 0x406000, 0x204000, 0x204000, 0x402000,
-0x402000, 0x60C000, 0x60C000, 0x80C040, 0xA0E040, 0xE0E080, 0xE0E080, 0xE0E080, 0xE0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xE0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0xC0E080, 0x80C040, 0x80C040, 0xC0E080, 0xC0E080, 0x80C040, 0x80C040, 0x80E040, 0x80C040, 0x80C040, 0x80E040, 0x80E040, 0x80E040, 0x80C040, 0x80C040, 0x80C040, 0x80E040, 0x60A000, 0x408000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x40A000, 0x60A000, 0x60A000, 0x80E040, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x204000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x206000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x60A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80C040, 0x80C040, 0x80C040, 0x80C040, 0x40A000, 0x60A000, 0x60A000, 0x80E040, 0x60A000, 0x40A000, 0x60A000, 0x60A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x40A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402040, 0x80E040, 0x80E040, 0xC0E080, 0xE0E080, 0x80E040, 0x80E040, 0x80E040, 0x80E040, 0x60A000, 0x60C000, 0x60C000, 0xA0E040, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x60A000, 0x206000, 0x406000, 0x406000, 0x60A000, 0x206000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x402000, 0x408000, 0x408000, 0x608000, 0x608040, 0x408000, 0x408000, 0x408000, 0x408000, 0x406000, 0x408000, 0x408000, 0x408000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x406000, 0x206000, 0x206000, 0x206000, 0x406000, 0x206000, 0x206000, 0x206000, 0x206000, 0x402000,
-0x402000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x204000, 0x206000, 0x206000, 0x402000,
-0x200040, 0x200040, 0x200040, 0x200040, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x200040, 0x200040, 0x000000, 0x000000, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040, 0x200040
-};
\ No newline at end of file
diff --git a/programs/games/floppybird/smalllibc/doexe2.asm b/programs/games/floppybird/smalllibc/doexe2.asm
deleted file mode 100644
index 969fa9cff..000000000
--- a/programs/games/floppybird/smalllibc/doexe2.asm
+++ /dev/null
@@ -1,68 +0,0 @@
-filename equ '%EXENAME%'
-
-virtual at 0
-file filename:3Ch,4
-load pehea dword from 0
-file filename:pehea,0F8h+28h*3
-load NumberOfSections word from 4+6
-load SizeOfOptionalHeader word from 4+14h
-if NumberOfSections<>3
-error Expected three sections, .text, .bss and .reloc
-end if
-if SizeOfOptionalHeader<>0E0h
-error Nonstandard PE header
-end if
-load RelocsRVA dword from 4+0A0h
-load RelocsSize dword from 4+0A4h
-load ImageBase dword from 4+34h
-load TextRVA dword from 4+0F8h+0Ch
-load TextSize dword from 4+0F8h+8
-load TextOffs dword from 4+0F8h+14h
-load BSSSize dword from 4+0F8h+28h+10h
-load RelocRVA dword from 4+0F8h+28h*2+0Ch
-load RelocOffs dword from 4+0F8h+28h*2+14h
-if BSSSize
-error Second section expected to be .bss
-end if
-if RelocRVA<>RelocsRVA
-error Third section expected to be .reloc
-end if
-;file 'test.exe':pehea+0F8h,28h
-;load physofs dword from 4+14h
-;load mem dword from 4+8
-;file 'test.exe':physofs+16,4
-;load sz dword from $-4
-end virtual
-
-file filename:TextOffs,TextSize
-
-while RelocsSize>8
-virtual at 0
-file filename:RelocOffs,8
-load CurRelocPage dword from 0
-load CurRelocChunkSize dword from 4
-end virtual
-RelocsSize=RelocsSize-CurRelocChunkSize
-CurRelocChunkSize = CurRelocChunkSize-8
-RelocOffs=RelocOffs+8
-while CurRelocChunkSize
-virtual at 0
-file filename:RelocOffs,2
-RelocOffs=RelocOffs+2
-CurRelocChunkSize=CurRelocChunkSize-2
-load s word from 0
-end virtual
-CurRelocType = s shr 12
-RelocItem = CurRelocPage + (s and 0xFFF)
-if CurRelocType=0
-else if CurRelocType=3
-load z dword from RelocItem-TextRVA
-store dword z-(TextRVA+ImageBase) at RelocItem-TextRVA
-else
-error Unexpected relocation type
-end if
-end while
-end while
-
-store dword TextSize at 10h
-store dword RelocRVA-TextRVA at 14h
diff --git a/programs/games/floppybird/smalllibc/func.cpp b/programs/games/floppybird/smalllibc/func.cpp
deleted file mode 100644
index fb9b48a84..000000000
--- a/programs/games/floppybird/smalllibc/func.cpp
+++ /dev/null
@@ -1,501 +0,0 @@
-
-
-#include "func.h"
-
-int convert_error = 0;
-int SysColor = 0;
-char debuf[50] = "";
-
-
-// -
-void kos_DrawLine( Word x1, Word y1, Word x2, Word y2, Dword colour, Dword invert )
-{
- Dword arg1, arg2, arg3;
-
- //
- arg1 = ( x1 << 16 ) | x2;
- arg2 = ( y1 << 16 ) | y2;
- arg3 = (invert)?0x01000000:colour;
- //
- __asm{
- mov eax, 38
- mov ebx, arg1
- mov ecx, arg2
- mov edx, arg3
- int 0x40
- }
-}
-
-// C--
-void DrawRegion(Dword x,Dword y,Dword width,Dword height,Dword color1)
-{
- kos_DrawBar(x,y,width,1,color1); //
- kos_DrawBar(x,y+height,width,1,color1); //
- kos_DrawBar(x,y,1,height,color1); //
- kos_DrawBar(x+width,y,1,height+1,color1); //
-}
-
-
-// ,
-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';
- }
- if (sign) res = -res;
- return res;
-}
-
-/*int abs(int n)
-{
- return (n<0)?-n:n;
-}*/
-
-
-
-
-
-double fabs(double x)
-{
- __asm fld x
- __asm fabs
-}
-#define M_PI 3.14159265358979323846
-double cos(double x)
-{
- __asm fld x
- __asm fcos
-}
-double sin(double x)
-{
- __asm fld x
- __asm fsin
-}
-
-bool isalpha(char c)
-{
- return (c==' ' || c=='\n' || c=='\t' || c=='\r');
-}
-
-// - . .
-double convert(char *s, int *len)
-{
-
- int i;
-
-
- double sign,res, tail, div;
-
- convert_error = 0;
-
- res = 0.0;
-
- i=0;
- while (s[i] && isalpha(s[i])) i++;
- if (len) *len=i;
- if (s[i] == '\0')
- {
- convert_error = ERROR_END;
- return 0.0;
- }
-
- sign=1.0;
- if (s[i] == '-')
- {
- sign=-1.0;
- i++;
- }
- while (s[i] && s[i] >= '0' && s[i] <= '9')
- {
- res *= 10.0;
- res += id(s[i] - '0');
- i++;
- }
- if (len) *len=i;
- if (!s[i] || isalpha(s[i]))
- return sign*res;
- if (s[i] != '.' && s[i] != ',')
- {
- convert_error = ERROR;
- return 0;
- }
- i++;
- if (len) *len=i;
- if (!s[i])
- return sign*res;
-
- div = 1.0;
- tail = 0.0;
- while (s[i] && s[i] >= '0' && s[i] <= '9')
- {
- tail *= 10.0;
- tail += id(s[i] - '0');
- div *= 10.0;
- i++;
- }
- res += tail/div;
- if (len) *len=i;
- return sign*res;
-}
-
-/*
-#define PREC 2
-
-double double_tab[]={1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15};
-
-// sprintf, __ (double) %f
-void format( char *Str, int len, char* Format, ... )
-{
- int i, fmtlinesize, j, k, flag;
- char c;
- va_list arglist;
- //
- va_start(arglist, Format);
-
- //
- fmtlinesize = strlen( Format );
- //
- if( fmtlinesize == 0 ) return;
-
- for (i = 0; i < len; i++)
- Str[i] = 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];
- //
- switch( c )
- {
- //
- case '%':
- Str[j++] = c;
- break;
- // auaia aauanoaaiiiai ?enea
- case 'f':
- // ii?aaaeeou ?enei oeo? ai oi?ee
- double val, w;
- int p;
- val = va_arg(arglist, double);
- if (val < 0.0)
- {
- Str[j++] = '-';
- val = -val;
- }
- for (k = 0; k < 15; k++)
- if (val < double_tab[k])
- break;
-
- if (val < 1.0)
- {
- Str[j++] = '0';
- }
-
- for (p = 1; p < k + 1; p++)
- {
- Str[j++] = '0' + di(val / double_tab[k - p] - 0.499) % 10;
- }
- Str[j++] = '.';
- w = 0.1;
- for (p = 0; p < 2; p++)
- {
- val-=floor(val);
- Str[j++] = '0' + di(val / w - 0.499) % 10;
- w /= 10.0;
- }
-
- //
- default:
- break;
- }
- }
- //
- Str[j] = 0;
-}
-
-void *memcpy(void *dst, const void *src, unsigned size)
-{
- while (size--)
- *((char*)dst+size) = *((char*)src+size);
- return dst;
-}
-*/
-int strcmp(const char *s1, const char *s2)
-{
- int i;
-
- if (s1 == NULL)
- if (s2 == NULL)
- return 0;
- else
- return 1;
- else
- if (s2 == NULL)
- return 1;
-
- for (i = 0;;i++)
- {
- if (s1[i] == '\0')
- if (s2[i] == '\0')
- return 0;
- else
- return 1;
- else
- if (s2[i] == '\0')
- return 1;
- else
- {
- if (s1[i] != s2[i])
- return 1;
- }
- }
- return 0;
-}
-
-kol_struct_import* kol_cofflib_load(char *name)
-{
-//asm ("int $0x40"::"a"(68), "b"(19), "c"(name));
- __asm
- {
- mov eax, 68
- mov ebx, 19
- mov ecx, name
- int 0x40
- }
-}
-
-
-void* kol_cofflib_procload (kol_struct_import *imp, char *name)
-{
-
-int i;
-for (i=0;;i++)
- if ( NULL == ((imp+i) -> name))
- break;
- else
- if ( 0 == strcmp(name, (imp+i)->name) )
- return (imp+i)->data;
-return NULL;
-
-}
-
-
-unsigned kol_cofflib_procnum (kol_struct_import *imp)
-{
-
-unsigned i, n;
-
-for (i=n=0;;i++)
- if ( NULL == ((imp+i) -> name))
- break;
- else
- n++;
-
-return n;
-
-}
-
-
-void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n)
-{
-
-unsigned i;
-*name = 0;
-
-for (i=0;;i++)
- if ( NULL == ((imp+i) -> name))
- break;
- else
- if ( i == n )
- {
- strcpy(name, ((imp+i)->name));
- break;
- }
-
-}
-
-
-
-/*
-end of system part
-*/
-
-
-// ...
-void line( int x1, int y1, int x2, int y2)
-{
- kos_DrawLine(x1,y1,x2,y2,SysColor,0);
-}
-
-void outtextxy( int x, int y, char *s, int len)
-{
- kos_WriteTextToWindow(x,y,0,SysColor,s,len);
-}
-
-double textwidth( char *s, int len)
-{
- int i;
- for (i = 0; i < len; i++)
- if (s[i] == 0)
- break;
- return id(i * 6);
-}
-
-double textheight( char *s, int len)
-{
- return 8.0;
-}
-
-void setcolor( DWORD color)
-{
- SysColor = color;
-}
-
-void rectangle( int x1, int y1, int x2, int y2)
-{
- kos_DrawBar(x1,y1,x2-x1,y2-y1,SysColor);
-}
-
-
-
-Dword kos_GetSkinHeight()
-{
- __asm{
- mov eax, 48
- mov ebx, 4
- int 0x40
- }
-}
-
-Dword kos_GetSpecialKeyState()
-{
- __asm{
- mov eax, 66
- mov ebx, 3
- int 0x40
- }
-}
-
-
-
-Dword kos_GetSlotByPID(Dword PID)
-{
- __asm
- {
- push ebx
- push ecx
- mov eax, 18
- mov ebx, 21
- mov ecx, PID
- int 0x40
- pop ecx
- pop ebx
- }
-}
-
-
-Dword kos_GetActiveSlot()
-{
- __asm
- {
- push ebx
- mov eax, 18
- mov ebx, 7
- int 0x40
- pop ebx
- }
-}
-
-
-
-void kos_GetScrollInfo(int &vert, int &hor)
-{
- short v, h;
- __asm
- {
- mov eax, 37
- mov ebx, 7
- int 0x40
- mov ebx, eax
- and eax, 0xffff
- mov v, ax
- shr ebx, 16
- mov h, bx
- }
- vert = v;
- hor = h;
-}
-
-
-// "" 37/1
-void kos_GetMouseStateWnd( Dword & buttons, int & cursorX, int & cursorY )
-{
- Dword mB;
- Word curX;
- Word curY;
- sProcessInfo sPI;
-
- //
- __asm{
- mov eax, 37
- mov ebx, 1
- int 0x40
- mov curY, ax
- shr eax, 16
- mov curX, ax
- mov eax, 37
- mov ebx, 2
- int 0x40
- mov mB, eax
- }
- //
- kos_ProcessInfo( &sPI );
- //
- buttons = mB;
- cursorX = curX - sPI.processInfo.x_start;
- cursorY = curY - sPI.processInfo.y_start;
-}
-
-double atof(char *s)
-{
- return convert(s, NULL);
-}
-
-
-int di(double x)
-{
- int a;
- __asm fld x
- __asm fistp a
- return a;
-}
-
-double id(int x)
-{
- double a;
- __asm fild x
- __asm fstp a
- return a;
-}
diff --git a/programs/games/floppybird/smalllibc/func.h b/programs/games/floppybird/smalllibc/func.h
deleted file mode 100644
index 34c37e7b6..000000000
--- a/programs/games/floppybird/smalllibc/func.h
+++ /dev/null
@@ -1,129 +0,0 @@
-
-#pragma once
-
-#include "kosSyst.h"
-#include "kosFile.h"
-#include "MCSMEMM.H"
-
-#include
-
-
-#define min(a,b) (((a)<(b))?(a):(b))
-#define max(a,b) (((a)>(b))?(a):(b))
-
-
-#define ERROR -1
-#define ERROR_END -2
-
-extern int convert_error;
-
-typedef int HDC;
-typedef int DWORD;
-
-extern int SysColor;
-extern char debuf[50];
-
-typedef double (*function_t)(double);
-
-typedef struct
-{
- double x, y;
-} TCoord;
-
-struct kosBDVK
-{
- Dword attrib;
- Dword name_type;
- Dword create_time;
- Dword create_date;
- Dword access_time;
- Dword access_date;
- Dword modify_time;
- Dword modify_date;
- Dword size_low;
- Dword size_high;
-};
-
-Dword kos_GetSlotByPID(Dword PID);
-Dword kos_GetActiveSlot();
-Dword kos_GetSkinHeight();
-Dword kos_GetSpecialKeyState();
-void kos_GetMouseStateWnd( Dword & buttons, int & cursorX, int & cursorY );
-void kos_DrawLine( Word x1, Word y1, Word x2, Word y2, Dword colour, Dword invert);
-void DrawRegion(Dword x,Dword y,Dword width,Dword height,Dword color1);
-int atoi(const char* string);
-void kos_GetScrollInfo(int &vert, int &hor);
-
-
-Dword kos_GetSlotByPID(Dword PID);
-Dword kos_GetActiveSlot();
-Dword kos_GetSkinHeight();
-Dword kos_GetSpecialKeyState();
-
-
-double fabs(double x);
-double cos(double x);
-double sin(double x);
-bool isalpha(char c);
-double convert(char *s, int *len=NULL);
-void format( char *Str, int len, char* Format, ... );
-
-void line( int x1, int y1, int x2, int y2);
-
-void outtextxy( int x, int y, char *s, int len);
-void settextstyle( int a1, int a2, int a3);
-
-
-double textwidth( char *s, int len);
-double textheight( char *s, int len);
-void setcolor( DWORD color);
-void unsetcolor(HDC hdc);
-void rectangle( int x1, int y1, int x2, int y2);
-
-typedef struct
-{
-unsigned p00 ;
-unsigned p04 ;
-unsigned p08 ;
-unsigned p12 ;
-unsigned p16 ;
-char p20 ;
-char *p21 ;
-} kol_struct70 ;
-
-
-typedef struct
-{
-unsigned p00 ;
-char p04 ;
-char p05[3] ;
-unsigned p08 ;
-unsigned p12 ;
-unsigned p16 ;
-unsigned p20 ;
-unsigned p24 ;
-unsigned p28 ;
-unsigned p32[2] ;
-unsigned p40 ;
-} kol_struct_BDVK ;
-
-typedef struct
-{
-char *name ;
-void *data ;
-} kol_struct_import ;
-
-
-
-kol_struct_import* kol_cofflib_load(char *name);
-void* kol_cofflib_procload (kol_struct_import *imp, char *name);
-unsigned kol_cofflib_procnum (kol_struct_import *imp);
-void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n);
-int strcmp(const char* string1, const char* string2);
-
-char *ftoa(double d);
-double atof(char *s);
-
-
-int di(double x);
-double id(int x);
diff --git a/programs/games/floppybird/smalllibc/init.asm b/programs/games/floppybird/smalllibc/init.asm
deleted file mode 100644
index 0bbef5bca..000000000
--- a/programs/games/floppybird/smalllibc/init.asm
+++ /dev/null
@@ -1,31 +0,0 @@
-format MS COFF
-
-StackSize = 16384
-
-; must be alphabetically first in the image
-section '.1seg' data readable writable
-extrn _crtStartUp ; real entry point
-extrn _kosCmdLine
-extrn _kosExePath
-extrn _exeStack
-public fakeEntry
-
-kos_header:
- db 'MENUET01' ; header
- dd 1 ; headerver
- dd _crtStartUp ; entry
- dd 0 ; i_end, filled by doexe2.asm
- dd 0 ; memsize, filled by doexe2.asm
- dd _exeStack + StackSize ; stack
- dd _kosCmdLine ; params
- dd _kosExePath ; icon
-fakeEntry: ; only for linker, to force including this obj file
- ; real entry is crtStartUp
-
-; initializers
-section '.CRT$XCA' data readable writable
-public ___xc_a
-___xc_a:
-section '.CRT$XCZ' data readable writable
-public ___xc_z
-___xc_z:
diff --git a/programs/games/floppybird/smalllibc/kosFile.cpp b/programs/games/floppybird/smalllibc/kosFile.cpp
deleted file mode 100644
index 1718d4798..000000000
--- a/programs/games/floppybird/smalllibc/kosFile.cpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#include "kosSyst.h"
-#include "kosFile.h"
-//#include "string.h"
-
-
-CKosFile::CKosFile(char *fileName)
-{
- //
- this->fileInfo.bufferPtr = new Byte[FILE_BUFFER_SIZE];
- //
- this->filePointer = 0;
- this->bufferPointer = 0;
- this->validBuffer = false;
- //
- strcpy( this->fileInfo.fileURL, fileName );
-}
-
-
-CKosFile::~CKosFile(void)
-{
- //
- delete this->fileInfo.bufferPtr;
-}
-
-
-void CKosFile::ValidateBuffer()
-{
- //
- if ( this->validBuffer )
- {
- //
- if ( this->filePointer < this->bufferPointer
- || this->filePointer >= (this->bufferPointer + FILE_BUFFER_SIZE) )
- {
- //
- this->validBuffer = false;
- }
- }
-}
-
-
-void CKosFile::UpdateBuffer(void)
-{
- //
- if ( ! this->validBuffer )
- {
- //
- this->fileInfo.OffsetLow = this->filePointer / OS_BLOCK_SIZE;
- this->fileInfo.OffsetHigh = 0;
- //
- this->bufferPointer = this->fileInfo.OffsetLow * OS_BLOCK_SIZE;
- //
- this->fileInfo.dataCount = FILE_BUFFER_BLOCKS;
- //
- this->fileInfo.rwMode = 0;
- //
- Dword rr = kos_FileSystemAccess( &(this->fileInfo) );
- this->validBuffer = ( rr == 0 );
- }
-}
-
-
-int CKosFile::Seek(int seekFrom, int seekStep)
-{
- //
- switch ( seekFrom )
- {
- //
- case SEEK_SET:
- //
- this->filePointer = seekStep;
- break;
- //
- case SEEK_CUR:
- //
- this->filePointer += seekStep;
- break;
- }
- //
- this->ValidateBuffer();
- //
- return this->filePointer;
-}
-
-
-int CKosFile::Read(Byte *targetPtr, int readCount)
-{
- int bufferLeast, result;
-
- //
- result = 0;
- //
- do
- {
- //
- this->UpdateBuffer();
- //
- if ( ! this->validBuffer ) return result;
- //
- bufferLeast = FILE_BUFFER_SIZE - (this->filePointer - this->bufferPointer);
- //
- if ( bufferLeast > readCount ) bufferLeast = readCount;
- //
- if ( bufferLeast )
- {
- //
- memcpy(
- targetPtr,
- this->fileInfo.bufferPtr + (this->filePointer - this->bufferPointer),
- bufferLeast
- );
- //
- targetPtr += bufferLeast;
- readCount -= bufferLeast;
- this->filePointer += bufferLeast;
- //
- result += bufferLeast;
- }
- //
- this->ValidateBuffer();
- }
- while ( readCount > 0 );
- //
- return result;
-}
-
-
-int CKosFile::Write(Byte *sourcePtr, int writeCount)
-{
- return 0;
-}
-
diff --git a/programs/games/floppybird/smalllibc/kosFile.h b/programs/games/floppybird/smalllibc/kosFile.h
deleted file mode 100644
index 0c5e54aff..000000000
--- a/programs/games/floppybird/smalllibc/kosFile.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#pragma once
-
-#define SEEK_SET 0
-#define SEEK_CUR 1
-
-#define FILE_BUFFER_SIZE 512
-#define OS_BLOCK_SIZE 1
-#define FILE_BUFFER_BLOCKS (FILE_BUFFER_SIZE / OS_BLOCK_SIZE)
-
-
-class CKosFile
-{
-public:
- CKosFile(char *fileName);
- ~CKosFile(void);
- int Read(Byte *targetPtr, int readCount);
- int Write(Byte *sourcePtr, int writeCount);
- int Seek(int seekFrom, int seekStep);
-protected:
- int filePointer;
- int bufferPointer;
- bool validBuffer;
- kosFileInfo fileInfo;
- void ValidateBuffer(void);
- void UpdateBuffer(void);
-};
diff --git a/programs/games/floppybird/smalllibc/kosSyst.cpp b/programs/games/floppybird/smalllibc/kosSyst.cpp
deleted file mode 100644
index 0eeff6303..000000000
--- a/programs/games/floppybird/smalllibc/kosSyst.cpp
+++ /dev/null
@@ -1,695 +0,0 @@
-#include "kosSyst.h"
-#include "func.h"
-#include
-
-char kosCmdLine[257];
-char kosExePath[1024];
-extern "C" char exeStack[];
-char exeStack[16384];
-
-#define atexitBufferSize 32
-
-#ifndef SMALLLIBC_NO_ATEXIT
-//
-void (__cdecl *atExitList[atexitBufferSize])();
-int atExitFnNum = 0;
-//
-int __cdecl atexit( void (__cdecl *func )( void ))
-{
- //
- if ( atExitFnNum < atexitBufferSize )
- {
- //
- atExitList[atExitFnNum++] = func;
- return 0;
- }
- else
- {
- return 1;
- }
-}
-#endif
-
-//
-Dword RandomSeed = 0;
-//
-void rtlSrand( Dword seed )
-{
- RandomSeed = seed;
-}
-//
-Dword rtlRand( void )
-{
- // 0x80000776
-
- Dword dwi, i;
-
- for ( i = 0; i < 32; i++ )
- {
-
- dwi = RandomSeed & 0x80000776;
-
- __asm{
- mov eax, dwi
- mov edx, eax
- bswap eax
- xor eax, edx
- xor al, ah
- setpo al
- movzx eax, al
- mov dwi, eax
- }
-
- RandomSeed = ( RandomSeed << 1 ) | ( dwi & 1 );
- }
-
- return RandomSeed;
-}
-
-void* __cdecl memcpy( void *dst, const void *src, size_t bytesCount )
-{
- __asm{
- mov edi, dst
- mov eax, dst
- mov esi, src
- mov ecx, bytesCount
- rep movsb
- }
-}
-
-//
-void memset( Byte *dst, Byte filler, Dword count )
-{
- //
- __asm{
- mov edi, dst
- mov al, filler
- mov ecx, count
- rep stosb
- }
-}
-
-
-//
-Dword rtlInterlockedExchange( Dword *target, Dword value )
-{
-// Dword result;
-
- //
- __asm{
- mov eax, value
- mov ebx, target
- xchg eax, [ebx]
-// mov result, eax
- }
- //
-// return result;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-//
-//
-//
-
-char * __cdecl strcpy( char *target, const char *source )
-{
- char *result = target;
-
- while( target[0] = source[0] )
- {
- target++;
- source++;
- }
-
- return result;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-//
-//
-//
-
-char * __cdecl strrchr( const char * string, int c )
-{
- char *cPtr;
-
- //
- for ( cPtr = (char *)string + strlen( string ); cPtr >= string; cPtr-- )
- {
- //
- if ( *cPtr == c ) return cPtr;
- }
- //
- return NULL;
-}
-
-
-//////////////////////////////////////////////////////////////////////
-//
-//
-//
-
-int __cdecl strlen( const char *line )
-{
- int i;
-
- for( i=0; line[i] != 0; i++ );
- return i;
-}
-
-
-
-//////////////////////////////////////////////////////////////////////
-//
-//
-//
-
-unsigned int num2hex( unsigned int num )
-{
- if( num < 10 )
- return num + '0';
- return num - 10 + 'A';
-}
-
-
-inline void __declspec(noreturn) kos_sysfuncm1(void)
-{
- __asm or eax, -1
- __asm int 0x40
-}
-
-// -1
-void kos_ExitApp()
-{
-#ifndef SMALLLIBC_NO_ATEXIT
- int i;
-
- //
- for ( i = atExitFnNum - 1; i >= 0; i-- )
- {
- //
- atExitList[i]();
- }
-#endif
- //
- kos_sysfuncm1();
-}
-
-static void __declspec(noinline) __fastcall kos_sysfunc0(Dword _ecx, Dword _edx, Dword _ebx, Dword _esi, Dword _edi)
-{
- __asm xor eax, eax
- __asm mov ebx, _ebx
- __asm mov esi, _esi
- __asm mov edi, _edi
- __asm int 0x40
-}
-
-// 0
-void kos_DefineAndDrawWindow(
- Word x, Word y,
- Word sizeX, Word sizeY,
- Byte mainAreaType,
- Dword mainAreaColour,
- Byte headerType,
- Dword headerColour,
- Dword borderColour
- )
-{
- Dword arg1, arg2, arg3, arg4;
-
- //
- arg1 = ( x << 16 ) + sizeX;
- arg2 = ( y << 16 ) + sizeY;
- arg3 = ( mainAreaType << 24 ) | mainAreaColour;
- arg4 = ( headerType << 24 ) | headerColour;
- //
- kos_sysfunc0(arg2, arg3, arg1, arg4, borderColour);
-}
-
-
-// 1
-void kos_PutPixel( Dword x, Dword y, Dword colour )
-{
- //
- __asm{
- push 1
- pop eax
- mov ebx, x
- mov ecx, y
- mov edx, colour
- int 0x40
- }
-}
-
-inline Dword kos_sysfunc2(void)
-{
- __asm push 2
- __asm pop eax
- __asm int 0x40
-}
-
-// 2
-bool kos_GetKey( Byte &keyCode )
-{
- Dword result = kos_sysfunc2();
- //
- keyCode = result >> 8;
- //
- return ( result & 0xFF ) == 0;
-}
-
-
-// 3
-Dword kos_GetSystemClock()
-{
-// Dword result;
-
- //
- __asm{
- push 3
- pop eax
- int 0x40
-// mov result, eax
- }
- //
-// return result;
-}
-
-static void __declspec(noinline) __fastcall kos_sysfunc4(Dword _ecx, const char* _edx, Dword _ebx, Dword _esi)
-{
- __asm push 4
- __asm pop eax
- __asm mov ebx, [_ebx]
- __asm mov esi, [_esi]
- __asm int 0x40
-}
-
-// 4
-void kos_WriteTextToWindow(
- Word x,
- Word y,
- Byte fontType,
- Dword textColour,
- const char *textPtr,
- Dword textLen
- )
-{
- Dword arg1, arg2;
-
- //
- arg1 = ( x << 16 ) | y;
- arg2 = ( fontType << 24 ) | textColour;
- //
- kos_sysfunc4(arg2, textPtr, arg1, textLen);
-}
-
-
-// 5 ,
-void kos_Pause( Dword value )
-{
- //
- __asm{
- push 5
- pop eax
- mov ebx, value
- int 0x40
- }
-}
-
-
-// 7
-void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y )
-{
- Dword arg1, arg2;
-
- //
- arg1 = ( sizeX << 16 ) | sizeY;
- arg2 = ( x << 16 ) | y;
- //
- __asm{
- push 7
- pop eax
- mov ebx, imagePtr
- mov ecx, arg1
- mov edx, arg2
- int 0x40
- }
-}
-
-
-
-// 8
-void kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour )
-{
- Dword arg1, arg2;
-
- //
- arg1 = ( x << 16 ) | sizeX;
- arg2 = ( y << 16 ) | sizeY;
- //
- __asm{
- push 8
- pop eax
- mov ebx, arg1
- mov ecx, arg2
- mov edx, buttonID
- mov esi, colour
- int 0x40
- }
-}
-
-
-// 9 -
-Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID )
-{
-// Dword result;
-
- //
- __asm{
- push 9
- pop eax
- mov ebx, targetPtr
- mov ecx, processID
- int 0x40
-// mov result, eax
- }
- //
-// return result;
-}
-
-
-// 10
-Dword kos_WaitForEvent()
-{
-// Dword result;
-
- __asm{
- push 10
- pop eax
- int 0x40
-// mov result, eax
- }
-
-// return result;
-}
-
-
-// 11
-Dword kos_CheckForEvent()
-{
- Dword result; //
-
- __asm{
- push 11
- pop eax
- int 0x40
- mov result, eax //
- }
-
- return result; //
-}
-
-
-// 12
-void kos_WindowRedrawStatus( Dword status )
-{
- __asm{
- push 12
- pop eax
- mov ebx, status
- int 0x40
- }
-}
-
-
-// 13
-void kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour )
-{
- Dword arg1, arg2;
-
- //
- arg1 = ( x << 16 ) | sizeX;
- arg2 = ( y << 16 ) | sizeY;
- //
- __asm{
- push 13
- pop eax
- mov ebx, arg1
- mov ecx, arg2
- mov edx, colour
- int 0x40
- }
-}
-
-
-// 17
-bool kos_GetButtonID( Dword &buttonID )
-{
- Dword result;
-
- //
- __asm{
- push 17
- pop eax
- int 0x40
- mov result, eax
- }
- //
- buttonID = result >> 8;
- //
- return (result & 0xFF) == 0;
-}
-
-
-// 23
-Dword kos_WaitForEventTimeout( Dword timeOut )
-{
-// Dword result;
-
- __asm{
- push 23
- pop eax
- mov ebx, timeOut
- int 0x40
-// mov result, eax
- }
-
-// return result;
-}
-
-
-// "" 37
-void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY )
-{
- Dword mB;
- Word curX;
- Word curY;
- sProcessInfo sPI;
-
- //
- __asm{
- push 37
- pop eax
- xor ebx, ebx
- int 0x40
- mov curY, ax
- shr eax, 16
- mov curX, ax
- push 37
- pop eax
- push 2
- pop ebx
- int 0x40
- mov mB, eax
- }
- //
- kos_ProcessInfo( &sPI );
- //
- buttons = mB;
- cursorX = curX - sPI.processInfo.x_start;
- cursorY = curY - sPI.processInfo.y_start;
-}
-
-
-// 40
-void kos_SetMaskForEvents( Dword mask )
-{
- //
- __asm{
- push 40
- pop eax
- mov ebx, mask
- int 0x40
- }
-}
-
-
-// 47
-void kos_DisplayNumberToWindow(
- Dword value,
- Dword digitsNum,
- Word x,
- Word y,
- Dword colour,
- eNumberBase nBase,
- bool valueIsPointer
- )
-{
- Dword arg1, arg2;
-
- //
- arg1 = ( valueIsPointer ? 1 : 0 ) |
- ( ((Byte)nBase) << 8 ) |
- ( ( digitsNum & 0x1F ) << 16 );
- arg2 = ( x << 16 ) | y;
- //
- __asm{
- push 47
- pop eax
- mov ebx, arg1
- mov ecx, value
- mov edx, arg2
- mov esi, colour
- int 0x40
- }
-}
-
-
-// 70
-Dword kos_FileSystemAccess( kosFileInfo *fileInfo )
-{
-// Dword result;
-
- //
- __asm{
- push 70
- pop eax
- mov ebx, fileInfo
- int 0x40
-// mov result, eax
- }
- //
-// return result;
-}
-
-
-// 63
-void kos_DebugOutChar( char ccc )
-{
- //
- __asm{
- push 63
- pop eax
- push 1
- pop ebx
- mov cl, ccc
- int 0x40
- }
-}
-
-
-// 66
-void kos_SetKeyboardDataMode( Dword mode )
-{
- //
- __asm{
- push 66
- pop eax
- push 1
- pop ebx
- mov ecx, mode
- int 0x40
- }
-}
-
-
-//
-void rtlDebugOutString( char *str )
-{
- //
- for ( ; str[0] != 0; str++ )
- {
- kos_DebugOutChar( str[0] );
- }
- //
- kos_DebugOutChar( 13 );
- kos_DebugOutChar( 10 );
-}
-
-
-// 64 ,
-bool kos_ApplicationMemoryResize( Dword targetSize )
-{
- Dword result;
-
- //
- __asm{
- push 64
- pop eax
- push 1
- pop ebx
- mov ecx, targetSize
- int 0x40
- mov result, eax
- }
- //
- return result == 0;
-}
-
-
-// 67 , == -1
-void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY )
-{
- //
- __asm{
- push 67
- pop eax
- mov ebx, x
- mov ecx, y
- mov edx, sizeX
- mov esi, sizeY
- int 0x40
- }
-}
-
-void kos_InitHeap()
-{
- __asm{
- push 68
- pop eax
- push 11
- pop ebx
- int 0x40
- }
-}
-
-
-
-//
-typedef void (__cdecl *_PVFV)(void);
-extern "C" _PVFV __xc_a[];
-extern "C" _PVFV __xc_z[];
-#pragma comment(linker, "/merge:.CRT=.rdata")
-//
-void __cdecl crtStartUp()
-{
-#ifndef SMALLLIBC_NO_INIT
- //
- for ( _PVFV *pbegin = __xc_a; pbegin < __xc_z; pbegin++ )
- {
- //
- (**pbegin)();
- }
-#endif
- //
- // , kos_Main()
- //rtlSrand( kos_GetSystemClock() );
- //
- kos_Main();
- //
- kos_ExitApp();
-}
-
-
diff --git a/programs/games/floppybird/smalllibc/kosSyst.h b/programs/games/floppybird/smalllibc/kosSyst.h
deleted file mode 100644
index 7a2252404..000000000
--- a/programs/games/floppybird/smalllibc/kosSyst.h
+++ /dev/null
@@ -1,217 +0,0 @@
-
-#pragma once
-
-typedef unsigned __int32 Dword;
-typedef unsigned __int16 Word;
-typedef unsigned __int8 Byte;
-//typedef unsigned __int32 size_t;
-
-extern "C" char kosCmdLine[]; // command line initialized by OS
-extern "C" char kosExePath[]; // path to binary initialized by OS
-
-#define NULL 0
-
-#define MAX_PATH 256
-
-#define FO_READ 0
-#define FO_WRITE 2
-
-#define EM_WINDOW_REDRAW 1
-#define EM_KEY_PRESS 2
-#define EM_BUTTON_CLICK 4
-#define EM_APP_CLOSE 8
-#define EM_DRAW_BACKGROUND 16
-#define EM_MOUSE_EVENT 32
-#define EM_IPC 64
-#define EM_NETWORK 256
-
-#define KM_CHARS 0
-#define KM_SCANS 1
-
-#define WRS_BEGIN 1
-#define WRS_END 2
-
-#define PROCESS_ID_SELF -1
-
-#define abs(a) (a<0?0-a:a)
-
-extern "C" double __cdecl acos(double x);
-extern "C" double __cdecl asin(double x);
-extern "C" double __cdecl floor(double x);
-extern "C" double __cdecl round(double x);
-#pragma function(acos,asin)
-#if _MSC_VER > 1200
-#pragma function(floor)
-#endif
-
-
-struct kosFileInfo
-{
- Dword rwMode;
- Dword OffsetLow;
- Dword OffsetHigh;
- Dword dataCount;
- Byte *bufferPtr;
- char fileURL[MAX_PATH];
-};
-
-
-struct RGB
-{
- Byte b;
- Byte g;
- Byte r;
- //
- RGB() {};
- //
- RGB( Dword value )
- {
- r = (Byte)(value >> 16);
- g = (Byte)(value >> 8);
- b = (Byte)value;
- };
- //
- bool operator != ( RGB &another )
- {
- return this->b != another.b || this->g != another.g || this->r != another.r;
- };
- //
- bool operator == ( RGB &another )
- {
- return this->b == another.b && this->g == another.g && this->r == another.r;
- };
-};
-
-
-#pragma pack(push, 1)
-union sProcessInfo
-{
- Byte rawData[1024];
- struct
- {
- Dword cpu_usage;
- Word window_stack_position;
- Word window_stack_value;
- Word reserved1;
- char process_name[12];
- Dword memory_start;
- Dword used_memory;
- Dword PID;
- Dword x_start;
- Dword y_start;
- Dword x_size;
- Dword y_size;
- Word slot_state;
- } processInfo;
-};
-#pragma pack(pop)
-
-//
-extern "C" void __cdecl crtStartUp();
-//
-int __cdecl _purecall();
-//
-int __cdecl atexit( void (__cdecl *func )( void ));
-//
-void rtlSrand( Dword seed );
-Dword rtlRand( void );
-//
-char * __cdecl strcpy( char *target, const char *source );
-int __cdecl strlen( const char *line );
-char * __cdecl strrchr( const char * string, int c );
-
-#if _MSC_VER < 1400
-extern "C" void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount );
-extern "C" void memset( Byte *dst, Byte filler, Dword count );
-//#pragma intrinsic(memcpy,memset)
-#else
-void * __cdecl memcpy( void *dst, const void *src, size_t bytesCount );
-void memset( Byte *dst, Byte filler, Dword count );
-#endif
-
-unsigned int num2hex( unsigned int num );
-void sprintf( char *Str, char* Format, ... );
-//
-Dword rtlInterlockedExchange( Dword *target, Dword value );
-// -1
-void __declspec(noreturn) kos_ExitApp();
-// 0
-void kos_DefineAndDrawWindow(
- Word x, Word y,
- Word sizeX, Word sizeY,
- Byte mainAreaType, Dword mainAreaColour,
- Byte headerType, Dword headerColour,
- Dword borderColour
- );
-// 1
-void kos_PutPixel( Dword x, Dword y, Dword colour );
-// 2
-bool kos_GetKey( Byte &keyCode );
-// 3
-Dword kos_GetSystemClock();
-// 4
-void kos_WriteTextToWindow(
- Word x, Word y,
- Byte fontType,
- Dword textColour,
- const char *textPtr,
- Dword textLen
- );
-// 7
-void kos_PutImage( RGB * imagePtr, Word sizeX, Word sizeY, Word x, Word y );
-// 8
-void __declspec(noinline) kos_DefineButton( Word x, Word y, Word sizeX, Word sizeY, Dword buttonID, Dword colour );
-// 5 ,
-void kos_Pause( Dword value );
-// 9 -
-Dword kos_ProcessInfo( sProcessInfo *targetPtr, Dword processID = PROCESS_ID_SELF );
-// 10
-Dword kos_WaitForEvent();
-// 11
-Dword kos_CheckForEvent();
-// 12
-void kos_WindowRedrawStatus( Dword status );
-// 13
-void __declspec(noinline) kos_DrawBar( Word x, Word y, Word sizeX, Word sizeY, Dword colour );
-// 17
-bool kos_GetButtonID( Dword &buttonID );
-// 23
-Dword kos_WaitForEventTimeout( Dword timeOut );
-//
-enum eNumberBase
-{
- nbDecimal = 0,
- nbHex,
- nbBin
-};
-// "" 37
-void kos_GetMouseState( Dword & buttons, int & cursorX, int & cursorY );
-// 40
-void kos_SetMaskForEvents( Dword mask );
-// 47
-void kos_DisplayNumberToWindow(
- Dword value,
- Dword digitsNum,
- Word x,
- Word y,
- Dword colour,
- eNumberBase nBase = nbDecimal,
- bool valueIsPointer = false
- );
-// 58
-Dword kos_FileSystemAccess( kosFileInfo *fileInfo );
-// 63
-void kos_DebugOutChar( char ccc );
-//
-void rtlDebugOutString( char *str );
-// 64 , == -1
-void kos_ChangeWindow( Dword x, Dword y, Dword sizeX, Dword sizeY );
-// 67 ,
-bool kos_ApplicationMemoryResize( Dword targetSize );
-// 66
-void kos_SetKeyboardDataMode( Dword mode );
-
-void kos_InitHeap();
-
-//
-void kos_Main();
diff --git a/programs/games/floppybird/smalllibc/math2.cpp b/programs/games/floppybird/smalllibc/math2.cpp
deleted file mode 100644
index 93c43346f..000000000
--- a/programs/games/floppybird/smalllibc/math2.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-#include
-#include "kosSyst.h"
-extern "C" int _fltused = 0;
-double __cdecl acos(double x)
-{
- __asm {
- fld qword ptr [esp+4]
- fld1
- fadd st, st(1)
- fld1
- fsub st, st(2)
- fmulp st(1), st
- fsqrt
- fxch st(1)
- fpatan
- }
-}
-double __cdecl asin(double x)
-{
- __asm {
- fld qword ptr [esp+4]
- fld1
- fadd st, st(1)
- fld1
- fsub st, st(2)
- fmulp st(1), st
- fsqrt
- fpatan
- ret
- }
-}
-#if _MSC_VER <= 1200
-extern "C" double _ftol(double x)
-{
- __asm {
- fld qword ptr [esp+4]
- push 1F3Fh
- fstcw word ptr [esp+2]
- fldcw word ptr [esp]
- frndint
- fldcw word ptr [esp+2]
- add esp, 4
- }
-}
-#endif
-double __cdecl ceil(double x)
-{
- __asm {
- fld qword ptr [esp+4]
- push 1B3Fh
- fstcw word ptr [esp+2]
- fldcw word ptr [esp]
- frndint
- fldcw word ptr [esp+2]
- add esp, 4
- }
-}
-
-double __cdecl floor(double x)
-{
- __asm {
- fld qword ptr [esp+4]
- push 173Fh
- fstcw word ptr [esp+2]
- fldcw word ptr [esp]
- frndint
- fldcw word ptr [esp+2]
- add esp, 4
- }
-}
-
-double __cdecl round(double x)
-{
- __asm {
- fld qword ptr [esp+4]
- push 133Fh
- fstcw word ptr [esp+2]
- fldcw word ptr [esp]
- frndint
- fldcw word ptr [esp+2]
- add esp, 4
- }
-}
diff --git a/programs/games/floppybird/smalllibc/mcsmemm.cpp b/programs/games/floppybird/smalllibc/mcsmemm.cpp
deleted file mode 100644
index fb7edbbdd..000000000
--- a/programs/games/floppybird/smalllibc/mcsmemm.cpp
+++ /dev/null
@@ -1,373 +0,0 @@
-// memman.cpp : Defines the entry point for the console application.
-//
-
-#include "kosSyst.h"
-#include "mcsmemm.h"
-
-
-void * __cdecl operator new ( size_t count, size_t element_size )
-{
- return allocmem( (Dword)(count * element_size) );
-}
-
-void * __cdecl operator new [] ( size_t amount )
-{
- return allocmem( (Dword)amount );
-}
-
-void * __cdecl operator new ( size_t amount )
-{
- return allocmem( (Dword)amount );
-}
-
-void __cdecl operator delete ( void *pointer )
-{
- if ( pointer != NULL ) freemem( pointer );
-}
-
-void __cdecl operator delete [] ( void *pointer )
-{
- if ( pointer != NULL ) freemem( pointer );
-}
-
-void __cdecl initHeap(void)
-{
- __asm
- {
- push 68
- pop eax
- push 11
- pop ebx
- int 0x40
- }
-}
-
-#pragma data_seg(".CRT$XCB")
-__declspec(allocate(".CRT$XCB")) void (__cdecl *initHeapPtr)(void) = &initHeap;
-
-__declspec(noinline) Byte* __fastcall allocmem( Dword reqsize )
-{
- initHeapPtr; // force dependency
- __asm
- {
- push 68
- pop eax
- push 12
- pop ebx
- int 0x40
- }
-
-}
-
-__declspec(noinline) void __fastcall freemem( void *vaddress )
-{
- initHeapPtr; // force dependency
- __asm
- {
- push 68
- pop eax
- push 13
- pop ebx
- int 0x40
- }
-
-}
-/*
-
-//
-Dword mmMutex = FALSE;
-MemBlock *rootfree = NULL;
-MemBlock *rootuser = NULL;
-bool mmInitialized = false;
-Byte *mmHeapTop = NULL;
-
-
-//
-Byte * AllocMemFromSystem( Dword reqSize )
-{
- Byte *result;
- sProcessInfo pInfo;
-
- //
- if ( mmInitialized )
- {
- result = mmHeapTop;
- }
- else
- {
- //
- kos_ProcessInfo( &pInfo );
- //
- result = (Byte *)(pInfo.processInfo.used_memory + 1);
- //
- mmInitialized = true;
- }
- //
- if ( ! kos_ApplicationMemoryResize( ((Dword)result) + reqSize ) )
- {
- result = NULL;
- }
- //
- mmHeapTop = result + reqSize;
- //
- return result;
-}
-
-
-//
-Byte *allocmem( Dword reqsize )
-{
- MemBlock *BlockForCheck;
- MemBlock *LastKnownGood;
- Dword tail;
- Byte *address;
-
- //
- if( ( tail = reqsize % SIZE_ALIGN ) != 0 )
- {
- reqsize += SIZE_ALIGN - tail;
- }
-
- LastKnownGood = NULL;
-
- //
- while ( rtlInterlockedExchange( &mmMutex, TRUE ) )
- {
- //
- kos_Pause( 1 );
- }
-
- //
- if( rootfree != NULL )
- {
- for ( BlockForCheck = rootfree; ; BlockForCheck = BlockForCheck->Next )
- {
- if ( BlockForCheck->Size >= reqsize )
- {
- //
- if ( LastKnownGood != NULL )
- {
- if ( LastKnownGood->Size >= BlockForCheck->Size )
- LastKnownGood = BlockForCheck;
- }
- else
- LastKnownGood = BlockForCheck;
- if ( LastKnownGood->Size == reqsize )
- break;
- }
- if ( BlockForCheck->Next == NULL )
- break;
- }
- }
-
- if ( LastKnownGood != NULL )
- {
- //
- tail = LastKnownGood->Size - reqsize;
- if ( tail >= ( sizeof(MemBlock) + SIZE_ALIGN ) )
- {
- //
- BlockForCheck = (MemBlock *)( ( (Byte *)LastKnownGood ) + tail );
- BlockForCheck->Size = reqsize;
- //
- if( rootuser != NULL )
- {
- BlockForCheck->Next = rootuser;
- rootuser->Previous = BlockForCheck;
- BlockForCheck->Previous = NULL;
- rootuser = BlockForCheck;
- }
- else
- {
- rootuser = BlockForCheck;
- BlockForCheck->Next = NULL;
- BlockForCheck->Previous = NULL;
- }
-
- //
- LastKnownGood->Size = tail - sizeof(MemBlock);
- address = ( (Byte *)BlockForCheck ) + sizeof(MemBlock);
-
- //
- rtlInterlockedExchange( &mmMutex, FALSE );
-
- return address;
- }
- else
- {
- //
- //
- if ( LastKnownGood->Previous != NULL )
- {
- LastKnownGood->Previous->Next = LastKnownGood->Next;
- }
- else
- {
- //
- rootfree = LastKnownGood->Next;
- }
- if( LastKnownGood->Next != NULL )
- {
- LastKnownGood->Next->Previous = LastKnownGood->Previous;
- }
- //
- if( rootuser != NULL )
- {
- LastKnownGood->Next = rootuser;
- rootuser->Previous = LastKnownGood;
- LastKnownGood->Previous = NULL;
- rootuser = LastKnownGood;
- }
- else
- {
- rootuser = LastKnownGood;
- LastKnownGood->Next = NULL;
- LastKnownGood->Previous = NULL;
- }
- //
- address = ( (Byte *)LastKnownGood ) + sizeof(MemBlock);
-
- //
- rtlInterlockedExchange( &mmMutex, FALSE );
-
- return address;
- }
- }
- else
- {
- //
- LastKnownGood = (MemBlock *)AllocMemFromSystem( reqsize + sizeof(MemBlock) );
- //
- if( LastKnownGood != NULL )
- {
- LastKnownGood->Size = reqsize;
- //
- if( rootuser != NULL )
- {
- LastKnownGood->Next = rootuser;
- rootuser->Previous = LastKnownGood;
- LastKnownGood->Previous = NULL;
- rootuser = LastKnownGood;
- }
- else
- {
- rootuser = LastKnownGood;
- LastKnownGood->Next = NULL;
- LastKnownGood->Previous = NULL;
- }
- address = ( (Byte *)LastKnownGood ) + sizeof(MemBlock);
-
- //
- rtlInterlockedExchange( &mmMutex, FALSE );
-
- return address;
- }
- }
-
- //
- rtlInterlockedExchange( &mmMutex, FALSE );
-
- //
- rtlDebugOutString( "allocmem failed." );
- kos_ExitApp();
- //
- return NULL;
-}
-
-//
-Dword freemem( void *vaddress )
-{
- Dword result;
-
- Byte *checknext, *address = (Byte *)vaddress;
-
- //
- while ( rtlInterlockedExchange( &mmMutex, TRUE ) )
- {
- //
- kos_Pause( 1 );
- }
-
- MemBlock *released = (MemBlock *)( address - sizeof(MemBlock) );
-
- result = released->Size;
-
- //
- if ( released->Previous != NULL )
- {
- released->Previous->Next = released->Next;
- }
- else
- {
- rootuser = released->Next;
- }
- if ( released->Next != NULL )
- {
- released->Next->Previous = released->Previous;
- }
- //
- released->Next = rootfree;
- released->Previous = NULL;
- rootfree = released;
- if ( released->Next != NULL )
- {
- released->Next->Previous = released;
- }
-
- //
- checknext = (Byte *)(rootfree) + ( rootfree->Size + sizeof(MemBlock) );
- //
- for ( released = rootfree->Next; released != NULL; released = released->Next )
- {
- if ( checknext == (Byte *)released )
- {
- //
- //
- released->Previous->Next = released->Next;
- if( released->Next != NULL )
- {
- released->Next->Previous = released->Previous;
- }
- //
- rootfree->Size += released->Size + sizeof(MemBlock);
- break;
- }
- }
- // , .
- checknext = (Byte *)(rootfree);
- //
- if ( released == NULL )
- {
- for ( released = rootfree->Next; released != NULL; released = released->Next )
- {
- if ( checknext == (Byte *)released + ( released->Size + sizeof(MemBlock) ) )
- {
- //
- //
- released->Size += rootfree->Size + sizeof(MemBlock);
- //
- released->Previous->Next = released->Next;
- if ( released->Next != NULL )
- {
- released->Next->Previous = released->Previous;
- }
- //
- if ( rootfree->Next != NULL )
- {
- rootfree->Next->Previous = released;
- }
- released->Next = rootfree->Next;
- released->Previous = NULL;
- rootfree = released;
- break;
- }
- }
- }
-
- //
- rtlInterlockedExchange( &mmMutex, FALSE );
-
- return result;
-}
-
-*/
\ No newline at end of file
diff --git a/programs/games/floppybird/smalllibc/mcsmemm.h b/programs/games/floppybird/smalllibc/mcsmemm.h
deleted file mode 100644
index 6d03b242b..000000000
--- a/programs/games/floppybird/smalllibc/mcsmemm.h
+++ /dev/null
@@ -1,28 +0,0 @@
-//
-
-struct MemBlock
-{
- Dword Size;
- Dword Addr;
- MemBlock *Next;
- MemBlock *Previous;
-};
-
-
-#define INITIALQUEUESIZE (32 * 4)
-
-#define FALSE 0
-#define TRUE -1
-
-#define MB_FREE 0
-#define MB_USER 1
-
-#define SIZE_ALIGN 4
-
-
-
-Byte * __fastcall allocmem( Dword reqsize );
-void __fastcall freemem( void *vaddress );
-
-
-
diff --git a/programs/games/floppybird/smalllibc/mymath.h b/programs/games/floppybird/smalllibc/mymath.h
deleted file mode 100644
index 74ac89bd0..000000000
--- a/programs/games/floppybird/smalllibc/mymath.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/* Rocket Forces
- * Filename: mymath.h
- * Version 0.1
- * Copyright (c) Serial 2007
- */
-
-
-extern "C" int _fltused = 0;
-
-#define M_PI 3.14159265358979323846
-
-inline double sin(double x)
-{
- __asm fld x
- __asm fsin
-}
-
-inline double cos(double x)
-{
- __asm fld x
- __asm fcos
-}
-
-inline double sqrt(double x)
-{
- __asm fld x
- __asm fsqrt
-}
-
-inline double acos(double x)
-{
- __asm fld x
- __asm fld st(0)
- __asm fmul st,st(1)
- __asm fld1
- __asm fsubrp st(1),st(0)
- __asm fsqrt
- __asm fxch st(1)
- __asm fpatan
-}
-
-inline double atan(double x)
-{
- double res = acos(1 / sqrt(1 + x * x));
- if (x < 0)
- {
- res *= -1;
- }
- return res;
-}
-
-inline int round_int(double x)
-{
- int i;
- static const float round_to_nearest = 0.5f;
- __asm
- {
- fld x
- fadd st, st(0)
- fadd round_to_nearest
- fistp i
- sar i, 1
- }
- return i;
-}
-
-inline int floor_int(double x)
-{
- int i;
- static const float round_toward_m_i = -0.5f;
- __asm
- {
- fld x
- fadd st, st (0)
- fadd round_toward_m_i
- fistp i
- sar i, 1
- }
- return i;
-}
-
-inline int ceil_int(double x)
-{
- int i;
- static const float round_toward_p_i = -0.5f;
- __asm
- {
- fld x
- fadd st, st (0)
- fsubr round_toward_p_i
- fistp i
- sar i, 1
- }
- return (-i);
-}
diff --git a/programs/games/floppybird/smalllibc/purecall.cpp b/programs/games/floppybird/smalllibc/purecall.cpp
deleted file mode 100644
index 3047c6e80..000000000
--- a/programs/games/floppybird/smalllibc/purecall.cpp
+++ /dev/null
@@ -1,11 +0,0 @@
-#include "kosSyst.h"
-static char pureCallMessage[] = "PURE function call!";
-
-//
-int __cdecl _purecall()
-{
- rtlDebugOutString( pureCallMessage );
- kos_ExitApp();
- return 0;
-}
-
diff --git a/programs/games/floppybird/smalllibc/smalllibc.vcxproj b/programs/games/floppybird/smalllibc/smalllibc.vcxproj
deleted file mode 100644
index f63557793..000000000
--- a/programs/games/floppybird/smalllibc/smalllibc.vcxproj
+++ /dev/null
@@ -1,72 +0,0 @@
-
-
-
-
- Release
- Win32
-
-
-
- {0D291390-1953-4E1F-BBE2-57F12AFF3214}
- Win32Proj
- smalllibc
-
-
-
- StaticLibrary
- false
- true
- Unicode
-
-
-
-
-
-
-
-
-
-
-
- Level3
-
-
- MinSpace
- true
- true
- NDEBUG;_LIB;%(PreprocessorDefinitions)
- MultiThreaded
- false
- true
- Size
-
-
- Windows
- true
- true
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/programs/games/floppybird/smalllibc/smalllibc.vcxproj.filters b/programs/games/floppybird/smalllibc/smalllibc.vcxproj.filters
deleted file mode 100644
index 7f531d6c3..000000000
--- a/programs/games/floppybird/smalllibc/smalllibc.vcxproj.filters
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
-
- {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
- cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx
-
-
- {93995380-89BD-4b04-88EB-625FBE52EBFB}
- h;hpp;hxx;hm;inl;inc;xsd
-
-
- {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
- rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
-
-
-
-
- Заголовочные файлы
-
-
- Заголовочные файлы
-
-
- Заголовочные файлы
-
-
- Заголовочные файлы
-
-
- Заголовочные файлы
-
-
-
-
- Файлы исходного кода
-
-
- Файлы исходного кода
-
-
- Файлы исходного кода
-
-
- Файлы исходного кода
-
-
- Файлы исходного кода
-
-
- Файлы исходного кода
-
-
- Файлы исходного кода
-
-
-
-
-
-
\ No newline at end of file
diff --git a/programs/games/floppybird/smalllibc/sprintf.cpp b/programs/games/floppybird/smalllibc/sprintf.cpp
deleted file mode 100644
index d85286a2c..000000000
--- a/programs/games/floppybird/smalllibc/sprintf.cpp
+++ /dev/null
@@ -1,228 +0,0 @@
-#include "kosSyst.h"
-#include "func.h"
-#include
-
-//////////////////////////////////////////////////////////////////////
-//
-// . barsuk %f
-
-//#define PREC 2
-//#define HALF 0.499
-#define PREC 6
-#define HALF 0.4999999
-
-static double double_tab[]={1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10, 1e11, 1e12, 1e13, 1e14, 1e15,
-1e16, 1e17, 1e18, 1e19, 1e20, 1e21, 1e22, 1e23, 1e24, 1e25, 1e26, 1e27, 1e28, 1e29, 1e30};
-
-
-//
-
-static Dword dectab[] = { 1000000000, 100000000, 10000000, 1000000, 100000,
- 10000, 1000, 100, 10, 0 };
-
-//
-void sprintf( char *Str, char* Format, ... )
-{
- int i, fmtlinesize, j, k, flag;
- Dword head, tail;
- char c;
- va_list arglist;
- //
- va_start(arglist, Format);
-
- //
- fmtlinesize = strlen( Format );
- //
- if( fmtlinesize == 0 ) return;
-
- //
- 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];
- //
- switch( c )
- {
- //
- case '%':
- Str[j++] = c;
- break;
- //
- case 'S':
- Byte* str;
- str = va_arg(arglist, Byte*);
- for( k = 0; ( c = str[k] ) != 0; k++ )
- {
- Str[j++] = c;
- }
- break;
- //
- case 'B':
- k = va_arg(arglist, int) & 0xFF;
- Str[j++] = num2hex( ( k >> 4 ) & 0xF );
- Str[j++] = num2hex( k & 0xF );
- break;
- //
- case 'C':
- Str[j++] = va_arg(arglist, int) & 0xFF;
- break;
- //
- case 'X':
- Dword val;
- val = va_arg(arglist, Dword);
- for( k = 7; k >= 0; k-- )
- {
- //
- c = num2hex ( ( val >> (k * 4) ) & 0xF );
- //
- if( c == '0' )
- {
- if( flag ) Str[j++] = c;
- }
- else
- {
- flag++;
- Str[j++] = c;
- }
- }
- //
- if( flag == 0 ) Str[j++] = '0';
- break;
- //
- case 'U':
- head = va_arg(arglist, Dword);
- tail = 0;
- 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;
- // 7.2
- case 'f':
- case 'F':
- case 'g':
- case 'G':
- {
- double val, w;
- int p;
- val = va_arg(arglist, double);
- if (val < 0.0)
- {
- Str[j++] = '-';
- val = -val;
- }
- for (k = 0; k < 30; k++)
- if (val < double_tab[k])
- break;
-
- if (val < 1.0)
- {
- Str[j++] = '0';
- }
-
- for (p = 1; p < k + 1; p++)
- {
- int d = (int)di(val / double_tab[k - p] - HALF) % 10;
- Str[j++] = '0' + d;
- val -= d * double_tab[k - p];
- }
- Str[j++] = '.';
- w = 0.1;
- for (p = 0; p < PREC - 1; p++)
- {
- val-=floor(val);
- Str[j++] = '0' + di(val / w - HALF) % 10;
- w /= 10.0;
- }
- }
- break;
-
- // 64-
- case 'Q':
- unsigned int low_dword, high_dword;
- low_dword = va_arg(arglist, unsigned int);
- high_dword = va_arg(arglist, unsigned int);
- for( k = 7; k >= 0; k-- )
- {
- //
- c = num2hex ( ( ( high_dword + 1) >> (k * 4) ) & 0xF );
- //
- if( c == '0' )
- {
- if( flag ) Str[j++] = c;
- }
- else
- {
- flag++;
- Str[j++] = c;
- }
- }
- //
- for( k=7; k >= 0; k-- )
- {
- //
- c = num2hex ( ( low_dword >> (k * 4) ) & 0xF );
- //
- if( c == '0' )
- {
- if( flag ) Str[j++] = c;
- }
- else
- {
- flag++;
- Str[j++] = c;
- }
- }
- //
- if( flag == 0 ) Str[j++] = '0';
- //
- break;
- //
- default:
- break;
- }
- }
- //
- Str[j] = 0;
-}
-
-char *ftoa(double d)
-{
- char buffer[256], *p;
- sprintf(buffer, "%f", d);
- p = (char*)allocmem(strlen(buffer)+1);
- strcpy(p, buffer);
- return p;
-}
-
diff --git a/programs/games/flpybird/README.md b/programs/games/flpybird/README.md
new file mode 100644
index 000000000..5fae65987
--- /dev/null
+++ b/programs/games/flpybird/README.md
@@ -0,0 +1,25 @@
+## Floppy Bird for KolibriOS
+
+Simple clone of world-famous Flappy Bird game for KolibriOS, written in C.
+
+### Links
+
+* [Forum topic](http://board.kolibrios.org/viewtopic.php?t=4471)
+
+### Controls
+
+* Main menu:
+ * 1 - fast game mode
+ * 2 - slow game mode
+* Game:
+ * Space - jump
+* Game over:
+ * Space - restart
+ * Escape - return to main menu
+
+### Authors
+
+* zorggish - initial author, all game code
+* Burer - rewrite to C, some tweaks
+
+
\ No newline at end of file
diff --git a/programs/games/flpybird/Tupfile.lua b/programs/games/flpybird/Tupfile.lua
new file mode 100644
index 000000000..08b0c2c39
--- /dev/null
+++ b/programs/games/flpybird/Tupfile.lua
@@ -0,0 +1,12 @@
+if tup.getconfig("NO_TCC") ~= "" then return end
+if tup.getconfig("HELPERDIR") == ""
+then
+ HELPERDIR = "../../../programs"
+end
+tup.include(HELPERDIR .. "/use_tcc.lua")
+
+SRCS = {
+ "flpybird.c"
+}
+
+link_tcc(SRCS, "flpybird");
diff --git a/programs/games/flpybird/flpybird.c b/programs/games/flpybird/flpybird.c
new file mode 100644
index 000000000..6c3f3edd0
--- /dev/null
+++ b/programs/games/flpybird/flpybird.c
@@ -0,0 +1,352 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Floppy Bird - Infinite flopping game
+// Copyright (C) 2021-2025 KolibriOS team
+//
+// Contributor zorggish - Main code
+// Contributor Burer - Rewrite to C
+
+#include
+
+#include "images.h"
+
+/* ===== Global const strings ===== */
+
+static const char HEADER_STRING[] = "Floppy Bird";
+static const char CONTROL_STRING[] = "SPACEBAR TO JUMP";
+static const char GAMEOVER_STRING[] = "GAME OVER";
+static const char SPA_KEY_STRING[] = "PRESS SPACEBAR FOR RESTART";
+static const char ESC_KEY_STRING[] = "PRESS ESCAPE FOR MENU";
+static const char FAST_STRING[] = "1 - FAST";
+static const char SLOW_STRING[] = "2 - SLOW";
+
+/* ===== Global window variables ===== */
+
+#define WIN_W 400
+#define WIN_H 376
+#define WIN_B 5
+#define WIN_S 10
+
+static int WIN_X;
+static int WIN_Y;
+static int WIN_T;
+
+/* ===== Global game variables ===== */
+
+#define GAMESTATE_MENU 0
+#define GAMESTATE_STARTED 1
+#define GAMESTATE_GAMEOVER 2
+
+static int game_rng;
+static int game_speed = 1;
+static int game_pause = 0;
+static char game_score[] = "Score: 000";
+static int game_state;
+
+/* ===== Bird ===== */
+
+#define BIRD_W 19
+#define BIRD_H 20
+#define BIRD_X 100
+
+static int bird_pos;
+static int bird_acc;
+
+static void Bird_initialize(void) {
+ bird_pos = (WIN_H + WIN_T) / 2;
+ bird_acc = 0;
+}
+
+static void Bird_move(void) {
+ bird_acc += (bird_acc <= 30) * 2; // 2 or 0
+ bird_pos += bird_acc / 10;
+}
+
+static void Bird_jump(void) {
+ bird_acc = -50;
+}
+
+/* ===== Tube ===== */
+
+#define TUBE_WIDTH 50
+#define TUBE_GAPHEIGHT 100
+#define TUBE_HEADHEIGHT 18
+
+#define tube_num 3
+
+static int tube_pos[tube_num];
+static int tube_gap[tube_num];
+
+static void Tube_randomize(int t) {
+ int x = game_rng; x ^= x << 13; x ^= x >> 17; x ^= x << 5; game_rng = x;
+ int r = x & 255u;
+ if (r >= WIN_H / 2)
+ r -= 256 - WIN_H / 2;
+ tube_pos[t] = WIN_W + 1;
+ tube_gap[t] = r + (WIN_H / 2 - TUBE_GAPHEIGHT - WIN_B) / 2;
+}
+
+static void Tube_move(int t) {
+ tube_pos[t] -= 2;
+ if (tube_pos[t] < -TUBE_WIDTH - 2)
+ Tube_randomize(t);
+}
+
+static void Tube_draw(int t) {
+ /* cleanup */
+ int pixels = WIN_W - WIN_S - TUBE_WIDTH - tube_pos[t];
+ if (pixels > 0) {
+ if (pixels > 2)
+ pixels = 2;
+ _ksys_draw_bar(tube_pos[t] + TUBE_WIDTH, tube_gap[t] - TUBE_HEADHEIGHT, pixels, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
+ _ksys_draw_bar(tube_pos[t] + TUBE_WIDTH, tube_gap[t] + TUBE_GAPHEIGHT , pixels, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
+ }
+ if (tube_pos[t] < 0) {
+ int w = -tube_pos[t];
+ if (w > 2)
+ w = 2;
+ _ksys_draw_bar(0, tube_gap[t] - TUBE_HEADHEIGHT, w, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
+ _ksys_draw_bar(0, tube_gap[t] + TUBE_GAPHEIGHT , w, TUBE_HEADHEIGHT, GAME_PALETTE[0]);
+ }
+
+ int offset = tube_pos[t] >= 0 ? 0 : -tube_pos[t];
+ int trim = (tube_pos[t] + TUBE_WIDTH >= WIN_W - WIN_S)
+ ? WIN_W - tube_pos[t] - TUBE_WIDTH - WIN_S : 0;
+
+ if (offset >= TUBE_WIDTH + trim)
+ return;
+
+ /* top */
+ for (int y = 0; y < tube_gap[t] - TUBE_HEADHEIGHT; ++y)
+ ksys_draw_bitmap_palette(
+ TUBE_BODY_IMAGE + offset,
+ tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
+ );
+
+ /* head top */
+ for (int y = tube_gap[t] - TUBE_HEADHEIGHT; y < tube_gap[t]; ++y)
+ ksys_draw_bitmap_palette(
+ TUBE_HEAD_IMAGE + TUBE_WIDTH * (y - tube_gap[t] + TUBE_HEADHEIGHT) + offset,
+ tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
+ );
+ /* head down */
+ for (int y = tube_gap[t] + TUBE_GAPHEIGHT; y < tube_gap[t] + TUBE_GAPHEIGHT + TUBE_HEADHEIGHT; ++y)
+ ksys_draw_bitmap_palette(
+ TUBE_HEAD_IMAGE + TUBE_WIDTH * (y - tube_gap[t] - TUBE_GAPHEIGHT) + offset,
+ tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
+ );
+ /* down */
+ for (int y = tube_gap[t] + TUBE_GAPHEIGHT + TUBE_HEADHEIGHT; y < WIN_H - WIN_B; ++y)
+ ksys_draw_bitmap_palette(
+ TUBE_BODY_IMAGE + offset,
+ tube_pos[t] + offset, y, TUBE_WIDTH - offset + trim, 1, 8, GAME_PALETTE, 0
+ );
+}
+
+/* ===== Functions - Helpers ===== */
+
+static void WriteBorderedText(int x, int y, const char* textPtr, int textLen, int fontType) {
+ for (int bx = x + 2; bx >= x - 2; --bx) {
+ for (int by = y + 2; by >= y - 2; --by) {
+ _ksys_draw_text(textPtr, bx, by, textLen, fontType);
+ }
+ }
+ _ksys_draw_text(textPtr, x, y, textLen, fontType | 0x00FFFFFF);
+}
+
+/* ===== Functions - Game Logic ===== */
+
+static inline int checkCollision(int t) {
+ return ((tube_pos[t] <= (BIRD_X + BIRD_W) && tube_pos[t] + TUBE_WIDTH >= BIRD_X)
+ && (bird_pos <= tube_gap[t] || bird_pos + BIRD_H >= tube_gap[t] + TUBE_GAPHEIGHT)) ? 1 : 0;
+}
+
+static inline int checkAddScore(int t) {
+ int r = tube_pos[t] + TUBE_WIDTH;
+ return (r + 2 >= BIRD_X) & (r < BIRD_X);
+}
+
+static void updateScoreString(void) {
+ for (int i = 9; i >= 6; --i) {
+ if (++game_score[i] <= '9') return;
+ game_score[i] = '0';
+ }
+}
+
+/* ===== Functions - Game Drawing ===== */
+
+static inline void createGameWindow(void) {
+ _ksys_create_window(WIN_X, WIN_Y, WIN_W, WIN_H + WIN_T, HEADER_STRING, GAME_PALETTE[0], 0x34);
+}
+
+static void redrawGameWindow(void) {
+ /* cleaning the score area */
+
+ int move = bird_acc / 10;
+ if (move < 0)
+ move = -move;
+ _ksys_draw_bar(BIRD_X, bird_pos - move, BIRD_W, move * 2 + BIRD_H, GAME_PALETTE[0]);
+
+ ksys_draw_bitmap_palette(BIRD_IMAGE, BIRD_X, bird_pos, BIRD_W, BIRD_H, 8, GAME_PALETTE, 0);
+
+ Tube_draw(0); Tube_draw(1); Tube_draw(2);
+
+ WriteBorderedText(10, 10, game_score, 0, 0x81000000);
+}
+
+static void drawGameOverWindow(void) {
+ createGameWindow();
+
+ WriteBorderedText(116, 100, GAMEOVER_STRING, 0, 0x82000000);
+ WriteBorderedText(136, 157, game_score, 0, 0x81000000);
+ WriteBorderedText( 40, 207, SPA_KEY_STRING, 0, 0x81000000);
+ WriteBorderedText( 70, 241, ESC_KEY_STRING, 0, 0x81000000);
+}
+
+static void drawMenuWindow(void) {
+ createGameWindow();
+
+ WriteBorderedText( 88, 34, HEADER_STRING, 6, 0x04000000);
+ WriteBorderedText(188, 87, HEADER_STRING + 7, 4, 0x04000000);
+
+ char* pos = &TUBE_HEAD_IMAGE[0];
+ for (int x = 50 - 1; x >= 50 - TUBE_HEADHEIGHT; --x) {
+ for (int y = 156; y < 156 + TUBE_WIDTH; ++y) {
+ ksys_draw_bitmap_palette(pos, x, y , 1, 1, 8, GAME_PALETTE, 0);
+ ksys_draw_bitmap_palette(pos, x, y + 82, 1, 1, 8, GAME_PALETTE, 0);
+ ++pos;
+ }
+ }
+
+ for (int x = 50; x < WIN_W - WIN_S; ++x)
+ {
+ ksys_draw_bitmap_palette(TUBE_BODY_IMAGE, x, 156, 1, TUBE_WIDTH, 8, GAME_PALETTE, 0);
+ ksys_draw_bitmap_palette(TUBE_BODY_IMAGE, x, 238, 1, TUBE_WIDTH, 8, GAME_PALETTE, 0);
+ }
+
+ WriteBorderedText(139, 171, FAST_STRING, 0, 0x82000000);
+ WriteBorderedText(139, 253, SLOW_STRING, 0, 0x82000000);
+
+ // Control hint
+ WriteBorderedText(100, 322, CONTROL_STRING, 0, 0x81000000);
+}
+
+/* ===== Functions - Game Main ===== */
+
+static void startGame(void) {
+ createGameWindow();
+
+ game_score[7] = game_score[8] = game_score[9] = '0';
+
+ Bird_initialize();
+
+ const int spacing = (WIN_W + TUBE_WIDTH) / 3;
+ for (int i = tube_num - 1; i >= 0; --i) {
+ Tube_randomize(i);
+ tube_pos[i] = WIN_W + i * spacing;
+ }
+
+ game_state = GAMESTATE_STARTED;
+}
+
+static void frameGame(void) {
+ Bird_move();
+
+ /* Processing all tubes */
+ for (int i = tube_num - 1; i >= 0; --i) {
+ /* Adding score */
+ if (checkAddScore(i)) {
+ updateScoreString();
+ _ksys_draw_bar(92, 8, 38, 18, GAME_PALETTE[0]);
+ }
+
+ /* Check collision with bird */
+ if (checkCollision(i))
+ goto game_over;
+
+ /* Move tube */
+ Tube_move(i);
+ }
+
+ /* Checking bird is too high or low */
+ if (bird_pos + BIRD_H > WIN_H - WIN_B || bird_pos < 0)
+ goto game_over;
+
+ redrawGameWindow();
+ return;
+
+ game_over:
+ game_state = GAMESTATE_GAMEOVER;
+ drawGameOverWindow();
+ return;
+}
+
+int main(void) {
+ /* Setting RNG seed */
+ ksys_time_t t = _ksys_get_time();
+ game_rng = (int)t.val | 1u;
+
+ /* Centering window */
+ ksys_pos_t screen = _ksys_screen_size();
+ WIN_X = (screen.x - WIN_W) / 2;
+ WIN_Y = (screen.y - WIN_H) / 2;
+ WIN_T = _ksys_get_skin_height();
+
+ game_state = GAMESTATE_MENU;
+
+ for (;;) {
+ _ksys_delay(game_speed);
+
+ switch (_ksys_check_event()) {
+ case KSYS_EVENT_NONE:
+ if (game_state == GAMESTATE_STARTED)
+ frameGame();
+ break;
+
+ case KSYS_EVENT_REDRAW: {
+ switch (game_state) {
+ case GAMESTATE_MENU: drawMenuWindow(); break;
+ case GAMESTATE_STARTED: redrawGameWindow(); break;
+ case GAMESTATE_GAMEOVER: drawGameOverWindow(); break;
+ }
+ break;
+ }
+
+ case KSYS_EVENT_KEY: {
+ ksys_oskey_t k = _ksys_get_key();
+ switch (game_state) {
+ case GAMESTATE_MENU: {
+ unsigned kc = k.code - 49; // 1 or 2
+ if (kc <= 1) {
+ game_speed = kc + 1;
+ startGame();
+ }
+ break;
+ }
+ case GAMESTATE_STARTED: {
+ if (k.code == 32) // SPACE
+ Bird_jump();
+ break;
+ }
+ case GAMESTATE_GAMEOVER: {
+ if (k.code == 32) // SPACE
+ startGame();
+ if (k.code == 27) // ESCAPE
+ {
+ game_state = GAMESTATE_MENU;
+ drawMenuWindow();
+ }
+ break;
+ }
+ }
+ break;
+ }
+
+ case KSYS_EVENT_BUTTON:
+ _ksys_exit();
+ break;
+ }
+ }
+
+ return 0;
+}
diff --git a/programs/games/flpybird/images.h b/programs/games/flpybird/images.h
new file mode 100644
index 000000000..1e263647a
--- /dev/null
+++ b/programs/games/flpybird/images.h
@@ -0,0 +1,74 @@
+// SPDX-License-Identifier: GPL-2.0-only
+//
+// Floppy Bird - Infinite flopping game
+// Copyright (C) 2021-2025 KolibriOS team
+//
+// Contributor zorggish - Main code
+// Contributor Burer - Rewrite to C
+
+#pragma once
+
+static const int GAME_PALETTE[77] = {
+ // Shared colors
+ 0x0000FFFF, 0x00E0E080, 0x00C0C080, 0x0080A040, 0x00A0C040, 0x00A0C080, 0x00A0E040, 0x0060A040,
+ 0x00C0E080,
+ // Bird-only colors
+ 0x00C08040, 0x00608080, 0x0040C0C0, 0x00E0C080, 0x00806040, 0x00C0DCC0, 0x00A06040, 0x0080C0C0,
+ 0x00E0A040, 0x0020C0C0, 0x00C06040, 0x00C0A080, 0x00A0A080, 0x00800040, 0x00E02080, 0x00E060C0,
+ 0x00808080, 0x00E020C0, 0x00E0A0C0, 0x00804080, 0x00FFFBF0, 0x00E040C0, 0x00002040, 0x00404040,
+ 0x00806080, 0x00A08080, 0x00E0E000, 0x00A0A0A4, 0x0020A080, 0x0040A0C0, 0x0060C0C0, 0x00E0C040,
+ 0x00C00080, 0x00FFFF00, 0x00C0A040, 0x0060A080, 0x0080A080, 0x00C0C0C0, 0x00E0E040, 0x00C0E000,
+ 0x0080E080, 0x00A0A040, 0x0040C080, 0x0060E080, 0x00606080, 0x00C0C040, 0x00C0C000, 0x00808040,
+ 0x00C0E040, 0x00A0C000, 0x006080C0, 0x00A0C0C0, 0x00A0E080,
+ // Tube-only colors
+ 0x00000000, 0x00608040,
+ 0x0080E040, 0x0080C040, 0x0060A000, 0x0040A000, 0x00408000, 0x00204000, 0x00206000, 0x00200040,
+ 0x00402000, 0x00608000, 0x00406000, 0x0060C000, 0x00402040
+};
+
+static const char BIRD_IMAGE[380] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 10, 0, 0, 0, 0, 0, 0, 0,
+ 11, 0, 0, 0, 0, 0, 0, 9, 12, 9, 12, 13, 0, 0, 0, 0, 0, 0, 14, 15,
+ 16, 0, 0, 0, 0, 16, 17, 1, 12, 1, 13, 0, 0, 0, 0, 0, 0, 9, 12, 15,
+ 18, 0, 0, 0, 19, 12, 20, 20, 21, 13, 0, 0, 0, 0, 0, 0, 9, 12, 1, 15,
+ 18, 0, 0, 15, 9, 22, 22, 23, 24, 11, 0, 0, 0, 0, 0, 15, 9, 1, 14, 15,
+ 18, 18, 19, 25, 23, 26, 23, 27, 28, 11, 0, 0, 0, 0, 9, 17, 12, 1, 29, 13,
+ 19, 14, 22, 30, 30, 31, 1, 21, 32, 32, 33, 33, 34, 15, 17, 9, 12, 29, 14, 15,
+ 14, 26, 12, 12, 1, 35, 36, 20, 37, 38, 38, 39, 18, 15, 17, 9, 40, 29, 2, 3,
+ 41, 42, 42, 1, 43, 21, 44, 0, 0, 0, 0, 0, 45, 9, 17, 17, 12, 29, 46, 40,
+ 47, 48, 2, 21, 46, 0, 0, 0, 0, 0, 0, 11, 45, 17, 12, 40, 1, 49, 48, 1,
+ 1, 1, 20, 0, 0, 0, 0, 0, 0, 0, 0, 11, 15, 4, 50, 5, 48, 48, 1, 1,
+ 1, 1, 51, 0, 0, 0, 0, 0, 52, 14, 0, 16, 53, 53, 6, 48, 35, 1, 1, 1,
+ 54, 7, 0, 0, 0, 0, 0, 8, 55, 35, 14, 3, 6, 4, 48, 1, 1, 1, 48, 55,
+ 7, 0, 0, 0, 0, 0, 36, 21, 6, 48, 45, 4, 48, 47, 1, 1, 48, 6, 56, 18,
+ 0, 0, 0, 0, 0, 8, 35, 21, 45, 4, 47, 47, 47, 57, 48, 6, 56, 5, 0, 0,
+ 0, 0, 0, 0, 45, 58, 48, 6, 4, 48, 48, 48, 48, 6, 3, 16, 0, 0, 0, 0,
+ 0, 0, 0, 58, 59, 4, 48, 48, 48, 48, 4, 3, 56, 60, 0, 0, 0, 0, 0, 0,
+ 0, 0, 45, 5, 48, 6, 57, 56, 56, 56, 60, 18, 0, 0, 0, 0, 0, 0, 0, 0,
+ 0, 61, 56, 50, 56, 56, 16, 60, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+static const char TUBE_BODY_IMAGE[50] = {
+ 0, 0, 62, 63, 64, 1, 6, 6, 65, 65, 65, 65, 64, 66, 66, 64, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 67, 66, 68, 68, 69, 66, 68, 68, 69, 70, 69, 71, 0, 0
+};
+
+static const char TUBE_HEAD_IMAGE[900] = {
+ 71, 71, 71, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71, 71, 71, 71, 71,
+ 72, 68, 68, 63, 3, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 4, 7, 7, 5, 5, 7, 7, 3, 7, 7, 7, 7, 7, 3, 3, 3, 3, 73, 74, 69, 69, 72,
+ 72, 75, 75, 65, 6, 1, 1, 1, 1, 8, 8, 8, 1, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 65, 65, 8, 8, 65, 65, 64, 65, 65, 64, 64, 64, 65, 65, 65, 64, 66, 68, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 67, 66, 66, 64, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 69, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 70, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 66, 66, 66, 64, 66, 67, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 65, 65, 65, 65, 67, 66, 66, 64, 66, 67, 66, 66, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 76, 64, 64, 8, 1, 64, 64, 64, 64, 66, 75, 75, 6, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 70, 74, 74, 66, 70, 69, 70, 70, 72,
+ 72, 68, 68, 73, 63, 68, 68, 68, 68, 74, 68, 68, 68, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 70, 70, 70, 74, 70, 70, 70, 70, 72,
+ 72, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 70, 70, 72,
+ 71, 71, 71, 71, 62, 62, 62, 62, 62, 62, 62, 62, 62, 71, 71, 62, 62, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71
+};