{"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\/de\/2021\/07\/14\/writing-stuff-in-assembly-for-sega-genesis-1\/","title":{"rendered":"Schreiben in Assembly f\u00fcr Sega Genesis #1"},"content":{"rendered":"<p>Der erste Artikel \u00fcber das Schreiben von Spielen f\u00fcr die klassische Sega Genesis-Konsole in Motorola 68000 Assembly.<\/p>\n<p>Lassen Sie uns die einfachste Endlosschleife f\u00fcr Sega schreiben. Daf\u00fcr ben\u00f6tigen wir: einen Assembler, einen Emulator mit Disassembler, einen bevorzugten Texteditor, ein grundlegendes Verst\u00e4ndnis der Struktur von Sega Rum.<\/p>\n<p>F\u00fcr die Entwicklung verwende ich meinen eigenen Assembler\/Disassembler Gen68KryBaby:<\/p>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/gen68krybaby\/\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum\/gen68krybaby\/<\/a><\/ p><\/p>\n<p>Das Tool ist in Python 3 entwickelt, zum Zusammenstellen wird eine Datei mit der Erweiterung .asm oder .gen68KryBabyDisasm als Eingabe bereitgestellt, die Ausgabe ist eine Datei mit der Erweiterung .gen68KryBabyAsm.bin, die im Emulator oder auf ausgef\u00fchrt werden kann eine echte Konsole (Vorsicht, weggehen, die Konsole k\u00f6nnte explodieren!)<\/p>\n<p>Das Zerlegen von ROMs wird ebenfalls unterst\u00fctzt. Dazu m\u00fcssen Sie eine ROM-Datei als Eingabe \u00fcbermitteln, ohne die Erweiterungen .asm oder .gen68KryBabyDisasm. Die Opcode-Unterst\u00fctzung wird abh\u00e4ngig von meinem Interesse am Thema und der Beteiligung von Mitwirkenden steigen oder sinken.<\/p>\n<h3>Struktur<\/h3>\n<p>Der Sega-ROM-Header belegt die ersten 512 Bytes. Es enth\u00e4lt Informationen \u00fcber das Spiel, den Namen, unterst\u00fctzte Peripherieger\u00e4te, Pr\u00fcfsumme und andere Systemflags. Ich gehe davon aus, dass die Konsole ohne Titel nicht einmal auf den Rum schaut und denkt, dass er falsch ist, und sagt: \u201eWas gibst du mir hier?\u201c<\/p>\n<p>Nach dem Header kommt das Unterprogramm\/Reset-Unterprogramm, in dem der m68K-Prozessor seine Arbeit beginnt. Okay, es ist eine Kleinigkeit &#8211; Opcodes (Operationscodes) finden, n\u00e4mlich nichts tun (!) und zur Unterroutine an der Adresse im Speicher wechseln. Wenn Sie googeln, k\u00f6nnen Sie den NOP-Opcode finden, der nichts tut, und den JSR-Opcode, der einen bedingungslosen Sprung zur Argumentadresse ausf\u00fchrt, das hei\u00dft, er bewegt den Schlitten einfach ohne irgendwelche Launen dorthin, wo wir ihn fragen.<\/p >\n<h3>Alles zusammenf\u00fcgen<\/h3>\n<p>Der Header-Donor f\u00fcr die ROM war eines der Spiele in der Beta-Version, derzeit als Hex-Daten aufgezeichnet.<\/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>Vollst\u00e4ndiges Beispiel zusammen mit ROM-Header:<\/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>Wir sammeln als n\u00e4chstes:<\/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>Der erste Artikel \u00fcber das Schreiben von Spielen f\u00fcr die klassische Sega Genesis-Konsole in Motorola 68000 Assembly. Lassen Sie uns die einfachste Endlosschleife f\u00fcr Sega schreiben. Daf\u00fcr ben\u00f6tigen wir: einen Assembler, einen Emulator mit Disassembler, einen bevorzugten Texteditor, ein grundlegendes Verst\u00e4ndnis der Struktur von Sega Rum. F\u00fcr die Entwicklung verwende ich meinen eigenen Assembler\/Disassembler Gen68KryBaby:<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2021\/07\/14\/writing-stuff-in-assembly-for-sega-genesis-1\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Schreiben in Assembly f\u00fcr 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":"de","enabled_languages":["en","ru","zh","de","fr","ja","pt"],"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}}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2929","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/comments?post=2929"}],"version-history":[{"count":25,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2929\/revisions"}],"predecessor-version":[{"id":3898,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2929\/revisions\/3898"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2929"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2929"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2929"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}