{"id":2996,"date":"2021-08-02T14:36:34","date_gmt":"2021-08-02T11:36:34","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/?p=2996"},"modified":"2024-12-16T22:32:22","modified_gmt":"2024-12-16T19:32:22","slug":"writing-stuff-in-assembly-for-sega-genesis-4","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2021\/08\/02\/writing-stuff-in-assembly-for-sega-genesis-4\/","title":{"rendered":"Schreiben in Assembly f\u00fcr Sega Genesis #4"},"content":{"rendered":"<p>In diesem Beitrag beschreibe ich, wie man Sprites mit dem VDP-Emulator der Sega Genesis-Konsole zeichnet.<br \/>Der Prozess des Renderns von Sprites ist dem Rendern von Kacheln sehr \u00e4hnlich:<\/p>\n<ol>\n<li>Farben in CRAM laden<\/li>\n<li>Teile der Sprites 8&#215;8 in VRAM hochladen<\/li>\n<li>Sprite-Tabelle im VRAM f\u00fcllen<\/li>\n<\/ol>\n<p>Nehmen wir zum Beispiel ein Sprite eines Skeletts mit einem Schwert mit 32&#215;32 Pixeln<br \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3001\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/skull.png\" alt=\"\" width=\"32\" height=\"32\" \/><br \/>\n<a href=\"https:\/\/opengameart.org\/content\/skeleton-guy-animated\" target=\"_blank\" rel=\"noopener\">Skeleton Guy [Animated] by Disthorn<\/a><\/p>\n<h3>CRAM<\/h3>\n<p>Mit ImaGenesis konvertieren wir es in CRAM-Farben und VRAM-Muster f\u00fcr Assembler. Danach erhalten wir zwei Dateien im ASM-Format, dann schreiben wir die Farben auf die Wortgr\u00f6\u00dfe um und die Kacheln m\u00fcssen zum Zeichnen in der richtigen Reihenfolge platziert werden.<br \/><em><strong>Interessante Informationen: Sie k\u00f6nnen die automatische VDP-Inkrementierung \u00fcber das 0xF-Register auf die Wortgr\u00f6\u00dfe umstellen. Dadurch wird die Adresserh\u00f6hung aus dem CRAM-Farbf\u00fcllcode entfernt.<\/strong><\/em><\/p >\n<h3>VRAM<\/h3>\n<p>Das Shogi-Handbuch enth\u00e4lt die korrekte Reihenfolge der Kacheln f\u00fcr gro\u00dfe Sprites, aber wir sind schlauer, also \u00fcbernehmen wir die Indizes aus dem Blog <a href=\"https:\/\/www.chibiakumas.com\/68000\/genesis.php \" target=\"_blank\" rel =\"noopener\">ChibiAkumas<\/a>, beginnen wir mit dem Z\u00e4hlen ab Index 0:<\/p>\n<p>0 4 8 12<\/p>\n<p>1 5 9 13<\/p>\n<p>2 6 10 14<\/p>\n<p>3 7 11 15<\/p>\n<p>Warum steht alles auf dem Kopf? Was willst du, die Konsole ist japanisch! Es k\u00f6nnte sogar von rechts nach links sein!<br \/>Lassen Sie uns die Reihenfolge in der ASM-Sprite-Datei manuell \u00e4ndern:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>\tdc.l\t$11111111\t; Tile #0 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111\t; Tile #4 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111\n\tdc.l\t$11111111\t; Tile #8 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111111 \n\tdc.l\t$11111122 \n\tdc.l\t$11111122 \n\tdc.l\t$11111166 \n\tdc.l\t$11111166\t; Tile #12 \n\tdc.l\t$11111166 \n\tdc.l\t$11111166 \n\t\u0438 \u0442.\u0434. \n<\/code><\/pre>\n<\/div>\n<p>Laden Sie das Sprite wie normale Kacheln\/Muster:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>  lea Sprite,a0 \n  move.l #$40200000,vdp_control_port; write to VRAM command \n  move.w #128,d0 ; (16*8 rows of sprite) counter \nSpriteVRAMLoop: \n  move.l (a0)+,vdp_data_port; \n  dbra d0,SpriteVRAMLoop \n<\/code><\/pre>\n<\/div>\n<p>Um ein Sprite zu zeichnen, m\u00fcssen Sie nur noch die Sprite-Tabelle ausf\u00fcllen<\/p>\n<h3>Sprite-Tabelle<\/h3>\n<p>Die Sprite-Tabelle wird im VRAM gef\u00fcllt, die Adresse ihres Standorts wird in das VDP-Register 0x05 eingetragen, die Adresse ist wieder knifflig, man kann es im Handbuch sehen, ein Beispiel f\u00fcr Adresse F000:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code><\/code><\/pre>\n<\/div>\n<p>\u041e\u043a, \u0442\u0435\u043f\u0435\u0440\u044c \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u043d\u0430\u0448 \u0441\u043f\u0440\u0430\u0439\u0442 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0443. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u201c\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u201d \u0434\u0430\u043d\u043d\u044b\u0445 \u0441\u043e\u0441\u0442\u043e\u044f\u0449\u0443\u044e \u0438\u0437 \u0447\u0435\u0442\u044b\u0440\u0435\u0445 word. \u0411\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043d\u0430\u0439\u0442\u0438 \u0432 \u043c\u0430\u043d\u0443\u0430\u043b\u0435. \u041b\u0438\u0447\u043d\u043e \u044f \u0441\u0434\u0435\u043b\u0430\u043b \u043f\u0440\u043e\u0449\u0435, \u0442\u0430\u0431\u043b\u0438\u0446\u0443 \u0441\u043f\u0440\u0430\u0439\u0442\u043e\u0432 \u043c\u043e\u0436\u043d\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0432 \u044d\u043c\u0443\u043b\u044f\u0442\u043e\u0440\u0435 Exodus.<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3002\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTable.png\" alt=\"\" width=\"804\" height=\"652\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTable.png 804w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTable-300x243.png 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTable-768x623.png 768w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><br \/>\nDie Strukturparameter sind aus dem Namen ersichtlich, zum Beispiel XPos, YPos &#8211; Koordinaten, Kacheln &#8211; Nummer der Startkachel zum Zeichnen, HSize, VSize &#8211; Sprite-Gr\u00f6\u00dfen durch Hinzuf\u00fcgen der Teile 8&#215;8, HFlip, VFlip &#8211; Hardware-Rotation des Sprites horizontal und vertikal.<br \/><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-3003\" src=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTableExample.png\" alt=\"\" width=\"805\" height=\"660\" srcset=\"https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTableExample.png 805w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTableExample-300x246.png 300w, https:\/\/demensdeum.com\/blog\/wp-content\/uploads\/2021\/08\/spriteTableExample-768x630.png 768w\" sizes=\"auto, (max-width: 805px) 100vw, 805px\" \/><br \/>\n<strong><em>Es ist sehr wichtig, sich daran zu erinnern, dass Sprites au\u00dferhalb des Bildschirms sein k\u00f6nnen. Dies ist das richtige Verhalten, weil&#8230; Off-Screen-Sprites aus dem Speicher entladen &#8211; eine ziemlich ressourcenintensive Aktivit\u00e4t.<\/em><\/strong><br \/>Nachdem die Daten im Emulator eingegeben wurden, m\u00fcssen sie vom VRAM an die Adresse 0xF000 kopiert werden. Exodus unterst\u00fctzt diese Funktion ebenfalls.<br \/>Analog zum Zeichnen von Kacheln greifen wir zun\u00e4chst auf den VDP-Steuerport zu, um mit dem Schreiben an der Adresse 0xF000 zu beginnen, und schreiben dann die Struktur in den Datenport.<br \/>Ich m\u00f6chte Sie daran erinnern, dass die Beschreibung der VRAM-Adressierung im Handbuch oder im Blog <a href=\"https:\/\/namelessalgorithm.com\/genesis\/blog\/vdp\/\" target=\"_blank\" rel=\"noopener\" nachgelesen werden kann. >Namenloser Algorithmus<\/a> .<\/p>\n<p>Kurz gesagt funktioniert die VDP-Adressierung folgenderma\u00dfen:<br \/>[..DC BA98 7654 3210 &#8230;. &#8230;. &#8230;. ..FE]<br \/>Dabei ist Hex die Bitposition in der gew\u00fcnschten Adresse. Die ersten beiden Bits geben die Art des angeforderten Befehls an, zum Beispiel 01 &#8211; in den VRAM schreiben. F\u00fcr die Adresse 0XF000 ergibt sich dann:<br \/>0111 0000 0000 0000 0000 0000 0000 0011 (70000003)<\/p>\n<p>Als Ergebnis erhalten wir den Code:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>  move.l #$70000003,vdp_control_port \n  move.w #$0100,vdp_data_port \n  move.w #$0F00,vdp_data_port \n  move.w #$0001,vdp_data_port \n  move.w #$0100,vdp_data_port \n<\/code><\/pre>\n<\/div>\n<p>Danach wird das Skelett-Sprite an den Koordinaten 256, 256 angezeigt. Cool, oder?<\/p>\n<h3>Links<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/segagenesissamples\/-\/tree\/main\/7Sprite\/vasm\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab.com\/demensdeum \/segagenesissamples\/-\/tree\/main\/7Sprite\/vasm<\/a><br \/><a href=\"https:\/\/opengameart.org\/content\/skeleton-guy-animated\" target=\"_blank\" rel=\"noopener\">https:\/\/opengameart.org\/content\/skeleton-guy-animated<\/a><\/p>\n<h3>Quellen<\/h3>\n<p><a href=\"https:\/\/namelessalgorithm.com\/genesis\/blog\/vdp\/\" target=\"_blank\" rel=\"noopener\">https:\/\/namelessalgorithm.com\/genesis\/blog\/vdp\/<\/ a><br \/><a href=\"https:\/\/www.chibiakumas.com\/68000\/platform3.php#LessonP27\" target=\"_blank\" rel=\"noopener\">https:\/\/www.chibiakumas.com\/68000\/platform3.php#LessonP27<\/a><br \/>\n<a href=\"https:\/\/plutiedev.com\/sprites\" target=\"_blank\" rel=\"noopener\">https:\/\/plutiedev.com\/sprites<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Beitrag beschreibe ich, wie man Sprites mit dem VDP-Emulator der Sega Genesis-Konsole zeichnet.Der Prozess des Renderns von Sprites ist dem Rendern von Kacheln sehr \u00e4hnlich: Farben in CRAM laden Teile der Sprites 8&#215;8 in VRAM hochladen Sprite-Tabelle im VRAM f\u00fcllen Nehmen wir zum Beispiel ein Sprite eines Skeletts mit einem Schwert mit 32&#215;32<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2021\/08\/02\/writing-stuff-in-assembly-for-sega-genesis-4\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Schreiben in Assembly f\u00fcr Sega Genesis #4&#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,172,174],"class_list":["post-2996","post","type-post","status-publish","format-standard","hentry","category-techie","category-tutorials","tag-asm","tag-roms","tag-vasm","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"de","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\/de\/wp-json\/wp\/v2\/posts\/2996","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=2996"}],"version-history":[{"count":13,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2996\/revisions"}],"predecessor-version":[{"id":3895,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/2996\/revisions\/3895"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=2996"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=2996"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=2996"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}