{"id":110,"date":"2013-03-26T09:39:34","date_gmt":"2013-03-26T17:39:34","guid":{"rendered":"http:\/\/adamantyr.com\/blog\/?p=110"},"modified":"2013-03-26T09:39:34","modified_gmt":"2013-03-26T17:39:34","slug":"animated-changes","status":"publish","type":"post","link":"http:\/\/www.adamantyr.com\/index.php\/2013\/03\/26\/animated-changes\/","title":{"rendered":"Animated Changes"},"content":{"rendered":"<p>I&#8217;m still working on content changes right now&#8230; graphics, sound effects, actual FX for all the spells&#8230; a lot of work to do before I go back to coding up things.<\/p>\n<p>One aside was to update my animation code. I&#8217;ve had the same block of code in place for several years, and it&#8217;s functioned adequately. But it&#8217;s hard to expand, as it&#8217;s really just a set of linear instructions for each character block. Some sample code is this:<\/p>\n<pre>* Tile animation\nANIME\u00a0 DATA AWS,AM1\nAM1\u00a0\u00a0\u00a0 MOV\u00a0 @CLOCK,R0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ANDI R0,&gt;0003\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JEQ\u00a0 AM15\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RTWP\nAM15\u00a0\u00a0 LI\u00a0\u00a0 R0,&gt;2468\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,HIBUFF\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R2,40\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BLWP @VMBR\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,32\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 C\u00a0\u00a0\u00a0 @CHAR,@W1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JLE\u00a0 AM16\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLR\u00a0 R1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,8\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,16\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,24\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\nAM16\u00a0\u00a0 LI\u00a0\u00a0 R0,&gt;2468\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,HIBUFF\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R2,40\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BLWP @VMBW\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R0,&gt;0400\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,HIBUFF\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R2,104\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BLWP @VMBR\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,64\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ASOUTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,72\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AWEST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,80\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,88\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AEAST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 @CLOCK,R1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLR\u00a0 R0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DIV\u00a0 @W16,R0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 R1,R1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JEQ\u00a0 AM2\nAMEND\u00a0 B\u00a0\u00a0\u00a0 @AM7\nAM2\u00a0\u00a0\u00a0 MOV\u00a0 R0,R7\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ANDI R7,&gt;0003\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,24\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AROT\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,32\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ASOUTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,40\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AWEST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,48\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,56\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AEAST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CI\u00a0\u00a0 R7,3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JNE\u00a0 AM25\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLR\u00a0 R1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ASOUTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AEAST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,8\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ASOUTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @AEAST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP\u00a0 AM3<\/pre>\n<p>This kind of imperative linear approach is all right, if you don&#8217;t have a lot of things to do. Truthfully, in assembly language, you often have to balance whether or not a more generic data-driven approach wouldn&#8217;t just end up costing you more memory than its worth.<\/p>\n<p>In my case, my animation requirements DID get up complicated enough I wanted to get away from this approach. I also wanted it to be easy to add new patterns or alter exiting ones (and their animation speed) with a simple change.<\/p>\n<p>Here&#8217;s some of the new code, which uses a data array to store the VDP address, size, and speed and type of animation. It&#8217;s then processed in a short loop:<\/p>\n<pre>* Tile animation\nANIME\u00a0 DATA AWS,AM1\nAM1\u00a0\u00a0\u00a0 MOV\u00a0 @&gt;8314,R10\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Copy stack address to R10\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 @CLOCK,R0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ANDI R0,&gt;0003\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Check clock value for 1\/15 interval\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JEQ\u00a0 AM2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * If not, skip animation\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RTWP\nAM2\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R8,ANDAT0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANIMAT\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 C\u00a0\u00a0\u00a0 @GSTATE,@W2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * In combat mode?\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JNE\u00a0 AM4\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R8,ANDAT2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANIMAT\nAM3\u00a0\u00a0\u00a0 RTWP\nAM4\u00a0\u00a0\u00a0 C\u00a0\u00a0\u00a0 @CHAR,@W2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Is character set 3-7?\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JLE\u00a0 AM3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R8,ANDAT1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 @ANIMAT\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JMP\u00a0 AM3\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\n\nANIMAT MOV\u00a0 R11,*R10+\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Animation looping for blocks\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 R8,R9\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 *R9+,R0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Load character data \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,HIBUFF\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 *R9+,R2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BLWP @VMBR\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLR\u00a0 R1\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Clear pattern index\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 SRL\u00a0 R2,3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Get proper count into R2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 R2,R7\nANM1\u00a0\u00a0 MOV\u00a0 @CLOCK,R3\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Get clock value into R3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 CLR\u00a0 R2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DIV\u00a0 *R9+,R2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Divide by speed factor\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 *R9+,R0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Get animation routine into R0\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 R3,R3\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JNE\u00a0 ANM2\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * If not at interval, skip\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BL\u00a0\u00a0 *R0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Branch to animation routine\nANM2\u00a0\u00a0 AI\u00a0\u00a0 R1,8\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Increment to next character\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DEC\u00a0 R7\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 JNE\u00a0 ANM1\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 *R8+,R0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 * Write character data \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 LI\u00a0\u00a0 R1,HIBUFF\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 MOV\u00a0 *R8+,R2\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 BLWP @VMBW\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 B\u00a0\u00a0\u00a0 @SUBRET\n\n* Pattern animation data for travel\/combat mode 0-6 (56 bytes)\nANDAT0 DATA &gt;0400,104\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 16,ACIRC\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 16,ACIRC\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 16,AUPDW\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 8,AROT\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 8,ASOUTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 8,AWEST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 8,ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 8,AEAST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 4,ASOUTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 4,AWEST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 4,ANORTH\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 4,AEAST\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 DATA 32,ACIRC<\/pre>\n<p>My old approach was using around 436 bytes of code space. With the data arrays and the smaller routines, my new system uses about 100 less bytes, and is easier to use. On screen, speed seems unimpaired as well. Huzzah!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m still working on content changes right now&#8230; graphics, sound effects, actual FX for all the spells&#8230; a lot of work to do before I go back to coding up things. One aside was to update my animation code. I&#8217;ve &hellip; <a href=\"http:\/\/www.adamantyr.com\/index.php\/2013\/03\/26\/animated-changes\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,4,5,12],"tags":[],"class_list":["post-110","post","type-post","status-publish","format-standard","hentry","category-coding","category-crpg","category-design","category-ti-994a"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/pgaeMJ-1M","_links":{"self":[{"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/posts\/110","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/comments?post=110"}],"version-history":[{"count":0,"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/posts\/110\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/media?parent=110"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/categories?post=110"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.adamantyr.com\/index.php\/wp-json\/wp\/v2\/tags?post=110"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}