{"id":383902,"date":"2024-06-29T05:10:22","date_gmt":"2024-06-29T05:10:22","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=383902"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=383902","title":{"rendered":"<span>\u041a\u0430\u043a \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 CHIP-8 \u043d\u0430 JS<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/593525\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zr\/wk\/ot\/zrwkotyuu3q55jt_diiy9la_ha0.png\" alt=\"Chip-8\" width=\"780\" data-src=\"https:\/\/habrastorage.org\/webt\/zr\/wk\/ot\/zrwkotyuu3q55jt_diiy9la_ha0.png\"\/><\/a><\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0432\u0451\u043b \u0434\u0435\u0442\u0441\u0442\u0432\u043e \u0437\u0430 \u0438\u0433\u0440\u0430\u043c\u0438 \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 NES \u0438 SNES \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u0430\u043c \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. <a href=\"https:\/\/sergeev.io\/\">\u0418\u0432\u0430\u043d \u0421\u0435\u0440\u0433\u0435\u0435\u0432<\/a> \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0435\u0440\u0435\u0434 \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/CHIP-8\">Chip-8<\/a>, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. <\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 Chip-8 \u043d\u0430 JavaScript, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0434 \u0435\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043f\u043e\u043a\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043a\u0443\u0440\u0441 \u043f\u043e <a href=\"https:\/\/skillfactory.ru\/python-fullstack-web-developer?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_fpw_051221&amp;amp;utm_term=lead\">Fullstack-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 Python<\/a>.<br \/>  <a name=\"habracut\"><\/a><\/p>\n<hr\/>\n<p>  \u0425\u043e\u0442\u044f \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u0430 Chip-8 \u043d\u0430 \u0432\u0441\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u0430\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043c\u043e\u0439 Chip8.js \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0441 \u0442\u0440\u0435\u043c\u044f \u0441\u0440\u0435\u0434\u0430\u043c\u0438: \u044d\u0442\u043e \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 CLI \u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0438 \u0434\u0435\u043c\u043e:<\/p>\n<ul>\n<li><a href=\"https:\/\/taniarascia.github.io\/chip8\/\">\u0414\u0435\u043c\u043e<\/a>.<\/li>\n<li><a href=\"https:\/\/github.com\/taniarascia\/chip8\">\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/a>.<\/li>\n<\/ul>\n<p>  \u0415\u0441\u0442\u044c \u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 Chip-8, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a <a href=\"http:\/\/mattmik.com\/files\/chip8\/mastering\/chip8.html\">Mastering Chip8<\/a>, <a href=\"http:\/\/www.multigesture.net\/articles\/how-to-write-an-emulator-Chip-8-interpreter\/\">How to Write an Emulator<\/a> \u0438, \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435 \u2014 <a href=\"http:\/\/devernay.free.fr\/hacks\/chip8\/C8TECH10.HTM\">Cowgod\u2019s Chip-8 Technical Reference<\/a>, \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 \u0434\u043b\u044f \u043c\u043e\u0435\u0433\u043e \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430, \u0430 \u0435\u0449\u0451 \u0432\u0435\u0431-\u0441\u0430\u0439\u0442, \u043d\u0430\u0441\u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0430\u0440\u044b\u0439, \u0447\u0442\u043e \u0435\u0433\u043e \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f <code>.HTM<\/code>. <\/p>\n<p>  \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u044d\u0442\u043e \u043d\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e, \u043d\u043e \u043e\u0431\u0437\u043e\u0440 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u044f \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043a\u0430\u043a\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0438 \u044f \u0438\u0437\u0443\u0447\u0438\u043b\u0430, \u0438 \u043e \u043a\u043e\u0435-\u043a\u0430\u043a\u043e\u0439 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0435 JavaScript \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e, \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438 CLI-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 Chip-8<\/h2>\n<p><\/font><br \/>  \u042f \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0430 \u043e Chip-8 \u0434\u043e \u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044e, \u0447\u0442\u043e \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u043e \u043b\u044e\u0434\u0435\u0439 \u0442\u043e\u0436\u0435 \u043d\u0435 \u0441\u043b\u044b\u0448\u0430\u043b\u0438, \u0435\u0441\u043b\u0438 \u043d\u0435 \u043b\u0430\u0434\u044f\u0442 \u0441 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438. Chip-8 \u2014 \u044d\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u044b\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0432 1970-\u0445 \u0433\u043e\u0434\u0430\u0445 \u0434\u043b\u044f \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u043e\u0432. <\/p>\n<p>  \u041b\u044e\u0434\u0438 \u043f\u0438\u0441\u0430\u043b\u0438 \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Chip-8, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0435 \u0438\u0433\u0440\u044b \u0442\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438: Pong, Tetris, Space Invaders \u0438, \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e, \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u0433\u0440\u044b, \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u043d\u044b\u0435 \u0432 \u0430\u043d\u043d\u0430\u043b\u0430\u0445 \u0438\u0441\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p>  \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0433\u0440\u0430\u0435\u0442 \u0432 \u043d\u0438\u0445, \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%BF%D1%80%D0%B5%D1%82%D0%B0%D1%82%D0%BE%D1%80\"><i>\u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u043e\u043c<\/i><\/a> Chip-8, \u0430 \u043d\u0435 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%AD%D0%BC%D1%83%D0%BB%D1%8F%D1%86%D0%B8%D1%8F\"><i>\u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u043e\u043c<\/i><\/a>, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435, \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u044e\u0449\u0435\u0435 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b, \u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b Chip-8 \u043d\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a \u043a\u0430\u043a\u043e\u043c\u0443-\u043b\u0438\u0431\u043e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u043c\u0443 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u044e. \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440\u044b Chip-8 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445.<\/p>\n<p>  \u0422\u0435\u043c \u043d\u0435 \u043c\u0435\u043d\u0435\u0435 \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u043b\u0438\u0437\u043e\u043a \u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0443, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441 \u043d\u0435\u0433\u043e \u043e\u0431\u044b\u0447\u043d\u043e \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442 \u0442\u0435, \u043a\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u043d\u0430\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u044b; \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0449\u0435, \u0447\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 NES \u0438\u043b\u0438 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u0435\u0449\u0451. \u0410 \u0435\u0449\u0451 \u044d\u0442\u043e \u0445\u043e\u0440\u043e\u0448\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0434\u043b\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043d\u043e\u0433\u0438\u0445 \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432 \u0446\u0435\u043b\u043e\u043c, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043f\u0430\u043c\u044f\u0442\u044c, \u0441\u0442\u0435\u043a\u0438 \u0438 \u0432\u0432\u043e\u0434-\u0432\u044b\u0432\u043e\u0434, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u044f \u0435\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e \u0438\u043c\u0435\u044e \u0434\u0435\u043b\u043e \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u043e\u043c \u043c\u0438\u0440\u0435 \u0441\u0440\u0435\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f JavaScript.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0427\u0442\u043e \u0432\u0445\u043e\u0434\u0438\u0442 \u0432 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 Chip-8?<\/h2>\n<p><\/font><br \/>  \u041c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0439\u0442\u0438 \u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0438, \u0447\u0442\u043e\u0431\u044b \u0445\u043e\u0442\u044f \u0431\u044b \u043d\u0430\u0447\u0430\u0442\u044c \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0441 \u0447\u0435\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e; \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u0440\u0430\u043d\u044c\u0448\u0435 \u043d\u0435 \u0438\u0437\u0443\u0447\u0430\u043b\u0430 \u043e\u0441\u043d\u043e\u0432\u044b \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u0441\u0442\u0430\u0442\u044c\u044e <a href=\"https:\/\/www.taniarascia.com\/bits-bytes-bases-and-a-hex-dump-javascript\/\">\u041f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0431\u0438\u0442\u043e\u0432, \u0431\u0430\u0439\u0442\u043e\u0432, \u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0439 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0434\u0430\u043c\u043f\u0430 \u0432 JavaScript<\/a>, \u0433\u0434\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0430 \u043e\u0431 \u044d\u0442\u043e\u043c.\u0418\u0437 \u043d\u0435\u0451 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0432\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0432\u044b\u0432\u043e\u0434\u0430:<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u041e\u0431\u0449\u0438\u0435 \u0441\u0432\u0435\u0434\u0435\u043d\u0438\u044f \u043e \u0431\u0438\u0442\u0430\u0445 \u0438 \u0431\u0430\u0439\u0442\u0430\u0445<\/b>                         <\/p>\n<div class=\"spoiler_text\">\n<ul>\n<li><strong>\u0411\u0438\u0442\u044b \u0438 \u0431\u0430\u0439\u0442\u044b<\/strong>. \u0411\u0438\u0442 \u2014 \u044d\u0442\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u0430\u044f \u0446\u0438\u0444\u0440\u0430 \u2014 0 \u0438\u043b\u0438 1, \u0438\u0441\u0442\u0438\u043d\u0430 \u0438\u043b\u0438 \u043b\u043e\u0436\u044c, \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e. \u0412\u043e\u0441\u0435\u043c\u044c \u0431\u0438\u0442 \u2014 \u044d\u0442\u043e \u0431\u0430\u0439\u0442, \u043e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b.<\/li>\n<li><strong>\u041e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u044f \u0447\u0438\u0441\u0435\u043b<\/strong>. \u0414\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u043e\u0439 \u0434\u043b\u044f \u043d\u0430\u0441, \u043d\u043e \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u044b \u043e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 (\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 2) \u0438\u043b\u0438 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 (\u043e\u0441\u043d\u043e\u0432\u0430\u043d\u0438\u0435 16). <code>1111<\/code> \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435, <code>15<\/code> \u0432 \u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0439 \u0438 <code>f<\/code> \u0432 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u2014 \u044d\u0442\u043e \u043e\u0434\u043d\u043e \u0438 \u0442\u043e \u0436\u0435 \u0447\u0438\u0441\u043b\u043e.<\/li>\n<li><strong>\u041f\u043e\u043b\u0443\u0431\u0430\u0439\u0442\u044b<\/strong>. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, 4 \u0431\u0438\u0442\u0430 \u2014 \u044d\u0442\u043e \u043f\u043e\u043b\u0443\u0431\u0430\u0439\u0442, \u0447\u0442\u043e \u043e\u0447\u0435\u043d\u044c \u043c\u0438\u043b\u043e. \u041c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u043e\u0437\u0438\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c\u0438.<\/li>\n<li><strong>\u041f\u0440\u0435\u0444\u0438\u043a\u0441\u044b<\/strong>. \u0412 JS <code>0x<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b, <code>0b<\/code> \u2014 \u044d\u0442\u043e \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b.<\/li>\n<\/ul>\n<p>  <\/div>\n<\/p><\/div>\n<p>  \u042f \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 <a href=\"https:\/\/www.taniarascia.com\/snake-game-in-javascript\/\">\u0417\u043c\u0435\u0439\u043a\u0443 \u0432 CLI<\/a>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043f\u0438\u043a\u0441\u0435\u043b\u044f\u043c\u0438 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435.<\/p>\n<p>  \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 (CPU) \u2014 \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u0417\u0434\u0435\u0441\u044c \u043e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0431\u0438\u0442\u043e\u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043d\u0438\u0436\u0435, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0446\u0438\u043a\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0441 \u0448\u0430\u0433\u0430\u043c\u0438: <strong>\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435\u043c, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c<\/strong>.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041f\u0430\u043c\u044f\u0442\u044c<\/h2>\n<p><\/font><br \/>  Chip-8 \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a <strong>4 \u041a\u0431 \u043f\u0430\u043c\u044f\u0442\u0438<\/strong> \u041e\u0417\u0423. \u042d\u0442\u043e <code>0,002%<\/code> \u043e\u0442 \u043e\u0431\u044a\u0451\u043c\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u043d\u0430 \u0434\u0438\u0441\u043a\u0435\u0442\u0435. \u0411\u043e\u043b\u044c\u0448\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  4 \u041ab \u2014 \u044d\u0442\u043e 4096 \u0431\u0430\u0439\u0442, \u0438 JavaScript \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Typed_arrays\">\u0442\u0438\u043f\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u043c\u0430\u0441\u0441\u0438\u0432\u044b<\/a>, \u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/JavaScript\/Reference\/Global_Objects\/Uint8Array\">Uint8Array<\/a> \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 \u2014 \u0437\u0434\u0435\u0441\u044c \u044d\u0442\u043e 8 \u0431\u0438\u0442.<\/p>\n<pre><code class=\"javascript\">let memory = new Uint8Array(4096) <\/code><\/pre>\n<p>  \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u043c\u0430\u0441\u0441\u0438\u0432 \u043a\u0430\u043a \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043c\u0430\u0441\u0441\u0438\u0432, \u043e\u0442 <code>memory[0]<\/code> \u0434\u043e <code>memory[4095]<\/code>, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044f \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b \u043c\u0430\u0441\u0441\u0438\u0432\u0430 \u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043e <code>255<\/code>. \u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u044b\u0448\u0435 255 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e\u0442\u0441\u044f \u0432 255.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0421\u0447\u0451\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 (PC)<\/h2>\n<p><\/font><br \/>  \u042d\u0442\u043e\u0442 \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0445\u0440\u0430\u043d\u0438\u0442 \u0430\u0434\u0440\u0435\u0441 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432 \u0432\u0438\u0434\u0435 <strong>16-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u0446\u0435\u043b\u043e\u0433\u043e \u0447\u0438\u0441\u043b\u0430<\/strong>. \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0432 Chip-8 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 PC, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u043e\u0431\u0440\u0430\u0449\u0430\u044f\u0441\u044c \u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0438\u0441\u0430\u043d \u0432 PC.<\/p>\n<p>  \u0427\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u0441\u0445\u0435\u043c\u044b \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u044f\u0447\u0435\u0435\u043a \u043f\u0430\u043c\u044f\u0442\u0438 Chip-8, <code>0x000<\/code> to <code>0x1FF<\/code> \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0430\u043c\u044f\u0442\u044c \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 <code>0x200<\/code>.<\/p>\n<pre><code class=\"javascript\">let PC = 0x200 \/\/ memory[PC] \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f \u043a \u0430\u0434\u0440\u0435\u0441\u0443 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <\/code><\/pre>\n<p>  <i>\u0412\u044b \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u0435, \u0447\u0442\u043e \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 8-\u0431\u0438\u0442\u043d\u044b\u0439, \u0430 PC \u2014 16-\u0431\u0438\u0442\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043e\u043f\u043a\u043e\u0434 big endian, \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0432\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0445 \u043a\u043e\u0434\u0430.<\/i><\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b<\/h2>\n<p><\/font><br \/>  \u041f\u0430\u043c\u044f\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u043e\u043b\u0433\u043e\u0441\u0440\u043e\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043a\u0430\u043a \u0441\u0432\u043e\u0435\u0433\u043e \u0440\u043e\u0434\u0430 \u00ab\u043a\u0440\u0430\u0442\u043a\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c\u00bb \u0434\u043b\u044f \u043d\u0435\u043c\u0435\u0434\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0439. Chip-8 \u0438\u043c\u0435\u0435\u0442 <strong>16 8-\u0431\u0438\u0442\u043d\u044b\u0445 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432<\/strong>, \u043e\u0442 <code>V0<\/code> \u0434\u043e <code>VF<\/code>.<\/p>\n<pre><code class=\"javascript\">let registers = new Uint8Array(16) <\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0418\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/h2>\n<p><\/font><br \/>  \u0421\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 <strong>16-\u0431\u0438\u0442\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0442\u0430\u043a \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 <code>I<\/code>. \u0420\u0435\u0433\u0438\u0441\u0442\u0440 <code>I<\/code> \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f \u0438 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u043c\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u0430\u043a\u0436\u0435 16-\u0431\u0438\u0442\u043d\u0430\u044f.<\/p>\n<pre><code class=\"javascript\">let I = 0 <\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0421\u0442\u0435\u043a<\/h2>\n<p><\/font><br \/>  Chip-8 \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u0442\u044c \u0432 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Subroutine\">\u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432 \u0441\u0442\u0435\u043a \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0443\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0442\u044c\u0441\u044f. \u0421\u0442\u0435\u043a \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 <strong>16 16-\u0431\u0438\u0442\u043d\u044b\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439<\/strong>: \u0434\u043e \u00ab\u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043a\u0430\u00bb \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u0432 16 \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c.<\/p>\n<pre><code class=\"javascript\">let stack = new Uint16Array(16) <\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430<\/h2>\n<p><\/font><br \/>  \u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0442\u0435\u043a\u0430 (SP) \u2014 \u044d\u0442\u043e <code>8-\u0431\u0438\u0442\u043d\u043e\u0435<\/code> \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u043c\u0435\u0441\u0442\u043e \u0432 \u0441\u0442\u0435\u043a\u0435. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e 8-\u0431\u0438\u0442\u043d\u044b\u043c, \u0445\u043e\u0442\u044f \u0441\u0442\u0435\u043a 16-\u0431\u0438\u0442\u043d\u044b\u0439. \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u0438\u043d\u0434\u0435\u043a\u0441 \u0441\u0442\u0435\u043a\u0430, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0442 <code>0<\/code> \u0434\u043e <code>15<\/code>.<\/p>\n<pre><code class=\"javascript\">let SP = -1 \/\/ stack[SP] \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0430\u0434\u0440\u0435\u0441\u0443 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0432 \u0441\u0442\u0435\u043a\u0435. <\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0422\u0430\u0439\u043c\u0435\u0440\u044b<\/h2>\n<p><\/font><br \/>  Chip-8 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0438\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u043b\u0438\u043a\u043e\u043b\u0435\u043f\u043d\u044b\u0439 \u043e\u0434\u0438\u043d\u043e\u0447\u043d\u044b\u0439 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0441\u0438\u0433\u043d\u0430\u043b. \u0427\u0435\u0441\u0442\u043d\u043e \u0433\u043e\u0432\u043e\u0440\u044f, \u044f \u043d\u0435 \u043f\u043e\u0442\u0440\u0443\u0434\u0438\u043b\u0430\u0441\u044c \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434 \u00ab\u043c\u0443\u0437\u044b\u043a\u0438\u00bb, \u0445\u043e\u0442\u044f \u0441\u0430\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0441 \u043d\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c. <\/p>\n<p>  \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u0442\u0430\u0439\u043c\u0435\u0440\u0430, \u043e\u0431\u0430 \u2014 <strong>8-\u0431\u0438\u0442\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b<\/strong>: \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439 \u0442\u0430\u0439\u043c\u0435\u0440 (ST) \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0433\u043e \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0438 \u0442\u0430\u0439\u043c\u0435\u0440 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438 (DT) \u0434\u043b\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u0432 \u0438\u0433\u0440\u0435. \u041e\u043d\u0438 \u043e\u0442\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u044e\u0442 \u0432\u0440\u0435\u043c\u044f \u0441 \u0447\u0430\u0441\u0442\u043e\u0442\u043e\u0439 <strong>60 \u0413\u0446<\/strong>.<\/p>\n<pre><code class=\"javascript\">let DT = 0 let ST = 0<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0412\u0432\u043e\u0434 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b<\/h2>\n<p><\/font><br \/>  Chip-8 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u0441\u044f \u0432\u043e\u0442 \u0441 \u0442\u0430\u043a\u043e\u0439 \u0443\u0434\u0438\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u043e\u0439:<\/p>\n<pre><code class=\"plaintext\">\u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510 \u2502 1 \u2502 2 \u2502 3 \u2502 C \u2502 \u2502 4 \u2502 5 \u2502 6 \u2502 D \u2502 \u2502 7 \u2502 8 \u2502 9 \u2502 E \u2502 \u2502 A \u2502 0 \u2502 B \u2502 F \u2502 \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518<\/code><\/pre>\n<p>  \u041d\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435, \u043f\u043e\u0445\u043e\u0436\u0435, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u043b\u0438\u0448\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0432\u0438\u0448, \u0438 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0445 \u0441 \u043b\u044e\u0431\u043e\u0439 \u0441\u0435\u0442\u043a\u043e\u0439 4\u04454, \u043d\u043e \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0445 \u043e\u043d\u0438 \u0434\u043e\u0432\u043e\u043b\u044c\u043d\u043e \u043d\u0435\u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u044b.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0413\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u044b\u0432\u043e\u0434<\/h2>\n<p><\/font><br \/>  \u0412 Chip-8 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043c\u043e\u043d\u043e\u0445\u0440\u043e\u043c\u043d\u044b\u0439 \u0434\u0438\u0441\u043f\u043b\u0435\u0439 \u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435\u043c <code>64x32<\/code>. \u041a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u043b\u0438\u0431\u043e \u0432\u043a\u043b\u044e\u0447\u0451\u043d, \u043b\u0438\u0431\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d.<\/p>\n<p>  \u0421\u043f\u0440\u0430\u0439\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u0438\u043c\u0435\u044e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 <code>8x15<\/code> \u2014 \u0432\u043e\u0441\u0435\u043c\u044c \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u0438 \u043f\u044f\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u044c \u2014 \u0432 \u0432\u044b\u0441\u043e\u0442\u0443. Chip-8 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0448\u0440\u0438\u0444\u0442\u043e\u0432, \u043d\u043e \u043e\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0438\u043c\u0432\u043e\u043b\u044b \u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>CPU<\/h2>\n<p><\/font><br \/>  \u0421\u043b\u043e\u0436\u0438\u0442\u0435 \u0432\u0441\u0451 \u044d\u0442\u043e \u0432\u043c\u0435\u0441\u0442\u0435, \u0438 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430. \u0412\u043e\u0442 \u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0441:<\/p>\n<pre><code class=\"javascript\">class CPU { \u00a0 constructor() { \u00a0 \u00a0 this.memory = new Uint8Array(4096) \u00a0 \u00a0 this.registers = new Uint8Array(16) \u00a0 \u00a0 this.stack = new Uint16Array(16) \u00a0 \u00a0 this.ST = 0 \u00a0 \u00a0 this.DT = 0 \u00a0 \u00a0 this.I = 0 \u00a0 \u00a0 this.SP = -1 \u00a0 \u00a0 this.PC = 0x200 \u00a0 } }<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Chip-8<\/h2>\n<p><\/font><br \/>  Chip-8 \u0438\u043c\u0435\u0435\u0442 36 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439. \u0412\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 <a href=\"http:\/\/devernay.free.fr\/hacks\/chip8\/C8TECH10.HTM#3.1\">\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u044b \u0437\u0434\u0435\u0441\u044c<\/a>. \u0412\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043b\u0438\u043d\u0443 2 \u0431\u0430\u0439\u0442\u0430 (16 \u0431\u0438\u0442). \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043a\u043e\u0434\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043e\u043f\u043a\u043e\u0434\u043e\u043c (\u043a\u043e\u0434\u043e\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438) \u0438 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u043c \u2014 \u0434\u0430\u043d\u043d\u044b\u043c\u0438, \u043d\u0430\u0434 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f. \u041f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0442\u0430\u043a\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f:<\/p>\n<pre><code class=\"javascript\">x = 1. y = 2.  ADD x, y,<\/code><\/pre>\n<p>  \u0433\u0434\u0435 <code>ADD<\/code> \u2014 <code>\u043e\u043f\u043a\u043e\u0434<\/code> \u0438 <code>x<\/code>, <code>y<\/code> \u2014 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u044b. \u042d\u0442\u043e\u0442 \u0442\u0438\u043f \u044f\u0437\u044b\u043a\u0430 \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u043a\u0430\u043a \u044f\u0437\u044b\u043a \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0430. \u042d\u0442\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u043d\u0430:<\/p>\n<pre><code class=\"javascript\">x = x + y <\/code><\/pre>\n<p>  \u041f\u0440\u0438 \u0442\u0430\u043a\u043e\u043c \u043d\u0430\u0431\u043e\u0440\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043c\u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u044d\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 16 \u0431\u0438\u0442\u0430\u0445, \u0442\u0430\u043a \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u043e\u0431\u043e\u0439 \u0447\u0438\u0441\u043b\u043e \u043e\u0442 <code>0x0000<\/code> \u0434\u043e <code>0xffffff<\/code>. \u041a\u0430\u0436\u0434\u0430\u044f \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u0440\u0430\u0437\u0440\u044f\u0434\u0430 \u0432 \u044d\u0442\u0438\u0445 \u043d\u0430\u0431\u043e\u0440\u0430\u0445 \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 4 \u0431\u0438\u0442\u043e\u0432.<\/p>\n<p>  \u041a\u0430\u043a \u0436\u0435 \u043c\u043d\u0435 \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043e\u0442 <code>nnnn<\/code> \u043a \u0447\u0435\u043c\u0443-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 <code>ADD x, y<\/code>? \u041d\u0430\u0447\u043d\u0443 \u0441 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0432\u044b\u0448\u0435:<\/p>\n<div class=\"scrollable-table\">\n<table>\n<thead>\n<tr>\n<th>\u0418\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f<\/th>\n<th>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>8xy4<\/code><\/td>\n<td><code>ADD Vx, Vy<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<p>  \u0415\u0441\u0442\u044c \u043e\u0434\u043d\u043e \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0435 \u0441\u043b\u043e\u0432\u043e, <code>ADD<\/code>, \u0430 \u0435\u0449\u0451 \u0434\u0432\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0445 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430, <code>Vx<\/code> \u0438 <code>Vy<\/code>. \u0422\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u043d\u0435\u043c\u043e\u043d\u0438\u043a \u043e\u043f\u043a\u043e\u0434\u043e\u0432, \u043f\u043e\u0445\u043e\u0436\u0438\u0445 \u043d\u0430 \u043a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u0441\u043b\u043e\u0432\u0430:<\/p>\n<ul>\n<li><code>ADD<\/code> (\u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435).<\/li>\n<li><code>SUB<\/code> (\u0432\u044b\u0447\u0438\u0442\u0430\u043d\u0438\u0435).<\/li>\n<li><code>JP<\/code> (\u043f\u0435\u0440\u0435\u0445\u043e\u0434).<\/li>\n<li><code>SKP<\/code> (\u043f\u0440\u043e\u043f\u0443\u0441\u043a).<\/li>\n<li><code>RET<\/code> (\u0432\u043e\u0437\u0432\u0440\u0430\u0442).<\/li>\n<li><code>LD<\/code> (\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430).<\/li>\n<\/ul>\n<p>  \u0418 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0438\u043f\u043e\u0432 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a:<\/p>\n<ul>\n<li>\u0410\u0434\u0440\u0435\u0441 (<code>I<\/code>).<\/li>\n<li>\u0420\u0435\u0433\u0438\u0441\u0442\u0440 (<code>Vx<\/code>, <code>Vy<\/code>).<\/li>\n<li>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u0430<code>(N<\/code> \u0438\u043b\u0438 <code>NN<\/code> \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0431\u0430\u0439\u0442\u0430 \u0438\u043b\u0438 \u0431\u0430\u0439\u0442\u0430).<\/li>\n<\/ul>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u043f\u043e\u0441\u043e\u0431 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438 16-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u043a\u043e\u0434\u0430 \u043a\u0430\u043a \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0411\u0438\u0442\u043e\u0432\u044b\u0435 \u043c\u0430\u0441\u043a\u0438<\/h2>\n<p><\/font><br \/>  \u041a\u0430\u0436\u0434\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0448\u0430\u0431\u043b\u043e\u043d, \u0438 \u043e\u043d \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u043e\u0434\u043d\u0438\u043c \u0438 \u0442\u0435\u043c \u0436\u0435, \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f. \u0414\u043b\u044f <code>8xy4<\/code> \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f <code>8__4<\/code>. \u0414\u0432\u0430 \u043f\u043e\u043b\u0443\u0431\u0430\u0439\u0442\u0430 \u0432 \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u2014 \u044d\u0442\u043e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435. \u0421\u043e\u0437\u0434\u0430\u0432 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%91%D0%B8%D1%82%D0%BE%D0%B2%D0%B0%D1%8F_%D0%BC%D0%B0%D1%81%D0%BA%D0%B0\">\u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443<\/a> \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430, \u044f \u043c\u043e\u0433\u0443 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e.<\/p>\n<p>  \u0414\u043b\u044f \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0431\u0438\u0442\u043e\u0432\u043e\u0435 AND (<code>&amp;<\/code>) \u0441 \u043c\u0430\u0441\u043a\u043e\u0439 \u0438 \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0435\u0441\u043b\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 <code>8124<\/code>, \u0437\u0430\u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0431\u0430\u0439\u0442 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 1 \u0438 4 \u0432\u043a\u043b\u044e\u0447\u0451\u043d (\u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d), \u0430 \u043f\u043e\u043b\u0443\u0431\u0430\u0439\u0442 \u0432 \u043f\u043e\u0437\u0438\u0446\u0438\u0438 2 \u0438 3 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d (\u0437\u0430\u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u043d). \u0418 \u0432\u043e\u0442 \u043c\u0430\u0441\u043a\u0430: <code>f00f<\/code>.<\/p>\n<pre><code class=\"javascript\">const opcode = 0x8124 const mask = 0xf00f const pattern = 0x8004  const isMatch = (opcode &amp; mask) === pattern \/\/ true \u00a0 8124 &amp; f00f \u00a0 ==== \u00a0 8004<\/code><\/pre>\n<p>  \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e <code>0f00<\/code> \u043c <code>00f0<\/code> \u0431\u0443\u0434\u0435\u0442 \u043c\u0430\u0441\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0430 \u0441\u0434\u0432\u0438\u0433\u043e\u043c \u0432\u043f\u0440\u0430\u0432\u043e (<code>>><\/code>) \u043e\u043d\u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0443\u0436\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u0443\u0431\u0430\u0439\u0442\u0443.<\/p>\n<pre><code class=\"javascript\">const x = (0x8124 &amp; 0x0f00) >> 8 \/\/ 1  \/\/ (0x8124 &amp; 0x0f00) is 100000000 in binary \/\/ \u043f\u0440\u0430\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u043d\u0430 8 (>> 8) \u0443\u0434\u0430\u043b\u0438\u0442 8 \u043d\u0443\u043b\u0435\u0439 \u0441\u043f\u0440\u0430\u0432\u0430 \/\/ \u041e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f 1  const y = (0x8124 &amp; 0x00f0) >> 4 \/\/ 2 \/\/ (0x8124 &amp; 0x00f0) \u2014 \u044d\u0442\u043e 100000 \u0432 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u043c \u043a\u043e\u0434\u0435 \/\/ \u043f\u0440\u0430\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u043d\u0430 4 (>> 4) \u0443\u0434\u0430\u043b\u0438\u0442 \u0447\u0435\u0442\u044b\u0440\u0435 \u043d\u0443\u043b\u044f \u0441\u043f\u0440\u0430\u0432\u0430 \/\/ \u041e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f 10, \u0442\u043e \u0435\u0441\u0442\u044c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 2<\/code><\/pre>\n<p>  \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 36 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u044f \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u043c, \u043c\u0430\u0441\u043a\u043e\u0439, \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u043c \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438.<\/p>\n<pre><code class=\"javascript\">const instruction = { \u00a0 id: 'ADD_VX_VY', \u00a0 name: 'ADD', \u00a0 mask: 0xf00f, \u00a0 pattern: 0x8004, \u00a0 arguments: [ \u00a0 \u00a0 { mask: 0x0f00, shift: 8, type: 'R' }, \u00a0 \u00a0 { mask: 0x00f0, shift: 4, type: 'R' }, \u00a0 ], }<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u043a\u043e\u0433\u0434\u0430 \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u044d\u0442\u0438 \u043e\u0431\u044a\u0435\u043a\u0442\u044b, \u043a\u0430\u0436\u0434\u044b\u0439 \u043e\u043f\u043a\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043d \u043d\u0430 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440, \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u044b. <\/p>\n<p>  \u042f \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043c\u0430\u0441\u0441\u0438\u0432 <code>INSTRUCTION_SET<\/code>, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0432\u0441\u0435 \u044d\u0442\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0430 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0438 <a href=\"https:\/\/github.com\/taniarascia\/chip8\/blob\/master\/tests\/cpu.test.js\">\u0442\u0435\u0441\u0442\u044b<\/a>, \u0447\u0442\u043e\u0431\u044b \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. \u0412\u043e\u0442 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440:<\/p>\n<pre><code class=\"javascript\">function disassemble(opcode) { \u00a0 \/\/ \u0418\u0449\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0438\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u0431\u0430\u0439\u0442-\u043a\u043e\u0434\u0430 \u00a0 const instruction = INSTRUCTION_SET.find( \u00a0 \u00a0 (instruction) => (opcode &amp; instruction.mask) === instruction.pattern \u00a0 ) \u00a0 \/\/ \u0418\u0449\u0435\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u00a0 const args = instruction.arguments.map( \u00a0 \u00a0 (arg) => (opcode &amp; arg.mask) >> arg.shift \u00a0 )  \u00a0 \/\/ \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u00a0 return { instruction, args } }<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0427\u0442\u0435\u043d\u0438\u0435 \u041f\u0417\u0423<\/h2>\n<p><\/font><br \/>  \u041f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442 \u043a\u0430\u043a \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440, \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u044b\u0439 \u0444\u0430\u0439\u043b Chip-8 \u043c\u043e\u0436\u043d\u043e \u0441\u0447\u0438\u0442\u0430\u0442\u044c \u041f\u0417\u0423. \u041f\u0417\u0423 \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0430 \u043c\u044b \u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0434\u043b\u044f \u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 Chip8 \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u0430 \u041f\u0417\u0423 Chip-8 \u043a\u0430\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436.<\/p>\n<p>  \u0411\u0443\u0444\u0435\u0440 \u041f\u0417\u0423 \u043f\u0440\u0438\u043c\u0435\u0442 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0435\u0433\u043e \u0432 16-\u0431\u0438\u0442\u043d\u044b\u0435 \u0441\u043b\u043e\u0432\u0430 big endian (\u0441\u043b\u043e\u0432\u043e \u2014 \u044d\u0442\u043e \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0430\u044f \u0438\u0437 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0438\u0442\u043e\u0432). \u0412\u043e\u0442 \u0433\u0434\u0435 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043e <a href=\"https:\/\/www.taniarascia.com\/bits-bytes-bases-and-a-hex-dump-javascript\/\">\u0448\u0435\u0441\u0442\u043d\u0430\u0434\u0446\u0430\u0442\u0435\u0440\u0438\u0447\u043d\u043e\u043c \u0434\u0430\u043c\u043f\u0435<\/a>. \u042f \u0441\u043e\u0431\u0438\u0440\u0430\u044e \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438 \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u044e \u0438\u0445 \u0432 \u0431\u043b\u043e\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043c\u043e\u0433\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 16-\u0431\u0438\u0442\u043d\u044b\u0435 \u043e\u043f\u043a\u043e\u0434\u044b. Big endian \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u0441\u0442\u0430\u0440\u0448\u0438\u0439 \u0431\u0430\u0439\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0432\u044b\u043c \u0432 \u0431\u0443\u0444\u0435\u0440\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u0441\u0442\u0440\u0435\u0442\u0438\u0442 \u0434\u0432\u0430 \u0431\u0430\u0439\u0442\u0430 <code>12 34<\/code>, \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0441\u0442 <code>1234<\/code> 16-\u0431\u0438\u0442\u043d\u044b\u0439 \u043a\u043e\u0434. \u041a\u043e\u0434 \u0441 little endian \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0431\u044b \u0442\u0430\u043a: <code>3412<\/code>.<\/p>\n<pre><code class=\"javascript\">class RomBuffer { \u00a0 \/**  \u00a0 * @param {binary} fileContents ROM binary  \u00a0 *\/ \u00a0 constructor(fileContents) { \u00a0 \u00a0 this.data = []  \u00a0 \u00a0 \/\/ \u0427\u0438\u0442\u0430\u0435\u043c \u0441\u044b\u0440\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438\u0437 \u0444\u0430\u0439\u043b\u0430 \u00a0 \u00a0 const buffer = fileContents  \u00a0 \u00a0 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c 16-\u0431\u0438\u0442\u043d\u044b\u0435 \u043e\u043f\u043a\u043e\u0434\u044b big endian \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u00a0 \u00a0 for (let i = 0; i &lt; buffer.length; i += 2) { \u00a0 \u00a0 \u00a0 this.data.push((buffer[i] &lt;&lt; 8) | (buffer[i + 1] &lt;&lt; 0)) \u00a0 \u00a0 } \u00a0 } }<\/code><\/pre>\n<p>  \u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c \u00ab\u0438\u0433\u0440\u0430\u00bb.<\/p>\n<p>  \u0423 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0431\u0443\u0434\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 <code>load()<\/code> \u2014 \u043a\u0430\u043a \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c, \u2014 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0431\u0440\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u0418 \u0431\u0443\u0444\u0435\u0440, \u0438 \u043f\u0430\u043c\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 JavaScript \u043a\u0430\u043a \u043c\u0430\u0441\u0441\u0438\u0432\u044b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0446\u0438\u043a\u043b\u0438\u0447\u0435\u0441\u043a\u043e\u043c\u0443 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0443 \u0431\u0443\u0444\u0435\u0440\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0435\u043d\u0438\u044e \u0431\u0430\u0439\u0442\u043e\u0432 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0426\u0438\u043a\u043b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u2014 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/h2>\n<p><\/font><br \/>  \u0422\u0435\u043f\u0435\u0440\u044c \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0438 \u0438\u0433\u0440\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043a \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0446\u0438\u0438. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0447\u0442\u043e-\u0442\u043e \u0441 \u043d\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c. \u0426\u0438\u043a\u043b <a href=\"https:\/\/en.wikipedia.org\/wiki\/Central_processing_unit#Operation\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438<\/a> \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 \u0442\u0440\u0451\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u2014 \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f.<\/p>\n<ul>\n<li><strong>\u0418\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435 (fetch)<\/strong> \u2014 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u0445\u0441\u044f \u0432 \u043f\u0430\u043c\u044f\u0442\u0438, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<li><strong>\u0414\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/strong> \u2014 \u0440\u0430\u0437\u0431\u043e\u0440 16-\u0431\u0438\u0442\u043d\u043e\u0433\u043e \u043e\u043f\u043a\u043e\u0434\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u0432.<\/li>\n<li><strong>\u0412\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435<\/strong> \u2014 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b.<\/li>\n<\/ul>\n<p>  \u0412\u043e\u0442 \u0441\u0436\u0430\u0442\u0430\u044f \u0438 \u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u0430\u044f \u0432\u0435\u0440\u0441\u0438\u044f \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0446\u0438\u043a\u043b. \u042d\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u044b \u0446\u0438\u043a\u043b\u0430 \u0426\u041f \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u043d\u044b\u043c\u0438 \u0438 \u043d\u0435 \u0440\u0430\u0441\u043a\u0440\u044b\u0432\u0430\u044e\u0442\u0441\u044f.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0448\u0430\u0433, <code>fetch<\/code>, \u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u043e\u043f\u043a\u043e\u0434\u0443 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<pre><code class=\"javascript\">\/\/ \u0411\u0435\u0440\u0451\u043c \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 function fetch() { \u00a0 return memory[PC] }<\/code><\/pre>\n<p>  decode \u0440\u0430\u0437\u0431\u0435\u0440\u0451\u0442 \u043e\u043f\u043a\u043e\u0434 \u043d\u0430 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043a\u043e\u043c\u0430\u043d\u0434:<\/p>\n<pre><code class=\"javascript\">\/\/ \u0414\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e function decode(opcode) { \u00a0 return disassemble(opcode) }<\/code><\/pre>\n<p>  Execute \u0441\u043e\u0441\u0442\u043e\u0438\u0442 \u0438\u0437 <code>switch<\/code> \u0441\u043e \u0432\u0441\u0435\u043c\u0438 36 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 case, \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u0434\u043b\u044f \u043d\u0430\u0439\u0434\u0435\u043d\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0443\u044e \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e, \u043e\u0431\u043d\u043e\u0432\u0438\u0432 \u0437\u0430\u0442\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b, \u0447\u0442\u043e\u0431\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0446\u0438\u043a\u043b \u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0451\u043b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043e\u043f\u043a\u043e\u0434. \u041b\u044e\u0431\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u0437\u0434\u0435\u0441\u044c \u0436\u0435, \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430.<\/p>\n<pre><code class=\"javascript\">\/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e function execute(instruction) { \u00a0 const { id, args } = instruction  \u00a0 switch (id) { \u00a0 \u00a0 case 'ADD_VX_VY': \u00a0 \u00a0 \u00a0 \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00a0 \u00a0 \u00a0 registers[args[0]] += registers[args[1]]  \u00a0 \u00a0 \u00a0 \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u00a0 \u00a0 \u00a0 PC = PC + 2 \u00a0 \u00a0 \u00a0 break \u00a0 \u00a0 case 'SUB_VX_VY': \u00a0 \u00a0 \/\/ \u0438 \u0442 \u0434. \u00a0 } }<\/code><\/pre>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f\u043c\u0438 \u0438 \u0446\u0438\u043a\u043b\u043e\u043c \u043a\u043e\u043c\u0430\u043d\u0434. \u0415\u0441\u0442\u044c \u0434\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430, \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u043d\u0430 CPU, \u2014 <code>load<\/code> \u2014 \u044d\u043a\u0432\u0438\u0432\u0430\u043b\u0435\u043d\u0442 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436\u0430 \u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c \u0441 <code>romBuffer<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0433\u0440\u044b, \u0438 <code>step<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0442\u0440\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 (\u0438\u0437\u0432\u043b\u0435\u0447\u0435\u043d\u0438\u0435, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435). <code>step<\/code> \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<pre><code class=\"javascript\">class CPU { \u00a0 constructor() { \u00a0 \u00a0 this.memory = new Uint8Array(4096) \u00a0 \u00a0 this.registers = new Uint8Array(16) \u00a0 \u00a0 this.stack = new Uint16Array(16) \u00a0 \u00a0 this.ST = 0 \u00a0 \u00a0 this.DT = 0 \u00a0 \u00a0 this.I = 0 \u00a0 \u00a0 this.SP = -1 \u00a0 \u00a0 this.PC = 0x200 \u00a0 }  \u00a0 \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0431\u0443\u0444\u0435\u0440 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u00a0 load(romBuffer) { \u00a0 \u00a0 this.reset()  \u00a0 \u00a0 romBuffer.forEach((opcode, i) => { \u00a0 \u00a0 \u00a0 this.memory[i] = opcode \u00a0 \u00a0 }) \u00a0 }  \u00a0 \/\/ \u0428\u0430\u0433 \u043f\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c \u00a0 step() { \u00a0 \u00a0 const opcode = this._fetch() \u00a0 \u00a0 const instruction = this._decode(opcode)  \u00a0 \u00a0 this._execute(instruction) \u00a0 }  \u00a0 _fetch() { \u00a0 \u00a0 return this.memory[this.PC] \u00a0 }  \u00a0 _decode(opcode) { \u00a0 \u00a0 return disassemble(opcode) \u00a0 }  \u00a0 _execute(instruction) { \u00a0 \u00a0 const { id, args } = instruction  \u00a0 \u00a0 switch (id) { \u00a0 \u00a0 \u00a0 case 'ADD_VX_VY': \u00a0 \u00a0 \u00a0 \u00a0 this.registers[args[0]] += this.registers[args[1]] \u00a0 \u00a0 \u00a0 \u00a0 this.PC = this.PC + 2 \u00a0 \u00a0 \u00a0 \u00a0 break \u00a0 \u00a0 } \u00a0 } }<\/code><\/pre>\n<p>  \u0421\u0435\u0439\u0447\u0430\u0441 \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u043d\u043e\u0433\u043e \u2014 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0426\u041f \u0434\u043b\u044f \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430<\/h2>\n<p><\/font><br \/>  \u0418\u0442\u0430\u043a, \u0443 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u0442 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u0442 \u0432\u0441\u0435 \u0441\u0432\u043e\u0438 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f, \u043d\u043e \u044f \u0435\u0449\u0451 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u043c\u043e\u0433\u0443 \u0441 \u043d\u0438\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  \u0418\u043c\u0435\u043d\u043d\u043e \u0437\u0434\u0435\u0441\u044c \u0432 \u0434\u0435\u043b\u043e \u0432\u0441\u0442\u0443\u043f\u0430\u0435\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Input\/output\">\u0432\u0432\u043e\u0434\/\u0432\u044b\u0432\u043e\u0434<\/a> \u2014 \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u0438 \u0432\u043d\u0435\u0448\u043d\u0438\u043c \u043c\u0438\u0440\u043e\u043c.<\/p>\n<ul>\n<li><strong>\u0412\u0432\u043e\u0434<\/strong> \u2014 \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c.<\/li>\n<li><strong>\u0412\u044b\u0432\u043e\u0434<\/strong> \u2014 \u044d\u0442\u043e \u0434\u0430\u043d\u043d\u044b\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c.<\/li>\n<\/ul>\n<p>  \u0412\u0432\u043e\u0434 \u0431\u0443\u0434\u0435\u0442 \u0441 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b, \u0432\u044b\u0432\u043e\u0434 \u2014 \u0432 \u0432\u0438\u0434\u0435 \u0433\u0440\u0430\u0444\u0438\u043a\u0438.<\/p>\n<p>  \u042f \u043c\u043e\u0433\u043b\u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043c\u0435\u0448\u0430\u0442\u044c \u043a\u043e\u0434 \u0432\u0432\u043e\u0434\u0430-\u0432\u044b\u0432\u043e\u0434\u0430 \u0441 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043d\u043e \u0442\u043e\u0433\u0434\u0430 \u044f \u0431\u044b\u043b\u0430 \u0431\u044b \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d \u043a \u043e\u0434\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435. \u0421\u043e\u0437\u0434\u0430\u0432 \u043e\u0431\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 CPU \u0434\u043b\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430 \u0438 CPU, \u044f \u043c\u043e\u0433\u0443 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0441 \u043b\u044e\u0431\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439.<\/p>\n<p>  \u041f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u2014 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0438 \u043d\u0430\u0439\u0442\u0438 \u0442\u0435, \u0447\u0442\u043e \u0438\u043c\u0435\u044e\u0442 \u043e\u0442\u043d\u043e\u0448\u0435\u043d\u0438\u0435 \u043a \u0432\u0432\u043e\u0434\u0443\/\u0432\u044b\u0432\u043e\u0434\u0443. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0442\u0430\u043a\u0438\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439:<\/p>\n<ul>\n<li><code>CLS<\/code> \u2014 \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u044d\u043a\u0440\u0430\u043d.<\/li>\n<li><code>LD Vx, K<\/code> \u2014 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0432 Vx.<\/li>\n<li><code>DRW Vx, Vy, nibble<\/code> \u2014 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 n-\u0431\u0430\u0439\u0442\u043e\u0432\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430, \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0432 \u044f\u0447\u0435\u0439\u043a\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 I.<\/li>\n<\/ul>\n<p>  \u0418\u0441\u0445\u043e\u0434\u044f \u0438\u0437 \u044d\u0442\u043e\u0433\u043e, \u043c\u044b \u0445\u043e\u0442\u0438\u043c, \u0447\u0442\u043e\u0431\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u043c\u0435\u043b \u0442\u0430\u043a\u0438\u0435 \u043c\u0435\u0442\u043e\u0434\u044b:<\/p>\n<ul>\n<li><code>clearDisplay()<\/code>.<\/li>\n<li><code>waitKey()<\/code>.<\/li>\n<li><code>drawPixel()<\/code> (<code>drawSprite<\/code> \u0431\u044b\u043b\u043e \u0431\u044b 1:1, \u043d\u043e \u0432 \u0438\u0442\u043e\u0433\u0435 \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043f\u0440\u043e\u0449\u0435 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e \u0438\u0437 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430).<\/li>\n<\/ul>\n<p>  \u0412 JavaScript \u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u0430\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430, \u043d\u043e \u044f \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0438\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u043e\u0432\u0430\u043d, \u0441 \u043c\u0435\u0442\u043e\u0434\u0430\u043c\u0438, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u043c\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u043a\u043b\u0430\u0441\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u044e\u0442 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441. \u0412\u043e\u0442 \u0432\u0441\u0435 \u043c\u0435\u0442\u043e\u0434\u044b \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430:<\/p>\n<pre><code class=\"javascript\">\/\/ \u0410\u0431\u0441\u0442\u0440\u0430\u043a\u0442\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 CPU class CpuInterface { \u00a0 constructor() { \u00a0 \u00a0 if (new.target === CpuInterface) { \u00a0 \u00a0 \u00a0 throw new TypeError('Cannot instantiate abstract class') \u00a0 \u00a0 } \u00a0 }  \u00a0 clearDisplay() { \u00a0 \u00a0 throw new TypeError('Must be implemented on the inherited class.') \u00a0 }  \u00a0 waitKey() { \u00a0 \u00a0 throw new TypeError('Must be implemented on the inherited class.') \u00a0 }  \u00a0 getKeys() { \u00a0 \u00a0 throw new TypeError('Must be implemented on the inherited class.') \u00a0 }  \u00a0 drawPixel() { \u00a0 \u00a0 throw new TypeError('Must be implemented on the inherited class.') \u00a0 }  \u00a0 enableSound() { \u00a0 \u00a0 throw new TypeError('Must be implemented on the inherited class.') \u00a0 }  \u00a0 disableSound() { \u00a0 \u00a0 throw new TypeError('Must be implemented on the inherited class.') \u00a0 } }<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c: \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d \u0432 CPU \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u0438 CPU \u0441\u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0435\u0433\u043e \u043c\u0435\u0442\u043e\u0434\u0430\u043c.<\/p>\n<pre><code class=\"javascript\">class CPU { \u00a0 \/\/ \u0418\u043d\u0441\u0442\u0430\u043d\u0446\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u00a0 constructor(cpuInterface) { \u00a0 \u00a0 this.interface = cpuInterface \u00a0 }  \u00a0 _execute(instruction) { \u00a0 \u00a0 const { id, args } = instruction  \u00a0 \u00a0 switch (id) { \u00a0 \u00a0 \u00a0 case 'CLS': \u00a0 \u00a0 \u00a0 \u00a0 \/\/ \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00a0 \u00a0 \u00a0 \u00a0 this.interface.clearDisplay() \u00a0 } }<\/code><\/pre>\n<p>  \u041f\u0435\u0440\u0435\u0434 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 (\u0432\u0435\u0431, \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b \u0438\u043b\u0438 \u043d\u0430\u0442\u0438\u0432\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430) \u044f \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u0435\u0433\u043e \u043c\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432. \u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u043e\u043d \u043d\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0451\u043d \u043d\u0438 \u043a \u043a\u0430\u043a\u043e\u043c\u0443 \u0432\u0432\u043e\u0434\u0443\/\u0432\u044b\u0432\u043e\u0434\u0443, \u043d\u043e \u043e\u043d \u043f\u043e\u043c\u043e\u0433 \u043c\u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u043a \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u042f \u043f\u0440\u043e\u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u044e \u0437\u0432\u0443\u043a\u043e\u0432\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 \u043d\u0435\u0442 \u0432\u044b\u0445\u043e\u0434\u0430 \u043d\u0430 \u0434\u0438\u043d\u0430\u043c\u0438\u043a\u0438. \u041e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 \u0438 \u044d\u043a\u0440\u0430\u043d.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u042d\u043a\u0440\u0430\u043d<\/h2>\n<p><\/font><br \/>  \u042d\u043a\u0440\u0430\u043d \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u0435 64 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u0448\u0438\u0440\u0438\u043d\u0443 \u043d\u0430 32 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0432 \u0432\u044b\u0441\u043e\u0442\u0443. \u0418\u0442\u0430\u043a, \u0447\u0442\u043e \u043a\u0430\u0441\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430, \u0442\u043e \u044d\u0442\u043e 64&#215;32 \u0441\u0435\u0442\u043a\u0430 \u0431\u0438\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0438\u0431\u043e \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b, \u043b\u0438\u0431\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u044b. \u0427\u0442\u043e\u0431\u044b \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u044d\u043a\u0440\u0430\u043d, \u044f \u043c\u043e\u0433\u0443 \u043f\u0440\u043e\u0441\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c 3D-\u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0443\u043b\u0435\u0439, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044f \u0432\u0441\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c\u0438. \u0411\u0443\u0444\u0435\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Framebuffer\">\u043a\u0430\u0434\u0440\u0430<\/a> \u2014 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u0438, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0440\u0430\u0441\u0442\u0440\u043e\u0432\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0432\u0435\u0434\u0435\u043d\u043e \u043d\u0430 \u0434\u0438\u0441\u043f\u043b\u0435\u0439.<\/p>\n<pre><code class=\"javascript\">\/\/ \u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f class MockCpuInterface extends CpuInterface { \u00a0 constructor() { \u00a0 \u00a0 super()  \u00a0 \u00a0 \/\/ \u0425\u0440\u0430\u043d\u0438\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u044d\u043a\u0440\u0430\u043d\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440\u0435 \u043a\u0430\u0434\u0440\u043e\u0432 \u00a0 \u00a0 this.frameBuffer = this.createFrameBuffer() \u00a0 }  \u00a0 \/\/ \u0421\u043e\u0437\u0434\u0430\u0451\u043c 3D \u043c\u0430\u0441\u0441\u0438\u0432 \u043d\u0443\u043b\u0435\u0439 \u00a0 createFrameBuffer() { \u00a0 \u00a0 let frameBuffer = []  \u00a0 \u00a0 for (let i = 0; i &lt; 32; i++) { \u00a0 \u00a0 \u00a0 frameBuffer.push([]) \u00a0 \u00a0 \u00a0 for (let j = 0; j &lt; 64; j++) { \u00a0 \u00a0 \u00a0 \u00a0 frameBuffer[i].push(0) \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 }  \u00a0 \u00a0 return frameBuffer \u00a0 }  \u00a0 \/\/ \u041e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u044c (0 \u0438\u043b\u0438 1) \u00a0 drawPixel(x, y, value) { \u00a0 \u00a0 this.frameBuffer[y][x] ^= value \u00a0 } }<\/code><\/pre>\n<p>  \u0412 \u0438\u0442\u043e\u0433\u0435 \u0432 \u0441\u043c\u044b\u0441\u043b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u044f \u043f\u043e\u043b\u0443\u0447\u0430\u044e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u044d\u0442\u043e\u0433\u043e:<\/p>\n<pre><code class=\"javascript\">0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 0000000000000000000000000000000000000000000000000000000000000000 \u0438 \u0442.\u0434.<\/code><\/pre>\n<p>  \u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 <code>DRW<\/code> \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u0440\u043e\u0439\u0434\u0451\u0442\u0441\u044f \u043f\u043e \u0438\u0437\u0432\u043b\u0435\u0447\u0451\u043d\u043d\u043e\u043c\u0443 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438 \u0441\u043f\u0440\u0430\u0439\u0442\u0443 \u0438 \u043e\u0431\u043d\u043e\u0432\u0438\u0442 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0432 \u043d\u0451\u043c. \u0414\u0435\u0442\u0430\u043b\u0438 \u043e\u043f\u0443\u0449\u0435\u043d\u044b \u0434\u043b\u044f \u043a\u0440\u0430\u0442\u043a\u043e\u0441\u0442\u0438.<\/p>\n<pre><code class=\"javascript\">case 'DRW_VX_VY_N': \u00a0 \/\/ \u0418\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 n \u0431\u0430\u0439\u0442 \u0438\u0437 \u043f\u0430\u043c\u044f\u0442\u0438, \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 \u0430\u0434\u0440\u0435\u0441\u0430 \u0432 I \u00a0 for (let i = 0; i &lt; args[2]; i++) { \u00a0 \u00a0 let line = this.memory[this.I + i] \u00a0 \u00a0 \u00a0 \/\/ \u041a\u0430\u0436\u0434\u044b\u0439 \u0431\u0430\u0439\u0442 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0443 \u0438\u0437 \u0432\u043e\u0441\u044c\u043c\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u00a0 \u00a0 \u00a0 for (let position = 0; position &lt; 8; position++) { \u00a0 \u00a0 \u00a0 \u00a0 \/\/ ...\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, x, \u0438 y... \u00a0 \u00a0 \u00a0 \u00a0 this.interface.drawPixel(x, y, value) \u00a0 \u00a0 \u00a0 } \u00a0 \u00a0 }<\/code><\/pre>\n<p>  \u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>clearDisplay()<\/code> \u2014 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u044d\u043a\u0440\u0430\u043d\u043e\u043c. \u042d\u0442\u043e \u0432\u0441\u0451, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041a\u043b\u0430\u0432\u0438\u0448\u0438<\/h2>\n<p><\/font><br \/>  \u042f \u0441\u043e\u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0443 \u0441\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0435\u0442\u043a\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448:<\/p>\n<pre><code class=\"plaintext\">\u250c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2510 \u2502 1 \u2502 2 \u2502 3 \u2502 4 \u2502 \u2502 Q \u2502 W \u2502 E \u2502 R \u2502 \u2502 A \u2502 S \u2502 D \u2502 F \u2502 \u2502 Z \u2502 X \u2502 C \u2502 V \u2502 \u2514\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2534\u2500\u2500\u2500\u2518<\/code><\/pre>\n<p>  \u0418 \u043f\u043e\u043c\u0435\u0441\u0442\u0438\u043b\u0430 \u043a\u043b\u044e\u0447\u0438 \u0432 \u043c\u0430\u0441\u0441\u0438\u0432.<\/p>\n<pre><code class=\"javascript\">\/\/ \u043b\u0443\u0447\u0448\u0435 \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c const keyMap = [ \u00a0 '1', '2', '3', '4', \u00a0 'q', 'w', 'e', 'r',  \u00a0 'a', 's', 'd', 'f',  \u00a0 'z', 'x', 'c', 'v' ]<\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0442\u0435\u043a\u0443\u0449\u0438\u0445 \u043d\u0430\u0436\u0430\u0442\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 \u043e\u043f\u0438\u0448\u0438\u0442\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">this.keys = 0 <\/code><\/pre>\n<p>  \u0412 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435 <code>keys<\/code> \u2014 \u044d\u0442\u043e \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0438\u0437 16 \u0446\u0438\u0444\u0440, \u0438\u043d\u0434\u0435\u043a\u0441 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u043b\u0430\u0432\u0438\u0448\u0443. Chip-8 \u043f\u0440\u043e\u0441\u0442\u043e \u0445\u043e\u0447\u0435\u0442 \u0437\u043d\u0430\u0442\u044c, \u043a\u0430\u043a\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043d\u0430\u0436\u0430\u0442\u044b, \u0438 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0440\u0435\u0448\u0435\u043d\u0438\u0435:<\/p>\n<pre><code class=\"javascript\">0b1000000000000000 \/\/ V \u043d\u0430\u0436\u0430\u0442\u0430 (keyMap[15], \u0438\u043b\u0438 \u0438\u043d\u0434\u0435\u043a\u0441 15) 0b0000000000000011 \/\/ 1 \u0438 2 \u043d\u0430\u0436\u0430\u0442\u044b (index 0, 1) 0b0000000000110000 \/\/ Q \u0438 W \u043d\u0430\u0436\u0430\u0442\u044b (index 4, 5)<\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0435\u0441\u043b\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043d\u0430\u0436\u0430\u0442\u0430 <code>V<\/code> (<code>keyMap[15]<\/code>) \u0438 \u043e\u043f\u0435\u0440\u0430\u043d\u0434 \u2014 <code>0xf<\/code> (\u0434\u0435\u0441\u044f\u0442\u0438\u0447\u043d\u043e\u0435 <code>15<\/code>), \u0442\u043e \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u043d\u0430\u0436\u0430\u0442\u0430. \u041b\u0435\u0432\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 (<code>&lt;&lt;<\/code>) \u0438 <code>1<\/code> \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0434\u0432\u043e\u0438\u0447\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e \u0441 <code>1<\/code>, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0443\u043b\u0435\u0439, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043b\u0435\u0432\u043e\u043c \u0441\u0434\u0432\u0438\u0433\u0435.<\/p>\n<pre><code class=\"javascript\">case 'SKP_VX': \u00a0 \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e, \u0435\u0441\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u0430 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u0441\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c VX \u00a0 if (this.interface.getKeys() &amp; (1 &lt;&lt; this.registers[args[0]])) {  \u00a0 \/\/ \u041f\u0440\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u00a0 } else { \u00a0 \u00a0 \/\/ \u0418\u0434\u0451\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u00a0 }<\/code><\/pre>\n<p>  \u0415\u0441\u0442\u044c \u0435\u0449\u0451 \u043e\u0434\u0438\u043d \u043c\u0435\u0442\u043e\u0434 \u043a\u043b\u0430\u0432\u0438\u0448, <code>waitKey<\/code>, \u0433\u0434\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0435 \u044d\u0442\u043e\u0439 \u043d\u0430\u0436\u0430\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u0438\u0448\u0438.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 CLI \u2014 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u043e\u043c<\/h2>\n<p><\/font><br \/>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0441\u0434\u0435\u043b\u0430\u043b\u0430, \u0431\u044b\u043b \u0434\u043b\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043c\u043d\u0435 \u043d\u0435 \u0442\u0430\u043a \u0437\u043d\u0430\u043a\u043e\u043c\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 DOM: \u044f \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u043b\u043e\u0436\u043d\u043e.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/qd\/ek\/-w\/qdek-w_vvorsivilu3-q-tzjaac.png\" width=\"780\" data-src=\"https:\/\/habrastorage.org\/webt\/qd\/ek\/-w\/qdek-w_vvorsivilu3-q-tzjaac.png\"\/><\/p>\n<p>  <a href=\"https:\/\/en.wikipedia.org\/wiki\/Curses_(programming_library)\">Curses<\/a> \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u0430\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u0432 \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435. <a href=\"https:\/\/github.com\/chjj\/blessed\">Blessed<\/a> \u2014 \u044d\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430, \u043e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0430\u044f curses \u0434\u043b\u044f Node.js.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u042d\u043a\u0440\u0430\u043d<\/h2>\n<p><\/font><br \/>  \u0411\u0443\u0444\u0435\u0440 \u043a\u0430\u0434\u0440\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u044d\u043a\u0440\u0430\u043d\u0430, \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0439, \u043d\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u044b \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u0441 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0440\u0435\u0434\u043e\u0439 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0437\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>  \u0421 \u043f\u043e\u043c\u043e\u0449\u044c\u044e <code>blessed<\/code> \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u043a\u0440\u0430\u043d\u0430:<\/p>\n<pre><code class=\"javascript\">this.screen = blessed.screen({ smartCSR: true }) <\/code><\/pre>\n<p>  \u0418 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 <code>fillRegion<\/code> \u0438\u043b\u0438 <code>clearRegion<\/code> \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u0435 \u0441 \u043f\u043e\u043b\u043d\u044b\u043c \u0431\u043b\u043e\u043a\u043e\u043c \u044e\u043d\u0438\u043a\u043e\u0434\u0430, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0435\u0433\u043e c <code>frameBuffer<\/code> \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<pre><code class=\"javascript\">drawPixel(x, y, value) { \u00a0 this.frameBuffer[y][x] ^= value  \u00a0 if (this.frameBuffer[y][x]) { \u00a0 \u00a0 this.screen.fillRegion(this.color, '\u2588', x, x + 1, y, y + 1) \u00a0 } else { \u00a0 \u00a0 this.screen.clearRegion(x, x + 1, y, y + 1) \u00a0 }  \u00a0 this.screen.render() }<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041a\u043b\u0430\u0432\u0438\u0448\u0438<\/h2>\n<p><\/font><br \/>  \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043b\u0430\u0432\u0438\u0448 \u043d\u0435 \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0441\u044f \u043e\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0432 DOM. \u0415\u0441\u043b\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u043d\u0430\u0436\u0430\u0442\u0430, \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u0442 \u043a\u043b\u044e\u0447, \u0437\u0430\u0442\u0435\u043c \u044f \u043c\u043e\u0433\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u043b\u044f \u043f\u043e\u0438\u0441\u043a\u0430 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 keys \u0441 \u043b\u044e\u0431\u044b\u043c\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044b.<\/p>\n<pre><code class=\"javascript\">this.screen.on('keypress', (_, key) => { \u00a0 const keyIndex = keyMap.indexOf(key.full)  \u00a0 if (keyIndex) { \u00a0 \u00a0 this._setKeys(keyIndex) \u00a0 } })<\/code><\/pre>\n<p>  \u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0439 \u0432\u0435\u0449\u044c\u044e \u0431\u044b\u043b\u043e \u0442\u043e, \u0447\u0442\u043e \u0443 <code>blessed<\/code> \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e <code>keyup<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u044f \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e, \u0437\u0430\u0434\u0430\u0432 \u0438\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043a\u043b\u0430\u0432\u0438\u0448.<\/p>\n<pre><code class=\"javascript\">setInterval(() => { \u00a0 \/\/ \u042d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c keyup, \u0447\u0442\u043e\u0431\u044b \u043e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0432\u0441\u0435 \u043d\u0430\u0436\u0430\u0442\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u00a0 this._resetKeys() }, 100)<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430<\/h2>\n<p><\/font><br \/>  \u0412\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e \u2014 \u0431\u0443\u0444\u0435\u0440 rom \u0434\u043b\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0432 \u043e\u043f\u043a\u043e\u0434\u044b, \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0432\u0432\u043e\u0434\u0430\/\u0432\u044b\u0432\u043e\u0434\u0430, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435, \u0446\u0438\u043a\u043b \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u0434\u0432\u0430 \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u0430 \u2014 \u043e\u0434\u0438\u043d \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0438\u0433\u0440\u044b, \u0434\u0440\u0443\u0433\u043e\u0439 \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0446\u0438\u043a\u043b\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043e\u0437\u0434\u0430\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>cycle<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u043c \u0446\u0438\u043a\u043b\u0435.<\/p>\n<pre><code class=\"javascript\">const fs = require('fs') const { CPU } = require('..\/classes\/CPU') const { RomBuffer } = require('..\/classes\/RomBuffer') const { \u00a0 TerminalCpuInterface, } = require('..\/classes\/interfaces\/TerminalCpuInterface')  \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u041f\u0417\u0423 const fileContents = fs.readFileSync(process.argv.slice(2)[0])  \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 const cpuInterface = new TerminalCpuInterface()  \/\/ \u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c CPU \u0441 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u043e\u043c const cpu = new CPU(cpuInterface)  \/\/ \u041f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u043c \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043e\u043f\u043a\u043e\u0434\u044b const romBuffer = new RomBuffer(fileContents)  \/\/ \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0433\u0440\u0443 cpu.load(romBuffer)  function cycle() { \u00a0 cpu.step()  \u00a0 setTimeout(cycle, 3) }  cycle()<\/code><\/pre>\n<p>  <i>\u0412 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0446\u0438\u043a\u043b\u0430 \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0442\u0430\u0439\u043c\u0435\u0440 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u0438, \u043d\u043e \u044f \u0443\u0434\u0430\u043b\u0438\u043b\u0430 \u0435\u0433\u043e \u0438\u0437 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0434\u043b\u044f \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e\u0441\u0442\u0438.<\/i><\/p>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c, \u0447\u0442\u043e\u0431\u044b \u0438\u0433\u0440\u0430\u0442\u044c, \u044f \u043c\u043e\u0433\u0443 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0442\u043e\u0447\u043a\u0438 \u0432\u0445\u043e\u0434\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c ROM \u043a\u0430\u043a \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442.<\/p>\n<pre><code class=\"javascript\">npm run play:terminal roms\/PONG <\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0412\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043e\u043c<\/h2>\n<p><\/font><br \/>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u044f \u0441\u043e\u0437\u0434\u0430\u043b\u0430, \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0432\u0435\u0431\u0430. \u042f \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u044d\u0442\u0443 \u0432\u0435\u0440\u0441\u0438\u044e \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0438\u0447\u0443\u0434\u043b\u0438\u0432\u043e\u0439, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u2014 \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u0430\u044f \u0434\u043b\u044f \u043c\u0435\u043d\u044f \u0441\u0440\u0435\u0434\u0430, \u0438 \u044f \u043d\u0435 \u043c\u043e\u0433\u0443 \u0443\u0441\u0442\u043e\u044f\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0436\u0435\u043b\u0430\u043d\u0438\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0430\u0439\u0442\u044b \u0432 \u0441\u0442\u0438\u043b\u0435 \u0440\u0435\u0442\u0440\u043e. \u041e\u043d \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u0438\u0433\u0440\u0430\u043c\u0438.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/ti\/29\/e3\/ti29e3mwroydtijrndemrxjur2q.png\" width=\"780\" data-src=\"https:\/\/habrastorage.org\/webt\/ti\/29\/e3\/ti29e3mwroydtijrndemrxjur2q.png\"\/><\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u042d\u043a\u0440\u0430\u043d<\/h2>\n<p><\/font><br \/>  \u0414\u043b\u044f \u044d\u043a\u0440\u0430\u043d\u0430 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/Canvas_API\">Canvas API<\/a> \u0438 \u0435\u0433\u043e <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/API\/CanvasRenderingContext2D\">CanvasRenderingContext2D<\/a> \u0434\u043b\u044f \u043f\u043e\u0432\u0435\u0440\u0445\u043d\u043e\u0441\u0442\u0438 \u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0438\u044f. <code>fillRect<\/code> \u0438 canvas \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0442\u043e \u0436\u0435, \u0447\u0442\u043e <code>fillRegion<\/code> \u0432 <code>blessed<\/code>.<\/p>\n<pre><code class=\"javascript\">this.screen = document.querySelector('canvas') this.context = this.screen.getContext('2d') this.context.fillStyle = 'black' this.context.fillRect(0, 0, this.screen.width, this.screen.height)<\/code><\/pre>\n<p>  \u041e\u0434\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0435 \u043e\u0442\u043b\u0438\u0447\u0438\u0435: \u044f \u0443\u043c\u043d\u043e\u0436\u0438\u043b\u0430 \u0432\u0441\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043d\u0430 10, \u0447\u0442\u043e\u0431\u044b \u044d\u043a\u0440\u0430\u043d \u0441\u0442\u0430\u043b \u0437\u0430\u043c\u0435\u0442\u043d\u0435\u0435.<\/p>\n<pre><code class=\"javascript\">this.multiplier = 10 this.screen.width = DISPLAY_WIDTH * this.multiplier this.screen.height = DISPLAY_HEIGHT * this.multiplier<\/code><\/pre>\n<p>  \u042d\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <code>drawPixel<\/code> \u0431\u043e\u043b\u0435\u0435 \u043c\u043d\u043e\u0433\u043e\u0441\u043b\u043e\u0432\u043d\u043e\u0439, \u043d\u043e \u0432 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u0435\u0436\u043d\u0435\u0439.<\/p>\n<pre><code class=\"javascript\">drawPixel(x, y, value) { \u00a0 this.frameBuffer[y][x] ^= value  \u00a0 if (this.frameBuffer[y][x]) { \u00a0 \u00a0 this.context.fillStyle = COLOR \u00a0 \u00a0 this.context.fillRect( \u00a0 \u00a0 \u00a0 x * this.multiplier, \u00a0 \u00a0 \u00a0 y * this.multiplier, \u00a0 \u00a0 \u00a0 this.multiplier, \u00a0 \u00a0 \u00a0 this.multiplier \u00a0 \u00a0 ) \u00a0 } else { \u00a0 \u00a0 this.context.fillStyle = 'black' \u00a0 \u00a0 this.context.fillRect( \u00a0 \u00a0 \u00a0 x * this.multiplier, \u00a0 \u00a0 \u00a0 y * this.multiplier, \u00a0 \u00a0 \u00a0 this.multiplier, \u00a0 \u00a0 \u00a0 this.multiplier \u00a0 \u00a0 ) \u00a0 } }<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041a\u043b\u0430\u0432\u0438\u0448\u0438<\/h2>\n<p><\/font><br \/>  \u0423 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435\u043c\u0443 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043a\u043b\u0430\u0432\u0438\u0448 \u0432 DOM, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043c\u043e\u0433\u043b\u0430 \u043b\u0435\u0433\u043a\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f <code>keyup<\/code> \u0438 <code>keydown<\/code>.<\/p>\n<pre><code class=\"javascript\">\/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043d\u0435\u043d\u0430\u0436\u0430\u0442\u044b\u043c\u0438 document.addEventListener('keydown', event => { \u00a0 const keyIndex = keyMap.indexOf(event.key)  \u00a0 if (keyIndex) { \u00a0 \u00a0 this._setKeys(keyIndex) \u00a0 } })  \/\/ \u0421\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u043c \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u043f\u043e \u043d\u0430\u0436\u0430\u0442\u0438\u044e document.addEventListener('keyup', event => { \u00a0 this._resetKeys() }) }<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430<\/h2>\n<p><\/font><br \/>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u043e\u0434\u0443\u043b\u044f\u043c\u0438 \u044f \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043b\u0430 \u0432\u0441\u0435 \u043c\u043e\u0434\u0443\u043b\u0438 \u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0430 \u0438\u0445 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u0430 \u0437\u0430\u0442\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 <a href=\"http:\/\/browserify.org\/\">Browserify<\/a> \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0438\u0445 \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0435 \u0434\u0435\u043b\u0430\u0435\u0442 \u0438\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0432 \u043e\u043a\u043d\u0435, \u0447\u0442\u043e\u0431\u044b \u044f \u043c\u043e\u0433\u043b\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432\u044b\u0432\u043e\u0434 \u043a\u043e\u0434\u0430 \u0432 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Webpack \u0438\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435, \u043d\u043e \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b\u0441\u0442\u0440\u043e \u0438 \u043f\u0440\u043e\u0441\u0442\u043e.<\/p>\n<pre><code class=\"javascript\">const { CPU } = require('..\/classes\/CPU') const { RomBuffer } = require('..\/classes\/RomBuffer') const { WebCpuInterface } = require('..\/classes\/interfaces\/WebCpuInterface')  const cpuInterface = new WebCpuInterface() const cpu = new CPU(cpuInterface)  \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0431\u0443\u0444\u0435\u0440 CPU \u0438 ROM \u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u043d\u0435\u0442 \u043e\u043a\u043d\u043e\u043c \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435. global.cpu = cpu global.RomBuffer = RomBuffer<\/code><\/pre>\n<p>  \u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430 \u0432 \u0432\u0435\u0431 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0442\u0443 \u0436\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>cycle<\/code>, \u0447\u0442\u043e \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430, \u043d\u043e \u0438\u043c\u0435\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u041f\u0417\u0423 \u0438 \u0441\u0431\u0440\u043e\u0441\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u0438\u0441\u043f\u043b\u0435\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0435 \u041f\u0417\u0423. \u042f \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 json \u0434\u0430\u043d\u043d\u044b\u043c\u0438 \u0438 fetch, \u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u043b\u0430 \u043d\u0435\u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043d\u043d\u044b\u0439 <code>arrayBuffer<\/code> \u0438\u0437 \u043e\u0442\u0432\u0435\u0442\u0430.<\/p>\n<pre><code class=\"javascript\">\/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c \u041f\u0417\u0423 \u0438 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c \u0438\u0433\u0440\u0443 async function loadRom() { \u00a0 const rom = event.target.value \u00a0 const response = await fetch(`.\/roms\/${rom}`) \u00a0 const arrayBuffer = await response.arrayBuffer() \u00a0 const uint8View = new Uint8Array(arrayBuffer) \u00a0 const romBuffer = new RomBuffer(uint8View)  \u00a0 cpu.interface.clearDisplay() \u00a0 cpu.load(romBuffer) }  \/\/ \u0414\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0438\u0433\u0440\u0443 document.querySelector('select').addEventListener('change', loadRom)<\/code><\/pre>\n<p>  HTML \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 <code>canvas<\/code> \u0438 <code>select<\/code>.<\/p>\n<pre><code class=\"html\">&lt;canvas>&lt;\/canvas> &lt;select> \u00a0 &lt;option disabled selected>Load ROM...&lt;\/option> \u00a0 &lt;option value=\"CONNECT4\">Connect4&lt;\/option> \u00a0 &lt;option value=\"PONG\">Pong&lt;\/option> &lt;\/select><\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043a\u043e\u0434 \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u0445 GitHub, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043e\u043d \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u2014 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0441 \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u043e\u0439<\/h2>\n<p><\/font><br \/>  \u042f \u0442\u0430\u043a\u0436\u0435 \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u0443\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e UI. \u042f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430 <a href=\"https:\/\/www.raylib.com\/\">Raylib<\/a> \u0434\u043b\u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0438\u0433\u0440, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u043c\u0435\u043b\u0430 \u0431\u0438\u043d\u0434\u0438\u043d\u0433 \u0434\u043b\u044f <a href=\"https:\/\/github.com\/RobLoach\/node-raylib\">Node.js<\/a>.<\/p>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/by\/ve\/wc\/byvewcvapx4od6m1dcbbilfjhbi.png\" width=\"780\" data-src=\"https:\/\/habrastorage.org\/webt\/by\/ve\/wc\/byvewcvapx4od6m1dcbbilfjhbi.png\"\/><\/p>\n<p>  \u042f \u0441\u0447\u0438\u0442\u0430\u044e \u044d\u0442\u0443 \u0432\u0435\u0440\u0441\u0438\u044e \u044d\u043a\u0441\u043f\u0435\u0440\u0438\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0439 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043e\u043d\u0430 \u043e\u0447\u0435\u043d\u044c \u043c\u0435\u0434\u043b\u0435\u043d\u043d\u0430\u044f \u043f\u043e \u0441\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u044e \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u043d\u0430 \u043c\u0435\u043d\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u0430 \u0432 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438, \u043d\u043e \u0441 \u043a\u043b\u0430\u0432\u0438\u0448\u0430\u043c\u0438 \u0438 \u044d\u043a\u0440\u0430\u043d\u043e\u043c \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0422\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430<\/h2>\n<p><\/font><br \/>  Raylib \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0430\u0447\u0435, \u0447\u0435\u043c \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0430\u043c\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0446\u0438\u043a\u043b\u0435, \u0430 \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u044f \u043d\u0435 \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e <code>cycle<\/code>.<\/p>\n<pre><code class=\"javascript\">const r = require('raylib')  \/\/ \u041f\u043e\u043a\u0430 \u043e\u043a\u043d\u043e \u043d\u0435 \u0437\u0430\u043a\u0440\u043e\u0435\u0442\u0441\u044f... while (!r.WindowShouldClose()) { \u00a0 \/\/ \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c, \u0434\u0435\u043a\u043e\u0434\u0438\u0440\u0443\u0435\u043c, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u00a0 cpu.step()  \u00a0 r.BeginDrawing() \u00a0 \/\/ \u041e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u044d\u043a\u0440\u0430\u043d \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u00a0 r.EndDrawing() }  r.CloseWindow()<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u042d\u043a\u0440\u0430\u043d<\/h2>\n<p><\/font><br \/>  \u0412 \u0440\u0430\u043c\u043a\u0430\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 <code>beginDrawing()<\/code> \u0438 <code>endDrawing()<\/code> \u044d\u043a\u0440\u0430\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c\u0441\u044f. \u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Raylib, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u0441\u0451 \u0432 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435, \u044f \u043e\u0431\u0440\u0430\u0449\u0430\u043b\u0430\u0441\u044c \u043a \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0441\u043a\u0440\u0438\u043f\u0442\u0430. \u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442.<\/p>\n<pre><code class=\"javascript\">r.BeginDrawing()  cpu.interface.frameBuffer.forEach((y, i) => { \u00a0 y.forEach((x, j) => { \u00a0 \u00a0 if (x) { \u00a0 \u00a0 \u00a0 r.DrawRectangleRec({ x, y, width, height }, r.GREEN) \u00a0 \u00a0 } else { \u00a0 \u00a0 \u00a0 r.DrawRectangleRec({ x, y, width, height }, r.BLACK) \u00a0 \u00a0 } \u00a0 }) })  r.EndDrawing()<\/code><\/pre>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u041a\u043b\u0430\u0432\u0438\u0448\u0438<\/h2>\n<p><\/font><br \/>  \u0417\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 Raylib \u2014 \u044d\u0442\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435, \u043d\u0430\u0434 \u0447\u0435\u043c \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430. \u041c\u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u0451 \u0432 \u043c\u0435\u0442\u043e\u0434\u0435 <code>IsKeyDown<\/code> \u2014 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u043b \u043c\u0435\u0442\u043e\u0434 <code>GetKeyPressed<\/code>, \u043d\u043e \u043e\u043d \u0438\u043c\u0435\u043b \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u043b \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u0432\u043c\u0435\u0441\u0442\u043e \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0441\u0442\u043e \u0436\u0434\u0430\u0442\u044c \u043d\u0430\u0436\u0430\u0442\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u0430\u043a \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f\u0445, \u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0441\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u043d\u0430\u0436\u0430\u0442\u044b \u043b\u0438 \u043e\u043d\u0438, \u0438, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0438\u0445 \u0432 \u0431\u0438\u0442\u043e\u0432\u0443\u044e \u043c\u0430\u0441\u043a\u0443 \u043a\u043b\u0430\u0432\u0438\u0448\u0438.<\/p>\n<pre><code class=\"javascript\">let keyDownIndices = 0 \/\/ \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 for (let i = 0; i &lt; nativeKeyMap.length; i++) { \u00a0 const currentKey = nativeKeyMap[i] \u00a0 \/\/ \u0415\u0441\u043b\u0438 \u043a\u043b\u0430\u0432\u0438\u0448\u0430 \u043d\u0430\u0436\u0430\u0442\u0430, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0438\u043d\u0434\u0435\u043a\u0441 \u0432 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043d\u0430\u0436\u0430\u0442\u044b\u0445 \u043a\u043b\u0430\u0432\u0438\u0448 \u00a0 \/\/ \u0422\u0430\u043a\u0436\u0435 \u043e\u0442\u043e\u0436\u043c\u0451\u0442 \u0432\u0441\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0435 \u0431\u044b\u043b\u0438 \u043d\u0430\u0436\u0430\u0442\u044b \u00a0 if (r.IsKeyDown(currentKey)) { \u00a0 \u00a0 keyDownIndices |= 1 &lt;&lt; i \u00a0 } }  \/\/ \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043d\u0430\u0436\u0430\u0442\u044b\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438 cpu.interface.setKeys(keyDownIndices)<\/code><\/pre>\n<p>  \u0412\u043e\u0442 \u0438 \u0432\u0441\u0451. \u042d\u0442\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u0441\u043b\u043e\u0436\u043d\u0435\u0435 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445, \u043d\u043e \u044f \u0440\u0430\u0434\u0430, \u0447\u0442\u043e \u0441\u0434\u0435\u043b\u0430\u043b\u0430 \u044d\u0442\u043e, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c, \u043d\u0430\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0445\u043e\u0440\u043e\u0448\u043e \u044d\u0442\u043e\u0442 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430\u0445.<\/p>\n<p>  <font color=\"#09b744\"><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p><\/font><br \/>  \u0418 \u0432\u043e\u0442 \u043c\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u00abChip-8\u00bb. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 <a href=\"https:\/\/github.com\/taniarascia\/chip8\">\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438<\/a> \u043d\u0430 GitHub. \u042f \u0443\u0437\u043d\u0430\u043b\u0430 \u043c\u043d\u043e\u0433\u043e \u043d\u043e\u0432\u043e\u0433\u043e \u043e \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f\u0445 \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044f\u0445 JavaScript \u0437\u0430 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u043c\u0438 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 REST API. \u041c\u043d\u0435 \u0435\u0449\u0451 \u043f\u0440\u0435\u0434\u0441\u0442\u043e\u0438\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0449\u0435\u0439, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0438\u0433\u0440\u0443, \u043d\u043e \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d, \u0438 \u044f \u0433\u043e\u0440\u0436\u0443\u0441\u044c \u044d\u0442\u0438\u043c.<\/p>\n<p>  \u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 JS \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430 \u043d\u0430\u0448\u0438\u0445 \u043a\u0443\u0440\u0441\u0430\u0445:<\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/frontend-razrabotchik?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_fr_051221&amp;amp;utm_term=conc\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a (7 \u043c\u0435\u0441\u044f\u0446\u0435\u0432)<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/python-fullstack-web-developer?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_fpw_051221&amp;amp;utm_term=conc\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Fullstack-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 Python (15 \u043c\u0435\u0441\u044f\u0446\u0435\u0432)<\/a><\/li>\n<\/ul>\n<p>  <a href=\"https:\/\/skillfactory.ru\/catalogue?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=habr_banner&amp;amp;utm_content=sf_allcourses_051221&amp;amp;utm_term=banner\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/gf\/9c\/gl\/gf9cglzosquxbz35flsacmrn9t4.png\" data-src=\"https:\/\/habrastorage.org\/webt\/gf\/9c\/gl\/gf9cglzosquxbz35flsacmrn9t4.png\"\/><\/a><\/p>\n<p>  \u0423\u0437\u043d\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 <a href=\"https:\/\/skillfactory.ru\/catalogue?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=sf_allcourses_051221&amp;amp;utm_term=conc\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<div class=\"spoiler\" role=\"button\" tabindex=\"0\">                         <b class=\"spoiler_title\">\u0414\u0440\u0443\u0433\u0438\u0435 \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u0438 \u0438 \u043a\u0443\u0440\u0441\u044b<\/b>                         <\/p>\n<div class=\"spoiler_text\"><strong>Data Science \u0438 Machine Learning<\/strong>  <\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/data-scientist-pro?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=data-science_dspr_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Data Scientist<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/data-analyst-pro?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=analytics_dapr_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Data Analyst<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/matematika-dlya-data-science#syllabus?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=data-science_mat_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u00ab\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0434\u043b\u044f Data Science\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/matematika-i-machine-learning-dlya-data-science?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=data-science_matml_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u00ab\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430 \u0438 Machine Learning \u0434\u043b\u044f Data Science\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/data-engineer?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=data-science_dea_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u043f\u043e Data Engineering<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/machine-learning-i-deep-learning?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=data-science_mldl_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u00abMachine Learning \u0438 Deep Learning\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/machine-learning?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=data-science_ml_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u043f\u043e Machine Learning<\/a><\/li>\n<\/ul>\n<p>  <strong>Python, \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>  <\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/python-fullstack-web-developer?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_fpw_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Fullstack-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0430 Python<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/python-for-web-developers?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_pws_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u00abPython \u0434\u043b\u044f \u0432\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/frontend-razrabotchik?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_fr_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Frontend-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/webdev?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_webdev_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f \u0412\u0435\u0431-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<\/ul>\n<p>  <strong>\u041c\u043e\u0431\u0438\u043b\u044c\u043d\u0430\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430<\/strong>  <\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/ios-razrabotchik-s-nulya?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_ios_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f iOS-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/android-razrabotchik?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_andr_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Android-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<\/ul>\n<p>  <strong>Java \u0438 C#<\/strong>  <\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/java-razrabotchik?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_java_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f Java-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/java-qa-engineer-testirovshik-po?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_qaja_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f QA-\u0438\u043d\u0436\u0435\u043d\u0435\u0440 \u043d\u0430 JAVA<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/c-sharp-razrabotchik?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_cdev_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f C#-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/game-razrabotchik-na-unity-i-c-sharp?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_gamedev_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f \u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0438\u0433\u0440 \u043d\u0430 Unity<\/a><\/li>\n<\/ul>\n<p>  <strong>\u041e\u0442 \u043e\u0441\u043d\u043e\u0432 \u2014 \u0432 \u0433\u043b\u0443\u0431\u0438\u043d\u0443<\/strong>  <\/p>\n<ul>\n<li><a href=\"https:\/\/skillfactory.ru\/algoritmy-i-struktury-dannyh?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_algo_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u00ab\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u044b \u0438 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445\u00bb<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/c-plus-plus-razrabotchik?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_cplus_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f C++ \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a<\/a><\/li>\n<li><a href=\"https:\/\/skillfactory.ru\/cyber-security-etichnij-haker?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_hacker_051221&amp;amp;utm_term=cat\">\u041f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u044f \u042d\u0442\u0438\u0447\u043d\u044b\u0439 \u0445\u0430\u043a\u0435\u0440<\/a><\/li>\n<\/ul>\n<p>  <strong>\u0410 \u0442\u0430\u043a\u0436\u0435<\/strong>  <\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/skillfactory.ru\/devops-ingineer?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_devops_051221&amp;amp;utm_term=cat\">\u041a\u0443\u0440\u0441 \u043f\u043e DevOps<\/a><\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/skillfactory.ru\/catalogue?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=sf_allcourses_051221&amp;amp;utm_term=cat\">\u0412\u0441\u0435 \u043a\u0443\u0440\u0441\u044b<\/a><\/p>\n<\/li>\n<\/ul>\n<p>  <\/div>\n<\/p><\/div>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><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\/ru\/articles\/593525\/\"> https:\/\/habr.com\/ru\/articles\/593525\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\"><a href=\"https:\/\/habr.com\/ru\/company\/skillfactory\/blog\/593525\/\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/webt\/zr\/wk\/ot\/zrwkotyuu3q55jt_diiy9la_ha0.png\" alt=\"Chip-8\" width=\"780\" data-src=\"https:\/\/habrastorage.org\/webt\/zr\/wk\/ot\/zrwkotyuu3q55jt_diiy9la_ha0.png\"\/><\/a><\/p>\n<p>  \u0410\u0432\u0442\u043e\u0440 \u043f\u0440\u043e\u0432\u0451\u043b \u0434\u0435\u0442\u0441\u0442\u0432\u043e \u0437\u0430 \u0438\u0433\u0440\u0430\u043c\u0438 \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430\u0445 NES \u0438 SNES \u043d\u0430 \u0441\u0432\u043e\u0451\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435, \u043d\u043e \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0434\u0443\u043c\u0430\u043b, \u0447\u0442\u043e \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u0441\u0430\u043c \u043d\u0430\u043f\u0438\u0448\u0435\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440. <a href=\"https:\/\/sergeev.io\/\">\u0418\u0432\u0430\u043d \u0421\u0435\u0440\u0433\u0435\u0435\u0432<\/a> \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0435\u0440\u0435\u0434 \u0430\u0432\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0430\u0442\u043e\u0440 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/CHIP-8\">Chip-8<\/a>, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043f\u043e\u043d\u044f\u0442\u0438\u044f \u043d\u0438\u0437\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0442\u043e, \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440. <\/p>\n<p>  \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u2014 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 Chip-8 \u043d\u0430 JavaScript, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u0440 \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u043f\u043e\u0434 \u0435\u0433\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e\u043c. \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043f\u043e\u043a\u0430 \u0443 \u043d\u0430\u0441 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043a\u0443\u0440\u0441 \u043f\u043e <a href=\"https:\/\/skillfactory.ru\/python-fullstack-web-developer?utm_source=habr&amp;amp;utm_medium=habr&amp;amp;utm_campaign=article&amp;amp;utm_content=coding_fpw_051221&amp;amp;utm_term=lead\">Fullstack-\u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043d\u0430 Python<\/a>.  <\/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-383902","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383902","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=383902"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/383902\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=383902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=383902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=383902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}