{"id":2024,"date":"2012-11-18T12:29:01","date_gmt":"2012-11-18T10:29:01","guid":{"rendered":"http:\/\/www.kameli.net\/marq\/?p=2024"},"modified":"2014-07-23T22:17:28","modified_gmt":"2014-07-23T20:17:28","slug":"speku-ja-nayttomuistin-olemus","status":"publish","type":"post","link":"http:\/\/www.kameli.net\/marq\/?p=2024","title":{"rendered":"Speku ja n\u00e4ytt\u00f6muistin olemus"},"content":{"rendered":"<p>Otetaan t\u00e4st\u00e4 nyt lopultakin selv\u00e4, eli millainen on Spectrumin n\u00e4ytt\u00f6muistin rakenne? <a href=\"http:\/\/whatnotandgobbleaduke.blogspot.fi\/2011\/07\/zx-spectrum-screen-memory-layout.html\">T\u00e4t\u00e4 sivua<\/a> tavaamalla ja emulaattorilla kokeilemalla asia alkoi valjeta \u2013 eik\u00e4 kovin lupaavalta n\u00e4yt\u00e4 pelej\u00e4 tai demoja ajatellen. Ei sin\u00e4ns\u00e4 mik\u00e4\u00e4n yll\u00e4tys Herra Sinklairrin tekeleiden kohdalla \ud83d\ude42<\/p>\n<p>Spekussa on tunnetusti vain yksi yksi tarkkuus, 256&#215;192 pikseli\u00e4, joka koostuu kuuden kilotavun (6144 tavua) bittikartasta osoitteessa 4000h (16384) ja sen per\u00e4ss\u00e4 sijaitsevista attribuuteista osoitteessa 5800h (22528). Attribuutit ovat se selke\u00e4mpi osuus: jokaista 8&#215;8 pikselin laatikkoa kohti on lineaarisesti tavu, joka m\u00e4\u00e4r\u00e4\u00e4 merkkipaikan etu- ja taustav\u00e4rin. Vaikkei Spekussa aitoa merkkimoodia olekaan, niin attribuuttimuistin 768 tavua muodostavat merkkitarkkuudella 32&#215;24-ruudukon. K\u00e4yt\u00f6ss\u00e4 on kasibittikoneille tyypillinen kolmebittinen RGB, mist\u00e4 saadaan kahdeksan v\u00e4ri\u00e4. Lis\u00e4ksi on k\u00e4yt\u00f6ss\u00e4 v\u00e4lkytys- ja kirkkausbitit, joten yksi attribuuttimuistin tavu <em>vkttteee<\/em> sis\u00e4lt\u00e4\u00e4 seuraavat tiedot:<\/p>\n<ul>\n<li><em>v<\/em> \u2013 etu- ja taustav\u00e4rin kesken\u00e4\u00e4n vaihtelu so. v\u00e4lkytys<\/li>\n<li><em style=\"line-height: 1.5em;\">k<\/em><span style=\"line-height: 1.5em;\">\u00a0\u2013 kirkkaus eli merkin v\u00e4rit valitaan kirkkaamasta paletista (pl. musta, joka s\u00e4ilyy ennallaan, joten s\u00e4vyj\u00e4 on kaikkiaan 15)<\/span><\/li>\n<li><em>ttt<\/em> \u2013 taustav\u00e4ri (nolla bittikartassa)<\/li>\n<li><em>eee<\/em> \u2013 etualan v\u00e4ri (ykk\u00f6nen bittikartassa)<\/li>\n<\/ul>\n<p>Bittikartta onkin sitten mutkikkaampi tapaus. Yhdess\u00e4 tavussa on kahdeksan pikseli\u00e4, ylin bitti vasemmalla ja alin oikealla. T\u00e4ysi osoite bittikarttaan vaatii viisi bitti\u00e4 x-koordinaatille ja kahdeksan y-koordinaatille, sek\u00e4 tietysti bittikartan perusosoitteen. Looginen ratkaisu olisi ollut muodostaa osoite tyyliin <em>yyyyy yyyxxxxx<\/em>, mutta <em>ilmeisesti <\/em>merkkien piirt\u00e4misen nopeuttamiseksi j\u00e4rjestys on toisenlainen. Kokonainen osoite on muotoa <em>010kkyyy mmmxxxxx<\/em> seuraavasti:<\/p>\n<ul>\n<li><em>010<\/em> \u2013 bittikartan osoite eli 4000h<\/li>\n<li><em>kk<\/em> \u2013 kaistale, ruutu jakautuu kolmeen 2048 tavun kaistaleeseen<\/li>\n<li><em>yyy<\/em> \u2013 y-koordinaatti merkin sis\u00e4ll\u00e4<\/li>\n<li><em>mmm<\/em> \u2013 pystysuuntainen merkkipaikka kaistaleen sis\u00e4ll\u00e4<\/li>\n<li><em>xxxxx<\/em> &#8211; tavun x-koordinaatti<\/li>\n<\/ul>\n<p>Lineaarisen y-koordinaatin voi siis ajatella koostuvan biteist\u00e4 <em>kkmmmyyy<\/em>, mik\u00e4 valitettavasti tarkoittaa sit\u00e4, ett\u00e4 muistiosoitetta muodostaessa bittej\u00e4 pit\u00e4\u00e4 shiftata suuntaan ja toiseen verrattain mutkikkaasti. Nopeutusta voisi saada laskemalla siirrokset valmiiksi taulukkoon, mutta ei taulukon lukeminenkaan mit\u00e4\u00e4n nopeaa ole. Spritejen kanssa ongelma on verrattain pieni, kun vaakasuuntaan voi piirt\u00e4\u00e4 lineaarisesti, mutta esim. viivanpiirrosta tulee v\u00e4ist\u00e4m\u00e4tt\u00e4 hankalaa, jollei koko ruutua piirr\u00e4 lineaariseen puskuriin, jonka hurauttaa sitten rivi kerrallaan n\u00e4ytt\u00f6muistiin.<\/p>\n<p>Netti\u00e4 penkoessa on tullut vastaan muutama muukin oleellinen seikka. Muistialue 4000h\u20137fffh on <em>hidasta muistia<\/em>, eli sit\u00e4 k\u00e4sittelev\u00e4t yhtaikaa sek\u00e4 Z80 ett\u00e4 ULA, ja konfliktin sattuessa prosessori j\u00e4\u00e4 odottelemaan. Bordereissa ei muistia k\u00e4sitell\u00e4, joten siell\u00e4 Z80 toimii t\u00e4ydell\u00e4 nopeudella. Useimmissa kasibittikoneissa on vastaava ongelma, jota on ratkottu enemm\u00e4n ja v\u00e4hemm\u00e4n onnistuneesti \u2013 esimerkiksi MSX:ss\u00e4 pit\u00e4\u00e4 ruudunpiirron aikana n\u00e4ytt\u00f6muistia k\u00e4sittelev\u00e4\u00e4 koodia keinotekoisesti hidastaa, ettei videopiiri roskaa kuvaa. Reunuksen v\u00e4rin voi Spectrumissa s\u00e4\u00e4t\u00e4\u00e4 suoraan portista feh alimmilla kolmella bitill\u00e4. Samassa portissa ovat my\u00f6s kaiutinta ja kasettiulostuloa kontrolloivat bitit.<\/p>\n<p>Uudemmissa Spekuissa ja klooneissa on viel\u00e4 omia hienouksiaan. 128k:sta alkaen k\u00e4ytt\u00f6\u00f6n ilmestyi toinen ruutupuskuri, joka sijaitsee pankissa 7. Tuplapuskurointi onnistuu vaihtamalla ULA:n n\u00e4ytt\u00e4m\u00e4\u00e4n jompaa kumpaa ruuduista. Tarkemmin biteist\u00e4 <a href=\"http:\/\/www.worldofspectrum.org\/faq\/reference\/128kreference.htm\">t\u00e4\u00e4ll\u00e4<\/a>. N\u00e4in \u00e4kkiselt\u00e4\u00e4n n\u00e4ytt\u00e4\u00e4 kyll\u00e4 aika inhottavalta, ett\u00e4 toisen puskurin k\u00e4ytt\u00f6 varastaa 32 kiloa muistiavaruudesta, sill\u00e4 ensimm\u00e4inen puskuri on kiinte\u00e4ss\u00e4 paikassa ja ainoastaan muistin lopussa olevan viimeisen pankin voi vaihtaa. Neukkukoneissa on viel\u00e4 omia laajennuksiaan, kuten v\u00e4ri per pikseli -grafiikkamoodi sek\u00e4 &#8220;kirkas musta&#8221; v\u00e4ri, jolla saa k\u00e4ytt\u00f6\u00f6n t\u00e4ydet 16 s\u00e4vy\u00e4. Esim. <em>Pentagonissa<\/em> ei ole hidasta muistia, joten kone on hieman nopeampi, mik\u00e4 n\u00e4kyy toisinaan hidasteluna, kun russiademoja ajaa l\u00e4nsikoneilla.<\/p>\n<p>Oman lis\u00e4ns\u00e4 soppaan tuovat viel\u00e4 eri Spectrumien ruudunpiirron ajastukset. Ajoittamalla koodi tarkkaan yksiin ruudunpiirron kanssa on tehty kaikenlaisia nokkelia efektej\u00e4 kuten vaikkapa v\u00e4rien lis\u00e4\u00e4mist\u00e4 v\u00e4lkytt\u00e4m\u00e4ll\u00e4 tai v\u00e4ritarkkuuden kohentamista merkki\u00e4 tarkemmaksi. Noin nyrkkis\u00e4\u00e4nt\u00f6n\u00e4 n\u00e4ytt\u00e4\u00e4 olevan niin, ett\u00e4 kaikki vanhan koulun laitteet ja +2 ovat ajastuksiltaan samanlaisia, kun taas +2A\/+3 ja neukkukloonit erilaisia. Kloonitkaan eiv\u00e4t ole kesken\u00e4\u00e4n samanlaisia (esim. <a href=\"http:\/\/www.worldofspectrum.org\/rusfaq\/index.html\">Scorpion vs. Pentagon<\/a>), joten lienee haastavaa tehd\u00e4 ajastuksiin perustuvia demoja tai pelej\u00e4, jotka toimisivat kunnolla joka koneessa.<\/p>\n<p><em>edit: Olikin pikku bugi attribuuttimuistin kohdalla, oikeat bitit ovat vkttteee.<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Otetaan t\u00e4st\u00e4 nyt lopultakin selv\u00e4, eli millainen on Spectrumin n\u00e4ytt\u00f6muistin rakenne? T\u00e4t\u00e4 sivua tavaamalla ja emulaattorilla kokeilemalla asia alkoi valjeta \u2013 eik\u00e4 kovin lupaavalta n\u00e4yt\u00e4 pelej\u00e4 tai demoja ajatellen. Ei sin\u00e4ns\u00e4 mik\u00e4\u00e4n yll\u00e4tys Herra Sinklairrin tekeleiden kohdalla \ud83d\ude42 Spekussa on tunnetusti vain yksi yksi tarkkuus, 256&#215;192 pikseli\u00e4, joka koostuu kuuden kilotavun (6144 tavua) bittikartasta osoitteessa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[25,15],"tags":[],"class_list":["post-2024","post","type-post","status-publish","format-standard","hentry","category-koodi","category-retro"],"_links":{"self":[{"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=\/wp\/v2\/posts\/2024","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2024"}],"version-history":[{"count":8,"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=\/wp\/v2\/posts\/2024\/revisions"}],"predecessor-version":[{"id":3366,"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=\/wp\/v2\/posts\/2024\/revisions\/3366"}],"wp:attachment":[{"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2024"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2024"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.kameli.net\/marq\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2024"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}