Speku ja näyttömuistin olemus

November 18th, 2012

Otetaan tästä nyt lopultakin selvä, eli millainen on Spectrumin näyttömuistin rakenne? Tätä sivua tavaamalla ja emulaattorilla kokeilemalla asia alkoi valjeta – eikä kovin lupaavalta näytä pelejä tai demoja ajatellen. Ei sinänsä mikään yllätys Herra Sinklairrin tekeleiden kohdalla 🙂

Spekussa on tunnetusti vain yksi yksi tarkkuus, 256×192 pikseliä, joka koostuu kuuden kilotavun (6144 tavua) bittikartasta osoitteessa 4000h (16384) ja sen perässä sijaitsevista attribuuteista osoitteessa 5800h (22528). Attribuutit ovat se selkeämpi osuus: jokaista 8×8 pikselin laatikkoa kohti on lineaarisesti tavu, joka määrää merkkipaikan etu- ja taustavärin. Vaikkei Spekussa aitoa merkkimoodia olekaan, niin attribuuttimuistin 768 tavua muodostavat merkkitarkkuudella 32×24-ruudukon. Käytössä on kasibittikoneille tyypillinen kolmebittinen RGB, mistä saadaan kahdeksan väriä. Lisäksi on käytössä välkytys- ja kirkkausbitit, joten yksi attribuuttimuistin tavu vkttteee sisältää seuraavat tiedot:

  • v – etu- ja taustavärin keskenään vaihtelu so. välkytys
  • k – kirkkaus eli merkin värit valitaan kirkkaamasta paletista (pl. musta, joka säilyy ennallaan, joten sävyjä on kaikkiaan 15)
  • ttt – taustaväri (nolla bittikartassa)
  • eee – etualan väri (ykkönen bittikartassa)

Bittikartta onkin sitten mutkikkaampi tapaus. Yhdessä tavussa on kahdeksan pikseliä, ylin bitti vasemmalla ja alin oikealla. Täysi osoite bittikarttaan vaatii viisi bittiä x-koordinaatille ja kahdeksan y-koordinaatille, sekä tietysti bittikartan perusosoitteen. Looginen ratkaisu olisi ollut muodostaa osoite tyyliin yyyyy yyyxxxxx, mutta ilmeisesti merkkien piirtämisen nopeuttamiseksi järjestys on toisenlainen. Kokonainen osoite on muotoa 010kkyyy mmmxxxxx seuraavasti:

  • 010 – bittikartan osoite eli 4000h
  • kk – kaistale, ruutu jakautuu kolmeen 2048 tavun kaistaleeseen
  • yyy – y-koordinaatti merkin sisällä
  • mmm – pystysuuntainen merkkipaikka kaistaleen sisällä
  • xxxxx – tavun x-koordinaatti

Lineaarisen y-koordinaatin voi siis ajatella koostuvan biteistä kkmmmyyy, mikä valitettavasti tarkoittaa sitä, että muistiosoitetta muodostaessa bittejä pitää shiftata suuntaan ja toiseen verrattain mutkikkaasti. Nopeutusta voisi saada laskemalla siirrokset valmiiksi taulukkoon, mutta ei taulukon lukeminenkaan mitään nopeaa ole. Spritejen kanssa ongelma on verrattain pieni, kun vaakasuuntaan voi piirtää lineaarisesti, mutta esim. viivanpiirrosta tulee väistämättä hankalaa, jollei koko ruutua piirrä lineaariseen puskuriin, jonka hurauttaa sitten rivi kerrallaan näyttömuistiin.

Nettiä penkoessa on tullut vastaan muutama muukin oleellinen seikka. Muistialue 4000h–7fffh on hidasta muistia, eli sitä käsittelevät yhtaikaa sekä Z80 että ULA, ja konfliktin sattuessa prosessori jää odottelemaan. Bordereissa ei muistia käsitellä, joten siellä Z80 toimii täydellä nopeudella. Useimmissa kasibittikoneissa on vastaava ongelma, jota on ratkottu enemmän ja vähemmän onnistuneesti – esimerkiksi MSX:ssä pitää ruudunpiirron aikana näyttömuistia käsittelevää koodia keinotekoisesti hidastaa, ettei videopiiri roskaa kuvaa. Reunuksen värin voi Spectrumissa säätää suoraan portista feh alimmilla kolmella bitillä. Samassa portissa ovat myös kaiutinta ja kasettiulostuloa kontrolloivat bitit.

Uudemmissa Spekuissa ja klooneissa on vielä omia hienouksiaan. 128k:sta alkaen käyttöön ilmestyi toinen ruutupuskuri, joka sijaitsee pankissa 7. Tuplapuskurointi onnistuu vaihtamalla ULA:n näyttämään jompaa kumpaa ruuduista. Tarkemmin biteistä täällä. Näin äkkiseltään näyttää kyllä aika inhottavalta, että toisen puskurin käyttö varastaa 32 kiloa muistiavaruudesta, sillä ensimmäinen puskuri on kiinteässä paikassa ja ainoastaan muistin lopussa olevan viimeisen pankin voi vaihtaa. Neukkukoneissa on vielä omia laajennuksiaan, kuten väri per pikseli -grafiikkamoodi sekä “kirkas musta” väri, jolla saa käyttöön täydet 16 sävyä. Esim. Pentagonissa ei ole hidasta muistia, joten kone on hieman nopeampi, mikä näkyy toisinaan hidasteluna, kun russiademoja ajaa länsikoneilla.

Oman lisänsä soppaan tuovat vielä eri Spectrumien ruudunpiirron ajastukset. Ajoittamalla koodi tarkkaan yksiin ruudunpiirron kanssa on tehty kaikenlaisia nokkelia efektejä kuten vaikkapa värien lisäämistä välkyttämällä tai väritarkkuuden kohentamista merkkiä tarkemmaksi. Noin nyrkkisääntönä näyttää olevan niin, että kaikki vanhan koulun laitteet ja +2 ovat ajastuksiltaan samanlaisia, kun taas +2A/+3 ja neukkukloonit erilaisia. Kloonitkaan eivät ole keskenään samanlaisia (esim. Scorpion vs. Pentagon), joten lienee haastavaa tehdä ajastuksiin perustuvia demoja tai pelejä, jotka toimisivat kunnolla joka koneessa.

edit: Olikin pikku bugi attribuuttimuistin kohdalla, oikeat bitit ovat vkttteee.

Filed under: koodi,retro

Kommentin kirjoitus

You must be logged in to post a comment.

RSS feed for comments on this post.


Kommenttien virta

Aiheet