{"id":4454,"date":"2025-05-23T15:16:26","date_gmt":"2025-05-23T15:16:26","guid":{"rendered":"https:\/\/research.swissdigitization.ch\/?p=4454"},"modified":"2025-05-23T15:36:22","modified_gmt":"2025-05-23T15:36:22","slug":"arty-dont-clean-the-background-das-spiel-das-sich-in-den-hintergrund-brennt","status":"publish","type":"post","link":"https:\/\/research.swissdigitization.ch\/?p=4454","title":{"rendered":"Arty &#8211; Don&#8217;t clean the background &#8211; Das Spiel, das sich in den Hintergrund brennt"},"content":{"rendered":"\n<p>Oder Hintergrund, der immer gel\u00f6scht werden muss, nur darauf bauen die meisten digitalen Spiele auf.<\/p>\n\n\n\n<p>Die Methode hier: Es entstehen beim Entwickeln Fehler und damit \u00fcberschreiten man die Konstruktion oder legt offen, was f\u00fcr Bedingungen Spiele erf\u00fcllen m\u00fcssen. Nennen wir sie FailTheConstruct .-) Ein funktionierendes Spiel ist das Ergebnis von unendlich vielen &#8222;Fehlern&#8220;.<\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"720\" style=\"aspect-ratio: 1180 \/ 720;\" width=\"1180\" controls src=\"https:\/\/research.swissdigitization.ch\/wp-content\/uploads\/2025\/05\/Screen-2025-05-23-1712471.mp4\"><\/video><\/figure>\n\n\n\n<!--more-->\n\n\n\n<p>Im vorliegenden Fall helfen die Spuren und man kann damit die Zukunft &#8222;voraussehen&#8220;. Wie wichtig das Erkennen des Randes ist wegen dem Abstossen wird auch in diesem Prototype erlebbar! <\/p>\n\n\n\n<p><\/p>\n\n\n\n<p>Ein 512 Bytes Exe und ein Glitch. Amiga Staff.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>; ------------------------------------\n; BREAKOUT SMALL\n; SIZE-CODED\n; ------------------------------------\n; sizecoding - virtualise all\n; approach: paint everything from new\n;\n\n; versions:\n; short\n; deluxe version \n; art: destroying the graphics 1 pixel \n; demoversion \n; entry for \"kulturfoerderung\" vgl art \n;\n\n; &gt; Template based (C) 2024 DEPECHE\n\nBLTDDAT\t=0\t;result of the last word. used for bob collision detection and \n\t\t;MFM decoding\nDMACONR\t=2\t;bit 14=blitter busy flag\n\nBLTCON0\t=$40\t;blitter operation setup\nBLTCON1\t=$42\nBLTAFWM\t=$44\nBLTALWM\t=$46\n\nBLTCPTH\t=$48\t;sources, destination, and size\nBLTCPTL\t=$4a\nBLTBPTH\t=$4c\nBLTBPTL\t=$4e\nBLTAPTH\t=$50\nBLTAPTL\t=$52\nBLTDPTH\t=$54\nBLTDPTL\t=$56\n\nBLTSIZE\t=$58\n\nBLTCON0L=$5a\t;ECS\/AGA registers\nBLTSIZV\t=$5c\nBLTSIZH\t=$5e\n\nBLTCMOD\t=$60\t;modulos\nBLTBMOD\t=$62\nBLTAMOD\t=$64\nBLTDMOD\t=$66\n\nBLTCDAT\t=$70\t;data to replace sources\nBLTBDAT\t=$72\nBLTADAT\t=$74\n\nDMACON\t=$96\t;bit 6: enable blitter DMA. bit 10: give blitter priority over\n\t\t;the CPU.\n\nVPOSR           EQU             $dff004\n\n\nbitplane1\tequ\t$3c000\nbitplane2\tequ\t$3c000+40*256; $07d0\t\t; $07d0 will be used as value\n\nbitplane1_double\tequ\t$3c000+4*40*256\nbitplane2_double\tequ\t$40000+$07d0+4*40*256\t\t; $07d0 will be used as value\n\n\npwidth\t\tequ\t40\nnumchars\tequ\t3\ndelta\t\tequ\t8\t\t\t; y spacing of chars\nspacing\t\tequ\t3\t\t\t; x (*8) spacing of chars\n\n\n; gameplay\n\n\n; playfield size\nplayfieldsize = 16 ; x\nplayfieldsizeheight = 10 ; *y\nplayfieldwidthx = playfieldsize*16\nplayfieldwidthstartx = (320-playfieldwidthx)\/2\n; * max playfield size\nplayfieldheight = 255\n; number of bricks\nbricksnumber = playfieldsize*playfieldsizeheight;\n\n; ball collision\ndistance = 144\n\n; paddle y\npaddley = 256-16\n\ngameovery = paddley+2\n\n; -----------------------\n; gameobjects \n; -----------------------\n; gameobjects - offsets\n\n; gameobjectlength\ngsize = 10\n\n; propterties\nx = 0\ny = 2\nstate = 4\nspeedx = 6\nspeedy = 8\n\n; special objects - ball\nball = 0\npaddle = gsize\n\n; reference\n; exp: ball.x = ball+x(a5)\n\n; -------------------------------------------\n; CHIPMEMORY\n; -------------------------------------------\n\tcode_c\t\t\t\t\t\n; -------------------------------------------\n\n\tlea\tclist(pc),a0\t\t\t;\n\tmove.l\ta0,$dff080\t\t\t;\n\n; -------------------------------------------\n; BASE VARS\n; -------------------------------------------\n;\tmove.l\t#bitplane1,a6 ; \n\tmove.l #variables,a5 ; variables\n\n\t; -------------------------\n\t; init gameobjects\n\t; -------------------------\n; variables\nstartgame:\n\t; all variables\n\tmove.l #0,d5 ; counter\n\tmove.l #0,d3 ; y\n\tmove.l #-2*16,d4 ; x\n\tmove.l a5,a1 ; var\ndxs:\t   \n\t; version 1.0\n\tmove.w d4,x(a1)\n\tmove.w d3,y(a1)\n\tmove.w #1,state(a1) \n\t; sizecoding: todo: state 2 &gt; than set all to 2 !\n\n\t; version 1\n\t;move.w #2,speedx(a1)\n\t;move.w #2,speedy(a1)\n\t; version 2\n\t; move.l #2+65536+1,speedx(a1)\n\tmove.l #%00000000000000100000000000000010,speedx(a1)\n\tadd.l #gsize,a1\n\n\tadd.l #16,d4\n\tcmp.l #playfieldwidthx,d4\n\tbne ct\n\t  add.l #8,d3\n\t  move.l #0,d4\nct: \n\tadd.l #1,d5\n\tcmp.l #bricksnumber+2,d5\n\tbne dxs\n\tmove.w #2001,(a1) ; stop brick\n\n\n\t; version 1\n;\tmove.l a5,a4\n;\tmove.w #playfieldwidthx\/2,ball+x(a4)\n;\tmove.w #100,ball+y(a4)\n;\tmove.w #playfieldwidthx\/2,paddle+x(a4)\n;\tmove.w #paddley,paddle+y(a4)\n\t; version 2\n\tmove.w #40,ball+x(a5)\n\tmove.w #100,ball+y(a5)\n\tmove.w #playfieldwidthx\/2,paddle+x(a5)\n\tmove.w #paddley,paddle+y(a5)\n\n; --------------------\n; context \n; --------------------\n; a6 : screen\n; a5 : variables\n\n\n; ----------------------\ndemoloop:\n; ----------------------\n\n\t; -----------------------\n\t; swap screen\n\t; -----------------------\n\t; version 2.0\n\t; counterx\n;\tclr.l d0\n;\tmove.w counterx,d0\n;\tcmp.w #0,screenA\n\n\t; version 1.0\n\tadd.l #1,counter ; do\n\tmove.l counter,d0\n\tdivu #2,d0\n\tswap d0\n\tcmp.w #0,d0\n\tbeq   screenA\n; \t\tversion 2\n;\t\tmove.w #1,counterx\n\t\t; version 1\n\t\t; move.l #bitplaneparta,a1\n\t\t;\tmove.w #bitplane1&gt;&gt;16,(a1)\n\t\tmove.w #bitplane1&gt;&gt;16,bitplaneparta\n\t\t; version 1.0\n\t\t;move.l #bitplanepartb,a1\n\t\t;\tmove.w #bitplane1&amp;$ffff,(a1)\n\t\tmove.w #bitplane1&amp;$ffff,bitplanepartb\n\t\tmove.l\t#bitplane1_double,a6 ; \n\t\t; move.w #$0fff,(color)\n\t\tjmp screenB\nscreenA: \n; \t\tversion 2\n;\t\tmove.w #0,counterx\n\t\t; version 1.0\n\t\t; move.l #bitplaneparta,a1\n\t\t;\tmove.w #bitplane1_double&gt;&gt;16,(a1)\n\t\t; move.l #bitplanepartb,a1\n\t\t;\tmove.w #bitplane1_double&amp;$ffff,(a1)\n\t\tmove.w #bitplane1_double&gt;&gt;16,bitplaneparta\n\t\tmove.w #bitplane1_double&amp;$ffff,bitplanepartb\n\t\tmove.l\t#bitplane1,a6 ; \n\t\t; move.w #$0f0f,(color)\nscreenB:     \n\n\t; -----------------------\n\t; clear screen\n\t; -----------------------\n\t; version 1\n;\tmove.l a6,a1\n;\tmove.l #40\/4*playfieldheight,d1\n;dhx:\n;\tmove.l #1,(a1) ; b=1 w=2 l=4\n;\tadd.l #4,a1\n;\tdbra d1,dhx\n\n\t; version 2 movem\n\tmove.l a6,a1\n\tmove.l #(40\/4*playfieldheight)\/8,d1\ndhx:\n\tmove.l d1,d0\n\tdivu #2,d0\n\tswap d0\n\tcmp.w #0,d0\n\tbne dhx_t\n\tmovem.l d0-d7,(a1) ; b=1 w=2 l=4\n\t; \tversion 2\n\t;\tmovem.l d0-d7,40*256(a1) ; b=1 w=2 l=4\n\t;\tversion 1\n\t;\tmovem.l #%1010101010101,40*256(a1) ; b=1 w=2 l=4\ndhx_t:\n\tadd.l #4*8,a1\n\tdbra d1,dhx\n\n\t; version 3 - dirty, slow but not so many bytes!\n;\tmove.l a6,a1\n;\tmove.l #40*256,d1\n;alpha:\n;\tmove.b #0,(a1)+\n;\tdbra d1,alpha\n\n\n\t; ----------------------------------\n\t; MANAGE &amp; RENDER GAMEOBJECTS\n\t; ----------------------------------\n\t\tmove.l a5,a4\n\t\t; a4 variables\t\t\n\trenderit:\n\n\t\t\tcmp.w #0,state(a4)\n\t\t\tbeq notactive\n\n\t\t\t; render object\n\t\t\t\tmove.l a6,a1\n\t\t\t\tmove.w y(a4),d0 ; ball_y\n\t\t\t; add.l counter,d0\n\t\t\t; add.l ball+y(a5),d0\n\t\t\t\tmulu #40,d0\n\t\t\t\tadd.l d0,a1\t\n\t\t\t\tclr.l d0\n\t\t\t\tmove.w x(a4),d0\n\t\t\t\tdivu.w #16,d0\n\t\t\t\tadd.w d0,a1\n\t\t\t\tadd.w d0,a1\n\t\t\t\tswap d0\n\t\t\t\text.l d0\n\t\t\t\tmove.l #6,d2 ; distance\n\t\t\td1x:\n\t\t\t\tmove.l #%11111111000000000000000000000000,d1 ; (a1)\n\t\t\t\tcmp.l a4,a5\n\t\t\t\tbeq paddled\n\t\t\t\tmove.l #%11111111111111100000000000000000,d1 ; (a1)\n\t\t\tpaddled:\t\n\t\t\t\t; ==0 raster - no roll!\n;\t\t\t\tcmp.l #0,d0\n;\t\t\t\tbeq direct\n\t\t\t\tror.l d0,d1\n\t\t\t\t; move.l d1,(a1)\n\t\t\t\tor.l d1,(a1)\n\t\t\t\tjmp fwd\n;\t\t\tdirect:\n;\t\t\t\tmove.l d1,(a1)\t\n\t\t\tfwd:\n\t\t\t\tadd.l #40,a1\n\t\t\t\tdbra d2,d1x\n\t\t; \/ render object\n\n\n\t\t; 'collision detection'\n\t\t; variant \n\t\tcmp.l a4,a5 ; not the first! \n\t\tbeq nonearenough\n\t\t\tclr.l d0\n\t\t\tmove.w x(a4),d0 \n\t\t\tadd.w #4,d0 ; offset x\n\t\t\tsub.w ball+x(a5),d0\n\t\t\tmuls d0,d0\n\t\t\tmove.w d0,d2\n\t\t\tclr.l d1\n\t\t\tmove.w y(a4),d1 \n\t\t\tadd.w #4,d1 ; offset y\n\t\t\tsub.w ball+y(a5),d1\n\t\t\tmuls d1,d1\n\t\t\tadd.l d1,d0\n\t\t\tcmp.l #distance,d0 ; distance \/ collision\n\t\t\tbgt nonearenough\n\t\t\t\t; d0 vs d1 \n\t\t\t\t; &gt; x or y ! &gt; left or up inversion \n\t\t\t\tmove.w #0,state(a4)\n\n\n\t\t\t\tcmp.w d1,d2\n\t\t\t\tblt up\n\t\t\t\tjmp left\n\t\tnonearenough:\n\n\t\tnotactive:\n\n\n\tadd.l #gsize,a4\n\tcmp.w #2001,(a4)\n\tbne renderit\n\n\t; brutal fix\n\tmove.w #1,paddle+state(a5)\n\n\n\t; vsync\nwaitVB:\n\tmove.l VPOSR,d0\n\tand.l #$1ff00,d0\n\tcmp.l #300&lt;&lt;8,d0\n\tbne waitVB\n\n\n\t; debug slower\n;\tmove.l #10000000,d1\n;d12x:\t\n;\tdbra d1,d12x\n\n\t; ball\n\tmove.w ball+speedx(a5),d0\n\tadd.w d0,ball+x(a5)\n\tmove.w ball+speedy(a5),d0\n\tadd.w d0,ball+y(a5)\n\n\t; borders\n\t; border-x\n\tcmp.w #1,ball+x(a5)\n\tblt left\n\tcmp.w #playfieldsize*16-8,ball+x(a5)\n\tblt right\nleft:\n\t\tmove.w speedx(a5),d0\n\t\tmuls.w #-1,d0\n\t\tmove.w d0,speedx(a5)\nright:\n\n\t; borders-y\n\tcmp.w #0,ball+y(a5)\n\tbgt bottomy\nup:\n\t\tmove.w speedy(a5),d0\n\t\tmuls.w #-1,d0\n\t\tmove.w d0,speedy(a5)\n\t\tadd.w d0,ball+y(a5)\t\t\n\t\tmove.w speedx(a5),d0\n\t\tadd.w d0,ball+x(a5)\t\t\nbottomy:\n\n\t; gameover\n\tcmp.w #gameovery,ball+y(a5)\n\tbgt startgame\n\t\n\n\t; --------------------\n\t; joystick-paddle\n\t; --------------------\n\tmove.w\t$dff00c,d3\t; Read Joy1dat\n\tbtst.l\t#1,d3\t\t; If bit 1 is 1 we move to the Right\n\tbeq.s\tj_right\t\t; else check for left\n;\tcmp.w #300,paddle+x(a5)\n;\tbgt j_right\t\t\t\n\t\tadd.b #4,paddle+x+1(a5)\t\n\tj_right:\n\tbtst.l\t#9,d3\t\t; If bit 9 is 1 then we so to the left\n\tbeq.s\tj_left\t\t; If the bit is 0 then we don't go to the left\n;\tcmp.w #20,paddle+x(a5)\n;\tblt j_left\n\t\tsub.b #4,paddle+x+1(a5)\t\n\tj_left:\n\n\n; ----------------------\n\tjmp demoloop\n; ----------------------\n\n\n; ----------------------\n; DATA\n; ----------------------\n\n\teven\ndoublebufferf: dc.w 0\n\teven\n\nclist\t\n\n; necessaire?\n;\tdc.w\t$009a,$7fff\n;\tdc.w\t$0096,$0020\t; sprites off\n\n\tdc.w\t$008e,$2c81\n\tdc.w\t$0090,$2bc1\n;\tdc.w\t$0092,$0038\n;\tdc.w\t$0094,$00d0\n\n\t; screens\t\n\tdc.w\t$00e0\n\tbitplaneparta:\n\tdc.w\tbitplane1&gt;&gt;16\n\tdc.w\t$00e2\n\tbitplanepartb:\n\tdc.w \tbitplane1&amp;$ffff\n\n;\tdc.w\t$00e4,bitplane2&gt;&gt;16\n;\tdc.w\t$00e6,bitplane2&amp;$ffff\n\tdc.w\t$1100,$1100\t; 1  01 2 bitplanes\n;\n\tdc.w\t$0180,$0000\n\tdc.w\t$0182\n\tcolor:\n\tdc.w $0fff\n\n;\tdc.w\t$0184,$0f00\n;\tdc.w\t$0186,$00f0\n\n\tdc.w  $0000,$0000 \t\t; stop the copper\n\n\teven\n\n; version\ncounter: dc.l 1\n; version 2\ncounterx: dc.w 1\n\nvariables:\n\n;\tdc.w 20,20,1,2,2  ; ball\n;\tdc.w 120,180,1,2,1  ; paddle\n;\tdc.w 0,0,1,1,1  ; bricks\n;\tdc.w 16,0,1,1,1  ; bricks\n;\tdc.w 32,0,1,1,1  ; bricks\n;\tdc.w 48,0,1,1,1  ; bricks\n;\tdc.w 48,48,1,1,1  ; bricks\n;\tdc.w 64,64,1,1,1  ; bricks\n;\tdc.w 2001 ; break\n\n\teven\n\n\n; not used code\n; simple rect rendered\n\n;move.w ball+y(a7),d0 ; ball_y\n;\tmulu #40,d0\n;\tadd.l d0,a1\t\n;\tclr.l d0\n;\tmove.w ball+x(a7),d0\n\n;\tdivu.w #16,d0\n\n;  add.w d0,a1\n;  add.w d0,a1\n\n\t\n;\tswap d0\n;\text.l d0\n\n \t\n;\tmove.l #7,d2\n;d1x:\n;\tmove.l #%11111111000000000000000000000000,d1 ; (a1)\n;\tmove.l #%11111111111111110000000000000000,d1 ; (a1)\n;\tror.l d0,d1\n;\tmove.l d1,(a1)\n;\n;\tadd.l #40,a1\n;\tdbra d2,d1x<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Oder Hintergrund, der immer gel\u00f6scht werden muss, nur darauf bauen die meisten digitalen Spiele auf. Die Methode hier: Es entstehen beim Entwickeln Fehler und damit \u00fcberschreiten man die Konstruktion oder legt offen, was f\u00fcr Bedingungen Spiele erf\u00fcllen m\u00fcssen. Nennen wir sie FailTheConstruct .-) Ein funktionierendes Spiel ist das Ergebnis von unendlich vielen &#8222;Fehlern&#8220;.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-4454","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/4454","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4454"}],"version-history":[{"count":8,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/4454\/revisions"}],"predecessor-version":[{"id":4463,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=\/wp\/v2\/posts\/4454\/revisions\/4463"}],"wp:attachment":[{"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4454"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4454"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/research.swissdigitization.ch\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4454"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}