{"id":3011,"date":"2021-08-03T18:15:48","date_gmt":"2021-08-03T15:15:48","guid":{"rendered":"https:\/\/demensdeum.com\/blog\/?p=3011"},"modified":"2024-12-16T22:32:22","modified_gmt":"2024-12-16T19:32:22","slug":"writing-stuff-in-assembly-for-sega-genesis-5","status":"publish","type":"post","link":"https:\/\/demensdeum.com\/blog\/de\/2021\/08\/03\/writing-stuff-in-assembly-for-sega-genesis-5\/","title":{"rendered":"Schreiben in Assembly f\u00fcr Sega Genesis #5"},"content":{"rendered":"<p>In dieser Notiz beschreibe ich den Prozess des Lesens des Joysticks, des \u00c4nderns der Position des Sprites, des horizontalen Umdrehens, des Sega Genesis-Emulators und m\u00f6glicherweise der Konsole selbst.<\/p>\n<p>Das Lesen von Klicks und die Verarbeitung von \u201eEreignissen\u201c eines Shogi-Joysticks erfolgt nach folgendem Schema:<\/p>\n<ol>\n<li>Anfrage nach einer Kombination von Bits gedr\u00fcckter Tasten<\/li>\n<li>Teile gedr\u00fcckter Tasten lesen<\/li>\n<li>Verarbeitung auf der Ebene der Spiellogik<\/li>\n<\/ol>\n<p>Um das Skelett-Sprite zu verschieben, m\u00fcssen wir Variablen der aktuellen Position speichern.<\/p>\n<h3>RAM<\/h3>\n<p>Spiellogikvariablen werden im RAM gespeichert; bisher ist noch nichts Besseres erfunden worden. Lassen Sie uns Variablenadressen deklarieren und den Rendering-Code \u00e4ndern:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>skeletonYpos = $FF0002 \nframeCounter = $FF0004 \nskeletonHorizontalFlip = $FF0006\n\n    move.w #$0100,skeletonXpos \n    move.w #$0100,skeletonYpos \n    move.w #$0001,skeletonHorizontalFlip \n\nFillSpriteTable: \n    move.l #$70000003,vdp_control_port \n    move.w skeletonYpos,vdp_data_port  \n    move.w #$0F00,vdp_data_port \n    move.w skeletonHorizontalFlip,vdp_data_port \n    move.w skeletonXpos,vdp_data_port \n<\/code><\/pre>\n<\/div>\n<p>Wie Sie sehen, beginnt die f\u00fcr die Arbeit verf\u00fcgbare Adresse bei 0xFF0000 und endet bei 0xFFFFFF, insgesamt stehen uns 64 KB Speicher zur Verf\u00fcgung. Skeleton-Positionen werden bei SkeletonXpos, SkeletonYpos, horizontale Drehung bei SkeletonHorizontalFlip deklariert.<\/p>\n<h3>Joypad<\/h3>\n<p>In Analogie zu VDP erfolgt die Arbeit mit Joypads \u00fcber zwei separate Ports &#8211; Steuerport und Datenport, f\u00fcr den ersten 0xA10009 und 0xA10003 Co-Nr. Bei der Arbeit mit einem Joypad gibt es eine interessante Funktion: Zuerst m\u00fcssen Sie eine Tastenkombination f\u00fcr die Abfrage anfordern und dann, nachdem Sie auf ein Update am Bus gewartet haben, die erforderlichen Tastendr\u00fccke lesen. F\u00fcr die C\/B- und D-Pad-Tasten ist dies 0x40, Beispiel unten:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>  move.b #$40,joypad_one_control_port; C\/B\/Dpad \n  nop ; bus sync \n  nop ; bus sync \n  move.b joypad_one_data_port,d2 \n  rts \n<\/code><\/pre>\n<\/div>\n<p>Im Register d2 bleibt der Zustand der gedr\u00fcckten oder nicht gedr\u00fcckten Tasten erhalten, im Allgemeinen bleibt das, was \u00fcber den Datumsport angefordert wurde, erhalten. Gehen Sie anschlie\u00dfend zum Motorola 68000-Register-Viewer Ihres Lieblingsemulators und sehen Sie, was das d2-Register je nach Tastenanschl\u00e4gen entspricht. Auf clevere Weise k\u00f6nnen Sie es im Handbuch herausfinden, aber wir verlassen uns nicht auf ihr Wort. Weiterverarbeitung gedr\u00fcckter Tasten im d2<\/p>\n<p>-Register<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>    cmp #$FFFFFF7B,d2; handle left \n    beq MoveLeft  \n    cmp #$FFFFFF77,d2; handle right  \n    beq MoveRight  \n    cmp #$FFFFFF7E,d2; handle up  \n    beq MoveUp  \n    cmp #$FFFFFF7D,d2; handle down  \n    beq MoveDown  \n    rts<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0431\u0438\u0442\u044b, \u0430 \u043d\u0435 \u0446\u0435\u043b\u044b\u043c\u0438 \u0441\u043b\u043e\u0432\u0430\u043c\u0438, \u043d\u043e \u043f\u043e\u043a\u0430 \u0438 \u0442\u0430\u043a \u0441\u043e\u0439\u0434\u0435\u0442. \u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0441\u0430\u043c\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0435 &#8211; \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0432\u0441\u0435\u0445 \u0441\u043e\u0431\u044b\u0442\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u043f\u043e 4-\u043c \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f\u043c. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432 RAM, \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0443 \u043f\u0435\u0440\u0435\u0440\u0438\u0441\u043e\u0432\u043a\u0438.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0432\u043b\u0435\u0432\u043e + \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0444\u043b\u0438\u043f\u0430:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>    move.w skeletonXpos,d0 \n    sub.w #1,d0 \n    move.w d0,skeletonXpos \n    move.w #$0801,skeletonHorizontalFlip \n    jmp FillSpriteTable<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0438 \u0441\u0431\u043e\u0440\u043a\u0438, \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043a\u0430\u043a \u0441\u043a\u0435\u043b\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0438 \u043f\u043e\u0432\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u044d\u043a\u0440\u0430\u043d\u0443, \u043d\u043e \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0431\u044b\u0441\u0442\u0440\u043e, \u0431\u044b\u0441\u0442\u0440\u0435\u0435 \u0441\u0430\u043c\u043e\u0433\u043e \u0435\u0436\u0430 \u0421\u043e\u043d\u0438\u043a\u0430.<\/p>\n<h3>\u041d\u0435 \u0442\u0430\u043a \u0431\u044b\u0441\u0442\u0440\u043e!<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u044c \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430, \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0435\u0445\u043d\u0438\u043a, \u044f \u0432\u044b\u0431\u0440\u0430\u043b \u0441\u0430\u043c\u0443\u044e \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0438 \u043d\u0435 \u0437\u0430\u0442\u0440\u0430\u0433\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0432\u043d\u0435\u0448\u043d\u0438\u043c\u0438 \u043f\u043e\u0440\u0442\u0430\u043c\u0438 &#8211; \u043f\u043e\u0434\u0441\u0447\u0435\u0442 \u0446\u0438\u0444\u0440\u044b \u0447\u0435\u0440\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 \u043f\u043e\u043a\u0430 \u043e\u043d\u0430 \u043d\u0435 \u0441\u0442\u0430\u043d\u0435\u0442 \u0440\u0430\u0432\u043d\u0430 \u043d\u0443\u043b\u044e.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u044e\u0449\u0435\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0438 \u0438\u0433\u0440\u043e\u0432\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430:<\/p>\n<div class=\"hcb_wrap\">\n<pre class=\"prism line-numbers lang-unknown\" data-lang=\"unknown\"><code>  move.w #512,frameCounter \nWaitFrame: \n  move.w frameCounter,d0 \n  sub.w #1,d0 \n  move.w d0,frameCounter \n  dbra d0,WaitFrame \nGameLoop: \n  jsr ReadJoypad \n  jsr HandleJoypad \n  jmp GameLoop \n<\/code><\/pre>\n<\/div>\n<p>Danach l\u00e4uft das Skelett langsamer, was erforderlich war. Wie ich wei\u00df, ist die h\u00e4ufigste Option zum \u201eVerlangsamen\u201c das Z\u00e4hlen der vertikalen Synchronisierungsflagge. Sie k\u00f6nnen z\u00e4hlen, wie oft der Bildschirm gezeichnet wurde, und sind somit an eine bestimmte Anzahl an Bildern pro Sekunde gebunden.<\/p>\n<h3>Links<\/h3>\n<p><a href=\"https:\/\/gitlab.com\/demensdeum\/segagenesisamples\/-\/blob\/main\/8Joypad\/vasm\/main.asm\" target=\"_blank\" rel=\"noopener\">https:\/\/gitlab .com\/demensdeum\/segagenesisamples\/-\/blob\/main\/8Joypad\/vasm\/main.asm <\/a><\/p>\n<h3>Quellen<\/h3>\n<p><a href=\"https:\/\/www.chibiakumas.com\/68000\/platform2.php\" target=\"_blank\" rel=\"noopener\">https:\/\/www.chibiakumas.com\/68000\/platform2.php <\/a><br \/><a href=\"https:\/\/huguesjohnson.com\/programming\/genesis\/tiles-sprites\/\" target=\"_blank\" rel=\"noopener\">https:\/\/huguesjohnson.com\/programming\/genesis\/tiles-sprites\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In dieser Notiz beschreibe ich den Prozess des Lesens des Joysticks, des \u00c4nderns der Position des Sprites, des horizontalen Umdrehens, des Sega Genesis-Emulators und m\u00f6glicherweise der Konsole selbst. Das Lesen von Klicks und die Verarbeitung von \u201eEreignissen\u201c eines Shogi-Joysticks erfolgt nach folgendem Schema: Anfrage nach einer Kombination von Bits gedr\u00fcckter Tasten Teile gedr\u00fcckter Tasten lesen<a class=\"more-link\" href=\"https:\/\/demensdeum.com\/blog\/de\/2021\/08\/03\/writing-stuff-in-assembly-for-sega-genesis-5\/\">Continue reading <span class=\"screen-reader-text\">&#8220;Schreiben in Assembly f\u00fcr Sega Genesis #5&#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-3011","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"],"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\/3011","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=3011"}],"version-history":[{"count":9,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/3011\/revisions"}],"predecessor-version":[{"id":3894,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/posts\/3011\/revisions\/3894"}],"wp:attachment":[{"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/media?parent=3011"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/categories?post=3011"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demensdeum.com\/blog\/de\/wp-json\/wp\/v2\/tags?post=3011"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}