• Pasi

Digikasarin kasvatti II: Ensiaskeleet ohjelmointiin

Päivitetty: tammi 7

Kuinka hienolta tuntuikaan olla kotitietokoneen omistaja vuonna 1983 ja vähitellen opetella ohjelmointia BASICilla! Olin hankkinut oman kotimikroni postimyynnillä ja vähitellen laitteen mukana tilattujen pelien pelaaminen alkoi tuntua yksitoikkoiselta. Aloin käydä kotimikron ohjelmoinnin perusteita läpi Oric-1-tietokoneeni käsikirjaa käyttäen.

Muutamien päivän puuhailu tietokoneella tuntui muutamalta tunnilta, niin kiehtovaa oli alkaa ymmärtää ohjelmoinnin periaatteita. Pian olin oppinut BASICin perusteet: muutaman käskyn, ohjelmien kirjoittamisen numeroitu rivi kerrallaan, tietojen tallennusta ohjelman muistiin, muuttujien käyttöä, ehto- ja toistorakenteet ja ohjelmien tallennuksen ja latauksen C-kaseteille. Seuraavaksi kiinnosti miten ohjelmoisin laitteen grafiikalla pelihahmoja ja miten liikuttaisin niitä ruudulla.

Biteistä pikseleihin, pikseleistä muukalaisiin

Ensimmäiseksi tutustuin Oric-1:n merkkigrafiikkaan. Merkit pystyi määrittelemään itse syöttämällä sopivilla käskyillä määrättyihin muistipaikkoihin tarkoin määriteltyjä pieniä kokonaislukuja, joita kutsutaan tavuiksi. Kaikki ruudulla näkyvä koostui yksittäisistä pikseleistä eli pienistä neliöistä, ja kun ruudulla näkyi yksittäinen merkki, se itse asiassa oli tietyssä muistipaikassa koodi tai järjestysluku, joka viittasi jonoon tavuja toisessa muistipaikassa. Eli ruudulla näkyvä kirjain määrittyi annetulla merkin koodilla tallennettuna tietokoneen muistialueelle, joka vastasi näytön rivejä ja sarakkeita.

Merkin muoto taas määrittyi 8:lla peräkkäisellä tavulla alkaen merkin järjestysluvun eli ns. ASCII-koodin mukaisesta muistipaikasta. Kukin tavu vastasi pisteriviä, jossa oli kahdeksan pistettä, tosin Oric-1:n erikoisuuksiin kuului että ruudulla näytettiinkin merkin pisterivistä vain kuusi pistettä, toisin sanoen itse määritelty merkki oli 6x8 pisteen kokoinen.

Tällaisten merkkigrafiikan perusteiden avulla päähäni soljuivat kuin itsestään siihen liittyvät digitekniikan käsitteet, kuten lukujärjestelmät binääriluvuista heksadesimaalilukuihin, bittien käsittely tavussa käyttäen bittikohtaisia loogisia operaatioita sekä näytön ja grafiikan määrittelyyn käytettävät muistialueet koneen piskuisesta 48 kilotavun kokoisesta keskusmuistista.

Mielenkiintoiset esimerkkiohjelmat, jolla tällaiset merkkigrafiikan tekniikat alkoivat valjeta minulle, löytyivät Oric-1:ni käsikirjan luvusta 9. Advanced Graphics. Seuraava kyseisestä luvusta löytyvä ohjelma osoitti, että omalla koneellani voisi kuin voisikin itse tehdä ohjelman, joka muistutti näkemiäni avaruussotavideopelejä.

5 REM ** DROPPING ALIENS **

10 GOSUB 1000:CLS

20 FOR M = 1 TO 20

30 PAPER INT(RND(1)*4)+4

40 A = RND (1)*32 + 1

50 ZAP

60 FOR N= 0 TO 1100 STEP 40

70 POKE 48039 + N + A, 1

80 POKE 48040 + N + A, 64

90 POKE 48039 + N + A + 6, 2

100 POKE 48040 + N+ A + 6, 64

110 POKE 48039 + N + A + 3, 3

120 POKE 48040 + N + A + 3, 64

130 SOUND 1, N/2, 0

140 PLAY 1,0,5,5

150 POKE 48040 + N + A, 32

160 POKE 48040 + N + A + 6, 32

170 POKE 48040 + N + A + 3, 32

180 NEXT N

190 EXPLODE

200 WAIT RND(1)*200 + 100

210 NEXT M

1000 REM *** CHARACTER DEFINITION ***

1010 FOR N = 0 TO 7

1020 READ X: POKE 46080 + (64 * 8) + N, X

1030 NEXT N

1040 DATA 18,12,30,45,45,30,18,0

1050 RETURN

Oric-1:n grafiikkaohjelmoinnin esimerkki BASIC-listauksena. Tätä ja muita tähän juttuun liittämiäni ohjelmia voi itse kokeilla helpoimmin sopivalla PC:llä tai Macillä toimivalla Oric-1-emulaattorilla, esimerkiksi Oricutronilla. Emulaattori on ohjelma, joka jäljittelee uskollisesti alkuperäisen tietokoneen, sen keskusyksikön, muistin, oheispiirien ja jopa massamuistien toimintaa.

Tänään tuo ohjelma näyttää hieman vaikealukuiselta verrattuna moderneihin ohjelmointikieliin, joita sittemmin olen tottunut käyttämään. Mutta jos Oric-1:n BASIC-komennot ovat tuttuja, ohjelman rakennetta on helpohko seurata. Siihen aikaan kotimikrojen BASIC-tulkit toimivat siten että ohjelmiin kirjoitettiin rivinumerot, jotka järjestivät annettavat käskyt peräkkäin oikeaan järjestykseen. Kryptisin osa kyseistä ohjelmaa lienevät monilla riveillä näkyvät POKE-komennot, jotka joko laittoivat näkyvään näyttömuistiin tietyn kirjaimen tai värikoodin tai määrittivät yhden merkin ulkoasun lukemalla DATA-ohjelmarivillä määritellyt arvot ja laittamalla ne kyseisen merkin muodon määrittelemälle muistialueelle.

FOR-komennolla alkavat rivit luovat ohjelmasilmukan suorittaen ohjelman FOR- ja NEXT-käskyjen väliin jäävät rivit toistuvasti tietyn määrän kertoja. Tässä ohjelmassa sisempi silmukka toistuvasti kirjoittaa itse määritellyt merkit näyttömuistialueen ensimmäiseltä riviltä viimeiselle, mutta ennen seuraavalle riville siirtymistä merkit myös pyyhitään pois näytöltä laittamalla samoihin muistipaikkoihin saman tien tyhjän merkin koodi, 32.

Ohjelman ajaminen näyttää tältä:

DROPPING ALIENS, Oric-1, BASIC, 1983

Näin yksinkertainen ohjelma, vain 28 riviä, ja se jo näytti ajettuna kuin pieneltä videopeliltä, jossa muukalaiset laskeutuivat hyökkäämään pelaajaa kohti, ääniefekteineen kaikkineen!

Näin ainakin sen ajan videopelejä pelanneen nuoren silmissä -- nykyisten pelien grafiikka on toki sekä tekniikaltaan että taiteelliselta tasoltaan huomattavasti monimutkaisempaa ja vivahteikkaampaa. Yhtä kaikki, ohjelman animaatio, yksinkertaiset pikselimuodot sekä äänet toivat selvästi mieleen Space Invaders- ja vastaavien avaruushyökkääjäpelien hahmot ja liikkeet.

Animaatiosta interaktioon

Jatkoin Oric-1:n ominaisuuksien, grafiikka- ja äänikäskyjen, muistipaikkojen ja niiden sisällön sekä BASIC-ohjelmarakenteiden opiskelua. Seuraava tärkeä askel oli oppia lukemaan koneen näppäimien painalluksia (ne luettiin tavuina tietyistä muistipaikoista) ja lisätä ohjelmaan jokin liikkuva hahmo, jota voisi ohjailla näppäimillä. Pienten harjoitteluohjelmien tekeminen ja muuntelu osoittautui hämmästyttävän tehokkaaksi tavaksi oppia ja syventää ohjelmointitaitoja Oric-1:llä. Innokkaiden yritysten ja erehdysten jälkeen sain aikaan ensimmäisen oman peliohjelmani, jonka nimesin SPACEBATTLEksi.

SPACEBATTLE, Oric-1, BASIC, 1983

SPACEBATTLEsta tuli toisaalta alkeellinen (vain yksi vihollinen kerrallaan laskeutui kohti pelaajaa), toisaalta yllättävän pitkälle viety. Mikään ei ollut niin riemukasta kuin seurata isoveljieni pelaavan SPACEBATTLEa ja nähdä heidän hämmästyksensä, kun alas laskeutuva muukalainen ensimmäisen kerran väisti pelaajan ammuksen ja alkoi sen jälkeen lähestyä pelaajan alusta selvänä aikomuksenaan tuhota se kamikaze-tyyliin!

SPACEBATTLEa tehdessä olin oppinut ensimmäistä kertaa monia pelien suunnittelussa hyväksi olevia asioita, kuten pelaajan toimien ennakoinnin ja alkeellisen 'tekoälyn' ohjelmoinnin nostamaan pelin haastavuutta. Opin myös, että BASIC-ohjelmoinnin yksi suurimmista haasteista oli saada ohjelma toimimaan mahdollisimman nopeasti ja sujuvasti.

BASIC toimi siten, että ohjelmaa suoritettiin jokainen ohjelmarivi ja jokainen komento yksi kerrallaan tulkiten ja muuntaen BASIC-ohjelman käskyt lennossa koneen ROM-muistiin tallennettujen, prosessorin ymmärtämien ns. konekielikäskyjen sarjoiksi. Ohjelmaa voi verrata ihmiseen, joka yrittää saada tulkkia käyttäen täysin toista kieltä puhuvan ihmisen tekemään jonkin asian tietyssä järjestyksessä puhumalla omaa kieltään. Välissä oleva tulkki kääntää ohjeet lennossa vieraalle kielelle.

BASIC-tulkki toimi samalla tavalla, ja pystyi tulkitsemaan kirjoittamaani ohjelmaa ohjelmarivi ja -käsky kerrallaan prosessorin ymmärtämään muotoon. Itse ohjelma joutui odottamaan sillä aikaa kun prosessori suoritti tulkatun ohjelman edellisen osan, ennen jatkamista ja seuraavan osan tulkitsemista. Lisäksi BASIC-tulkki itsekin oli konekielinen ohjelma, jota prosessori suoritti, eli prosessori siis suoritti ensin tulkkiohjelmaa, sitten suoritti tulkkiohjelman tuottaman konekieliohjelman, sitten jatkoi tulkkiohjelmaa ja niin edelleen. Ei ihme että BASICilla suoritettu ohjelma toimi melko hitaasti.

Tein SPACEBATTLEn yksinkertaisella idealla toisenkin pelin, jossa pyrin optimoimaan peliä ja tekemään siitä nopeatempoisemman. Käänsin pelin asetelmaa 90 astetta, tein vihollisalukset useamman merkin kokoisiksi ja otin mukaan kaksi eri tyyppistä vihollista. Pelin nimeksi tuli koomiselta kalskahtava Galactian Attackers, ja siitä tuli hieman SPACEBATTLEa vauhdikkaampi:

Galactian Attackers, Oric-1, BASIC, 1983

Omia versioita kuuluisista esikuvista

Seuraavat peliohjelmani olivat samojen tekniikoiden soveltamista uudelleen ja uudelleen, ja ohjelmien sujuvuuden parantamista yrityksen ja erehdyksen menetelmällä. Samalla halusin tehdä erilaisia pelejä.

Aluksi otin peli-ideat melko suoraan näkemistäni olemassa olevista peleistä. Tuohon aikaan oli varsin tavallista, että suosituista videopeleistä tehtiin ilman varsinaista alkuperäisen tekijän lupaa omia versioita eri tietokoneille ja pelikoneille. Nimet ja ulkoasut hieman muuttuivat, mutta usein sukulaisuus ja vaikutteiden otto oli ilmeistä. Niinpä minäkin tein omia BASIC-harjoitteluversioita jo olemassa olevista peleistä.

Seuraavassa muutamia.

Tank vs. Ufo, Oric-1, BASIC, 1983

Tank vs. Ufo oli Oric-1:n BASICille käännetty versio pelistä, joka oli alun perin Commodoren VIC-20:lle ohjelmalistauksena jossain lehdessä julkaistu ohjelma. Kyseessä ei siis ollut missään muotoa omaperäinen tuotos.

Apple Man, Oric-1, BASIC, 1983

Apple Man oli oma yritykseni tehdä Pacman-tyyppinen peli. Jaksoin ohjelmoida peliin vain yhden aaveen ja yhden jatkuvasti paikkaa vaihtavan bonus-omenan. Tässä harjoituksessa oli mielenkiintoista miettiä, miten aave liikkuisi ja pyrkisi saamaan pelaajan kiinni.

Digdug, Oric-1, BASIC, 1983

Tämän pelin nimesin ilman virallista lupaa Digdugiksi, vaikka kyseessä ei missään tapauksessa ole virallinen käännös alkuperäisestä Namcon klassikkovideopelistä. Sen sijaan se oli oma yritykseni tehdä toisinto kyseisestä pelistä Oric-1:n grafiikalla. Alkuperäisen pelin tasoa ja sujuvuutta oli mahdotonta saavuttaa BASICilla ohjelmoimalla, joten hylkäsin tämän projektin melko pian. Ohjelmoin kuitenkin mukaan Dig Dugin tutun aseen eli ilmapumpun, jolla pystyi pamauttamaan kaivannossa liikkuvan vihollisen hengiltä kuten alkuperäisessäkin. Pelin päätarkoitus oli harjoitella tekemään entistä suurempia pelihahmoja koostettuna useammasta kuin yhdestä kirjainmerkistä.

Lander, Oric-1, BASIC, 1983

Tässä pelissäni, joka on Lunar Landerin ja Gravitarin kotitekoinen versio, käytin merkkigrafiikkamoodin sijaan Oric-1:n HIRES-näyttömoodia, jossa käytössä olivat yksinkertaiset piirtokäskyt pikseleille, viivoille, ympyröille, täytetyille alueille ja tekstille.

Merkittävää pelissä on BASICilla kirjoitettu fysiikkasimulaatio, jossa on sama peruskaava kuin jo koneen mukana tulleessa tykkipelissä. Olen ohjelmoinut tämän jälkeen useammankin kerran saman tyyppisen yksinkertaistetun simulaation putoavan kappaleen liikeradasta eri peleihin. Nykyään kyseistä simulaatiota ei useinkaan kannata alkaa itse enää kirjoittamaan, vaan tämän ja paljon monimutkaisempia fysiikkamalleja saa peliohjelmiin mukaan valmiina 'fysiikkamoottoreina'. Tuohon aikaan kotimikroihin ei kuitenkaan vielä kovin paljon ollut saatavilla valmiita aliohjelmakirjastoja, etenkään BASICilla toteutettuna. Piti siis tehdä itse.

Invaders, Oric-1, BASIC, 1983

Avaruussotapelin optimointi johti seuraavaksi tähän pieneen Space Invadersin muunnelmaan. Sain suuren määrän vihollismuukalaisia animoitua lähes yhtä aikaa käyttäen merkkijonokäskyjä joilla ruudulle päivitettiin yhtä aikaa kokonainen rivi pelihahmoja.

Aarteen etsintä, Oric-1, BASIC, 1983

Kokeilin myös tekstiseikkailupelin tekemistä. Yksi ostamistani ja paljon pelaamistani peleistä Oric-1:lle oli tekstiseikkailu Zodiac, joka oli tehty Oricille valmistajan oman ohjelmistoyrityksen Tansoftin toimesta. Olin myös pelannut vähän aikaa Zork-nimisiä seikkailupelejä kavereiden tietokoneilla. Kotitietokoneiden grafiikka- ja ääniominaisuudet olivat aika karuja, joten hyvin kirjoitettu ja sopivan vaikeita loogisia ajattelupähkinöitä sisältävä tekstiseikkailu tarjosi verrattain hyvää peliviihdettä ja oli kotitietokoneiden alkuaikoina kohtalaisen suosittu genre.

Tekstiseikkailupeliohjelman laatiminen oli täysin erilaista kuin grafiikkaohjelmointiin perustuvan toimintapelien tekeminen, ja omasta pelistäni teki jossain määrin erikoisen se, että se oli suomenkielinen. Seikkailupelien suurin ongelma (varsinkin näin yksinkertaisten) oli se, että peli ei ymmärtänyt kovinkaan laajaa sanavarastoa, monimutkaisia lauserakenteita tai kielioppia.

Vaikka Aarteen etsintä-pelissäni ei ollut kovin monta huonetta, siinä joutuu kulkemaan useamman kerran paikasta toiseen eri asioiden keräämiseksi ja käyttämiseksi. Itse asiassa, näin yli kolmenkymmenen vuoden jälkeen, minulla meni pari tuntia ennen kuin sain aarrearkun käsiini. Ja sen jälkeen töppäsin pelissä esiintyvän boa-käärmeen kanssa ja kuolin, minkä jälkeen jouduin taas aloittamaan pelin alusta. Päätin jättää pelin läpipeluun toiseen kertaan.

Tämäntyyppinen puhtaasti tekstillä ja tekstisyötteellä toimiva seikkailupeli on nykyään harvinainen pelilaji. Uusia tekstiseikkailuja ei juuri näe, lukuunottamatta harvalukuisten asian harrastajien tekeleitä, joita silloin tällöin vielä julkaistaan omakustanteina tai vapaasti levitettävinä versioina.

Galactic Guard, Oric-1, BASIC, 1984

Oricille tekemäni Space Invaders-kloonit huipentuivat tähän peliin, jolle annoin mielestäni hienon iskevän nimen ja jonka grafiikka ja eri tasot olivat viimeistellyimpiä tekemistäni avaruushyökkääjäpeleistä.

Tämän pelin tekemisen jälkeen jätinkin avaruusmuukalaisten hyökkäysaaltojen tekemisen useaksi vuodeksi, vasta viitisen vuotta myöhemmin kirjoitin uuden avaruushyökkääjäpelin nimeltä Terminal Strikes Back C-kielellä Teknillisen korkeakoulun ohjelmointikurssin yhtenä harjoitustyönä. Kotitietokoneille tekemieni versioiden muistoksi käytin siinä edelleen yksinkertaista ruudulla liikuteltavaa ASCII-grafiikkaa ja ratkaisut, joilla vihollisarmadaa liikuteltiin ja pelaajaa pommitettiin, olivat hyvin pitkälle samat kuin Oric-1:lle tekemissäni peleissä.

C-koodilla myöhemmin tehty peli oli toki paljon siistimpää ja helpommin luettavampaa ohjelmakoodia kuin ensimmäiset BASIC-ohjelmani.

Vuoden 1984 alussa aloin lähestyä peliohjelmoinneillani ensimmäisen kotitietokoneeni BASICin rajoja. Ohjelmoin kuitenkin Oricillani vielä kaksi pienehköä, mutta kokonaista peliä BASICilla. Toisesta tuli ensimmäinen julkaistu tietokonepelini, ja toisen tein eräänlaisena BASIC-ohjelmointiurani päätöksenä ennen siirtymistäni seuraavaan tietokoneeseeni ja peliohjelmointiin paljon tehokkaammalla ja sopivammalla konekielellä. Näistä lisää blogin tulevissa osissa.

Ohjelmatiedostot

Esitellyt ohjelmat löydät ladattavina tiedostoina Oric-1 TAPs -sivulta.

--


  • Facebook App Icon
  • Twitter App Icon

© 1984-2021 Pasi's Bitstuff / Pasi Hytönen.