{"id":2929,"date":"2021-07-14T18:13:14","date_gmt":"2021-07-14T15:13:14","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/?p=2929"},"modified":"2024-12-16T22:32:24","modified_gmt":"2024-12-16T19:32:24","slug":"writing-stuff-in-assembly-for-sega-genesis-1","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/fr\/2021\/07\/14\/writing-stuff-in-assembly-for-sega-genesis-1\/","title":{"rendered":"\u00c9criture en assemblage pour Sega Genesis #1"},"content":{"rendered":"<p>Le premier article consacr\u00e9 \u00e0 l&#8217;\u00e9criture de jeux pour la console classique Sega Genesis dans Motorola 68000 Assembly.<\/p>\n<p>\u00c9crivons la boucle infinie la plus simple pour Sega. Pour cela nous aurons besoin\u00a0: d&#8217;un assembleur, d&#8217;un \u00e9mulateur avec un d\u00e9sassembleur, d&#8217;un \u00e9diteur de texte pr\u00e9f\u00e9r\u00e9, d&#8217;une compr\u00e9hension de base de la structure du rhum Sega.<\/p>\n<p>Pour le d\u00e9veloppement, j&#8217;utilise mon propre assembleur\/d\u00e9sassembleur Gen68KryBaby\u00a0:<\/p>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/gen68krybaby\/\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum\/gen68krybaby\/<\/a><\/ p><\/p>\n<p>L&#8217;outil est d\u00e9velopp\u00e9 en Python 3, pour l&#8217;assemblage un fichier avec l&#8217;extension .asm ou .gen68KryBabyDisasm est fourni en entr\u00e9e, la sortie est un fichier avec l&#8217;extension .gen68KryBabyAsm.bin, qui peut \u00eatre ex\u00e9cut\u00e9 dans l&#8217;\u00e9mulateur ou sur une vraie console (attention, \u00e9loignez-vous, la console risque d&#8217;exploser !)<\/p>\n<p>Le d\u00e9sassemblage des roms est \u00e9galement pris en charge, pour cela vous devez soumettre un fichier rom en entr\u00e9e, sans les extensions .asm ou .gen68KryBabyDisasm. Le support des opcodes augmentera ou diminuera en fonction de mon int\u00e9r\u00eat pour le sujet et de la participation des contributeurs.<\/p>\n<h3>Structure<\/h3>\n<p>L&#8217;en-t\u00eate de la ROM Sega occupe les 512 premiers octets. Il contient des informations sur le jeu, le nom, les p\u00e9riph\u00e9riques pris en charge, la somme de contr\u00f4le et d&#8217;autres indicateurs syst\u00e8me. Je suppose que sans titre, la console ne regardera m\u00eame pas le rhum, pensant que c&#8217;est incorrect, en disant &#8220;qu&#8217;est-ce que tu me donnes ici ?&#8221;<\/p>\n<p>Apr\u00e8s l&#8217;en-t\u00eate, il y a un sous-programme\/sous-programme Reset, avec lequel commence le travail du processeur m68K. D&#8217;accord, c&#8217;est une petite affaire &#8211; trouver des opcodes (codes d&#8217;op\u00e9ration), \u00e0 savoir ne rien faire (!) et passer au sous-programme \u00e0 l&#8217;adresse en m\u00e9moire. En cherchant sur Google, vous pouvez trouver l&#8217;opcode NOP, qui ne fait rien, et l&#8217;opcode JSR, qui effectue un saut inconditionnel vers l&#8217;adresse de l&#8217;argument, c&#8217;est-\u00e0-dire qu&#8217;il d\u00e9place simplement le chariot l\u00e0 o\u00f9 nous le demandons, sans aucun caprice.<\/p >\n<h3>Rassembler tout cela<\/h3>\n<p>Le donneur d&#8217;en-t\u00eate de la rom \u00e9tait l&#8217;un des jeux de la version b\u00eata, actuellement enregistr\u00e9 sous forme de donn\u00e9es hexad\u00e9cimales.<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\n 00 ff 2b 52 00 00 02 00 00 00 49 90 00 00 49 90 00 00 49 90 00...\u0438 \u0442.\u0434. <\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u0441\u043e-\u043d\u043e \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u043e\u0431\u044a\u044f\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0430\u0431\u0440\u0443\u0442\u0438\u043d\u044b Reset\/EntryPoint \u0432 512 (0x200) \u0431\u0430\u0439\u0442\u0435, NOP, \u0432\u043e\u0437\u0432\u0440\u0430\u0442 \u043a\u0430\u0440\u0435\u0442\u043a\u0438 \u043a 0x00000200, \u0442\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0446\u0438\u043a\u043b.<\/p>\n<p>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u043d\u044b\u0439 \u043a\u043e\u0434 \u0441\u0430\u0431\u0440\u0443\u0442\u0438\u043d\u044b Reset\/EntryPoint:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>    NOP\n    NOP\n    NOP \n    NOP\n    NOP\n    JSR 0x00000200  \n<\/code><\/pre>\n<\/div>\n<p>Exemple complet avec en-t\u00eate de rom\u00a0:<\/p>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/segagenesisamples\/-\/blob\/main\/1InfiniteLoop\/1infiniteloop.asm\" rel=\"noopener\" target=\"_blank\">https:\/\/gitlab.com \/demensdeum\/segagenesisamples\/-\/blob\/main\/1InfiniteLoop\/1infiniteloop.asm<\/a><\/p>\n<p>Nous collectons ensuite\u00a0:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code><\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0440\u043e\u043c 1infiniteloop.asm.gen68KryBabyAsm.bin \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0434\u0435\u0431\u0430\u0433\u0433\u0435\u0440\u0430 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0430 Exodus\/Gens, \u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0447\u0442\u043e m68K \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u0442 NOP, \u0438 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043f\u0440\u044b\u0433\u0430\u0435\u0442 \u043a EntryPoint \u0432 0x200 \u043d\u0430 JSR<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-2933\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/07\/JSR.jpg\" alt=\"\" width=\"804\" height=\"652\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/07\/JSR.jpg 804w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/07\/JSR-300x243.jpg 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/07\/JSR-768x623.jpg 768w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0421\u043e\u043d\u0438\u043a \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 V, \u043d\u043e \u043e\u043d \u0443\u0435\u0445\u0430\u043b \u043d\u0430 <a href=\"https:\/\/www.wacken.com\" target=\"_blank\" rel=\"noopener\">\u0412\u0430\u043a\u0435\u043d<\/a>.<\/p>\n<h3>\u0421\u0441\u044b\u043b\u043a\u0438<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/gen68krybaby\/\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum\/gen68krybaby\/<\/a><\/p>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/segagenesissamples\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum\/segagenesissamples<\/a><\/p>\n<p><a href=\"https:\/\/www.exodusemulator.com\/downloads\/release-archive\" target=\"_blank\" rel=\"noopener\">https:\/\/www.exodusemulator.com\/downloads\/release-archive<\/a><\/p>\n<h3>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438<\/h3>\n<p><a href=\"https:\/\/www.youtube.com\/watch?v=mrKFbZGTnNk\" target=\"_blank\" rel=\"noopener\">ROM Hacking Demo &#8211; Genesis and SNES games in 480i<\/a><\/p>\n<p><a href=\"http:\/\/68k.hax.com\/\" target=\"_blank\" rel=\"noopener\">http:\/\/68k.hax.com\/<\/a><\/p>\n<p><a href=\"https:\/\/www.chibiakumas.com\/68000\/genesis.php\" target=\"_blank\" rel=\"noopener\">https:\/\/www.chibiakumas.com\/68000\/genesis.php<\/a><\/p>\n<p><a href=\"https:\/\/plutiedev.com\/rom-header\" target=\"_blank\" rel=\"noopener\">https:\/\/plutiedev.com\/rom-header<\/a><\/p>\n<p><a href=\"https:\/\/blog.bigevilcorporation.co.uk\/2012\/02\/28\/sega-megadrive-1-getting-started\/\" target=\"_blank\" rel=\"noopener\">https:\/\/blog.bigevilcorporation.co.uk\/2012\/02\/28\/sega-megadrive-1-getting-started\/<\/a><\/p>\n<p><a href=\"https:\/\/opensource.apple.com\/source\/cctools\/cctools-836\/as\/m68k-opcode.h.auto.html\" target=\"_blank\" rel=\"noopener\">https:\/\/opensource.apple.com\/source\/cctools\/cctools-836\/as\/m68k-opcode.h.auto.html<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Le premier article consacr\u00e9 \u00e0 l&#8217;\u00e9criture de jeux pour la console classique Sega Genesis dans Motorola 68000 Assembly. \u00c9crivons la boucle infinie la plus simple pour Sega. Pour cela nous aurons besoin\u00a0: d&#8217;un assembleur, d&#8217;un \u00e9mulateur avec un d\u00e9sassembleur, d&#8217;un \u00e9diteur de texte pr\u00e9f\u00e9r\u00e9, d&#8217;une compr\u00e9hension de base de la structure du rhum Sega. Pour<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/fr\/2021\/07\/14\/writing-stuff-in-assembly-for-sega-genesis-1\/\">Continue reading <span class=\"screen-reader-text\">&#8220;\u00c9criture en assemblage pour Sega Genesis #1&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[61,52],"tags":[165,166,173,172],"class_list":["post-2929","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-asm","tag-assembly","tag-m68k","tag-roms","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"fr","enabled_languages":["en","ru","zh","de","fr","ja","pt","hi"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"ru":{"title":true,"content":true,"excerpt":false},"zh":{"title":true,"content":true,"excerpt":false},"de":{"title":true,"content":true,"excerpt":false},"fr":{"title":true,"content":true,"excerpt":false},"ja":{"title":true,"content":true,"excerpt":false},"pt":{"title":true,"content":true,"excerpt":false},"hi":{"title":false,"content":false,"excerpt":false}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/comments?post=2929"}],"version-history":[{"count":25,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2929\/revisions"}],"predecessor-version":[{"id":3898,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/posts\/2929\/revisions\/3898"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/media?parent=2929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/categories?post=2929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/fr\/wp-json\/wp\/v2\/tags?post=2929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}