ÜÜÜÜÜ ÜÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜ ÜÜÜÜÜÜÜÜÜ Û²±° °Û Û²±° °±²±Û Û±° °±²±° Û Û° °±²±°Û Û²±° °±²Û Û °±²±° °±Û Û±° °±Û Û±° °±²±°Û Û° °±²±° °Û Û °±²±° Û Û±° °±²±Û Û°±²±° °±²Û Û° °±²Û Û±° °±²±° °Û Û° °±²±° °±²Û Û°±²±° °±Û±° °±²±°Û Û±²±° °±²±Û Û °±²±Û Û° °±²±° °±Û Û °±²±° °±²±Û Û±²±° °±²±° °±²±° Û Û±²±° °±²±° Û Û°±²±°Û Û °±²ÛÛ °±²Û Û°±²±°ÛÛ±²±°Û Û²±° °±²±° °±²±° °Û Û²±° °ÛÛ±° °Û Û±²±° Û Û°±²±ÛÛ°±²±Û Û±²±° ÛÛ²±° °ÛÛ±° °±Û±° °±Û±° °±Û Û±° °±ÛÛ° °±Û Û²±° °Û Û°±²±°ÛÛ±²±° Û±²±° °ÛÛ±° °±ÛÛ° °±²Û° °±²Û° °±²Û Û° °±²ÛÛ °±²Û Û±° °±ÛÜÜÜÛ±²±° °±²±° °Û²±° °±²±° °±²ÛÛ °±²±Û °±²±Û °±²±ÛÛ° °±²±° °±²±°Û Û° °±²±° °±²±° °±²±° °±²±° °±²±° °±²±° °±²±°ÛÛ±²±ÛÛ°±²±°ÛÛ °±²±° °±²±° Û Û °±²±° °±²±° °±²±° °±²±° °±²±° °±²±° °±²±° ÛÛ²±°ÛÛ±²±° ÛÛ°±²±° °±²±° °Û Û°±²±° °±²±° °±²ÛÛ °±²±° °±²±°ÛÛ±²±° °±²±° °ÛÛ±° ÛÛ²±° °ÛÛ±²±° °ÛÛ±° °±Û ßßßßßßßßßßßßßßß ßßßßßßßßßßßß ßßßßßßßßßßßß ßßß ßßßßßßßßßßßßß ßßßßß Laaman tie DJGPP-peliohjelmointiin versio 1.30. By Jokke / BAD KARMA Copyright (C) Joonas Pihlajamaa 1997. All rights reserved. LUE TIEDOSTO READJUST.NOW ENNEN KUIN LUET MERKKIŽKŽŽN PIDEMMŽLLE! SE SISŽLTŽŽ TŽRKEŽŽ TIETOA KŽYTT™OIKEUKSISTA, LEVITTŽMISESTŽ JA MUISTA RAJOITUKSISTA. JOS KŽYTŽT MITŽŽN TŽMŽN PAKETIN SISŽLT™Ž HYVŽKSYT SAMALLA EHDOITTA KAIKEN MITŽ READJUST.NOW -TIEDOSTON ALUSSA SANOTAAN! SISŽLLYSLUETTELO: ----------------------------------------------------------------------------- DJGPP - vaikea, suuri, monimutkainen, omituinen, hidas? ----------------------------------------------------------------------------- Grafiikkaa - mit„ se on? ----------------------------------------------------------------------------- Paletti - h”rhel”hameita ja tanssia? ----------------------------------------------------------------------------- Kaksoispuskuri - luonnonoikku, horoskooppi? ----------------------------------------------------------------------------- PCX-kuvien lataus - vain v„h„n oikaisemalla ----------------------------------------------------------------------------- Bitmapit - eikai vain suunnistusta? ----------------------------------------------------------------------------- Animaatiot ----------------------------------------------------------------------------- Pit„„k” spriten t”rm„t„? Ent„ coca-colan? ----------------------------------------------------------------------------- N„pp„imist”n k„sittely - ja nyt meill„ on hauskaa ----------------------------------------------------------------------------- Fixed point matematiikka ----------------------------------------------------------------------------- Lookup-tablet ja muita optimointivinkkej„ ----------------------------------------------------------------------------- V„liaikatulokset ja fontteja ----------------------------------------------------------------------------- Maskatut spritet ----------------------------------------------------------------------------- Hiirulainen, jokan”rtin oma lemmikki ----------------------------------------------------------------------------- Tekstitilan k„sittely suoraan ----------------------------------------------------------------------------- Projektien hallinta - useat tiedostot ----------------------------------------------------------------------------- Useiden tiedostojen projektit - k„„nt„minen ja hallinta ----------------------------------------------------------------------------- Hieman automaatiota - tapaus Rhide ----------------------------------------------------------------------------- Todellista guruutta - salaper„inen make ----------------------------------------------------------------------------- Ammattimaista meininki„ - enginen teko ----------------------------------------------------------------------------- Vauhtia peliin - ulkoisen assyn k„ytt” ----------------------------------------------------------------------------- PIT - aikaa ja purkkaa ----------------------------------------------------------------------------- Miten peli toimii yht„ nopeasti kaikilla koneilla ----------------------------------------------------------------------------- Saatteeksi ----------------------------------------------------------------------------- DJGPP - vaikea, suuri, monimutkainen, omituinen, hidas? ------------------------------------------------------- Tutoriaali sivuaa koko ajan DJ Delorien ilmaista Gnu-k„„nt„j„„ DOS:ille, eli DJGPP:t„, erityisesti sen kakkosversiota. Itse siirryin puolessa v„liss„ t„t„ tutoriaalia 2.0 -versiosta versioon 2.01 ja luulisin, ett„ esimerkit toimivat molemmilla n„ist„ versioista ja luultavasti uudemmillakin. Vanhemmat versiot eiv„t luultavastikaan toimi n„iden l„hdekoodien kanssa. T„m„n mahtavan ilmaisk„„nt„j„n l”yd„t esimerkiksi internetist„ osoitteesta ftp://x2ftp.oulu.fi jostain pub/msdos/programming-hakemiston alihakemistosta. Sen saa my”s MBnetist„, tarvittavat tiedostot ovat alueella PC-Ohjelmointi (area 8), tiedostoja on useita, ja ne l”ytyv„t ko. alueelta l”ytyv„st„ MBNETDJ2.TXT:st„. My”s kaikille Mikrobitin tilaajille tullut Huvi & Hy”tyromppu sis„lt„„ t„m„n k„„nt„j„n hakemistossa MIKROBIT\DJGPP201\, tosin sielt„ puuttuu LGP2721B.ZIP (tarvitaan C++ koodin k„„nt„misess„), jonka K„pyaho unohti laittaa mukaan. Halutessasi voit hakea puuttuvan tiedoston MBnetist„. DJGPP:n asennukseen purat vain kaikki tarvitsemasi paketit haluamaasi hakemistoon (esim. D:\OHJELMAT\DJGPP) PKUNZIP:in -d parametrill„. Sen j„lkeen lis„„t polkuun tuon hakemiston alihakemiston BIN (esim. D:\OHJELMAT\DJGPP\BIN), ja viel„ lopuksi teet uuden environment-muuttujan DJGPP, joka osoittaa DJGPP:n juurihakemistossa olevaan DJGPP.ENV -tiedostoon. Eli esim.: SET DJGPP=D:\OHJELMAT\DJGPP\DJGPP.ENV Nyt voit kokeilla toimivuutta tekem„ll„ pienen C-ohjelman (vaikka koe.c) ja kirjoittamalla: GCC koe.c -o koe.exe Lis„„ infoa GCC:n k„„nn”soptioista ja k„„nt„j„st„ saat kirjoittamalla: INFO GCC Suosittelisin ett„ lueskelet DJGPP:n dokumentaatiota ja teet t„ss„ vaiheessa paljon testiohjelmia ja opettelet k„ytt„m„„n info-lukijaa. Hy”dyllinen hankinta on my”s Rhide, joka on IDE DJGPP:lle. Ohjelma l”ytyy MBnetist„ alueelta 8 (ETSI RHIDE) sek„ H&H-Rompulta. Kun tunnet osaavasi k„ytt„„ vaivattomasti k„„nt„j„„ palaa takaisin dokumentin pariin. Jos et viel„ C:t„ osaa, niin hanki jostain, esimerkiksi kirjastosta hyv„ kirja ja opettele sen avulla C-ohjelmointi. En aio alkaa selitt„m„„n kaikkein yksinkertaisimpia asioita esimerkkikoodeissa taikka kommentoimaan liiemm„lti koodia. Grafiikkaa - mit„ se on? ------------------------ No olet siis p„„tt„nyt edet„ seuraavaan aiheeseen, joka n„ytt„isi olevan grafiikan ohjelmointi DJGPP:ll„. Aloittakaamme siis! Tiedoksi nyt etuk„teen, ett„ muistiosoitteet ovat heksoina, vaikkei sit„ ilmoitetakaan. Esimerkkin„ k„yt„n VGA:n perusmoodia, 13h (heksaluku, desimaalina 19), joka on eritt„in helppok„ytt”inen. Kun tarvitset muita moodeja sinulla on varmasti jo tarpeeksi taitoa hankkia itse informaatiota, mutta t„m„n neuvon ihan alusta alkaen. Eli olipa kerran PC, jossa oli 16-bittinen muistiv„yl„, joka salli vain 64 kilon osoittamisen kerralla, sill„ 16-bittisell„ osoitteella voidaan maksimissaan osoittaa 2^16=65536 tavua muistia. PC:n oli suunnitellut Intel, mutta PC:hen oli luvattu yli 64 kilotavua muistia ja 32-bittinen muistiv„yl„ oli niihin aikoihin kovin kallis. Joten joku sai suorastaan neronleimauksen: Jaetaan koko muisti 64 kilon palasiin! En syvenny tekniikkaan sen kummemmin, vaan totean vain, ett„ 8088 prosessoriin perustuvassa PC:ss„ muodostettiin muisti SEGMENTISTŽ ja OFFSETISTA (SEG:OFF, esim B800:0000). Todellinen osoite muistissa saatiin kertomalla SEGMENTTI kuudellatoista ja lis„„m„ll„ siihen OFFSET. (B800:0000 = B800*16+0000 = B8000) Ja kun kummatkin olivat 16-bittisi„ lukuja saatiin n„in 20-bittinen siirrososoite. Ja koska 20 bitill„ voi ilmoittaa t„sm„„lleen kaksi potensiin 20 eri arvoa oli maksimim„„r„ mit„ voidaan osoittaa 1 megatavu. Kymmenen ensimm„ist„ segmentti„ (eli 0000 1000 2000 3000 4000 5000 6000 7000 8000 ja 9000) omistettiin ohjelmille ja nimettiin perusmuistiksi, jota oli siis 10*64=640 kilotavua. Sitten segmentist„ A000 alkoi grafiikkamuisti. No tietokoneet kehittyiv„t ja esiteltiin suojattu tila, eli PROTECTED MODE (PM), joka k„sitteli koko muistia selektoreilla ja offseteilla, jotka olivat entisen 16 bitin sijasta 32-bittisi„ (selektorit ovat kuitenkin yh„ 16-bittisi„). Vanhat segmenttien varastoimiseen tarkoitetut SEGMENTTIREKISTERIT varattiin nyt selektoreille, jotka kertoivat prosessorille, mit„ LOOGISTA muistialuetta k„siteltiin. DJGPP, joka on suojatun tilan k„„nt„j„ esim. antaa ohjelmalle alussa 2 selektoria, toinen osoittaa dataan ja toinen koodiin. T„st„ pidemm„lle en tied„ tarkasti, mutta riitt„„ tiet„„, ett„ selektorin osoittaessa dataan ei offset 1234 todellakaan ole muistissa kohdassa 1234, vaan se on ohjelman oman data-alueen 1234. tavu. Ja mik„ meit„ kiinnostaa, on perusmuistin 11. segmentti, jonka osoite siis oli A000:0000. Siirrososoite on siis A000*16+0000 = A0000. Mutta, kuten muistamme, ei onnistu, ett„ vain tekisimme pointterin, joka osoittaa tuonne osoitteeseen, sill„ ohjelman datahan on aivan toisessa selektorissa kuin perusmuisti. Meid„n t„ytyy ensin l”yt„„ oikea selektori, jonka osoittama looginen muistialue vastaisi PC:n perusmuistia. Ja t„llainen l”ytyykin nimell„ _dos_ds. T„m„n selektorin osoittaman muistialueen 0. tavu on perusmuistin 0. tavu, 1. tavu on perusmuistin 1. tavu ja niin jatkuu edelleen, kunnes tavu numero A0000 on ensimm„inen VGA:n grafiikkamuistin tavu. Nyt meill„ on siis tiedossa segmentin A000, eli VGA-kortin muistialueen siirrososoite, A0000 ja oikea selektori, _dos_ds. Mutta miten laitamme tavun tuonne? Hyv„ kysymys. Se onnistuu v„hint„„n 5:ll„ eri tavalla, mutta perehdymme helpompaan. Kirjaston sys/farptr.h funktioon _farpokeb(selektori, siirrososoite, tavu), jolla p„„semme k„siksi tuonne. Normaalin pointterin tekohan ei onnistu, vaan meill„ pit„„ olla funktio, joka kykenee osoittamaan toisen selektorin alueelle. N„inollen esimerkkiohjelma, joka asettaa VGA-muistin 235. tavun arvoon 100 on t„m„n n„k”inen (PIXEL1.C): #include /* muistathan, _dos_ds on m„„ritelty t„„ll„! */ #include /* t„„lt„ l”ytyy _farpokeb */ void main() { int selektori=_dos_ds, siirros=0xA0000 + 235, arvo=100; _farpokeb( selektori, siirros, arvo ); } Arvaan, ett„ ehk„ menit ja kokeilit tuota ja petyit, kun mit„„n ei tapahtunutkaan. Ei se mit„„n, niin pit„„kin tapahtua, sill„ olimme tekstitilassa. Jotta jotain tapahtuisi meid„n pit„„ olla oikeassa tilassa, joka oli siis 0x13 (heksanumero 13 C:ss„, desimaalimuodossa 19). T„m„n tilan rakenne onkin seuraava mihin perehdymme. Ole huoleti, valitsin t„m„n tilan, sill„ se on KAIKKEIN yksinkertaisin tila PC-yhteensopivalla tietokoneella. Resoluutio on 320 rivi„ vaakatasossa ja 200 pystytasossa. Jokaista pikseli„ merkit„„n yhdell„ tavulla, eli sill„ voi olla 256 erilaista arvoa. N„ytt” alkaa aivan ruudun vasemmasta yl„kulmasta (miksi? sit„ ei kukaan oikein tied„, menee filosofiaksi) ja jatkuu tavu tavulta (pikseli pikselilt„) p„„ttyen lopulta oikeaan alakulmaan. Eli ensimm„iset 320 tavua ovat ensimm„isen rivin kaikki vaakatasossa olevat pikselit, sitten seuraavat 320 ovat toisen rivin pikselit, kunnes lopulta ollaan ruudun alakulmassa. Ja kun muistamme, ett„ ensimm„inen tavu on kohdassa A0000 (heksa siis t„m„kin), eli 0 tavua alusta eteenp„in, niin me voimmekin tehd„ hienon kaavion: Pikselit: Sijainti: .......................... 0...319 1. rivi 320...639 2. rivi ... 63680...63999 200. rivi N„in meill„ onkin hieno kaava, jolla saamme selville pikselin sijainnin: alkio = rivi * 320 + sarake eli: offset = y*320+x Muista, ett„ C:ss„ 1. rivi olisi tietenkin rivi numero 0! Nyt yhdist„mme tietomme: VGA:n muisti sijaitsee selektorissa _dos_ds, alkaen osoitteesta A0000 (heksa, C:ss„ 0xA0000) ja siit„ l„htee 64000 tavua, joka on n„ytt”muisti. Pikselin osoite t„ss„ muistissa voidaan laskea kaavalla y*320+x. Selektorin kanssa voidaan muistia asettaa komennolla _farpokeb(selektori, siirros, arvo). Tarvittava moodi on 0x13 ja siin„ on 256 v„ri„ ja resoluutio 320 x 200. Mutta miten p„„semme sinne? Vastaus on helppo: conio.h:n funktiolla textmode(moodi)! Ja kun viel„ yhdist„mme t„h„n funktion getch(), joka odottaa napinpainallusta (l”ytyy my”skin kirjastosta conio.h), sek„ palaamme lopuksi tekstitilaan (0x3, eli heksa 3, eli desimaali 3) on meill„ jo aika kiva ohjelma kasassa (PIXEL2.C): #include /* _dos_ds ! */ #include /* _farpokeb(selektori, siirros, arvo) */ #include /* textmode(moodi), getch() */ void main() { int selektori=_dos_ds, siirros=0xA0000, y=100, x=160, graffa=0x13, texti=0x3, color=100; textmode(graffa); _farpokeb(selektori, siirros+y*320+x, color); getch(); textmode(texti); } Tietenkin olisi ollut helpompaa sijoittaa arvo suoraan parametrin kohdalle: textmode(0x13); _farpokeb(_dos_ds, 0xA0000+100*320+160, 100); getch(); textmode(0x3); Mutta katsoin aiemman tavan havainnollisemmaksi. Kaiken tekemiseksi oikein helpoksi teemme t„st„ pikselinsytytyksest„ makron #define-komennolla. T„m„ ei hidasta ohjelmaa yht„„n, mutta varmasti selvent„„ koodia. Se m„„rittelee makron putpixel(x, y, c), jonka k„„nt„j„ muuttaa k„„nn”svaiheeksa _farpokeb-funktioksi. x tarkoittaa saraketta v„lilt„ 0-319 ja y rivi„ v„lilt„ 0-199, sek„ c v„ri„ v„lilt„ 0-255. Muista, ett„ vaikka teetkin makron sinun pit„„ silti sis„llytt„„ mukaan kirjastot sys/farptr.h ja go32.h! Sulut makron farpokeb-funktion muuttujien x ja y ymp„rill„ selittyv„t sill„, ett„ koska makro puretaan suoraan kutsukohtaan niin esim. komento: putpixel(50, 40+a, 100) purkautuisi muotoon: _farpokeb( _dos_ds, 0xA0000+40+a*320+50, 100), joka ei tietenk„„n ole haluttu tulos, sill„ 40+a pit„„ k„sitell„ ennen sijoitusta, eli sulut vain ymp„rille! T„ss„ se siis on: #define putpixel(x, y, c) _farpokeb( _dos_ds, 0xA0000+(y)*320+(x), c) Kun haluat k„ytt„„ sit„, niin teet vaikka seuraavanlaisen koodinp„tk„n (PIXEL3.C): #include #include #include /* textmode(moodi) ja getch() l”ytyv„t t„„lt„! */ #define putpixel(x, y, c) _farpokeb( _dos_ds, 0xA0000+y*320+x, c) void main() { textmode(0x13); putpixel(319, 199, 150); getch(); textmode(0x3); } Ohjelma sytytt„„ pikselin aivan ruudun alareunaan. Jos et en„„ muista, miten ohjelma k„„nnettiin DJGPP:ll„, on t„m„n kokeilemiseksi tarvittava komento: "GCC PIXEL3.C -o PIXEL3.EXE" ja sitten kokeilu komennolla "PIXEL3". Painu nyt kokeilemaan ohjelmaa ja muuntelemaan sit„! Laita se tekem„„n ruksi, pystyviiva, vaakaviiva, tai vaikka ympyr„ jos osaat, tai yhdist„ se randomin kanssa ja tee n„yt”ns„„st„j„! Kokeilemalla tulet parhaiten sinuiksi uuden asian kanssa. Ja kun olet valmis, siirrymme seuraavaan aiheeseen, palettiin. Paletti - h”rhel”hameita ja tanssia? ------------------------------------ Kuten edellisess„ luvussa opimme, voi tilassa 13h olla 256 erilaista v„ri„. Teit ehk„ jo ohjelman, joka piirt„„ pikselin jokaisella v„rill„ viivaa ja huomasit, ett„ k„yt”ss„ olevat v„rit ovat huonoja, puuttelisia, kirkkaita, tummia tai muuten vain inhottavia. Mutta ei h„t„„ - niit„ voi muuttaa! Ja vaikka paletissa ei mielest„si olisikaan mit„„n vikaa haluat ehk„ tehd„ sellaisia efektej„ kuten h„ivytys, plasma, "crossfade" (toinen kuva ilmestyy toisen alta pikkuhiljaa)... N„iss„ kaikissa tarvitaan enemm„n tai v„hemm„n itse tehty„ palettia ja siksi meid„n pit„„kin opetella n„m„ asiat ennenkuin menemme pidemm„lle. Kaiken ytimen„ on VGA ja sen paletti, etenkin sen asettaminen, mutta ehk„ my”s sen lukeminen. T„ss„ luvussa teemme funktiot, yhden tai useamman v„rin, asettamiseen ja lukemiseen, sek„ tutustumme paletinpy”ritykseen (palette rotation). Ensin taas v„h„n teoriaa efektien ja paletin takana. Kuten ehk„ tied„tkin, valo voidaan koostaa komponenteista. Tietokoneella jokaisella v„rill„ on yleens„ kolme komponenttia: punainen, vihre„ ja sininen (red, green, blue). T„t„ kutsutaan nimell„ RGB. Itseasiassa jokainen moodin 13h v„ri on vain osoite taulukkoon, jonka jokainen alkio sis„lt„„ v„rin punaisen, virhe„n ja sinisen komponentin m„„r„n, eli vahvuuden. Jos meill„ olisi puhtaan punainen v„ri, sen arvot olisivat seuraavat: r=63, g=0 ja b=0. Sininen taas olisi 0,0 ja 63. Violetti, joka on sinisen ja punaisen yhdistelm„, voisi olla vaikkapa 63,0 ja 63 (eli t„ysi m„„r„ punaista ja sinist„). Jos taas haluaisimme tumman punaisen v„rin, olisivat sen v„riarvot vaikka 30, 0, 0. Koska 30 on v„hemm„n kuin puolet kirkkaan punaisen puna-arvosta, on t„m„ v„ri siis yli puolet tummempi! Helppoa! Ja miksi maksimim„„r„ on vain 63? Siksi, koska VGA:n rekistereiss„ v„rille on varattuna vain 6 tavua, jolla voidaan esitt„„ numerot v„lill„ 0...63. T„m„ joudutaan huomioimaan esim. PCX:n paletin latauksessa, sill„ siin„ v„rit ovat v„lill„ 0...255. T„ss„ joudutaan jakamaan v„riarvot nelj„ll„, jotta saadaan toimiva luku. Eli ymm„rr„mme nyt, ett„ jokaisella v„rill„ on itseasiassa punainen, vihre„ ja sininen komponentti, mutta mit„ siit„? Vastaus on helppo, jos haluamme, voimme muuttaa mit„ tahansa tilan 0x13 (tai miksei muunkin tilan) v„ri„ helpolla joukolla komentoja. Meid„n tarvitsee vain kirjoittaa asetettavan v„rin numero porttiin 3C8h (h lopussa siis tarkoittaa heksalukua, C:ss„ 0x3C8) ja sitten porttiin 3C9 ensin punainen komponentti, sitten vihre„ komponentti ja lopuksi sininen komponentti. T„m„n j„lkeen VGA korottaa v„ri-indeksi„ automaattisesti yhdell„, eli jos ensin sy”t„mme porttiin 3C8h v„rinumeron 5 ja sitten punaisen, virhe„n ja sinisen porttiin 3C9h korottuu VGA:n sis„inen laskuri yhdell„, ja voimme halutessamme tunkea heti seuraavan v„rin RGB arvot porttiin 3C9. Nyt olemme jauhaneet teoriaa tarpeeksi. Menk„„mme pikkuiseen esimerkkiin. Esittelemme tietorakenteen RGB, joka sis„lt„„ v„rin RGB-arvot ja sitten funktion, jolle annetaan parametrin„ osoitin t„llaiseen rakenteeseen ja v„rin numero jolle n„m„ v„riarvot asetetaan. My”hemmin yhdist„mme t„m„n pieneen esimerkkiohjelmaamme, mutta (PALETTE.H): typedef struct { char red; char green; char blue; } RGB; void setcolor(int index, RGB *newdata) { outportb(0x3C8, index); outportb(0x3C9, newdata->red); outportb(0x3C9, newdata->green); outportb(0x3C9, newdata->blue); } Huomiosi ehk„ kiinnittyy viel„ outoon funktioon outportb, jolle annetaan ensimm„isen„ portin numero ja sitten sinne sy”tett„v„ tavu. Funktion k„ytt„miseksi sis„llyt„t mukaan kirjaston dos.h. Ehk„ sinua kiinnostaisi my”s t„m„n k„ytt”? No olkoon, tehk„„mme esimerkkiohjelma kokonaisuudessaan. Kun edellinen pikku koodinp„tk„ on nimell„ PALETTE.H, voimme helposti sis„llytt„„ sen seuraavaan esimerkkiohjelmaamme kuten ihan tavallisen kirjaston. Muista vain, ett„ kirjaston t„ytyy olla samassa hakemistossa ohjelman kanssa, muuten ei esimerkki k„„nny. Eli t„ss„ sitten itse koodiosa, joka tuikkaa keskelle ruutua v„rin 50. Sitten se odottaa napinpainallusta ja muuttaa funktiollamme v„rin punaiseksi. Huomaa, ett„ vain alussa kajotaan n„ytt”muistiin. Toinen kohta hoidetaan v„rinvaihdolla! Eli (PAL1.C): #include #include #include #include #include "palette.h" #define putpixel(x, y, c) _farpokeb(_dos_ds, 0xA0000+y*320+x, c) void main() { RGB newcolor; textmode(0x13); putpixel(160, 100, 50); getch(); newcolor.red=63; newcolor.green=0; newcolor.blue=0; setcolor(50, &newcolor); getch(); textmode(0x3); } Seuraavana huomionkohteenamme onkin sitten v„riarvojen luku, joka on yht„ suoraviivaista kuin edellinenkin. Erotuksena on, ett„ v„riarvo kirjoitetaankin porttiin 3C7h ja portista 3C9h _luetaan_ v„rin arvo. J„lleen tripletin (kolme alkiota, RGB) luvun j„lkeen indeksi kohoaa, joten voisimme lukea seuraavat v„rit. Luku portista tapahtuu funktiolla inportb(portti). Muuta tietoa emme tarvitsekaan. Lis„tk„„mme nyt kirjastoomme (PALETTE.H) kolme uutta funktiota. getcolor(int index, RGB *color) lukee v„rin v„riarvot ja asettaa ne RGB-rakenteeseen . setpal(char *palette) asettaa koko paletin kerralla hyv„ksik„ytt„en automaattista indeksin korotusta (indeksi nollataan aluksi ja sy”tet„„n koko data per„„n, indeksi korottuu jokaisen rgb-arvon j„lkeen). getpal(char *palette) taas lukee vastaavasti koko paletin. Niiden k„yt”st„ sitten esimerkkiohjelmassamme, joka seuraa ajallaan. Eli uutuudet kirjastoon PALETTE.H: void getcolor(int index, RGB *color) { outportb(0x3C7, index); color->red=inportb(0x3C9); color->green=inportb(0x3C9); color->blue=inportb(0x3C9); } void setpal(char *palette) { int c; outportb(0x3C8, 0); for(c=0; c<256*3; c++) outportb(0x3C9, palette[c]); } void getpal(char *palette) { int c; outportb(0x3C7, 0); for(c=0; c<256*3; c++) palette[c]=inportb(0x3C9); } Kuten huomasit, ei viimeisiss„ funktiossa ole lainkaan en„„ RGB-rakennetta. T„m„ siksi, ett„ koko paletti on huomattavasti helpompi k„sitell„ n„in. Jos olet sit„ mielt„, ett„ RGB oli parempi tai haluat muuttaa loputkin pointtereiksi, en sit„ est„. Char-pointteriversiossa on aina kolme tavua per„kk„in ilmoittamassa RGB-tripletti„. Toisen v„rin r alkaa siis 4. tavusta, eli indeksist„ 3. Jos haluat jonkin v„rin r-arvon, niin lasket: "palette[number*3+0]". Vihre„ll„ korotat tuota yhdell„ (number*3+1) ja sinisen kanssa kahdella. Helppoa t„m„kin. Nyt on kaikki t„rkein katettu VGA:n paletista, joten kysytkin ehk„ (aina sin„ sitten olet kysym„ss„ ;) mihin n„it„ nyt sitten voi k„ytt„„. Itseasiassa paletilla on loputtomasti k„ytt”mahdollisuuksia. Ensimm„inen on 256-v„risten kuvien paletin asettaminen, sill„ v„„r„ll„ paletilla kuvat yleens„ n„ytt„v„t enemm„n tai v„hemm„n sotkulta. Toisena on h„ivytysefekti, sek„ feidaus valkoiseen. Palettiliutuksesta k„ytet„„n usein termi„ feidaus, joka tarkoittaa, ett„ palettia liutetaan s„vy s„vylt„ toiseen v„riin, jolloin saadaan vaikka hieno ruudun tummeneminen. Kokeilemmekin sit„ ihan kohta, kunhan selit„n viel„ yhden efektin, palettirotaation. Palettirotaatiossa on paletti, jonka v„riarvoja py”ritet„„n ymp„ri. Eli k„yt„nn”ss„ v„ri, joka ennen oli numerolla 5 onkin rotaation j„lkeen v„rinumerossa 6. T„t„ jatketaan koko ajan, ja v„ri matkaa koko paletin l„vitse, ja kun se on lopussa niin se siirret„„n paletin alkuun. Yleens„ v„ri„ 0 ei kuitenkaan siirret„, sill„ se on taustav„ri ja yleens„ musta. Usein k„ytet„„n my”s palettia, jossa on useampia v„rej„ kuin 256, jolloin erona on vain se, ett„ ainoastaan osa v„reist„ n„kyy ruudulla. "JA MIHIN TŽTŽ", kuulen sinun kysyv„n. Olet kenties n„hnyt plasman, jonka v„rit vaihtuvat koko ajan (kunnon plasmassa on kyll„ lis„ksi mukana muutakin kuin py”riv„ paletti, mutta py”rityksell„ saadaan kummasti lis„eloa muuten liikkuvaan plasmaan). Tai tunnelin, jossa v„rit siirtyv„t kauemmaksi tai l„hemm„ksi. T„llaisia efektej„ voidaan helposti toteuttaa palettirotaatiolla. Ennenkuin ymm„rr„t voit ehk„ tarvita pienen demonstraation. Kohta teemmekin esimerkin, joka piirt„„ vaakatasossa viivoja, jokainen eri v„rill„ alkaen yhdest„ p„„ttyen 255:teen. Sitten teemme hienon liukupaletin ja alamme py”ritt„m„„n sit„. Eli tehk„„mme viel„ funktio (lis„t„„n kirjastoon PALETTE.H): void rotatepal(int startcolor, int endcolor, char *pal) { char r, g, b; int c; r=pal[startcolor*3+0]; /* tallennamme ensimm„iset v„rit ja siirr„mme */ g=pal[startcolor*3+1]; /* ne lopuksi loppuun. T„m„ paletti py”rii siten, */ b=pal[startcolor*3+2]; /* ett„ viimeinen v„ri kulkeutuu kohti alkua */ for(c=startcolor*3; c #include #include #include #include "palette.h" #define putpixel(x, y, c) _farpokeb(_dos_ds, 0xA0000+y*320+x, c) void genpal(char *palette) { char r=0, g=0, b=0; int c, color=0; for(c=0; c<64; c++) { // MUSTA (0,0,0) - PUNAINEN (63,0,0) palette[color++]=r; palette[color++]=g; palette[color++]=b; if(r<63) r++; } for(c=0; c<64; c++) { // PUNAINEN (63,0,0) - VIOLETTI (63,0,63) palette[color++]=r; palette[color++]=g; palette[color++]=b; if(b<63) b++; } for(c=0; c<64; c++) { // VIOLETTI (63,0,63) - VALKOINEN (63,63,63) palette[color++]=r; palette[color++]=g; palette[color++]=b; if(g<63) g++; } for(c=0; c<64; c++) { // VALKOINEN (63, 63, 63) - MUSTA (0,0,0) palette[color++]=r; palette[color++]=g; palette[color++]=b; if(r) r--; if(g) g--; if(b) b--; } } void main() { int x, y; char palette[256*3]; textmode(0x13); genpal(palette); setpal(palette); for(y=0; y<200; y++) for(x=0; x<320; x++) putpixel(x, y, y); while(!kbhit()) { rotatepal(1, 255, palette); waitsync(); /* odotetaan ett„ piirto on valmis ennen uuden paletin asettamista! */ setpal(palette); } getch(); textmode(0x3); } Huomasit varmaan, ett„ ruudun onnettoman geometrian takia kaikki v„rit EIVŽT mahtuneet ruudulle. No niin. Ja mit„s kivaa seuraavaksi? Seuraavaksi tutustumme viimeiseen palettikikkaan, jonka periaatteen olet jo voinut keksi„kin, eli feidauksen. Genpal-funktio olisi voinut k„ytt„„ my”s erillist„ rutiinia jolle annetaan parametreina monenko v„rin matkalla liu'utaan v„rist„ toiseen. Kuitenkin koska tuo oli yksinkertaisemman n„k”inen tein sen tuolla tapaa. Teemme minimaalisia lis„yksi„ PALETTE.H:hon, sek„ pikkuisen esimerkkiohjelman, joka demonstroi efekti„ k„yt„nn”ss„. Ideahan on eritt„in yksinkertainen. Meill„ on paletti, jossa on sekailaisia v„rej„ ja haluamme h„ivytt„„ sen. Miten? No tietenkin muuttamalla ruudun mustaksi. Miten se tapahtuu? Nollaamme jokaisen v„rin, mutta emme kerralla, vaan v„henn„mme joka kierroksella ja asetamme uuden paletin. T„st„ funktiosta voit tehd„ helposti muitakin efektej„, kuten feidauksen valkoiseen (korotetaan jokaista v„ri„ joka kierroksella kunnes ollaan v„riss„ 63) tai vaikka paletista toiseen (jos kohdepaletin vastaava komponentti on suurempi niin korotetaan arvoa, jos pienempi niin v„hennet„„n). Esittelen t„ss„ vain h„ivytyksen, mutta l”yd„t kirjastosta PALETTE.H toteutettuna my”s valkoiseen ja toiseen palettiin feidauksen. Voit my”s itse tehd„ hauskoja efektej„, kuten feidata valkoiseen, tehd„ valkoisen paletin ja feidata sen mustaan. Kokeile! Mutta, t„ss„ rutiinimme: void fadetoblack(char *palette) { char temppal[256*3]; int c, color; memcpy(temppal, palette, 256*3); for(c=0; c<63; c++) { /* tarvitsemme maksimissaan 63 muutosta */ for(color=0; color<256*3; color++) if(temppal[color]) temppal[color]--; waitsync(); setpal(temppal); } } Sitten yhdist„mme efektin lopuksi edelliseen esimerkkiohjelmaamme lis„„m„ll„ sen juuri ennen tekstitilaan vaihtoa: fadetoblack(palette); Kokonaisuudessaan ja toimivana, vanhat osat mukana on esimerkkimme tiedostossa PAL3.C. Siihen on tehty my”s pari muuta muutosta, kuten se, ett„ aluksi paletti feidataan valkoiseen, asetetaan oikeasti val- koiseksi (muuten feidatessa mustaan paletti v„l„ht„„ hetken normaaliv„ri- sen„, t„t„kin SAA kokeilla). No niin. Pahin tiedonn„lk„si lienee t„lt„ er„lt„ tyydytetty! Viihdy esimerkkien parissa ja tee mit„ vain mieleen juolahtaa niill„. Muista, ett„ palettifunktiot toimivat my”s tekstitilassa. T„m„n voit kokeilla vaikka k„ytt„m„ll„ fadetoblack-funktiota. Muista kuitenkin laittaa loppuun textmode(0x3), vaikket moodia olisi vaihtanutkaan, sill„ et v„ltt„m„tt„ pid„ DOS-kehotteestasi jokainen v„ri mustana... Kaksoispuskuri - luonnonoikku, horoskooppi? ------------------------------------------- No niin, olet n„emm„ sulattanut jo kaiken edellisen tiedon. Mainiota! T„n„„n p„„semme (tai miten nyt haluamme asian ilmaista) yhteen peliohjelmoinnin perustempuista, kaksoispuskuriin. Periaate t„m„n takana on aivan naurettavan yksinkertainen, ja itseasiassa min„ opin t„m„n er„„n lehden l„hdekoodia vilkaisemalla (Mikrobitin grafiikkaohjelmointikurssi, numero 11/95). Eli t„h„n asti olemme tunkeneet grafiikkaamme suoraan n„ytt”puskuriin tavu kerrallaan. Valitettavasti t„ss„ on haittoja. Ensimm„isen„ on se, ett„ meill„ on kiire. Nimitt„in k„yt”ss„ on vain lyhyt aika kun n„ytt”„ ei piirret„ monitorille ja jos siin„ ajassa ei ehd„ piirt„„ n„ytt”„ niin n„ytt” alkaa v„lkkym„„n, ilmestyy lumisadetta (varsinkin paletinvaihdon kanssa!) ja muitakin ei-toivottavia ilmi”it„ esiintyy. Lis„ksi on todettava valitettava tosiasia: N„ytt”muisti on HIDASTA. Jos haluamme tehd„ sen kaikkein tehokkaimmin niin kopioimme kaiken tavaran kerralla n„yt”lle. Eli sen sijaan, ett„ l„iskisimme pikseleit„ sinne, toisia t„nne kopioimme tavaran n„yt”lle n„yt”n alusta loppuun nelj„n tavun (kaksoissana) kokoisina palasina. Mutta miten saamme ruudulle pikseleit„ sinne t„nne, kun kaikki pit„isi kopioida kerralla? Vastaus on, ett„ k„yt„mme kaksoispuskuria! Kaksoispuskuri, englanniksi doublebuffer on saman kokoinen kuin n„ytt”muisti, mutta sille on varattu tilaa keskusmuistista, joten se on nopeampaa kuin hidas, kortilla sijaitseva n„ytt”muisti (n„in vain on, uskokaa pois). Sinne pikselinpiirto tapahtuu huomattavasti sutjakammin, ja kaiken lis„ksi meill„ ei ole mit„„n kiirett„. Vaikka piirr„mme uuden pikselin, ei se n„y n„yt”ll„ ennenkuin kaksoispuskuri on kopioitu, eli flipattu n„ytt”muistiin. DJGPP:ll„ n„ytt”muisti varataan vaikka malloc-k„skyll„ ja vapautetaan suorituksen loppuessa free-k„skyll„. Kokoa pit„„ puskurilla olla tilassa 13h 64000 tavua. Eroja oikeaan n„ytt”muistiin kaksoispuskurissa on DJGPP:ll„: - Se on nopeampaa. - Se sijaitsee omassa muistissa, joten se voidaan taulukoida. Ei en„„ putpixel-makroja, vaan dblbuf[y*320+x]=color. - Se voidaan kopioida nopealla _dosmemputl-rutiinilla, joka on viimeiseen saakka optimoitu (hidas se on siltikin, mutta se on n„ytt”kortin ja VGA:n rakenteen vika.) - Se ei n„y ruudulla ennenkuin k„sket„„n. - Se ei vilku. - Se s„ilyy muistissa vaikka k„yt„isiin tekstitilassa. - Paljon muuta kivaa. Muttamutta, tarvitsisimme esimerkin. Mist„ saamme sellaisen? No t„ss„ pieni esimerkki. Mukana on makro flip(char *buffer), joka kopioi 64000 tavua puskuria n„ytt”muistiin DJGPP:n _dosmemputl-komennolla, joka l”ytyy kirjastosta sys/movedata.h ja tarvitsee my”s _dos_ds:„„ ja siten kirjastoa go32.h. Eli t„ss„ t„llaista (BUFFER1.C): #include #include #include #include #include #include #include #define flip(c) _dosmemputl(c, 64000/4, 0xA0000) char *dblbuf; void varaamuisti() { dblbuf=(char *)malloc(64000); if(dblbuf==NULL) { printf("Ei tarpeeksi muistia kaksoispuskurille!\n"); exit(1); } } int main() { int x, y; varaamuisti(); srand(time(NULL)); /* alustetaan satunnaislukugeneraattori */ textmode(0x13); while(!kbhit()) { for(y=0; y<200; y++) for(x=0; x<320; x++) dblbuf[y*320+x]=rand()%256; } getch(); textmode(0x3); return 0; } Kokeile my”s ohjelmaa BUFFER2.C, joka on toteutettu ilman kaksoispuskurointia, jos eroa ei viel„ huomaa, tulee se joka tapauksessa viel„ esiin, ja on muitakin hy”dyllisi„ asioita miss„ kaksoispuskuri, tai kolmoispuskurikin on tarpeen. Mutta, kokeile t„m„n k„ytt”„ ja palaa t„m„n dokumentin pariin VASTA kun osaat t„ydellisesti kaksoispuskurin k„yt”n (oikeammin ymm„rr„t miten se toimii, miten sit„ k„ytet„„n, mihin se perustuu ja miten siihen piirret„„n pisteit„). Sitten sy”ksymmekin uuteen tuntemattomaan. Katsotaan nyt mihin... PCX-kuvien lataus - vain v„h„n oikaisemalla ------------------------------------------- Noniin, kaikki wannabe gamekooderit. Nyt on aika menn„ vaikeimpaan aiheeseemme, johon monen kooderin taidot ovat viimein tyss„nneet ja jota min„k„„n en viel„ t„ysin ymm„rr„, enk„ tied„ osaanko sit„ selitt„„. Se on hyv„uskoisuus, sill„ PCX:n sis„lt„ l”ytyy looginen ja helposti ymm„rrett„v„ rakenne. Ja vaikkei sit„k„„n t„ysin ymm„rr„, voi aina vain k„ytt„„ samaa rutiinia (kuten min„) PCX:n lataamiseen. Esittelenkin t„ss„ kappaleessa lyhyesti t„m„n yhden yleisimmist„ kuvaformaateista olevan tiedostotyypin saloja. 256-v„risen tyypillisen PCX:n rakenne voidaan jakaa karkeasti nelj„„n (4) osaan: - 128 ensimm„ist„ tavua headeria sis„lt„en info kuvasta - kuvadata RLE-pakattuna - salaper„inen tavu 12 - palettidata, viimeiset 768 tavua Ensimm„isen„ ja kaikkein vaikeimpana on headeri, jonka loikimme l„hes kokonaan yli, sill„ tosipelikooderi tiet„„ lataavansa oikeaa PCX-kuvaa, joka on oikeaa formaattia oikeankokoiseen puskuriin ja j„tt„„ selitt„m„tt”m„t kaatumiset muiden harteille! Tai itseasiassa en sit„ selit„ kun en siihen ole perehtynyt syvemmin. Kiinnostuneille PCGPE:ss„ on t„m„kin formaatti selitettyn„ lahjakkaan kryptisesti englannin kamalalla mongerruksella. Kaikki sit„ haluavat hankkivat sitten tiedoston PCGPE10.ZIP, joka sis„lt„„ kaikkea hy”dyllist„ peliohjelmointiasiaa, englanniksi siis. Headerista tahdomme tiet„„ vain sen, ett„ PCX-kuvan koko lasketaan seuraavasti: - Menn„„n offsettiin 8 (fseek(handle, 8, SEEK_SET)). - Luetaan kaksi tavua ja tehd„„n niist„ sana (unsigned short int, katsomme latauskoodia kohta) ja meill„ on koko vaakatasossa. - Luetaan toiset kaksi tavua ja tehd„„n niille samoin kuin edellisille, nyt meill„ on y-koko. Sitten onkin vaikein pala PCX:n rakenteessa. Sit„ kutsutaan nimell„ RLE-koodaus (run length encoding) ja se tarkoittaa sit„, ett„ jos meill„ on per„kk„in 10 pikseli„ v„ri„ 15 emme kirjoitakaan PCX:„„n kymment„ kertaa numeroa 15, vaan kirjoitamme sinne tavun 192+10=202 ja sen per„„n tavun 15. Nyt kun PCX-lukija lukee ensimm„isen tavun se katsoo, ett„ ahaa, nyt tulee toistoa ja toistaa seuraavaa tavua puskuriin tavu-192 kertaa (202-192=10). N„in me teemmekin yksinkertaisen pseudorungon: - Lue tavu1 - Jos tavu1 on suurempi kuin 192 niin lue tavu2 ja toista tavua 2 tavu1-192 kertaa. - Jos tavu1 ei ollut suurempi laita puskuriin tavu1. N„in helppoa, nyt viel„ paletti. Sekin on helppoa, kunhan muistamme kaksi seikkaa: 1) Etsimme paletin tiedoston LOPUSTA p„in (fseek(handle, -768, SEEK_END)) 2) Jaamme v„rikomponentit nelj„ll„, sill„ PCX:ss„ v„riarvot ovat v„lilt„ 0-255, VGA:ssa 0-63 (255/4=63). Nyt yhdist„mme taas kaiken tietomme, ja teemme funktion, joka ottaa argumenttinaan PCX:n nimen ja puskurin jonne se ladataan. Ohjelma EI VARAA MUISTIA puskurille, vaan se pit„„ varata etuk„teen. Voit itse tehd„ muutokset ohjelmaan jos haluat. Yleens„ kuitenkin etuk„teen on tiedossa kuvan koko, kun PCX:i„ k„ytet„„n peleiss„. Kuvankatseluohjelmaa tehdess„ pit„„ kuitenkin koko ottaa selville jo viimeist„„n sen vuoksi, ett„ kuva n„ytet„„n oikein, vaikka puskurissa olisikin tilaa. Eli t„ss„ meill„ on valmiiksi pureskeltu PCX-lataajan runko, teemme sille oikein oman kirjaston PCX.H. Kirjasto tarvitsee stdio.h:n tiedostonk„sittelyfunktioita ja niiden tietorakenteita: void loadpcx(char *filename, char *buffer) { int xsize, ysize, tavu1, tavu2, position=0; FILE *handle=fopen(filename, "rb"); if(handle==NULL) { printf("Virhe PCX-tiedoston avauksessa: Tiedostoa ei l”ydy!\n"); exit(1); } fseek(handle, 8, SEEK_SET); xsize=fgetc(handle)+(fgetc(handle)<<8)+1; ysize=fgetc(handle)+(fgetc(handle)<<8)+1; fseek(handle, 128, SEEK_SET); while(position192) { tavu2=fgetc(handle); for(; tavu1>192; tavu1--) buffer[position++]=tavu2; } else buffer[position++]=tavu1; } fclose(handle); } void loadpal(char *filename, char *palette) { FILE *handle=fopen(filename, "rb"); int c; if(handle==NULL) { printf("Virhe PCX-tiedoston palettia luettaessa:" " Tiedostoa ei l”ydy!\n"); exit(1); } fseek(handle,-768,SEEK_END); for(c=0; c<256*3; c++) paletti[c] =fgetc(handle)/4; fclose(handle); } Kuten jo varmasti huomasit ovat paletin ja PCX:n latausrutiinit erillisin„. T„m„ siksi, ett„ joskus on huomattavasti k„tev„mp„„ ladata vain kuva, jos palettia ei mihink„„n tarvita. Seuraavaksi seuraa kappaleen esimerkkiohjelma, joka k„ytt„„ hyv„kseen tutoriaalin varrella esiteltyj„ rutiineja ja muodostaa pienen esityksen. Ohjelma lataa PCX-kuvan PICTURE.PCX ja paletin siit„. Sitten se l„isk„isee sen ruudulle. Lopuksi kuva himmenee tyhjyyteen ja palataan tekstitilaan. Esimerkki olettaa kuvan olevan kokoa 320x200, 256-v„rinen ja paletin sis„lt„v„ PCX-kuva RLE-pakattuna. Voit korvata kuvan mill„ haluat joko muuttamalla l„hdekoodia tai kopioimalla oman kuvasi PICTURE.PCX:n p„„lle. Huomaa, ett„ ohjelmassa luodaan kaksoispuskuri, johon kuva ladataan. N„ytt”muistin v„nk„„minen parametriksi aiheuttaa 100% varmasti kaatumisen, tai jos jotenkin s„„styt silt„ niin ainakaan mit„„n ei ilmesty n„yt”lle. Mutta asiaan (PCX1.C): #include #include #include #include #include #include "palette.h" #include "pcx.h" #define flip(c) _dosmemputl(c, 64000/4, 0xA0000) void main() { char palette[256*3]; char dblbuf[64000]; textmode(0x13); loadpcx("PICTURE.PCX", dblbuf); loadpal("PICTURE.PCX", palette); setpal(palette); flip(dblbuf); getch(); fadetoblack(palette); textmode(0x3); } Toivottavasti ymm„rsit t„st„ luvusta ainakin k„ytt”periaatteen. Eli loadpcx(nimi, puskuri) lataa kuvan puskuriin ja flip(puskuri) laittaa sen n„yt”lle (jos kuva on kokoa 320x200). Paletti ladataan tarvittaessa funktiolla loadpal(nimi, palettipuskuri) ja asetetaan aktiiviseksi komennolla setpal(palettipuskuri). Huomaa, ett„ esimerkiss„ asetetaan oikea paletti ENNEN kuvan laittamista ruudulle. Huomataksesi miksi vaihda setpal- ja flip-funktioiden paikkaa ja lis„„ v„liin getch(), jotta ehdit kat- sella rauhassa muutosta. T„llaista t„ss„ kappaleessa. Mene nyt kokeilemaan PCX-kuvien latausta. Seuraavassa kappaleessa tutustummekin sitten johonkin peliohjelmoijaa l„hell„ olevaan asiaan... Bitmapit - eikai vain suunnistusta? ----------------------------------- T„n„„n siis teemme pienen bitmap-enginen C:ll„. Itse olen aiemmin tehnyt kaikki sprite- ja bitmap -rutiinini C++:ssalla, mutta t„ll„ kertaa k„yt„mme C:t„, sill„ haluan n„iden esimerkkien toimivan ilman C++:ssakin. Eli mit„ on bitmap? Bitmap, eli bittikartta on m„„r„tyn kokoinen suorakulmion muotoinen esine, jolla on puskuri muistissa sis„lt„en sen v„rit, kuten n„ytt”puskurinkin kanssa on. Hy”dylliseksi bitmapin tekee se, ett„ laitamme siihen pyyhkimis- ja piirtotoiminnot, sek„ liikutustoiminnot, joilla voimme siirrell„ bitmap- piamme ymp„ri ruutua. Lis„ksi teemme siihen v„rin, joka tarkoittaa ettei sit„ kohtaa bitmapista tarvitse kopioida ruudulle. N„in saamme tehty„ bit- mappiimme reiki„, eli teemme sen osittain l„pin„kyv„ksi. Mutta miten t„m„ kaikki sitten tehd„„n? Koko asia on, kuten kaikki asiat ohjelmoinnissa lo- pulta ovat - naurettavan helppo. Eli, menk„„mme takaisin kaksoispuskurin aikoihin. Siin„ meill„ on puskuri, jonka koko on 320x200 pikseli„ ja se kopioidaan kokonaan n„yt”n p„„lle. Bittikartassa on muutama selke„ ero: - Se voi alkaa mist„ tahansa kohdasta ruutua, vaikka koordinaateista 15, 123. - Se voi olla mink„ kokoinen tahansa (yleens„ kuitenkin ruutua pienempi). - Sen peitt„m„ tausta tallennetaan ja palautetaan kun bittikartta pyyhit„„n pois, mik„ mahdollistaa liikuttelemisen. - Siin„ on l„pin„kyv„ v„ri, meill„ 0, jota ei piirret„ ruudulle. Jos siis koko bittikartta olisi v„ri„ 0, emme n„kisi ruudulla mit„„n! Eli itseasiassa bittikartta on pari puskuria, joille on varattu tilaa siten, ett„ jokainen bittikartan v„ri voidaan s„il”„ puskuriin. Puskureita on perusbittikartassa kaksi, eli itse kuvan sis„lt„v„ kartta, joka on j„rjestelty aivan samoin kuin esim. kaksoispuskuri, mutta koko on bittikartan mukainen. Toinen on taustapuskuri, joka on muuten sama, mutta sinne vain s„il”t„„n piirrett„ess„ alle j„„neet pikselit, jotta ne voidaan bittikarttaa ruudulta pyyhkiess„ palauttaa sielt„. Eli t„llainen voisi olla 3x3 kokoinen bittikartta: Bittikartta: Taustapuskuri (mit„ bittikartan alle on piirrett„ess„ j„„nyt): 30 20 19 0 0 0 19 23 42 0 0 0 12 32 43 0 0 0 Kuten huomaatte bittikartta on piirretty mustalle pohjalle, sill„ taustapuskuri eli se mit„ bittikartan alle j„i on t„ynn„ mustaa, eli v„ri„ 0. Bittikartta on kaikkein helpointa m„„ritell„ omaan datarakenteeseensa, joka sis„lt„„ tarvittavat tiedot kartan piirtelyyn ja pyyhkimiseeen, nimet„„n se vaikka structiksi BITMAP. Koordinaattien m„„rittely saavutetaan siten, ett„ meill„ on rakenteessamme X-ja Y-koordinaatit, joista piirto kaksoispuskuriin aloitetaan. Koko taas on helpompi. Jos kaksoispuskurin koko oli 320x200, niin kaava oikean pikselin hakemiseksi oli y*320+x. Jos meill„ on bitmap kokoa ysize * xsize, niin oikea koordinaatti on y*xsize+x. Piirrett„ess„ loopataan X:„„ ja Y:t„ siten, ett„ luemme yksi kerrallaan pikselin bittikartasta, ja jos se on jokin muu kuin v„ri 0 (yleens„ musta, t„m„ oli siis l„pin„kyv„ksi sovittu v„ri), otamme ensin sen alle j„„v„n pikselin talteen taustapuskuriin ja laitamme sitten vasta bittikartan v„rin ruudulle oikeaan kohtaan (bittikartan v„rit sis„lt„v„st„ puskurista). Eli tarvittavat tiedot bittikarttarakenteeseen ovat: - bittikartan v„rit (char * -pointteri) - taustan v„rit (char * -pointteri) - x-sijainti ruudulla (int) - y-sijainti ruudulla (int) - koko x-suunnassa (int) - koko y-suunnassa (int) Lis„ksi meill„ on xspeed ja yspeed, joita k„ytet„„n esimerkeiss„ s„il”m„„n bittikartan liikenopeutta x- ja y-suunnassa. N„ill„ tempuilla meill„ on nyt teoria liikuteltavan bitmapin tekemiseksi. Ensin m„„rittelemme rakenteen, joka sis„lt„„ kaiken tarvittavan tiedon bittikartastamme (BITMAP.H): typedef struct { char *bitmap; char *background; int x; int y; int xsize; int ysize; int xspeed; int yspeed; } BITMAP; Sitten teht„v„n„mme on tehd„ "interface", eli k„ytt”liittym„ bitmap-engineemme. Siihen sis„llyt„mme seuraavat funktiot: - bdraw(BITMAP *b) piirt„„ bittikartan kohtaan BITMAP.x, BITMAP.y - bhide(BITMAP *b) tyhjent„„ edellisell„ piirtokerralla piirretyn bitti- kartan. Huomaa, ett„ JOKAISEN PIIRRON JŽLKEEN ON TULTAVA TYHJENNYS ja ett„ BITTIKARTTAA EI LIIKUTETA SEN OLLESSA RUUDULLA (todellisuudessa tietenkin kaksoispuskurissa, joka kopioidaan ruudulle kun kaikki bitti- kartat ovat n„kyviss„, sanoinhan, ett„ hy”dymme viel„ siit„!) - bmove(BITMAP *b) lis„„ X-koordinaattiin muuttujan BITMAP.xspeed ja Y-koordinaattiin vastaavasti muuttujan BITMAP.yspeed. - bsetlocation(BITMAP *b, int x, int y) asettaa uudet X- ja Y-koordinaatit. - bsetspeed(BITMAP *b, int xspeed, int yspeed) asettaa uudet X- ja Y-nopeudet. Huomaa, ett„ liike yl”s saavutetaan negatiivisella Y-nopeudella ja vastaavasti liike vasemmalle negatiivisell„ X-nopeudella. - bload(BITMAP *b, int x, int y, int xspeed, int yspeed, int xsize, int ysize, char *bitmapbuffer, int bufferx, int buffery, int bufferxs), jossa 8. parametrist„ l„htien kertoo latauspuskurista, jona tulemme k„ytt„m„„n 320x200 kokoista PCX, kuvaa, sis„lt„en kaikki bitmapit mit„ pit„„ ladata. Jos kuvan x-koko ja y-koko, sek„ aloituskoordinaatit kuvassa on ilmoitettu oikein, onnistuu lataus suorakulmion muotoiselta alueelta t„ysin onnistuneesti, eik„ lataus- rutiinin k„ytt” vaadi kovin paljoa miettimist„. Lis„„ k„yt”st„ ajal- laan tulevassa esimerkiss„. No niin. L„htek„„mme tekem„„n kirjastoamme BITMAP.H yksi funktio kerrallaan. Rakenne BITMAP on jo esitelty, joten alkakaamme ker„„m„„n sen per„„n k„sittelyfunktioita. Ensimm„isen„h„n oli vuorossa bdraw(), joka onkin helpoimpia ja t„rkeimpi„ funktioita. Katsellaanpas esimerkkikoodia: void bdraw(BITMAP *b) { int y=b->y, x=b->x, yy, xx; /* Eli loopataan koko suorakulman kokoinen alue. bitmap- ja ja background -puskureissahan lasketaan sijainti seuraavasti: y * b->xsize + x. */ for(yy=0; yyysize; yy++) { for(xx=0; xxxsize; xx++) { /* eli v„rill„ 0 t„m„ vertailu alla ei ole tosi, joten v„rill„ 0 merkittyj„ kohtia EI piirret„! */ if(b->bitmap[yy*b->xsize+xx]) { /* doublebuffer muuttuja osoittaa kaksoispuskuriin. Huomaa, ett„ yl„kulma on y*320+x, mutta koska haluamme viel„ piirt„„ useita rivej„, lis„„mme yy-looppimme y-arvoon, kutenn my”s xx-looppi x-arvoon. Jos et ymm„rt„nyt niin poista v„liaikaisesti kohdat ja n„et mit„ tapahtuu */ b->background[yy*b->xsize+xx]= doublebuffer[ (y+yy) * 320 + (x+xx) ]; /* sitten vain asetetaan bittikartasta oikea kohta ruudulle, alle peittyv„ osa on jo tallessa puskurin background vastaa- valla kohdalla. */ doublebuffer[ (y+yy) * 320 + (x+xx) ]= b->bitmap[yy*b->xsize+xx]; } } } } Koska joiltakin on esiintynyt valituksia siit„, ett„ koodi j„„ h„m„r„n peittoon, niin esittelen t„ss„ saman pseudona, jos se olisi hieman selvemp„„: funktio bdraw kokonaisluvun kokoiset kierroslaskurit a ja b looppaa a v„lill„ 0 - looppaa b v„lill„ 0 - bittikarttasijainti = a * + b ruutusijainti = ( + a ) * 320 + b + jos bittikartta(bittikarttasijainti) ei ole 0 niin tausta(bittikarttasijainti) = kaksois(ruutusijainti) kaksois(ruutusijainti) = bittikartta(bittikarttasijainti) end jos end looppi b end looppi a end funktio Kun l„hdet korvaamaan a:n muuttujalla yy ja b:n muuttujalla xx ja korvaat bittikartan sis„iset muuttujat , , ja BITMAP-rakenteen muuttujilla b->ysize, b->xsize, b->y ja b->x sek„ tausta:n ja bittikartan:n b->background:illa ja b->bitmap:illa, kaksois-muuttujan kaksoispuskurisi nimell„ niin olet aikalailla ensimm„isess„, alkuper„isess„ sorsassa. Jos yht„„n selvent„„ niin voit poistaa kommentit alkuper„isest„ sorsasta kokonaan ja siirt„„ sijainnin laskut sielt„ []-sulkeiden sis„st„ juuri tuollaisiin bittikarttasijainti-tyylisiin apumuuttujiin, jolloin koodi selvenee hieman. Olkoot, t„ss„ se on: void bdraw(BITMAP *b) { int a, b, bitmapsijainti, ruutusijainti; for(a=0; a < b->ysize; a++) { for(b=0; b < b->xsize; b++) { bitmapsijainti=a * b->xsize + b; ruutusijainti = ( b->y + a ) * 320 + b + b->x; if(b->bitmap[bitmapsijainti] != 0) { b->background[bitmapsijainti] = doublebuffer[ruutusijainti]; doublebuffer[ruutusijainti] = b->bitmap[bitmapsijainti]; } } } } Varaa aikaa edellisten tutkimiseen, sill„ on t„rke„„, ett„ ymm„rr„t periaat- teen. Tietenkin saat lis„selvyytt„ kokeilemalla muuttaa noita kohtia, jol- loin n„et muutoksen k„„nt„m„ll„ uudelleen esimerkkiohjelman, jonka my”hemmin esittelemme ja ajamalla muunnellun version. Seuraavana onkin huomattavasti nopeammin tehty pyyhint„funktio, joka eroaa vain siten, ett„ sen sijaan, ett„ s„il”isimme taustan ja korvaisimme ruudun pikselin bitmap-puskurin arvolla laitammekin background-puskuriin tallennetun pikse- lin takaisin kaksoispuskuriin, joka on piilotusfunktion j„lkeen samassa kunnossa kuin ennen piirtoakin! void bhide(BITMAP *b) { int y=b->y, x=b->x, yy, xx; /* Eli loopataan koko suorakulman kokoinen alue. bitmap- ja ja background -puskureissahan lasketaan sijainti seuraavasti: y * b->xsize + x. */ for(yy=0; yyysize; yy++) { for(xx=0; xxxsize; xx++) { /* eli v„rill„ 0 t„m„ vertailu alla ei ole tosi, joten v„rill„ 0 merkittyj„ kohtia EI piirret„! */ if(b->bitmap[yy*b->xsize+xx]) { doublebuffer[ (y+yy) * 320 + (x+xx) ]= b->background[yy*b->xsize+xx]; } } } } Tuohon ette varmaan en„„ pseudoja tarvitse, koska seh„n eroaa edellisest„ vain tuon sijoituksen osalta, eli ensimm„inen sijoitus draw-funktiosta k„„nnet„„n vain toisinp„in, niin alkup. tausta palautuu. Seuraavaksi kolme helponta funktiota heti riviss„, sill„ niiden toteuttami- nen on helppoa ja ymm„rt„minen viel„ helpompaa, muista, ett„ X-ja Y-koor- dinaatteja v„hennet„„n negatiivisill nopeuksilla, sill„ X+(-1)=X-1: void bmove(BITMAP *b) { b->x+=b->xspeed; b->y+=b->yspeed; } void bsetlocation(BITMAP *b, int x, int y) { b->x=x; b->y=y; } void bsetspeed(BITMAP *b, int xspeed, int yspeed) { b->xspeed=xspeed; b->yspeed=yspeed; } Seuraava onkin vaikea pala, joten lis„„n koodia saadakseni siit„ v„h„n selvemm„ksi. Idea siis on, ett„ otamme pikselin tuplapuskuriin ladatus- ta ja laitamme sen bitmap-puskuriin. Eli oikeastaan k„„nteisesti n„yt- t”funktioon n„hden. Eli katsotaanpas: void bload(BITMAP *b, int x, int y, int xspeed, int yspeed, int xsize, int ysize, char *bitmapbuffer, int bufferx, int buffery, int bufferxs) { int yy, xx; bsetlocation(b, x, y); bsetspeed(b, xspeed, yspeed); b->xsize=xsize; b->ysize=ysize; b->bitmap=(char *)malloc(xsize*ysize); b->background=(char *)malloc(xsize*ysize); if(b->background==NULL || b->background==NULL) { printf("Ei tarpeeksi muistia bitmap-puskureille!\n"); exit(1); } /* Eli loopataan koko suorakulman kokoinen alue. bitmap- puskurissahan lasketaan sijainti seuraavasti: y * b->xsize + x. */ for(yy=0; yybitmap[yy*xsize+xx]= bitmapbuffer[ (buffery+yy) * bufferxs + (bufferx+xx) ]; } } } bload on itseasassa t„ysin sama kuin ensimm„inenkin funktio, mutta alussa meill„ on pari alustusta jotta BITMAP-rakenne saadaan halutuksi (muistinvarausta, sijainnin nollausta, koon alustus...). Vain piirtofunktio on korvattu versiolla, joka ei piirr„ ruudulle, vaan lataa ruudulta (bitmapbuffer t„ss„ tapauksessa, jottei tarvi oikeaa kaksoispuskuria v„ltt„m„tt„ k„ytt„„) pikselit. Ei se loppujenlopuksi ole sen vaikeampi. Nyt kun lis„„mme kaikki yhteen kirjastoomme BITMAP.H ja teemme lopuksi viel„ pienen esimerkkiohjelman, joka liikuttelee palloa ruudulla. Koska kirjastomme ei kykene est„m„„n ruudun yli menemisi„, niin meid„n pit„„ k„„nt„„ liikkuvan pallon suuntaa ennenkuin alareuna osuu ruudun alareunaan ja menee sitten siit„ yli (eli jos bittikartan koko, sijainti ja nopeus yhteenlaskettuna on yli ruudun koon, tai bittikartan sijainti ja nopeus yhteenlaskettuna on pienempi kuin 0). Eli kun jompikumpi edellisist„ ehdoista t„yttyy niin k„„nnet„„n pallon suuntaa ja saadaan pallo "pomppimaan" reunoista. Mutta, olemme taas puhuneet ihan tarpeeksi. Menk„„mme nyt esimerkkiohjel- mamme pariin (BITMAP1.C). Siin„ lataamme bittikartan tiedostosta BITMAP.PCX ja tausta tiedostosta BITBACK.PCX. N„in n„emme l„pin„kyvyyden toiminnassa (muutenhan pallo olisi neli”nmuotoinen). Lis„ksi tietenkin k„yt„mme jo va- kioiksi muuttuneita palettifunktiota ohjelmamme koristukseksi: #include #include #include #include #include #include char *doublebuffer; #include "palette.h" #include "pcx.h" #include "bitmap.h" #define flip(c) _dosmemputl(c, 64000/4, 0xA0000) int main() { char palette[768]; BITMAP bitmap; doublebuffer=(char *)malloc(64000); if(doublebuffer==NULL) { printf("Ei tarpeeksi muistia kaksoipuskurin varaukseen!\n"); return 1; } textmode(0x13); loadpcx("BITMAP.PCX", doublebuffer); loadpal("BITMAP.PCX", palette); setpal(palette); bload(&bitmap, 160, 100, 1, 1, 16, 16, doublebuffer, 1, 1, 320); loadpcx("BITBACK.PCX", doublebuffer); /* Lataus vasta kun bittikartta on otettu edellisest„ tiedostosta. Ei ladata palettia koska se on sama kuin edellisess„ PCX:ss„. */ while(!kbhit()) { bdraw(&bitmap); waitsync(); flip(doublebuffer); bhide(&bitmap); bmove(&bitmap); if((bitmap.x+bitmap.xsize+bitmap.xspeed)>320 || bitmap.x+bitmap.xspeed<0) bitmap.xspeed= -bitmap.xspeed; if((bitmap.y+bitmap.ysize+bitmap.yspeed)>200 || bitmap.y+bitmap.yspeed<0) bitmap.yspeed= -bitmap.yspeed; } getch(); fadetoblack(palette); textmode(0x3); return 0; } Varaa kunnolla aikaa ja tutki l„hdekoodeja, mieti teoriaa ja kokeile kaikkea k„yt„nn”ss„ mit„ mieleen tulee. Kun luulet keksineesi idean niin palaa takaisin dokumentin „„reen, ja siirrymme seuraavaan aiheesemme. Meneh„n siit„! Jos viel„kin tuntui silt„ ettet tajunnut niin ota yhteytt„ ja kysy mik„ j„i mietitytt„m„„n, niin tarkennan sitten viel„ t„t„. Animaatiot ---------- T„m„nkertainen aiheemme on pieni parannus koodiin, joka on paljon n„y- t”ll„ ja jonka j„lkeen on t„m„n tutoriaalin bittikarttarutiinit l„hes k„- sitelty. Tulemme kyll„ hyv„ksik„ytt„m„„n edellisen kappaleen koodia tehdess„mme fonttiengine„, sek„ parantelemme koodia tehdess„mme t”rm„ys- tarkistuksen, mutta itse animointi- ja bittikarttateoria k„sitell„„n kokonaan t„ss„ ja edellisess„ kappaleessa. Eli t„n„„n tutustumme ensimm„isen„ animaatiohin. Mit„ animaatiot sitten ovat? No itseasiasas animaatio on vain sarja kuvia, joita vaihdellaan ja saadaan kuva liikkeest„. Animaatiota voidaan k„ytt„ l„hes kaikkeen peliss„. Sill„ voidaan tehd„ py”riv„ alusanimaatio, jonka jokainen kuva on yksi aluksen suunta. Jokaisella suunnalla voisi olla viel„ oma animaationsa, joka saa vaikka rakettimoottorit hehkumaan ja laserit aiheuttamaan v„l„hdyksi„ aluksen pinnassa. Pienell„ mielikuvituksella ja taitavalla graafikolla p„„st„„n ihmeisiin. T„ss„ kappaleessa esi- telty kirjasto ei varmaankaan k„y suoraan moneen tarkoitukseen tai ole tarpeeksi nopea peliin, mutta enginen onkin vain tarkoitus n„ytt„„ p„„periaatteita animoinnin ja muiden olennaisien asioiden takana. Eli animaatio on kuvasarja, jotka n„ytet„„n tietyss„ j„rjestyksess„. Miten sitten toteutamme t„m„n. T„ss„ on tapa jolla min„ olen sen tehnyt. Meill„h„n on t„ysin toimivat rutiinit yhden kuvan n„ytt„miseen. Tehk„„mme vain animointikoodi, joka vaihtaa pointterin bitmap osoittamaan seuraavaan kuvaa, eli frameen. T„t„ t„ytyy kutsua silloin kun sprite„, joksi kutsumme animoivaa bittikarttaamme t„st„l„hin ei ole piirretty puskuriin. J„lleen voit kokeilla siirt„„ animointikoodin kutsun kohtaan jossa esine on piir- rettyn„, mutta se ei tule n„ytt„m„„n hyv„lt„ (jos objektin peitt„m„n alueen muoto muuttuu). Eli siis tarvitsemme uuden rakenteen, joka voi s„il”„ useita kuvia, koodin joka vaihtaa bitmap-pointterin osoittamaan seuraavaan kuvaan, laskurin joka kertoo monennessako kuvassa menn„„n ja toisen muuttu- jan joka kertoo montako kuvaa meill„ on animaatiossa, sek„ lopulta uuden latausfunktion, joka osaa ladata useita kuvia k„sitt„v„n animaation. T„h„n kaikkeen voimme kopioida vanhaa koodiamme ja lis„ill„ sinne tar- peellisia osia. Eli teemme nyt uuden rakenteen, jossa voi olla maksimis- saan MAXFRAME m„„r„ frameja, eli kuvia (t„m„ toteutuksen helpottamiseksi): #define MAXFRAME 64 typedef struct { char *frame[MAXFRAME]; int curfrm; int frames; char *bitmap; char *background; int x; int y; int xsize; int ysize; int xspeed; int yspeed; } SPRITE; Se olikin helppoa. N„m„ rutiinit tulevat kirjastoon SPRITE.H, josta l”yd„t my”s joukon vanhoja tuttujamme uudelleennimettyn„ ja v„h„n muunneltuina (sdraw, shide...). Seuraavaksi sitten animointirutiini: void sanimate(SPRITE *s) { s->curfrm++; if(s->curfrm >= s->frames) s->curfrm=0; sebuffer==NULL) { Jos yht„„n selLL) { Jos yht„„n selLL) { Jos yht„„n selLL) { Jos . Esittmt„ rutikpEsits) s->c; inuina (e2) Jaammabuf)mist„uttujmes; 5ivisell„ os . Esittds:„„ Ttten hin ei on! Elskuriin. . Peraj„rjestse, kosgo32) { edossa koon pe loadammaia„m„n krmaank, 1,. Seuraavaksi sitteisimm„nyt): 3pid„ DOiaat(s->MAXFRAMEtt„m„ intjrm; ; 5(0 0 i tee joka )mallteemmeako dit kateed= -bMAXFRAMEt64*b, int xspeed, int yspeed) aset int[MAXFRAMEista kuitenkiurfrmsta kuitenk ints kuva lii) asettaa uudet X- ja Y-nopeudet. Huomaa, ett„ liike yl”s saavutetaan negatiivisella Y-nopeudella ja vastaavasti liike vSPRITElle neer„iskhar *filen Em„ kuvia (t„oppi liv„ri- sonvSPRITE.Hittein normaalen„„ sesiukli frnho„hes kme e...). Se i - kuraavULL ||„ja v„oaa tua, e(syv„k, sme fedosto { char sia. E Se olikikuvia (a v„liaikailla ste(SPRITE * } } bs->iurfrmn v„rist„if(s->iurfrm >=bs-> intsMit„s->iurfrmlisin„. Ts halutukss-> int[s->iurfrm] AnimaatRadtt„ leja->xsize+int xsizCGPE (eli data.h> #incettimT, n ki>xsizeppiimta piir20+x, mutifunmaa t intt me sipelvSPRITE. fli 320); na n ositessaa ladEsittmia EI pian sdlib.t oun, uLL) { s-i nopmpi.n„ onohd Enjoaintisois-muuttujemppal); int v„hennet„hyp„me ja1tuneita „n oing) ja seeP *b, iijai ladEsittationle. N„iselin ny&bitma„m„n k„yttace",a. EK_END)) )+1; uusi=0; yy Jos . Esittationt„m„ a v„liaikai yhteSPRITE * ja n„et mit„ tapahtuu */ b->bitmap[yy*xsize+xx]= bitmapbuffer[ (buffery+yy) * bufferxs + (bufferx+xx) ]; } ,itenk ints} } bload on it,kiurrent kuva liis„ysin sama ksin ensimm„inensin funktis, mutta alussa meill„ os pari alustusta jotts BITMAP-rakenne bs->iurfrmlisin„. Ts h ints= ints kuva liiit„„nurrent ei iurrent< ints iurrentloa ru s-> int[iurrent]alustus...). Vain piirtofunktio onist„if(s-> int[iurrent]a kokeile ki), otamme enkkea k„yt„nn”ss„ mit„ mieleselke„ tapauksessa, jottei0 + b + b->x;arvi oikeaa tyy niin k„„nn„. Ts hata, koon alustus...). Vain piirtofunktio ons halutukss-> int[s->iurfrm] An„rist„if(s->piirr„ ruudulle, vaan lataa ruudulta (bitmapbufferselke„ tapauksessa, jottei tarvi oikeaa kaksoispuskuria v„ltt„m„tt„ k„ytt„„) pikselit. Ei se loppujenlopuksi ole sen vaikeampi. Nyt kun lis„„mme kaikki yhteen kirjastoomme sITMAP.H ja teUloit„ kutosta Bize on kokoin selvutostain sdulta ilett bloax+ bloaxikail bloaxio olisi neli”nmuot bloax+ bloaxi #include #include char *doublebuffer; #include "palLuulkurisi nhpian sdlykudessasitt„v„n YHJENNYran n„man„ ons yht„v„hennn ny&ei„rin, jpy { 70sitell„„afikun getctmapksuavat lise, joka ei podoionsa, ackgnkti ical raceaitten tehykude /*imuistinvi- h„irdekooRITE(P75ip(cnlla if((b ikkiimet„„nnot„. (&bitmaptas #incmita kohturn); tion, jhypp pritmap.k salojaoimme „stata .y tehnyt sinu(palettle n„aatin, ti- sonvSPRtC:ll„. Iaaticmita: dory, xs) { e ot kartaa edellise&bitmauomaa, etseasjoikki la omanme kelayskokaa poismmenvht„„n s=bs- p„„lse&peednnistusts #incmia vanineesi idYran n„nnsadettaent„„ nioi vame eeaa boniihen ole stamme tiot kartauomaa, ett kieuistin /* t liv„ehdessvuu v„ria koko suoationle. N„iselieen viel„ t„tottujat bd vara320+x]m„a on otettu muistround kohdainunaraamuistpaneikki „„n ihmxspeGPP:n _dainakaan mit„ piens ei pi waitsyn. Mutta asiment„ ker"); myiit„,s yhtjpal(chikartt); ,s yht+1; uusi=,avasti no edel tulakaisyldekoliukE *hkoitlle. Hliv„j„t„ sinutnen pase(hanemalloc(64000 saad piens !> #incOiaak” ,s yht+1o edet„? Eimpacoca-colan? #define flip(c) _dosmemputl(cb->bd vaa siit„ kun viho. Mutta,groundh 19 23 bitmapns ei paisryydi luemme main sndle=fotele ti- k sal sni s„il”„ if(s->iurf-itmap-puskur. Nimerkist„torit hoaa va J„lkleen ekurisi nitytnteeen hs„ Psoipuuskuriin tFRAMi 32uLL)ih(); ,s yht+dulle. Huom„hes kme e.ksiza saa t„nnoten amoijaata,? rruksoltaitten„isk bloetaan ne,s yht+1„hdyksi„ bloen l„pinvasien else t„m„n tutoria+yy) *e„„, etthpiansoipuraavaan ename, chhdyksvorkistu„st„lla laddulliksiHuom„hes*buffan); seaisy siihen oln„. */ ion. y) asettaa uudet Xluem b->bAon. y) asuraavaaninu(palettuunnelssa tutuikutnoln„. *sTETAt+1„hdn tauudull Hif(tavudulle. ferx,mskuri (mit„ SEEK_SET); isdlibk„ytth> #in saad t„m„n tutoria+naateistaat: -b->ysizeavudp -loa r- stnoltta oohimme 15, 1aavaan nb->bactaavmrxs) { nltta oohe 15, 1aavaan nb->bactaa noln„.1„hdn tauutta oohe 15, 1aavaan nb->bactaa*sTETAt+ b->bd va if(tavkin on enerOvan sitko n, tai en else t„m„n tutoriakohtia, jon noln„.,oublebuffeETAt+1„hdl xs tauudul? Etsitt„v„n kaikvan sit1); }n tauutta,la ei sit1) */ : an nb->bactaettu nltta rtta: j-------leen ttuper„„n nltta vanTun PCX-la1tuneita s„il”() { ++) { /*ienempis tauudul *sTETAt+1„hden bittikartt noln„.,oh(); teke -ysizeavua p„„sleen voit poiksi mu x, y;inus koodii kokoinu(paleistin10mme ensimm„isfunklukoten usta jot[10]xtmode(vasti y); n„ on l„pinll„. I kme islskuriin. . Pera puskurissa 10kin tileja->(s[c]leburjastoomme sITMAP.H jpuskur10kin>0kin--)size+i(s[c-1]lebuffJ b-„ ymmkoodiclude i ett kinp„toikea00); hinnot #ola yysisyldekot„ jutt„mte,s yhtt b->bitmap esit b- me oiksi me tekem„ jutt„mn #ola yysisyldekoalinlmain„. stin atoitytimoinninmaiikutnlmistammeutt„mte#ola yysisyldeko? E RUUDULL b->ta kostan stmap. ja1tuneita „.h" #iap.yehdess„ blsess„ PCXisfu edel tta on; ,s yht+yy++) { a b „ksik„avua hepahelposti y: sctoimiframjossa vo kojossa vobLE-pakatmoinnissa En 1i kokn edellelty. Tuhtuoipurme reikiatmoinnissa poisninen suoraku if(tav#iap.yu edel tta tulkki hyp„kelman, jott kiemenislsk se nsen. on n„i v„lil==NUctoimifram,s yht[0]xt,s yht[1]))b.h> e_hyp„in_kun_nt ma_paien us(lebuffitmap[yuomatakoodii kuri, tai kol_END)) mme? _dosen n„yttyll„ bittiaaoipufer mu(handlemme „„„ehdesuan an nb-yt knan aMikrobi pegrafbitmVainymm„rr„, enkurseen kooja toiosma, mumaa, e map; tai py { vcnll krx+xndlemoko luutta,ltta sinYS ) ]; y { ,t„). Sityn. Mu-rakenti, t„n lataa in funktsctoimiframjossa vo kojossa vobLE{->piirr„ ruhin ei ons yhtjpal Yit+yy++)oitte stBITM Ensin m„„rittelkoodiam0; yypiirr„ en sx-le=foy-e stBIs on t„m„kin formaat„m„kimistleveIs eiv„tTE. Rake,s yhttn ja uomatkleenpoism#ola yysis moij„„ intjrmf(,unsiance>aosgo32) &&a,unsiance>ITMAP *b) #includentjrmf(yunsiance>aosyo32) &&ayunsiance>ITMyP *b) #includent xspeed, int yspe a>bitmap[bitmapako dit kateed= -bM a 320 + b + b->a iletitm,unsiancetusijainti &&a,tm,unsiance>=0 && X- ja y+yunsiancetusijayo32) &&ayy+yunsiance>=0>a iletaa laitamm ja * a>bitmap { x ] && X- jaja laitamm (yy+yunsiance)e(BITMAP *b) {titm,unsiance) ]movedata piirtofunktio #include "palLisk „ytt[768]alettcx(nimi, pusknimet„+bitmap.b-,s yht+yytikartaaivan samoin n PCX:„„n kta sinne vai.h" I VARivTAt+1„hdes yht+ybatioon an (pimme y-uLL)ih(leveIs e=foy-ll„ piirtokenpoi. Menkyhteaaiheorkeus). Tx13)an:n ihmxLE-pa„). Sityninen smalloc(xsize if(tav+bitm PCX:„„n uomatap„tommkoodii y>xsize=size,teke poikeaa pvitsee flipertoouomatavasti nta aina. Tuhkistuu Enjoaintisois-muui waiimaatiksi muation( ons yhtnistujva on ko ”() { . Mutta,gropelksiirrymns yhtjze*ysizevleenpkk„in 1htaa bimu2; } en kap s(); fitytimoinninrakulm ett„tikartta ioidaan d(&biyt kiijaiP„st„ aajadEsit2 jan viel„ t„tot lesi m„ hisizeanhaa k fyetaa (&b „k ink fyetaa (ortaa ei„nnsaiP„ ipp e.ksizityaion. u edermatap- ntrnteen oikein omtyaionsee 1 wsaa m„„mtyaionsee 2 ujhka bimu2; tekem„ seeh„n tc(handfer mu(han); „v„n aids kuva onnktiohd„nin nollaunappeoadamm + m„„-ineksi. e, "rt””n ( buffi doretb ikki yht „v„)afikolESC ipLE-k osoiiittyskailu alljossa 2.C0; yy Jos . Esittationt„m„ a v„liaikai yhteSPRITE * ja n„et mit„ tapahtuu */ b->bitmap[yy*xsize+xx]= bitmapbuffer[ (buffery+yy) * bufferxs + (bufferx+xx) ]; } ,itenk ints} } bload on it,kiurrent kuva liis„ysin sama ksin ensimm„inensin funktis, mutta alussa meill„ os pari alustusta jopl1,opl2on tiedossquit=0, ikkitime=0TMAP-rakenne bs->iurfrmlisin„. Ts h ints= ints kuva liiit„„nurrent ei iurrent< ints iurrentloa ru s-> int[iurrent]alustus...). Vain piirtofunktio onist„if(s-> int[iurrent]a kokeile ki), otamme enkkea k„yt„nn”ss„ mit„ mieleselke„ tapauksessa, jottei0 + b + b->x;arvi oikeaa tyy npl1,os hata hathathatn alustus...). Vain piirtofunktio ons hal tyy npl2, 22hata hathathatn alustus...). Vain piirtofunktio ons halutukss-> int[s->iurfrm] An„rist„if(s->loppujenlopukquit sen vaikeamppl1in seikeamppl2en kirjastoomme sITMAP.H ja teUloipl1in seteUloipl2osta Bize opl2osta Bize opl1in selvutostaipl1in selvutostaipl2lta ilettpl1.x+pl1.xikailpl1.xio olisi neli”nmuotpl1.x+pl1.xi whiteb->x;arvi oi t kaikkitime=0Taikkitime #include char *doublebuffer; #include "pal ladEsilkutsun koaa tblbufavu2=fgetcittikark rungia J„lkleenians Eni tan aln m„v tityt #includdle=f mu rungi #includi]; TEEinen s telkdimmef((b me sipmme „ m„„.t oun, uris„ksvai int vktiohd„latausfune BITl per„ 15, er) voi„ er) lebuffeea00); iksi mumtyaion,s yhttnein - Selukoteninearme reikinaa uudet X- ja esioize; xxdemonstrja uen toim osou *b) {vastaiemallon pieni ke„, sek„ pakoht suiui sil-engi tblbufpr„isesrunko DOia } VY:t„ sitematmoin ei pikartan:ndulle. Huenepp„sumtyaimbitmap.y„. atikvelLL) {„lle.ngi tbb) {mtytjzeosn sit1eltyohd„ni=) Žl„k„n esitauri tuolla yy++) { x]m„a on otettu ma lis„in ohalsize,tmap.yspvasti yessan kuvluulkurisi ntuuskuri b->isa, joka saai „ pien an„ lle. Hkutenyy) *mitamanmt /on„n oing) jaien toimivaandle)xsi doub ermej„Sen peitt„mv„riahan); c, 64000/4, ekem„tt„moikeavoi en toimi stamit a jrm >=bta,oa„nn, rx+xxka on pass„ alle, taak stule{ bdraw(omsta in kurauk v„ri),oikeeed);amme on pass„ alletsun koaareturnessa on l„p„tmap.ns, 1, 1,; teaisiu(hak„me viel„ piit voi s„iyytikartatitt„v - bult„mt on yksi alon l„p„tmap.ns, 1,sest„ „t); i„nkerna nkivomston pi- jSin k„ vai.hun kohyp„in lo- v„n kaanimaay++) { e=foa siiakohin sam„RUUDULLipust) Ltan datp; tai TMAPtRadttyker")paleen koodia ssine, o*bitma. Pin lasetmap.ns, P.xspeed y+ b->bd„pp„dnnis”n P.xspeed t()) nnjoaintisois h„illTMAP-------------------------------------------------in fJn s asit1ahkert) a uudet Xityt„nne t /*ele hpiansipuraavaapesit. Me }elty kinappiaretyekuvia, koelty kiongselijaiparha joilkun sbultame„pp„ennaisis”n jumiutumln„.,onappitahansaien tej„t eroaa vjenerTatio, jonka.h" rn piKUTETA bloe siirstin /idtan „lk„h„joka Tatio, jonkae„pps handl an!pal("B, joillopultahett„ laitammePieneaan lnappiarpesiaa k„ytua he, ackyskaytyker 9oko suoruvaandaan d(n„pp„dnnis”l„heportmivaa60h (0x60) 1,semsesti ktta ASCII:n kujavudulle. f„pp„dnnis”kuva lii) alle. Huep„suoh„n st„„ sijax]m„a ; exit(1ians handl an); b-siaani sil-eisimmmpksuain simmASCII:n kea00); udulle. f„pp„dnnis” Seluko+yytikartaa oohe konaanEn 1umme anp!= 0)okutsun koaaLLipusPCXisinearn lnappioe siionka j„t maa bittikyskaytyk,t - n„Pieneais„llyelnapokonaan + 128mapsijaintkorv„ ko ehdektio,naantio,128a lin ei pytikartaa oohe ko Selukottninearmi tblbun kappaini C+lukko?"pal nklukoten kap128aalk || ,aletteatausfune BSCAN KOODILLEvun kotbb) {f„pp„drx+xnis” syyt„ a b ik„ytt„m„); ker numeronvSPRopmpi.n„ ,dellaan jdaan }ESC-f„pp„dn koacajott kiemap,ebufferSxESC j ktta naan kap1inen suorae if(ta bilausta,„sois-olESC pesiaa yy-,ta kuitteripp„dnnis”kuva lii)v„lil==Nkey„k, smeSxESC]==1)a v„h„n mSC pesiaa y..). Vairmn v„ristemap,ebufferD_SCAN.Hinearikarttaratio, jonka.h" edellioko suoruvaa st lasportmivaa60h kta sinne vai 15, 128ase udulle. ytikartaa oohe k - Selukot varkk”mta pkta sinne vaiys„ j„kurau„k se formaa128man foize; ytmap[ilty. vu-128a lina vanL xtmap luemme gn, 320)PICa- x(nimi, keaisikaytyksette); valmiskohtiaoum„isen„ at las20h portokmuu20ha bi tblbufoer==NUs handl ato kaKEYBOARDuskuriinrakenkayhandl mutta aluregla yr une gnedussa mat l=inportb(0x60) sebuffer==Nat l<128) key„k, smeat l]=ofunktioelse key„k, smeat l-128]=0TMAP-rakeoumportb(0xnkti0xnk)ude "pal lmsois-muu->xsize; xxnetaan jo e niin oluem b, x==NULLa t kinaa uudet Xisika suunna a T„t„ t)lettuuukum„isfuntio, joaonkae„pp„dnnis”kyskaytyk 1,semoinnissa s - bites*buffan)e„pp„dnnis”, mutifja c #s,> #inanim e=foaonaisise sip; } ettninn nollausatio, jonkakarttaa kokonais- t”ll„ ein - siiauriinralat _doune gnedussa mkey„k, sme128]t { ateistclud_. Es_dpmi_seginfo info, originalVairmney„k, smluksen”)e„pp„dnrttarilmt o{ ateistcPienell„is-olpainihandl a a osoiniaa yy-lebufsn ne, s-i nle piirreaoinppiimtattuin kument„ kernkiurfrmsa funfon)) originals„in ouuukum„iek„ pa flip(ukumjotka (ho s„ig)vkin onek„ pasess„ja Y-kiaatteita iiihen mivaaunfon datarakenians aoinppiimtpa fliorigiehtyan voimksenrakennka myhandl anta kuie voi s„iys iurl+)oitt 20 19."pal ladEsinip(ukumjotkpa fliesittelyhteytt„-ja Y-ko fgetcitti„ on ) ]; erehdysikaviui silipust) Y-nopeunfon en n„tako>, puskurissa 0x80kin ti napot[c]=0Trr„ linffan)ekohta intjrmf(!{ ateistc sen v_. Es_dpmi_get_protected_ar *_i on rupt_vectusk0x0009, &originallta ilnfo.pm_offtet=(une gnedulonguen )kayhandl ta ilnfo.pm_selectus=_my_cs(lebuv_. Es_dpmi_„. Tsat*_iret_wrapper(&lnfolebuv_. Es_dpmi_set_protected_ar *_i on rupt_vectusk0x0009, &lnfolebuv{ ateistc=ofunn piirtofunktio oelse #include "palen sretetkayhandl mutta aluef({ ateistc sen v_. Es_dpmi_set_protected_ar *_i on rupt_vectusk0x0009, &originallta ilnateistc=0funn piirtofunktio oelse #include "palLEi tarpeeksi muuunnel versiollaja glob, 32ze+xx]= en„ aapaukseoer=KEYBOARDus Enjoaintisoisys iurri b->ieITMAP *tikartta koodia me„pp„ennaisis”handl a (tikar*ele ikartan:n „llyt„mme seuraava).PCX", Fixedtuksenn atemtokmkkMAP------------------------b->bAl y * b->kuhiljsa emap.ty„ kurseeit(1); nd k( Iaathin satorva puskuriint xskua?)mapsijaiP.xspeedoopataan it a jrpr„isdYran n„nuunnasskulma-kiasestkij”istujvatpal(pa*b) {aitan:n b->backgikseen v„ristrha j(osa, jitytt„n koonta nartaa e tehnyt st„ „tjo e v„ristrs„st„„s mointlit„ fixed onkn„nuukettookupoko[768];jvatpab-siaaniot kartatukstem nd kfikolis, map.n iaikkauloll„ onaniot karta s-i n+bitmap.de "pn drimbittbb) {essaa ladmme jaNUs fixedtuksen,u(han)ne va? Kuthin sam„n,uC:nuen io bppioonkureissahankuulenlkutstisoe 0)okuetyn btaa da uu, 32ankujn„ lon stamda uu, 32anvuleistiin - Srkin vain ,n jdaan ons yht„v„henniiako sin me sipimi, er) voiten o fot er) lin bitmapaipa.y+biRadttt„tor puskua ttenr l„he sinYhjus onknit„ ahanntynealkuper„i muieeohjelmaspuskuria v„10Pieneaisimell„n formaa ; hip„in l bloarTatio, jonka.h" neksi. oda uu, 32anvuuvun kokoisinymmjotka rive0; } Va1 flipilkupo; 0.1 (tikokoisse uo i kurati y);>xsize o suo10.sitelln(b, l bitturisi nfloa io bppia yy kokonaisjaiP.-ttikartlya v„boniihen ole stamhip„aett„ ([bit jitntium-Yran n„tunp!= 0)oku ize*ysize), esit-muutssemblvitsee eed= -biitntium jaietemtokmkkMpro osoisstmap); (paleepesiole stamj tityt„ ot kartaa). Niinp„CX-la1tuneiisisyi ku y { „ b->ban k„yureissahan ltsee da uu, 32ankujn„ Os-olpaini en toeen osani si? airmn /* Lria v,la ei oordinait a jrŽLKEENua tokumentno„, ea voiankujnuem b->b. ja1tu pien antte); ureissahankujo eje da uu, 32jo efikoly++)olle,ia y. esimeissahankujo see eed= -biilmars„st10^ianku animaa sinc(); fahankujo ten kap3 numeroaoska joiltte)ilmars„sttstiso10^3=1000 vitsa kuvluku any++) { -999aninstosaaarKEENua puole(palettuksi mume reisien eNua tokumenmumaa, ee ja1tuneita „ion. y) ++) { /*. Viltte)ilmars„smmef uu, 32jo see da uu, 32 bload(lette10^:sosaa bimu2„. Asekuril, mumaa, eyy) e sipimi, aintisoisy2-numeronnealef uu, 32jo ,r muutt snief uu, 32a v„1/10^2animaaletteSADASOSAainakaan ksaaio*e„„, ettsferx+} Koen nauden 1234.123 = 1234 + 123/10^3 = 1234 + 123/1000 = 1234.123b->bd va„ asti py monepid sij_SET)Oy) e si,pimi, aintisoie ja lpiens epilkku AINAe, s-i nunktioiteje da uu, 32a b->bavi„iankujn 3arTa tuolla0; }; ytmun luoinnissa ekem„ja t s-i nun fahanku tuhaitmapa (uunnelda uu, 32 umeroaulenlkutsiso10^3=1000)uden 1234123 = 1234123/1000 = 1234.123b->bKuthinhpian sdpilkku eed= -biion. y) a engitmaospa flirkk”mtkkeen vo. prinysbuffele imi, a izehy”{ „ animatottuS izeo joka saa ehy”{ :n edelln kapkin kuluku an0.1 fli5.4 t”ll„ ike yl”s -uhinaej„, lidulliniaa kpanvasi b->by kooseoe:n0.1*1000=100 fli5.4*1000=5400. Hke yl”s -uhinaengij„, li: 100+5400 = 5500. d va„sestikisen„ at tuolluden 5500/1000 = 5.5 = 5.5 (5.4 +n0.1 = 5.5)us koodiiaintisoisyltt„m„llas! Vtkorvy seuraakoodii tmapbrau„, y;inu Viltte)seuisikae da uu, 32ankujnyureissahan ltsee alle. Hsatio, jonka intsMkin kuleuraauleienelt()) jakaa meinap- ankutte);kun sbcmita: 1000-hen ole uspuskur osou tosaavertaitmode(vePienel s-i n+bitte)1000000-hen oleta tuloki„ reisil xe ja1tuneita „ja t„m„llas tuhaitmapalu aluden 5400*100 = 5 in0 => 5 in0/1000 = 540 => 5 /1000 = 0.54 (5.4 *n0.1 = 0.54)buffJ titma!n edellois-muu->xsim„llas. VintsMjakaa mei,tamaanh„a ; ame koodia umerote#olatseenne ten taan iavi„, aintt„lef uu, 32jo ,reli 3pid„ DOkist„t xs Olkm„llas l xtuhaitmapaluTx13)anaa tuloki„ n+bitte)koonleienrof((bitmaa ; itturin tuhaitmapa „hden bittikartt; ame uden (5400*1000) / 100 = 5 in => 5 in/1000 = 54 (5.4 /n0.1 = 54).b->bd va„ ja1tuneita „.hun koay} y„ultahetyuomatakotiinit l„imell) adrl+)oitthmxspetusta,oknnut nbin„„ri t„m„n elmoij„„ Se); erttt„torT„t„ t„ytTexit(1 ntt 32- vieltta ooeissahan las(une gneduen )umme an16 32 t) { bsoisy ntrxspeeef uu, 32jo seeap- bin„„ri t„m„n elmooisy2-kanauudul *mode( tcja1tuneita „ekem„x-sijainb->kuuleuraarpeekrtaitp reissas anilesi m *hka vanal l„„n ja aniln lsee eedonka.h" b->ba„n16- vieltta ooeissahankujo n);amn olennaen as2^16=65536 „hd16- vieltta ef uu, 32jo rei snief uu, 32a v„1/2^16 = 1/65536 = n. 0. in015228us koont)oittleuraarpekoodia ttmapb y;in,b->bitame koodiiln ltPienel s-i nvasi65536:00, 1, uoinni ei pai t s-i n65536:00,. Nt karta „„) paa n„ ein } vieltxsizot on ieni a lsee eedonkas Olkmimell) 65536:00a r==NUrb->xsize vietjze16tikancmitn kta a t„m=NUrb->xsize ize b->tleanal ladEsini seeh„onle. N„iseli blodemonstrja fixedi+1; uusi=0; yy Jos u */ bn rakenis, mutta aluune gneduen i b,m„llasTMAP-rakea=(une gneduen )(5.4 *n65536.nts= intb=(une gneduen )(0.1 *n65536.nts= b.h> llas=a+ v„h„n A+B=%f\n",m„llas/65536.nts= intb.h> llas=a- v„h„n A-B=%f\n",m„llas/65536.nts= intb.h> llas=(a*b)/65536 v„h„n A*B=%f\n",m„llas/65536.nts= intb.h> llas=(a/b)*65536 v„h„n A/B=%f\n",m„llas/65536.nts= } b->b." „m„)smemputttmapben patenineas l c„oppi ltean edesohyp„in muutttt„ ko sin (t„oppi liv„-eisimmn fu ole piirre ktale piirre ktap(c) _dsemopvitsee kuvia (teksii simm„oppi liv„ri- fu ome aen kooja toi dolisess! Fixedel„ omiten kapoispuskuriysize, n nauden 1) Ln ltPoilkun ”() { ys„ jis„llyeloka n vain„t„lla ladduJakaa mei jdaan sl„ osscnllkoituknltPienela a: niinmaa 65536:00asitt„v„nme reikie ja lpku ”()l„ osliv„ymp„rittui nartaa esit e„„,PCXisfeysizelpku ja u() { ymp„ritden 2) K. at vieloperli teeap esit ormaaien toimiva. 32- vielttker") os16.16-fixediimat(ipuskuri) „r16 { bsoooeissah- „hd16 { bsoef uu, 32l„ osjo see)ko>, ta ainu Vilt); (uksi m nvarokkay kioran n„nuuksi okta sinekem„tekl„ ossite iz. Mitti&peeleenstspeed); (ataus v (tikhnyt ).b->b3) S gneduln ltPkoodia tsa n„n ten y320); ndaankat-muuetuudet Xl,. Seueli 16.16-lpku en io bppinsois-muu->xsizei 15.16.b->b4)b, l bsetmap.dpilklasptt ap.xspe asti„ne vietjzeef uu, 3LL) {me mainen onh> tli 32 ankujn„ lxspe asti„ne vietjzeureissahan ltse{me mait„m„kin a 1,seSeuep„0x13)i 32 ankujn„PCX", Lookup-tablet voi sy kioran n„nuuviuiktjz #define flip(c) _dosmemputl(cb->bLookup-tableikartt„ iokupeikarin. Mit„->xsize; xxsiaanipa„). Siessasirvoon,ey+biRa)ollestrs„kaiselekem„rau„,( Iaat kaletgnktyt )nkiurfrmsae*ysizevnaisie„t); imut tuolnninr meikoodiry, xs k( Iaame reikekem„le n„taai ) t„ ahin ei otuloki„tte uk„tia b C+lukkooi ke„, senuen. n„me mailuku blsetaavmrurfrvoon p meikoodiry, map); n monee„yako kuvassa *sTETA -uhinmblbun C+lukkooituS n- bsetspeedle n„ -uhinae=(charn„ DOiaatesit ammaiijainb-ak„mekond, ysp n„tfunmaaradime e o(3.14*2*n„tf/256, 256:enpoi. Menk se nnlei Y-n+rtofu60-n„tfuna aniympyrxsizelpku ie ja u60e=(ch se nni Y-n359LE-pasil xraa kunissa s izesTET. d va-uhinm„ sijauksi mu256 naanab C+lukkooi (fixedel„ om-aa tb„ pakoan teh1.14,d16- viellbuf) gned,b->bitolpku 16384)era puskurissa 256kin tilns hal in_table[c] = (short)( in(3.141592654*2*c/256.0)*16384);b->bd va sin meitte)ko)mist15*sTETA /o kuitme koodii in_table[15],n ) ]k„me(short)( in(3.141592654*2*t15*/256.0)*16384)mme jaNun koaakaotbb) {oran n„nuuviuiktjzuden 1) Suar *)nyt i),oikeaiP.xspeedov„tn„isk tutssemblvitseeinn no„usta,on enl„ ossemblviti ke„,”stspDJGPP: { emutta alusDJTUT2_4.ZIP,b3) Ž{ euhlalude "p } ran n„ma r *)nyt i),logkmkkMrtt„ lendfer mraj„r puskua Mit„hy”{ „.b->b4)bK. atfixedi„nfloa in teke p esit ormaaien toimiva.den 5) ruhintiksi muatrs„katap(nemtblbufauhinntab C+lukkorha .den 6)bK. atDJGPP:n iin p”sv l bs2 t) -O2dle=fojop) -O3 (ti. Pin/* Lr„m„ksti „ osjkk„in 1si lLL)ustataden Ys„ allsijauk nartaa uhrikeaa jraamuisaegrafbitmV v„ristjre ktain i v„riisestjre Yran n„nuunnaja DOiaatmap.drunko selke„n„ C-kan nbitmaytua jre koukkoehtyaa bimu2eiaa jra„le n„ta j kttl} Koill„clude , normaka sejniot karta2uLLehttyker„PCX", VTE.Hitttuloki„ttjnista. ejMAP----------------------------"pal ladEsundh 19sleessat „m„)smempmuation(-poinn frnho„hityt #inclnuunnsess„ja ase(hTnimatlpienta ematmme olsin satole stamntkor text„ letmapopl„ on anim tioss„„ vkin one sipitionle. N„iselin„ lxspeanimatematmmesess„ja i„tt v„baaotbbjtion, 1, kyky„tjo anipov tau {vastai1si on pi- bmove(&bitmaaintisoisylh" hyp„in,u(han)ytua he, p,ebuffersta.it? Idenista piKUin tarketeoten kap#iap.yuokumen); ikrxspeu { bdraw(&in tar. Fta. piin tarketseas#iap.y jdaan okin one s yht„maka sitme kon l„pinp.n ( me . Me tseasbittikin on ta jotta BITMAP-=foj„aa (&n l„pinp.nHkutenss„ja i„ttsisasittnunaDOiaatharn„ . Tuy, map)sitten iap.y ryt ks t„m„n eeen yj„LE-pa; (kaan k„y saaljon n„y-adellaanaadaan a liikkndaan t a-z, A-Z, -9 „hden bitt onan) jaien toimi stamss„ja Y-kiaaeen onle. Y-k reisi.!?,;:'" voi s„iyytikartattuS treikekem„solta. T„ss„ kappale voisi oitellk osoi„->xsinttiengijloetaan ne,„.,oh(); oka osaas - ornissa en Eandaan d leveI„ytth>(plusoh();lla0errt„ miei„joka saa nndaan d(ja . Mutta,+yy++) {e)map.yortaa e.xspeed y+joka saa nndaankih()onndaan d bKt kie0; } „. (ntt t l„huden raken v„h„Stv„hgrfrmlisstv„hg olla maksimisutta aluen se;Es s->puskurissa stvlen(stv„hg)kin tleennimettynletstv„hg[c]>'a' &&astv„hg[c]<'z'lleennimettyn„ jasetitelltstv„hg[c]-'a')Trr„ aleistinitell 0a intjrrrrrrrrrikeafrml(x+c*9 rr„ daan d(leveIs 8n+rtlkuper„ixsizeppin); intjrrrrr oelse letstv„hg[c]>'A' &&astv„hg[c]<'Z'lleennimettyn„ jasetitelltstv„hg[c]-'A' + 'z'-'a'n+rt sitten animointr„ nlkutuom oA-itmapebuffaleistinptt . Mutta,+y itten animointh> ttmapebu joka osa bload('z'-'a'n intjrrrrrrrrrikeafrml(x+c*9 intjrrrrr oelse letstv„hg[c]>'0' &&astv„hg[c]<'9'lleennimettyn„ jasetitelltstv„hg[c]-'0' + 'z'-'a'n+rt + 'Z'-'A' + t sitten animointr„ paini Cass„llyel su jJA istjre ttmapebi, joka osaa intjrrrrrrrrrikeafrml(x+c*9 intjrrrrr oelse letc == '.' serr/a sinc); ertt ksdaankiennimettyn„ jasetitellt'9'-'0' + 1 + 'z'-'a'n+rt + 'Z'-'A' + t sitten animointikeafrml(x+c*9 intjrrrrrointr„ [768]allh" uraavaapnstos„llyeliksi me tttmapenht+1„hitten animointh> numerond, joka osaa intjrrrrr} intjrrrrr...itten animoint bs->iurfrmn reik*ele hpiansips„llormaka tio,nin, jkammoisstuksnekasotkd kohdoymme smapos saipufer muhyp„in lme „„inn nollautt kien. Mit„erttyitka rani si,ttiaatkutsun koaavaan edesomalloc(xsizekoodiidulle. Huomela0; }; yiot karta2uLtet„? Vtikat„tot lookup-tablettmap.yspmuffen sam„nne taavaaC: { ttmapenfoer=ekem„numerony++) { -255. Niinp„C exit(1 Seluko+yh(); fadeaalk | yesn btaa en. noa ruitta ASCII-ttmapebu jtion, umerom„ kuvia (t„oppi liv ytladEsittationle. 1 Seluko+yke„,”stsera ptell = ascii C+lukko['a' sebuAscii C+lukoeaalk | 'a' ( umerona 97)leistin0 rei tion, umero xtuisti n„i poi.appainilpkutuS treikekem„tion, voiso: "setitelltitelln". jat bitmap uomelaikarttara+lukko e si? Tapoohdoym); i„ t”llenfoa tsemVainvain a 1, t”llenfy monettl} in keest„. Aa; nunaa i„sioe stisiu(hurneutt aras. Men toimiia„m„n eistininmaa t (pa+lukko linapa ( bloaisti kyv„. El) „hden bitt inuina aakkoi„tta-z t ttara+lukoa oohe t 'a'-'z'si b-s ani El Es ani(1...26),den bitt inuina 'A'-'Z' t ttaneaalk |oeen a 27...52vjenerM, koodinaroaa vuk nartaa aude , ised= b->bit kuvl nollauansaieonortaa ertt ksdaanit v„henniia vanTSrkin vain Poilkunsetalaaeen ly” Els(32),drin voiso (\n)dle=bulbitto a (\t)vjenerJuvl nollattiaat,nin, jvapaisi ni stisiuis-olsta.ia rttaaien toimivaa voisi ova xs. „mv„rk”tesit aoko luutinista. ejM bloien toimivain. J„l hinnocmit, #Mastttui ,s yhtjre [768]alettcx(nimi, vasti naan aokarin. ss„ja alkupereen oi (miain Poen ollu xx;ea al tblka koko kokoiseed= -bi; (kssemblvitseen a nelj„n at lasta ainaoperoikiaa_END)) tadulle. Huomelaen bittiierr„ ko nen ollu xx;etarktnmkse ttaeksii ta jotta BITMAP linrtta: ta ain? Ideni joillopu vieloperli torerha .den Jtausfune Bes yht+y krmaae B iap.„nte uk„tia bn ki bload( poismtioss„„ mapoilaanaadaaper„ixja 255 ta jotta iaaiheooss„„ . d vas treikekem„ammaiie; ytm ints kuva liadaaper„i -yoogitta AND-operli teluden Mast) voi - FF 00 FF FF>bd„uusien animoint4F 3C 93 5AAP----------------------------"pTllas en animoint4F 00 93 5AAP>bKuthinhpian sk„„njermat ta jotta „t oohe t (FF)jokajetleanS treikekemin sy luemmOR-operli tor Joytidaan k„yes yht+yaaper„itsitt„v„nvePiaalen„„oa tj se f„hinn( poisutu eeamapsijaiyoogiaa vOR aoirtaa j se f->xsitme viituden Sin k„ 00 46 00 00 Masttttu „. ”nt4F 00 93 5AAP----------------------------"pTllas en animoint4F 46 93 5AAP>bL uf)rtoakotiintaa esn, jdekoalHispuskuriaytladEsittcx(nimi, sin meitin sy (pehokkay ki4 at las(dword) operli teeap o lataa ruudistleveIti yelkuri jatoimnttaneljoij„„ Huippupehootaratio, jtutssemblvitasitt„v„nC: { n kapv x==Nap(ntrntl ole k„ytth>is, matu„ston pi- juvia (traa kunssa tssembeen vitselekrsiui silDJGPP:n AT&T systikin ,nsuoxspeedoopoka saaia emutta jauden ASSYT.ZIPmointAssemblviti alarktnmuom . PCGPE10.ZIPmoiPCGPE nohdl (uksiyy koknvl nollautssembly„l„tmap 32 .deDJTUT2_4.ZIP juviaessat Ineed-systikinn ten ktnAT&T-systikinhitten animointh>(movw %eax, %ebxmoinohdl (bittisiaaniPi„nn aluvahitten animointh>ietemap 32aittikartladE-koktu„tmap 32laanaadsiv rtu. ASM91.ZIPmoinTxsizetseas#iap.yIneed-systikinnutssemblvitsee DJGPP:nitten animointh>COFF-(); b) {objektiemutta jatujaivnstoliikknTASM blseten animointh>nssa bitt-kokDJGPP:n objektifo„, eta .den n nollau0; } Vaatau [768l tblaSPRopmpi.n„vSPRopmpi 486- #inclnuuet„hybload(muom nkan nadeaassemblvi- #inclnuuaiP.xspeedov„Ropmpi poiksieisil nollauatau aa tblbu!AP>bL puistel tta„jokairre kia mviuiki Pe Nu„,PC tauttuin ts kuva linleik nartaa ss„ja Y-eITMAPiap.ya,+yyerrt„ leve„mm„n keaimi, sinspiteay&ei„+bitm kita: j se fnelj„n at lastnktiotrin. suos„lly kooja toireunn„ta")ytikarilu allj„aa (a engitmaj.yuokuaaat: nireunorha ittikare 0)a nnleen bittiopi ole „. atleanpari ints kuva liadkoo xtuisti 328x200„PCX", Hiiruloln„.,oh(kan”rokenpm2 atan:nkien.h> #define flip(c) _dosmemputl(cb->bT&bitm, tyt”bi„ll„ojit,ieIu(han)visin 2 t) poiksieisikukkur ole rnni taspoismt„skyt eroaa k /on„ammabze; xxs„„d ”m„a ep„standardin„ Osn oh„uunnari Koanntynta,+yyuen tevanhaa p,ebufkist„„a _hiirikyskaytyk_,iPi„nn aluvtan:n ilmars„ n„ kyskaytyk 33ha bier");yskaytyker ke„, senu+bitmap.smempunrhiir ta tungaa yjasimemppenht+Y-k reisinappitah„ll„ohj ten (ss„ all)i&peeimaanpalsikaLLiiapaipam emuttis„in ohetaaittiaassvuudenvl nollauuittinauritturin T„t„ t; uusiain„Y-k nhaikekem„ssatorx+xnmatavasize*ysize).in fJn s (traa ku sam„Rxnmata;yskayty tul dataraken„llyeltladEstaivnstoliikk )+1; uusipDJGPP: { . Kyskayty ti -aniaa katpalmetri srekla yreikar")ebuferx,itmap.rekla yreikar juviaDJGPPsilkurau„, uolen„ oormaaBorland"pTlrbo-++) {„jinut nuistin /t„v„k /rekla yri axp,ebuffer_AXvjenerMaa, ettsblseiksi mu x, niiyattekaay) ++) {„jl { tte)hi ufv x==N„n ole exit(1p.n standardiNua tokumen. Alhaay) n„ettt„-ja Y-kotutskeleata;yskayty tik„avu osoumimta pktarekla yrisaaveplel tta vanEtionle. 1 sy (rau„,anntyntai, keaisikaytyksename, chtaai taa_END)) ivaaunt86(anim opmpi.n„vSPRtmapbuden 1) Tatio, jturekla yrize+xx]= iirtn nohdl maanstrucuuketunt86:n . Tuy, map)„ osstrucuuemap,ebufrakenREGS j ktta nohdllEsini pab-siaanistrucuul„ onhinittenttelstu b3) Ksua l versiollaunt86(vek„tmaetunpu nrekla yriz,eoumpu nrekla yriz)Es s-unt86(ikyskaytyk,t&rekla yriz,e&rekla yriz );b->b4) Kksveit„esii)akiurfr eeanrekla yri pktateistnnbufer+xx]= ia .den s-uhan=rekla yriz.w.bx; s-T„t„ t=rekla yriz.w.ds; s-Tocmi!=rekla yriz.w.cx;b->bTehdniia vrhiir N„itttuasjkk„in 1ittnunaDOiaatssatystamhiirittioan samoin etmap.y„appitahe.xspeed nvl nollauetaan neourso a at: xt„ levas treik meiin sy ((aclu”eedn„itka „k” ker)eourso aa,oh(); ajse fsen. lyelat: si.EsGrafbitmViiapITMAP moois u(ntt t karllEshiiriai, y ons yhtnistujven o uEletti y) a stanAsti ka jraa„ rc, inttiengijkk„in a r ijnimakan!palekstiemapITMA void, b ladEsnbufeistiin n moosmempui c, 64000 vain-poin„stolkoknvnnisstuta. T„ piKUotinn no„ul”ydtanntt ettaRalph BrowETA i on ruptiimivavSPRtIaathi>ieImapopl„HelpPC:istanRP:n imivaaon MBnet js„p,ebufferINTERxxy.ZIP,DX=y-ioan samoin (0...199)seten animointh>BX=„appitahemap (; n0tikan lnappi,); n1u->xsim„hitten animointh> ; n2ikyskn-pomnttanappi)den F bsetsp4 - Asekark rso anull„ piirtoki sPpalmetri : AX=4, CX=x-ioan samoin ,>DX=y-ioan samoin sPpinnissa: -den F bsetsp5 - Nappitahpesitlsiksei sPpalmetri : AX=5,seten animointh>BX=(hurnnappio(0tikan ,n1u->xsim„hn2ikyskn-pomntt) sPpinnissa: Me reikk rei bsetsp3eest„. All„ piirtokinienelkun sbrso anseten animointh>siapenETA ment„hpesitlsikseapa „hdBXPienell„ti. napokopesitl-seten animointh>siksitahnyt „Mutta asiment„kksua n.den F bsetsp6 - Nappitahvapatelyhti sPpalmetri : AX=6,seten animointh>BX=(hurnnappio(0tikan ,n1u->xsim„hn2ikyskn-pomntt) sPpinnissa: Me reikk rei bsetsp5eest„. Avapatelyhtnt 20 19."palF bsetsp7 - Vani tioonelyhti sPpalmetri : AX=7,seten animointh>CX= snio sespeu X-siapenuuet„ten animointh>DX=h se nno sespeu X-siapenuu sPpinnissa: -den F bsetsp8 - Py { tioonelyhti sPpalmetri : AX=8,seten animointh>CX= snio sespeu Y-siapenuuet„ten animointh>DX=h se nno sespeu Y-siapenuu sPpinnissa: -den F bsetspB - Lii kar„r„ sPpalmetri : AX=B sPpinnissa: CX=vani msi me tar„r„ sn animointh>DX= y { msi me tar„r„ n F bsetspF - Mie. lkuper„i moohe ittePpalmetri : AX=Fseten animointh>CX=vani msi me tar„r„ sn animointh>DX= y { msi me tar„r„ sPpinnissa: -den n nollaukapvaa kuesit-muu bsetspCoko suoaoirtaa ians e.xspeedij„n ten mekouskuriaizelpulkurisi nPi„nn aluRUUDULLmo t) (rm-a kuiea, eydo Y-ko f.xsp piKedij„aize*ele b-sa koodi PM:adEse n poismjenee.)jokt„koaaLLiladEsuen vo. S treikekem„so kar„ bisamme maaiin a r si N„iselin„ Etionle.ej„aize„lly - siial tblka koksntisoieedistatausfun py { vcn adrl+)oreiki„issti najoilleeseen a kyh„an k„ymap.aken„yydsizevlgijkk„in a.in fJn sTocmieei tehny sip;kuvluis ayhteytt„iLiladEson otettlaanaaavmri meep„selvyy tul /oiahan)j„, .y+biRaijauksvedoopl no„usta,on edh 19- Erttyitkiitas t]m„a on otettu teonvnnissmoja toisbultu „m„)sn/* LMB:m„numeroseen e 4/96mme ana ei inmimell) taivnstolm„nrhiiri_END)) iva.den Jniinmason otettlaananyt uuden sbjeeama„. stinolev a r stiemapik m32 t)helposti yne k„ykar .„PCX", T stiemapikP.xspeed ammab k -#define flip(c) _dosmemputl(cb->bT&ai, kn otettltis„llyel„llyt sipyt imn„itka lyhyt. AinEandasize*i„nn aluvahelpt han); r stiloa rnta kuie (emap 3, 80x25eesittisiaaPoilkun koodia)map.ytteitenerO kuie o najoilloa rntseg dti B800htt„ inutarblbufo kuien PCXek„tman liis_ds esn btamn„yttyoa rlaanaaasiaC: { 0xB8000. Rteitenn kapuittinauritturin y tuihen olnailu rona VGA:han)(ks. kn otet "GrafbitmV„„-i(han)ne va?"o sin (tyoa a)2; tekem„cx(nimi, y oalk | ykoo u(ekrtavSPRtIienta (n mivaainma-pomnttaonndaan d ASCIIpktatoblbun daan d rtta) „hdat: nileveIs onn80ndaankir juviaei ”()nprip„ mone muutt telstua intsMkerrt„ VGA:taiP.xspeedov„„a on otetttkpa flitut tue Beka saaiaamn or jauden t,kiurreputfrml(x, y, va lfarpokeb(liis_ds, 0xB8000+(y*80+x)*2, va;n t,kiurreputfolol(x, y, va lfarpokeb(liis_ds, 0xB8000+(y*80+x)*2+1, va;n VintsMjsinY32ze*i„nn aluoipmhiiritti rso anuso kalttker r stiemapala0; }helposti yu bsetspoy) a e omime uden rakenin inu addfolol(lla maksimis,ussa mcutta aluen soriginalc=lfarpeekb(liis_ds, 0xB8000+(y*80+x)*2+1 intjrputfolol(x, y, originalc+c)ude "palS treikekem„">xsizet"ti rso anul no„arllEsrttanaanEn -ostantkuri bt 17map.y&n litti rso anul no„arllEsltahetyaoko Enyytikaan las(-17)tt„ ink sinstanjaintkorv„pufer mu17uden t,kiurreCShow(x, y, va addfolol(x, y, van t,kiurreCHeUlox, y, va addfolol(x, y, -c)den Maor j)+1; uusipen bittio”()nEs ani"CShow(17)" voi"CHeUlo17)" .„PCX"L xraa ku } anenndaan d rtta: muodottninSe); XYYYZZZZ,kurumnttan or on yksi alesn btautu ehy”dy vaieksiuden t,kiurreBuildC(blink,>puse, back) ( (blink<<7) + (back<<4) + (puse) )"palS treikekem„ntt ti do "putfolol(x, y, BuildC(0,15,1))"oko suoae, chta }hev„lkky(xsi”m„a valtaan nmk stid sTETv„ri),u 1ap (31)mme jaekotbbkartl n„Pieneai. d vapesi uf)uihkoknvflipertot sipX-Fi sidduJatin ei enssas„ntt huom nn !> # Pr j)ktmme m32 t) -oeltat emutta t #define flip(c) _dosmempub->bd valpostikiai.hun koh intiankujn ( Iaayn kuluku,la ei he, p,yt),mapoilaani wailr„ bisamxsim„tion,„rnho„hitytjzeo #incldens epitorx+jo anipme rdwarta tuntemlyhtntl nollaluTx13onelyht]alettk„yd„ ta j }eltyti nc-emutta j)+1; uusi, headyrisaateko, Rhsti nar j)ktmt,amn oefileeamaultaan nmassynvfliassynvys„ allsijau uusi, v„hennsti yteko, v„ristjre luistittuisi musu„, lkartta kevyt y=bsmaarn lner=ekem„kerrt„ ipLElettemapsijaialkuitme b->b lJ„l m) ole„ ipLElaoipmtLL) {mhuisoktatepoll„ onanimap.llcnllo inkapyne ; (uaa kubuolistrs„styuen te.hun ko(j. ytikaiment„katt knlsetai na sii va-op s stamRa)oi, eroon)a b ik„Radttt„torudullenutr=maka senorha .h-emuttiistrha j; ehliv„ri-ai, k v„ristja on ieniesrumutifja vai.hun koT„t„ te*ysize). Lis„kmpitahpr j)ktmme voi uperi it a jrsupell„n hnyt a ainaalkaa e tehnyt yy++b-ak„„„esii)ty Asmmabze; xx„rssizevlgile n„ta ++) {„nnistanAitttee Beka saaa2uLtapat„tauden P„ pr j)ktmlaanaadin iv„henn sound.h (y tuihen olnaielekem„. J„l eist 3000ieImamka vanI768]alett„ laitammeblbufaoogiaa vureissahut„tot ; ittu ombitma.c-emutta ono eje .h-emutta ono a bi tbin Poiltiin o take„pps handl a, timerhandl a, es yht„thdess„n,u(odibufaukat„, in iv„henngi #inclntirajapok, Y-sb-jo e aka tio, gus-jo e aka tio jeneerJtausfune Bemutta oaasia.hun kopm2 .h-emutta nsa, Jo takh-emutta uum rungij ++) {„jlntl uiktri, uolehtasia.hisasi laiinymm„rr ytua ha„ as „t b-ss /o kuia isii)sa.den K ei he, ettapi tationle. 1h-emutta eje c-emutta alu e v„ier")pam„a olev a esioiu->xsim„apddle mooislekem„rllau„apd honanasTocmiuden ESIM.H0; yy Jos u */ bn t,kiurreESIMTEKSTI "Mot , ole„ ationle. !"den rakenEtiok sti(a;n exterA i o Ksua ienelja;b->b#endif> # ESIM.C0; yy Jos"atio.h""palen sKsua ienelja=0TMAP-en sOma=666;den rakenEtiok sti(atta alupsua(ESIMTEKSTI intjrKsua ienelja++ude "pal Lertarakep„sutskelppin); ESIM.H-emutta atte)s„vdekoalEnma-pomtta„ rin xsizei nyt iwaity kaanimaa xxumenmupsitei ++) {„jllekrattyoa r n„L) {mammePH-emutta jalen> Joissmojannunktioitoko kokoisl uia . Meoelty MeoC„emutta mlaanaa ntrxspeeyoa r aoko npinp.) {mglob, 32) {m xx]= ) {m->iongselijan F bsets de tk„ykar exterA n. Mit„pakaa32 ta j ktta vo -kokj„aa (& mlmap.ym >=br exterA-nyt e.nHkut„ti. bsetspeedultaan laa assemblvi-emutta asa.den F bsetskatpalmetriik„Radet tsen me . Mekj„aa (nyt iweed -ai, & ml,amnt„. AriaizeMit„suoxspelkuriadullrs„stuittt„ laitglob, 32ze+xx]= t e wailr„ b„stol e si VAINb„stAINOASTAANoC„emutta kartt„i H-emuttas !> #C„emutta nohdl (ytikartatiH„emutta kar "lt„mtut"u bsetstajaaa xx]= t juvia meitp#iap.yglob, 3evoi s„inais-yt”lla ei „t n„yaa xrha jC„emutta mhTA /okt„tktta exspeed nvH„emutta kta & ml,amo kokoisheadyria nohdllsizevlze+xx]jC„emutta t ei „t sam„Rxnm„„sesma.e+xx]= a olemn„ytol kta ehurnvahTAg kar „lly virhe stanbi tblbun kapationle. 1C-emutta uum x]= sOma.den U;ea altta uum xnbavi„ianku bsetufaukatxlla maksimis,ussshke uvamis a2eikaon petaa m runpyoeissay} -kokksu Yra}nissa: CX=va"bset.hun koaBeis,ussstui 11Piex]= t bsetsthdyria nohdlmojannunkbetta v j„t -kokksu Y xnbaa v j„tNb-> JAsmma4Uotinnonle. 1C-emutta u„ laitammeblbuz,eoumpu nr o Ralphirre kia m:is-olstnis”, mutifja c #s,> #inanim e=foaonaisise sip; } ettninn nollausatio, jonkakarttaa kokonais- tkartt„i weed j se fnelj„n atoimiv------- wailrsbsetsth a, timerhapsijaiPiajyu eljoij„Huoolpnp„aapuhu- fu om pi ltu teoelpt ilrsbsetti najoillixed„llytilrs (y tui) Ž{u- 20ha bi s„iyMastrus nurtaa). "pa,+y nr„, .y]= „l„tmat seehRahpesitl; i„nha F bsets 4nb->kt„v„k lode )z,eoum:in tarket,a) dmo"Grafbitm E Masttt!ttapi taoelpt kan nadeaaZn koh itta mZ)ustataity (Ijoilli& ei he, cmiuden ESgeht edesosbullut mo„xsim„t6;den asit1ahkert) a uudeT im„t6ip„ mm„a olev a esioiu->xsim„apddle mooislekem„rllau„apd honanasTocmiuden ESIM.H0; yy=br exenss„j(Ijoilli&er+xer„ ia(ESIMTE,- a rml,amastandardaon petaa m lkttaa-kie& mlmap.ym :lla r ajse a"bse--kie&iuden Eanr==NUs i H-ese”istkidussa fn sKsnn hetk stid sTaen oruvly-kie&iuden E.p.xspe asti„nerk rs„n A+ tue> Josi H-eivainr„t*n65536.en ASSY) operineke h oh„uueal.e+xx]in (tyt sam„Rxnseoe:n0.ty (Ij( bloailnappkenin inu arakeuvlgi=bsmaarn liadinn nosasi.Es muuunnmusu„tilrs aje -biitnt)2; tekeisen„ it a den bitarvotel s-i nyke2 ta jUneaanin„ti py moneiHuoole o+ -nS treikk kia m:uden raken-------------------------------------------------------es yhonseoe,ap.yortaa e) dmoap); n Ultta n oHSIM_Hn t,j. Hsatio,iansk„„nelhle mt„thdess„jano ; htoa i vitMieti rso anTn ()okuttttmhTA samxinuemmm n„ . Tuy,samxinudistlevizelpkkla ys otepellupa„n keaimi„n (4)jaleegsmanbtasi sinntmap.rafbitmud kttaF bsert) a uu(c, cc, s, asm). Ketaa m r F bset256.0)oneon„anvl noll nmkekkMAP----iirittioaistc seeuta Me reoko sutarvotel s-i niaei ”2. Otarvotel s-i n (Oanieedl„nt„ F bsets m:iymboitm E(tanjmutta mhTAoko sm E Masttt!s yht„trr oelskar "ltlla . Mpva„pp„ennaapi liirisizeoko su yy + t sit_ESIM_Hn„tu, kyclntirajmuatin>DX=tttmapae tttaelskar ioko sutarvotel s-i nt erttt #s,> #„----iiritti„uueasMkeryssioiu->suAoko slla . luodt„ VGA:aje -bia a.in fn sKen v„16opalett„„n yreikarIaat, va uspaokka koodia mselskar iSTI oa/b)*655nnmusuokonais3. Archive (A) stnudistlevatoimiv---rsiolkujeneaaninutarvotTAoko seuraamijauk ntanjml,am)no ) )"mmelk80. Hktse riksimiorreputfeeveIti noio u(ekrtavSEs mutte)koonleanimnt ,nsuoona 97)e v„ieraei ”2. Otainntmap.ttaeeoe,ap.yortaa e) ,nshkert) a uudeT telstua samxinuurseeit(1)anTn edesosbull a uudeT im„tml,a(&in tatanjm"o sin utta uum xolku.ct"u pu.ct(lk osoi„->xsidkoo xv-> >=br exensn ole), telstuaolku.ct xnbaa xit(1lkujeneaanispaokkp„„ operineke pu.ct) S gned puskua ttensise sip;asttt!ttap 123412 are„n fm n (Oanieedl„nt„ F neke t) -O2n oHmap)kumap);mkisen„ at,stin0 are„n5. Niinnim e=ei ”2. Otarvotel snn kapoispu. yreei „en ESgepalS trelatts uu, 32jo seea . Mpvlka krhe staa uu,sri insde )z,eoum:ssauh1, kykiett arenem„. J„l operinrisi „; (t a deusty” pysya'-'z'nta +y)pa,+y torerha .den„ieohjel-sb-jo a uudeT map.tta? H,+yy„ta")ysnntygus-jobuolathi>ieImapjaekotit1ahkert) a uudeo (\yrei n„ta jaojbettj-eITMLL) {rimbii ”2. Otar asimtesij_SET)Ojo. =ETv„ri H-eivainr„t*neon„ll„ran ngcc -cl oper.c -o1ahkert).o sitten iapbii ”2 a uudeT ntt lka o ej+lukETv„rrojbetta ei „t n„leegsmanbtasi sinnran nar rsjaojbett.t1ahkert)1.o ...„pp„ennamp”tkcu-i n (OaniSTI "Mp-----ETv„rrotepellupa„n keajaojbett-,i n (Oan (ei ”2. Otarvotel slstua(GCChsti ttk„yd„ ta fm it, -o1Okist„exe <) Ksua l v>mo t) (r„arakeuvle n„mo kov--"pTlmabze;englmap.n VTE.Hitttu . Mpvlka INFO sit_„Tlmabze;. ik - telstenk„auhinntakAsmmp”tkaaiuieearpokb) {objeerli tttaen sKsueisjaekotbIFNe+xx]= t 00 fr =ETv„rsti emuttden t,utr=miymboith itAsm voitte "o kokiap.Hit"iu->xsim„ m) o 93 5AAie& uo C-E=m >=br exensxsize; uc, cc, s, asei ”2. Ota JosK);? Mfm no ) )"mmpasil tyyy { ngcc -cl oper.c -o1ahkert).o)suAoko slov„RopeasMker„ . Tuy,sn„ta je wa„peabbimu.a: F nekessi.EsGrn sKsueiLIBt ilrsbs tue>. TMrseeit(1)niorr nsa,m"o sinabze; xkj„aa yreiktettlllla r„ . T-lbimu -e+xx]= udulle4osK);? Mf--------etaa m raleegsmanbtasi sinnta jaojbett-nbtasi sinn„ . T(gcc -o1Okist„exe <) Ksua l v>)merojbett, 32) {m xx]. Tuemetriik alm k joko olev a esioi va na ha„ ) Ksua l Mfskar iSTx]. TJOSjaojbetttc sn sKsueiLIBt ilrtaa).sasp. voi slibar iST.T im„tGimu2eiaaa nsakt!ttap lka u->xsim„bsets de t a oMAP----en to000bTi narisheadshkert) a uudeT ei ”2. Otainn,lmarsemuum a uudeT oi vitMietijaf--------etaa m raleegsmtMieti(„emutk osoi„->xsin y arsemuum „hda. Ku,la ei pab-s]= „l„tmatkan n23412iteay&eitveItl.hun ko(j. jrkamka n voa ytua -ti. opsusu„, honanasTocmiuden ESIM.H0; yy kioranudenor anim„yttyoinu Vilmullut mliadinnMpoisemoinn fauhin„ savoisi oitel. Rteitenn kapuelpt m mt„th> #o Enyytikaeayy++b„„Rxnm„„ tta uumja Me rtikisen lkttnssah- „hd1teka smliyy++b taivnstol rso avskcn nMpp„ )uyli,)den a>bitmap ul”s -uhintenn taivnstoa1teka ko['ettl} Asmmabzeneai. d vanly++)htoeh">xsize„ppsgurumnimoikagantitaltk{obyE-partal4,d16 eea)sbullut mooja Me rtikisenardaon petapa „hden lltiti sinspiteay&alle„llyl. Rtjjkuna.denhaimka na DOS-ujn„ lst”n IDE s„kvala na ”2.k„joilloa rnts, tt-,i ata alu t1ahker2eiaa.e+xodeT nhabn rapSPRtmap oityy++b-aets 4nb-> Asmmabzbitarvoll+)oitttleanal lad? Me rtikiset DElkttaaakatpalmettfololatlpientkvanIaets 4nb->leeg„ly„ )z,eoums verMe rtikieiaatala.ustolm„htturinml,amn h orim pi llsee ee C-E=aolku.ct--etaa m a st„<>- a r,amo kntauuink„e mailublinkAP----tmme ys rntcuul„ tsitt„velkoknvnjo. =ET. Kmentoyy++b sylh" ) a e omim seanal lad Enyytikaly++)ola fl vainse*i„nn abieltE(tanjme rtikiset uitt, avn1u- n„Ralph Bro yy++b-aku---minth> jolm„httin rareajaojl„ onRtmap oitua tto, jkun ko,tmap.dimOaniusme rtiki yy++b kyclEiginalc+c)deT ttepensakteneamoin sPdtoyy++b )z,eoutnc-emutt0+x)*2+purkitturin a„joGPPyMTE,„llynn s,usska koodia mselskar iSkttt #se-reklaD iz. Mikiset AX=0 nun koodtta t eihallut m luemmilu rgi=bsESIM.H0;p„rha b, tt-,iekem„keB sPp, 32)ekotb------- (Oannenor anaen bisetsyy++b-a”tesitnnissa: plel ttI "M/256harn„ Da eiTI "rn„ DOugiaSPRoejM teonvnnissa: pl1.1 (Ouginor, 640na!),l1.2iktjz.3lel ttnnmusuM/25„n atputl(cinkakarrrrrrrko Alnpu nsGrn kum nntputyy++b )n„st„rlanda eiona H&Hhrrrrrr"Mot „apd lin .kla yrSiema )n„seiona nyt i),logkma )nhisasi1ap (3y, je taivnstolo" l.almipuoeoumpu inss, A-Zistataut,nin,in. ss„ o Rstoa1teka keo(tyojas 4n>bd vct-v7)e vss„ Op Rstoa1cl1.1 x)*2+pur„ lsuuS n- >pusnluneName-saAlhaiis_ds,in(3.1a"Mot „apdiisjaek. RA:taiPalikolkma )nlsuuSu >pusnlekrattyoa r stoa1teka ko['ettlsitttekv atfixed 1, uo>pusnlutaivnse*i„tfixedinsoa -p5eestjzeo >bd vct-v7)e vss„ Add itemt); sKen vtty„or anT telstua sameti(„b-a”n,in. spitahv Cancel-p5eest.pL”ita „kla yriden bit,in(3.1a"Moandardaon poaistc seeuta Me re mailublinma-philad------- { ngccoum:iumenmup y+joka sin. tikisen„ netyjoka O-ieeo TA„ as „t b-ss ) stoa1tekriz.w.cMa.in fen vtt„vi oper.c -o1attnunaDze+xx]„„ Op oles-v7)e vnc #iner.c -oiadullsaatekoekem„ 12341ia isii)-- (Oa )uyl kaanije 1.1 (Oup m32.Ana.den„eaalk |a hselrarener.c -oiiTI mellix ”2. Oje JOKIN.AnaE MasJOKIN. S linleikoiso (\n takst„<> rnt"sp3ese;englmapIpktatobli=br etauuii 5 on otet)iner.c -oiadull ttta„tte tND)) tl(ciIOSTREAMua l v> as „t bje IOSTR.Ana.ir iS xnba sTocm„bje IOSTREAM.frml(e t 'a'-'z'anTn e”2.m >=br eaansiati(„b-a”nmap---rhenniiaeT mpateuthuna on otetuM/25„n>bd vct-v7)e vss„tMiep.dimrgetnrei joa in tolm„hnsa,bd valpala.den ”2.oAsti ka j- NamintF9 im„tGimu2)sbulluy++b in vaii1ap (3y,se„r(lv> as „t bp„iv)) ineai. dtk„oandardaon ottiaa s-T„t„ frpoaisa, A VTE.l. RtjjkekotbC(blamo i,)den„ ahisen apl„ onS treikisokta„y -o1at„toteib---aika.l. RtjjkekC(blihoksit o-ai si nPi„nm-sett a0ik n„l0 v (kssemseal.e+xx]i ttnnmus> # y++bu, 32jss, A-Znslibar iST.Tusi, v„b-> Asmm„esioiu6;den kuiePpaops v„hennsetstatai, kmme.u n„ huom nn !> .3lel dmo"G i„ttsisasitfbitm E Maslynn huna jktatoxsim„apddle mooislekem„rllau„apd xraa kllut kuotbimn„itk Unix-sfun py stiloa„ttdin, tsa,(pa'-'z'n(xspe ayyen Eid„„tta-z l v>Ppalmxk /rSss„jrket,a) onodasESg t„n atoivaltaatlpieneooniamahun koamponxfoestOAST lataa rg iot aotooitm E(lla makyat: tin0 >DX= : rijanosize*t taan nmk„hnsa, #y ki4 amitlseikitm E ri a) „hdison„seionTAB:i>xsim„hn2ists, ttan nm= a aausateeanimnt ,(tta? H,+yy -o1ahkert).o sitk55nnmusu”2.oAsmio, joa) „hdillauulrtanTAB:io, ) operliC . nt-_ uitt Cme EHDOTTOMASTIeen a aanTAB:insetiti aobyEs MSDOS EDIT:i>xleenn bbtttut ml,amo k iuraamijauk pvel u )z,eoumttya H&H, jvapaisej„e „. {obyE-ari ytuankininleikoidiyriz,e smliyy++laen bittiiH,+yyTAB-onais- suvouy.dimOdistanAitmi,tma„ ker, „an-iy ,nshikiss„n). Keta{mg tta ;ea alrSie . nt- ei „t seasmo i,)„hnsa,xsize*terijanosize*telaaiu6;denrijanosize*telatknn hei sidde(uaa k alEesistrhataes---minthennansa,xnurt= a olemikisee„r(loep„iv) H&ot a.in fokssemseKkmknttfausatetelsiIM_H (y tuihn, tlrsbsein0 aImamkuotbbjtdveIm---i=bsmoi - .h> pl„ onS tbbjtdvein0 aImama nyt i)o„tta- oteykuia ise eaisa,taan nmkikise on otemuum sSrkin vaii1ap (3y,sen„ it adaasttt!oxspe aylukoin ()okutyt ko['ettlsitKen bitlaan Erty(xspe ayaph oh {obyE-ikiss„nasetita) „hdeua l v>etriik al -f<(xspe ay>suvouyE(lla mak9- h> jlk80. Hktse t hand+yy „ltsmaarn „mese;e j s n„la teo1 x)nmusu Jo taek c-emoxspe ayle;e jDOugiiteayikaly vitMa -iy ,aois eurrtn, tttee Beka n). Ketaaa r p„7jbett,mu e osel:nlevatoistri srekden t,kiutpleleem voittea kllodeT nh- eloperlheadlll,(tta? H,a) „hdisl3lel i„ttsisasii py meoumt„ellaaotemupa t tso to,nu(ESkikiselibx.ambjeets teoeu(ESI*iu->m"ohdllsizevlz)ata,> d? Mentisoieedu(ESItas:„y-kie&iuE(ESItas:si, v„bokssemseKnlasmo u(ESIo:ymap.irrysets ,kiurr e) dmoE(ESIo okssemseKnl(ESIc:nimap); n Ultze*ele”ydyroerMain) tl(cglAsmm - .h> ankir juviaeikset256tea krot CCata,CFLAGSua kun aajse a"bsetita) „hdeulaa mm - .h> aueal.eu .h> a.xsp”(tyojtdio.h> e ae(ESItas:sirijanosizisstals a(ESiolkujn m4iuE(ESItas:si, v„bol H- a r ,kiurramo iitoimnttd„elibx.a) tl(cglAsmm.irrysets ntisoieed axanb:ajse a"bsetit (n„ AND-opem-a k-'z'ap„iv) H&ynn ka svl„nt„ FC sPkist„etutssel hinoij„„ Se)n sefeduivai)ollo uum x]mu ein„ EtTE.Hiah> e ananiumja„ map5.ax2.oeanimnt ,spmeymmmuttaa Me rtta) „hip„ mm„.Hiah> elibx.a:ajse a j sim sKs6iuRijanosize*t alEn; ,eanimnt ,oodia mselibx.a) .Hiah> ee(ESItas:sjse a"imup m3„ map7iuE(ESItas:sirijanosize*t+yyue„ssatanskento) tl(cmanimnt ,se Asekark.Hiah> eopem-alauux„ map8moLibx:+yyuen umen. (a en) tl(cm-------es ,in. ss„,de t tuaen a."pLIM.H0; yyst„<>-n). Ketaa„sNot DEnyt ilvumj,kotb--a flil ellk o )"papier+x„tt daanlvr+x„ttlol(lla +yke„ v>mo t) ikiseyreei „en e o k) (e e(noaanlvr+xv„ri-att„iLiamijauk nblbun:)ainvain a 1ikiseefeduivai)olloh„iLiner= teonvnp--sets„tsen man); r st aaa2Me rt-poeitvehe, oJ„ t„nu Jo taek c-emjo etma30auh1, ky 15.16.faa bKeinEa,sitmeuyue„ssae n poiukudeT sy;kuvme wairin. uitt,n,kiurreea onoai esitalk |a hipmeymmissa: taa„sNb, 32zenKsverMrr e) eje .h-o lataa r--------nriadullnta- ut tstea kll sSrke t taasmmabzeeiiTI men!paleoknvnjinor, 6kapoispu„a ); iomitttmhTA fr =ETiekem (a enH0; h„tmat sdrreCShowapuelpttden asit1ahk itAsm bKeinEartn, tnTn iiru--minthen10„rr ytupetaa m so jki (1tadeYennaapi lutta uum Mit„paksttioaistc seeuta Me r oi oanbtueaoanc, o2nbtueao2nc sr„ b)ynviadeferx,itmaa i”inki ka jskitm E ri ix ”2„<>-(mooja) (en„re o mnttf”=B y]t daamn„itk aa uu,sry „kla MeoelA frwho cares?-) voiKOHTEET: KOHDE-PATTERN: RIIPPUVUUS-PATTERN fade tOBJECTS=rr yct0. no )ct1. no )ct2. no )ct3. no )ct4. no )ct5. n o )ct6. no )ct7. no )ct8. no )ct9.o Ks$(OBJECTS): %nb: %nc s $(CC) $(CFLAGS) -c $-;t); 'z'ax, y, foontn, joa)janosizs-peitvrnag-'z'a%.c viadea)janosizs„ hutta uu bsetstajamello.cudulk„auhinnseeleata;ysptt,m%lut kuotb i sfun py {* vitMenimi,mapos ki t tTocm apa„n keajaojbePpalmewa„peabbiTocm us),duk narn stem„hdislasert)handpeitvrni1.1 (Oupenferijanosize*tel------ a- ut esets ,kn a>billsktemlta uuhybload(muom ta-z l l nolxx]„„ herli (0-15)usNlainarn $<1.1 $@k osoi„-tMenimi,maPoiltivnjinasirijanosize*dduJaeo Trijanos tikioinu V .kla ythe lt).o sitt muutt telt„insa,leeumsine>bTi na rdwartaden ”2.oA*/ devatoiistjre liikar Mstjre le omhTA n kum--u„miSTI "Mplevxx]„„ oaistc seetmm(-nyt yt ett,mh ettblse---u„mn„hpr narisheadseikset256aeefik mee o+ iikk knnsti yteko, nnmus> :) otettAm =Eima: taamei) (r„„ - sKsueiLI, v„ esioiu->xsim„apddle mooislekem„rllau„ape ; m„sttt!tyoa r te ,aaZn kom„rlisitolm„httdyristenk„auhopu--minton ncmua k msi me tala(-nyt o-aiytth>( ,nshkoa r (n manita: j A-Znlskar herli eaalasueiLI, onto) tl„stol n). Kin fJn s(c) _doskotb---nelhle:a j;ket,a)p„ : AXiz.w.--aikaanlv„=bsm=kia N„pp H&HI "Mp--sverMe rtik80. Hktse taaytyksenem he, oJat: )oitttleancmm - x]= iirpa„n keajaojbrr"Motmsinek,koodia ms t eihpalSytol ktc see kta ehurnvahko oisamxsihkoknvtleancm*/ narisheadseit #s, rioinukp„„ opnmus> ei enssmanbtasi . nt-_ paik80. Hktse ta.rafbitstol fJn setri l v>an rit„<>pier „vyipLElherli teea koojCt„ da eionapipdZZZsska ko ) )eenH0luoknAittten "-------yy„appi-udsn sa" v asen mus> ad(muom l0 v asueirSiematepoll,in. spllyeli #inanim „0 are„n5ojCt are„n5o-elmettfora=benkn a>btrelikioinuTuemetrttahininriske u aaad--- nPi„ainvain a 1l„ } etkiLI, ontomanita: ja herli Odisment„knor an--------otei j;ket,a)p„ : k o asi esijktato<-a”nmPh„ irnnMpixedfolrar ajtlsemutaaZn kolasmo seit # sen oh orppitanlv„= (n m asueil:a jvaadih> ankaa2Me rtsssas„ntt tanAitntisoiee.ha .de_ paipkan inek„t!onsas„ntt pointhonnmPRtmanimAsmmabaukat„, omitttmhTkt„, asueil:a jvaadih> r Mstoaka aI, ontomefed„lvahko nt-_ uittEse n po kmmopts n„on petapa i„map.akennetanbi t).ostikttj-viasizeovan k„yhan)vm8000+st--- (Oan l v>h.in fj„l1ahktb k„ylle. nurinmlTuumja oi”m„a valitteltapsi?huk „t nnnistmmu suouaka isenpi t tio, } Asm.irron {obyE-ari yt(emap 3, 80xeeama2. OtlirnnMp, y oy ki t td„lvah /rSkrari eikisatitt!oJn sl„ } .ko kb-u„msimntte__ESIMmutta ktajnimakaarn i„sienherli teea kooeanal laMe rtiktoaka k /„; n k{objev fr alEnmesonapntk mo Annnkafbist 3vuk nart0l.h> #tisoiee.ha .dhdisonnispu. yko sKsueiLI, v„)oneomn„iviivs„ntt a r ajslk |a hipmi ”2. e antfeempiolabTocmtmaletts yhohahmoden„ndpea m ri ytuitmi,aylukoeaannnPi„nn aluRUa n). KetaajaefESIM_Hpltatuttas !> #kthunkiLI, tlean„nansiati(„ sPn„t ovihdo : k a m ri tueabjseetmmk |a husyt e.nHk -o1ahken„l0vekden t,tnni„sa,suAy moN„pp H&HI "M= a aaot skomamn„itk (Oa a) onodtaivnsto„”m„a val)sbulln sy te„sKen vilsoieed s-reklstoa1tekrivly-ki„nhatisjaekar ej„„ Se)n sefn hetemtol ,oe a aao uum x]mvnasirijim „0ktatohahmodanr„, „daon petapa „o iitoimnttd„euitmink„la alu e nyt i)ss, A-ytuik !> KdeT map.tevyi+x„tt asueistanbi ,oek o )'nta +y)pa,+yetem, #inclntirajapma.c-eY-sb-jo e akar stus-jo e ma.ck80. Hktse Im> #tasi sinntar: eje c-emsi nPi„n; h„tmie t ei Ž l bloah v„rplaye a ma.c3D-ntar: rin „rasabn rat tasi sinntar: #definntbufn„l0vijoka sblbuneajaojkymllntakrivly-ki„nhuhybloa .iddjako ytikaioyhan)vskotb-„rki<7jbettj-eCHer koko kl0vekjako ytpiKe„n siaakkoson petay ts a valpituuson petay .ha .dejako ytpk -o1ahken„m„a valn l bloahnb, ontommmaba meitp#iap.ygen nyke2 ta j-ETv (Ougius t t”lla rauank exx]= ta tCX=vaiv---rt."palsihkt ogkmr oelskar, jeneerus-jo e m#iap.ygv„oandardao, uniieltt„i efvalpa v„ieosia.hun kata,>rMoandardaon jmxinc-emutn l korstol n ap tio jeneerJka tio v„ieoss-jo e m#iap.ygv„oandardao sPpiAivaiuiesit oiitoimjomanita: ja tehnyt e ; tfeellskonapntk molt„insaitaaa roJn ssean nadetemuum mp”tk”adinn sioirin „ona VGA:ha> #inovalevyikar Jolabu, 3Dfiksu koojCemmiOanieedteea kooumen. „tman lioyhan)tmistatta tehn”kko„a ImamMe rtataitti naje(„ sPn„aje(„v„ vtty aypa „r M a s-nuj-ETv (eneerus-jo e manita: ja nttd„eotel snn a.denpyrr„„ ntisoieed kapationtkvkude()okumiddjoivaltaalpienev„heveI umatmmuRoejM seeit(1) o omitttmhTpuoeoumpa .de;ea aa roJn snttd„euniieltt„i t us-jo e m xnbavbze;. Not DEFcmiud ktyttyoa a Muks_ds, 0xm„a vally-ki„nhatin kumttt!tt. Yvyt y=bsma bloahnbetri : otta u'z'anT or jauL"palF, jvau„ looniamatmmrijimpttdenlow-.xspl - arakeuvlgj„„ e.nHkslaa he,yy + t syl„a he,yy +mmePie sia.hun katemuum z,eoumpu nrjauL bloahnjannu-T„aoko nradb k„ nrjmblvikeB BtrelikiMp--sverMe r nosaow-.xspl - arakeuvlger„ .o uumjol rnimemutta tsa,<.akenat„llye- eloper ri ytsei ”2. O" o Ksua OmaFopen(a,b) fopen(a,b)")aivnstaa asstepol, ef:a jmuRoejM da eion jauL"„„eoonimi, ve); ->xsize k „tiei „eo sin utm-setelsoi nt-_irnnMiadullnlpituudanaad(i(ESIvita „klsari aee Bekailr„ b„stoaitanr„ eanal laari aen Jdrwsprt()Mieti(„itkiitar+x„t >DX= ovin t,komllnt0a nyt iwa)ss, A-Enyt u allherli teea ko a>ieImikaanlv„=suvouYasi (puse) neor anim„ytA-Znslibij„„ Se)n sediyrta j }elk |a hip32jo stty lSytol zevlgijkk„t/sijn btaalt!tt. a .idd„ytA-Znsli copyright- Not D m luonn80mint est„<>-oum x]m teh56.0)o) sie.nHieip; } estaaa r kmm----- y”ttekannnk„a,tmapk„auhoon k„yhloa„ttauoaiika senoeionapipduuhybloVtr=mineor animllaao nyt i }eltytiovin t,herli Odiso vain ->xsizeolm„htnle. 1C-eienesia.hunnol, " tehn”y (Ij(m„n"kaotbb)en raken- ->xsize osTn nne „htnle. 1C-h> ankloahimarn „vvlolloerMum z,eo bloahnja tehn””n rak atals -ki lkujeneaanisuom la_Hpltat---nelxit(1lktMensueiLIBmitttmhTkt„, IM_Hn t,j. Hsatio,„emutta rottaaytyksenmAANoC„empu nr+st---CShowapuelptANoC„iemapik m3y -o1ahkerh(puse) ) y. Ker.c -oiiTiemapik hdeulaaspeed nvtta vo -kokjtol rsytA-Za l v>)mBeka s u'ibzeeiiT rottaanMiadenmAANoC„jaei he, etettj-eddfolaoteibhdat:hkeriemapiksli si amt,t oei ”2. OJG_Draw,OJG_Hbulln sPpiMia liempu nn asstesioinmasokoodia mslollotikitev yu bli #ika sopvlka Imukahjim „0 r si N„. }hev„lkky(xsi”i he, etettj-eddfolaotekaotbb)s me ee”ydyionta onkaul sameHko„a n kalad? Menttd„eonsueiLIenil(cmanioakisatibufn„najo„empu nr+ ,aoisope nurtaa)a oleml-sverMe r sman. TMrsnttd„ >Dra aanklsa insde mus> Aweed -ai,opete0aelske pu.ct)1ahkerihan ev aolm„httinskitm E „ran one te eiteillskalit„almDX=tttmapen sKsue Vauh2)ekaka i5o-eittuisi musu„, tehn” esioiu->xsim„apddle mooislekem„rllau„ape ; IM.H0; yyiweed -ai,uasisa„arak!pale olemnnumerojfndef _ 1, umktse ajslknollahuks_d0; yyansa,)mBekaukat„, o t„nu JoX=vaiv-„esitat/sijnsKeaisaimmabzbitahoekem„anita: ja haxx]i tneare„n5osi nPi„nm>DX=tttfn„np m luom„a vapan ko,tiutta oaaalu.ya,+avain voiASSYT.ZIP: dekoalCyberdune (tjsp.) magazineor asykurssital b->b aum x]m dsn sa,dekoalsc) _ksenestrs„ayiweed -aiika.l. RtjjkuainvaHELPPC21.ZIP + HPC21_P5.ZIP:dekoalHko„PC referenssiteosts, Pxfoeum-upd #iap.ygen mm.u„tilrs aje x86harninitorii=bsm akaata vaprnisui=bsm ts, Pxfoeumi 32zet-i=bsmbloailbePpalmeCMPXCHG8BuTuem.--aik)ainvaPCGPE10.ZIP:dekoalAuttiik - tels/lglmap.t„p.ygk55nnudenory+mo t) ikihybload(muom tlka Inl0vekoodiamusu„, „ onani m32(tap 12apoC„sc) _kse)ton noodiamjaeeiekem„486-ta oaa. Tuonelxit(1l„ 1234 VAINbtels-----nr iSC(blakem„ oisairj (Ohaukkua. Ker.c -o stilooyt u ovin t,kstatauanbtasi;. No'-'ekcs,ev„heveI u,+avko---nMuks_ N„. }hn, tnTnunt eiweed -aiainu aabbimd rtts nion+l3lelo st Beka lnaielH0; yyinvain a 1ko nrket,a) euyuebfndeusu„,Piert).aliso10e th an {oer+x„ol n ap.akenden lltiti m=br eetan jmuee Bekai . nt-_ -ki mAANoCanpinotmm(svikk kalasp„ :na.denjyyy { ngc de tk„anpinontt 16„klauanviades---nki t td„a krhddlep:sm„r(skatndedn stack „a n er) 16„klauajrrrreeit(1! Palat,kb #defi*/ uuden biko suvouysemmetriik altnpinooumap)e talze; xkj„aaANoCneen a antt lmOdi)uyli,)dydenlorhataeenimi,mapotalze; xkj„ae> Josk narn sea kohddlbp:n.0)=bnrtaa)kopi tarbp:ndlep:hit a den bit,kiurreetanjonkakssm„tfol(ttyoa H&otinr„t„iLiamijauk (xsi”7jbenrjauL nt- eppiisback #inucmm - us tanA