{"id":444030,"date":"2025-01-03T21:00:33","date_gmt":"2025-01-03T21:00:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=444030"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=444030","title":{"rendered":"<span>\u0421\u043e\u0437\u0434\u0430\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 Sega Mega Drive \u043d\u0430 C++<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e50\/7d8\/9be\/e507d89be85dc34eb114e6a2285f19df.png\" width=\"2240\" height=\"1349\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e50\/7d8\/9be\/e507d89be85dc34eb114e6a2285f19df.png\"\/><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 16-\u0431\u0438\u0442\u043d\u043e\u0439 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438 Sega Mega Drive \u043d\u0430 C++.<\/p>\n<p>\u0411\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e: \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 Motorola 68000, \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0433 \u0438\u0433\u0440, \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 OpenGL, \u0448\u0435\u0439\u0434\u0435\u0440\u044b, \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c C++. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043c\u043e\u0436\u043d\u043e \u0445\u043e\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<h2>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Sega Mega Drive<\/h2>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dbe\/dfc\/468\/dbedfc468a64d255310b52ab73fcb35f.png\" alt=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sega Mega Drive (source)\" title=\"\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sega Mega Drive (source)\" width=\"800\" height=\"688\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dbe\/dfc\/468\/dbedfc468a64d255310b52ab73fcb35f.png\"\/><\/p>\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sega Mega Drive (<a href=\"https:\/\/www.retrosix.wiki\/hardware-overview-sega-mega-drive\" rel=\"noopener noreferrer nofollow\">source<\/a>)<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u0445\u0435\u043c\u044b \u0432 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ul>\n<li>\n<p><strong>ROM<\/strong> &#8212; \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436\u0430, \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 4MB.<\/p>\n<\/li>\n<li>\n<p><strong>VDP<\/strong> &#8212; &#171;<a href=\"https:\/\/rasterscroll.com\/mdgraphics\/vdp-overview\/\" rel=\"noopener noreferrer nofollow\">Video Display Processor<\/a>&#171;, \u0430\u0441\u0438\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0430\u043c\u043e\u0439 Sega, \u0447\u0438\u043f \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0418\u043c\u0435\u0435\u0442 64KB RAM (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f VRAM &#8212; Video RAM).<\/p>\n<\/li>\n<li>\n<p><strong>FM Sound<\/strong> &#8212; \u0430\u0441\u0438\u043a \u043e\u0442 Yamaha (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Yamaha_YM2612\" rel=\"noopener noreferrer nofollow\">YM2612<\/a>), \u0438\u043c\u0435\u0435\u0442 6 FM-\u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0432\u0443\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>PSG Sound<\/strong> &#8212; \u0430\u0441\u0438\u043a \u043e\u0442 Texas Instruments (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Texas_Instruments_SN76489\" rel=\"noopener noreferrer nofollow\">SN76489<\/a>), \u0438\u043c\u0435\u0435\u0442 3 \u043c\u0435\u0430\u043d\u0434\u0440\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430, \u0442\u043e\u0436\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0432\u0443\u043a, \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 8-\u0431\u0438\u0442\u043d\u043e\u0439 Sega Master System.<\/p>\n<\/li>\n<li>\n<p><strong>CPU<\/strong> &#8212; \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Motorola_68000_series\" rel=\"noopener noreferrer nofollow\">Motorola 68000<\/a>, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043c\u0430\u0441\u0441\u0443 \u0440\u0430\u0431\u043e\u0442\u044b. \u0418\u043c\u0435\u0435\u0442 64KB RAM.<\/p>\n<\/li>\n<li>\n<p><strong>Co-Processor<\/strong> &#8212; \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Zilog_Z80\" rel=\"noopener noreferrer nofollow\">Zilog Z80<\/a>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f &#171;\u0434\u043b\u044f \u0437\u0432\u0443\u043a\u0430&#187;, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0432 \u0442\u043e\u043c \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b YM2612. \u0418\u043c\u0435\u0435\u0442 8KB RAM.<\/p>\n<\/li>\n<li>\n<p><strong>Input\/Output<\/strong> &#8212; \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e \u0431\u044b\u043b &#171;3-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u043f\u0430\u0434&#187;, \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f &#171;6-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439&#187;, \u0430 \u0437\u0430\u0442\u0435\u043c \u0435\u0449\u0435 \u0441 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u0434\u043a\u0438\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;Motorola 68000&#187; (\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e &#171;m68k&#187;). \u0423 \u043d\u0435\u0433\u043e 24-\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f, \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c <code>0x000000 - 0xFFFFFF<\/code>. \u041b\u044e\u0431\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0448\u0438\u043d\u043e\u0439 (\u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043e &#171;68000 BUS&#187;), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 &#8212; <a href=\"https:\/\/segaretro.org\/Sega_Mega_Drive\/Memory_map\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0430\u0434\u0440\u0435\u0441\u043e\u0432<\/a>.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043a\u0440\u043e\u043c\u0435 Z80 \u0438 \u0437\u0432\u0443\u043a\u0430.<\/p>\n<h2>\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f Motorola 68000<\/h2>\n<h4>\u0424\u0430\u043a\u0442\u044b \u043f\u0440\u043e m68k<\/h4>\n<p>m68k \u0431\u044b\u043b \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u0439 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 Macintosh, Amiga, Atari, \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0435 Sega Mega Drive, \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445.<\/p>\n<p>\u0412 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Motorola_68000#Architecture\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/a> \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b 32-\u0431\u0438\u0442\u043e\u0432\u043e\u0441\u0442\u0438, \u043d\u043e \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0412\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c 16 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 32-\u0431\u0438\u0442\u043d\u044b\u0445 (\u0438 1 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 16-\u0431\u0438\u0442\u043d\u044b\u0439). \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e &#171;\u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0435&#187; \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b (<code>A0<\/code>&#8212;<code>A7<\/code>) 32-\u0431\u0438\u0442\u043d\u044b\u0435, \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043c\u043b\u0430\u0434\u0448\u0438\u0435 24 \u0431\u0438\u0442\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432 16 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0447\u0430\u0442\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c &#8212; \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 <code>A7<\/code> \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u043b\u0438\u0431\u043e \u043a <code>USP<\/code> (user stack pointer) \u043b\u0438\u0431\u043e \u043a <code>SSP<\/code> (supervisor stack pointer) \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0444\u043b\u0430\u0433\u0430 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435.<\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 (\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445) \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440, m68k \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0431\u0430\u0439\u0442 big-endian. \u0410\u0434\u0440\u0435\u0441 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 2, \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0434\u0435\u043b\u044f\u0449\u0435\u043c\u0443\u0441\u044f \u043d\u0430 2 (\u0437\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c). \u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f floating-point arithmetic.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/342\/0f4\/bd9\/3420f4bd9527baae4f863b1d4cdf5636.png\" alt=\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k (source)\" title=\"\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k (source)\" width=\"3507\" height=\"2480\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/342\/0f4\/bd9\/3420f4bd9527baae4f863b1d4cdf5636.png\"\/><\/p>\n<div><figcaption>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k (<a href=\"http:\/\/goldencrystal.free.fr\/M68kOpcodes-v2.3.pdf\" rel=\"noopener noreferrer nofollow\">source<\/a>)<\/figcaption><\/div>\n<\/figure>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b m68k<\/h4>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u043e\u0431\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b:<\/p>\n<pre><code class=\"cpp\">using Byte = uint8_t; using Word = uint16_t; using Long = uint32_t; using LongLong = uint64_t;  using AddressType = Long;<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 big-endian:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 BigEndian&lt;T&gt;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0430\u043a \u043a\u0430\u043a m68k \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 big-endian, \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0447\u0442\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c x86_64\/ARM, \u0433\u0434\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e little-endian), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u0442\u0438\u043f:<\/p>\n<pre><code class=\"cpp\">template&lt;typename T&gt; class BigEndian { public:   T get() const {     return std::byteswap(value_);   }  private:   T value_; };<\/code><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430\u0434\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 word \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">const auto* array_ptr = reinterpret_cast&lt;const BigEndian&lt;Word&gt;*&gt;(data_ptr); \/\/ ... x -= array_ptr[index].get();<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u043b\u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430, \u0442\u043e \u043d\u0443\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c):<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441\u044b DataView \u0438 MutableDataView<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 <code>std::span<\/code> &#8212; \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u044e\u0441 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0435\u0449\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u0435\u043b\u043f\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>.as&lt;Word&gt;()<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435:<\/p>\n<pre><code class=\"cpp\">using MutableDataView = std::span&lt;Byte&gt;;  class DataView : public std::span&lt;const Byte&gt; { public:   using Base = std::span&lt;const Byte&gt;;   using Base::Base;    template&lt;std::integral T&gt;   T as() const {     return std::byteswap(*reinterpret_cast&lt;const T*&gt;(data()));   } };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 m68k &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 CPU \u0432 \u043e\u0442\u0440\u044b\u0432\u0435 \u043e\u0442 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Registers<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct Registers {   \/**    * Data registers D0 - D7    *\/   std::array&lt;Long, 8&gt; d;    \/**    * Address registers A0 - A6    *\/   std::array&lt;Long, 7&gt; a;    \/**    * User stack pointer    *\/   Long usp;    \/**    * Supervisor stack pointer    *\/   Long ssp;    \/**    * Program counter    *\/   Long pc;    \/**    * Status register    *\/   struct {     \/\/ lower byte     bool carry : 1;     bool overflow : 1;     bool zero : 1;     bool negative : 1;     bool extend : 1;     bool : 3;      \/\/ upper byte     uint8_t interrupt_mask : 3;     bool : 1;     bool master_switch : 1;     bool supervisor : 1;     uint8_t trace : 2;      decltype(auto) operator=(const Word&amp; word) {       *reinterpret_cast&lt;Word*&gt;(this) = word;       return *this;     }      operator Word() const {       return *reinterpret_cast&lt;const Word*&gt;(this);     }   } sr;   static_assert(sizeof(sr) == sizeof(Word));    \/**    * The stack pointer register depend on the supervisor flag    *\/   Long&amp; stack_ptr() {     return sr.supervisor ? ssp : usp;   } }; static_assert(sizeof(Registers) == 76);<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 76 \u0431\u0430\u0439\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 CPU.<\/p>\n<\/div>\n<\/details>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h4>\n<p>\u041e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e &#8212; unaligned (\u043d\u0435 \u0434\u0435\u043b\u044f\u0449\u0438\u0439\u0441\u044f \u043d\u0430 2) \u0430\u0434\u0440\u0435\u0441 program counter \/ \u0430\u0434\u0440\u0435\u0441 \u0447\u0442\u0435\u043d\u0438\u044f \/ \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 <code>try<\/code>\/<code>throw<\/code>\/<code>catch<\/code>). \u0412 \u0446\u0435\u043b\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u0438\u043c\u0435\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0435\u0431\u0430\u0433 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u043a\u043b\u0430\u0441\u0441:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 Error<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">class Error { public:   enum Kind {     \/\/ no error     Ok,      UnalignedMemoryRead,     UnalignedMemoryWrite,     UnalignedProgramCounter,     UnknownAddressingMode,     UnknownOpcode,      \/\/ permission error     ProtectedRead,     ProtectedWrite,      \/\/ bus error     UnmappedRead,     UnmappedWrite,      \/\/ invalid action     InvalidRead,     InvalidWrite,   };    Error() = default;   Error(Kind kind, std::string what): kind_{kind}, what_{std::move(what)}   {}    Kind kind() const {     return kind_;   }   const std::string&amp; what() const {     return what_;   }  private:   Kind kind_{Ok};   std::string what_; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f <code>std::optional&lt;Error&gt;<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043b\u0438\u0431\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043b\u0438\u0431\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>T<\/code>, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f <code>std::expected&lt;T, Error&gt;<\/code>. \u042d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d <a href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/expected\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0435\u0445\u0430\u043b \u0432 C++23<\/a>, \u043e\u043d \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<h4>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/h4>\n<p>\u041a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e &#171;\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Sega Mega Drive&#187;, \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443, \u0441\u043c\u043e\u0442\u0440\u044f \u0447\u0442\u043e \u0437\u0430 \u0430\u0434\u0440\u0435\u0441. \u0427\u0442\u043e\u0431\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f m68k, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0441 <code>Device<\/code>:<\/p>\n<pre><code class=\"cpp\">class Device { public:   \/\/ reads `data.size()` bytes from address `addr`   [[nodiscard]] virtual std::optional&lt;Error&gt; read(AddressType addr, MutableDataView data) = 0;    \/\/ writes `data.size()` bytes to address `addr`   [[nodiscard]] virtual std::optional&lt;Error&gt; write(AddressType addr, DataView data) = 0;    \/\/ ... };<\/code><\/pre>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0445\u0435\u043b\u043f\u0435\u0440\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 <code>Byte<\/code>\/<code>Word<\/code>\/<code>Long<\/code>:<\/p>\n<pre><code class=\"cpp\">  template&lt;std::integral T&gt;   std::expected&lt;T, Error&gt; read(AddressType addr) {     T data;     if (auto err = read(addr, MutableDataView{reinterpret_cast&lt;Byte*&gt;(&amp;data), sizeof(T)})) {       return std::unexpected{std::move(*err)};     }     \/\/ swap bytes after reading to make it little-endian     return std::byteswap(data);   }    template&lt;std::integral T&gt;   [[nodiscard]] std::optional&lt;Error&gt; write(AddressType addr, T value) {     \/\/ swap bytes before writing to make it big-endian     const auto swapped = std::byteswap(value);     return write(addr, DataView{reinterpret_cast&lt;const Byte*&gt;(&amp;swapped), sizeof(T)});   }<\/code><\/pre>\n<h4>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f m68k<\/h4>\n<p>&#171;\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f m68k&#187; \u044d\u0442\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b + \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044d\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">struct Context {   Registers&amp; registers;   Device&amp; device; };<\/code><\/pre>\n<h4>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 m68k<\/h4>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0442 0 \u0434\u043e 2 &#171;\u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432&#187;, \u043e\u043d\u0438 \u0436\u0435 &#171;\u0446\u0435\u043b\u0438&#187;. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432. \u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cpp\">Kind kind_; \/\/ \u043e\u0434\u0438\u043d \u0438\u0437 12 \u0442\u0438\u043f\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 (addressing mode) uint8_t index_; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"\u0438\u043d\u0434\u0435\u043a\u0441\u0430\" \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 Word ext_word0_; \/\/ \u043f\u0435\u0440\u0432\u044b\u0439 extension word Word ext_word1_; \/\/ \u0432\u0442\u043e\u0440\u043e\u0439 extension word Long address_; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"\u0430\u0434\u0440\u0435\u0441\u0430\" \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438<\/code><\/pre>\n<p>\u0418 \u0435\u0449\u0435 2-3 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0432\u0441\u0435\u0433\u043e \u044f \u0443\u043b\u043e\u0436\u0438\u043b\u0441\u044f \u0432 24 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"cpp\">[[nodiscard]] std::optional&lt;Error&gt; read(Context ctx, MutableDataView data); [[nodiscard]] std::optional&lt;Error&gt; write(Context ctx, DataView data);<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/m68k\/target\/target.h\" rel=\"noopener noreferrer nofollow\">lib\/m68k\/target\/target.h<\/a>.<\/p>\n<p>\u0421\u0430\u043c\u044b\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c &#171;Address with Index&#187; \u0438 &#171;Program Counter with Index&#187; &#8212; \u0432\u043e\u0442 \u0442\u0430\u043a \u0434\u043b\u044f \u043d\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441:<\/p>\n<details class=\"spoiler\">\n<summary>Target::indexed_address<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">Long Target::indexed_address(Context ctx, Long baseAddress) const {   const uint8_t xregNum = bits_range(ext_word0_, 12, 3);   const Long xreg = bit_at(ext_word0_, 15) ? a_reg(ctx.registers, xregNum) : ctx.registers.d[xregNum];   const Long size = bit_at(ext_word0_, 11) ? \/*Long*\/ 4 : \/*Word*\/ 2;   const Long scale = scale_value(bits_range(ext_word0_, 9, 2));   const SignedByte disp = static_cast&lt;SignedByte&gt;(bits_range(ext_word0_, 0, 8));    SignedLong clarifiedXreg = static_cast&lt;SignedLong&gt;(xreg);   if (size == 2) {     clarifiedXreg = static_cast&lt;SignedWord&gt;(clarifiedXreg);   }    return baseAddress + disp + clarifiedXreg * scale; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k<\/h4>\n<p>\u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cpp\">Kind kind_; \/\/ \u043e\u0434\u0438\u043d \u0438\u0437 82 \u043e\u043f\u043a\u043e\u0434\u043e\u0432 Size size_; \/\/ Byte, Word \u0438\u043b\u0438 Long Condition cond_; \/\/ \u043e\u0434\u043d\u043e \u0438\u0437 16 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u0434\u043b\u044f \"\u0431\u0440\u0430\u043d\u0447\u0435\u0432\u044b\u0445\" \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Target src_; \/\/ source-\u043e\u043f\u0435\u0440\u0430\u043d\u0434 Target dst_; \/\/ destination-\u043e\u043f\u0435\u0440\u0430\u043d\u0434<\/code><\/pre>\n<p>\u0418 \u0435\u0449\u0435 2-3 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0432\u0441\u0435\u0433\u043e \u044f \u0443\u043b\u043e\u0436\u0438\u043b\u0441\u044f \u0432 64 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<h4>\u041f\u0430\u0440\u0441\u0438\u043d\u0433 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k<\/h4>\n<p>\u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0435\u0441\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438:<\/p>\n<pre><code class=\"cpp\">static std::expected&lt;Instruction, Error&gt; decode(Context ctx);<\/code><\/pre>\n<p>\u0415\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/m68k\/instruction\/decode.cpp\" rel=\"noopener noreferrer nofollow\">lib\/m68k\/instruction\/decode.cpp<\/a><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u043a\u043e\u043f\u0438\u043f\u0430\u0441\u0442\u0438\u0442\u044c \u043a\u0443\u0447\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a \u043d\u0430 &#171;\u043e\u0448\u0438\u0431\u043a\u0443&#187;, \u044f \u043f\u0440\u0438\u0431\u0435\u0433\u0430\u044e \u043a \u043c\u0430\u043a\u0440\u043e\u0441\u0430\u043c \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0438 \u0442\u0430\u043a\u0438\u0445:<\/p>\n<pre><code class=\"cpp\">#define READ_WORD_SAFE                    \\   const auto word = read_word();          \\   if (!word) {                            \\     return std::unexpected{word.error()}; \\   }<\/code><\/pre>\n<p>\u0422\u0430\u043a\u0436\u0435 \u044f \u0432 \u0443\u0434\u043e\u0431\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e \u043e\u043f\u043a\u043e\u0434 \u043d\u0430 &#171;\u043f\u0430\u0442\u0442\u0435\u0440\u043d&#187;:<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043a\u0440\u043e\u0441 HAS_PATTERN<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0440\u0430\u0441\u0447\u0435\u0442\u0430 &#171;\u043c\u0430\u0441\u043a\u0438&#187;:<\/p>\n<pre><code class=\"cpp\">consteval Word calculate_mask(std::string_view pattern) {   Word mask{};   for (const char c : pattern) {     if (c != ' ') {       mask = (mask &lt;&lt; 1) | ((c == '0' || c == '1') ? 1 : 0);     }   }   return mask; }  consteval Word calculate_value(std::string_view pattern) {   Word mask{};   for (const char c : pattern) {     if (c != ' ') {       mask = (mask &lt;&lt; 1) | ((c == '1') ? 1 : 0);     }   }   return mask; }<\/code><\/pre>\n<p>\u041c\u0430\u043a\u0440\u043e\u0441 <code>HAS_PATTERN<\/code>:<\/p>\n<pre><code class=\"cpp\">#define HAS_PATTERN(pattern) ((*word &amp; calculate_mask(pattern)) == calculate_value(pattern))<\/code><\/pre>\n<p>\u0418 \u0437\u0430\u0442\u0435\u043c \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n<pre><code class=\"cpp\">if (HAS_PATTERN(\"0000 ...1 ..00 1...\")) {   \/\/ \u044d\u0442\u043e MOVEP   \/\/ ... }<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0432\u044b\u0448\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u0431\u0438\u0442\u044b \u0432 \u043e\u043f\u043a\u043e\u0434\u0435 \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u044f\u044e\u0442 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0443, \u0442\u043e \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0431\u0438\u0442\u044b (\u0433\u0434\u0435 \u043d\u0435 \u0442\u043e\u0447\u043a\u0430) \u0440\u0430\u0432\u043d\u044b 0 \u0438\u043b\u0438 1, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u043f\u0430\u0442\u0442\u0435\u0440\u043d \u0434\u043b\u044f \u043e\u043f\u043a\u043e\u0434\u0430 <code>MOVEP<\/code>.<\/p>\n<p>\u042d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a \u0436\u0435 \u0431\u044b\u0441\u0442\u0440\u043e \u043a\u0430\u043a \u0435\u0441\u043b\u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438 &#8212; <code>consteval<\/code> \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 compile-time.<\/p>\n<\/div>\n<\/details>\n<h4>\u0418\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k<\/h4>\n<p>\u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0435\u0441\u0442\u044c \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f &#8212; \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0438 \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c:<\/p>\n<pre><code class=\"cpp\">[[nodiscard]] std::optional&lt;Error&gt; execute(Context ctx);<\/code><\/pre>\n<p>\u0415\u0433\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/m68k\/instruction\/execute.cpp\" rel=\"noopener noreferrer nofollow\">lib\/m68k\/instruction\/execute.cpp<\/a> &#8212; \u044d\u0442\u043e \u0441\u0430\u043c\u044b\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435.<\/p>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0447\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u0430 \u0434\u0435\u043b\u0430\u0442\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c <a href=\"https:\/\/github.com\/prb28\/m68k-instructions-documentation\/blob\/master\/instructions\/eor.md\" rel=\"noopener noreferrer nofollow\">\u0432 \u044d\u0442\u043e\u0439 markdown-\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438<\/a>. \u0418\u043d\u043e\u0433\u0434\u0430 \u044d\u0442\u043e\u0433\u043e \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0442\u043e\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/www.easy68k.com\/paulrsm\/doc\/68kprm.pdf\" rel=\"noopener noreferrer nofollow\">\u0434\u043b\u0438\u043d\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432 \u044d\u0442\u043e\u0439 \u043a\u043d\u0438\u0433\u0435<\/a>.<\/p>\n<p>\u041d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u044d\u0442\u043e \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0441\u043b\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u043d\u043e \u043f\u043e\u0442\u043e\u043c \u043d\u0430\u043a\u0430\u043f\u043b\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u043e\u0432 \u0438 \u043e\u0431\u0449\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0438 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0449\u0435.<\/p>\n<p>\u0415\u0441\u0442\u044c \u043c\u0443\u0442\u043e\u0440\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/github.com\/prb28\/m68k-instructions-documentation\/blob\/master\/instructions\/movep.md\" rel=\"noopener noreferrer nofollow\">MOVEP<\/a>. \u0418 \u0435\u0449\u0435 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u043f\u0440\u043e BCD-\u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0443 (\u043a\u0430\u043a <a href=\"https:\/\/github.com\/prb28\/m68k-instructions-documentation\/blob\/master\/instructions\/abcd.md\" rel=\"noopener noreferrer nofollow\">ABCD<\/a>). BCD-\u0430\u0440\u0438\u0444\u043c\u0435\u0442\u0438\u043a\u0430 \u044d\u0442\u043e \u043a\u043e\u0433\u0434\u0430 \u0441 hex-\u0447\u0438\u0441\u043b\u0430\u043c\u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u044f\u0442 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u043d\u0430\u0434 decimal-\u0447\u0438\u0441\u043b\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 BCD-\u0441\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u044d\u0442\u043e <code>0x678 + 0x535 = 0x1213<\/code>. \u041d\u0430\u0434 \u044d\u0442\u0438\u043c\u0438 BCD-\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u043c\u0438 \u043f\u0440\u043e\u0441\u0438\u0434\u0435\u043b \u0431\u043e\u043b\u044c\u0448\u0435 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0447\u0430\u0441\u043e\u0432, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0443 \u043d\u0438\u0445 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/b3d7fe5b239d3e3a58cb8e90bc3ea7f87d44825f\/src\/lib\/m68k\/instruction\/execute.cpp#L235-L273\" rel=\"noopener noreferrer nofollow\">\u0441\u0443\u043f\u0435\u0440 \u0441\u043b\u043e\u0436\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430<\/a>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043d\u0438\u0433\u0434\u0435 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e \u043d\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u044f\u0435\u0442\u0441\u044f.<\/p>\n<h4>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 m68k<\/h4>\n<p>\u0421\u0430\u043c\u043e\u0435 \u0432\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c &#8212; \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u043a\u0430\u043a\u043e\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u043c \u0444\u043b\u0430\u0433\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u043a\u0430\u0442\u0430\u0441\u0442\u0440\u043e\u0444\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438. \u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0431\u043e\u043b\u044c\u0448\u0430\u044f, \u0435\u0435 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043b\u0435\u0433\u043a\u043e \u0441\u043b\u043e\u043c\u0430\u0442\u044c \u0432 \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0443\u0436\u043d\u044b \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u0432\u0441\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/p>\n<p>\u041c\u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u043c\u043e\u0433\u043b\u0438 <a href=\"https:\/\/github.com\/TomHarte\/ProcessorTests\/blob\/main\/680x0\/68000\/v1\/README.md\" rel=\"noopener noreferrer nofollow\">\u0442\u0435\u0441\u0442\u044b \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/a>. \u041d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u0435\u0441\u0442\u044c 8000+ \u0442\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u043a\u0440\u044b\u0432\u0430\u044e\u0442 \u0432\u0441\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u044b\u0435 \u0441\u043b\u0443\u0447\u0430\u0438. \u0421\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u0442\u0435\u0441\u0442\u043e\u0432 \u0447\u0443\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043c\u0438\u043b\u043b\u0438\u043e\u043d\u0430.<\/p>\n<p>\u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u0430\u0436\u0435 \u0441\u0430\u043c\u044b\u0435 \u043c\u0435\u043b\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 &#8212; \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u0431\u044b\u0432\u0430\u0435\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044f, \u0447\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u044f\u0442\u0441\u044f ~20 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0437 8000.<\/p>\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f <code>MOVE (A6)+ (A6)+<\/code> (\u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 A6 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u0441\u0442-\u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u043e\u043c) \u0434\u043e\u043b\u0436\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0442\u0430\u043a, \u043a\u0430\u043a \u044f \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043a\u043e\u0441\u0442\u044b\u043b\u044c, \u0447\u0442\u043e\u0431\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0447\u0442\u0438 \u0432\u0435\u0437\u0434\u0435, \u043b\u043e\u043c\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u044b\u0445 \u043a\u0435\u0439\u0441\u0430\u0445 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 ~10 \u0448\u0442\u0443\u043a (\u0433\u0434\u0435 \u0442\u043e \u043b\u0438 \u043e\u0448\u0438\u0431\u043a\u0430 \u0432 \u0441\u0430\u043c\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445, \u0442\u043e \u043b\u0438 \u0435\u0449\u0435 \u0447\u0442\u043e-\u0442\u043e).<\/p>\n<h4>\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f C++ \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c<\/h4>\n<p>\u041c\u043e\u0436\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b. \u041d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0447\u0438\u0442\u0430\u0435\u0442 \u0434\u0432\u0430 \u0447\u0438\u0441\u043b\u0430, \u0430 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u0446\u0438\u043a\u043b\u0435 \u0432\u0441\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043a\u0435:<\/p>\n<pre><code class=\"cpp\">    void work() {         int begin = *(int*)0xFF0000;         int end = *(int*)0xFF0004;          for (int i = begin; i &lt;= end; ++i) {             *(volatile int*)0xFF0008 = i; \/\/ \u0435\u0441\u043b\u0438 \u043d\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \"volatile\",                                           \/\/ \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u0432 \u043e\u0434\u043d\u0443 \u0437\u0430\u043f\u0438\u0441\u044c!         }     } <\/code><\/pre>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b GCC \u0438 Clang \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0442 m68k \u043a\u0430\u043a \u0446\u0435\u043b\u044c. \u0421\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u043c \u0432 Clang (\u0438\u0437 \u0444\u0430\u0439\u043b\u0430 <code>a.cpp<\/code> \u0441\u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f <code>a.o<\/code>):<\/p>\n<pre><code class=\"bash\">clang++ a.cpp -c --target=m68k -O3<\/code><\/pre>\n<p>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 (\u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442 <code>binutils-m68k-linux-gnu<\/code>):<\/p>\n<pre><code class=\"bash\">m68k-linux-gnu-objdump -d a.o<\/code><\/pre>\n<p><a href=\"https:\/\/gist.github.com\/Izaron\/b241bfd9fffab3a1731c74f5ba37d07c\" rel=\"noopener noreferrer nofollow\">\u0412\u044b\u0432\u0435\u0434\u0435\u0442 \u0442\u0430\u043a\u043e\u0439 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440<\/a>.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u0443\u043f\u0430\u043a\u043e\u0432\u0430\u043d \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Executable_and_Linkable_Format\" rel=\"noopener noreferrer nofollow\">ELF<\/a>. \u041d\u0443\u0436\u043d\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c &#8212; \u0432\u044b\u0442\u0430\u0449\u0438\u043c \u0447\u0438\u0441\u0442\u043e \u0431\u0430\u0439\u0442\u044b \u0441 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043e\u043c (\u0441\u0435\u043a\u0446\u0438\u044f <code>.text<\/code>) \u0432 \u0444\u0430\u0439\u043b <code>a.bin<\/code>:<\/p>\n<pre><code class=\"bash\">m68k-linux-gnu-objcopy -O binary --only-section=.text a.o a.bin<\/code><\/pre>\n<p>(\u041a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 <code>hd a.bin<\/code> \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u0442\u044c\u0441\u044f \u0447\u0442\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u043b\u0438\u0441\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b)<\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043d\u0430 \u044d\u0442\u043e\u043c \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435. <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/bin\/m68k_emulator\/main.cpp\" rel=\"noopener noreferrer nofollow\">\u041a\u043e\u0434 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0442\u0443\u0442<\/a>, \u0430 <a href=\"https:\/\/gist.github.com\/Izaron\/3d163abd63bc7e29a657c38a35e951dc\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442 \u043b\u043e\u0433\u0438 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438<\/a>. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>0xFF0008<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u0447\u0438\u0441\u043b\u0430 \u043e\u0442 1307 \u0434\u043e 1320.<\/p>\n<details class=\"spoiler\">\n<summary>\u0415\u0449\u0435 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f &#8212; \u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043c\u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u043c\u0443\u0447\u0430\u0442\u044c\u0441\u044f \u0441 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u043c\u0438. \u042f \u0441\u0434\u0435\u043b\u0430\u043b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0447\u0438\u0441\u0435\u043b \u0434\u043e 1000 \u0447\u0435\u0440\u0435\u0437 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/%D0%A0%D0%B5%D1%88%D0%B5%D1%82%D0%BE_%D0%AD%D1%80%D0%B0%D1%82%D0%BE%D1%81%D1%84%D0%B5%D0%BD%D0%B0\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0448\u0435\u0442\u043e \u042d\u0440\u0430\u0442\u043e\u0441\u0444\u0435\u043d\u0430<\/a>.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u0441\u044f \u043c\u0430\u0441\u0441\u0438\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043d\u0443\u043b\u044f\u043c\u0438. \u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b \u0432\u0441\u0435 \u043d\u043e\u0440\u043e\u0432\u0438\u043b\u0438 \u0437\u0430\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043c\u0435\u0442\u043e\u0434 <code>memset<\/code> \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0438 <code>bool notPrime[N + 1] = {0}<\/code>, \u0447\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0438\u0437\u0431\u0435\u0433\u0430\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0438\u043a\u0430\u043a\u0438\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0435 \u043f\u0440\u0438\u043b\u0438\u043d\u043a\u043e\u0432\u0430\u043d\u044b. \u0412 \u0438\u0442\u043e\u0433\u0435 \u043a\u043e\u0434 \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">    void work() {         constexpr int N = 1000;          \/\/ avoiding calling \"memset\" -_-         volatile bool notPrime[N + 1];         for (int i = 0; i &lt;= N; ++i) {             notPrime[i] = 0;         }          for (int i = 2; i &lt;= N; ++i) {             if (notPrime[i]) {                 continue;             }             *(volatile int*)0xFF0008 = i;             for (int j = 2 * i; j &lt;= N; j += i) {                 notPrime[j] = true;             }         }     }<\/code><\/pre>\n<p>\u0418 \u0441\u0431\u0438\u043b\u0436\u0435\u043d \u0447\u0435\u0440\u0435\u0437 GCC (\u0441 \u043f\u0430\u043a\u0435\u0442\u043e\u043c <code>g++-m68k-linux-gnu<\/code>):<\/p>\n<pre><code class=\"bash\">m68k-linux-gnu-g++ a.cpp -c -O3<\/code><\/pre>\n<p>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 <a href=\"https:\/\/gist.github.com\/Izaron\/e9b3e9dcfc15d4f6fdd601662c74cc68\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/a>, \u0432\u044b\u0432\u043e\u0434 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 <a href=\"https:\/\/gist.githubusercontent.com\/Izaron\/449493d6faab5db23ac822269bd174f8\/raw\/cb38c6c4726ed789e7ee7098ea87f2f5e54cfe08\/output\" rel=\"noopener noreferrer nofollow\">\u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a<\/a>.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0436\u043d\u043e, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0441\u0438\u043d\u0442\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u0441 \u0437\u0430\u043f\u0438\u0441\u044c\u044e \u0441\u0442\u0440\u043e\u043a\u0438 \u0435\u0441\u0442\u044c \u0446\u0435\u043b\u044b\u0445 \u0434\u0432\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<pre><code class=\"cpp\">    void work() {         strcpy((char*)0xFF0008, \"Der beste Seemann war doch ich\");     }<\/code><\/pre>\n<p>\u041f\u0435\u0440\u0432\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0435\u0449\u0435 \u043d\u0435 \u043f\u0440\u0438\u043b\u0438\u043d\u043a\u043e\u0432\u0430\u043d \u043a \u043e\u0431\u044a\u0435\u043a\u0442\u043d\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u044d\u0442\u043e \u0441\u0430\u043c\u0430 \u0441\u0442\u0440\u043e\u043a\u0430, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0449\u0435 \u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e \u043c\u0435\u0441\u0442\u043e \u0432 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<\/div>\n<\/details>\n<p>\u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u0438 \u0443\u0441\u0438\u0434\u0447\u0438\u0432\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u044d\u043c\u0443\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0440\u0430\u0431\u043e\u0442\u0443 Linux \u0434\u043b\u044f m68k. <a href=\"https:\/\/wiki.qemu.org\/Documentation\/Platforms\/m68k\" rel=\"noopener noreferrer nofollow\">QEMU \u0443\u043c\u0435\u0435\u0442 \u0442\u0430\u043a \u0434\u0435\u043b\u0430\u0442\u044c!<\/a><\/p>\n<h2>\u0424\u043e\u0440\u043c\u0430\u0442 ROM-\u0444\u0430\u0439\u043b\u043e\u0432<\/h2>\n<p>\u0414\u043b\u044f \u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u0441\u044f\u043a\u0438\u0445 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432\/\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u043e\u0432 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/github.com\/WerWolv\/ImHex\" rel=\"noopener noreferrer nofollow\">ImHex<\/a>, \u0447\u0442\u043e\u0431\u044b \u043b\u0443\u0447\u0448\u0435 \u0432\u0438\u0434\u0435\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c ROM-\u0444\u0430\u0439\u043b \u0441 \u043b\u044e\u0431\u0438\u043c\u043e\u0439 \u0438\u0433\u0440\u043e\u0439 \u0434\u0435\u0442\u0441\u0442\u0432\u0430 \u0441\u043a\u0430\u0447\u0430\u043d. \u041f\u043e\u0433\u0443\u0433\u043b\u0438\u0432 \u0444\u043e\u0440\u043c\u0430\u0442 ROM-\u0444\u0430\u0439\u043b\u043e\u0432, \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u043c \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u044b\u0435 256 \u0431\u0430\u0439\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <a href=\"https:\/\/wiki.megadrive.org\/index.php?title=68k_vector_table\" rel=\"noopener noreferrer nofollow\">m68k vector table<\/a>, \u0442\u043e \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043d\u0430 \u0432\u0441\u044f\u043a\u0438\u0435 \u0441\u043b\u0443\u0447\u0430\u0438 \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0438 \u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u043d\u043e\u043b\u044c. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 256 \u0431\u0430\u0439\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <a href=\"https:\/\/plutiedev.com\/rom-header\" rel=\"noopener noreferrer nofollow\">ROM header<\/a> \u0441 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0435\u0439 \u043f\u0440\u043e \u0438\u0433\u0440\u0443.<\/p>\n<p>\u041d\u0430\u0431\u0440\u043e\u0441\u0430\u0435\u043c &#171;hex pattern&#187; \u043d\u0430 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u043c \u044f\u0437\u044b\u043a\u0435 ImHex \u0434\u043b\u044f \u043f\u0430\u0440\u0441\u0438\u043d\u0433\u0430 \u0431\u0438\u043d\u0430\u0440\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0430\u0442\u0442\u0435\u0440\u043d sega.hexpat<\/summary>\n<div class=\"spoiler__content\">\n<p><code>\"be\"<\/code> \u043f\u0435\u0440\u0435\u0434 \u0442\u0438\u043f\u043e\u043c \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 big-endian<\/p>\n<pre><code class=\"cpp\">struct AddressRange {     be u32 begin;     be u32 end; };  struct VectorTable {     be u32 initial_sp;     be u32 initial_pc;     be u32 bus_error;     be u32 address_error;     be u32 illegal_instruction;     be u32 zero_divide;     be u32 chk;     be u32 trapv;     be u32 privilege_violation;     be u32 trace;     be u32 line_1010_emulator;     be u32 line_1111_emulator;     be u32 hardware_breakpoint;     be u32 coprocessor_violation;     be u32 format_error;     be u32 uninitialized_interrupt;     be u32 reserved_16_23[8];     be u32 spurious_interrupt;     be u32 autovector_level_1;     be u32 autovector_level_2;     be u32 autovector_level_3;     be u32 hblank;     be u32 autovector_level_5;     be u32 vblank;     be u32 autovector_level_7;     be u32 trap[16];     be u32 reserved_48_63[16]; };  struct RomHeader {     char system_type[16];     char copyright[16];     char title_domestic[48];     char title_overseas[48];     char serial_number[14];     be u16 checksum;     char device_support[16];     AddressRange rom_address_range;     AddressRange ram_address_range;     char extra_memory[12];     char modem_support[12];     char reserved1[40];     char region[3];     char reserved2[13]; };  struct Rom {     VectorTable vector_table;     RomHeader rom_header; };  Rom rom @ 0x00;<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c78\/733\/c34\/c78733c34ef56231e4b044078b3d0ec6.png\" alt=\"ImHex &quot;\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b&quot; \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430\" title=\"ImHex &quot;\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b&quot; \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430\" width=\"2240\" height=\"1350\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c78\/733\/c34\/c78733c34ef56231e4b044078b3d0ec6.png\"\/><\/p>\n<div><figcaption>ImHex &#171;\u0440\u0430\u0437\u043e\u0431\u0440\u0430\u043b&#187; \u043d\u0430\u0447\u0430\u043b\u043e \u0444\u0430\u0439\u043b\u0430<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043c \u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0435-\u0442\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043d\u0430\u0447\u0438\u043d\u0430\u044f \u0441 <code>initial_pc<\/code> (\u0442\u043e\u0447\u043a\u0430 \u0432\u0445\u043e\u0434\u0430) \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0432 \u043f\u0435\u0440\u0432\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f\u0445:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/f65\/2ca\/cf5\/f652cacf5e19d95bf3b51bc5919399e9.png\" alt=\"\u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0432 ImHex\" title=\"\u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0432 ImHex\" width=\"2240\" height=\"1350\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/f65\/2ca\/cf5\/f652cacf5e19d95bf3b51bc5919399e9.png\"\/><\/p>\n<div><figcaption>\u0414\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u0432 ImHex<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0438\u0437 &#171;hex pattern&#187; \u0437\u0430\u0432\u0435\u0437\u0442\u0438 \u0432 C++ &#8212; \u043f\u0440\u0438\u043c\u0435\u0440 \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/sega\/rom_loader\/rom_loader.h\" rel=\"noopener noreferrer nofollow\">lib\/sega\/rom_loader\/rom_loader.h<\/a> (\u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0435 \u043f\u043e\u043b\u044f \u043f\u043e\u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b).<\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 \u043c\u043d\u043e\u0433\u0438\u0445 \u0434\u0440\u0443\u0433\u0438\u0445 \u0444\u043e\u0440\u043c\u0430\u0442\u043e\u0432 \u0433\u0434\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438 \u043a\u0430\u043a \u0431\u044b \u043d\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u0441\u0430\u043c\u043e\u0433\u043e \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0433\u043e, \u0432 ROM-\u0444\u0430\u0439\u043b\u0430\u0445 \u044d\u0442\u043e\u0442 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0432 512 \u0431\u0430\u0439\u0442 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u0435\u043e\u0442\u044a\u0435\u043c\u043b\u0435\u043d\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e, \u0442\u043e \u0435\u0441\u0442\u044c ROM-\u0444\u0430\u0439\u043b \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0434\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0432 \u043f\u0430\u043c\u044f\u0442\u044c. \u041f\u043e \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0443 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0435\u043c\u0443 \u043e\u0442\u0432\u0435\u0434\u0435\u043d\u0430 \u043e\u0431\u043b\u0430\u0441\u0442\u044c <code>0x000000 - 0x3FFFFF<\/code>.<\/p>\n<h2>Bus Device<\/h2>\n<p>\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u043e\u043c \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c <code>BusDevice<\/code>  (bus = \u0448\u0438\u043d\u0430) \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441-\u043d\u0430\u0441\u043b\u0435\u0434\u043d\u0438\u043a <code>Device<\/code>, \u0438 \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\/\u0447\u0442\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0432 \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 device.<\/p>\n<pre><code class=\"cpp\">class BusDevice : public Device { public:   struct Range {     AddressType begin;     AddressType end;   };   void add_device(Range range, Device* device);    \/* ... \u0435\u0449\u0435 override \u043c\u0435\u0442\u043e\u0434\u044b `read` \u0438 `write` *\/  private:   struct MappedDevice {     const Range range;     Device* device;   };   std::vector&lt;MappedDevice&gt; mapped_devices_; };<\/code><\/pre>\n<p>\u0418 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0443 m68k \u043f\u043e\u0434\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430. \u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f &#8212; <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/sega\/memory\/bus_device.h\" rel=\"noopener noreferrer nofollow\">lib\/sega\/memory\/bus_device.h<\/a><\/p>\n<h2>GUI<\/h2>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0432\u043e\u0434 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u043b\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0435 \u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u0442\u043e\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b, \u043d\u043e \u0434\u043b\u044f \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0434\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0432\u0441\u0435 \u0432 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<p>\u0414\u043b\u044f GUI \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u043c\u0435\u0433\u0430 \u043a\u0440\u0443\u0442\u0443\u044e \u043b\u0438\u0431\u0443 <a href=\"https:\/\/github.com\/ocornut\/imgui\" rel=\"noopener noreferrer nofollow\">ImGui<\/a>. \u0412 \u043d\u0435\u0439 \u043e\u0447\u0435\u043d\u044c \u043c\u043d\u043e\u0433\u043e \u0432\u0441\u0435\u0433\u043e, \u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0430\u043a\u043e\u0439 \u0443\u0433\u043e\u0434\u043d\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d20\/ef8\/adc\/d20ef8adcb69d625d9717f64711f0da5.png\" alt=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 - \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 m68k\" title=\"\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 - \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 m68k\" width=\"457\" height=\"1042\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d20\/ef8\/adc\/d20ef8adcb69d625d9717f64711f0da5.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043c\u0435\u0440 \u043e\u043a\u043d\u0430 &#8212; \u0441\u0442\u0430\u0442\u0443\u0441 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 m68k<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0451 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u043a\u043d\u0430\u0445 &#8212; \u0431\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u0442\u0440\u0443\u0434\u043d\u043e.<\/p>\n<h2>\u0420\u0430\u0431\u043e\u0442\u0430 \u0432 Docker<\/h2>\n<p>\u0427\u0442\u043e\u0431\u044b \u043d\u0435 \u0441\u0442\u0440\u0430\u0434\u0430\u0442\u044c \u043e\u0442 \u0441\u0442\u0430\u0440\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0438 \u043d\u0430 \u0441\u0432\u043e\u0435\u043c \u043a\u043e\u043c\u043f\u0435 (\u043a\u043e\u0433\u0434\u0430 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0441\u0442\u0430\u0440\u044b\u0435, \u0434\u0430\u0436\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0439 C++ \u043d\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u0443\u0435\u0442\u0441\u044f) \u0438 \u043d\u0435 \u0437\u0430\u0433\u0440\u044f\u0437\u043d\u044f\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u043c\u0438 \u043b\u0435\u0432\u044b\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043b\u0443\u0447\u0448\u0435 \u0432\u0435\u0441\u0442\u0438 \u0438\u0437-\u043f\u043e\u0434 Docker.<\/p>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u0432\u0435\u0434\u0438\u0442\u0435 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/Dockerfile\" rel=\"noopener noreferrer nofollow\">Dockerfile<\/a>, \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438 \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u043f\u0435\u0440\u0435\u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u0440\u0430\u0437:<\/p>\n<pre><code class=\"bash\">sudo docker build -t segacxx .<\/code><\/pre>\n<p>\u0418 \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u0435 \u0432 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 \u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 (<code>-v<\/code>) \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043d\u0443\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438:<\/p>\n<pre><code class=\"bash\">sudo docker run --privileged -v \/home\/eshulgin:\/usr\/src -v \/home\/eshulgin\/.config\/nvim:\/root\/.config\/nvim -v \/home\/eshulgin\/.local\/share\/nvim:\/root\/.local\/share\/nvim -v \/tmp\/.X11-unix:\/tmp\/.X11-unix -e DISPLAY=unix${DISPLAY} -it segacxx<\/code><\/pre>\n<p>\u041f\u043e\u0434\u0432\u043e\u0434\u043d\u044b\u0435 \u043a\u0430\u043c\u043d\u0438:<\/p>\n<ol>\n<li>\n<p>\u041c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0443\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0441 GUI, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u0441\u043f\u043e\u0440\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0433\u0443\u0433\u043b\u0435\u0436\u0430 \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438\u0441\u044c <code>-v<\/code> \u0434\u043b\u044f X11 \u0438 <code>-e DISPLAY<\/code><\/p>\n<\/li>\n<li>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0447\u0442\u043e\u0431\u044b GUI \u0440\u0430\u0431\u043e\u0442\u0430\u043b, \u043d\u0443\u0436\u043d\u043e \u0441 \u043a\u043e\u043c\u043f\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c <code>xhost +<\/code>, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c &#171;access control&#187;.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0431\u044b\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430\u043c (\u043f\u0440\u043e \u043d\u0438\u0445 \u0440\u0430\u0437\u0434\u0435\u043b \u043d\u0438\u0436\u0435) \u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f <code>--privileged<\/code>.<\/p>\n<\/li>\n<\/ol>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc6\/658\/5d9\/bc66585d948fd8b756f4e5d50f36a2c1.png\" alt=\"NeoVim \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0438\u0437-\u043f\u043e\u0434 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\" title=\"NeoVim \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0438\u0437-\u043f\u043e\u0434 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430\" width=\"2240\" height=\"1350\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc6\/658\/5d9\/bc66585d948fd8b756f4e5d50f36a2c1.png\"\/><\/p>\n<div><figcaption>NeoVim \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 \u0438\u0437-\u043f\u043e\u0434 docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<h2>\u0420\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0433 \u0438\u0433\u0440 \u0432 Ghidra<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044e m68k \u043f\u043e ROM&#8217;\u0443, \u043f\u043e\u0447\u0438\u0442\u0430\u043b\u0438 \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043d\u0430\u043a\u0438\u0434\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432 \u0432 \u0448\u0438\u043d\u0443 (ROM, RAM, <a href=\"https:\/\/segaretro.org\/TradeMark_Security_System\" rel=\"noopener noreferrer nofollow\">trademark-\u0440\u0435\u0433\u0438\u0441\u0442\u0440<\/a>, etc.), \u0438 \u044d\u043c\u0443\u043b\u0438\u0440\u0443\u0435\u043c \u043f\u043e \u043e\u0434\u043d\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438, \u0433\u043b\u044f\u0434\u044f \u0432 \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440.<\/p>\n<p>\u042d\u0442\u043e \u043c\u0443\u0442\u043e\u0440\u043d\u043e\u0435 \u0437\u0430\u043d\u044f\u0442\u0438\u0435, \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u0443\u044e \u043a\u0430\u0440\u0442\u0438\u043d\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0442\u044c \u0438\u0433\u0440\u0443. \u042f \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e <a href=\"https:\/\/github.com\/NationalSecurityAgency\/ghidra\" rel=\"noopener noreferrer nofollow\">Ghidra<\/a>:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ecd\/de7\/0bb\/ecdde70bb000c26fe9cc03ca2936ad97.png\" alt=\"\u0420\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0433 \u0438\u0433\u0440\u044b \u0434\u043b\u044f Sega Mega Drive\" title=\"\u0420\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0433 \u0438\u0433\u0440\u044b \u0434\u043b\u044f Sega Mega Drive\" width=\"2240\" height=\"1350\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ecd\/de7\/0bb\/ecdde70bb000c26fe9cc03ca2936ad97.png\"\/><\/p>\n<div><figcaption>\u0420\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0433 \u0438\u0433\u0440\u044b \u0434\u043b\u044f Sega Mega Drive<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0447\u0435\u043d\u044c \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0441\u0442\u0430\u0440\u0442 \u0434\u0430\u0435\u0442 <a href=\"https:\/\/github.com\/lab313ru\/ghidra_sega_ldr\" rel=\"noopener noreferrer nofollow\">\u043f\u043b\u0430\u0433\u0438\u043d<\/a> \u043e\u0442 <a class=\"mention\" href=\"\/users\/drmefisto\">@DrMefistO<\/a> &#8212; \u043e\u043d \u0441\u0430\u043c \u043f\u0440\u043e\u043c\u0430\u0440\u043a\u0438\u0440\u0443\u0435\u0442 \u043e\u0431\u0449\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430 \u0438 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0441\u0435\u0433\u043c\u0435\u043d\u0442\u044b.<\/p>\n<p>\u041c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0432\u0438\u0434\u0435\u0442\u044c, \u0447\u0442\u043e \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0438\u0433\u0440\u044b \u043f\u0438\u0441\u0430\u043b\u0438\u0441\u044c \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e, \u0442\u043e \u0443 \u043d\u0438\u0445 \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0432\u0438\u0434:<\/p>\n<ul>\n<li>\n<p>\u0412\u043f\u0435\u0440\u0435\u043c\u0435\u0448\u043a\u0443 \u043a\u043e\u0434 \u0438 \u0434\u0430\u043d\u043d\u044b\u0435 &#8212; \u0435\u0441\u0442\u044c \u043a\u0443\u0441\u043e\u043a \u043a\u043e\u0434\u0430, \u043f\u043e\u0442\u043e\u043c \u0438\u0434\u0443\u0442 \u043a\u0443\u0441\u043a\u0438 \u0431\u0430\u0439\u0442\u043e\u0432 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u0446\u0432\u0435\u0442\u0430, \u043f\u043e\u0442\u043e\u043c \u0441\u043d\u043e\u0432\u0430 \u043a\u043e\u0434, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0412\u0441\u0435 \u043f\u043e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0444\u043e\u043d \u041d\u0435\u0439\u043c\u0430\u043d\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0427\u0442\u043e\u0431\u044b \u0441\u0434\u0435\u043b\u0430\u0442\u044c &#171;\u0444\u0440\u0435\u0439\u043c&#187;, \u0432 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 m68k \u043d\u0430\u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/github.com\/prb28\/m68k-instructions-documentation\/blob\/master\/instructions\/link.md\" rel=\"noopener noreferrer nofollow\">LINK<\/a> \u0438 <a href=\"https:\/\/github.com\/prb28\/m68k-instructions-documentation\/blob\/master\/instructions\/unlk.md\" rel=\"noopener noreferrer nofollow\">UNLK<\/a>. \u041d\u0430 \u0434\u0435\u043b\u0435 \u0442\u0430\u043a\u043e\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f, \u0432 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u0439&#187; \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043f\u043e\u043b\u0443-\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b. \u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 &#171;\u0444\u0443\u043d\u043a\u0446\u0438\u0438&#187; \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432 \u0444\u043b\u0430\u0433 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 ZF). \u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u0432 Ghidra \u0432 \u0442\u0430\u043a\u0438\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445 \u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0440\u0443\u043a\u0430\u043c\u0438, \u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u0447\u0442\u043e\u0431\u044b \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043a\u0430\u0437\u0430\u043b \u0431\u043e\u043b\u0435\u0435 \u0430\u0434\u0435\u043a\u0432\u0430\u0442\u043d\u044b\u0439 \u0432\u044b\u0432\u043e\u0434.<\/p>\n<\/li>\n<\/ul>\n<div class=\"floating-image\">\n<figure class=\"float full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c62\/250\/7ac\/c622507acdf3a97e555babde80ab1d9d.png\" alt=\"&quot;switch&quot; \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439\" title=\"&quot;switch&quot; \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439\" width=\"1207\" height=\"1052\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c62\/250\/7ac\/c622507acdf3a97e555babde80ab1d9d.png\"\/><\/p>\n<div><figcaption>&#171;switch&#187; \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u0435\u0442\u0441\u044f &#171;switch&#187; \u0438\u0437 \u0444\u0443\u043d\u043a\u0446\u0438\u0439, \u043a\u043e\u0433\u0434\u0430 \u0443 \u0444\u0443\u043d\u043a\u0446\u0438\u0439 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043d\u0442, \u043d\u043e \u043f\u0435\u0440\u0432\u044b\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f, \u043f\u0440\u0438\u043c\u0435\u0440 \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0435<\/p>\n<\/div>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 (\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 Sega), \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0442\u044c \u0432\u0441\u044e \u0438\u0433\u0440\u0443 &#8212; \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043a\u0430\u043a\u0438\u0445-\u0442\u043e 5-10%. \u041b\u0443\u0447\u0448\u0435 \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0442\u044c \u0442\u0443 \u0438\u0433\u0440\u0443, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0432\u044b \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u043e\u043c\u043d\u0438\u0442\u0435 \u0438\u0437 \u0434\u0435\u0442\u0441\u0442\u0432\u0430, \u0447\u0442\u043e\u0431\u044b \u043e\u043d\u0430 \u043d\u0435 \u0431\u044b\u043b\u0430 &#171;\u0447\u0435\u0440\u043d\u044b\u043c \u044f\u0449\u0438\u043a\u043e\u043c&#187;.<\/p>\n<p>\u042d\u0442\u043e \u0443\u043c\u0435\u043d\u0438\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c, \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u0441\u0442\u0440\u043e \u043e\u0442\u0434\u0435\u0431\u0430\u0436\u0438\u0442\u044c \u043f\u043e\u043b\u043e\u043c\u043a\u0443 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u0438\u0433\u0440\u0430\u0445.<\/p>\n<h2>\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0439<\/h2>\n<p>\u041f\u0443\u0441\u0442\u044c \u043a\u0430\u043a\u0430\u044f-\u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0440\u0430\u0431\u043e\u0447\u0430\u044f \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 \u0438 \u043e\u043d \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e \u043f\u043e\u043f\u0430\u0434\u0430\u0435\u0442 \u0432 \u0432\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b. \u041e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0432 \u043c\u0435\u0441\u0442\u043e, \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u0442\u0430\u043c \u043e\u0431\u043d\u0443\u043b\u044f\u0435\u0442\u0441\u044f \u0444\u043b\u0430\u0433 \u0432 RAM \u0438 \u0437\u0430\u0442\u0435\u043c \u0446\u0438\u043a\u043b \u0436\u0434\u0435\u0442 \u043f\u043e\u043a\u0430 \u043e\u043d \u043e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u043d\u0443\u043b\u0435\u0432\u044b\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/dce\/48d\/f87\/dce48df8796151e8288881f07294d81f.png\" alt=\"\u0423\u0436\u0435 \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f WaitVBLANK\" title=\"\u0423\u0436\u0435 \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f WaitVBLANK\" width=\"676\" height=\"653\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/dce\/48d\/f87\/dce48df8796151e8288881f07294d81f.png\"\/><\/p>\n<div><figcaption>\u0423\u0436\u0435 \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f WaitVBLANK<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043c\u043e\u0442\u0440\u0438\u043c, \u0433\u0434\u0435 \u0435\u0449\u0435 \u0435\u0441\u0442\u044c \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u044d\u0442\u043e\u043c\u0443 \u043c\u0435\u0441\u0442\u0443, \u0438 \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u044d\u0442\u043e \u043a\u043e\u0434 \u043f\u043e \u043c\u0435\u0441\u0442\u0443 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f VBLANK. \u041e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0438\u043c VBLANK:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/333\/c90\/f09\/333c90f09ae1153af04402fd650408ee.png\" alt=\"\u0423\u0436\u0435 \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f VBLANK\" title=\"\u0423\u0436\u0435 \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f VBLANK\" width=\"668\" height=\"526\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/333\/c90\/f09\/333c90f09ae1153af04402fd650408ee.png\"\/><\/p>\n<div><figcaption>\u0423\u0436\u0435 \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d\u043d\u0430\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f VBLANK<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0442\u043e \u0442\u0430\u043a\u0438\u0435 \u043b\u0435\u0433\u0435\u043d\u0434\u0430\u0440\u043d\u044b\u0439 VBLANK \u0438 \u0435\u0433\u043e \u0432\u043d\u0443\u043a \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0439 HBLANK?<\/p>\n<p>\u0412\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 60 \u0438\u043b\u0438 50 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 (\u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 <a href=\"https:\/\/ru.wikipedia.org\/wiki\/NTSC\" rel=\"noopener noreferrer nofollow\">NTSC \u0438\u043b\u0438 PAL\/SECAM<\/a>) \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0441\u0442\u0430\u0440\u043e\u043c \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440\u0435 \u0444\u0440\u0435\u0439\u043c &#171;\u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e&#187;.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/e63\/43a\/6d5\/e6343a6d5b3b07bc2981d581bbaa8755.png\" alt=\"\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0430 (source)\" title=\"\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0430 (source)\" width=\"874\" height=\"452\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/e63\/43a\/6d5\/e6343a6d5b3b07bc2981d581bbaa8755.png\"\/><\/p>\n<div><figcaption>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0430 (<a href=\"https:\/\/segaretro.org\/Sega_Mega_Drive\/Interrupts\" rel=\"noopener noreferrer nofollow\">source<\/a>)<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0442\u0435\u043a\u0443\u0449\u0430\u044f \u043b\u0438\u043d\u0438\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u0430 \u0438 \u043b\u0443\u0447 \u0438\u0434\u0435\u0442 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 (\u0437\u0435\u043b\u0435\u043d\u044b\u0435 \u043e\u0442\u0440\u0435\u0437\u043a\u0438 \u043d\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0435 \u0432\u044b\u0448\u0435) \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 HBLANK. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u0439 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c \u0432\u0441\u0435\u0433\u043e 18 \u0431\u0430\u0439\u0442 (\u0445\u043e\u0442\u044f \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043d\u0435 \u0441\u0442\u0430\u0432\u043b\u044e), \u0438 \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0435 \u0438\u0433\u0440\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u044d\u0442\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435.<\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0432\u0435\u0441\u044c \u0444\u0440\u0435\u0439\u043c \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d \u0438 \u043b\u0443\u0447 \u0438\u0434\u0435\u0442 \u0432 \u043d\u0430\u0447\u0430\u043b\u043e \u044d\u043a\u0440\u0430\u043d\u0430 (\u0441\u0438\u043d\u0438\u0439 \u043e\u0442\u0440\u0435\u0437\u043e\u043a) \u0432 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 VBLANK. \u0417\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0432 \u0432\u0438\u0434\u0435\u043e\u043f\u0430\u043c\u044f\u0442\u044c \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 7Kb \u0434\u0430\u043d\u043d\u044b\u0445.<\/p>\n<p>\u041f\u0443\u0441\u0442\u044c \u043c\u044b \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0434\u0438\u043b\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 NTSC (60 \u0444\u0440\u0435\u0439\u043c\u043e\u0432 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443). \u0427\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435, \u043d\u0430\u0434\u043e \u0432 \u0446\u0438\u043a\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0432\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043c\u043e\u0442\u0440\u0438\u0442 &#8212; \u0435\u0441\u043b\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0443\u0441\u043b\u043e\u0432\u0438\u044f:<\/p>\n<ol>\n<li>\n<p>VBLANK-\u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u0435 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0432\u0438\u0434\u0435\u043e\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c;<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 Interrupt Mask \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 \u043c\u0435\u043d\u044c\u0448\u0435 \u0447\u0435\u043c 6 (\u044d\u0442\u043e \u0442\u0438\u043f\u0430 \u0443\u0440\u043e\u0432\u0435\u043d\u044c \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u0438 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f);<\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0448\u043b\u043e 1s\/60 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0433\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f;<\/p>\n<\/li>\n<\/ol>\n<p>\u0442\u043e \u043f\u0440\u044b\u0433\u0430\u0435\u043c \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">std::optional&lt;Error&gt; InterruptHandler::call_vblank() {   \/\/ push PC (4 bytes)   auto&amp; sp = registers_.stack_ptr();   sp -= 4;   if (auto err = bus_device_.write(sp, registers_.pc)) {     return err;   }    \/\/ push SR (2 bytes)   sp -= 2;   if (auto err = bus_device_.write(sp, Word{registers_.sr})) {     return err;   }    \/\/ make supervisor, set priority mask, jump to VBLANK   registers_.sr.supervisor = 1;   registers_.sr.interrupt_mask = VBLANK_INTERRUPT_LEVEL;   registers_.pc = vblank_pc_;    return std::nullopt; }<\/code><\/pre>\n<p>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/sega\/executor\/interrupt_handler.cpp\" rel=\"noopener noreferrer nofollow\">lib\/sega\/executor\/interrupt_handler.cpp<\/a>.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430 \u0438\u0433\u0440 \u043a\u0440\u0443\u0442\u0438\u0442\u0441\u044f \u0432\u043e\u043a\u0440\u0443\u0433 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f, \u044d\u0442\u043e &#171;\u0434\u0432\u0438\u0433\u0430\u0442\u0435\u043b\u044c&#187; \u0438\u0433\u0440\u044b.<\/p>\n<p>\u0412 GUI \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0434\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0443 \u044d\u043a\u0440\u0430\u043d\u0430 \u043f\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f VBLANK.<\/p>\n<h2>Video Display Processor<\/h2>\n<p>Video Display Processor, \u043e\u043d \u0436\u0435 VDP &#8212; \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e \u0441\u043b\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u043f\u043e\u0441\u043b\u0435 m68k. \u0427\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b, \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u044d\u0442\u0438 \u0441\u0430\u0439\u0442\u044b:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/plutiedev.com\/\" rel=\"noopener noreferrer nofollow\">Plutiedev<\/a> &#8212; \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u043e VDP, \u0430 \u0432 \u0446\u0435\u043b\u043e\u043c \u043f\u0440\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043f\u043e\u0434 Sega Mega Drive, \u0435\u0441\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0430\u0439\u0442\u043e\u0432 \u043a\u0430\u043a \u0432 \u0438\u0433\u0440\u0430\u0445 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u044b \u043f\u0441\u0435\u0432\u0434\u043e-float \u0438 \u043f\u0440\u043e\u0447\u0430\u044f \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u0430.<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/rasterscroll.com\/mdgraphics\/\" rel=\"noopener noreferrer nofollow\">Raster Scroll<\/a> &#8212; \u0441\u0443\u043f\u0435\u0440 \u043a\u0440\u0443\u0442\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 VDP \u0441 \u0442\u043e\u043d\u043d\u043e\u0439 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u044f \u0431\u044b \u043f\u043e\u0441\u043e\u0432\u0435\u0442\u043e\u0432\u0430\u043b \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0430.<\/p>\n<\/li>\n<\/ul>\n<p>&lt;\u041d\u0430\u0447\u0430\u043b\u043e \u043d\u0443\u0434\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430&gt;<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u0430\u043a &#8212; \u0443 \u043d\u0435\u0433\u043e 24 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442 \u0437\u0430 \u0432\u0441\u044f\u043a\u0443\u044e \u0445\u0440\u0435\u043d\u043e\u0432\u043d\u044e, \u0430 \u0442\u0430\u043a\u0436\u0435 64Kb \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e RAM (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f VRAM &#8212; Video RAM), \u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0441\u043e\u0432\u0430\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0433\u0440\u0430\u0444\u0438\u043a\u0435.<br \/>\u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u043e VRAM \u0437\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 m68k (\u043e\u043d \u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b), \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u043d\u0430 VBLANK, \u0438 VDP \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0443 \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u043c \u0434\u0430\u043d\u043d\u044b\u043c \u0438 \u0432\u0441\u0451, \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442.<\/p>\n<p>\u0412 VDP \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0430\u0432\u043e\u0440\u043e\u0447\u0435\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u043e \u0446\u0432\u0435\u0442\u0430\u043c\u0438. \u0412 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e 4 \u043f\u0430\u043b\u0438\u0442\u0440\u044b, \u0432 \u043a\u0430\u0436\u0434\u043e\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f 16 \u0446\u0432\u0435\u0442\u043e\u0432, \u043a\u0430\u0436\u0434\u044b\u0439 \u0446\u0432\u0435\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 9 \u0431\u0438\u0442 (\u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e 3 \u0431\u0438\u0442\u0430 \u043d\u0430 R\/G\/B, \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e 512 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0445 \u0446\u0432\u0435\u0442\u043e\u0432).<br \/>\u041f\u0435\u0440\u0432\u044b\u0439 \u0446\u0432\u0435\u0442 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439, \u0442\u043e \u0435\u0441\u0442\u044c \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e 15 \u0446\u0432\u0435\u0442\u043e\u0432 \u043f\u043b\u044e\u0441 &#171;\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0441\u0442\u044c&#187;.<\/p>\n<p>\u0411\u0430\u0437\u043e\u0432\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 VDP \u044d\u0442\u043e &#171;\u0442\u0430\u0439\u043b&#187; &#8212; \u044d\u0442\u043e \u043a\u0432\u0430\u0434\u0440\u0430\u0442 \u0438\u0437 8&#215;8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439. \u041f\u0440\u0438\u043a\u043e\u043b \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u043a\u0430\u0436\u0434\u043e\u043c \u043f\u0438\u043a\u0441\u0435\u043b\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0446\u0432\u0435\u0442, \u0430 \u043d\u043e\u043c\u0435\u0440 \u0446\u0432\u0435\u0442\u0430 \u0432 \u043f\u0430\u043b\u0438\u0442\u0440\u0435. \u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0443\u0445\u043e\u0434\u0438\u0442 4 \u0431\u0438\u0442\u0430 (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043e\u0442 0 \u0434\u043e 15), \u0441\u0443\u043c\u043c\u0430\u0440\u043d\u043e \u043d\u0430 \u043e\u0434\u0438\u043d \u0442\u0430\u0439\u043b \u0443\u0445\u043e\u0434\u0438\u0442 32 \u0431\u0430\u0439\u0442\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043f\u0440\u043e\u0441\u0438\u0442\u044c &#8212; \u0430 \u0433\u0434\u0435 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u043e\u043c\u0435\u0440 \u043f\u0430\u043b\u0438\u0442\u0440\u044b? \u0410 \u043e\u043d \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435 \u0432 \u0442\u0430\u0439\u043b\u0435, \u0430 \u0432 \u0431\u043e\u043b\u0435\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 &#8212; &#171;plane&#187; \u0438\u043b\u0438 &#171;sprite&#187;.<\/p>\n<p>\u0412\u044b\u0441\u043e\u0442\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c 28 \u0438\u043b\u0438 30 \u0442\u0430\u0439\u043b\u043e\u0432, \u0434\u043b\u0438\u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c 32 \u0438\u043b\u0438 40 \u0442\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>\u0412 VDP \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u044b \u0434\u0432\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f &#171;Plane A&#187; \u0438 &#171;Plane B&#187; (\u043d\u0430 \u0434\u0435\u043b\u0435 \u0435\u0441\u0442\u044c \u0435\u0449\u0435 &#171;Window Plane&#187;) &#8212; \u044d\u0442\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u0438 \u0437\u0430\u0434\u043d\u0438\u0439 \u0444\u043e\u043d, \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 64&#215;32 \u0442\u0430\u0439\u043b\u043e\u0432.<\/p>\n<p>\u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u043c\u0435\u043d\u044f\u0442\u044c \u0441\u0434\u0432\u0438\u0433 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043c\u0435\u0440\u044b \u0441 \u0440\u0430\u0437\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u0435\u0440\u0435\u0434\u043d\u0438\u0439 \u0444\u043e\u043d \u043d\u0430 +2 \u043f\u0438\u043a\u0441\u0435\u043b\u044f \u0437\u0430 \u0444\u0440\u0435\u0439\u043c, \u0437\u0430\u0434\u043d\u0438\u0439 \u043d\u0430 +1), \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0432\u0430\u0442\u044c \u044d\u0444\u0444\u0435\u043a\u0442 \u043e\u0431\u044a\u0435\u043c\u0430 \u0432 \u0438\u0433\u0440\u0435.<br \/>\u0423 plane \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0434\u0432\u0438\u0433 \u0434\u043b\u044f &#171;\u0441\u0442\u0440\u043e\u043a\u0438&#187; \u0432 8 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u044d\u0444\u0444\u0435\u043a\u0442\u044b.<br \/>Plane \u0437\u0430\u0434\u0430\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043f\u0430\u043b\u0438\u0442\u0440\u0443 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0430\u0439\u043b\u0430, \u0430 \u0432 \u0446\u0435\u043b\u043e\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f plane \u043c\u043e\u0433\u0443\u0442 \u0437\u0430\u043d\u0438\u043c\u0430\u0442\u044c \u043d\u0435\u0445\u0438\u043b\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432\u043e VRAM.<\/p>\n<p>\u0412 VDP \u0435\u0441\u0442\u044c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c &#171;sprite&#187; &#8212; \u044d\u0442\u043e \u0441\u043e\u0441\u0442\u0430\u0432\u043d\u043e\u0439 \u043a\u0443\u0441\u043e\u043a \u0438\u0437 \u0442\u0430\u0439\u043b\u043e\u0432 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0442 1&#215;1 \u0434\u043e 4&#215;4 (\u0442.\u0435. \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u0441\u043f\u0440\u0430\u0439\u0442\u044b \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c 2&#215;4 \u0442\u0430\u0439\u043b\u0430 \u0438\u043b\u0438 3&#215;2 \u0442\u0430\u0439\u043b\u0430), \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u0437\u0438\u0446\u0438\u044f \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0438 \u043f\u0430\u043b\u0438\u0442\u0440\u0430, \u0441\u043e\u0433\u043b\u0430\u0441\u043d\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u0439\u043b\u044b. \u0421\u043f\u0440\u0430\u0439\u0442 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0442\u0440\u0430\u0436\u0435\u043d \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438 \u0438\/\u0438\u043b\u0438 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0430\u0439\u043b\u044b. \u041c\u043d\u043e\u0433\u0438\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432, \u0435\u0441\u043b\u0438 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442.<br \/>\u0412 VDP \u0432\u043b\u0435\u0437\u0430\u0435\u0442 \u043d\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 80 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0435 &#171;link&#187;, \u044d\u0442\u043e \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438, \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u044d\u0442\u0430\u043a\u0438\u0439 linked list. VDP \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0441\u043f\u0440\u0430\u0439\u0442, \u043f\u043e\u0442\u043e\u043c \u0441\u043f\u0440\u0430\u0439\u0442 \u043a\u0443\u0434\u0430 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 &#171;link&#187; \u043d\u0443\u043b\u0435\u0432\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430, \u0438 \u0442\u0430\u043a \u043f\u043e\u043a\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 &#171;link&#187; \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0432\u0435\u043d \u043d\u0443\u043b\u044e. \u042d\u0442\u043e \u043d\u0443\u0436\u043d\u043e \u0434\u043b\u044f \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0439 \u0433\u043b\u0443\u0431\u0438\u043d\u044b \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432.<\/p>\n<p>\u0412 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043d\u044b\u0445 \u043e\u0431\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u0441\u0442\u0432, \u0432\u043e VRAM \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043b\u044f 1400-1700 \u0442\u0430\u0439\u043b\u043e\u0432, \u0447\u0442\u043e \u0432\u0440\u043e\u0434\u0435 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043d\u0435\u043f\u043b\u043e\u0445\u043e, \u043d\u043e \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0437\u0430\u0434\u043d\u0438\u0439 \u0444\u043e\u043d \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0442\u0430\u0439\u043b\u0430\u043c\u0438, \u0442\u043e \u043d\u0430 \u044d\u0442\u043e \u0443\u0439\u0434\u0435\u0442 ~1100 \u0442\u0430\u0439\u043b\u043e\u0432 \u0438 \u043d\u0438 \u043d\u0430 \u0447\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0435 \u043d\u0435 \u0445\u0432\u0430\u0442\u0438\u0442. \u0422\u0430\u043a \u0447\u0442\u043e \u043b\u0435\u0432\u0435\u043b-\u0434\u0438\u0437\u0430\u0439\u043d\u0435\u0440\u044b \u0436\u0435\u0441\u0442\u043a\u043e \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0442\u0430\u0439\u043b\u044b \u0434\u043b\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0438.<\/p>\n<p>\u0412 VDP \u0435\u0441\u0442\u044c \u043a\u0443\u0447\u0430 \u0432\u0441\u044f\u043a\u0438\u0445 \u043f\u0440\u0430\u0432\u0438\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0434\u0432\u0430 \u0443\u0440\u043e\u0432\u043d\u044f &#171;\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430&#187; \u0441\u043b\u043e\u0435\u0432:<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fff\/a05\/5ee\/fffa055ee7f0c7821831ac68b7e26e3b.png\" alt=\"\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0441\u043b\u043e\u0435\u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 VDP\" title=\"\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0441\u043b\u043e\u0435\u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 VDP\" width=\"515\" height=\"398\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fff\/a05\/5ee\/fffa055ee7f0c7821831ac68b7e26e3b.png\"\/><\/p>\n<div><figcaption>\u041f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b \u0441\u043b\u043e\u0435\u0432 \u0433\u0440\u0430\u0444\u0438\u043a\u0438 VDP<\/figcaption><\/div>\n<\/figure>\n<p>&lt;\u041a\u043e\u043d\u0435\u0446 \u043d\u0443\u0434\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430&gt;<\/p>\n<p>\u041e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c VDP \u043b\u0443\u0447\u0448\u0435 \u0438\u0442\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e. \u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c &#171;\u043f\u0430\u043b\u0438\u0442\u0440\u044b&#187;, \u0438 \u043f\u0440\u0438\u043a\u0438\u0434\u044b\u0432\u0430\u0442\u044c, \u0447\u0442\u043e \u043e\u043d\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043c\u0435\u043d\u044f\u044e\u0442\u0441\u044f \u0441\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0446\u0432\u0435\u0442\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u0436\u0435, \u043a\u0430\u043a \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0438 \u0438\u043b\u0438 \u0433\u043b\u0430\u0432\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u044e:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9c7\/ed7\/a2b\/9c7ed7a2b4e783b5ca45c2090f07c7da.png\" alt=\"\u041e\u043a\u043d\u043e \u0432 GUI - \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0441\u043e \u0446\u0432\u0435\u0442\u0430\u043c\u0438\" title=\"\u041e\u043a\u043d\u043e \u0432 GUI - \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0441\u043e \u0446\u0432\u0435\u0442\u0430\u043c\u0438\" width=\"701\" height=\"225\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9c7\/ed7\/a2b\/9c7ed7a2b4e783b5ca45c2090f07c7da.png\"\/><\/p>\n<div><figcaption>\u041e\u043a\u043d\u043e \u0432 GUI &#8212; \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u0441\u043e \u0446\u0432\u0435\u0442\u0430\u043c\u0438<\/figcaption><\/div>\n<\/figure>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u0442\u0430\u0439\u043b\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/92a\/76e\/df7\/92a76edf7f8719018397d67aeefa8974.png\" alt=\"\u0412\u0441\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 0\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\" title=\"\u0412\u0441\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 0\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c\" width=\"2159\" height=\"1251\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/92a\/76e\/df7\/92a76edf7f8719018397d67aeefa8974.png\"\/><\/p>\n<div><figcaption>\u0412\u0441\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 0\u0439 \u043f\u0430\u043b\u0438\u0442\u0440\u0435 \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c<\/figcaption><\/div>\n<\/figure>\n<details class=\"spoiler\">\n<summary>\u042d\u0442\u0438 \u0436\u0435 \u0442\u0430\u0439\u043b\u044b \u0432 \u0434\u0440\u0443\u0433\u0438\u0445 \u043f\u0430\u043b\u0438\u0442\u0440\u0430\u0445<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/fd2\/1b9\/c4d\/fd21b9c4dbd166c4cb958b6232e2100b.png\" alt=\"1\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\" title=\"1\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\" width=\"1564\" height=\"903\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/fd2\/1b9\/c4d\/fd21b9c4dbd166c4cb958b6232e2100b.png\"\/><\/p>\n<div><figcaption>1\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/766\/518\/763\/76651876305878524fdfcb71a909a19e.png\" alt=\"2\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\" title=\"2\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\" width=\"1567\" height=\"905\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/766\/518\/763\/76651876305878524fdfcb71a909a19e.png\"\/><\/p>\n<div><figcaption>2\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a28\/399\/459\/a28399459af508d711399ac257508f14.png\" alt=\"3\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\" title=\"3\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430\" width=\"1564\" height=\"906\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a28\/399\/459\/a28399459af508d711399ac257508f14.png\"\/><\/p>\n<div><figcaption>3\u044f \u043f\u0430\u043b\u0438\u0442\u0440\u0430<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u0417\u0430\u0442\u0435\u043c \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u0442\u044c planes \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u043c \u043e\u043a\u043d\u0430\u043c:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/25a\/6b9\/d11\/25a6b9d11cd7da39018729a3476c99af.png\" alt=\"\u0414\u0432\u0430 plane \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0432\u043d\u0438\u0437\u0443) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u043d\u0430\u0432\u0435\u0440\u0445\u0443)\" title=\"\u0414\u0432\u0430 plane \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0432\u043d\u0438\u0437\u0443) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u043d\u0430\u0432\u0435\u0440\u0445\u0443)\" width=\"2035\" height=\"1313\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/25a\/6b9\/d11\/25a6b9d11cd7da39018729a3476c99af.png\"\/><\/p>\n<div><figcaption>\u0414\u0432\u0430 plane \u043f\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 (\u0432\u043d\u0438\u0437\u0443) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u043d\u0430\u0432\u0435\u0440\u0445\u0443)<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u0435\u0441\u0442\u044c &#171;window plane&#187;, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/85b\/5b8\/7a5\/85b5b87a5f11b0a894894f3d5d8b097d.png\" alt=\"Window Plane (\u0441\u043f\u0440\u0430\u0432\u0430) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u0441\u043b\u0435\u0432\u0430)\" title=\"Window Plane (\u0441\u043f\u0440\u0430\u0432\u0430) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u0441\u043b\u0435\u0432\u0430)\" width=\"1558\" height=\"1111\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/85b\/5b8\/7a5\/85b5b87a5f11b0a894894f3d5d8b097d.png\"\/><\/p>\n<div><figcaption>Window Plane (\u0441\u043f\u0440\u0430\u0432\u0430) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u0441\u043b\u0435\u0432\u0430)<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u0442\u043e\u043c \u043d\u0430\u0441\u0442\u0443\u043f\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/122\/b33\/b35\/122b33b35e5ea1c8689fa42d31f33df5.png\" alt=\"\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 (\u0441\u043f\u0440\u0430\u0432\u0430) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u0441\u043b\u0435\u0432\u0430)\" title=\"\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 (\u0441\u043f\u0440\u0430\u0432\u0430) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u0441\u043b\u0435\u0432\u0430)\" width=\"1964\" height=\"912\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/122\/b33\/b35\/122b33b35e5ea1c8689fa42d31f33df5.png\"\/><\/p>\n<div><figcaption>\u041d\u0430\u0447\u0430\u043b\u043e \u0441\u043f\u0438\u0441\u043a\u0430 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 (\u0441\u043f\u0440\u0430\u0432\u0430) \u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0444\u0440\u0435\u0439\u043c (\u0441\u043b\u0435\u0432\u0430)<\/figcaption><\/div>\n<\/figure>\n<p>\u041f\u043e\u043b\u043d\u0430\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0449\u0438\u043a\u0430 &#8212; <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/sega\/video\/video.cpp\" rel=\"noopener noreferrer nofollow\">lib\/sega\/video\/video.cpp<\/a>.<\/p>\n<p>\u0412\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u0444\u0440\u0435\u0439\u0441 \u043d\u0430\u0434\u043e \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e. \u0427\u0442\u043e\u0431\u044b \u043f\u0438\u043a\u0441\u0435\u043b\u0438 \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u0432 ImGui, \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c 2D-\u0442\u0435\u043a\u0441\u0442\u0443\u0440\u0443 OpenGL \u0438 \u0437\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u0442\u044c \u0442\u0443\u0434\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u0444\u0440\u0435\u0439\u043c:<\/p>\n<pre><code class=\"cpp\">ImTextureID Video::draw() {   glBindTexture(GL_TEXTURE_2D, texture_);   glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width_ * kTileDimension, height_ * kTileDimension, 0, GL_RGBA,                GL_UNSIGNED_BYTE, canvas_.data());   return texture_; }<\/code><\/pre>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0449\u0438\u043a\u0430 VDP<\/h2>\n<p>\u0425\u043e\u0442\u044f \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0438\u0433\u0440\u0443 \u0438 \u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u0430\u043b\u043e\u0441\u044c, \u044d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e. \u041b\u0443\u0447\u0448\u0435 \u0434\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0434\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u0441\u043b\u0443\u0447\u0430\u0435\u0432, \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0434\u0430\u043c\u043f\u043e\u0432, \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 \u043d\u0430 \u0434\u0430\u043c\u043f\u0430\u0445 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438, \u0438 \u043f\u043e <code>git status<\/code> \u0441\u0442\u0430\u043d\u0435\u0442 \u0432\u0438\u0434\u043d\u043e, \u043a\u0430\u043a\u0438\u0435 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u0438\u0441\u044c. \u042d\u0442\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043c\u043e\u0436\u043d\u043e \u0444\u0438\u043a\u0441\u0438\u0442\u044c \u0431\u0430\u0433\u0438 VDP \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044f \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440.<\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u0432 GUI \u043a\u043d\u043e\u043f\u043a\u0443 <code>Save Dump<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0438\u0434\u0435\u043e-\u043f\u0430\u043c\u044f\u0442\u0438 (\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b VDP + VRAM + CRAM + VSRAM). \u042d\u0442\u0438 \u0434\u0430\u043c\u043f\u044b \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043b \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/tree\/main\/src\/bin\/sega_video_test\/dumps\" rel=\"noopener noreferrer nofollow\">bin\/sega_video_test\/dumps<\/a> \u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043b <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/bin\/sega_video_test\/README.md\" rel=\"noopener noreferrer nofollow\">README<\/a> \u043a\u0430\u043a \u043f\u0435\u0440\u0435\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u043e\u0434\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439.<\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u043f\u043e\u0441\u043b\u0430\u043b\u0438\u0441\u044c \u0432 \u0432\u0438\u0434\u0435\u043e-\u043f\u0430\u043c\u044f\u0442\u044c (\u043d\u0430 \u043f\u0430\u0440\u0435 \u0434\u0430\u043c\u043f\u043e\u0432 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435 \u044d\u0442\u043e \u043d\u0435 \u0442\u0430\u043a).<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0432 png-\u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u043b\u0430\u0441\u044c \u043b\u0438\u0431\u0430 <a href=\"https:\/\/github.com\/nothings\/stb\/blob\/master\/stb_image.h\" rel=\"noopener noreferrer nofollow\">std_image<\/a>.<\/p>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0440\u0435\u0442\u0440\u043e-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/h2>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043d\u0435 \u0438\u0434\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u043f\u0443\u0442\u0435\u043c, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0442\u0440\u043e-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0435 \u0441\u0435\u0433\u043e\u0432\u044b\u043c.<\/p>\n<p>\u041f\u043e\u0433\u0443\u0433\u043b\u0438\u043b, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043a\u0443\u043f\u0438\u0442\u044c \u043f\u043e\u0431\u043b\u0438\u0437\u043e\u0441\u0442\u0438, \u0438 \u0437\u0430 \u0434\u0435\u043d\u044c\u0433\u0438 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 29$ \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u043b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043e\u0442 &#171;Retroflag&#187; (\u043d\u0435 \u0440\u0435\u043a\u043b\u0430\u043c\u0430):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5e5\/14d\/0b1\/5e514d0b1f1bd4c2d7ada11dd76694f4.png\" width=\"905\" height=\"479\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5e5\/14d\/0b1\/5e514d0b1f1bd4c2d7ada11dd76694f4.png\"\/><\/figure>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0441 \u043e\u0434\u043d\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c \u0437\u0430\u044f\u0432\u043b\u044f\u043b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 Windows, \u0430 \u043f\u0440\u043e Linux \u043d\u0435 \u0431\u044b\u043b\u043e \u043d\u0438 \u0441\u043b\u043e\u0432\u0430, \u0430 \u0441 \u0434\u0440\u0443\u0433\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b ImGui \u0437\u0430\u044f\u0432\u043b\u044f\u043b \u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u043e\u0432 Xbox+PlayStation+Nintendo Switch, \u0442\u043e \u044f \u0431\u044b\u043b \u043c\u043e\u0440\u0430\u043b\u044c\u043d\u043e \u0433\u043e\u0442\u043e\u0432 \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0442\u044c \u0435\u0449\u0435 \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440.<\/p>\n<p>\u041d\u043e \u043a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u043e\u0431\u043e\u0448\u043b\u043e\u0441\u044c. \u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c 3-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439 \u0441\u0435\u0433\u0430-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043c\u0430\u043b\u043e\u0439 \u043a\u0440\u043e\u0432\u044c\u044e, \u043f\u043e\u043d\u0430\u0436\u0438\u043c\u0430\u0432 \u043a\u043d\u043e\u043f\u043a\u0438 \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0432 \u043a\u0430\u043a\u043e\u043c\u0443 \u043a\u043e\u0434\u0443 \u043e\u043d\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442:<\/p>\n<details class=\"spoiler\">\n<summary>\u041c\u0430\u043f\u043f\u0438\u043d\u0433 \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b \u0438 \u0440\u0435\u0442\u0440\u043e-\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">void Gui::update_controller() {   static constexpr std::array kMap = {       \/\/ keyboard keys       std::make_pair(ImGuiKey_Enter, ControllerDevice::Button::Start),        std::make_pair(ImGuiKey_LeftArrow, ControllerDevice::Button::Left),       std::make_pair(ImGuiKey_RightArrow, ControllerDevice::Button::Right),       std::make_pair(ImGuiKey_UpArrow, ControllerDevice::Button::Up),       std::make_pair(ImGuiKey_DownArrow, ControllerDevice::Button::Down),        std::make_pair(ImGuiKey_A, ControllerDevice::Button::A),       std::make_pair(ImGuiKey_S, ControllerDevice::Button::B),       std::make_pair(ImGuiKey_D, ControllerDevice::Button::C),        \/\/ Retroflag joystick buttons       std::make_pair(ImGuiKey_GamepadStart, ControllerDevice::Button::Start),        std::make_pair(ImGuiKey_GamepadDpadLeft, ControllerDevice::Button::Left),       std::make_pair(ImGuiKey_GamepadDpadRight, ControllerDevice::Button::Right),       std::make_pair(ImGuiKey_GamepadDpadUp, ControllerDevice::Button::Up),       std::make_pair(ImGuiKey_GamepadDpadDown, ControllerDevice::Button::Down),        std::make_pair(ImGuiKey_GamepadFaceDown, ControllerDevice::Button::A),       std::make_pair(ImGuiKey_GamepadFaceRight, ControllerDevice::Button::B),       std::make_pair(ImGuiKey_GamepadR2, ControllerDevice::Button::C),   };    auto&amp; controller = executor_.controller_device();   for (const auto&amp; [key, button] : kMap) {     if (ImGui::IsKeyPressed(key, \/*repeat=*\/false)) {       controller.set_button(button, true);     } else if (ImGui::IsKeyReleased(key)) {       controller.set_button(button, false);     }   } }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<details class=\"spoiler\">\n<summary>\u041d\u0435\u0431\u043e\u043b\u044c\u0448\u0430\u044f \u0441\u0430\u0439\u0434-\u0441\u0442\u043e\u0440\u0438 \u043f\u0440\u043e \u0441\u043b\u0443\u0447\u0430\u0439, \u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0432\u0435\u0437\u043b\u043e<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0423 \u043c\u0435\u043d\u044f \u0435\u0441\u0442\u044c \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u0430 &#171;HyperX Alloy Origins Core&#187; (\u0442\u043e\u0436\u0435 \u043d\u0435 \u0440\u0435\u043a\u043b\u0430\u043c\u0430), \u0442\u0430\u043c \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c RGB-\u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0441\u043e \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438 (\u0430\u043d\u0438\u043c\u0430\u0446\u0438\u044f, \u0440\u0435\u0430\u043a\u0446\u0438\u044f \u043d\u0430 \u043d\u0430\u0436\u0430\u0442\u0438\u044f), \u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u044b, \u043d\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0434\u043b\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0435\u0441\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 Windows, \u0430 \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u043d\u0430 Linux \u043f\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u0441\u043e\u0431\u044b\u0442\u0438\u044f\u043c.<\/p>\n<p>\u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u043d\u0438\u043c\u0430\u0442\u044c \u0434\u0430\u043c\u043f\u044b USB \u0432 Wireshark, \u043f\u043e\u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 &#8212; \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0442\u0430\u0432\u0438\u0448\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043a\u0440\u0430\u0441\u043d\u044b\u0439 \u0446\u0432\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043d\u0430 \u043e\u0434\u043d\u0443 \u043a\u043d\u043e\u043f\u043a\u0443, \u043b\u043e\u0432\u0438\u0448\u044c \u0447\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u0438\u0434\u0438\u0448\u044c \u043a\u0430\u043a\u0438\u0435 \u0431\u0430\u0439\u0442\u044b \u0437\u0430 \u044d\u0442\u0443 \u043a\u043d\u043e\u043f\u043a\u0443 \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0442, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u041f\u043e\u0434\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043d\u0435\u043a\u0443\u0434\u0430 (\u0435\u0441\u043b\u0438 \u043d\u0435 \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u0442\u044c .exe), \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0434\u044f\u0434\u044f \u041b\u044f\u043e \u0432 \u043f\u043e\u0434\u0432\u0430\u043b\u0435 AliExpressTech, \u0434\u043e\u043a\u0438 \u043d\u0435\u0442. \u0425\u043e\u0442\u044f \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043a\u043b\u0430\u0432\u044b \u0435\u0441\u0442\u044c \u043d\u0435\u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0435\u0432\u0435\u0440\u0441 \u0432 <a href=\"https:\/\/gitlab.com\/CalcProgrammer1\/OpenRGB\/-\/blob\/master\/Controllers\/HyperXKeyboardController\/HyperXAlloyOriginsCoreController\/HyperXAlloyOriginsCoreController.cpp\" rel=\"noopener noreferrer nofollow\">OpenRGB<\/a>, \u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0435\u0441\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0434\u043b\u044f \u0440\u0435\u0432\u0435\u0440\u0441\u043e\u0432 \u0432\u0441\u044f\u043a\u043e\u0439 \u0440\u0430\u0437\u043d\u043e\u0446\u0432\u0435\u0442\u043d\u043e\u0439 \u0445\u0440\u0435\u043d\u0438.<\/p>\n<\/div>\n<\/details>\n<h2>\u041f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b<\/h2>\n<p>\u0414\u043b\u044f \u043a\u0440\u0443\u0442\u043e\u0441\u0442\u0438 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b.<\/p>\n<p>\u042d\u0442\u043e \u0431\u044b\u043b\u043e \u043e\u0447\u0435\u043d\u044c \u0431\u043e\u043b\u044c\u043d\u043e &#8212; \u0432 ImGui \u0448\u0435\u0439\u0434\u0435\u0440\u044b \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0437\u0430\u0434\u043d\u0438\u0446\u0443, \u0438 \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0436\u0443\u0442\u043a\u0438\u043c \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u043c. \u041a\u0440\u043e\u043c\u0435 \u044d\u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043d\u0430\u043c\u0443\u0447\u0438\u0442\u044c\u0441\u044f \u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043b\u0438\u0431\u044b GLAD, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430. \u0415\u0449\u0435 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0435 \u043b\u044e\u0431\u044b\u043c, \u0430 \u043d\u0430 GLSL \u0432\u0435\u0440\u0441\u0438\u0438 130, \u0438 \u0435\u0449\u0435 \u0442\u0430\u043c \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f &#171;\u0438\u0437\u0432\u043d\u0435&#187; \u044d\u0442\u043e <code>uniform sampler2D Texture;<\/code>, \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e \u044d\u0442\u043e \u043a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b.<\/p>\n<p>\u041c\u043e\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u0431\u044b\u043b\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c CRT-\u0448\u0435\u0439\u0434\u0435\u0440, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u043c\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043b \u0431\u044b \u0441\u0442\u0430\u0440\u044b\u0439 \u0442\u0435\u043b\u0435\u0432\u0438\u0437\u043e\u0440, \u0438 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0435\u0449\u0435 \u043a\u0430\u043a\u0438\u0435-\u043d\u0438\u0431\u0443\u0434\u044c \u0448\u0435\u0439\u0434\u0435\u0440\u044b.<\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u044f \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0439 \u043d\u043e\u043b\u044c \u0432 \u0448\u0435\u0439\u0434\u0435\u0440\u0430\u0445, \u0437\u0430 \u043c\u0435\u043d\u044f \u0438\u0445 \u0441\u0434\u0435\u043b\u0430\u043b ChatGPT, \u0443\u0447\u0442\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0432\u044b\u0448\u0435. \u0418\u0445 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/sega\/shader\/shader.cpp\" rel=\"noopener noreferrer nofollow\">lib\/sega\/shader\/shader.cpp<\/a>. \u042f \u0434\u0430\u0436\u0435 \u043d\u0435 \u0432\u0447\u0438\u0442\u044b\u0432\u0430\u043b\u0441\u044f \u0432 \u043a\u043e\u0434 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438. <\/p>\n<p>\u0424\u0438\u0447\u0438 CRT-\u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u043e\u0442 \u043d\u0435\u0439\u0440\u043e\u0441\u0435\u0442\u043a\u0438:<\/p>\n<ul>\n<li>\n<p>Barrel Distortion &#8212; \u044d\u0444\u0444\u0435\u043a\u0442 \u0432\u044b\u043f\u0443\u043a\u043b\u043e\u0441\u0442\u0438;<\/p>\n<\/li>\n<li>\n<p>Scanline Darkness &#8212; \u043a\u0430\u0436\u0434\u0430\u044f \u0432\u0442\u043e\u0440\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u0442\u0435\u043c\u043d\u0435\u0435;<\/p>\n<\/li>\n<li>\n<p>Chromatic Aberration &#8212; \u043a\u0430\u043a \u0431\u044b \u0438\u0441\u043a\u0430\u0436\u0435\u043d\u0438\u0435 RBG-\u0441\u043b\u043e\u0435\u0432;<\/p>\n<\/li>\n<li>\n<p>Vignette &#8212; \u0446\u0432\u0435\u0442 \u043f\u043e \u043a\u0440\u0430\u044f\u043c \u0442\u0435\u043c\u043d\u0435\u0435 (\u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a\u0438 \u043f\u043e\u0441\u0430\u0434\u0438\u043b \u043a\u0438\u043d\u0435\u0441\u043a\u043e\u043f&#8230;)<\/p>\n<\/li>\n<\/ul>\n<p>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0448\u0435\u0439\u0434\u0435\u0440\u0430:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/29c\/84e\/4c0\/29c84e4c0aff0055c749dc456b0244ac.png\" alt=\"\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\" title=\"\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440\" width=\"1629\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/29c\/84e\/4c0\/29c84e4c0aff0055c749dc456b0244ac.png\"\/><\/p>\n<div><figcaption>\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u0447\u0442\u043e\u0431\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440<\/figcaption><\/div>\n<\/figure>\n<p>\u0424\u0440\u0435\u0434 \u0424\u043b\u0438\u043d\u0441\u0442\u043e\u0443\u043d \u0434\u043e \u0448\u0435\u0439\u0434\u0435\u0440\u0430 \u0438 \u043f\u043e\u0441\u043b\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u0430 (\u0443\u0432\u0435\u043b\u0438\u0447\u0435\u043d\u043d\u044b\u0439):<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ad1\/60a\/d02\/ad160ad02784b2950d809cce5f6d7ae6.png\" width=\"1206\" height=\"711\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ad1\/60a\/d02\/ad160ad02784b2950d809cce5f6d7ae6.png\"\/><\/figure>\n<p>\u041f\u043e\u043f\u0440\u043e\u0441\u0438\u043b ChatGPT \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0448\u0435\u0439\u0434\u0435\u0440\u044b, \u043d\u043e \u043e\u043d\u0438 \u043d\u0435 \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0435:<\/p>\n<details class=\"spoiler\">\n<summary>\u0428\u0435\u0439\u0434\u0435\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/b96\/2fc\/ee4\/b962fcee48628c1d8e59aeaa57431b39.png\" alt=\"\u0411\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432\" title=\"\u0411\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432\" width=\"1632\" height=\"1282\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/b96\/2fc\/ee4\/b962fcee48628c1d8e59aeaa57431b39.png\"\/><\/p>\n<div><figcaption>\u0411\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d81\/01d\/4d7\/d8101d4d787bcfe1b3ae7544ef8bf9ea.png\" alt=\"\u0428\u0435\u0439\u0434\u0435\u0440 Desaturate\" title=\"\u0428\u0435\u0439\u0434\u0435\u0440 Desaturate\" width=\"1631\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d81\/01d\/4d7\/d8101d4d787bcfe1b3ae7544ef8bf9ea.png\"\/><\/p>\n<div><figcaption>\u0428\u0435\u0439\u0434\u0435\u0440 Desaturate<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/aa0\/e6d\/0e1\/aa0e6d0e17caa4ae731ddd8dc0090e95.png\" alt=\"\u0428\u0435\u0439\u0434\u0435\u0440 Glitch\" title=\"\u0428\u0435\u0439\u0434\u0435\u0440 Glitch\" width=\"1630\" height=\"1280\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/aa0\/e6d\/0e1\/aa0e6d0e17caa4ae731ddd8dc0090e95.png\"\/><\/p>\n<div><figcaption>\u0428\u0435\u0439\u0434\u0435\u0440 Glitch<\/figcaption><\/div>\n<\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee8\/abb\/a4a\/ee8abba4ab09199775ef5721783728c8.png\" alt=\"\u0428\u0435\u0439\u0434\u0435\u0440 Night Vision\" title=\"\u0428\u0435\u0439\u0434\u0435\u0440 Night Vision\" width=\"1631\" height=\"1278\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee8\/abb\/a4a\/ee8abba4ab09199775ef5721783728c8.png\"\/><\/p>\n<div><figcaption>\u0428\u0435\u0439\u0434\u0435\u0440 Night Vision<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<p>\u042f \u0438\u0433\u0440\u0430\u043b \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0431\u0435\u0437 \u0448\u0435\u0439\u0434\u0435\u0440\u043e\u0432, \u0438\u043d\u043e\u0433\u0434\u0430 \u0441 CRT.<\/p>\n<h2>\u041e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f Release-\u0441\u0431\u043e\u0440\u043a\u0438<\/h2>\n<p>\u041c\u043e\u0436\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u0441\u044f \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u043c, \u043d\u043e \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0430 \u044d\u0442\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0435\u043c\u043a\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430, \u0435\u0441\u043b\u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435\u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e. \u041f\u0443\u0441\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u043a\u0440\u0430\u043d\u0430 320&#215;240 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439, \u043c\u044b \u0438\u0442\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043f\u043e\u043f\u0438\u043a\u0441\u0435\u043b\u044c\u043d\u043e. \u0412 \u043b\u044e\u0431\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043d\u0430 \u044d\u043a\u0440\u0430\u043d\u0435 \u0435\u0441\u0442\u044c \u0434\u043e 80 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u043f\u043b\u044e\u0441 \u0442\u0440\u0438 plane, \u043f\u043b\u044e\u0441 \u0443 \u043d\u0438\u0445 \u0435\u0441\u0442\u044c &#171;\u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442&#187;, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0445 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043d\u0430\u0434\u043e \u043f\u043e \u0434\u0432\u0430 \u0440\u0430\u0437\u0430. \u0423 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0441\u043f\u0440\u0430\u0439\u0442\u0430 \u0438\u043b\u0438 plane \u043d\u0430\u0434\u043e \u043d\u0430\u0439\u0442\u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043f\u0438\u043a\u0441\u0435\u043b\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e \u043e\u043d \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 bounding box, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0442\u0430\u0439\u043b \u0438\u0437 \u0442\u0430\u0439\u043b\u0441\u0435\u0442\u0430 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0442\u043e \u043f\u0438\u043a\u0441\u0435\u043b\u044c &#171;\u043d\u0435\u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u044b\u0439&#187;. \u0418 \u0432\u0441\u0451 \u044d\u0442\u043e \u043d\u0430\u0434\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c 60 \u0440\u0430\u0437 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0443 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u044b\u0441\u0442\u0440\u043e, \u0447\u0442\u043e\u0431\u044b \u0435\u0449\u0435 \u043e\u0441\u0442\u0430\u0432\u0430\u043b\u043e\u0441\u044c \u0432\u0440\u0435\u043c\u044f \u043d\u0430 ImGui \u0438 \u043d\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 m68k.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043b\u0438\u0448\u043d\u0435\u0433\u043e \u043a\u043e\u0434\u0430, \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u041d\u0430 \u0434\u0435\u043b\u0435 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0438\u043c\u0435\u0442\u044c Release-\u0441\u0431\u043e\u0440\u043a\u0443 \u0441 \u0432\u044b\u043a\u0440\u0443\u0447\u0435\u043d\u043d\u044b\u043c\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u043c\u0438 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<pre><code class=\"cmake\">set(CMAKE_BUILD_TYPE Release)<\/code><\/pre>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u043c \u043d\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0444\u0438\u0447\u0438 \u0438 \u043b\u0438\u0448\u043d\u0438\u0435 \u0432\u0430\u0440\u043d\u0438\u043d\u0433\u0438:<\/p>\n<pre><code class=\"cmake\">add_compile_options(-Wno-format) add_compile_options(-Wno-nan-infinity-disabled) add_compile_options(-fno-exceptions) add_compile_options(-fno-rtti)<\/code><\/pre>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0440\u0435\u0436\u0438\u043c \u0441\u0431\u043e\u0440\u043a\u0438 <code>Ofast<\/code>, \u0441\u0431\u0438\u043b\u0434\u0438\u043c \u043f\u043e\u0434 \u043d\u0430\u0442\u0438\u0432\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 (\u0432 \u0443\u0449\u0435\u0440\u0431 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0430), \u0441 link-time optimization, \u0440\u0430\u0441\u043a\u0440\u0443\u0442\u043a\u043e\u0439 \u0446\u0438\u043a\u043b\u043e\u0432 \u0438 &#171;\u0431\u044b\u0441\u0442\u0440\u043e\u0439&#187; \u043c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u043a\u043e\u0439:<\/p>\n<pre><code class=\"cmake\">set(CMAKE_CXX_FLAGS_RELEASE     \"${CMAKE_CXX_FLAGS_RELEASE} \\      -Ofast \\      -march=native \\      -flto \\      -funroll-loops \\      -ffast-math\" )<\/code><\/pre>\n<p>\u042d\u0442\u043e\u0433\u043e \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u044b\u0435 60 FPS \u0438 \u0434\u0430\u0436\u0435 120 FPS \u0435\u0441\u043b\u0438 \u0438\u0433\u0440\u0430\u0442\u044c \u0441 x2 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e (\u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0434\u043b\u044f \u043f\u0440\u0435\u0440\u044b\u0432\u0430\u043d\u0438\u044f VBLANK \u0443\u043c\u0435\u043d\u044c\u0448\u0430\u0435\u0442\u0441\u044f \u0432 2 \u0440\u0430\u0437\u0430).<\/p>\n<p>\u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435, \u0447\u0442\u043e \u043c\u043e\u0436\u043d\u043e &#171;\u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c&#187; &#8212; \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 \u043f\u0438\u043a\u0441\u0435\u043b\u0435\u0439 \u043d\u0430 <em>\u043e\u0434\u043d\u043e\u0439<\/em> \u0441\u0442\u0440\u043e\u043a\u0435 (\u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0442\u0440\u043e\u043a\u0430\u0445 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043d\u0435\u043b\u044c\u0437\u044f, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043c\u0435\u0436\u0434\u0443 \u0441\u0442\u0440\u043e\u043a\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 HBLANK \u0438 \u0442\u0430\u043c \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0441\u0432\u043e\u043f\u043d\u0443\u0442\u044c \u0446\u0432\u0435\u0442\u0430), \u043d\u043e \u044f \u0431\u044b \u043d\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c. \u0415\u0441\u043b\u0438 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0442\u044c \u044d\u0442\u043e, \u0442\u043e \u0434\u043b\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0439 \u0443\u0442\u0438\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c lock-free \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c, \u0430 \u043c\u044b \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0442\u0443\u0434\u0430 \u043b\u0435\u0437\u0442\u044c \u0431\u0435\u0437 \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0433\u0440\u0430\u043c\u0438<\/h2>\n<p>\u041f\u043e\u0447\u0442\u0438 \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u0433\u0440\u0430 \u043f\u0440\u0438\u043d\u043e\u0441\u0438\u043b\u0430 \u0447\u0442\u043e-\u0442\u043e \u043d\u043e\u0432\u043e\u0435 \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 &#8212; \u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u0430\u044f \u0444\u0438\u0447\u0430 VDP (\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b), \u0442\u043e \u0438\u0433\u0440\u0430 \u0434\u0435\u043b\u0430\u0435\u0442 \u0447\u0442\u043e-\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u0417\u0434\u0435\u0441\u044c \u044f \u043e\u043f\u0438\u0441\u0430\u043b \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u043a\u043e\u043b\u044b, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f, \u043f\u043e\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0438\u0433\u0440.<\/p>\n<h4>\u0417\u0430\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0441\u0440\u0430\u0437\u0443<\/h4>\n<p>\u041d\u0430 \u0438\u0433\u0440\u0435 <strong><em>Cool Spot (1993)<\/em><\/strong> \u044f \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043f\u043e\u0441\u0442\u0440\u043e\u0438\u043b \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 &#8212; \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u043b \u0435\u0435, \u0434\u0435\u0431\u0430\u0436\u0438\u043b \u043f\u0440\u0438\u043a\u043e\u043b\u044b VDP \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435. \u041f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 &#171;Cool Spot&#187; \u044d\u0442\u043e \u043c\u0430\u0441\u043a\u043e\u0442 \u043b\u0438\u043c\u043e\u043d\u0430\u0434\u0430 &#171;7 Up&#187; &#8212; \u043e\u043d \u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0421\u0428\u0410, \u0434\u043b\u044f \u043f\u0440\u043e\u0447\u0438\u0445 \u0440\u0435\u0433\u0438\u043e\u043d\u043e\u0432 \u043c\u0430\u0441\u043a\u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0439. \u042d\u0442\u043e \u043a\u0440\u0430\u0441\u0438\u0432\u044b\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u0440, \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u043b \u0435\u0433\u043e \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0432 \u0434\u0435\u0442\u0441\u0442\u0432\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/996\/47c\/45e\/99647c45e1ccbb0de4c8fc6779cc223c.png\" alt=\"Cool Spot (1993)\" title=\"Cool Spot (1993)\" width=\"1636\" height=\"1286\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/996\/47c\/45e\/99647c45e1ccbb0de4c8fc6779cc223c.png\"\/><\/p>\n<div><figcaption>Cool Spot (1993)<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0433\u0440\u0430 <strong><em>Earthworm Jim (1994)<\/em><\/strong> &#8212; \u0447\u0435\u0440\u0432\u044f\u043a \u0448\u0430\u0440\u0438\u0442\u0441\u044f \u043f\u043e \u043f\u043e\u043c\u043e\u0439\u043a\u0430\u043c, \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043a\u0440\u0443\u0442\u043e.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c0\/14f\/d59\/8c014fd5980d8a5dba61e60ebc0aa586.png\" alt=\"Earthworm Jim (1994)\" title=\"Earthworm Jim (1994)\" width=\"1633\" height=\"1287\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c0\/14f\/d59\/8c014fd5980d8a5dba61e60ebc0aa586.png\"\/><\/p>\n<div><figcaption>Earthworm Jim (1994)<\/figcaption><\/div>\n<\/figure>\n<p>\u0418\u0433\u0440\u0430 <strong><em>Alladin (1993)<\/em><\/strong> &#8212; \u043d\u0435 \u043e\u0447\u0435\u043d\u044c \u0437\u0430\u0448\u043b\u043e, \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u0438 \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439 \u0431\u0435\u0437 \u043e\u0441\u043e\u0431\u044b\u0445 \u0444\u043e\u043a\u0443\u0441\u043e\u0432.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/ee3\/71b\/4b9\/ee371b4b9a0bf6f45226c3b1686f1168.png\" alt=\"Alladin (1993)\" title=\"Alladin (1993)\" width=\"1631\" height=\"1284\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/ee3\/71b\/4b9\/ee371b4b9a0bf6f45226c3b1686f1168.png\"\/><\/p>\n<div><figcaption>Alladin (1993)<\/figcaption><\/div>\n<\/figure>\n<h4>\u0427\u0442\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 VDP<\/h4>\n<p>\u041d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0433\u0440\u044b \u0447\u0438\u0442\u0430\u044e\u0442 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u044b\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 VDP &#8212; \u0435\u0441\u043b\u0438 \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u0442, \u0442\u043e \u0438\u0433\u0440\u0430 \u0437\u0430\u0432\u0438\u0441\u043d\u0435\u0442 \u0438\u043b\u0438 \u043f\u043e\u0432\u0435\u0434\u0435\u0442 \u043d\u0435\u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<p>\u0422\u0430\u043a \u0431\u044b\u043b\u043e \u0432 <strong><em>Battle Toads (1992)<\/em><\/strong>, \u0438\u0433\u0440\u0430 \u0434\u0435\u043b\u0430\u043b\u0430 \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">    do {       wVar2 = VDP_CTRL;     } while ((wVar2 &amp; 2) != 0);<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/d23\/80e\/9cb\/d2380e9cbd613a04ab0073913c20720e.png\" alt=\"Battle Toads (1992)\" title=\"Battle Toads (1992)\" width=\"1636\" height=\"1284\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/d23\/80e\/9cb\/d2380e9cbd613a04ab0073913c20720e.png\"\/><\/p>\n<div><figcaption>Battle Toads (1992)<\/figcaption><\/div>\n<\/figure>\n<h4>&#171;Window Plane&#187; \u043f\u043e-\u0434\u0440\u0443\u0433\u043e\u043c\u0443 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u0448\u0438\u0440\u0438\u043d\u0435 32 \u0442\u0430\u0439\u043b\u0430<\/h4>\n<p>\u041e\u0434\u043d\u043e \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043b\u043e\u0445\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043c\u0435\u0441\u0442 &#8212; \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 &#171;window plane&#187;. \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0435\u0441\u043b\u0438 \u0448\u0438\u0440\u0438\u043d\u0430 \u043e\u043a\u043d\u0430 32 \u0442\u0430\u0439\u043b\u0430, \u0430 \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0441\u0435\u0445 plane 64 \u0442\u0430\u0439\u043b\u0430, \u0442\u043e \u0434\u043b\u044f &#171;window plane&#187; \u0442\u0430\u0439\u043b \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u0438\u0437 \u0440\u0430\u0441\u0447\u0435\u0442\u0430 \u0447\u0442\u043e \u0435\u0433\u043e \u0448\u0438\u0440\u0438\u043d\u0430 \u0432\u0441\u0435-\u0442\u0430\u043a\u0438 32 \u0442\u0430\u0439\u043b\u0430. \u041d\u0435 \u0441\u043c\u043e\u0433 \u043d\u0430\u0439\u0442\u0438, \u0433\u0434\u0435 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043e, \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u0443 \u0441\u0435\u0431\u044f \u043a\u043e\u0441\u0442\u044b\u043b\u044c.<\/p>\n<p>\u041f\u0440\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 \u0438\u0433\u0440\u0435 <strong><em>Goofy&#8217;s Hysterical History Tour (1993)<\/em><\/strong>. \u042d\u0442\u0430 \u0438\u0433\u0440\u0430 \u0442\u0430\u043a \u0441\u0435\u0431\u0435 \u043f\u043e \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u044e, \u043d\u0430 \u043b\u044e\u0431\u0438\u0442\u0435\u043b\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/122\/b67\/67a\/122b6767a447f241a62c2e6e640e103f.png\" alt=\"Goofy's Hysterical History Tour (1993), \u0436\u0435\u043b\u0442\u0430\u044f \u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u0432\u043d\u0438\u0437\u0443 \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0437 &quot;Window Plane&quot;\" title=\"Goofy's Hysterical History Tour (1993), \u0436\u0435\u043b\u0442\u0430\u044f \u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u0432\u043d\u0438\u0437\u0443 \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0437 &quot;Window Plane&quot;\" width=\"1803\" height=\"1288\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/122\/b67\/67a\/122b6767a447f241a62c2e6e640e103f.png\"\/><\/p>\n<div><figcaption>Goofy&#8217;s Hysterical History Tour (1993), \u0436\u0435\u043b\u0442\u0430\u044f \u043f\u043e\u043b\u043e\u0441\u043a\u0430 \u0432\u043d\u0438\u0437\u0443 \u043f\u0440\u0438\u0448\u043b\u0430 \u0438\u0437 &#171;Window Plane&#187;<\/figcaption><\/div>\n<\/figure>\n<h4>\u041e\u0448\u0438\u0431\u043a\u0438 \u0441 auto increment \u0432 DMA<\/h4>\n<p>\u0421\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 VDP \u044d\u0442\u043e DMA (Direct Memory Access), \u043f\u0440\u0438\u0434\u0443\u043c\u0430\u043d\u043d\u044b\u0439 \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u043a\u0443\u0441\u043a\u0438 \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0437 RAM m68k \u0432\u043e VRAM. \u0422\u0430\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0435\u0436\u0438\u043c\u043e\u0432 \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043a, \u0438 \u043c\u043e\u0436\u043d\u043e \u043b\u0435\u0433\u043a\u043e \u043e\u0448\u0438\u0431\u0438\u0442\u044c\u0441\u044f. \u0427\u0430\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0442 \u0441 &#171;auto increment&#187; &#8212; \u043a\u043e\u0433\u0434\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u044d\u0442\u043e \u0447\u0438\u0441\u043b\u043e, \u0431\u044b\u0432\u0430\u044e\u0442 \u043d\u0435\u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0435 \u0443\u0441\u043b\u043e\u0432\u0438\u044f \u0432 \u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u044d\u0442\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438.<\/p>\n<p>\u0412 \u0438\u0433\u0440\u0435 <strong><em>Tom and Jerry &#8212; Frantic Antics (1993)<\/em><\/strong> \u043a\u043e\u0433\u0434\u0430 \u043f\u0435\u0440\u0441\u043e\u043d\u0430\u0436 \u0434\u0432\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043a\u0430\u0440\u0442\u0435, \u043d\u043e\u0432\u044b\u0435 \u0441\u043b\u043e\u0438 \u0432 plane \u0434\u043e\u043a\u0438\u0434\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0434\u043a\u0438\u0439 auto increment &#8212; 128 \u0432\u043c\u0435\u0441\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e 1. \u0423 \u043c\u0435\u043d\u044f \u0431\u044b\u043b \u043a\u043e\u0434 \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0442\u0430\u043c \u0432\u0441\u0435\u0433\u0434\u0430 1, \u0438\u0437-\u0437\u0430 \u044d\u0442\u043e\u0433\u043e plane \u043f\u043e\u0447\u0442\u0438 \u043d\u0435 \u043c\u0435\u043d\u044f\u043b\u0441\u044f \u043a\u0440\u043e\u043c\u0435 \u0432\u0435\u0440\u0445\u043d\u0435\u0439 &#171;\u0441\u0442\u0440\u043e\u043a\u0438&#187;. \u041e\u0442\u0434\u0435\u0431\u0430\u0436\u0438\u043b \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0437\u0433\u043b\u044f\u0434\u0430 \u043d\u0430 \u043e\u043a\u043d\u043e plane, \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432 \u0447\u0442\u043e \u0441\u043b\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u0430\u043a \u0431\u044b &#171;\u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e&#187;.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c04\/5e9\/b9e\/c045e9b9e1f7fa997523186a59d25039.png\" alt=\"Tom and Jerry - Frantic Antics (1993)\" title=\"Tom and Jerry - Frantic Antics (1993)\" width=\"1315\" height=\"1288\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c04\/5e9\/b9e\/c045e9b9e1f7fa997523186a59d25039.png\"\/><\/p>\n<div><figcaption>Tom and Jerry &#8212; Frantic Antics (1993)<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0430\u043c\u0430 \u044d\u0442\u0430 \u0438\u0433\u0440\u0430 &#8212; \u043d\u0430\u0432\u0435\u0440\u043d\u043e\u0435 \u0445\u0443\u0434\u0448\u0430\u044f \u0438\u0437 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0445 \u043c\u043d\u043e\u0439, \u0430\u0432\u0442\u043e\u0440\u044b \u043a\u0430\u043a \u0431\u0443\u0434\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u043d\u0435 \u0441\u0442\u0430\u0440\u0430\u043b\u0438\u0441\u044c \u0438 \u0434\u0435\u043b\u0430\u043b\u0438 \u0434\u043b\u044f \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043e\u043a \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0430\u0440\u043e\u0433\u043e \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u044f.<\/p>\n<h4>\u041e\u0432\u0435\u0440\u0441\u0430\u0439\u0437 \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043e VSRAM-\u043f\u0430\u043c\u044f\u0442\u044c<\/h4>\n<p>\u041d\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0443\u0440\u043e\u0432\u043d\u0435\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u0435 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b Sega Mega Drive \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043e, \u043d\u043e \u043a\u0440\u043e\u043c\u0435 &#171;\u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439&#187; \u0432\u0438\u0434\u0435\u043e-\u043f\u0430\u043c\u044f\u0442\u0438 VRAM (64Kb) \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043f\u0440\u0438\u0447\u0438\u043d\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0441\u0442\u043e\u044f\u0442 CRAM (128 \u0431\u0430\u0439\u0442, \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 \u0446\u0432\u0435\u0442\u043e\u0432\u044b\u0445 \u043f\u0430\u043b\u0438\u0442\u0440) \u0438 VSRAM (80 \u0431\u0430\u0439\u0442, \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433). \u041d\u0430\u043b\u0438\u0447\u0438\u0435 \u044d\u0442\u0438\u0445 \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043a\u0443\u0441\u043a\u043e\u0432 \u043f\u0430\u043c\u044f\u0442\u0438 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0435\u0449\u0435 \u0441\u043c\u0435\u0448\u043d\u0435\u0435 \u0435\u0441\u043b\u0438 \u0443\u0447\u0435\u0441\u0442\u044c \u0447\u0442\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0434\u0432\u0438\u0433 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043b\u0435\u0436\u0438\u0442 \u0432\u043e VRAM, \u043d\u043e \u043d\u0435 \u0441\u0443\u0442\u044c.<\/p>\n<p>\u0412 \u0438\u0433\u0440\u0435 <strong><em>Tiny Toon Adventures (1993)<\/em><\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c \u0447\u0442\u043e\u0431\u044b \u043e\u0431\u043d\u0443\u043b\u0438\u0442\u044c CRAM \u0438 VSRAM. \u0418 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0432\u043e VSRAM \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f 128 \u0431\u0430\u0439\u0442, \u043a\u043e\u0433\u0434\u0430 \u0435\u0433\u043e \u0440\u0430\u0437\u043c\u0435\u0440 80 \u0431\u0430\u0439\u0442&#8230; \u0418 \u0435\u0441\u043b\u0438 \u043d\u0438\u043a\u0430\u043a \u043d\u0435 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u044d\u0442\u043e, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u0441\u0435\u0433\u0444\u043e\u043b\u0442. \u041f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0432\u043e\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439, \u0438 \u044d\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u0435\u0440\u0445\u0443\u0448\u043a\u0430 \u0430\u0439\u0441\u0431\u0435\u0440\u0433\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/832\/8a9\/07a\/8328a907a52e2290745817f7b6496ed0.png\" alt=\"Tiny Toon Adventures (1993)\" title=\"Tiny Toon Adventures (1993)\" width=\"1631\" height=\"1279\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/832\/8a9\/07a\/8328a907a52e2290745817f7b6496ed0.png\"\/><\/p>\n<div><figcaption>Tiny Toon Adventures (1993)<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u0430\u043c\u0430 \u0438\u0433\u0440\u0430 \u0438\u043c\u0435\u0435\u0442 \u043f\u0440\u0438\u044f\u0442\u043d\u0443\u044e \u0433\u0440\u0430\u0444\u0438\u043a\u0443, \u0433\u0435\u0439\u043c\u043f\u043b\u0435\u0439 \u0441\u0440\u0435\u0434\u043d\u0438\u0439, \u0432 \u043d\u0435\u043c \u0435\u0441\u0442\u044c \u0436\u0435\u0441\u0442\u043a\u0438\u0439 \u0437\u0430\u043a\u043e\u0441 \u043f\u043e\u0434 \u0421\u043e\u043d\u0438\u043a\u0430.<\/p>\n<h4>\u0412\u044b\u0437\u043e\u0432 DMA \u043a\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d<\/h4>\n<p>\u0412 \u0438\u0433\u0440\u0435 <strong><em>The Flinstones (1993)<\/em><\/strong> \u0431\u044b\u043b\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 &#8212; plane \u0434\u0432\u0438\u0433\u0430\u043b\u0441\u044f \u043d\u0430\u0432\u0435\u0440\u0445 \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0432\u043f\u0440\u0430\u0432\u043e. \u0422\u043e \u0435\u0441\u0442\u044c \u0431\u044b\u043b\u0438 \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u043e VSRAM. \u0420\u0430\u0437\u0433\u0430\u0434\u044b\u0432\u0430\u043b\u043e\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e &#8212; \u0447\u0442\u043e\u0431\u044b DMA \u0440\u0430\u0431\u043e\u0442\u0430\u043b (\u0438\u043b\u0438 \u043d\u0430\u043e\u0431\u043e\u0440\u043e\u0442 \u043d\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u043b) \u043d\u0430\u0434\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 \u0431\u0438\u0442 \u0432 \u043e\u0434\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435 VDP. \u042f \u044d\u0442\u043e \u0441\u0442\u0430\u043b \u0443\u0447\u0438\u0442\u044b\u0432\u0430\u0442\u044c \u0438 \u0434\u0432\u0438\u0436\u0435\u043d\u0438\u0435 plane \u043f\u043e\u0447\u0438\u043d\u0438\u043b\u043e\u0441\u044c. \u0418\u0433\u0440\u0430 \u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u044b\u0442\u0430\u043b\u0430\u0441\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c DMA-\u0437\u0430\u043f\u0438\u0441\u0438 \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u043e \u0431\u044b\u043b\u043e \u0432\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e, \u0432\u0438\u0434\u0438\u043c\u043e \u0430\u0432\u0442\u043e\u0440\u044b \u043a\u0430\u043a-\u0442\u043e \u043a\u0440\u0438\u0432\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043b\u0438 \u043b\u043e\u0433\u0438\u043a\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/70a\/f9e\/70c\/70af9e70cc480343c815f862bb72b43b.png\" alt=\"The Flinstones (1993)\" title=\"The Flinstones (1993)\" width=\"1634\" height=\"1281\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/70a\/f9e\/70c\/70af9e70cc480343c815f862bb72b43b.png\"\/><\/p>\n<div><figcaption>The Flinstones (1993)<\/figcaption><\/div>\n<\/figure>\n<h4>\u041e\u0434\u043d\u043e-\u0431\u0430\u0439\u0442\u043e\u0432\u044b\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432<\/h4>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b \u0447\u0438\u0442\u0430\u044e\u0442\u0441\u044f \u0434\u0432\u0443\u043c\u044f \u0431\u0430\u0439\u0442\u0430\u043c\u0438 (\u0442\u0430\u043a \u0432\u0438\u0434\u0435\u043b \u0432\u0441\u0435\u0445 \u0433\u0430\u0439\u0434\u0430\u0445), \u043d\u043e \u0432 \u0438\u0433\u0440\u0435 <strong><em>Jurassic Park (1993)<\/em><\/strong> \u0441\u0434\u0435\u043b\u0430\u043d\u043e \u0447\u0442\u0435\u043d\u0438\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 VDP \u043e\u0434\u043d\u0438\u043c \u0431\u0430\u0439\u0442\u043e\u043c. \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u044d\u0442\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/cb6\/6a6\/8e5\/cb66a68e5ca9ffcead238e5d0e94cff9.png\" alt=\"Jurassic Park (1993)\" title=\"Jurassic Park (1993)\" width=\"1636\" height=\"1283\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/cb6\/6a6\/8e5\/cb66a68e5ca9ffcead238e5d0e94cff9.png\"\/><\/p>\n<div><figcaption>Jurassic Park (1993)<\/figcaption><\/div>\n<\/figure>\n<h4>\u041f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 read-only \u043f\u0430\u043c\u044f\u0442\u044c<\/h4>\n<p>\u0412 \u0438\u0433\u0440\u0435 <strong><em>Spot goes to Hollywood (1995)<\/em><\/strong>, \u0435\u0441\u043b\u0438 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u043c\u0435\u0441\u0442\u043e, \u0442\u0430\u043c \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a\u043e\u0435:<\/p>\n<pre><code class=\"cpp\">  if (psVar4 != (short *)0x0) {     do {       sVar1 = psVar4[1];       *(short *)(sVar1 + 0x36) = *(short *)(sVar1 + 0x36) + -2;       *psVar4 = sVar1;       psVar4 = psVar4 + 1;     } while (sVar1 != 0);     DAT_fffff8a0._2_2_ = DAT_fffff8a0._2_2_ + -2;   }<\/code><\/pre>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u0442\u0443\u0442 off-by-one \u043e\u0448\u0438\u0431\u043a\u0430 \u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>0x000036<\/code>. \u0418 Sega \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0438\u0447\u0435\u0433\u043e \u0441 \u044d\u0442\u0438\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442, \u0430\u043d\u0430\u043b\u043e\u0433\u0430 &#171;\u0441\u0435\u0433\u0444\u043e\u043b\u0442\u0430&#187; \u043d\u0435\u0442. \u0410 \u0447\u0442\u043e, \u0442\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u0434\u0430. \u0418 \u0442\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u043a\u043e\u043b\u044b \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u044e\u0442 \u043d\u0435\u0440\u0435\u0434\u043a\u043e, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 <code>Error<\/code> \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u043b\u043e\u0433 \u0438 \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/065\/ea2\/834\/065ea2834c6be02fe6be7b4dd68dc289.png\" alt=\"Spot goes to Hollywood (1995)\" title=\"Spot goes to Hollywood (1995)\" width=\"1640\" height=\"1290\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/065\/ea2\/834\/065ea2834c6be02fe6be7b4dd68dc289.png\"\/><\/p>\n<div><figcaption>Spot goes to Hollywood (1995)<\/figcaption><\/div>\n<\/figure>\n<h4>\u0421\u043c\u0435\u043d\u0430 endianness \u043f\u0440\u0438 DMA \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 &#171;VRAM fill&#187;<\/h4>\n<p>\u0412 \u0438\u0433\u0440\u0435 <strong><em>Contra: Hard Corps (1994)<\/em><\/strong> \u0443\u0432\u0438\u0434\u0435\u043b \u0440\u0430\u0437\u0434\u043e\u043b\u0431\u0430\u043d\u043d\u044b\u0435 \u0441\u0434\u0432\u0438\u0433\u0438 plane&#8217;\u043e\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043b \u043b\u043e\u0433\u0438, \u0443\u0432\u0438\u0434\u0435\u043b \u0447\u0442\u043e \u0432 \u043d\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0440\u0435\u0434\u043a\u0438\u0439 \u0440\u0435\u0436\u0438\u043c VRAM fill \u0434\u043b\u044f \u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0430\u0431\u043b\u0438\u0446\u044b \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0441\u0434\u0432\u0438\u0433\u043e\u0432, \u043f\u043e\u0441\u043b\u0435 \u0441\u0435\u0440\u0438\u0438 \u043f\u0440\u0438\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0437\u0433\u043b\u044f\u0434\u043e\u0432 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u0438\u043b\u0441\u044f \u0447\u0442\u043e \u043a\u0430\u043a\u0438\u043c-\u0442\u043e \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u0431\u0430\u0439\u0442\u044b \u043c\u0435\u043d\u044f\u044e\u0442 endianness&#8230; \u041f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0440\u0438\u043d\u0436\u043e\u0432\u044b\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c:<\/p>\n<pre><code class=\"cpp\">    \/\/ change endianness in this case (example game: \"Contra Hard Corps\")     if (auto_increment_ &gt; 1) {       if (ram_address_ % 2 == 0) {         ++ram_address_;       } else {         --ram_address_;       }     }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/37b\/8fa\/022\/37b8fa022e1e4adf2069762da1ac6bad.png\" alt=\"Contra: Hard Corps (1994)\" title=\"Contra: Hard Corps (1994)\" width=\"1640\" height=\"1281\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/37b\/8fa\/022\/37b8fa022e1e4adf2069762da1ac6bad.png\"\/><\/p>\n<div><figcaption>Contra: Hard Corps (1994)<\/figcaption><\/div>\n<\/figure>\n<h4>\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 Z80 RAM \u0438 \u043f\u0440\u043e\u0447\u0438\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438<\/h4>\n<p>\u0412 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 \u043f\u043e\u043a\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d Z80, \u0430 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0433\u0440\u044b \u043e\u0442 \u043d\u0435\u0433\u043e \u0437\u0430\u0432\u0438\u0441\u044f\u0442. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0438\u0433\u0440\u0430 <strong><em>Mickey Mania (1994)<\/em><\/strong> \u0437\u0430\u0432\u0438\u0441\u0430\u0435\u0442 \u043f\u043e\u0441\u043b\u0435 \u0441\u0442\u0430\u0440\u0442\u0430. \u041e\u0442\u043a\u0440\u044b\u0432 \u0434\u0435\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440, \u0432\u0438\u0434\u0438\u043c \u0447\u0442\u043e \u043e\u043d\u043e \u0432\u0435\u0447\u043d\u043e \u0447\u0438\u0442\u0430\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 <code>0xA01000<\/code>, \u043f\u043e\u043a\u0430 \u0442\u0430\u043c \u043d\u0435 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u043d\u0435\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0431\u0430\u0439\u0442. \u042d\u0442\u043e \u0437\u043e\u043d\u0430 Z80 RAM, \u0442\u043e \u0435\u0441\u0442\u044c \u0432 \u0438\u0433\u0440\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u044f\u0432\u043d\u0430\u044f \u0441\u0432\u044f\u0437\u044c \u043c\u0435\u0436\u0434\u0443 m68k \u0438 z80.<\/p>\n<p>\u041f\u043e\u0441\u0442\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u0440\u0438\u043d\u0436\u043e\u0432\u044b\u0439 \u043a\u043e\u0441\u0442\u044b\u043b\u044c &#8212; \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439 \u0431\u0430\u0439\u0442 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0447\u0442\u0435\u043d\u0438\u0435 Z80 RAM.<\/p>\n<p>\u041d\u043e \u0442\u0443\u0442 \u041e\u0441\u0442\u0430\u043f\u0430 \u043f\u043e\u043d\u0435\u0441\u043b\u043e &#8212; \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0433\u0440\u0430 \u0447\u0438\u0442\u0430\u0435\u0442 &#171;VDP H\/V Counter&#187; (\u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <code>0xC00008<\/code>).<\/p>\n<p>\u0417\u0430\u043a\u043e\u0441\u0442\u044b\u043b\u0438\u043c \u0438 \u0435\u0433\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0433\u0440\u0430 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u0441\u0442\u0430\u0432\u043a\u0443 \u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u0430\u0434\u0430\u0435\u0442, \u0447\u0438\u0442\u0430\u044f \u0435\u0449\u0435 \u043e\u0434\u0438\u043d \u043d\u0435\u0437\u0430\u043c\u0430\u043f\u043b\u0435\u043d\u043d\u044b\u0439 \u0430\u0434\u0440\u0435\u0441&#8230; \u0418 \u0438\u0433\u0440\u0430 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043e\u0442\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u043a\u043e\u043f\u0438\u043b\u043e\u0441\u044c \u043a\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043e\u0441\u0442\u044b\u043b\u0435\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/752\/f20\/cc9\/752f20cc91bbdade18ba541041c09767.png\" alt=\"\u0417\u0430\u0441\u0442\u0430\u0432\u043a\u0430 Mickey Mania (1994)\" title=\"\u0417\u0430\u0441\u0442\u0430\u0432\u043a\u0430 Mickey Mania (1994)\" width=\"1632\" height=\"1283\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/752\/f20\/cc9\/752f20cc91bbdade18ba541041c09767.png\"\/><\/p>\n<div><figcaption>\u0417\u0430\u0441\u0442\u0430\u0432\u043a\u0430 Mickey Mania (1994)<\/figcaption><\/div>\n<\/figure>\n<p>\u0415\u0449\u0435 \u043f\u0440\u0438\u043c\u0435\u0440 &#8212; \u0438\u0433\u0440\u0430 <strong><em>Sonic the Hedgehog (1991)<\/em><\/strong>, \u0433\u0434\u0435 \u044f \u043f\u043e\u043f\u0430\u0434\u0430\u044e \u0432 \u043d\u0435\u043a\u0438\u0439 &#171;\u0434\u0435\u0431\u0430\u0433-\u0440\u0435\u0436\u0438\u043c&#187;, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u043d\u044b\u0435 \u0446\u0438\u0444\u0440\u044b \u0432 \u0432\u0435\u0440\u0445\u043d\u0435\u043c \u043b\u0435\u0432\u043e\u043c \u0443\u0433\u043b\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a6d\/2c4\/a86\/a6d2c4a8656e02ea811326d061149a81.png\" alt=\"Sonic the Hedgehog (1991) \u0441 \u0434\u0432\u0443\u043c\u044f plane\" title=\"Sonic the Hedgehog (1991) \u0441 \u0434\u0432\u0443\u043c\u044f plane\" width=\"1648\" height=\"1080\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6d\/2c4\/a86\/a6d2c4a8656e02ea811326d061149a81.png\"\/><\/p>\n<div><figcaption>Sonic the Hedgehog (1991) \u0441 \u0434\u0432\u0443\u043c\u044f plane<\/figcaption><\/div>\n<\/figure>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0435\u0440\u0432\u044b\u0439 \u0421\u043e\u043d\u0438\u043a \u0434\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u0442\u0440\u0435\u0432\u0435\u0440\u0441\u0435\u043d (<a href=\"https:\/\/github.com\/sonicretro\/s1disasm\" rel=\"noopener noreferrer nofollow\">github<\/a>) \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u043b\u0438 \u0443\u043f\u043e\u0440\u043e\u0442\u044c\u0441\u044f \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0435\u0433\u043e \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c.<\/p>\n<h2>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430 \u0437\u0432\u0443\u043a\u0430 Z80<\/h2>\n<h4>\u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 Z80<\/h4>\n<p>\u041a\u0430\u043a \u043f\u0438\u0441\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u043d\u0435\u0435, Zilog Z80 &#8212; \u0441\u043e-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u043b\u044f \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043d\u0438\u044f \u043c\u0443\u0437\u044b\u043a\u0438. \u0418\u043c\u0435\u0435\u0442 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 RAM \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 8Kb, \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d \u043a \u0441\u0438\u043d\u0442\u0435\u0437\u0430\u0442\u043e\u0440\u0443 \u0437\u0432\u0443\u043a\u0430 YM2612.<\/p>\n<p>\u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 Z80 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 (\u043d\u0435 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e-\u0437\u0432\u0443\u043a\u043e\u0432\u043e\u0439), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0430\u0445 \u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u043f\u043e\u043a\u043e\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0432\u0441\u0435 \u0440\u0443\u043a\u0438.<\/p>\n<p>\u041a\u0430\u043a \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0430\u0441\u044c \u043c\u0443\u0437\u044b\u043a\u0430 \u0434\u043b\u044f \u0438\u0433\u0440 Mega Drive? \u041a\u043e\u043c\u043f\u0430\u043d\u0438\u044f Sega \u0440\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u044f\u043b\u0430 \u0441\u0440\u0435\u0434\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0442\u0443\u043b\u0437\u0443 <a href=\"https:\/\/segaretro.org\/GEMS\" rel=\"noopener noreferrer nofollow\">GEMS<\/a> \u043f\u043e\u0434 MS-DOS, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0435 \u0437\u0432\u0443\u043a\u0438 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u043b\u0430\u0442\u0435, \u043a\u0430\u043a \u0437\u0432\u0443\u0447\u0430\u043b\u043e \u0431\u044b, \u0435\u0441\u043b\u0438 \u0437\u0432\u0443\u043a \u043f\u0440\u043e\u0438\u0433\u0440\u044b\u0432\u0430\u043b\u0441\u044f \u043d\u0430 Mega Drive (what you hear is what you get).<\/p>\n<p>(\u041e\u0434\u043d\u0430\u043a\u043e \u043c\u043d\u043e\u0433\u0438\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0437\u0430\u0431\u0438\u0432\u0430\u043b\u0438 \u043d\u0430 \u043c\u0443\u0437\u043b\u043e \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u0435\u0444\u043e\u043b\u0442\u043d\u044b\u0435 \u0441\u044d\u043c\u043f\u043b\u044b, \u0438\u0437-\u0437\u0430 \u0447\u0435\u0433\u043e \u0432\u043e \u043c\u043d\u043e\u0433\u0438\u0445 \u043d\u0435\u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0438\u0433\u0440\u0430\u0445 \u0435\u0441\u0442\u044c \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u044e\u0449\u0438\u0435\u0441\u044f \u0437\u0432\u0443\u043a\u0438)<\/p>\n<p>\u0421\u043a\u043e\u043c\u043f\u043e\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0437\u0432\u0443\u043a \u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u043e\u0432\u0430\u043b\u0441\u044f \u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u043d\u0430 \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0435 Z80 (\u044d\u0442\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u043b\u0430\u0441\u044c sound driver) \u0438 \u0443\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u043b\u0441\u044f \u0432 ROM \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436\u0430 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u043f\u0440\u043e\u0447\u0438\u043c\u0438 \u0434\u0430\u043d\u043d\u044b\u043c\u0438. \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0438\u0433\u0440\u044b m68k \u0447\u0438\u0442\u0430\u043b sound driver \u0438\u0437 ROM \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436\u0430 \u0438 \u0437\u0430\u0441\u043e\u0432\u044b\u0432\u0430\u043b \u0435\u0433\u043e \u0432 RAM Z80, \u043f\u043e\u0441\u043b\u0435 \u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 Z80 \u043d\u0430\u0447\u0438\u043d\u0430\u043b \u043f\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u044c \u0437\u0432\u0443\u043a, \u0440\u0430\u0431\u043e\u0442\u0430\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 m68k. \u0412\u043e\u0442 \u0442\u0430\u043a\u0430\u044f \u043c\u043d\u043e\u0433\u043e\u043f\u043e\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c&#8230; \u041f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u0440\u043e \u043c\u0443\u0437\u044b\u043a\u0443 \u0432 Mega Drive \u043c\u043e\u0436\u043d\u043e \u0443\u0437\u043d\u0430\u0442\u044c <a href=\"https:\/\/www.youtube.com\/watch?v=WEvnZRCW_qc\" rel=\"noopener noreferrer nofollow\">\u0432 \u044d\u0442\u043e\u043c \u0432\u0438\u0434\u0435\u043e<\/a>.<\/p>\n<h4>\u041a\u0430\u043a \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c Z80<\/h4>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u0434\u043e \u0432\u044b\u0443\u0447\u0438\u0442\u044c 332-\u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043d\u044b\u0439 <a href=\"https:\/\/www.zilog.com\/docs\/z80\/um0080.pdf\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0444\u0435\u0440\u0435\u043d\u0441<\/a>, \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440 Z80, \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0443 m68k. \u041f\u043e\u043a\u0440\u044b\u0442\u044c \u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0430\u043c\u0438, \u043f\u043e\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043a\u0438 \u043d\u0430 Z80. \u041f\u043e\u0442\u043e\u043c \u0437\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u0435\u043e\u0440\u0438\u044e \u0437\u0432\u0443\u043a\u043e\u0432, <a href=\"https:\/\/plutiedev.com\/ym2612-registers\" rel=\"noopener noreferrer nofollow\">\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b YM2612<\/a>, \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u0437\u0432\u0443\u043a\u043e\u0432 \u043f\u043e\u0434 Linux.<\/p>\n<p>\u041f\u043e \u043e\u0431\u044a\u0435\u043c\u0443 \u0437\u0432\u0443\u0447\u0438\u0442 \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0432\u0441\u0451 \u0440\u0430\u043d\u0435\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 (m68k + VDP), \u0438\u043b\u0438 \u043f\u043e \u043a\u0440\u0430\u0439\u043d\u0435\u0439 \u043c\u0435\u0440\u0435 \u043a\u0430\u043a \u043f\u043e\u043b\u043e\u0432\u0438\u043d\u0430 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0433\u043e, \u0442\u043e \u0435\u0441\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u0447\u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<h2>\u0427\u0442\u043e \u0435\u0449\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c<\/h2>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u043d\u043e\u0435 \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u0443\u0436\u0435 \u0434\u0430\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u043c\u043d\u043e\u0433\u043e \u0438\u0433\u0440, \u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0438 \u0431\u043e\u043b\u044c\u0448\u0435 (\u043a\u0440\u043e\u043c\u0435 \u0437\u0432\u0443\u043a\u0430), \u0432\u0441\u044f\u043a\u0438\u0435 \u043c\u0435\u043b\u043e\u0447\u0438.<\/p>\n<h4>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0434\u0432\u0443\u0445 \u0438\u0433\u0440\u043e\u043a\u043e\u0432<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0433\u0440\u043e\u043a &#8212; \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0441 \u0434\u0432\u0443\u0445 \u0433\u0435\u0439\u043c\u043f\u0430\u0434\u043e\u0432.<\/p>\n<h4>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c HBLANK<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f VBLANK, \u043d\u043e \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438 \u043d\u0430\u0434\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c HBLANK. \u0415\u0433\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043c\u0430\u043b\u043e \u0438\u0433\u0440. \u0421\u0430\u043c\u044b\u0439 \u043c\u0435\u0439\u043d\u0441\u0442\u0440\u0438\u043c\u043d\u044b\u0439 \u043a\u0435\u0439\u0441 &#8212; \u0441\u043c\u0435\u043d\u0430 \u043f\u0430\u043b\u0438\u0442\u0440\u044b \u043f\u043e\u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e \u0438\u0433\u0440\u0435 Ristar (1994)<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 \u0438\u0433\u0440\u0435 <strong><em>Ristar (1994)<\/em><\/strong> \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u0430 \u0444\u0438\u0447\u0430 &#8212; \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e \u043a\u0430\u043a \u043d\u0430 &#171;\u0443\u0440\u043e\u0432\u043d\u0435 \u0432\u043e\u0434\u044b&#187; \u0435\u0441\u0442\u044c &#171;\u0432\u043e\u043b\u043d\u044b&#187;, \u0430 \u043f\u043e\u0434 &#171;\u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b&#187; \u043a\u043e\u043b\u043e\u043d\u043d\u044b \u0440\u0430\u0437\u043c\u044b\u0442\u044b:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/720\/abe\/500\/720abe5008072803f4b567d1588d618e.png\" alt=\"Ristar (1994), \u0431\u0435\u0437 HBLANK, \u043d\u0430 \u043c\u043e\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435\" title=\"Ristar (1994), \u0431\u0435\u0437 HBLANK, \u043d\u0430 \u043c\u043e\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435\" width=\"1316\" height=\"1131\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/720\/abe\/500\/720abe5008072803f4b567d1588d618e.png\"\/><\/p>\n<div><figcaption>Ristar (1994), \u0431\u0435\u0437 HBLANK, \u043d\u0430 \u043c\u043e\u0435\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u0418 \u0432\u043e\u0442 \u0447\u0442\u043e \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c, \u043f\u043e \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044e \u0438\u0437 YouTube:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/eb2\/6f6\/16a\/eb26f616ace6c3b1de7688c8ce57f080.png\" alt=\"Ristar (1994), \u044d\u0442\u043e \u0436\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435\" title=\"Ristar (1994), \u044d\u0442\u043e \u0436\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435\" width=\"1320\" height=\"1047\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/eb2\/6f6\/16a\/eb26f616ace6c3b1de7688c8ce57f080.png\"\/><\/p>\n<div><figcaption>Ristar (1994), \u044d\u0442\u043e \u0436\u0435 \u043c\u0435\u0441\u0442\u043e \u043d\u0430 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u043c \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u044d\u0442\u043e \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0437\u0432\u0435\u0437\u0434\u0443\u043d \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f \u0432 \u0432\u043e\u0434\u0443 \u0438 \u043f\u0430\u043b\u0438\u0442\u0440\u0430 \u0432\u0441\u0435\u0433\u0434\u0430 &#171;\u0432\u043e\u0434\u044f\u043d\u0430\u044f&#187;:<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1d4\/bd6\/237\/1d4bd6237832ba0177067d664c554696.png\" alt=\"\u0421\u043b\u0435\u0432\u0430 - \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b, \u0441\u043f\u0440\u0430\u0432\u0430 - \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b\" title=\"\u0421\u043b\u0435\u0432\u0430 - \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b, \u0441\u043f\u0440\u0430\u0432\u0430 - \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b\" width=\"2700\" height=\"1146\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1d4\/bd6\/237\/1d4bd6237832ba0177067d664c554696.png\"\/><\/p>\n<div><figcaption>\u0421\u043b\u0435\u0432\u0430 &#8212; \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b, \u0441\u043f\u0440\u0430\u0432\u0430 &#8212; \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043f\u043e\u0434 \u0443\u0440\u043e\u0432\u043d\u0435\u043c \u0432\u043e\u0434\u044b<\/figcaption><\/div>\n<\/figure>\n<\/div>\n<\/details>\n<h4>\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b<\/h4>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u043d \u0442\u043e\u043b\u044c\u043a\u043e 3-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u043f\u0430\u0434. \u041c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0430\u0442\u044c <a href=\"https:\/\/plutiedev.com\/controllers#6-button\" rel=\"noopener noreferrer nofollow\">6-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u0434\u043a\u0438\u0435 \u043f\u0435\u0440\u0438\u0444\u0435\u0440\u0438\u0439\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430: <a href=\"https:\/\/plutiedev.com\/mouse\" rel=\"noopener noreferrer nofollow\">Sega Mouse<\/a>, <a href=\"https:\/\/plutiedev.com\/sega-multitap\" rel=\"noopener noreferrer nofollow\">Sega Multitap<\/a>, <a href=\"https:\/\/plutiedev.com\/saturn-keyboard\" rel=\"noopener noreferrer nofollow\">Saturn Keyboard<\/a>, <a href=\"https:\/\/plutiedev.com\/ten-key-pad\" rel=\"noopener noreferrer nofollow\">Ten Key Pad<\/a>, \u0438 (\u0432\u043d\u0435\u0437\u0430\u043f\u043d\u043e) <a href=\"https:\/\/plutiedev.com\/printer\" rel=\"noopener noreferrer nofollow\">\u043f\u0440\u0438\u043d\u0442\u0435\u0440<\/a>.<\/p>\n<h4>\u0411\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u0442\u043e\u0439 \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440<\/h4>\n<p>\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 &#171;\u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440&#187; \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043a\u0440\u0443\u0447\u0435 &#8212; \u0447\u0442\u043e\u0431\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0432\u0438\u0434\u0435\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c, \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0431\u0440\u0435\u0439\u043a\u0438 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c\/\u0447\u0442\u0435\u043d\u0438\u0435, \u0440\u0430\u0437\u043c\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043a\u0442\u0440\u0435\u0439\u0441, \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u043d\u0430\u043c\u043d\u043e\u0433\u043e \u0431\u043e\u043b\u0435\u0435 \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0434\u0435\u0431\u0430\u0433\u0430\u0442\u044c \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b.<\/p>\n<\/p>\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\/871284\/\"> https:\/\/habr.com\/ru\/articles\/871284\/<\/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-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<figure class=\"full-width\"><\/figure>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 16-\u0431\u0438\u0442\u043d\u043e\u0439 \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0438 Sega Mega Drive \u043d\u0430 C++.<\/p>\n<p>\u0411\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0433\u043e: \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 Motorola 68000, \u0440\u0435\u0432\u0435\u0440\u0441\u0438\u043d\u0433 \u0438\u0433\u0440, \u0433\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 OpenGL, \u0448\u0435\u0439\u0434\u0435\u0440\u044b, \u0438 \u043c\u043d\u043e\u0433\u043e\u0435 \u0434\u0440\u0443\u0433\u043e\u0435. \u0418 \u0432\u0441\u0435 \u044d\u0442\u043e \u043d\u0430 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u043c C++. \u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u043d\u043e\u0433\u043e \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u043c\u043e\u0436\u043d\u043e \u0445\u043e\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c.<\/p>\n<h2>\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Sega Mega Drive<\/h2>\n<figure class=\"full-width\">\n<div><figcaption>\u0410\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 Sega Mega Drive (<a href=\"https:\/\/www.retrosix.wiki\/hardware-overview-sega-mega-drive\" rel=\"noopener noreferrer nofollow\">source<\/a>)<\/figcaption><\/div>\n<\/figure>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0438\u0437 \u0441\u0445\u0435\u043c\u044b \u0432 \u0440\u0430\u043d\u0434\u043e\u043c\u043d\u043e\u043c \u043f\u043e\u0440\u044f\u0434\u043a\u0435:<\/p>\n<ul>\n<li>\n<p><strong>ROM<\/strong> &#8212; \u0434\u0430\u043d\u043d\u044b\u0435 \u043a\u0430\u0440\u0442\u0440\u0438\u0434\u0436\u0430, \u0438\u043c\u0435\u0435\u0442 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u043a\u0441\u0438\u043c\u0443\u043c 4MB.<\/p>\n<\/li>\n<li>\n<p><strong>VDP<\/strong> &#8212; &#171;<a href=\"https:\/\/rasterscroll.com\/mdgraphics\/vdp-overview\/\" rel=\"noopener noreferrer nofollow\">Video Display Processor<\/a>&#171;, \u0430\u0441\u0438\u043a \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u0430\u043c\u043e\u0439 Sega, \u0447\u0438\u043f \u0432\u0438\u0434\u0435\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430. \u0418\u043c\u0435\u0435\u0442 64KB RAM (\u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f VRAM &#8212; Video RAM).<\/p>\n<\/li>\n<li>\n<p><strong>FM Sound<\/strong> &#8212; \u0430\u0441\u0438\u043a \u043e\u0442 Yamaha (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Yamaha_YM2612\" rel=\"noopener noreferrer nofollow\">YM2612<\/a>), \u0438\u043c\u0435\u0435\u0442 6 FM-\u043a\u0430\u043d\u0430\u043b\u043e\u0432, \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0432\u0443\u043a.<\/p>\n<\/li>\n<li>\n<p><strong>PSG Sound<\/strong> &#8212; \u0430\u0441\u0438\u043a \u043e\u0442 Texas Instruments (<a href=\"https:\/\/en.wikipedia.org\/wiki\/Texas_Instruments_SN76489\" rel=\"noopener noreferrer nofollow\">SN76489<\/a>), \u0438\u043c\u0435\u0435\u0442 3 \u043c\u0435\u0430\u043d\u0434\u0440\u043e\u0432\u044b\u0445 \u043a\u0430\u043d\u0430\u043b\u0430, \u0442\u043e\u0436\u0435 \u0441\u0438\u043d\u0442\u0435\u0437\u0438\u0440\u0443\u0435\u0442 \u0437\u0432\u0443\u043a, \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u0441 8-\u0431\u0438\u0442\u043d\u043e\u0439 Sega Master System.<\/p>\n<\/li>\n<li>\n<p><strong>CPU<\/strong> &#8212; \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Motorola_68000_series\" rel=\"noopener noreferrer nofollow\">Motorola 68000<\/a>, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u043c\u0430\u0441\u0441\u0443 \u0440\u0430\u0431\u043e\u0442\u044b. \u0418\u043c\u0435\u0435\u0442 64KB RAM.<\/p>\n<\/li>\n<li>\n<p><strong>Co-Processor<\/strong> &#8212; \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Zilog_Z80\" rel=\"noopener noreferrer nofollow\">Zilog Z80<\/a>, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f &#171;\u0434\u043b\u044f \u0437\u0432\u0443\u043a\u0430&#187;, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u0432 \u0442\u043e\u043c \u0447\u0442\u043e\u0431\u044b \u0432\u043e\u0432\u0440\u0435\u043c\u044f \u043f\u0440\u043e\u0441\u044b\u043f\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b YM2612. \u0418\u043c\u0435\u0435\u0442 8KB RAM.<\/p>\n<\/li>\n<li>\n<p><strong>Input\/Output<\/strong> &#8212; \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u044b, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e \u0431\u044b\u043b &#171;3-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439 \u0433\u0435\u0439\u043c\u043f\u0430\u0434&#187;, \u043f\u043e\u0442\u043e\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0441\u044f &#171;6-\u043a\u043d\u043e\u043f\u043e\u0447\u043d\u044b\u0439&#187;, \u0430 \u0437\u0430\u0442\u0435\u043c \u0435\u0449\u0435 \u0441 \u0434\u0435\u0441\u044f\u0442\u043e\u043a \u0431\u043e\u043b\u0435\u0435 \u0440\u0435\u0434\u043a\u0438\u0445 \u0434\u0435\u0432\u0430\u0439\u0441\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u043c \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f &#171;Motorola 68000&#187; (\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u043d\u043e &#171;m68k&#187;). \u0423 \u043d\u0435\u0433\u043e 24-\u0431\u0438\u0442\u043e\u0432\u0430\u044f \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u044f, \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c <code>0x000000 - 0xFFFFFF<\/code>. \u041b\u044e\u0431\u043e\u0435 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0448\u0438\u043d\u043e\u0439 (\u043d\u0430 \u0441\u0445\u0435\u043c\u0435 \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u043e &#171;68000 BUS&#187;), \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0430\u0434\u0440\u0435\u0441 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043c\u0435\u0441\u0442\u0430 &#8212; <a href=\"https:\/\/segaretro.org\/Sega_Mega_Drive\/Memory_map\" rel=\"noopener noreferrer nofollow\">\u0442\u0443\u0442 \u043c\u043e\u0436\u043d\u043e \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u043c\u0430\u043f\u043f\u0438\u043d\u0433 \u0430\u0434\u0440\u0435\u0441\u043e\u0432<\/a>.<\/p>\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0435\u0442 \u044d\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432 \u043a\u0440\u043e\u043c\u0435 Z80 \u0438 \u0437\u0432\u0443\u043a\u0430.<\/p>\n<h2>\u042d\u043c\u0443\u043b\u044f\u0446\u0438\u044f Motorola 68000<\/h2>\n<h4>\u0424\u0430\u043a\u0442\u044b \u043f\u0440\u043e m68k<\/h4>\n<p>m68k \u0431\u044b\u043b \u0432 \u0441\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u043e\u043c. \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0442\u044f\u0436\u0435\u043d\u0438\u0438 \u0434\u0435\u0441\u044f\u0442\u0438\u043b\u0435\u0442\u0438\u0439 \u0432 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0430\u0445 Macintosh, Amiga, Atari, \u043f\u0440\u0438\u0441\u0442\u0430\u0432\u043a\u0435 Sega Mega Drive, \u0438 \u043f\u0440\u043e\u0447\u0438\u0445 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430\u0445.<\/p>\n<p>\u0412 <a href=\"https:\/\/en.wikipedia.org\/wiki\/Motorola_68000#Architecture\" rel=\"noopener noreferrer nofollow\">\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435<\/a> \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0443\u0436\u0435 \u0435\u0441\u0442\u044c \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u044b 32-\u0431\u0438\u0442\u043e\u0432\u043e\u0441\u0442\u0438, \u043d\u043e \u0441 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p>\u0412\u0441\u0435\u0433\u043e \u0435\u0441\u0442\u044c 16 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 32-\u0431\u0438\u0442\u043d\u044b\u0445 (\u0438 1 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 16-\u0431\u0438\u0442\u043d\u044b\u0439). \u041d\u0435\u0441\u043c\u043e\u0442\u0440\u044f \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e &#171;\u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0435&#187; \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b (<code>A0<\/code>&#8212;<code>A7<\/code>) 32-\u0431\u0438\u0442\u043d\u044b\u0435, \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u0430 \u0431\u0435\u0440\u0443\u0442\u0441\u044f \u043c\u043b\u0430\u0434\u0448\u0438\u0435 24 \u0431\u0438\u0442\u0430. \u0422\u043e \u0435\u0441\u0442\u044c \u0430\u0434\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e \u0432 16 \u043c\u0435\u0433\u0430\u0431\u0430\u0439\u0442 \u043f\u0430\u043c\u044f\u0442\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0437\u0430\u0447\u0430\u0442\u043e\u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043c\u043d\u043e\u0433\u043e\u0437\u0430\u0434\u0430\u0447\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c &#8212; \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0443 <code>A7<\/code> \u043f\u043e \u0444\u0430\u043a\u0442\u0443 \u0431\u0443\u0434\u0435\u0442 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0435\u043c \u043b\u0438\u0431\u043e \u043a <code>USP<\/code> (user stack pointer) \u043b\u0438\u0431\u043e \u043a <code>SSP<\/code> (supervisor stack pointer) \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0444\u043b\u0430\u0433\u0430 \u0432 \u0441\u0442\u0430\u0442\u0443\u0441\u043d\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0435.<\/p>\n<p>\u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0435 \u043e\u0442 (\u043f\u043e\u0447\u0442\u0438 \u0432\u0441\u0435\u0445) \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440, m68k \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 \u0431\u0430\u0439\u0442 big-endian. \u0410\u0434\u0440\u0435\u0441 \u0438 \u0440\u0430\u0437\u043c\u0435\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0432\u0441\u0435\u0433\u0434\u0430 \u0434\u0435\u043b\u0438\u0442\u0441\u044f \u043d\u0430 2, \u0447\u0438\u0442\u0430\u0442\u044c \u043f\u0430\u043c\u044f\u0442\u044c \u0442\u043e\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0434\u0435\u043b\u044f\u0449\u0435\u043c\u0443\u0441\u044f \u043d\u0430 2 (\u0437\u0430 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c). \u041d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f floating-point arithmetic.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k (<a href=\"http:\/\/goldencrystal.free.fr\/M68kOpcodes-v2.3.pdf\" rel=\"noopener noreferrer nofollow\">source<\/a>)<\/figcaption><\/div>\n<\/figure>\n<h4>\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u044b m68k<\/h4>\n<p>\u0421\u0434\u0435\u043b\u0430\u0435\u043c \u0432 \u043e\u0431\u0449\u0435\u043c \u043c\u0435\u0441\u0442\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0442\u0438\u043f\u044b:<\/p>\n<pre><code class=\"cpp\">using Byte = uint8_t; using Word = uint16_t; using Long = uint32_t; using LongLong = uint64_t;  using AddressType = Long;<\/code><\/pre>\n<p>\u041a\u043b\u0430\u0441\u0441 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 big-endian:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 BigEndian&lt;T&gt;<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0422\u0430\u043a \u043a\u0430\u043a m68k \u043f\u0440\u0438\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u0430 big-endian, \u043d\u0435\u0440\u0435\u0434\u043a\u043e \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u043e\u0440\u044f\u0434\u043e\u043a (\u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u044f \u0447\u0442\u043e \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043a\u0430\u043a\u043e\u0439-\u043d\u0438\u0431\u0443\u0434\u044c x86_64\/ARM, \u0433\u0434\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e little-endian), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u0442\u0438\u043f:<\/p>\n<pre><code class=\"cpp\">template&lt;typename T&gt; class BigEndian { public:   T get() const {     return std::byteswap(value_);   }  private:   T value_; };<\/code><\/pre>\n<p>\u041f\u043e\u0442\u043e\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0435\u0441\u043b\u0438 \u0433\u0434\u0435-\u0442\u043e \u043d\u0430\u0434\u043e \u0432\u044b\u0442\u0430\u0449\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 word \u0438\u0437 \u043c\u0430\u0441\u0441\u0438\u0432\u0430, \u043c\u043e\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0430\u043a:<\/p>\n<pre><code class=\"cpp\">const auto* array_ptr = reinterpret_cast&lt;const BigEndian&lt;Word&gt;*&gt;(data_ptr); \/\/ ... x -= array_ptr[index].get();<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0432 \u043f\u0430\u043c\u044f\u0442\u044c \u0438\u043b\u0438 \u0447\u0438\u0442\u0430\u0435\u0442 \u043e\u0442\u0442\u0443\u0434\u0430, \u0442\u043e \u043d\u0443\u0436\u043d\u044b \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 (\u0447\u0442\u043e \u0438\u043c\u0435\u043d\u043d\u043e \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u043b\u0438 \u043a\u0443\u0434\u0430 \u0437\u0430\u043f\u0438\u0441\u0430\u0442\u044c):<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441\u044b DataView \u0438 MutableDataView<\/summary>\n<div class=\"spoiler__content\">\n<p>\u041b\u0443\u0447\u0448\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 <code>std::span<\/code> &#8212; \u044d\u0442\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043d\u0430 \u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u043b\u044e\u0441 \u0440\u0430\u0437\u043c\u0435\u0440 \u044d\u0442\u0438\u0445 \u0441\u0430\u043c\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0414\u043b\u044f \u0438\u043c\u043c\u0443\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0435\u0449\u0435 \u0443\u0434\u043e\u0431\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0445\u0435\u043b\u043f\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c <code>.as&lt;Word&gt;()<\/code> \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435:<\/p>\n<pre><code class=\"cpp\">using MutableDataView = std::span&lt;Byte&gt;;  class DataView : public std::span&lt;const Byte&gt; { public:   using Base = std::span&lt;const Byte&gt;;   using Base::Base;    template&lt;std::integral T&gt;   T as() const {     return std::byteswap(*reinterpret_cast&lt;const T*&gt;(data()));   } };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0438\u043f \u0434\u043b\u044f \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043e\u0432 m68k &#8212; \u043e\u0431\u044a\u0435\u043a\u0442 \u044d\u0442\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 CPU \u0432 \u043e\u0442\u0440\u044b\u0432\u0435 \u043e\u0442 \u043f\u0430\u043c\u044f\u0442\u0438:<\/p>\n<details class=\"spoiler\">\n<summary>\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 Registers<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">struct Registers {   \/**    * Data registers D0 - D7    *\/   std::array&lt;Long, 8&gt; d;    \/**    * Address registers A0 - A6    *\/   std::array&lt;Long, 7&gt; a;    \/**    * User stack pointer    *\/   Long usp;    \/**    * Supervisor stack pointer    *\/   Long ssp;    \/**    * Program counter    *\/   Long pc;    \/**    * Status register    *\/   struct {     \/\/ lower byte     bool carry : 1;     bool overflow : 1;     bool zero : 1;     bool negative : 1;     bool extend : 1;     bool : 3;      \/\/ upper byte     uint8_t interrupt_mask : 3;     bool : 1;     bool master_switch : 1;     bool supervisor : 1;     uint8_t trace : 2;      decltype(auto) operator=(const Word&amp; word) {       *reinterpret_cast&lt;Word*&gt;(this) = word;       return *this;     }      operator Word() const {       return *reinterpret_cast&lt;const Word*&gt;(this);     }   } sr;   static_assert(sizeof(sr) == sizeof(Word));    \/**    * The stack pointer register depend on the supervisor flag    *\/   Long&amp; stack_ptr() {     return sr.supervisor ? ssp : usp;   } }; static_assert(sizeof(Registers) == 76);<\/code><\/pre>\n<p>\u042d\u0442\u0430 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c \u0432 76 \u0431\u0430\u0439\u0442 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 CPU.<\/p>\n<\/div>\n<\/details>\n<h4>\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u0448\u0438\u0431\u043e\u043a<\/h4>\n<p>\u041e\u0448\u0438\u0431\u043e\u0447\u043d\u044b\u0445 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0439 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u043e\u0439\u0442\u0438 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e &#8212; unaligned (\u043d\u0435 \u0434\u0435\u043b\u044f\u0449\u0438\u0439\u0441\u044f \u043d\u0430 2) \u0430\u0434\u0440\u0435\u0441 program counter \/ \u0430\u0434\u0440\u0435\u0441 \u0447\u0442\u0435\u043d\u0438\u044f \/ \u0430\u0434\u0440\u0435\u0441 \u0437\u0430\u043f\u0438\u0441\u0438, \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f, \u043f\u043e\u043f\u044b\u0442\u043a\u0430 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u0437\u0430\u0449\u0438\u0449\u0435\u043d\u043d\u043e\u0435 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0430\u0434\u0440\u0435\u0441\u043d\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0438 \u0442\u0430\u043a \u0434\u0430\u043b\u0435\u0435.<\/p>\n<p>\u042f \u0440\u0435\u0448\u0438\u043b \u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u043e\u0448\u0438\u0431\u043e\u043a \u0431\u0435\u0437 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 (\u043a\u043e\u0442\u043e\u0440\u044b\u0435 <code>try<\/code>\/<code>throw<\/code>\/<code>catch<\/code>). \u0412 \u0446\u0435\u043b\u043e\u043c \u043d\u0438\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0442\u0438\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0445 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0439 \u043d\u0435 \u0438\u043c\u0435\u044e, \u043f\u0440\u043e\u0441\u0442\u043e \u044d\u0442\u043e\u0442 \u043f\u043e\u0434\u0445\u043e\u0434 \u0434\u0435\u043b\u0430\u0435\u0442 \u0434\u0435\u0431\u0430\u0433 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0443\u0434\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0448\u0438\u0431\u043e\u043a \u0437\u0430\u0432\u0435\u0434\u0435\u043c \u043a\u043b\u0430\u0441\u0441:<\/p>\n<details class=\"spoiler\">\n<summary>\u041a\u043b\u0430\u0441\u0441 Error<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">class Error { public:   enum Kind {     \/\/ no error     Ok,      UnalignedMemoryRead,     UnalignedMemoryWrite,     UnalignedProgramCounter,     UnknownAddressingMode,     UnknownOpcode,      \/\/ permission error     ProtectedRead,     ProtectedWrite,      \/\/ bus error     UnmappedRead,     UnmappedWrite,      \/\/ invalid action     InvalidRead,     InvalidWrite,   };    Error() = default;   Error(Kind kind, std::string what): kind_{kind}, what_{std::move(what)}   {}    Kind kind() const {     return kind_;   }   const std::string&amp; what() const {     return what_;   }  private:   Kind kind_{Ok};   std::string what_; };<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043c\u0435\u0442\u043e\u0434, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f <code>std::optional&lt;Error&gt;<\/code>.<\/p>\n<p>\u0415\u0441\u043b\u0438 \u043c\u0435\u0442\u043e\u0434 \u043c\u043e\u0436\u0435\u0442 \u043b\u0438\u0431\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c\u0441\u044f \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u043b\u0438\u0431\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442 \u0442\u0438\u043f\u0430 <code>T<\/code>, \u043e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0439 \u0442\u0438\u043f <code>std::expected&lt;T, Error&gt;<\/code>. \u042d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d <a href=\"https:\/\/en.cppreference.com\/w\/cpp\/utility\/expected\" rel=\"noopener noreferrer nofollow\">\u0437\u0430\u0435\u0445\u0430\u043b \u0432 C++23<\/a>, \u043e\u043d \u0443\u0434\u043e\u0431\u0435\u043d \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u043e\u0434\u0445\u043e\u0434\u0430.<\/p>\n<h4>\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u0430\u043c\u044f\u0442\u0438<\/h4>\n<p>\u041a\u0430\u043a \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u043e\u0441\u044c \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u043f\u0440\u043e &#171;\u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 Sega Mega Drive&#187;, \u0447\u0442\u0435\u043d\u0438\u0435 \u0438\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0430\u043c \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0440\u0430\u0437\u043d\u0443\u044e \u0441\u0435\u043c\u0430\u043d\u0442\u0438\u043a\u0443, \u0441\u043c\u043e\u0442\u0440\u044f \u0447\u0442\u043e \u0437\u0430 \u0430\u0434\u0440\u0435\u0441. \u0427\u0442\u043e\u0431\u044b \u0430\u0431\u0441\u0442\u0440\u0430\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f m68k, \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0441 <code>Device<\/code>:<\/p>\n<pre><code class=\"cpp\">class Device { public:   \/\/ reads `data.size()` bytes from address `addr`   [[nodiscard]] virtual std::optional&lt;Error&gt; read(AddressType addr, MutableDataView data) = 0;    \/\/ writes `data.size()` bytes to address `addr`   [[nodiscard]] virtual std::optional&lt;Error&gt; write(AddressType addr, DataView data) = 0;    \/\/ ... };<\/code><\/pre>\n<p>\u041e\u0436\u0438\u0434\u0430\u0435\u043c\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043f\u043e\u043d\u044f\u0442\u043d\u043e \u0438\u0437 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0435\u0432. \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u0432 \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0445\u0435\u043b\u043f\u0435\u0440\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438 <code>Byte<\/code>\/<code>Word<\/code>\/<code>Long<\/code>:<\/p>\n<pre><code class=\"cpp\">  template&lt;std::integral T&gt;   std::expected&lt;T, Error&gt; read(AddressType addr) {     T data;     if (auto err = read(addr, MutableDataView{reinterpret_cast&lt;Byte*&gt;(&amp;data), sizeof(T)})) {       return std::unexpected{std::move(*err)};     }     \/\/ swap bytes after reading to make it little-endian     return std::byteswap(data);   }    template&lt;std::integral T&gt;   [[nodiscard]] std::optional&lt;Error&gt; write(AddressType addr, T value) {     \/\/ swap bytes before writing to make it big-endian     const auto swapped = std::byteswap(value);     return write(addr, DataView{reinterpret_cast&lt;const Byte*&gt;(&amp;swapped), sizeof(T)});   }<\/code><\/pre>\n<h4>\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f m68k<\/h4>\n<p>&#171;\u041a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f m68k&#187; \u044d\u0442\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u044b + \u043f\u0430\u043c\u044f\u0442\u044c, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u044d\u0442\u043e:<\/p>\n<pre><code class=\"cpp\">struct Context {   Registers&amp; registers;   Device&amp; device; };<\/code><\/pre>\n<h4>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432 m68k<\/h4>\n<p>\u0423 \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u043e\u0442 0 \u0434\u043e 2 &#171;\u043e\u043f\u0435\u0440\u0430\u043d\u0434\u043e\u0432&#187;, \u043e\u043d\u0438 \u0436\u0435 &#171;\u0446\u0435\u043b\u0438&#187;. \u041e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u0430\u0434\u0440\u0435\u0441 \u0432 \u043f\u0430\u043c\u044f\u0442\u0438\/\u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u0431\u043e\u043b\u044c\u0448\u0438\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432. \u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u043e\u043f\u0435\u0440\u0430\u043d\u0434\u0430 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cpp\">Kind kind_; \/\/ \u043e\u0434\u0438\u043d \u0438\u0437 12 \u0442\u0438\u043f\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 (addressing mode) uint8_t index_; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"\u0438\u043d\u0434\u0435\u043a\u0441\u0430\" \u0434\u043b\u044f \u0438\u043d\u0434\u0435\u043a\u0441\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 Word ext_word0_; \/\/ \u043f\u0435\u0440\u0432\u044b\u0439 extension word Word ext_word1_; \/\/ \u0432\u0442\u043e\u0440\u043e\u0439 extension word Long address_; \/\/ \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \"\u0430\u0434\u0440\u0435\u0441\u0430\" \u0434\u043b\u044f \u0430\u0434\u0440\u0435\u0441\u043d\u044b\u0445 \u0442\u0438\u043f\u043e\u0432 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438<\/code><\/pre>\n<p>\u0418 \u0435\u0449\u0435 2-3 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435, \u0432\u0441\u0435\u0433\u043e \u044f \u0443\u043b\u043e\u0436\u0438\u043b\u0441\u044f \u0432 24 \u0431\u0430\u0439\u0442\u0430.<\/p>\n<p>\u042d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0441 \u0438\u043c\u0435\u0435\u0442 \u043c\u0435\u0442\u043e\u0434\u044b \u0434\u043b\u044f \u0447\u0442\u0435\u043d\u0438\u044f\/\u0437\u0430\u043f\u0438\u0441\u0438:<\/p>\n<pre><code class=\"cpp\">[[nodiscard]] std::optional&lt;Error&gt; read(Context ctx, MutableDataView data); [[nodiscard]] std::optional&lt;Error&gt; write(Context ctx, DataView data);<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 <a href=\"https:\/\/github.com\/Izaron\/SegaCxx\/blob\/main\/src\/lib\/m68k\/target\/target.h\" rel=\"noopener noreferrer nofollow\">lib\/m68k\/target\/target.h<\/a>.<\/p>\n<p>\u0421\u0430\u043c\u044b\u043c\u0438 \u0441\u043b\u043e\u0436\u043d\u044b\u043c\u0438 \u0442\u0438\u043f\u0430\u043c\u0438 \u0430\u0434\u0440\u0435\u0441\u0430\u0446\u0438\u0438 \u043e\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c &#171;Address with Index&#187; \u0438 &#171;Program Counter with Index&#187; &#8212; \u0432\u043e\u0442 \u0442\u0430\u043a \u0434\u043b\u044f \u043d\u0438\u0445 \u0432\u044b\u0447\u0438\u0441\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441:<\/p>\n<details class=\"spoiler\">\n<summary>Target::indexed_address<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"cpp\">Long Target::indexed_address(Context ctx, Long baseAddress) const {   const uint8_t xregNum = bits_range(ext_word0_, 12, 3);   const Long xreg = bit_at(ext_word0_, 15) ? a_reg(ctx.registers, xregNum) : ctx.registers.d[xregNum];   const Long size = bit_at(ext_word0_, 11) ? \/*Long*\/ 4 : \/*Word*\/ 2;   const Long scale = scale_value(bits_range(ext_word0_, 9, 2));   const SignedByte disp = static_cast&lt;SignedByte&gt;(bits_range(ext_word0_, 0, 8));    SignedLong clarifiedXreg = static_cast&lt;SignedLong&gt;(xreg);   if (size == 2) {     clarifiedXreg = static_cast&lt;SignedWord&gt;(clarifiedXreg);   }    return baseAddress + disp + clarifiedXreg * scale; }<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<h4>\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 m68k<\/h4>\n<p>\u0423 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0435\u0441\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a\u0438\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435:<\/p>\n<pre><code class=\"cpp\">Kind kind_; \/\/ \u043e\u0434\u0438\u043d \u0438\u0437 82 \u043e\u043f\u043a\u043e\u0434\u043e\u0432 Size size_; \/\/ Byte, Word \u0438\u043b\u0438 Long Condition cond_; \/\/ \u043e\u0434\u043d\u043e \u0438\u0437 16 \u0443\u0441\u043b\u043e\u0432\u0438\u0439, \u0434\u043b\u044f \"\u0431\u0440\u0430\u043d\u0447\u0435\u0432\u044b\u0445\" \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 Target src_;<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-444030","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444030","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=444030"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/444030\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=444030"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=444030"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=444030"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}