{"id":290350,"date":"2018-10-05T03:25:02","date_gmt":"2018-10-04T23:25:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=290350"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=290350","title":{"rendered":"Firecore \u2014 \u043d\u0435\u0441\u043a\u0443\u0447\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u043d\u0430 AVR"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dv\/yz\/hr\/dvyzhr-e4xxmj6jbln7ngiti5d0.png\"><\/p>\n<p>  \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u043c \u0432\u0435\u0447\u0435\u0440\u043d\u0438\u043c \u0434\u043e\u043b\u0433\u043e\u0441\u0442\u0440\u043e\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u043b\u0430\u0431\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435.<\/p>\n<p>  \u041e \u0442\u043e\u043c \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435, \u0447\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043a\u043b\u043e\u043d Pong \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>  \u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e: \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0442\u0440\u0430\u0444\u0438\u043a \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438!<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h3>\u041a\u043e\u0440\u043e\u0442\u043a\u043e \u043e\u0431 \u0438\u0433\u0440\u0435<\/h3>\n<hr>\n<p> Shoot`em up! \u2014 \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430 AVR.<\/p>\n<p>  \u041f\u043e \u0444\u0430\u043a\u0442\u0443 \u044d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0448\u043c\u0430\u043f, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0440\u0430\u0437 \u0433\u043b\u0430\u0432\u043d\u044b\u0439 \u0433\u0435\u0440\u043e\u0439 <s>\u0428\u0435\u043f\u0430\u0440\u0434<\/s> \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043f\u0430\u0441\u0442\u0438 \u0433\u0430\u043b\u0430\u043a\u0442\u0438\u043a\u0443 \u043e\u0442 \u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e\u0439 \u0430\u0442\u0430\u043a\u0438 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043a\u043e\u0433\u043e, \u043f\u0440\u043e\u0431\u0438\u0440\u0430\u044f\u0441\u044c \u043f\u043e \u043a\u043e\u0441\u043c\u043e\u0441\u0443 \u0441\u043a\u0432\u043e\u0437\u044c \u0437\u0432\u0435\u0437\u0434\u044b \u0438 \u043f\u043e\u043b\u044f \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434\u043e\u0432 \u043f\u043e\u043f\u0443\u0442\u043d\u043e \u0437\u0430\u0447\u0438\u0449\u0430\u044f \u043a\u0430\u0436\u0434\u0443\u044e \u0437\u0432\u0435\u0437\u0434\u043d\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443.<br \/>  \u0412\u0441\u044f \u0438\u0433\u0440\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043d\u0430 \u0421 \u0438 \u0421++ \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 Wire \u043e\u0442 Arduino.<\/p>\n<p>  \u0412 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c 4 \u043a\u043e\u0440\u0430\u0431\u043b\u044f \u043d\u0430 \u0432\u044b\u0431\u043e\u0440(\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f), \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u0445\u0430\u0440\u0430\u043a\u0442\u0435\u0440\u0438\u0441\u0442\u0438\u043a\u0430\u043c\u0438:  <\/p>\n<ul>\n<li> \u043c\u0430\u043d\u0435\u0432\u0440\u0435\u043d\u043d\u043e\u0441\u0442\u044c;<\/li>\n<li> \u043f\u0440\u043e\u0447\u043d\u043e\u0441\u0442\u044c;<\/li>\n<li> \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u043e\u0440\u0443\u0434\u0438\u0439.<\/li>\n<\/ul>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043e:  <\/p>\n<ul>\n<li> \u0446\u0432\u0435\u0442\u043d\u0430\u044f 2D \u0433\u0440\u0430\u0444\u0438\u043a\u0430;<\/li>\n<li> power up \u0434\u043b\u044f \u0432\u043e\u043e\u0440\u0443\u0436\u0435\u043d\u0438\u044f;<\/li>\n<li> \u0431\u043e\u0441\u0441\u044b \u0432 \u043a\u043e\u043d\u0446\u0435 \u0443\u0440\u043e\u0432\u043d\u0435\u0439;<\/li>\n<li> \u0443\u0440\u043e\u0432\u043d\u0438 \u0441 \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u043c\u0438 (\u0438 \u0438\u0445 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f);<\/li>\n<li> \u0441\u043c\u0435\u043d\u0430 \u0446\u0432\u0435\u0442\u0430 \u0444\u043e\u043d\u0430 \u043d\u0430 \u0443\u0440\u043e\u0432\u043d\u044f\u0445 (\u0430 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0441\u043c\u043e\u0441);<\/li>\n<li> \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 \u0437\u0432\u0435\u0437\u0434 \u043d\u0430 \u0444\u043e\u043d\u0435 \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e (\u0434\u043b\u044f \u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0433\u043b\u0443\u0431\u0438\u043d\u044b);<\/li>\n<li> \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u043e\u0447\u043a\u043e\u0432 \u0438 \u0438\u0445 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0432 EEPROM;<\/li>\n<li> \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0435 \u0437\u0432\u0443\u043a\u0438 (\u0432\u044b\u0441\u0442\u0440\u0435\u043b\u044b, \u0432\u0437\u0440\u044b\u0432\u044b \u0438.\u0442.\u0434.);<\/li>\n<li> \u043c\u043e\u0440\u0435 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u043e\u0432.<\/li>\n<\/ul>\n<p>  <\/p>\n<h3>\u041f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430<\/h3>\n<hr>\n<p> \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u0437\u0440\u0430\u043a\u0430.<\/p>\n<blockquote><p>\u0417\u0430\u0440\u0430\u043d\u0435\u0435 \u0443\u0442\u043e\u0447\u043d\u044e, \u0447\u0442\u043e \u044d\u0442\u0443 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0441\u0442\u043e\u0438\u0442 \u0432\u043e\u0441\u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u0442\u0430\u0440\u0443\u044e \u0438\u0433\u0440\u043e\u0432\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f (80-\u0435 \u0433\u043e\u0434\u0430).  <\/p><\/blockquote>\n<p>  \u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u043f\u043e\u0434 \u0437\u0430\u043f\u0440\u0435\u0442\u043e\u043c \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0435 \u043c\u043e\u0434\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043d\u0430\u0434 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u043c \u0436\u0435\u043b\u0435\u0437\u043e\u043c, \u0447\u0442\u043e \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438.<br \/>  \u0414\u0430\u043d\u043d\u0430\u044f \u0438\u0433\u0440\u0430 \u0431\u044b\u043b\u0430 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 \u043f\u043e\u0434 \u043f\u043b\u0430\u0442\u0443 Arduino Esplora, \u043d\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441 \u043f\u043e\u0434 \u0442\u043e\u0442 \u0436\u0435 GBA \u0438\u043b\u0438 \u043b\u044e\u0431\u0443\u044e \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0434\u0443\u043c\u0430\u044e \u043d\u0435 \u0441\u043e\u0441\u0442\u0430\u0432\u0438\u0442 \u0431\u043e\u043b\u044c\u0448\u043e\u0433\u043e \u0442\u0440\u0443\u0434\u0430.<br \/>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u0434\u0430\u0436\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0435 \u044d\u0442\u0430 \u043f\u043b\u0430\u0442\u0430 \u043e\u0441\u0432\u0435\u0449\u0430\u043b\u0430\u0441\u044c \u0432\u0441\u0435\u0433\u043e \u043f\u0430\u0440\u0443 \u0440\u0430\u0437, \u0430 \u0434\u0440\u0443\u0433\u0438\u0435 \u043f\u043b\u0430\u0442\u044b \u0438 \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u0443\u0434\u043e\u0441\u0442\u043e\u0438\u043b\u0438\u0441\u044c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043d\u0438\u044f, \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0443 \u043a\u0430\u0436\u0434\u043e\u0439:  <\/p>\n<ul>\n<li> GameBuino META:<\/li>\n<li> Pokitto;<\/li>\n<li> makerBuino;<\/li>\n<li> Arduboy;<\/li>\n<li> UzeBox\/FuzeBox;<\/li>\n<li> \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435.<\/li>\n<\/ul>\n<p>  \u041d\u0430\u0447\u043d\u0443 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0435\u0433\u043e \u043d\u0430 Esplora \u043d\u0435\u0442:  <\/p>\n<ul>\n<li> \u043c\u043d\u043e\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 (ROM 28\u043a\u0431, RAM 2,5\u043a\u0431);<\/li>\n<li> \u043c\u043e\u0449\u043d\u043e\u0441\u0442\u0438 (8 \u0431\u0438\u0442 CPU \u043d\u0430 16 \u041c\u0413\u0446);<\/li>\n<li> DMA;<\/li>\n<li> \u0437\u043d\u0430\u043a\u043e\u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430;<\/li>\n<li> \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0441\u0442\u0435\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432) \u0441\u043f\u0435\u0446. \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f (\u043f\u0430\u043b\u0438\u0442\u0440\u0430, \u0442\u0430\u0439\u043b\u044b, \u0444\u043e\u043d \u0438.\u0442.\u0434.);<\/li>\n<li> \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044f\u0440\u043a\u043e\u0441\u0442\u044c\u044e \u044d\u043a\u0440\u0430\u043d\u0430 (\u044d\u0445, \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u0432 \u0432 \u043f\u043e\u043c\u043e\u0439\u043a\u0443);<\/li>\n<li> \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u0435\u0439 \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 (\u043c\u0430\u043f\u043f\u0435\u0440\u044b);<\/li>\n<li> \u043e\u0442\u043b\u0430\u0434\u0447\u0438\u043a\u0430 (<s>\u0434\u0430 \u043a\u043e\u043c\u0443 \u043e\u043d \u043d\u0443\u0436\u0435\u043d \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u044d\u043a\u0440\u0430\u043d!<\/s>).<\/li>\n<\/ul>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0443 \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c:  <\/p>\n<ul>\n<li> \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u044b\u0439 SPI (\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 F_CPU\/2);<\/li>\n<li> \u044d\u043a\u0440\u0430\u043d \u043d\u0430 \u0431\u0430\u0437\u0435 ST7735 160&#215;128 1,44\u201c;<\/li>\n<li> \u0449\u0435\u043f\u043e\u0442\u043a\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u043e\u0432 (\u0432\u0441\u0435\u0433\u043e 4\u0448\u0442.);<\/li>\n<li> \u0449\u0435\u043f\u043e\u0442\u043a\u0430 GPIO;<\/li>\n<li> \u0433\u043e\u0440\u0441\u0442\u044c \u043a\u043d\u043e\u043f\u043e\u043a (5\u0448\u0442 + \u0434\u0432\u0443\u0445\u043e\u0441\u0435\u0432\u043e\u0439 \u0434\u0436\u043e\u0439\u0441\u0442\u0438\u043a);<\/li>\n<li> \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0434\u0430\u0442\u0447\u0438\u043a\u043e\u0432(\u043e\u0441\u0432\u0435\u0449\u0435\u043d\u0438\u0435, \u0430\u043a\u0441\u0435\u043b\u0435\u0440\u043e\u043c\u0435\u0442\u0440, \u0442\u0435\u0440\u043c\u043e\u043c\u0435\u0442\u0440);<\/li>\n<li> <s>\u0438\u0437\u043b\u0443\u0447\u0430\u0442\u0435\u043b\u044c \u0440\u0430\u0437\u0434\u0440\u0430\u0436\u0435\u043d\u0438\u044f<\/s> piezo buzzer.<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0442\u0443\u0442 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u0442. \u041d\u0435\u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0437\u0430\u0445\u043e\u0442\u0435\u043b \u043d\u0438\u0447\u0435\u0433\u043e \u0441 \u043d\u0435\u0439 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u043e\u043c\u0435 \u043a\u043b\u043e\u043d\u0430 Pong \u0438 \u043f\u0430\u0440\u044b \u0442\u0440\u043e\u0439\u043a\u0438 \u0438\u0433\u0440 \u0437\u0430 \u0432\u0441\u0435 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f!<br \/>  \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 ATmega32u4 (\u0438 \u0435\u043c\u0443 \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c) \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u043e\u0434 Intel 8051 (\u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u043d\u0430 \u043c\u043e\u043c\u0435\u043d\u0442 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043f\u043e\u0447\u0442\u0438 40 \u043b\u0435\u0442), \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u043e\u0433\u0440\u043e\u043c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0441\u043b\u043e\u0432\u0438\u0439 \u0438 \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u0442\u044c \u043a \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c \u0442\u0440\u044e\u043a\u0430\u043c \u0438 \u0443\u0445\u0438\u0449\u0440\u0435\u043d\u0438\u044f\u043c.<\/p>\n<h3>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0438<\/h3>\n<hr>\n<p> \u041e\u0434\u0438\u043d \u043d\u0430 \u0432\u0441\u0435!<\/p>\n<p>  \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u0441\u0445\u0435\u043c\u0443 \u0431\u044b\u043b\u043e \u043e\u0442\u0447\u0435\u0442\u043b\u0438\u0432\u043e \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0441\u044f \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0441\u0448\u0438\u0440\u0438\u0442\u0435\u043b\u044c GPIO (\u043c\u0443\u043b\u044c\u0442\u0438\u043f\u043b\u0435\u043a\u0441\u043e\u0440 74HC4067D \u0434\u0430\u043b\u0435\u0435 MUX) \u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 GPIO PF4,PF5,PF6,PF7 \u0438\u043b\u0438 \u0441\u0442\u0430\u0440\u0448\u0435\u0433\u043e \u043d\u0438\u0431\u0431\u043b\u0430 PORTF, \u0430 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u044b\u0445\u043e\u0434\u0430 MUX \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 GPIO \u2014 PF1.<br \/>  \u041e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0432\u0445\u043e\u0434 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u044f \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u0443 PORTF \u043f\u043e \u043c\u0430\u0441\u043a\u0435 \u0438 \u043d\u0438 \u0432 \u043a\u043e\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432 \u043f\u0440\u043e \u043c\u043b\u0430\u0434\u0448\u0438\u0439 \u043d\u0438\u0431\u0431\u043b:  <\/p>\n<pre><code class=\"cpp\">uint16_t getAnalogMux(uint8_t chMux) {   MUX_PORTX = ((MUX_PORTX &amp; 0x0F) | ((chMux&lt;&lt;4)&amp;0xF0));   return readADC(); } <\/code><\/pre>\n<p>  \u041e\u043f\u0440\u043e\u0441 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043d\u043e\u043f\u043a\u0438:  <\/p>\n<pre><code class=\"cpp\">#define SW_BTN_MIN_LVL 800 bool readSwitchButton(uint8_t btn) {   bool state = true;   if(getAnalogMux(btn) &gt; SW_BTN_MIN_LVL) { \/\/ low state == pressed     state = false;   }   return state; } <\/code><\/pre>\n<p>  \u0414\u0430\u043b\u0435\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u043f\u043e\u0440\u0442\u0430 F:  <\/p>\n<pre><code class=\"cpp\">#define SW_BTN_1_MUX   0 #define SW_BTN_2_MUX   8 #define SW_BTN_3_MUX   4 #define SW_BTN_4_MUX   12 <\/code><\/pre>\n<p>  \u0414\u043e\u0431\u0430\u0432\u0438\u0432 \u0435\u0449\u0435 \u0447\u0443\u0442\u044c-\u0447\u0443\u0442\u044c:  <\/p>\n<pre><code class=\"cpp\">#define BUTTON_A   SW_BTN_4_MUX #define BUTTON_B   SW_BTN_1_MUX #define BUTTON_X   SW_BTN_2_MUX #define BUTTON_Y   SW_BTN_3_MUX #define buttonIsPressed(a)  readSwitchButton(a) <\/code><\/pre>\n<p>  \u041c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043e\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0443\u044e \u043a\u0440\u0435\u0441\u0442\u043e\u0432\u0438\u043d\u0443:  <\/p>\n<pre><code class=\"cpp\">void updateBtnStates(void) {   if(buttonIsPressed(BUTTON_A))     btnStates.aBtn = true;   if(buttonIsPressed(BUTTON_B))     btnStates.bBtn = true;   if(buttonIsPressed(BUTTON_X))     btnStates.xBtn = true;   if(buttonIsPressed(BUTTON_Y))     btnStates.yBtn = true; } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0448\u0443 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043d\u0435 \u0441\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438\u043d\u0430\u0447\u0435 \u043c\u043e\u0436\u043d\u043e \u0443\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0430\u043a\u0442 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043d\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0443 (\u0435\u0449\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0430 \u0437\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u0434\u0440\u0435\u0431\u0435\u0437\u0433\u0430).<\/p>\n<h3>SFX<\/h3>\n<hr>\n<p> \u0416\u0443\u0436\u0436\u0430\u043d\u0438\u0435 \u0431\u0438\u0442.<\/p>\n<p>  \u0427\u0442\u043e \u0435\u0441\u043b\u0438 \u043d\u0435\u0442 DAC, \u043d\u0435\u0442 \u0447\u0438\u043f\u0430 \u043e\u0442 Yamaha, \u0430 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a PWM \u0432 1 \u0431\u0438\u0442 \u0434\u043b\u044f \u0437\u0432\u0443\u043a\u0430?<br \/>  \u0421\u043f\u0435\u0440\u0432\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e, \u043d\u043e \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u044d\u0442\u043e, \u0437\u0434\u0435\u0441\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0445\u0438\u0442\u0440\u044b\u0439 PWM \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u0445\u043d\u0438\u043a\u0438 \u00abPDM audio\u00bb \u0438 \u0441 \u0435\u0435 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c <a href=\"https:\/\/www.youtube.com\/watch?v=zfegDlcUwJU\">\u0442\u0430\u043a\u043e\u0435.<\/a><\/p>\n<p>  \u041d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043e\u0442 Gamebuino \u0438 \u0432\u0441\u0435 \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e, \u0442\u0430\u043a \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 <br \/>  \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0445\u043b\u043e\u043f\u043a\u043e\u0432 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 GPIO \u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u043d\u0430 Esplora (timer4 \u0438 \u0432\u044b\u0432\u043e\u0434 OCR4D). \u0415\u0449\u0435 \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f timer1 \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439 \u0438 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 OCR4D \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438.<\/p>\n<p>  \u0414\u0432\u0438\u0436\u043e\u043a Gamebuino \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u044b (\u043a\u0430\u043a \u0432 \u0442\u0440\u0435\u043a\u0435\u0440\u043d\u043e\u0439 \u043c\u0443\u0437\u044b\u043a\u0435), \u0447\u0442\u043e \u043d\u0435\u043f\u043b\u043e\u0445\u043e \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0442 \u043c\u0435\u0441\u0442\u043e, \u043d\u043e \u0432\u0441\u0435 \u0441\u044d\u043c\u043f\u043b\u044b \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443, \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c\u0438 \u0442\u0443\u0442 \u043d\u0435\u0442.<br \/>  \u0421\u0442\u043e\u0438\u0442 \u0443\u043f\u043e\u043c\u044f\u043d\u0443\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0434\u0432\u0438\u0436\u043e\u043a \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043f\u0435\u0440\u0438\u043e\u0434\u0443 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0430\u0432\u043d\u044b\u043c \u043e\u043a\u043e\u043b\u043e 1\/50 \u0441\u0435\u043a \u0438\u043b\u0438 20 \u043a\u0430\u0434\u0440\u0430\u043c\/\u0441\u0435\u043a\u2026<\/p>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0445 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0447\u0442\u0435\u043d\u0438\u044f Wiki \u043f\u043e \u0430\u0443\u0434\u0438\u043e\u0444\u043e\u0440\u043c\u0430\u0442\u0443, \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u043f\u0440\u043e\u0441\u0442\u0443\u044e GUI \u043d\u0430 Qt. \u041e\u043d\u043e \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0437\u0432\u0443\u043a \u0442\u043e\u0447\u043d\u043e \u0442\u0430\u043a \u0436\u0435, \u043d\u043e \u0434\u0430\u0435\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u0437\u0432\u0443\u0447\u0430\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c, \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0438 \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e.<\/p>\n<h3>\u0413\u0440\u0430\u0444\u0438\u043a\u0430<\/h3>\n<hr>\n<p> \u0411\u0435\u0441\u0441\u043c\u0435\u0440\u0442\u043d\u044b\u0439 Pixelart.<\/p>\n<p>  \u0414\u0438\u0441\u043f\u043b\u0435\u0439 \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442 \u0446\u0432\u0435\u0442\u0430 \u0432 \u0434\u0432\u0443\u0445 \u0431\u0430\u0439\u0442\u0430\u0445 (RGB565), \u043d\u043e \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0432 \u0442\u0430\u043a\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u0437\u0430\u0439\u043c\u0443\u0442 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e, \u0442\u043e \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u043f\u043e \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u0443\u0436\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b \u043d\u0435 \u0440\u0430\u0437 \u0432 \u0441\u0432\u043e\u0438\u0445 \u0440\u0430\u043d\u043d\u0438\u0445 \u0441\u0442\u0430\u0442\u044c\u044f\u0445.<br \/>  \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 Famicom\/ NES \u0437\u0434\u0435\u0441\u044c \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0446\u0432\u0435\u0442\u043e\u0432 \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0435\u0442 \u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043e\u0432 \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0431\u043e\u043b\u044c\u0448\u0435.<\/p>\n<p>  \u041a\u0430\u0436\u0434\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0432 \u0438\u0433\u0440\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043c\u0430\u0441\u0441\u0438\u0432 \u0431\u0430\u0439\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435:  <\/p>\n<ul>\n<li> \u0448\u0438\u0440\u0438\u043d\u0430, \u0432\u044b\u0441\u043e\u0442\u0430;<\/li>\n<li> \u043c\u0430\u0440\u043a\u0435\u0440 \u043d\u0430\u0447\u0430\u043b\u0430 \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li> \u0441\u043b\u043e\u0432\u0430\u0440\u044c (\u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c, \u043d\u043e \u043e\u0431 \u044d\u0442\u043e\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435);<\/li>\n<li> \u043f\u043e\u043b\u0435\u0437\u043d\u0430\u044f \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430;<\/li>\n<li> \u043c\u0430\u0440\u043a\u0435\u0440 \u043a\u043e\u043d\u0446\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<\/ul>\n<p>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0442\u0430\u043a\u0430\u044f \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0430 \u0432 10 \u0440\u0430\u0437):<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/zk\/rr\/es\/zkrresh27swmtvck9fagoemando.png\"><\/p>\n<p>  \u0432 \u043a\u043e\u0434\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u0442\u044c \u0442\u0430\u043a:  <\/p>\n<pre><code class=\"cpp\">pic_t weaponLaserPic1[] PROGMEM = {   0x0f,0x07,   0x02,   0x8f,0x32,0xa2,0x05,0x8f,0x06,0x22,0x41,0xad,0x03,0x41,0x22,0x8f,0x06,0xa2,0x05,   0x8f,0x23,0xff, }; <\/code><\/pre>\n<p>  \u041a\u0443\u0434\u0430 \u0436\u0435 \u0431\u0435\u0437 \u0432\u044b\u0431\u043e\u0440\u0430 \u043a\u043e\u0440\u0430\u0431\u043b\u044f \u0432 \u044d\u0442\u043e\u043c \u0436\u0430\u043d\u0440\u0435? \u041f\u043e\u0441\u043b\u0435 \u0441\u043e\u0442\u043d\u0438 \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0445 \u044d\u0441\u043a\u0438\u0437\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u0438\u0446\u0435\u0439 \u0432 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043e\u0441\u0442\u0430\u043b\u0438\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u0438 \u043a\u043e\u0440\u0430\u0431\u043b\u0438 \u0434\u043b\u044f \u0438\u0433\u0440\u043e\u043a\u0430:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ao\/4y\/jm\/ao4yjmxt3bl3ydqrjajnmgy4ms8.png\"><br \/>  \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0447\u0442\u043e \u043a\u043e\u0440\u0430\u0431\u043b\u0438 \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u043f\u043b\u0430\u043c\u0435\u043d\u0438 \u0432 \u0442\u0430\u0439\u043b\u0430\u0445(\u0437\u0434\u0435\u0441\u044c \u043e\u043d\u043e \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438), \u043e\u043d\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0432\u044b\u0445\u043b\u043e\u043f\u0430 \u043e\u0442 \u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>  \u0412\u0430\u0440\u0438\u0430\u0446\u0438\u044f \u043a\u043e\u0440\u0430\u0431\u043b\u0435\u0439 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u043d\u043e \u043d\u0430\u043f\u043e\u043c\u043d\u044e, \u043c\u0435\u0441\u0442\u0430 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043c\u043d\u043e\u0433\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u0432\u043e\u0442 \u0442\u0440\u0438 \u043a\u043e\u0440\u0430\u0431\u043b\u044f:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/w2\/-v\/o3\/w2-vo3itdzkpoptpywwgjn5ytc8.png\"><\/p>\n<p>  \u041a\u0430\u043a \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435, \u0432 \u0438\u0433\u0440\u0435 \u0435\u0441\u0442\u044c \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0441 \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434\u0430\u043c\u0438, \u043e\u043d \u043d\u0430\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u043e\u0441\u0441\u0430. \u0418\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d \u043e\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u0442\u0430\u043c \u043c\u043d\u043e\u0433\u043e \u0434\u0432\u0438\u0436\u0443\u0449\u0438\u0445\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0438 \u0432\u0441\u0435 \u043e\u043d\u0438 \u0432\u0440\u0430\u0449\u0430\u044e\u0442\u0441\u044f. \u0415\u0449\u0435 \u043a\u043e\u0433\u0434\u0430 \u0438\u0433\u0440\u043e\u043a \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u043f\u043e \u043d\u0438\u043c \u043e\u043d\u0438 \u0447\u0430\u0441\u0442\u0438\u0447\u043d\u043e \u0440\u0430\u0437\u0440\u0443\u0448\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u043e\u0432\u044f\u0441\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0435.  <\/p>\n<blockquote><p>Hint: \u041a\u0440\u0443\u043f\u043d\u044b\u0435 \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434\u044b \u043f\u0440\u0438\u043d\u043e\u0441\u044f\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u0447\u043a\u043e\u0432.  <\/p><\/blockquote>\n<p>  \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u044d\u0442\u043e\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0430\u043d\u0438\u043c\u0430\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e 12 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/yr\/uz\/g3\/yruzg3mwjlg3bv_z2pljhzyql68.png\"><br \/>  \u041e\u043d\u0438 \u0434\u0435\u043b\u044f\u0442\u0441\u044f \u043f\u043e \u0442\u0440\u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (\u0431\u043e\u043b\u044c\u0448\u043e\u0439, \u0441\u0440\u0435\u0434\u043d\u0438\u0439 \u0438 \u043c\u0430\u043b\u044b\u0439) \u0438 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0443\u0433\u043e\u043b \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043d\u0443\u0436\u043d\u043e \u0435\u0449\u0435 4 \u043f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044b\u0445 \u043d\u0430 0, 90, 180 \u0438 270 \u0433\u0440\u0430\u0434\u0443\u0441\u043e\u0432. \u0412 \u0438\u0433\u0440\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043c\u0435\u043d\u044f\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 \u0441 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435\u043c \u0447\u0435\u0440\u0435\u0437 \u0440\u0430\u0432\u043d\u044b\u0439 \u0438\u043d\u0440\u0435\u0432\u0430\u043b \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u0438\u043b\u043b\u044e\u0437\u0438\u044e \u0432\u0440\u0430\u0449\u0435\u043d\u0438\u044f.  <\/p>\n<pre><code class=\"cpp\">void rotateAsteroid(asteroid_t &amp;asteroid) {   if(RN &amp; 1) {     asteroid.sprite.pPic = getAsteroidPic(asteroid);     ++asteroid.angle;   } }  void moveAsteroids(void) {   for(auto &amp;asteroid : asteroids) {     if(asteroid.onUse) {       updateSprite(&amp;asteroid.sprite);       rotateAsteroid(asteroid); ... <\/code><\/pre>\n<p>  \u0421\u0434\u0435\u043b\u0430\u043d\u043e \u044d\u0442\u043e \u0442\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438, \u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0432\u0440\u043e\u0434\u0435 Affine transformation \u0437\u0430\u0439\u043c\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c \u0441\u0430\u043c\u0438 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0438 \u0431\u0443\u0434\u0435\u0442 \u0432\u0435\u0441\u044c\u043c\u0430 \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0439.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041a\u0443\u0441\u043e\u043a \u0430\u0442\u043b\u0430\u0441\u0430 \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e.<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/el\/uf\/0l\/eluf0lkcjsygvumvmosh_yzreig.png\"><br \/>  \u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0430\u0441\u0442\u044c \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f\u043e\u0432 \u0438 \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0438\u0442\u0440\u0430\u0445 \u043f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u0438\u0433\u0440\u044b.  <\/div>\n<\/div>\n<p>  \u041f\u043e\u043c\u0438\u043c\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 \u043c\u0435\u0441\u0442\u0430 \u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0440\u0435\u0442\u0440\u043e-\u044d\u0444\u0444\u0435\u043a\u0442\u0430 \u0438\u0437 \u0448\u0440\u0438\u0444\u0442\u0430 \u0431\u044b\u043b\u0438 \u0432\u044b\u043a\u0438\u043d\u0443\u0442\u044b \u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0433\u043b\u0438\u0444\u044b \u0438 \u0432\u0441\u0435 \u0433\u043b\u0438\u0444\u044b \u0447\u0442\u043e \u0434\u043e 30 \u0438 \u043f\u043e\u0441\u043b\u0435 127 \u0431\u0430\u0439\u0442\u0430 ASCII.  <\/p>\n<blockquote><p>\u0412\u0430\u0436\u043d\u043e!<br \/>  \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e const \u0438 constexpr \u043d\u0430 AVR \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c, \u0437\u0434\u0435\u0441\u044c \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c PROGMEM.<br \/>  \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u044f\u0434\u0440\u043e AVR \u0438\u043c\u0435\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u0435 \u0413\u0430\u0440\u0432\u0430\u0440\u0434\u0441\u043a\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0434\u0430\u043d\u043d\u044b\u043c \u043d\u0443\u0436\u043d\u044b \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043e\u043f\u043a\u043e\u0434\u044b \u0434\u043b\u044f CPU.  <\/p><\/blockquote>\n<p>  <\/p>\n<h3>\u0421\u0436\u0438\u043c\u0430\u044f \u0433\u0430\u043b\u0430\u043a\u0442\u0438\u043a\u0443<\/h3>\n<hr>\n<p> \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u2014 RLE.<\/p>\n<p>  \u0418\u0437\u0443\u0447\u0438\u0432 \u043f\u0430\u043a\u0443\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0438\u0442 \u0432 \u0431\u0430\u0439\u0442\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0435 \u043e\u0442 0x00 \u0434\u043e 0x50 \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043b\u043e\u0436\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u0431\u0438\u0442-\u043c\u0430\u0440\u043a\u0435\u0440 \u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0432\u0442\u043e\u0440\u0430 (0x80), \u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0431\u0430\u0439\u0442\u043e\u043c \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0440\u0438\u044e \u0438\u0437 257(+2 \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e RLE \u0438\u0437 \u0434\u0432\u0443\u0445 \u0431\u0430\u0439\u0442 \u2014 \u0433\u043b\u0443\u043f\u043e) \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0445 \u0431\u0430\u0439\u0442 \u0432\u0441\u0435\u0433\u043e \u0432 \u0434\u0432\u0430.<br \/>  \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430 \u0438 \u0432\u044b\u0432\u043e\u0434 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d:  <\/p>\n<pre><code class=\"cpp\">void drawPico_RLE_P(uint8_t x, uint8_t y, pic_t *pPic) {   uint16_t repeatColor;   uint8_t tmpInd, repeatTimes;   alphaReplaceColorId = getAlphaReplaceColorId();    auto tmpData = getPicSize(pPic, 0);   tftSetAddrWindow(x, y, x+tmpData.u8Data1, y+tmpData.u8Data2);      ++pPic; \/\/ make offset to picture data      while((tmpInd = getPicByte(++pPic)) != PIC_DATA_END) { \/\/ get color index or repeat times     if(tmpInd &amp; RLE_MARK) { \/\/ is it color index?       tmpInd &amp;= DATA_MARK; \/\/ get color index to repeat       repeatTimes = getPicByte(++pPic)+1; \/\/ zero RLE does not exist!     }     ++repeatTimes;          \/\/ get color from colorTable by color index     repeatColor = palette_RAM[(tmpInd == ALPHA_COLOR_ID) ? alphaReplaceColorId : tmpInd];          do {       pushColorFast(repeatColor);     } while(--repeatTimes);   } <\/code><\/pre>\n<p>  \u0413\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u043c \u044d\u043a\u0440\u0430\u043d\u0430 \u0438\u043d\u0430\u0447\u0435 \u0431\u0443\u0434\u0435\u0442 \u043c\u0443\u0441\u043e\u0440, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0433\u0440\u0430\u043d\u0438\u0446 \u0442\u0443\u0442 \u043d\u0435\u0442.<br \/>  \u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0437\u0430 ~39\u043c\u0441 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u043d\u0438\u043c\u0430\u044f 3040 \u0431\u0430\u0439\u0442, \u0432 \u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043a\u0430\u043a \u0431\u0435\u0437 \u0441\u0436\u0430\u0442\u0438\u044f \u043e\u043d\u043e \u0431\u044b \u0437\u0430\u043d\u044f\u043b\u043e 11200 \u0431\u0430\u0439\u0442 \u0438\u043b\u0438 22400 \u0431\u0430\u0439\u0442 \u0431\u0435\u0437 \u0438\u043d\u0434\u0435\u043a\u0441\u0430\u0446\u0438\u0438.<\/p>\n<p>  \u0422\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043e \u0432 2 \u0440\u0430\u0437\u0430):<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ao\/nl\/6n\/aonl6nxjmfjhbsmp0uc4n6h7w0e.png\"><br \/>  \u041d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0438 \u0432\u044b\u0448\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c interlace, \u043d\u043e \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u043e\u043d \u0441\u0433\u043b\u0430\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e, \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u044f \u044d\u0444\u0444\u0435\u043a\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u0439 CRT \u0438 \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u044f \u0441\u0442\u0435\u043f\u0435\u043d\u044c \u0441\u0436\u0430\u0442\u0438\u044f.<\/p>\n<h3>RLE \u043d\u0435 \u043f\u0430\u043d\u0430\u0446\u0435\u044f<\/h3>\n<hr>\n<p> \u041b\u0435\u0447\u0438\u043c\u0441\u044f \u043e\u0442 \u0434\u0435\u0436\u0430\u0432\u044e.<\/p>\n<p>  \u041a\u0430\u043a \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e RLE \u043e\u0442\u043b\u0438\u0447\u043d\u043e \u043a\u043e\u043c\u0431\u0438\u043d\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0441 LZ-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438. \u041d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u043f\u0440\u0438\u0448\u043b\u0430 WiKi \u0441\u043e \u0441\u043f\u0438\u0441\u043a\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u0438. \u0422\u043e\u043b\u0447\u043a\u043e\u043c \u0436\u0435 \u0441\u0442\u0430\u043b\u043e \u0432\u0438\u0434\u0435\u043e \u043e\u0442 \u00abGameHut\u00bb \u043f\u0440\u043e \u0440\u0430\u0437\u0431\u043e\u0440 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0433\u043e <a href=\"https:\/\/www.youtube.com\/watch?v=IehwV2K60r8\">\u0438\u043d\u0442\u0440\u043e \u0432 Sonic 3D Blast.<\/a><br \/>  \u0418\u0437\u0443\u0447\u0438\u0432 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u043e\u0432(LZ77,LZW,LZSS,LZO,RNC \u0438.\u0442.\u0434.) \u043f\u0440\u0438\u0448\u0435\u043b \u043a \u0432\u044b\u0432\u043e\u0434\u0430\u043c, \u0447\u0442\u043e \u0438\u0445 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0438:  <\/p>\n<ul>\n<li> \u0442\u0440\u0435\u0431\u0443\u044e\u0442 \u043c\u043d\u043e\u0433\u043e RAM \u0434\u043b\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 (\u0445\u043e\u0442\u044c 64\u043a\u0431 \u0438 \u0431\u043e\u043b\u044c\u0448\u0435);<\/li>\n<li> \u0433\u0440\u043e\u043c\u043e\u0437\u0434\u043a\u0438 \u0438 \u043c\u0435\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b (\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0435\u0440\u0435\u0432\u044c\u044f \u0425\u0430\u0444\u0444\u043c\u0430\u043d\u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0443\u0431\u0431\u043b\u043e\u043a);<\/li>\n<li> \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0442 \u043d\u0438\u0437\u043a\u043e\u0439 \u0441\u0442\u0435\u043f\u0435\u043d\u044c\u044e \u0441\u0436\u0430\u0442\u0438\u044f \u043f\u0440\u0438 \u043c\u0430\u043b\u043e\u043c \u043e\u043a\u043d\u0435 (\u043e\u0447\u0435\u043d\u044c \u0436\u0435\u0441\u0442\u043a\u0438\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a RAM);<\/li>\n<li> \u0438\u043c\u0435\u044e\u0442 \u043d\u0435\u043e\u0434\u043d\u043e\u0437\u043d\u0430\u0447\u043d\u043e\u0441\u0442\u0438 \u0441 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043b\u0435 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0442\u0449\u0435\u0442\u043d\u044b\u0445 \u0430\u0434\u0430\u043f\u0442\u0430\u0446\u0438\u0439 \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0443\u0436\u0435 \u0438\u043c\u0435\u044e\u0449\u0438\u0439\u0441\u044f \u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a.<br \/>  \u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 LZ-\u043f\u043e\u0434\u043e\u0431\u043d\u044b\u043c\u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430\u043c\u0438 \u0434\u043b\u044f \u0434\u043e\u0441\u0442\u0438\u0436\u0435\u043d\u0438\u044f \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0436\u0430\u0442\u0438\u044f, \u0431\u044b\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d \u0441\u043b\u043e\u0432\u0430\u0440\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043d\u043e \u043d\u0430 \u0431\u0430\u0439\u0442\u043e\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u2014 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0447\u0430\u0441\u0442\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 \u043f\u0430\u0440\u044b \u0431\u0430\u0439\u0442 \u0437\u0430\u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u043d\u0430 \u043e\u0434\u0438\u043d \u0431\u0430\u0439\u0442-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435.<br \/>  \u041d\u043e \u0442\u0443\u0442 \u0435\u0441\u0442\u044c \u043f\u043e\u0434\u0432\u043e\u0445, \u043a\u0430\u043a \u043e\u0442\u043b\u0438\u0447\u0438\u0442\u044c \u0431\u0430\u0439\u0442 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439\u00bb \u043e\u0442 \u00ab\u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u00bb?<br \/>  \u041f\u043e\u0441\u043b\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0441\u0438\u0434\u0435\u043d\u0438\u044f \u0441 \u0431\u0443\u043c\u0430\u0436\u043a\u043e\u0439 \u0438 \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0438\u0433\u0440\u044b \u0441 \u0431\u0438\u0442\u0430\u043c\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u0438\u0435:  <\/p>\n<blockquote>\n<ul>\n<li> \u00ab\u043c\u0430\u0440\u043a\u0435\u0440 \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u00bb \u0435\u0441\u0442\u044c \u043c\u0430\u0440\u043a\u0435\u0440 RLE(0x80) + \u0431\u0430\u0439\u0442 \u0434\u0430\u043d\u043d\u044b\u0445 (0x50) + \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 \u0432 \u0441\u043b\u043e\u0432\u0430\u0440\u0435;<\/li>\n<li> \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u0431\u0430\u0439\u0442 \u00ab\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u0435\u043d\u0438\u0439\u00bb \u0434\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u00ab\u043c\u0430\u0440\u043a\u0435\u0440 \u0441\u043b\u043e\u0432\u0430\u0440\u044f\u00bb \u2014 1 (0xCF);<\/li>\n<li> \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 0xff (\u043e\u043d\u043e \u0434\u043b\u044f \u043c\u0430\u0440\u043a\u0435\u0440\u0430 \u043a\u043e\u043d\u0446\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f);<\/li>\n<\/ul>\n<p>  <\/p><\/blockquote>\n<p>  \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0432 \u0432\u0441\u0435 \u044d\u0442\u043e \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043b\u043e\u0432\u0430\u0440\u044f: \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 46 \u043f\u0430\u0440 \u0431\u0430\u0439\u0442 \u0438 \u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 RLE \u0434\u043e 209 \u0431\u0430\u0439\u0442. \u041e\u0447\u0435\u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0442\u0430\u043a \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c, \u043d\u043e \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 \u043e\u043d\u0438 \u043d\u0435 \u0441\u0442\u0430\u043d\u0443\u0442.<br \/>  \u0412 \u043e\u0431\u043e\u0438\u0445 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430\u0445 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439:  <\/p>\n<ul>\n<li> \u043f\u043e 1 \u0431\u0430\u0439\u0442\u0443 \u043d\u0430 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443;<\/li>\n<li> 1 \u0431\u0430\u0439\u0442 \u043d\u0430 \u0440\u0430\u0437\u043c\u0435\u0440 \u0441\u043b\u043e\u0432\u0430\u0440\u044f, \u043e\u043d \u0436\u0435 \u043c\u0430\u0440\u043a\u0435\u0440-\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430\u0447\u0430\u043b\u0430 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445;<\/li>\n<li> \u043e\u0442 0 \u0434\u043e 92 \u0431\u0430\u0439\u0442 \u0441\u043b\u043e\u0432\u0430\u0440\u044f;<\/li>\n<li> \u043e\u0442 1 \u0434\u043e N \u0431\u0430\u0439\u0442 \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430 D (pickoPacker) \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u0432 \u043f\u0430\u043f\u043a\u0443 \u0441 \u0438\u043d\u0434\u0435\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 *.png \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430(\u0438\u043b\u0438 cmd). \u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u0430 \u043f\u043e\u043c\u043e\u0449\u044c \u0442\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441 \u043a\u043b\u044e\u0447\u043e\u043c \u00ab-h\u00bb \u0438\u043b\u0438 \u00ab&#8212;help\u00bb.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c *.h \u0444\u0430\u0439\u043b\u044b, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0443\u0434\u043e\u0431\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432 \u043d\u0443\u0436\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435 (\u043f\u043e\u044d\u0442\u043e\u043c\u0443 include \u0437\u0430\u0449\u0438\u0442\u044b \u043d\u0435\u0442).<\/p>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u043e\u0439 \u0438\u0434\u0435\u0442 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u044d\u043a\u0440\u0430\u043d\u0430, \u0441\u043b\u043e\u0432\u0430\u0440\u044f \u0438 \u0447\u0442\u0435\u043d\u0438\u0435 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445:  <\/p>\n<pre><code class=\"cpp\">void drawPico_DIC_P(uint8_t x, uint8_t y, pic_t *pPic) {   auto tmpData = getPicSize(pPic, 0);   tftSetAddrWindow(x, y, x+tmpData.u8Data1, y+tmpData.u8Data2);      uint8_t tmpByte, unfoldPos, dictMarker;   alphaReplaceColorId = getAlphaReplaceColorId();    auto pDict = &amp;pPic[3];         \/\/ save dictionary pointer   pPic += getPicByte(&amp;pPic[2]);  \/\/ make offset to picture data      do {     unfoldPos = dictMarker = 0;          do {       if((tmpByte = getPicByte(++pPic)) != PIC_DATA_END) {         if(tmpByte &lt; DICT_MARK) {           buf_packed[unfoldPos] = tmpByte;         } else {           dictMarker = 1;           setPicWData(&amp;buf_packed[unfoldPos]) = getPicWData(pDict, tmpByte);           ++unfoldPos;         }         ++unfoldPos;       } else {         break;       }     } while((unfoldPos &lt; MAX_UNFOLD_SIZE) \/\/&amp;&amp; (unfoldPos)             &amp;&amp; ((tmpByte &gt; DATA_MARK) || (tmpByte &gt; MAX_DATA_LENGTH)));          if(unfoldPos) {       buf_packed[unfoldPos] = PIC_DATA_END; \/\/ mark end of chunk       printBuf_RLE( dictMarker ? unpackBuf_DIC(pDict) : &amp;buf_packed[0] ); \/\/ V2V3 decoder     }   } while(unfoldPos); } <\/code><\/pre>\n<p>  \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u0434\u0430\u043d\u043d\u044b\u0445 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u043f\u043e \u0441\u043b\u043e\u0432\u0430\u0440\u044e, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c:  <\/p>\n<pre><code class=\"cpp\">inline uint8_t findPackedMark(uint8_t *ptr) {   do {     if(*ptr &gt;= DICT_MARK) {        return 1;     }   } while(*(++ptr) != PIC_DATA_END);      return 0; }  inline uint8_t *unpackBuf_DIC(const uint8_t *pDict) {   bool swap = false;   bool dictMarker = true;   auto getBufferPtr = [&amp;](uint8_t a[], uint8_t b[]) {     return swap ? &amp;a[0] : &amp;b[0];   };    auto ptrP = getBufferPtr(buf_unpacked, buf_packed);   auto ptrU = getBufferPtr(buf_packed, buf_unpacked);    while(dictMarker) {     if(*ptrP &gt;= DICT_MARK) {       setPicWData(ptrU) = getPicWData(pDict, *ptrP);       ++ptrU;     } else {       *ptrU = *ptrP;     }     ++ptrU;     ++ptrP;      if(*ptrP == PIC_DATA_END) {       *ptrU = *ptrP; \/\/ mark end of chunk       swap = !swap;       ptrP = getBufferPtr(buf_unpacked, buf_packed);       ptrU = getBufferPtr(buf_packed, buf_unpacked);        dictMarker = findPackedMark(ptrP);     }   }    return getBufferPtr(buf_unpacked, buf_packed); } <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0437 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0443\u0436\u0435 \u0437\u043d\u0430\u043a\u043e\u043c\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c RLE \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u043c \u043d\u0430 \u044d\u043a\u0440\u0430\u043d:  <\/p>\n<pre><code class=\"cpp\">inline void printBuf_RLE(uint8_t *pData) {   uint16_t repeatColor;   uint8_t repeatTimes, tmpByte;      while((tmpByte = *pData) != PIC_DATA_END) { \/\/ get color index or repeat times     if(tmpByte &amp; RLE_MARK) { \/\/ is it RLE byte?       tmpByte &amp;= DATA_MARK; \/\/ get color index to repeat       repeatTimes = *(++pData)+1; \/\/ zero RLE does not exist!     }     ++repeatTimes;     ++pData;          \/\/ get color from colorTable by color index     repeatColor = palette_RAM[(tmpByte == ALPHA_COLOR_ID) ? alphaReplaceColorId : tmpByte];          do {       pushColorFast(repeatColor);     } while(--repeatTimes);   } } <\/code><\/pre>\n<p>  \u0417\u0430\u043c\u0435\u043d\u0430 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u043d\u0430 \u0443\u0434\u0438\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u043b\u0438\u044f\u043b\u0430 \u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 \u0438 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 ~47\u043c\u0441. \u042d\u0442\u043e \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 8\u043c\u0441 \u0434\u043e\u043b\u044c\u0448\u0435, \u043d\u043e \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 \u0432\u0441\u0435\u0433\u043e 1650 \u0431\u0430\u0439\u0442!<\/p>\n<h3>\u0414\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u0442\u0430\u043a\u0442\u0430<\/h3>\n<hr>\n<p> \u041f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u044b\u0441\u0442\u0440\u0435\u0435!<\/p>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0433\u043e SPI \u044f\u0434\u0440\u043e AVR \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u043e\u0440\u0435 \u0433\u043e\u043b\u043e\u0432\u043d\u043e\u0439 \u0431\u043e\u043b\u0438 \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438.<br \/>  \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u0430\u0432\u043d\u043e \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e, \u0447\u0442\u043e SPI \u043d\u0430 AVR \u043f\u043e\u043c\u0438\u043c\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438 F_CPU\/2, \u0442\u0430\u043a \u0438 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 1 \u0431\u0430\u0439\u0442 (\u043d\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0442\u044c 2 \u0431\u0430\u0439\u0442\u0430 \u0441\u0440\u0430\u0437\u0443).<br \/>  \u0411\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0441\u044c \u043a\u043e\u0434 SPI \u043d\u0430 AVR \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u043e \u0442\u0430\u043a\u043e\u0439 \u0441\u0445\u0435\u043c\u0435:  <\/p>\n<ul>\n<li> \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 SPDR;<\/li>\n<li> \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0432 \u0446\u0438\u043a\u043b\u0435 \u0431\u0438\u0442 SPIF \u0432 SPSR.<\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u043f\u043e\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445, \u043a\u0430\u043a \u044d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u043d\u0430 STM32, \u0442\u0443\u0442 \u0438 \u043d\u0435 \u043f\u0430\u0445\u043d\u0435\u0442. \u041d\u043e, \u0434\u0430\u0436\u0435 \u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043a\u043e\u0440\u0438\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043e\u0431\u043e\u0438\u0445 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u043e\u0432 \u043d\u0430 ~3\u043c\u0441!<\/p>\n<p>  \u041e\u0442\u043a\u0440\u044b\u0432 \u0434\u0430\u0442\u0430\u0448\u0438\u0442 \u0438 \u0437\u0430\u0433\u043b\u044f\u043d\u0443\u0432 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b \u00abInstruction set clocks\u00bb \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0437\u0430\u0442\u0440\u0430\u0442\u044b CPU \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0431\u0430\u0439\u0442\u0430 \u043f\u043e SPI:  <\/p>\n<ul>\n<li> 1 \u0442\u0430\u043a\u0442 \u043d\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 \u043d\u043e\u0432\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438;<\/li>\n<li> 2 \u0442\u0430\u043a\u0442\u0430 \u043d\u0430 \u0431\u0438\u0442 (\u0438\u043b\u0438 16 \u0442\u0430\u043a\u0442\u043e\u0432 \u043d\u0430 \u0431\u0430\u0439\u0442);<\/li>\n<li> 1 \u0442\u0430\u043a\u0442 \u043d\u0430 \u043c\u0430\u0433\u0438\u044e \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438 (\u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u043e \u00abNOP\u00bb);<\/li>\n<li> 1 \u0442\u0430\u043a\u0442 \u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u0433\u043e \u0431\u0438\u0442\u0430 \u0432 SPSR (\u0438\u043b\u0438 2 \u0442\u0430\u043a\u0442\u0430 \u043d\u0430 \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0438);<\/li>\n<\/ul>\n<p>  \u0418\u0442\u043e\u0433\u043e \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f (\u0434\u0432\u0443\u0445 \u0431\u0430\u0439\u0442) \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0442\u0440\u0430\u0442\u0438\u0442\u044c 38 \u0442\u0430\u043a\u0442\u043e\u0432 \u0438\u043b\u0438 ~425600 \u0442\u0430\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0433\u043e \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f (11200 \u0431\u0430\u0439\u0442).<br \/>  \u0417\u043d\u0430\u044f \u0447\u0442\u043e F_CPU == 16\u041c\u0413\u0446 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c 0,0000000625 \u043d\u0430\u043d\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u0438\u043b\u0438 0,0625 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434 \u043d\u0430 \u0442\u0430\u043a\u0442, \u043f\u0435\u0440\u0435\u043c\u043d\u043e\u0436\u0438\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c ~26 \u043c\u0438\u043b\u043b\u0438\u0441\u0435\u043a\u0443\u043d\u0434. \u0412\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041e\u0442\u043a\u0443\u0434\u0430 \u0442\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u0435\u0435 \u044f \u043f\u0438\u0441\u0430\u043b, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438 39\u043c\u0441 \u0438 47\u043c\u0441\u00bb? \u0412\u0441\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u043b\u043e\u0433\u0438\u043a\u0430 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a\u0430 + \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439.<\/p>\n<p>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f\u043c\u0438:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/du\/ks\/p1\/duksp1nkfluio5sgfwyimgo9aik.png\"><br \/>  \u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/v7\/hp\/xq\/v7hpxqzhvsazrct5sbq7dkywq1w.png\"><br \/>  \u041f\u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0430\u043c \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u0435\u0436\u0434\u0443 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0433\u043e \u043e\u043a\u043d\u0430 \u0432 VRAM \u044d\u043a\u0440\u0430\u043d\u0430 \u0438 \u043d\u0430\u0447\u0430\u043b\u043e\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u0432\u0435\u0440\u0441\u0438\u0438 \u0431\u0435\u0437 \u043f\u0440\u0435\u0440\u0432\u044b\u043d\u0438\u0439 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438 \u0440\u0430\u0437\u0440\u044b\u0432\u043e\u0432 \u043c\u0435\u0436\u0434\u0443 \u0431\u0430\u0439\u0442\u0430\u043c\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0438 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435\u0442(\u0433\u0440\u0430\u0444\u0438\u043a \u0440\u0430\u0432\u043d\u043e\u043c\u0435\u0440\u043d\u044b\u0439).<br \/>  \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439 \u043d\u0435\u043b\u044c\u0437\u044f, \u0438\u043d\u0430\u0447\u0435 \u0441\u043b\u043e\u043c\u0430\u044e\u0442\u0441\u044f \u0437\u0432\u0443\u043a \u0438 \u044f\u0434\u0440\u043e \u0432\u0441\u0435\u0439 \u0438\u0433\u0440\u044b (\u043e\u0431 \u044d\u0442\u043e\u043c \u043f\u043e\u0437\u0436\u0435).<\/p>\n<p>  \u0412\u044b\u0448\u0435 \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e \u043d\u0435\u043a\u0438\u0439 \u00ab\u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 NOP\u00bb \u0434\u043b\u044f \u0442\u0430\u043a\u0442\u043e\u0432\u043e\u0439 \u043b\u0438\u043d\u0438\u0438. \u0414\u0435\u043b\u043e \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0434\u043b\u044f \u0441\u0442\u0430\u0431\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 CLK \u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0444\u043b\u0430\u0433\u0430 SPIF \u043d\u0443\u0436\u0435\u043d \u0440\u043e\u0432\u043d\u043e 1 \u0442\u0430\u043a\u0442 \u0438 \u043a \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0447\u0442\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0433\u043e \u0444\u043b\u0430\u0433\u0430 \u043e\u043d \u0443\u0436\u0435 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u044f \u0432 2 \u0442\u0430\u043a\u0442\u0430 \u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00abBREQ\u00bb.<br \/>  \u0412\u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440 \u0431\u0435\u0437 NOP:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/vp\/ia\/w5\/vpiaw5asga4dqawu3byh03k9gii.png\"><br \/>  \u0438 \u0441 \u043d\u0438\u043c:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jg\/-q\/4b\/jg-q4b4ot1sy445kc5rvoyq-ixe.png\"><\/p>\n<p>  \u0420\u0430\u0437\u043d\u0438\u0446\u0430 \u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0438\u0447\u0442\u043e\u0436\u043d\u043e\u0439, \u0432\u0441\u0435\u0433\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u043a\u0443\u043d\u0434, \u043d\u043e \u0435\u0441\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043c\u0430\u0441\u0448\u0442\u0430\u0431 \u043f\u043e\u0431\u043e\u043b\u044c\u0448\u0435:<br \/>  \u0411\u0435\u0437 NOP \u043a\u0440\u0443\u043f\u043d\u043e:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/nf\/ds\/gi\/nfdsgii8xkar_f6jo5fihrpx8ei.png\"><br \/>  \u0438 \u0441 \u043d\u0438\u043c \u0442\u043e\u0436\u0435 \u043a\u0440\u0443\u043f\u043d\u043e:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/8z\/d9\/e9\/8zd9e9l79lnhj9qshrykzxxptmw.png\"><br \/>   \u0442\u043e \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043a\u0443\u0434\u0430 \u0437\u0430\u043c\u0435\u0442\u043d\u0435\u0435, \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u044f ~4,3\u043c\u0441.<\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0433\u0440\u044f\u0437\u043d\u044b\u0439 \u0442\u0440\u044e\u043a:   <\/p>\n<blockquote><p>\u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u043c\u0435\u0441\u0442\u0430\u043c\u0438 \u043f\u043e\u0440\u044f\u0434\u043e\u043a \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438 \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 \u0438 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0436\u0434\u0430\u0442\u044c \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0432\u0442\u043e\u0440\u043e\u043c \u0431\u0430\u0439\u0442\u0435 \u0444\u043b\u0430\u0433\u0430 SPIF, \u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0431\u0430\u0439\u0442\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044f.  <\/p><\/blockquote>\n<p>  \u041f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u0437\u043d\u0430\u043d\u0438\u044f \u0438 \u0440\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u00abpushColorFast(repeatColor);\u00bb:  <\/p>\n<pre><code class=\"cpp\">#define SPDR_TX_WAIT(a)  asm volatile(a); while((SPSR &amp; (1&lt;&lt;SPIF)) == 0);  typedef union {   uint16_t val;   struct {     uint8_t lsb;     uint8_t msb;   }; } SPDR_t;  ...         do { #ifdef __AVR__       SPDR_t in = {.val = repeatColor};       SPDR_TX_WAIT(\"\");       SPDR = in.msb;              SPDR_TX_WAIT(\"nop\");       SPDR = in.lsb; #else       pushColorFast(repeatColor); #endif     } while(--repeatTimes);   } #ifdef __AVR__    SPDR_TX_WAIT(\"\");  #endif } <\/code><\/pre>\n<p>  \u0414\u0430\u0436\u0435 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u043e\u0442 \u0442\u0430\u0439\u043c\u0435\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u0440\u044e\u043a\u0430 \u0432\u044b\u0448\u0435 \u0434\u0430\u0435\u0442 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043f\u043e\u0447\u0442\u0438 \u043d\u0430 6\u043c\u0441:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/ba\/ah\/hm\/baahhmqnnvjznm1ssuihfi-ryhu.png\"><\/p>\n<p>  \u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e\u0435 \u0437\u043d\u0430\u043d\u0438\u0435 \u0436\u0435\u043b\u0435\u0437\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u043d\u0435\u0433\u043e \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435:<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/xo\/fj\/wv\/xofjwvtbu_w_4leeunorug-axri.gif\"><\/p>\n<h3>\u041a\u043e\u043b\u0438\u0437\u0435\u0439 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439<\/h3>\n<hr>\n<p> \u0411\u0438\u0442\u0432\u0430 \u043a\u043e\u0440\u043e\u0431\u043e\u043a.<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0441\u0435 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432(\u043a\u043e\u0440\u0430\u0431\u043b\u0438, \u0441\u043d\u0430\u0440\u044f\u0434\u044b, \u0430\u0441\u0442\u0435\u0440\u043e\u0438\u0434\u044b, \u0431\u043e\u043d\u0443\u0441\u044b) \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b (\u0441\u043f\u0440\u0430\u0439\u0442\u044b) \u0441 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:  <\/p>\n<ul>\n<li> \u0442\u0435\u043a\u0443\u0449\u0438\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b X,Y;<\/li>\n<li> \u043d\u043e\u0432\u044b\u0435 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b X,Y;<\/li>\n<li> \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435.<\/li>\n<\/ul>\n<p>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u0432\u044b\u0441\u043e\u0442\u0443, \u0442\u043e \u043d\u0435\u0442 \u043d\u0443\u0436\u0434\u044b \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0433\u043e, \u0442\u0430\u043a\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043b\u043e\u0433\u0438\u043a\u0443 \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u0430\u0441\u043f\u0435\u043a\u0442\u0430\u0445.<\/p>\n<p>  \u0421\u0430\u043c \u043e\u0431\u0441\u0447\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d \u0434\u043e \u0431\u0430\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u2014 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432. \u0425\u043e\u0442\u044c \u043e\u043d\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u043e\u0447\u043d\u043e\u0435 \u0438 \u043d\u0435 \u0440\u0430\u0441\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438 \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u043d\u043e \u044d\u0442\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e.<br \/>  \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u043f\u043e \u043e\u0441\u044f\u043c X \u0438 Y. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u044f \u043f\u043e \u043e\u0441\u0438 X \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0438.  <\/p>\n<blockquote><p>\u0421\u043f\u0435\u0440\u0432\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0430\u044f \u0441\u0442\u043e\u0440\u043e\u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u0441 \u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043e\u0439 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430 \u043d\u0430 \u043f\u0440\u0435\u0434\u043c\u0435\u0442 \u043e\u0431\u0449\u0435\u0439 \u0447\u0430\u0441\u0442\u0438 \u043e\u0441\u0438 X. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0443\u0441\u043f\u0435\u0445\u0430 \u0438\u0434\u0435\u0442 \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0434\u043b\u044f \u043b\u0435\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0438 \u043f\u0440\u0430\u0432\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u0430.<br \/>  \u041f\u043e\u0441\u043b\u0435 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043f\u0435\u0440\u0435\u0441\u0435\u0447\u0435\u043d\u0438\u0439 \u043f\u043e \u043e\u0441\u0438 X, \u0438\u0434\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u043e \u043e\u0441\u0438 Y \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043b\u044f \u0432\u0435\u0440\u0445\u043d\u0435\u0439 \u0438 \u043d\u0438\u0436\u043d\u0435\u0439 \u0441\u0442\u043e\u0440\u043e\u043d \u043f\u0440\u044f\u043c\u043e\u0443\u0433\u043e\u043b\u044c\u043d\u0438\u043a\u043e\u0432.  <\/p><\/blockquote>\n<p>  \u041d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432\u044b\u0448\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0449\u0435 \u0447\u0435\u043c \u043a\u0430\u0436\u0435\u0442\u0441\u044f:  <\/p>\n<pre><code class=\"cpp\">bool checkSpriteCollision(sprite_t *pSprOne, sprite_t *pSprTwo) {   auto tmpDataOne = getPicSize(pSprOne-&gt;pPic, 0);   auto tmpDataTwo = getPicSize(pSprTwo-&gt;pPic, 0);    \/* ----------- Check X position ----------- *\/   uint8_t objOnePosEndX = (pSprOne-&gt;pos.Old.x + tmpDataOne.u8Data1);    if(objOnePosEndX &gt;= pSprTwo-&gt;pos.Old.x) {     uint8_t objTwoPosEndX = (pSprTwo-&gt;pos.Old.x + tmpDataTwo.u8Data1);     if(pSprOne-&gt;pos.Old.x &gt;= objTwoPosEndX) {       return false; \/\/ nope, different X positions     }     \/\/ ok, objects on same X lines; Go next...   } else {     return false; \/\/ nope, absolutelly different X positions   }    \/* ---------------------------------------- *\/   \/* ----------- Check Y position ----------- *\/   uint8_t objOnePosEndY = (pSprOne-&gt;pos.Old.y + tmpDataOne.u8Data2);      if(objOnePosEndY &gt;= pSprTwo-&gt;pos.Old.y) {     uint8_t objTwoPosEndY = (pSprTwo-&gt;pos.Old.y + tmpDataTwo.u8Data2);     if(pSprOne-&gt;pos.Old.y &lt;= objTwoPosEndY) {       \/\/ ok, objects on same Y lines; Go next...       \/\/ yep, if we are here       \/\/ then, part of one object collide wthith another object       return true;     } else {       return false; \/\/ nope, different Y positions     }   } else {     return false; \/\/ nope, absolutelly different Y positions   } } <\/code><\/pre>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e \u0432 \u0438\u0433\u0440\u0443:  <\/p>\n<pre><code class=\"cpp\">void checkInVadersCollision(void) {   decltype(aliens[0].weapon.ray) gopher; \/\/ Do you see it? No? But it's exist!    for(auto &amp;alien : aliens) {     if(alien.alive) {       if(checkSpriteCollision(&amp;ship.sprite, &amp;alien.sprite)) {         gopher.sprite.pos.Old = alien.sprite.pos.Old;         rocketEpxlosion(&amp;gopher); \/\/ now make gopher to explode \\(^_^)\/         removeSprite(&amp;alien.sprite);          alien.alive = false;          score -= SCORE_PENALTY;         if(score &lt; 0) score = 0;       }     }   } } <\/code><\/pre>\n<h3>\u041a\u0440\u0438\u0432\u0430\u044f \u0411\u0435\u0437\u044c\u0435<\/h3>\n<hr>\n<p> \u041a\u043e\u0441\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u043b\u044c\u0441\u044b.<\/p>\n<p>  \u041a\u0430\u043a \u0432 \u043b\u044e\u0431\u043e\u0439 \u0434\u0440\u0443\u0433\u043e\u0439 \u0438\u0433\u0440\u0435 \u0441 \u044d\u0442\u0438\u043c \u0436\u0430\u043d\u0440\u043e\u043c \u043a\u043e\u0440\u0430\u0431\u043b\u0438 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u0438\u043a\u0430 \u043e\u0431\u044f\u0437\u0430\u043d\u044b \u0434\u0432\u0438\u0433\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043a\u0440\u0438\u0432\u044b\u043c.<br \/>  \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0438\u0447\u043d\u044b\u0435 \u043a\u0440\u0438\u0432\u044b\u0435 \u043a\u0430\u043a \u0441\u0430\u043c\u044b\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0434\u043b\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 \u0438 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438. \u0414\u043b\u044f \u043d\u0438\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0442\u0440\u0435\u0445 \u0442\u043e\u0447\u0435\u043a: \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439(P0), \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439(P2) \u0438 \u043c\u043d\u0438\u043c\u043e\u0439(P1). \u041f\u0435\u0440\u0432\u044b\u0435 \u0434\u0432\u0435 \u0437\u0430\u0434\u0430\u044e\u0442 \u043d\u0430\u0447\u0430\u043b\u043e \u0438 \u043a\u043e\u043d\u0435\u0446 \u043b\u0438\u043d\u0438\u0438, \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044f\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432\u0438\u0434 \u0438\u0441\u043a\u0440\u0438\u0432\u043b\u0435\u043d\u0438\u044f. <br \/>  <a href=\"https:\/\/habr.com\/post\/344814\/\">\u041e\u0442\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e \u043a\u0440\u0438\u0432\u044b\u043c.<\/a><br \/>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043a\u0440\u0438\u0432\u0430\u044f \u0411\u0435\u0437\u044c\u0435, \u0442\u043e \u0435\u0439 \u0442\u0430\u043a \u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u2014 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0442\u043e\u0447\u0435\u043a \u043c\u0435\u0436\u0434\u0443 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0439 \u0438 \u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0430\u043c\u0438.<\/p>\n<p>  \u0418\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0432\u043e\u0442 \u0442\u0430\u043a\u0443\u044e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443:  <\/p>\n<pre><code class=\"cpp\">typedef struct {  \/\/ 7 bytes   position_t P0;   position_t P1;   position_t P2;   uint8_t totalSteps; } bezier_t; <\/code><\/pre>\n<p> \u0412 \u043d\u0435\u0439 position_t \u044d\u0442\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0438\u0437 \u0434\u0432\u0443\u0445 \u0431\u0430\u0439\u0442 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 X \u0438 Y.<br \/>  \u041d\u0430\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 \u0444\u043e\u0440\u043c\u0443\u043b\u043e\u0439 (thx Wiki):<br \/>  B = ((1.0 \u2014 t)^2) P0 + 2t (1.0 \u2014 t) P1 + (t^2) P2,<br \/>  t [&gt;= 0 &amp;&amp; &lt;= 1]<\/p>\n<p>  \u0414\u043e\u043b\u0433\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0435\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0431\u044b\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u0430 \u0432 \u043b\u043e\u0431 \u0431\u0435\u0437 fixed point math:  <\/p>\n<pre><code class=\"cpp\">...   float t = ((float)pItemLine-&gt;step)\/((float)pLine-&gt;totalSteps);   pPos-&gt;x = (1.0 - t)*(1.0 - t)*pLine-&gt;P0.x + 2*t*(1.0 - t)*pLine-&gt;P1.x + t*t*pLine-&gt;P2.x;   pPos-&gt;y = (1.0 - t)*(1.0 - t)*pLine-&gt;P0.y + 2*t*(1.0 - t)*pLine-&gt;P1.y + t*t*pLine-&gt;P2.y; ... <\/code><\/pre>\n<p>  \u0421\u0430\u043c\u043e \u0441\u043e\u0431\u043e\u0439 \u0442\u0430\u043a \u044d\u0442\u043e \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043d\u0435\u043b\u044c\u0437\u044f. \u0412\u0435\u0434\u044c \u0438\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u0442 float \u043c\u043e\u0433\u043b\u043e \u0431\u044b \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u0430\u0442\u044c \u0443\u043b\u0443\u0447\u0448\u0435\u043d\u0438\u0435 \u043f\u043e \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u0438, \u043d\u043e \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c ROM, \u0442\u0430\u043a \u0447\u0442\u043e \u0431\u044b\u043b\u0438 \u043d\u0430\u0439\u0434\u0435\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438:  <\/p>\n<ul>\n<li> avrfix;<\/li>\n<li> stdfix;<\/li>\n<li> libfixmath;<\/li>\n<li> fixedptc.<\/li>\n<\/ul>\n<p>  \u041f\u0435\u0440\u0432\u0430\u044f \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0442\u0435\u043c\u043d\u043e\u0439 \u043b\u043e\u0448\u0430\u0434\u043a\u043e\u0439, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0438 \u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u0434\u0430\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c \u043d\u0435 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0433\u043e \u043a\u0430\u043d\u0434\u0438\u0434\u0430\u0442\u0430 \u0438\u0437 \u043a\u043e\u043c\u043f\u043b\u0435\u043a\u0442\u0430 GCC \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0442\u0430\u043a \u0436\u0435 \u043d\u0435 \u0432\u044b\u0448\u043b\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 avr-gcc \u043d\u0435 \u043f\u0440\u043e\u043f\u0430\u0442\u0447\u0435\u043d \u0438 \u0442\u0438\u043f \u00abshort _Accum\u00bb \u043e\u0441\u0442\u0430\u043b\u0441\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d.<\/p>\n<p>  \u0422\u0440\u0435\u0442\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u043c\u0430\u0442. \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u0438\u043c\u0435\u0435\u0442 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u0431\u0438\u0442\u043e\u0432\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u0431\u0438\u0442\u0430\u0445 \u043f\u043e\u0434 \u0444\u043e\u0440\u043c\u0430\u0442 Q16.16, \u0447\u0442\u043e \u043d\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 Q \u0438 I.<\/p>\n<p>  \u041f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0443\u043f\u0440\u043e\u0449\u0435\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u043e\u0442 \u00abfixedmath\u00bb, \u043d\u043e \u0433\u043b\u0430\u0432\u043d\u044b\u043c \u0434\u043e\u0441\u0442\u043e\u0438\u043d\u0441\u0442\u0432\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e 32\u0431\u0438\u0442 \u0441 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u043c Q24.8, \u043d\u043e \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f\u043c\u0438 Q \u0438 I.<\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u0440\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445:  <\/p>\n<table>\n<tr>\n<th>\u0422\u0438\u043f<\/th>\n<th>I.Q<\/th>\n<th>\u0414\u043e\u043f \u0444\u043b\u0430\u0433\u0438<\/th>\n<th>ROM \u0431\u0430\u0439\u0442<\/th>\n<th>T\u043c\u0441*<\/th>\n<\/tr>\n<tr>\n<td>float<\/td>\n<td>&#8212;<\/td>\n<td>&#8212;<\/td>\n<td>4236<\/td>\n<td>35<\/td>\n<\/tr>\n<tr>\n<td>fixedmath<\/td>\n<td>16.16<\/td>\n<td>&#8212;<\/td>\n<td>4796<\/td>\n<td>119<\/td>\n<\/tr>\n<tr>\n<td>fixedmath<\/td>\n<td>16.16<\/td>\n<td>FIXMATH_NO_OVERFLOW<\/td>\n<td>4664<\/td>\n<td>89<\/td>\n<\/tr>\n<tr>\n<td>fixedmath<\/td>\n<td>16.16<\/td>\n<td>FIXMATH_OPTIMIZE_8BIT<\/td>\n<td>5036<\/td>\n<td>92<\/td>\n<\/tr>\n<tr>\n<td>fixedmath<\/td>\n<td>16.16<\/td>\n<td>_NO_OVERFLOW + _8BIT<\/td>\n<td>4916<\/td>\n<td>89<\/td>\n<\/tr>\n<tr>\n<td>fixedptc<\/td>\n<td>24.8<\/td>\n<td>FIXEDPT_BITS 32<\/td>\n<td>4420<\/td>\n<td>64<\/td>\n<\/tr>\n<tr>\n<td>fixedptc<\/td>\n<td>9.7<\/td>\n<td>FIXEDPT_BITS 16<\/td>\n<td>3490<\/td>\n<td>31<\/td>\n<\/tr>\n<\/table>\n<p>* \u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043d\u0430 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0435: \u00ab195,175,145,110,170,70,170\u00bb \u0438 \u043a\u043b\u044e\u0447\u043e\u043c \u00ab-Os\u00bb.<\/p>\n<p>  \u0418\u0437 \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043e\u0431\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0437\u0430\u043d\u044f\u043b\u0438 \u0431\u043e\u043b\u044c\u0448\u0435 ROM \u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438 \u0441\u0435\u0431\u044f \u0445\u0443\u0436\u0435 \u0447\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043e\u0442 GCC \u043f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 float.<br \/>  \u0422\u0430\u043a \u0436\u0435 \u0432\u0438\u0434\u043d\u043e, \u0447\u0442\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043f\u043e\u0434 \u0444\u043e\u0440\u043c\u0430\u0442 Q9.7 \u0438 \u0443\u043c\u0435\u043d\u044c\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u043e 16\u0431\u0438\u0442 \u0434\u0430\u043b\u043e \u0443\u0441\u043a\u043e\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 4\u043c\u0441 \u0438 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 ROM \u043d\u0430 ~50 \u0431\u0430\u0439\u0442.<\/p>\n<p>  \u041e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c \u0441\u0442\u0430\u043b\u043e \u0441\u043d\u0438\u0436\u0435\u043d\u0438\u0435 \u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438 \u0438 \u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u043e\u0448\u0438\u0431\u043e\u043a: <br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sz\/v0\/yt\/szv0ytpsb0ogl5hkp39blbggvzw.png\"><br \/>  \u0447\u0442\u043e \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e.<\/p>\n<h3>\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u044b<\/h3>\n<hr>\n<p> \u0420\u0430\u0431\u043e\u0442\u0430 \u0432\u043e \u0432\u0442\u043e\u0440\u043d\u0438\u043a \u0438 \u0447\u0435\u0442\u0432\u0435\u0440\u0433 \u0432\u0441\u0435\u0433\u043e \u043d\u0430 \u0447\u0430\u0441.<\/p>\n<p>  \u0412 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u0432\u0441\u0435 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u044f\u0442\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u0430\u0434\u0440, \u0447\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u043e\u043f\u0440\u0430\u0432\u0434\u0430\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043a\u0430\u0434\u0440\u0435 \u043c\u043e\u0436\u0435\u0442 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442\u044c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0430 \u043e\u0431\u0441\u0447\u0435\u0442 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0438 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0445\u0438\u0442\u0440\u0438\u0442\u044c \u0441 \u0447\u0435\u0440\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435\u043c, \u043f\u043e\u0434\u0441\u0447\u0435\u0442\u043e\u043c \u043a\u0430\u0434\u0440\u043e\u0432 \u0438\u043b\u0438 \u0438\u0445 \u043f\u0440\u043e\u043f\u0443\u0441\u043a\u043e\u043c. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u043f\u043e\u0448\u0435\u043b \u0434\u0430\u043b\u044c\u0448\u0435 \u2014 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u043e\u0442 \u043a\u0430\u0434\u0440\u043e\u0432\u043e\u0439 \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0438.<\/p>\n<p>  \u0420\u0430\u0437\u0431\u0438\u0432 \u0432\u0441\u0435 \u043d\u0430 \u043c\u0435\u043b\u043a\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0431\u0443\u0434\u044c \u0442\u043e: \u043e\u0431\u0441\u0447\u0435\u0442 \u043a\u043e\u043b\u043b\u0438\u0437\u0438\u0439, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0437\u0432\u0443\u043a\u0430, \u043a\u043d\u043e\u043f\u043e\u043a \u0438 \u0432\u044b\u0432\u043e\u0434 \u0433\u0440\u0430\u0444\u0438\u043a\u0438, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0445 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u043c, \u0430 \u0438\u043d\u0435\u0440\u0442\u043d\u043e\u0441\u0442\u044c \u0433\u043b\u0430\u0437\u0430 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0430\u0441\u0442\u044c \u044d\u043a\u0440\u0430\u043d\u0430 \u0441\u0434\u0435\u043b\u0430\u044e\u0442 \u0441\u0432\u043e\u0435 \u0434\u0435\u043b\u043e.<\/p>\n<p>  \u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u0441\u0435\u043c \u044d\u0442\u0438\u043c \u043d\u0438 \u0440\u0430\u0437\u0443 \u043d\u0435 \u041e\u0421, \u0430 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u0430\u044f \u043c\u043d\u043e\u044e \u043f\u0430\u0440\u0443 \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0441\u0442\u044d\u0439\u0442 \u043c\u0430\u0448\u0438\u043d\u0430 \u0438\u043b\u0438 \u043f\u0440\u043e\u0449\u0435 \u0433\u043e\u0432\u043e\u0440\u044f \u2014 \u043d\u0435\u0432\u044b\u0442\u0435\u0441\u043d\u044f\u044e\u0449\u0438\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0437\u0430\u0434\u0430\u0447 \u00abtinySM\u00bb.<\/p>\n<p>  \u041f\u043e\u0432\u0442\u043e\u0440\u044e \u043f\u0440\u0438\u0447\u0438\u043d\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0435\u0433\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u043b\u044e\u0431\u043e\u0439 \u0438\u0437 RTOS:  <\/p>\n<ul>\n<li> \u043d\u0438\u0436\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a ROM ( \\approx (\u2248)250 \u0431\u0430\u0439\u0442 \u044f\u0434\u0440\u043e);<\/li>\n<li> \u043d\u0438\u0436\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a RAM (\\approx (\u2248)9 \u0431\u0430\u0439\u0442 \u043d\u0430 \u0437\u0430\u0434\u0430\u0447\u0443);<\/li>\n<li> \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0440\u0430\u0431\u043e\u0442\u044b;<\/li>\n<li> \u0434\u0435\u0442\u0435\u0440\u043c\u0438\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f;<\/li>\n<li> \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043c\u0435\u043d\u044c\u0448\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438;<\/li>\n<li> \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0436\u0435\u043b\u0435\u0437\u0443;<\/li>\n<li> \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b;<\/li>\n<li> \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 \u0421 \u0438 \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0435\u0440\u043d\u0443\u0442\u044c \u0432 \u0421++;<\/li>\n<li> <s>\u043d\u0443\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0432\u043e\u0439 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u0432\u0435\u043b\u043e\u0441\u0438\u043f\u0435\u0434.<\/s><\/li>\n<\/ul>\n<p>  \u041a\u0430\u043a \u044f \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0443\u0436\u0435 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u043b, \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0443\u044e\u0442\u0441\u044f \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u0439 \u043d\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0433\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0438 \u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u0432\u044b\u0437\u043e\u0432\u0430. \u0422\u0430\u043a\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u043a\u0430 \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0438\u0433\u0440\u044b \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u044d\u0442\u0430\u043f\u0430\u043c\u0438, \u0447\u0442\u043e \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0443\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0435\u0442\u0432\u043b\u0435\u043d\u0438\u0439 \u0438 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0437\u0430\u0434\u0430\u0447.<br \/>  \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0442\u0430\u0440\u0442\u043e\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f 7 \u0437\u0430\u0434\u0430\u0447, \u0430 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b \u0438\u0445 \u0443\u0436\u0435 20 (\u0432\u0441\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432 \u0444\u0430\u0439\u043b\u0435 gameTasks.c).<\/p>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u0434\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430:  <\/p>\n<pre><code class=\"cpp\">#define T(a) a##Task #define TASK_N(a)     const taskParams_t T(a) #define TASK(a,b)     TASK_N(a) PROGMEM = {.pFunc=a, .timeOut=b} #define TASK_P(a)     (taskParams_t*)&amp;T(a) #define TASK_ARR_N(a) const tasksArr_t a##TasksArr[] #define TASK_ARR(a)   TASK_ARR_N(a) PROGMEM #define TASK_END      NULL <\/code><\/pre>\n<p>  \u041e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b, \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0435\u0435 \u043f\u043e\u043b\u0435\u0439 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432 ROM:  <\/p>\n<pre><code class=\"cpp\">TASK(updateBtnStates, 25); <\/code><\/pre>\n<p>  \u041a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u043a\u0430\u044f \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 4 \u0431\u0430\u0439\u0442\u0430 ROM (\u0434\u0432\u0430 \u043d\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0438 \u0434\u0432\u0430 \u043d\u0430 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b).<br \/>  \u041f\u0440\u0438\u044f\u0442\u043d\u044b\u043c \u0431\u043e\u043d\u0443\u0441\u043e\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0442\u043e, \u0447\u0442\u043e \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0432\u0435 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0434\u043b\u044f \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438.<br \/>  \u041e\u0431\u044a\u044f\u0432\u0438\u0432 \u043d\u0443\u0436\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u0445 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u0438 \u0442\u0430\u043a \u0436\u0435 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u0432 ROM:  <\/p>\n<pre><code class=\"cpp\">TASK_ARR( game ) = {   TASK_P(updateBtnStates),   TASK_P(playMusic),   TASK_P(drawStars),   TASK_P(moveShip),   TASK_P(drawShip),   TASK_P(checkFireButton),   TASK_P(pauseMenu),   TASK_P(drawPlayerWeapon),   TASK_P(checkShipHealth),   TASK_P(drawSomeGUI),   TASK_P(checkInVaders),   TASK_P(drawInVaders),   TASK_P(moveInVaders),   TASK_P(checkInVadersRespawn),   TASK_P(checkInVadersRay),   TASK_P(checkInVadersCollision),   TASK_P(dropWeaponGift),   TASK_END }; <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u0444\u043b\u0430\u0433\u0430 USE_DYNAMIC_MEM \u0432 0 \u0434\u043b\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0442\u044c \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0438 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0437\u0430\u0434\u0430\u0447 \u0432 RAM \u0438 \u0437\u0430\u0434\u0430\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0434\u0430\u0447 \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442:  <\/p>\n<pre><code class=\"cpp\">... tasksContainer_t tasksContainer; taskFunc_t tasksArr[MAX_GAME_TASKS]; ... initTasksArr(&amp;tasksContainer, &amp;tasksArr[0], MAX_GAME_TASKS); \u2026 <\/code><\/pre>\n<p>  \u041f\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435:  <\/p>\n<pre><code class=\"cpp\">... addTasksArray_P(gameTasksArr); \u2026 <\/code><\/pre>\n<p>  \u0417\u0430\u0449\u0438\u0442\u0430 \u043e\u0442 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433\u043e\u043c USE_MEM_PANIC, \u0435\u0441\u043b\u0438 \u0432\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b \u0432 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0434\u0430\u0447, \u0442\u043e \u0434\u043b\u044f \u044d\u043a\u043e\u043d\u043e\u043c\u0438\u0438 ROM \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c.<\/p>\n<p>  \u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a:  <\/p>\n<pre><code class=\"cpp\">... runTasks(); ... <\/code><\/pre>\n<p>  \u0412\u043d\u0443\u0442\u0440\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043b\u043e\u0433\u0438\u043a\u0443. \u041f\u043e\u043f\u0430\u0434\u0430\u044f \u0432 \u043d\u0435\u0433\u043e \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u044d\u043a \u0431\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u00ab__attribute__ ((noreturn))\u00bb.<br \/>  \u0412 \u0446\u0438\u043a\u043b\u0435 \u043f\u043e\u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u0437\u043e\u0432\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u0430.<br \/>  \u041e\u0442\u0441\u0447\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043d \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 timer0 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0441 \u043a\u0432\u0430\u043d\u0442\u043e\u043c \u0432 1\u043c\u0441\u2026<\/p>\n<p>  \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0443\u0434\u0430\u0447\u043d\u043e\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0430\u0447 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0438\u043d\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u043b\u043e \u0438\u0445 \u043d\u0430\u043b\u043e\u0436\u0435\u043d\u0438\u0435(jitter), \u0447\u0442\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u043b\u043e \u043a\u0440\u0430\u0442\u043a\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0437\u0430\u043c\u0438\u0440\u0430\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0438 \u0432\u0441\u044f \u0432 \u0438\u0433\u0440\u0435.<br \/>  \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0430\u0442\u044c, \u043d\u043e \u043a\u0430\u043a? \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0432\u0441\u0435 \u043f\u0440\u043e\u0444\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0440\u0430\u0437, \u0430 \u043f\u043e\u043a\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u043f\u0430\u0441\u0445\u0430\u043b\u043a\u0443 \u0432 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u0445.<\/p>\n<h3>\u041a\u043e\u043d\u0435\u0446<\/h3>\n<hr>\n<p> \u0412\u043e\u0442 \u0442\u0430\u043a \u0432\u043e\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0443\u0445\u0438\u0449\u0440\u0435\u043d\u0438\u0439 (\u0438 \u0435\u0449\u0435 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u044f \u043d\u0435 \u043e\u043f\u0438\u0441\u0430\u043b) \u0438 \u0432\u044b\u0448\u043b\u043e \u0432\u0441\u0435 \u0443\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 24\u043a\u0431 ROM \u0438 1500 \u0431\u0430\u0439\u0442 RAM. \u0415\u0441\u043b\u0438 \u0443 \u0412\u0430\u0441 \u0435\u0441\u0442\u044c \u0432\u043e\u043f\u0440\u043e\u0441\u044b \u0431\u0443\u0434\u0443 \u0440\u0430\u0434 \u043d\u0430 \u043d\u0438\u0445 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c.  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u043d\u0430\u0448\u0435\u043b \u0438\u043b\u0438 \u043d\u0435 \u0438\u0441\u043a\u0430\u043b \u043f\u0430\u0441\u0445\u0430\u043b\u043a\u0443:<\/b><\/p>\n<div class=\"spoiler_text\">\u043a\u043e\u043f\u0430\u0439 \u0432 \u0441\u0442\u043e\u0440\u043e\u043d\u0443:  <\/p>\n<pre><code class=\"cpp\">void invadersMagicRespawn(void) {   for(auto &amp;alien : aliens) {     if(!alien.alive) {       alien.respawnTime = 1;     }   } } <\/code><\/pre>\n<p>  \u041d\u0438\u0447\u0435\u043c \u043d\u0435 \u043f\u0440\u0438\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u0432\u0434\u0430?  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0430\u0430\u0430\u0430\u0437\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441 invadersMagicRespawn:<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"cpp\">void action() {   tftSetTextSize(1);   for(;;) {     tftSetCP437(RN &amp; 1);     tftSetTextColorBG((((RN % 192 + 64) &amp; 0xFC) &lt;&lt; 3), COLOR_BLACK);     tftDrawCharInt(((RN % 26) * 6), ((RN &amp; 15) * 8), (RN % 255));     tftPrintAt_P(32, 58, (const char *)creditP0);   } } a(void) {   for(auto &amp;alien : aliens) {     if(!alien.alive) {       alien.respawnTime = 1;     }   } } <\/code><\/pre>\n<p>  \u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0447\u0442\u043e \u00ab\u0430(void)\u00bb \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 \u0447\u0435\u043c \u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0430, \u0430 \u00abaction()\u00bb \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c \u043f\u0430\u0443\u0437\u044b \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u043c 10 \u0440\u0430\u0437, \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0441\u043a\u0440\u044b\u0442 \u0432 \u00abdisablePause();\u00bb. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435 \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0432 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 \u0432 \u0441\u0442\u0438\u043b\u0435 \u00abMatrix Falling code\u00bb \u0441 \u0442\u0435\u043a\u0441\u0442\u043e\u043c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443. \u0412\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u0441\u0443\u0440\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0449\u0430\u044f \u0432\u0441\u0435\u0433\u043e 130 \u0431\u0430\u0439\u0442 ROM.  <\/div>\n<\/div>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0430\u043f\u043a\u0443 (\u0438\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043b\u0438\u043d\u043a) \u00abesploraAPI\u00bb \u0432 \u00ab\/arduino\/libraries\/\u00bb.<\/p>\n<p>  \u0421\u0441\u044b\u043b\u043a\u0438:  <\/p>\n<ul>\n<li> <a href=\"https:\/\/github.com\/Bismuth208\/Firecore\">\u0438\u0433\u0440\u0430;<\/a><\/li>\n<li> <a href=\"https:\/\/github.com\/Bismuth208\/Esplora-API\">esploraAPI;<\/a><\/li>\n<li> <a href=\"https:\/\/github.com\/Bismuth208\/Pico-Packer\">\u0443\u043f\u0430\u043a\u043e\u0432\u0449\u0438\u043a pickoPacker;<\/a><\/li>\n<\/ul>\n<p>  P.S. \u0423\u0432\u0438\u0434\u0435\u0442\u044c \u0438 \u0443\u0441\u043b\u044b\u0448\u0430\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u043e \u0432\u0441\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435 \u043a\u043e\u0433\u0434\u0430 \u0441\u0434\u0435\u043b\u0430\u044e \u043f\u0440\u0438\u0435\u043c\u043b\u0435\u043c\u043e\u0435 \u0432\u0438\u0434\u0435\u043e.<\/p><\/div>\n<p>        <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/post\/425407\/\"> https:\/\/habr.com\/post\/425407\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/dv\/yz\/hr\/dvyzhr-e4xxmj6jbln7ngiti5d0.png\"><\/p>\n<p>  \u0425\u043e\u0447\u0443 \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u044b\u043c \u0432\u0435\u0447\u0435\u0440\u043d\u0438\u043c \u0434\u043e\u043b\u0433\u043e\u0441\u0442\u0440\u043e\u0435\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u0433\u0440\u044b \u0434\u0430\u0436\u0435 \u043d\u0430 \u0441\u043b\u0430\u0431\u043e\u043c \u0436\u0435\u043b\u0435\u0437\u0435.<\/p>\n<p>  \u041e \u0442\u043e\u043c \u0447\u0442\u043e \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c, \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0438 \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u0435, \u0447\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u043a\u043b\u043e\u043d Pong \u2014 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434 \u043a\u0430\u0442.<\/p>\n<p>  \u041e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e: \u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f, \u0442\u0440\u0430\u0444\u0438\u043a \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u0434\u043e\u0432\u044b\u0435 \u0432\u0441\u0442\u0430\u0432\u043a\u0438!  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-290350","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/290350","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=290350"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/290350\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=290350"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=290350"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=290350"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}