
Embox рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо (рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдореИрдВ рдбреЗрд╡рд▓рдкрд░ рд╣реВрдВ) рдореЗрдВ, OpenGL рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдХреЛрдИ рд╕рдордЭрджрд╛рд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдирд╣реАрдВ рдереА, рдХреЗрд╡рд▓ рдХрдИ рдЧреНрд░рд╛рдлрд┐рдХ рдЖрджрд┐рдорддрд╛ рд╡рд╛рд▓реЗ рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рдерд╛ред
рдореБрдЭреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ gamedev рдореЗрдВ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА рдирд╣реАрдВ рдереА, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдореБрдЭреЗ рдЧреЗрдо рдкрд╕рдВрдж рд╣реИ, рдФрд░ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдпрд╣ рдордЬрд╝реЗ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рде рд╣реА рдУрдкрдирдЬреАрдПрд▓ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ рдХрд┐ рдЧреЗрдо рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдЗрдВрдЯрд░реИрдХреНрдЯ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ Embox рдкрд░ Quake3 рдХреЗ рдирд┐рд░реНрдорд╛рдг рдФрд░ рдЪрд▓рд╛рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред
рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд╣рдо рд╕реНрд╡рдпрдВ Quake3 рдирд╣реАрдВ рдЪрд▓рд╛рдПрдВрдЧреЗ, рд▓реЗрдХрд┐рди ioquake3 рдЗрд╕ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рдУрдкрди рд╕реЛрд░реНрд╕ рдХреЛрдб рднреА рд╣реИред рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо ioquake3 рдХреЛ рд╕рд┐рд░реНрдл рднреВрдХрдВрдк рдХрд╣реЗрдВрдЧреЗ :)
рдореИрдВ рддреБрд░рдВрдд рдПрдХ рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛ рдХрд┐ рд▓реЗрдЦ рдХреНрд╡реЗрдХ рд╕реНрд░реЛрдд рдХреЛрдб рдФрд░ рдЗрд╕рдХреА рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ (рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╣реИрдмреЗ рдкрд░ рдЕрдиреБрд╡рд╛рдж рд╣реИрдВ), рдФрд░ рдпрд╣ рд▓реЗрдЦ рдЗрд╕ рдмрд╛рдд рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реЗрдЧрд╛ рдХрд┐ рдЧреЗрдо рдХреЛ рдирдП рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдХреИрд╕реЗ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рдПред
рдмреЗрд╣рддрд░ рд╕рдордЭ рдХреЗ рд▓рд┐рдП рд▓реЗрдЦ рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХреЛрдб рдЕрдВрд╢реЛрдВ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ: рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХреЛ рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЫрджреНрдо рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реА рддрд░рд╣ред рдореВрд▓ рд╕реНрд░реЛрдд рд╣рдорд╛рд░реЗ рднрдВрдбрд╛рд░ рдореЗрдВ рдкрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ
рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдХреНрд╡реЗрдХ 3 рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдХрдИ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:
- POSIX + LibC -
malloc()
/ memcpy()
/ printf()
рдФрд░ рдЗрддрдиреЗ рдкрд░ - libcurl - рдиреЗрдЯрд╡рд░реНрдХрд┐рдВрдЧ
- рдореЗрд╕рд╛ 3 рдбреА - рдУрдкрдирдЬреАрдПрд▓ рд╕рдкреЛрд░реНрдЯ
- рдПрд╕рдбреАрдПрд▓ - рдЗрдирдкреБрдЯ рдФрд░ рдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди
рдкрд╣рд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдХреЗ рд╕рд╛рде, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ - рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдмрд┐рдирд╛ рд╕реА рдореЗрдВ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рдФрд░ рдЗрди рдХреЙрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЗрди рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рдЧрднрдЧ рд╕рднреА рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдХрд┐рд╕реА рди рдХрд┐рд╕реА рддрд░рд╣ рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдореБрдЭреЗ рдмрд╛рдХреА рд╕реЗ рдирд┐рдкрдЯрдирд╛ рдерд╛ред
libcurl
рдпрд╣ рд╕рдмрд╕реЗ рд╕рд░рд▓ рдерд╛ред Libc libcurl рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ (рдмреЗрд╢рдХ, рдХреБрдЫ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реЛрдВрдЧреА, рд▓реЗрдХрд┐рди рдЙрдирдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрдЧреА)ред рдЗрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдирд╛ рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред
рдЖрдорддреМрд░ рдкрд░, рджреЛрдиреЛрдВ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдФрд░ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВрдХрд┐ Embox рдореЗрдВ, рдореБрдЦреНрдп рдореЛрдб рдПрдХ рдЫрд╡рд┐ рдореЗрдВ рд▓рд┐рдВрдХ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд╣рдо рд╕рдм рдХреБрдЫ рд╕реНрдЯреЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рд▓рд┐рдВрдХ рдХрд░реЗрдВрдЧреЗред
рдЙрдкрдпреЛрдЧ рдХреА рдЧрдИ рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЪрд░рдг рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЕрд░реНрде рдХреБрдЫ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
wget https://curl.haxx.se/download/curl-7.61.1.tar.gz tar -xf curl-7.61.1.tar.gz cd curl-7.61.1 ./configure --enable-static --host=i386-unknown-none -disable-shared make ls ./lib/.libs/libcurl.a
рдореЗрд╕рд╛ / OpenGL
рдореЗрд╕рд╛ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдврд╛рдВрдЪрд╛ рд╣реИ, рдпрд╣ рдХрдИ рдЗрдВрдЯрд░рдлреЗрд╕ (рдУрдкрдирд╕реАрдПрд▓, рд╡рд╛рд▓рдХреИрди рдФрд░ рдЕрдиреНрдп) рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдУрдкрдирдЬреАрдПрд▓ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВред рдЗрддрдиреЗ рдмрдбрд╝реЗ рдврд╛рдВрдЪреЗ рдХреЛ рдкреЛрд░реНрдЯ рдХрд░рдирд╛ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХрд╛ рд╡рд┐рд╖рдп рд╣реИред рдореИрдВ рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рдЙрд╕ рддрдХ рд╣реА рд╕реАрдорд┐рдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ Embox Mesa3D рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ :), рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреЛрдИ рднреА OpenGL рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпрд╣рд╛рдБ рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдПрд╕рдбреАрдПрд▓
рдПрд╕рдбреАрдПрд▓ рдЗрдирдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕, рдСрдбрд┐рдпреЛ рдФрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдлреНрд░реЗрдорд╡рд░реНрдХ рд╣реИред
рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╣рдо рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рдЫреЛрдбрд╝рдХрд░ рд╕рдм рдХреБрдЫ рд╣рдереМрдбрд╝рд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдлрд╝реНрд░реЗрдо рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдЯрдм рдлрд╝рдВрдХреНрд╢рдВрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрдм рд╡реЗ рдХреЙрд▓ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмреИрдХрдПрдВрдб SDL2-2.0.8/src/video/SDL_video.c
рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВред
рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
static VideoBootStrap *bootstrap[] = { #if SDL_VIDEO_DRIVER_COCOA &COCOA_bootstrap, #endif #if SDL_VIDEO_DRIVER_X11 &X11_bootstrap, #endif ... }
рдирдП рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗ рд▓рд┐рдП "рд╕рд╛рдорд╛рдиреНрдп" рд╕рдорд░реНрдерди рд╕реЗ рдкрд░реЗрд╢рд╛рди рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЕрдкрдирд╛ VideoBootStrap
рдЬреЛрдбрд╝реЗрдВ
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП src/video/qnx/video.c
рдпрд╛ src/video/raspberry/SDL_rpivideo.c
, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╣рдо рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рдЧрднрдЧ рдЦрд╛рд▓реА рдХрд░ рджреЗрдВрдЧреЗ:
typedef struct VideoBootStrap { const char *name; const char *desc;``` int (*available) (void); SDL_VideoDevice *(*create) (int devindex); } VideoBootStrap; static SDL_VideoDevice *createDevice(int devindex) { SDL_VideoDevice *device; device = (SDL_VideoDevice *)SDL_calloc(1, sizeof(SDL_VideoDevice)); if (device == NULL) { return NULL; } return device; } static int available() { return 1; } VideoBootStrap EMBOX_bootstrap = { "embox", "EMBOX Screen", available, createDevice };
рдЕрдкрдиреЗ VideoBootStrap
рдХреЛ рд╕рд░рдгреА рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
static VideoBootStrap *bootstrap[] = { &EMBOX_bootstrap, #if SDL_VIDEO_DRIVER_COCOA &COCOA_bootstrap, #endif #if SDL_VIDEO_DRIVER_X11 &X11_bootstrap, #endif ... }
рдореВрд▓ рд░реВрдк рд╕реЗ, рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрд╕рдбреАрдПрд▓ рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред Libcurl рдХреЗ рд╕рд╛рде, рд╕рдВрдХрд▓рди рд╡рд┐рд╡рд░рдг рд╡рд┐рд╢реЗрд╖ рдмрд┐рд▓реНрдб рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рддрд░рд╣ рдЖрдкрдХреЛ рдХреБрдЫ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
./configure --host=i386-unknown-none \ --enable-static \ --enable-audio=no \ --enable-video-directfb=no \ --enable-directfb-shared=no \ --enable-video-vulkan=no \ --enable-video-dummy=no \ --with-x=no make ls build/.libs/libSDL2.a
рд╣рдо рдЦреБрдж рд╣реА рдХреНрд╡реЗрдХ рдХрд▓реЗрдХреНрдЯ рдХрд░рддреЗ рд╣реИрдВ
Quake3 рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢рд╛рдорд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рдо рдЗрд╕реЗ рдмрд╛рдХреА рд╕рдм рдЪреАрдЬреЛрдВ рдХреА рддрд░рд╣, рд╕рд╛рдВрдЦреНрдпрд┐рдХреАрдп рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝реЗрдВрдЧреЗред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Makefile рдореЗрдВ рдХреБрдЫ рдЪрд░ рд╕реЗрдЯ рдХрд░реЗрдВ
CROSS_COMPILING=1 USE_OPENAL=0 USE_OPENAL_DLOPEN=0 USE_RENDERER_DLOPEN=0 SHLIBLDFLAGS=-static
рдкрд╣рд▓рд╛ рд▓реЙрдиреНрдЪ
рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рд╣рдо qemu / x86 рдкрд░ рдЪрд▓реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рдФрд░ рдиреАрдЪреЗ рдбреЗрдмрд┐рдпрди рдХреЗ рд▓рд┐рдП рдХрдорд╛рдВрдб рд╣реЛрдВрдЧреЗ, рдЕрдиреНрдп рд╡рд┐рддрд░рдг рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ)ред
sudo apt install qemu-system-i386
рдФрд░ рдЦреБрдж рд▓реЙрдиреНрдЪ:
qemu-system-i386 -kernel build/base/bin/embox -m 1024 -vga std -serial stdio
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХреНрд╡реЗрдХ рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп, рд╣рдореЗрдВ рддреБрд░рдВрдд рдПрдХ рддреНрд░реБрдЯрд┐ рдорд┐рд▓рддреА рд╣реИ
> quake3 EXCEPTION [0x6]: error = 00000000 EAX=00000001 EBX=00d56370 ECX=80200001 EDX=0781abfd GS=00000010 FS=00000010 ES=00000010 DS=00000010 EDI=007b5740 ESI=007b5740 EBP=338968ec EIP=0081d370 CS=00000008 EFLAGS=00210202 ESP=37895d6d SS=53535353
рддреНрд░реБрдЯрд┐ рдЦреЗрд▓ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рджреНрд╡рд╛рд░рд╛ред рдбреЗрдмреИрдЧ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рдХрд┐ рдпрд╣ рддреНрд░реБрдЯрд┐ QEMU рдореЗрдВ x86 рдХреЗ рд▓рд┐рдП рдЕрдкреВрд░реНрдг SIMD рд╕рдорд░реНрдерди рдХреЗ рдХрд╛рд░рдг рдереА: рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ рдФрд░ рдПрдХ рдЕрдЬреНрдЮрд╛рдд рдХрдорд╛рдВрдб рдЕрдкрд╡рд╛рдж (рдЕрдорд╛рдиреНрдп Opcode) рдХреЛ рдлреЗрдВрдХрддрд╛ рд╣реИред рдЕрдкрдбреЗрдЯ : рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ WGH рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ , рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВ cr0 / cr4 рдореЗрдВ SSE рд╕рдорд░реНрдерди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП QEMU рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред
рдпрд╣ рдХреЗрд╡рд▓ рдХреНрд╡реЗрдХ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдУрдкрди рд▓рд┐рд▓рд┐рдВрдм рдореЗрдВ (рдпрд╣ рд╡рд╣ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣реИ рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЧрдгрд┐рддреАрдп рдХрд╛рд░реНрдпреЛрдВ - sin()
, expf()
рдФрд░ рдЗрд╕реА рддрд░рд╣) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддреЗ рд╣реИрдВред OpenLibm рдкреИрдЪ рдХрд░реЗрдВ рддрд╛рдХрд┐ __test_sse()
SSE рдкрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЬрд╛рдБрдЪ рди рдХрд░реЗ, рд▓реЗрдХрд┐рди рдмрд╕ рдпрд╣ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред
рдЙрдкрд░реЛрдХреНрдд рдЪрд░рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ, рдирд┐рдореНрди рдЖрдЙрдЯрдкреБрдЯ рдХрдВрд╕реЛрд▓ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:
> quake3 ioq3 1.36 linux-x86_64 Nov 1 2018 SSE instruction set not available ----- FS_Startup ----- We are looking in the current search path: //.q3a/baseq3 ./baseq3 ---------------------- 0 files in pk3 files "pak0.pk3" is missing. Please copy it from your legitimate Q3 CDROM. Point Release files are missing. Please re-install the 1.32 point release. Also check that your ioq3 executable is in the correct place and that every file in the "baseq3 " directory is present and readable ERROR: couldn't open crashlog.txt
рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдХреНрд╡реЗрдХ 3 рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рднреА рджрд┐рдЦрд╛рддрд╛ рд╣реИ! рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрд╕рдХреЗ рдкрд╛рд╕ baseq3
рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдлрд╛рдЗрд▓реЛрдВ рдХрд╛ рдЕрднрд╛рд╡ рд╣реИред рдЗрд╕рдореЗрдВ рдзреНрд╡рдирд┐рдпрд╛рдБ, рдмрдирд╛рд╡рдЯ рдФрд░ рд╡рд╣ рд╕рдм рд╢рд╛рдорд┐рд▓ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ, pak0.pk3
рдХреЛ рдПрдХ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдкреНрд░рд╛рдкреНрдд рд╕реАрдбреА-рд░реЙрдо рд╕реЗ рд▓рд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП (рд╣рд╛рдВ, рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдХрд╛ рдореБрдлреНрдд рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ)ред
рдбрд┐рд╕реНрдХ рдХреА рддреИрдпрд╛рд░реА
sudo apt install qemu-utils # qcow2- qemu-img create -f qcow2 quake.img 1G # nbd sudo modprobe nbd max_part=63 # qcow2- sudo qemu-nbd -c /dev/nbd0 quake.img sudo mkfs.ext4 /dev/nbd0 sudo mount /dev/nbd0 /mnt cp -r path/to/q3/baseq3 /mnt sync sudo umount /mnt sudo qemu-nbd -d /dev/nbd0
рдЕрдм рдЖрдк рдмреНрд▓реЙрдХ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдХреНрдпреВрдореВ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
qemu-system-i386 -kernel build/base/bin/embox -m 1024 -vga std -serial stdio -hda quake.img
рдЬрдм рд╕рд┐рд╕реНрдЯрдо рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдбрд┐рд╕реНрдХ рдХреЛ /mnt
рдкрд░ рдорд╛рдЙрдВрдЯ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ quake3 рдЪрд▓рд╛рдПрдВ, рдЗрд╕ рдмрд╛рд░ рдмрд╛рдж рдореЗрдВ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ
> mount -t ext4 /dev/hda1 /mnt > cd /mnt > quake3 ioq3 1.36 linux-x86_64 Nov 1 2018 SSE instruction set not available ----- FS_Startup ----- We are looking in the current search path: //.q3a/baseq3 ./baseq3 ./baseq3/pak8.pk3 (9 files) ./baseq3/pak7.pk3 (4 files) ./baseq3/pak6.pk3 (64 files) ./baseq3/pak5.pk3 (7 files) ./baseq3/pak4.pk3 (272 files) ./baseq3/pak3.pk3 (4 files) ./baseq3/pak2.pk3 (148 files) ./baseq3/pak1.pk3 (26 files) ./baseq3/pak0.pk3 (3539 files) ---------------------- 4073 files in pk3 files execing default.cfg couldn't exec q3config.cfg couldn't exec autoexec.cfg Hunk_Clear: reset the hunk ok Com_RandomBytes: using weak randomization ----- Client Initialization ----- Couldn't read q3history. ----- Initializing Renderer ---- ------------------------------- QKEY building random string Com_RandomBytes: using weak randomization QKEY generated ----- Client Initialization Complete ----- ----- R_Init ----- tty]EXCEPTION [0xe]: error = 00000000 EAX=00000000 EBX=00d2a2d4 ECX=00000000 EDX=111011e0 GS=00000010 FS=00000010 ES=00000010 DS=00000010 EDI=0366d158 ESI=111011e0 EBP=37869918 EIP=00000000 CS=00000008 EFLAGS=00010212 ESP=006ef6ca SS=111011e0 EXCEPTION [0xe]: error = 00000000
рдпрд╣ рддреНрд░реБрдЯрд┐ рдлрд┐рд░ рд╕реЗ Qemu рдореЗрдВ SIMD рдХреЗ рд╕рд╛рде рд╣реИред рдЕрдкрдбреЗрдЯ : рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ WGH рджреНрд╡рд╛рд░рд╛ рд╕реБрдЭрд╛рдП рдЧрдП рдЕрдиреБрд╕рд╛рд░ , рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдорд╕реНрдпрд╛ рдпрд╣ рдереА рдХрд┐ рдореИрдВ cr0 / cr4 рдореЗрдВ SSE рд╕рдорд░реНрдерди рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рднреВрд▓ рдЧрдпрд╛, рдЗрд╕рд▓рд┐рдП QEMU рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИред рдЗрд╕ рд╕рдордп, рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ Quake3 x86 рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред X86 рдХреЗ рд▓рд┐рдП рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдПрдХ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд┐рдП рдЧрдП VM (Quake3 рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдХреЗ рд╕рд╛рде рдФрд░, рд╕реИрджреНрдзрд╛рдВрддрд┐рдХ рд░реВрдк рд╕реЗ, рд╡рд╛рд╕реНрддреБрд╢рд┐рд▓реНрдк рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдореЗрдВ, рдЖрдк рдПрдХ рд╣реА рд▓реЗрдЦ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ) рдХреЗ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕рдХреЗ рдмрд╛рдж, рдПрд╕рдбреАрдПрд▓ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдХрд╛рд░реНрдп рдЕрднреА рддрдХ рдХреБрдЫ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВ
static SDL_VideoDevice *createDevice(int devindex) { ... device->GL_GetProcAddress = glGetProcAddress; device->GL_CreateContext = glCreateContext; ... } SDL_GLContext glCreateContext(_THIS, SDL_Window *window) { OSMesaContext ctx; sdl_init_buffers(); ctx = OSMesaCreateContextExt(OSMESA_BGRA, 16, 0, 0, NULL); OSMesaMakeCurrent(ctx, fb_base, GL_UNSIGNED_BYTE, fb_width, fb_height); return ctx; }
рдПрд╕рдбреАрдПрд▓ рдХреЛ рдпрд╣ рдмрддрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рд╣реИрдВрдбрд▓рд░ рдХреА рдЬрд░реВрд░рдд рд╣реИ рдЬреЛ рдУрдкрдирдЬреАрдПрд▓ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╕рд░рдгреА рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╢реБрд░реВ рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ рд╣рдо рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рдХреМрди рд╕реА рдХреЙрд▓ рдЧрд╛рдпрдм рд╣реИрдВ, рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ:
static struct { char *proc; void *fn; } embox_sdl_tbl[] = { { "glClear", glClear }, { "glClearColor", glClearColor }, { "glColor4f", glColor4f }, { "glColor4ubv", glColor4ubv }, { 0 }, }; void *glGetProcAddress(_THIS, const char *proc) { for (int i = 0; embox_sdl_tbl[i].proc != 0; i++) { if (!strcmp(embox_sdl_tbl[i].proc, proc)) { return embox_sdl_tbl[i].fn; } } printf("embox/sdl: Failed to find %s\n", proc); return 0; }
рдХреБрдЫ рдкреБрдирд░рд╛рд░рдВрдн рдореЗрдВ, рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдФрд░ рдореЗрдиреВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реЛ рдЬрд╛рддреА рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдореЗрд╕рд╛ рдХреЗ рдкрд╛рд╕ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХрд╛рд░реНрдп рд╣реИрдВред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдпрд╣ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХрд╛рд░рдг рд╕реЗ рдХреЛрдИ glGetString()
рдлрд╝рдВрдХреНрд╢рди рдирд╣реАрдВ рд╣реИ, _mesa_GetString()
glGetString()
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдерд╛ред
рдЕрдм рдЬрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдПрдХ рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИ, рдЪреАрдпрд░реНрд╕!

рдЗрдирдкреБрдЯ рдбрд┐рд╡рд╛рдЗрд╕ рдЬреЛрдбрд╝реЗрдВ
рдПрд╕рдбреАрдПрд▓ рдореЗрдВ рдХреАрдмреЛрд░реНрдб рдФрд░ рдорд╛рдЙрд╕ рд╕рдорд░реНрдерди рдЬреЛрдбрд╝реЗрдВред
рдШрдЯрдирд╛рдУрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╣реИрдВрдбрд▓рд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛
static SDL_VideoDevice *createDevice(int devindex) { ... device->PumpEvents = pumpEvents; ... }
рдЖрдЗрдП рдХреАрдмреЛрд░реНрдб рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдПрдХ рдХреБрдВрдЬреА рдХреЛ рджрдмрд╛рдиреЗ / рдЬрд╛рд░реА рдХрд░рдиреЗ рдореЗрдВ рдмрд╛рдзрд╛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рдЯрдХрд╛рддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдШрдЯрдирд╛ рдХреЛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рд░рд▓рддрдо рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рдмрд╕ рдПрдХ рд╕реНрдерд╛рдиреАрдп рдЪрд░ рдкрд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рдпрджрд┐ рд╡рд╛рдВрдЫрд┐рдд рд╣реЛ рддреЛ рдХрддрд╛рд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ), рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП рд╣рдо рдХреЗрд╡рд▓ рдЕрдВрддрд┐рдо рдШрдЯрдирд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
static struct input_event last_event; static int sdl_indev_eventhnd(struct input_dev *indev) { while (0 == input_dev_event(indev, &last_event)) { } }
рдлрд┐рд░, pumpEvents()
рдИрд╡реЗрдВрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрд╕рдбреАрдПрд▓ рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ:
static void pumpEvents(_THIS) { SDL_Scancode scancode; bool pressed; scancode = scancode_from_event(&last_event); pressed = is_press(last_event); if (pressed) { SDL_SendKeyboardKey(SDL_PRESSED, scancode); } else { SDL_SendKeyboardKey(SDL_RELEASED, scancode); } }
рдХреБрдВрдЬреА рдХреЛрдб рдФрд░ SDL_Scancode рдкрд░ рдЕрдзрд┐рдХрдПрд╕рдбреАрдПрд▓ рдХреБрдВрдЬреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдПрдирдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдУрдПрд╕ рдХреБрдВрдЬреА рдХреЛрдб рдХреЛ рдПрд╕рдбреАрдПрд▓ рдХреЛрдб рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред
рдЗрди рдХреЛрдб рдХреА рдПрдХ рд╕реВрдЪреА SDL_scancode.h
рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА SDL_scancode.h
рд╣реИ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк ASCII рдХреЛрдб рдХреЛ рдЗрд╕ рддрд░рд╣ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рд╕рднреА ASCII рд╡рд░реНрдг рдпрд╣рд╛рдВ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпреЗ рдХрд╛рдлреА рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ):
static int key_to_sdl[] = { [' '] = SDL_SCANCODE_SPACE, ['\r'] = SDL_SCANCODE_RETURN, [27] = SDL_SCANCODE_ESCAPE, ['0'] = SDL_SCANCODE_0, ['1'] = SDL_SCANCODE_1, ... ['8'] = SDL_SCANCODE_8, ['9'] = SDL_SCANCODE_9, ['a'] = SDL_SCANCODE_A, ['b'] = SDL_SCANCODE_B, ['c'] = SDL_SCANCODE_C, ... ['x'] = SDL_SCANCODE_X, ['y'] = SDL_SCANCODE_Y, ['z'] = SDL_SCANCODE_Z, };
рдпрд╣ рд╕рдм рдХреАрдмреЛрд░реНрдб рдХреЗ рд╕рд╛рде рд╣реИ, рдмрд╛рдХреА рдХреЛ рдПрд╕рдбреАрдПрд▓ рдФрд░ рдХреНрд╡реЗрдХ рдЦреБрдж рд╕рдВрднрд╛рд▓реЗрдВрдЧреЗред рд╡реИрд╕реЗ, рдпрд╣ рдЗрдзрд░-рдЙрдзрд░ рд╣реЛ рдЧрдпрд╛ рдХрд┐ рдХрд╣реАрдВ рдХреАрд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рднреВрдХрдВрдк рдХреЗ рдирд┐рд░реНрджреЗрд╢ QEMU рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ x86 рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рд╕реЗ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХреА рдЧрдИ рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдо BASE_CFLAGS += -DNO_VM_COMPILED
рдХреЛ Makefile рдореЗрдВ BASE_CFLAGS += -DNO_VM_COMPILED
ред
рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдк рд╕реНрдХреНрд░реАрдирд╕реЗрд╡рд░ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ "рд╕реНрдХрд┐рдк" рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЦреЗрд▓ рд╢реБрд░реВ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдХреБрдЫ рддреНрд░реБрдЯрд┐ рдХреЛ рд╣реИрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ :))ред рдпрд╣ рд╕реБрдЦрдж рдЖрд╢реНрдЪрд░реНрдп рдерд╛ рдХрд┐ рд╕рдм рдХреБрдЫ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрджреНрдпрдкрд┐ рдмрд╣реБрдд рдХрдо рдПрдлрдкреАрдПрд╕ рдХреЗ рд╕рд╛рдеред

рдЕрдм рдЖрдк рдорд╛рдЙрд╕ рд╕рдкреЛрд░реНрдЯ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдорд╛рдЙрд╕ рдЗрдВрдЯрд░рдкреНрдЯ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рд╣реИрдВрдбрд▓рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╡реЗрдВрдЯ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдХреЛ рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╣реЛрдирд╛ рд╣реЛрдЧрд╛ред рд╣рдо рдЦреБрдж рдХреЛ рдХреЗрд╡рд▓ рдмрд╛рдИрдВ рдорд╛рдЙрд╕ рдмрдЯрди рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЙрд╕реА рддрд░рд╣, рдЖрдк рд╕рд╣реА рдХреБрдВрдЬреА, рдкрд╣рд┐рдпрд╛, рдЖрджрд┐ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
static void pumpEvents(_THIS) { if (from_keyboard(&last_event)) { ... } else { if (is_left_click(&last_event)) { SDL_SendMouseButton(0, 0, SDL_PRESSED, SDL_BUTTON_LEFT); } else if (is_left_release(&last_event)) { SDL_SendMouseButton(0, 0, SDL_RELEASED, SDL_BUTTON_LEFT); } else { SDL_SendMouseMotion(0, 0, 1, mouse_diff_x(), mouse_diff_y()); } } }
рдЙрд╕рдХреЗ рдмрд╛рдж, рдХреИрдорд░реЗ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдФрд░ рд╢реВрдЯ рдХрд░рдирд╛, рдЪреАрдпрд░реНрд╕ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ! рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ :)

рдЕрдиреБрдХреВрд▓рди
рдпрд╣ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рд╢рд╛рдВрдд рд╣реИ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдФрд░ рдХреБрдЫ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдРрд╕рд╛ рдПрдлрдкреАрдПрд╕ рдмрд┐рд▓реНрдХреБрд▓ рдмреЗрдХрд╛рд░ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЬреНрдпрд╛рджрд╛рддрд░ рд╕рдордп рдУрдкрдирдЬреАрдПрд▓ рдкрд░ рдЦрд░реНрдЪ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдФрд░ рдпрд╣ рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╣реИ, рдФрд░, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, SIMD рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рдорд░реНрдерди рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрд╣реБрдд рд▓рдВрдмрд╛ рдФрд░ рдХрдард┐рди рдХрд╛рдо рд╣реИред
рдЖрдЗрдП рдереЛрдбрд╝рд╛ рдЦреВрди рд╕реЗ рдЦреЗрд▓ рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВред
рд╕рдВрдХрд▓рдХ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдХрдо рд╕рдВрдХрд▓реНрдк
рд╣рдо рдЦреЗрд▓ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╕рднреА рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ, рдФрд░ рдУрдПрд╕ рдХреЗ рд╕рд╛рде рд╣реА -O3
(рдпрджрд┐, рдЕрдЪрд╛рдирдХ, рдХреЛрдИ рдЗрд╕ рдЬрдЧрд╣ рдкрд░ рдкрдврд╝рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдирд╣реАрдВ рдЬрд╛рдирддрд╛ рдХрд┐ рдпрд╣ рдзреНрд╡рдЬ рдХреНрдпрд╛ рд╣реИ - рдЬреАрд╕реАрд╕реА рдЕрдиреБрдХреВрд▓рди рдЭрдВрдбреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдпрд╣рд╛рдВ рдорд┐рд▓ рд╕рдХрддреА рд╣реИ )ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреЗ рдХрд╛рдо рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди - 320x240 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
рдХреЗрд╡реАрдПрдо
KVM (рдХрд░реНрдиреЗрд▓-рдЖрдзрд╛рд░рд┐рдд рд╡рд░реНрдЪреБрдЕрд▓ рдорд╢реАрди) рдЖрдкрдХреЛ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди (Intel VT рдФрд░ AMD-V) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред Qemu рдЗрд╕ рддрдВрддреНрд░ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдирд┐рдореНрди рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ BIOS рдореЗрдВ рд╡рд░реНрдЪреБрдЕрд▓рд╛рдЗрдЬреЗрд╢рди рд╕рдорд░реНрдерди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ B450M DS3H рдорджрд░рдмреЛрд░реНрдб рд╣реИ, рдФрд░ AMD-V рдХреЛ MIT -> рдЙрдиреНрдирдд рдлреНрд░реАрдХреНрд╡реЗрдВрд╕реА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> рдЙрдиреНрдирдд CPU рдХреЛрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -> SVM рдореЛрдб -> рд╕рдХреНрд╖рдо (рдЧреАрдЧрд╛рдмрд╛рдЗрдЯ, рдЖрдкрдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдЧрд▓рдд рд╣реИ?) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЪрд╛рд▓реВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдлрд┐рд░ рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдбрд╛рд▓рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреБрдХреНрдд рдореЙрдбреНрдпреВрд▓ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ
sudo apt install qemu-kvm sudo modprobe kvm-amd
рдпрд╣реА рд╣реИ, рдЕрдм рдЖрдк qemu -enable-kvm
рдлреНрд▓реИрдЧ рдХреЛ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдпрд╛ -no-kvm
рддрд╛рдХрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ)ред
рдкрд░рд┐рдгрд╛рдо
рдЦреЗрд▓ рд╢реБрд░реВ рд╣реБрдЖ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ, рдирд┐рдпрдВрддреНрд░рдг рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИред рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдХ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╕реАрдкреАрдпреВ рдкрд░ рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ, рд╡рд╣ рднреА рдмрд┐рдирд╛ рд╕рд┐рдордб рдХреЗ, рдХрдо рдПрдлрдкреАрдПрд╕ (2-3 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб) рдХреА рд╡рдЬрд╣ рд╕реЗ рдЗрд╕реЗ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдмрд╣реБрдд рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред
рдкреЛрд░реНрдЯрд┐рдВрдЧ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рдереАред рд╢рд╛рдпрдж рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рддреНрд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рднреВрдХрдВрдк рд▓реЙрдиреНрдЪ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╣реИред