
{"id":457,"date":"2010-10-24T12:06:01","date_gmt":"2010-10-24T10:06:01","guid":{"rendered":"http:\/\/matosimi.websupport.sk\/atari\/?p=457"},"modified":"2010-10-24T12:06:01","modified_gmt":"2010-10-24T10:06:01","slug":"cc65-volanie-asm-subroutines","status":"publish","type":"post","link":"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/","title":{"rendered":"CC65 &#8211; volanie ASM subroutines"},"content":{"rendered":"<p>Je to zvl\u00e1\u0161tne, nikdy som nezvykol p\u00edsa\u0165 tak\u00e9to veci, ale asi ma to fakt bav\u00ed alebo \u010do, lebo in\u00e1\u010d si to neviem vysvetli\u0165. Odniekia\u013e sa proste berie pocit, \u017ee sa treba podeli\u0165 o sk\u00fasenosti&#8230;<\/p>\n<p>Po\u010fme teda na to.<\/p>\n<p>Ako som v predo\u0161lom \u010dl\u00e1nku p\u00edsal, pracujem na gamese roxblox. Nie je to o tom, \u017ee by som nad tym str\u00e1vil nejako ve\u013ea \u010dasu, ale postupne objavujem r\u00f4zne nov\u00e9 probl\u00e9my, ktor\u00e9 je potrebn\u00e9 rie\u0161i\u0165. Zoza\u010diatku to i\u0161lo super, ale \u010d\u00edm \u010falej, t\u00fdm zlo\u017eitej\u0161ie veci sa vyskytli a pou\u017eiie C\u010dka na ich rie\u0161enie nie je v\u017edy jednoduch\u0161ie ako pou\u017eitie ASM (teda aspo\u0148 pre m\u0148a).<br \/>\n<!--more--><br \/>\nOno toti\u017e CC65 \u0161tandardne v\u0161etky premenn\u00e9, ktor\u00e9 sa v programe pou\u017e\u00edvaj\u00fa, uklad\u00e1 do svojho softwarov\u00e9ho stacku. To znamen\u00e1, \u017ee aj jednoduch\u00fd program\u00edk na presun p\u00e1r bytov z lok\u00e1cie A na lok\u00e1ciu B je rie\u0161en\u00fd MRTE komplikovane.<\/p>\n<p>Pr\u00edklad z praxe&#8230; v hre m\u00e1m kamene, ktor\u00e9 maj\u00fa rozmer 3&#215;3 znaky. Tieto potrebujem vykreslova\u0165 do vramky. Nekresl\u00edm to priamo, ale m\u00e1m k dispoz\u00edcii vrambuffer, kde vykresl\u00edm \u010do treba a ke\u010f je to hotovo, len to skop\u00edrujem do vram v\u0161etko naraz. Toto kop\u00edrovanie je stra\u0161ne pomal\u00e9, uk\u00e1\u017eem pre\u010do&#8230; Zoberme si rutinu na kop\u010denie 3&#215;3 grafiky do vrambuffera. V C\u010dku som to nap\u00edsal takto:<\/p>\n<p><a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code1.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code1-300x181.png\" alt=\"\" title=\"cc65_code1\" width=\"300\" height=\"181\" class=\"alignnone size-medium wp-image-460\" srcset=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code1-300x181.png 300w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code1.png 432w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Ako to funguje? Jednoducho! V cykle sa pres\u00fava obsah po\u013ea tiles do vrambuffera po riadkoch, tzn. ke\u010f pr\u00edde na 4. a 7. prvok, posunie sa o riadok ni\u017e\u0161ie. Optim\u00e1lnej\u0161ie rie\u0161enie ma nenapadlo. Mimochodom, sk\u00fa\u0161al som skr\u00e1ti\u0165 cyklus na 3 kroky (riadky) a zap\u00edsa\u0165 za sebou 3 priradenia znakov v riadku, ale toto sa do ASM k\u00f3du premietlo naozaj doslovne, proste 3x po sebe ten ist\u00fd k\u00f3d.<\/p>\n<p>Ok pozrime teraz na to, ako sa C\u010dkov\u00fd k\u00f3d prelo\u017eil do ASM (bez optimaliz\u00e1ci\u00ed):<\/p>\n<p><a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code2.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code2-300x187.png\" alt=\"\" title=\"cc65_code2\" width=\"300\" height=\"187\" class=\"alignnone size-medium wp-image-461\" srcset=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code2-300x187.png 300w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code2-1024x638.png 1024w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code2.png 1199w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Tak\u00fdto nechutne dlh\u00fd k\u00f3d pres\u00fava 9 bytov z jedn\u00e9ho miesta na druh\u00e9!!!<\/p>\n<p>Ono by sa mohlo zda\u0165, \u017ee sa na to d\u00e1 vyprdn\u00fa\u0165: &#8220;ve\u010f je to ASM, aj tak to bude r\u00fdchle&#8230;&#8221; &#8211; nebude! Naozaj nie, m\u00e1m to odsk\u00fa\u0161an\u00e9 \ud83d\ude09<\/p>\n<p>Tu mi \u017eiadna built-in optimaliz\u00e1cia nepom\u00f4\u017ee. Tak\u00e9to kritick\u00e9 rutiny treba spravi\u0165 v ASM ru\u010dne. Uk\u00e1\u017eem ako na to.<br \/>\nV z\u00e1sade ako prv\u00fd krok treba v configu (atari.cfg) skr\u00e1ti\u0165 \u010das\u0165 MEMORY ZP(zero page), aby sa dalo pou\u017ei\u0165 nepriame adresovanie cez 0.str\u00e1nku bez toho aby som sa musel ob\u00e1va\u0165 \u010di si m\u00f4j ASM k\u00f3d s prelo\u017een\u00fdm CC65 k\u00f3dom nebud\u00fa vz\u00e1jomne prepisova\u0165 \u00fadaje. Skr\u00e1til som teda ten size zo $7E na $6E, t\u00fdm som si &#8220;alokoval&#8221; 16 bytov 0.str\u00e1nky pre ASM subrutiny, to je viac ne\u017e dos\u0165. Zmenen\u00fd riadok configu vyzer\u00e1 takto:<\/p>\n<p><code>ZP:      start = $0082, size = $006E, type = rw, define = yes;<\/code><\/p>\n<p>$82 + $6E = $F0 , tak\u017ee od $F0 po $FF je m\u00f4j priestor.<\/p>\n<p>Rutinu nap\u00ed\u0161em do roxblox_data.asx z ktorej si labels pren\u00e1\u0161am do C (vi\u010f <a href=\"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-a-atari\/\">\u010dl\u00e1nok<\/a>). Vstupn\u00e9 premenn\u00e9 vlo\u017e\u00edm rovno do 0.str\u00e1nky. C\u010dkov\u00fd k\u00f3d bude vyzera\u0165 nasledovne:<\/p>\n<p><a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code3.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code3-300x113.png\" alt=\"\" title=\"cc65_code3\" width=\"300\" height=\"113\" class=\"alignnone size-medium wp-image-464\" srcset=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code3-300x113.png 300w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code3.png 427w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>D\u00f4lo\u017eit\u00e9 je poveda\u0165 kompil\u00e1toru aby neoptimalizoval inline assembler, preto\u017ee v pr\u00edpade optimaliz\u00e1cie s vyu\u017eit\u00edm inline funkci\u00ed by to nechodilo. V \u00favode funkcie pres\u00favam vstupn\u00e9 parametre do 0.str\u00e1nky, ktor\u00fa m\u00e1m zadefinovan\u00fa takto:<\/p>\n<p><a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code4.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code4.png\" alt=\"\" title=\"cc65_code4\" width=\"189\" height=\"85\" class=\"alignnone size-full wp-image-465\" \/><\/a><\/p>\n<p>Asm rutina vyzer\u00e1 nasledovne:<br \/>\n<a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code5.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code5-254x300.png\" alt=\"\" title=\"cc65_code5\" width=\"254\" height=\"300\" class=\"alignnone size-medium wp-image-467\" srcset=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code5-254x300.png 254w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code5.png 636w\" sizes=\"(max-width: 254px) 100vw, 254px\" \/><\/a><\/p>\n<p>Je tu vidie\u0165 zna\u010dn\u00fd rozdiel v d\u013a\u017eke k\u00f3du, ale hlavne v r\u00fdchlosti vykonania.<\/p>\n<p>Takto vyzer\u00e1 skompilovan\u00e9 nov\u00e9 vn\u00fatro funkcie C:<br \/>\n<a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code6.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code6-300x227.png\" alt=\"\" title=\"cc65_code6\" width=\"300\" height=\"227\" class=\"alignnone size-medium wp-image-468\" srcset=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code6-300x227.png 300w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code6.png 693w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Akosi nech\u00e1pem, \u010do tam h\u013ead\u00e1 to ldx #$00, ale tak \u010do u\u017e, ja som to nep\u00edsal :D. \u010co sa t\u00fdka optimaliz\u00e1cie, \u00faplne NEDOPORU\u010cUJEM pou\u017e\u00edva\u0165 -Oi (oprimaliz\u00e1cia na inline funkcie), stra\u0161ne to vie sprasi\u0165 m\u00f4j k\u00f3d a aj tak\u00e1 jednoduch\u00e1 funkcia, ako je na prvom obr\u00e1zku v tomto \u010dl\u00e1nku prestane fungova\u0165. Optimaliz\u00e1ciu registrov som vysk\u00fa\u0161al a zatia\u013e som nenarazil na probl\u00e9m. T\u00e1to optimaliz\u00e1cia sa p\u00fa\u0161\u0165a k\u013e\u00fa\u010dom -Or a dok\u00e1\u017ene naozaj vidite\u013ene skr\u00e1ti\u0165 v\u00fdsledn\u00fd k\u00f3d oproti neoptimalizovanej kompil\u00e1cii.<\/p>\n<p>Pre \u00faplnos\u0165 takto vyzer\u00e1 k\u00f3d s optimaliz\u00e1ciou -Or:<br \/>\n<a href=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code7.png\"><img decoding=\"async\" loading=\"lazy\" src=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code7-300x204.png\" alt=\"\" title=\"cc65_code7\" width=\"300\" height=\"204\" class=\"alignnone size-medium wp-image-469\" srcset=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code7-300x204.png 300w, http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code7.png 697w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p>Dva nepotrebn\u00e9 v\u00fdskyty ldx #$00 zmizli, jeden ostal.<\/p>\n<p>&#8230;nikto nie je dokonal\u00fd<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Je to zvl\u00e1\u0161tne, nikdy som nezvykol p\u00edsa\u0165 tak\u00e9to veci, ale asi ma to fakt bav\u00ed alebo \u010do, lebo in\u00e1\u010d si [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[3,56],"tags":[64,100,48,57,65],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v20.4 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>CC65 - volanie ASM subroutines - MatoSimi<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/\" \/>\n<meta property=\"og:locale\" content=\"sk_SK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CC65 - volanie ASM subroutines - MatoSimi\" \/>\n<meta property=\"og:description\" content=\"Je to zvl\u00e1\u0161tne, nikdy som nezvykol p\u00edsa\u0165 tak\u00e9to veci, ale asi ma to fakt bav\u00ed alebo \u010do, lebo in\u00e1\u010d si [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/\" \/>\n<meta property=\"og:site_name\" content=\"MatoSimi\" \/>\n<meta property=\"article:published_time\" content=\"2010-10-24T10:06:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code1-300x181.png\" \/>\n<meta name=\"author\" content=\"MatoSimi\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"MatoSimi\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/\",\"url\":\"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/\",\"name\":\"CC65 - volanie ASM subroutines - MatoSimi\",\"isPartOf\":{\"@id\":\"http:\/\/matosimi.websupport.sk\/atari\/#website\"},\"datePublished\":\"2010-10-24T10:06:01+00:00\",\"dateModified\":\"2010-10-24T10:06:01+00:00\",\"author\":{\"@id\":\"http:\/\/matosimi.websupport.sk\/atari\/#\/schema\/person\/2ff9bfa973a868c31914b5b1b659b697\"},\"inLanguage\":\"sk\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/\"]}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/matosimi.websupport.sk\/atari\/#website\",\"url\":\"http:\/\/matosimi.websupport.sk\/atari\/\",\"name\":\"MatoSimi\",\"description\":\"8-bit Atari and other stuff\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/matosimi.websupport.sk\/atari\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"sk\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/matosimi.websupport.sk\/atari\/#\/schema\/person\/2ff9bfa973a868c31914b5b1b659b697\",\"name\":\"MatoSimi\",\"url\":\"http:\/\/matosimi.websupport.sk\/atari\/author\/matosimi\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CC65 - volanie ASM subroutines - MatoSimi","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/","og_locale":"sk_SK","og_type":"article","og_title":"CC65 - volanie ASM subroutines - MatoSimi","og_description":"Je to zvl\u00e1\u0161tne, nikdy som nezvykol p\u00edsa\u0165 tak\u00e9to veci, ale asi ma to fakt bav\u00ed alebo \u010do, lebo in\u00e1\u010d si [&hellip;]","og_url":"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/","og_site_name":"MatoSimi","article_published_time":"2010-10-24T10:06:01+00:00","og_image":[{"url":"http:\/\/matosimi.websupport.sk\/atari\/wp-content\/uploads\/2010\/10\/cc65_code1-300x181.png"}],"author":"MatoSimi","twitter_misc":{"Written by":"MatoSimi","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/","url":"http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/","name":"CC65 - volanie ASM subroutines - MatoSimi","isPartOf":{"@id":"http:\/\/matosimi.websupport.sk\/atari\/#website"},"datePublished":"2010-10-24T10:06:01+00:00","dateModified":"2010-10-24T10:06:01+00:00","author":{"@id":"http:\/\/matosimi.websupport.sk\/atari\/#\/schema\/person\/2ff9bfa973a868c31914b5b1b659b697"},"inLanguage":"sk","potentialAction":[{"@type":"ReadAction","target":["http:\/\/matosimi.websupport.sk\/atari\/2010\/10\/cc65-volanie-asm-subroutines\/"]}]},{"@type":"WebSite","@id":"http:\/\/matosimi.websupport.sk\/atari\/#website","url":"http:\/\/matosimi.websupport.sk\/atari\/","name":"MatoSimi","description":"8-bit Atari and other stuff","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/matosimi.websupport.sk\/atari\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"sk"},{"@type":"Person","@id":"http:\/\/matosimi.websupport.sk\/atari\/#\/schema\/person\/2ff9bfa973a868c31914b5b1b659b697","name":"MatoSimi","url":"http:\/\/matosimi.websupport.sk\/atari\/author\/matosimi\/"}]}},"_links":{"self":[{"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/posts\/457"}],"collection":[{"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/comments?post=457"}],"version-history":[{"count":13,"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/posts\/457\/revisions"}],"predecessor-version":[{"id":477,"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/posts\/457\/revisions\/477"}],"wp:attachment":[{"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/media?parent=457"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/categories?post=457"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/matosimi.websupport.sk\/atari\/wp-json\/wp\/v2\/tags?post=457"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}