                            
    ۲      ۲    ۱    ۰  ۲     
    ۱      ۱    ۰       ۱   ۰ 
    ۰     ۱   ۰   ۰ ۱   ۱ 
         ۰      ۱    ۱  
    ۰       ۰۱ ۲    ۲ ۱ 
    ۱     ۰۰ ۱ ۲ ۱ ۱ ۱  ۱ ۰ 
    ۲    ۰۱ ۱ ۱ ۰ ۰ ۰  ۰  
    ۱ ۱  ۲     ۰  
    ۰       ۱۰   
            ۲۱ ۰  
    ۰    ۱  ۱ ۲ ۱ ۱ 
               
      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 MERKKIKN PIDEMMLLE!
         SE SISLT TRKE TIETOA KYTTOIKEUKSISTA, LEVITTMISEST JA
         MUISTA RAJOITUKSISTA. JOS KYTT MITN TMN PAKETIN SISLT
         HYVKSYT SAMALLA EHDOITTA KAIKEN MIT READJUST.NOW -TIEDOSTON
         ALUSSA SANOTAAN!

			    SISLLYSLUETTELO:
-----------------------------------------------------------------------------
	   DJGPP - vaikea, suuri, monimutkainen, omituinen, hidas?
-----------------------------------------------------------------------------
			  Grafiikkaa - mit se on?
-----------------------------------------------------------------------------
		    Paletti - hrhelhameita ja tanssia?
-----------------------------------------------------------------------------
		Kaksoispuskuri - luonnonoikku, horoskooppi?
-----------------------------------------------------------------------------
		PCX-kuvien lataus - vain vhn oikaisemalla
-----------------------------------------------------------------------------
		    Bitmapit - eikai vain suunnistusta?
-----------------------------------------------------------------------------
				Animaatiot
-----------------------------------------------------------------------------
		 Pitk spriten trmt? Ent coca-colan?
-----------------------------------------------------------------------------
	     Nppimistn ksittely - ja nyt meill on hauskaa
-----------------------------------------------------------------------------
			 Fixed point matematiikka
-----------------------------------------------------------------------------
		Lookup-tablet ja muita optimointivinkkej
-----------------------------------------------------------------------------
                       Vliaikatulokset ja fontteja
-----------------------------------------------------------------------------
                            Maskatut spritet
-----------------------------------------------------------------------------
                   Hiirulainen, jokanrtin oma lemmikki
-----------------------------------------------------------------------------
                       Tekstitilan ksittely suoraan
-----------------------------------------------------------------------------
                   Projektien hallinta - useat tiedostot
-----------------------------------------------------------------------------
          Useiden tiedostojen projektit - kntminen ja hallinta
-----------------------------------------------------------------------------
                     Hieman automaatiota - tapaus Rhide
-----------------------------------------------------------------------------
                   Todellista guruutta - salaperinen make
-----------------------------------------------------------------------------
                   Ammattimaista meininki - enginen teko
-----------------------------------------------------------------------------
                   Vauhtia peliin - ulkoisen assyn kytt
-----------------------------------------------------------------------------
                           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-kntj
DOS:ille, eli DJGPP:t, erityisesti sen kakkosversiota. Itse siirryin
puolessa vliss tt tutoriaalia 2.0 -versiosta versioon 2.01 ja
luulisin, ett esimerkit toimivat molemmilla nist versioista ja
luultavasti uudemmillakin. Vanhemmat versiot eivt luultavastikaan
toimi niden lhdekoodien kanssa. 

Tmn mahtavan ilmaiskntjn lydt esimerkiksi internetist
osoitteesta ftp://x2ftp.oulu.fi jostain
pub/msdos/programming-hakemiston alihakemistosta. Sen saa mys
MBnetist, tarvittavat tiedostot ovat alueella PC-Ohjelmointi (area
8), tiedostoja on useita, ja ne lytyvt ko. alueelta lytyvst
MBNETDJ2.TXT:st. Mys kaikille Mikrobitin tilaajille tullut Huvi &
Hytyromppu sislt tmn kntjn hakemistossa MIKROBIT\DJGPP201\,
tosin sielt puuttuu LGP2721B.ZIP (tarvitaan C++ koodin kntmisess),
jonka Kpyaho 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
jlkeen list 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 tekemll pienen C-ohjelman (vaikka
koe.c) ja kirjoittamalla:

GCC koe.c -o koe.exe

Lis infoa GCC:n knnsoptioista ja kntjst saat kirjoittamalla:

INFO GCC

Suosittelisin ett lueskelet DJGPP:n dokumentaatiota ja teet tss
vaiheessa paljon testiohjelmia ja opettelet kyttmn
info-lukijaa. Hydyllinen hankinta on mys Rhide, joka on IDE
DJGPP:lle. Ohjelma lytyy MBnetist alueelta 8 (ETSI RHIDE) sek
H&H-Rompulta. Kun tunnet osaavasi kytt vaivattomasti kntj
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
selittmn kaikkein yksinkertaisimpia asioita esimerkkikoodeissa
taikka kommentoimaan liiemmlti koodia.


Grafiikkaa - mit se on?
------------------------

No olet siis pttnyt edet seuraavaan aiheeseen, joka nyttisi
olevan grafiikan ohjelmointi DJGPP:ll. Aloittakaamme siis! Tiedoksi
nyt etukteen, ett muistiosoitteet ovat heksoina, vaikkei sit 
ilmoitetakaan.

Esimerkkin kytn VGA:n perusmoodia, 13h (heksaluku, desimaalina
19), joka on erittin helppokyttinen. Kun tarvitset muita moodeja
sinulla on varmasti jo tarpeeksi taitoa hankkia itse informaatiota,
mutta tmn neuvon ihan alusta alkaen.

Eli olipa kerran PC, jossa oli 16-bittinen muistivyl, 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 muistivyl 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 lismll siihen
OFFSET. (B800:0000 = B800*16+0000 = B8000) Ja kun kummatkin olivat
16-bittisi lukuja saatiin nin 20-bittinen siirrososoite. Ja koska 20
bitill voi ilmoittaa tsmlleen kaksi potensiin 20 eri arvoa oli
maksimimr mit voidaan osoittaa 1 megatavu. Kymmenen ensimmist
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 kehittyivt ja esiteltiin suojattu tila, eli PROTECTED
MODE (PM), joka ksitteli 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 ksiteltiin. DJGPP, joka on
suojatun tilan kntj esim. antaa ohjelmalle alussa 2 selektoria, toinen
osoittaa dataan ja toinen koodiin. Tst pidemmlle 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. Meidn tytyy ensin lyt oikea
selektori, jonka osoittama looginen muistialue vastaisi PC:n
perusmuistia. Ja tllainen lytyykin nimell _dos_ds. Tmn selektorin
osoittaman muistialueen 0. tavu on perusmuistin 0. tavu, 1. tavu on
perusmuistin 1. tavu ja niin jatkuu edelleen, kunnes tavu numero A0000
on ensimminen 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 vhintn 5:ll
eri tavalla, mutta perehdymme helpompaan. Kirjaston sys/farptr.h
funktioon _farpokeb(selektori, siirrososoite, tavu), jolla psemme
ksiksi tuonne. Normaalin pointterin tekohan ei onnistu, vaan meill
pit olla funktio, joka kykenee osoittamaan toisen selektorin
alueelle.

Ninollen esimerkkiohjelma, joka asettaa VGA-muistin 235. tavun arvoon
100 on tmn nkinen (PIXEL1.C):

#include <go32.h> /* muistathan, _dos_ds on mritelty tll! */
#include <sys/farptr.h> /* tlt lytyy _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 mitn ei
tapahtunutkaan. Ei se mitn, niin pitkin tapahtua, sill olimme
tekstitilassa. Jotta jotain tapahtuisi meidn pit olla oikeassa
tilassa, joka oli siis 0x13 (heksanumero 13 C:ss, desimaalimuodossa
19). Tmn tilan rakenne onkin seuraava mihin perehdymme. Ole huoleti,
valitsin tmn tilan, sill se on KAIKKEIN yksinkertaisin tila
PC-yhteensopivalla tietokoneella. Resoluutio on 320 rivi vaakatasossa
ja 200 pystytasossa. Jokaista pikseli merkitn yhdell tavulla, eli
sill voi olla 256 erilaista arvoa. Nytt alkaa aivan ruudun
vasemmasta ylkulmasta (miksi? sit ei kukaan oikein tied, menee
filosofiaksi) ja jatkuu tavu tavulta (pikseli pikselilt) pttyen
lopulta oikeaan alakulmaan. Eli ensimmiset 320 tavua ovat ensimmisen
rivin kaikki vaakatasossa olevat pikselit, sitten seuraavat 320 ovat
toisen rivin pikselit, kunnes lopulta ollaan ruudun alakulmassa.

Ja kun muistamme, ett ensimminen tavu on kohdassa A0000 (heksa siis
tmkin), eli 0 tavua alusta eteenpin, niin me voimmekin tehd hienon
kaavion:

Pikselit:        Sijainti:
..........................
0...319          1. rivi
320...639        2. rivi
...
63680...63999    200. rivi

Nin 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 yhdistmme tietomme: VGA:n muisti sijaitsee selektorissa _dos_ds,
alkaen osoitteesta A0000 (heksa, C:ss 0xA0000) ja siit lhtee 64000
tavua, joka on nyttmuisti. Pikselin osoite tss 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 vri ja resoluutio 320 x 200.

Mutta miten psemme sinne? Vastaus on helppo: conio.h:n funktiolla
textmode(moodi)! Ja kun viel yhdistmme thn funktion getch(), joka
odottaa napinpainallusta (lytyy myskin kirjastosta conio.h), sek
palaamme lopuksi tekstitilaan (0x3, eli heksa 3, eli desimaali 3) on
meill jo aika kiva ohjelma kasassa (PIXEL2.C):

#include <go32.h> /* _dos_ds ! */
#include <sys/farptr.h> /* _farpokeb(selektori, siirros, arvo) */
#include <conio.h> /* 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 tst pikselinsytytyksest makron
#define-komennolla. Tm ei hidasta ohjelmaa yhtn, mutta varmasti
selvent koodia. Se mrittelee makron putpixel(x, y, c), jonka
kntj muuttaa knnsvaiheeksa _farpokeb-funktioksi. x tarkoittaa
saraketta vlilt 0-319 ja y rivi vlilt 0-199, sek c vri vlilt
0-255. Muista, ett vaikka teetkin makron sinun pit silti
sisllytt mukaan kirjastot sys/farptr.h ja go32.h! Sulut makron
farpokeb-funktion muuttujien x ja y ymprill selittyvt 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 tietenkn ole haluttu tulos, sill
40+a pit ksitell ennen sijoitusta, eli sulut vain ymprille! Tss
se siis on:

#define putpixel(x, y, c) _farpokeb( _dos_ds, 0xA0000+(y)*320+(x), c)

Kun haluat kytt sit, niin teet vaikka seuraavanlaisen
koodinptkn (PIXEL3.C):

#include <sys/farptr.h>
#include <go32.h>
#include <conio.h> /* textmode(moodi) ja getch() lytyvt tlt! */

#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 knnettiin DJGPP:ll, on tmn kokeilemiseksi
tarvittava komento: "GCC PIXEL3.C -o PIXEL3.EXE" ja sitten kokeilu
komennolla "PIXEL3".

Painu nyt kokeilemaan ohjelmaa ja muuntelemaan sit! Laita se tekemn
ruksi, pystyviiva, vaakaviiva, tai vaikka ympyr jos osaat, tai
yhdist se randomin kanssa ja tee nytnsstj! Kokeilemalla tulet
parhaiten sinuiksi uuden asian kanssa. Ja kun olet valmis, siirrymme 
seuraavaan aiheeseen, palettiin.


Paletti - hrhelhameita ja tanssia?
------------------------------------

Kuten edellisess luvussa opimme, voi tilassa 13h olla 256 erilaista
vri. Teit ehk jo ohjelman, joka piirt pikselin jokaisella vrill
viivaa ja huomasit, ett kytss olevat vrit ovat huonoja,
puuttelisia, kirkkaita, tummia tai muuten vain inhottavia. Mutta ei
ht - niit voi muuttaa! Ja vaikka paletissa ei mielestsi olisikaan
mitn vikaa haluat ehk tehd sellaisia efektej kuten hivytys,
plasma, "crossfade" (toinen kuva ilmestyy toisen alta pikkuhiljaa)...
Niss kaikissa tarvitaan enemmn tai vhemmn itse tehty palettia ja
siksi meidn pitkin opetella nm asiat ennenkuin menemme pidemmlle.
Kaiken ytimen on VGA ja sen paletti, etenkin sen asettaminen, mutta
ehk mys sen lukeminen. Tss luvussa teemme funktiot, yhden tai
useamman vrin, asettamiseen ja lukemiseen, sek tutustumme
paletinpyritykseen (palette rotation).

Ensin taas vhn teoriaa efektien ja paletin takana. Kuten ehk
tiedtkin, valo voidaan koostaa komponenteista. Tietokoneella
jokaisella vrill on yleens kolme komponenttia: punainen, vihre ja
sininen (red, green, blue). Tt kutsutaan nimell RGB. Itseasiassa
jokainen moodin 13h vri on vain osoite taulukkoon, jonka jokainen
alkio sislt vrin punaisen, virhen ja sinisen komponentin mrn,
eli vahvuuden.

Jos meill olisi puhtaan punainen vri, 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
tysi mr punaista ja sinist). Jos taas haluaisimme tumman punaisen
vrin, olisivat sen vriarvot vaikka 30, 0, 0. Koska 30 on vhemmn
kuin puolet kirkkaan punaisen puna-arvosta, on tm vri siis yli
puolet tummempi! Helppoa! Ja miksi maksimimr on vain 63? Siksi,
koska VGA:n rekistereiss vrille on varattuna vain 6 tavua, jolla
voidaan esitt numerot vlill 0...63. Tm joudutaan huomioimaan
esim. PCX:n paletin latauksessa, sill siin vrit ovat vlill
0...255. Tss joudutaan jakamaan vriarvot neljll, jotta saadaan
toimiva luku.

Eli ymmrrmme nyt, ett jokaisella vrill 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) vri helpolla joukolla komentoja. Meidn tarvitsee
vain kirjoittaa asetettavan vrin 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. Tmn jlkeen VGA korottaa vri-indeksi automaattisesti
yhdell, eli jos ensin sytmme porttiin 3C8h vrinumeron 5 ja sitten
punaisen, virhen ja sinisen porttiin 3C9h korottuu VGA:n sisinen
laskuri yhdell, ja voimme halutessamme tunkea heti seuraavan vrin
RGB arvot porttiin 3C9.

Nyt olemme jauhaneet teoriaa tarpeeksi. Menkmme pikkuiseen
esimerkkiin. Esittelemme tietorakenteen RGB, joka sislt vrin
RGB-arvot ja sitten funktion, jolle annetaan parametrin osoitin
tllaiseen rakenteeseen ja vrin numero jolle nm vriarvot
asetetaan. Myhemmin yhdistmme tmn 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 ensimmisen portin numero ja sitten sinne sytettv
tavu. Funktion kyttmiseksi sisllytt mukaan kirjaston dos.h. 
Ehk sinua kiinnostaisi mys tmn kytt? No olkoon, tehkmme
esimerkkiohjelma kokonaisuudessaan. Kun edellinen pikku koodinptk on
nimell PALETTE.H, voimme helposti sisllytt sen seuraavaan
esimerkkiohjelmaamme kuten ihan tavallisen kirjaston. Muista vain,
ett kirjaston tytyy olla samassa hakemistossa ohjelman kanssa,
muuten ei esimerkki knny. Eli tss sitten itse koodiosa, joka
tuikkaa keskelle ruutua vrin 50. Sitten se odottaa napinpainallusta
ja muuttaa funktiollamme vrin punaiseksi. Huomaa, ett vain alussa
kajotaan nyttmuistiin. Toinen kohta hoidetaan vrinvaihdolla!
Eli (PAL1.C):

#include <conio.h>
#include <sys/farptr.h>
#include <go32.h>
#include <dos.h>

#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 vriarvojen luku, joka on
yht suoraviivaista kuin edellinenkin. Erotuksena on, ett vriarvo
kirjoitetaankin porttiin 3C7h ja portista 3C9h _luetaan_ vrin
arvo. Jlleen tripletin (kolme alkiota, RGB) luvun jlkeen indeksi
kohoaa, joten voisimme lukea seuraavat vrit. Luku portista tapahtuu
funktiolla inportb(portti). Muuta tietoa emme tarvitsekaan.
Listkmme nyt kirjastoomme (PALETTE.H) kolme uutta funktiota.
getcolor(int index, RGB *color) lukee vrin <index> vriarvot ja
asettaa ne RGB-rakenteeseen <color>. setpal(char *palette) asettaa
koko paletin kerralla hyvksikytten automaattista indeksin korotusta
(indeksi nollataan aluksi ja sytetn koko data pern, indeksi
korottuu jokaisen rgb-arvon jlkeen). getpal(char *palette) taas lukee
vastaavasti koko paletin. Niiden kytst 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. Tm siksi, ett koko paletti on huomattavasti
helpompi ksitell nin. Jos olet sit mielt, ett RGB oli parempi
tai haluat muuttaa loputkin pointtereiksi, en sit
est. Char-pointteriversiossa on aina kolme tavua perkkin
ilmoittamassa RGB-tripletti. Toisen vrin r alkaa siis 4. tavusta,
eli indeksist 3. Jos haluat jonkin vrin r-arvon, niin lasket:
"palette[number*3+0]". Vihrell korotat tuota yhdell (number*3+1) ja
sinisen kanssa kahdella. Helppoa tmkin.

Nyt on kaikki trkein katettu VGA:n paletista, joten kysytkin ehk
(aina sin sitten olet kysymss ;) mihin nit nyt sitten voi
kytt. Itseasiassa paletilla on loputtomasti
kyttmahdollisuuksia. Ensimminen on 256-vristen kuvien paletin
asettaminen, sill vrll paletilla kuvat yleens nyttvt enemmn
tai vhemmn sotkulta. Toisena on hivytysefekti, sek feidaus
valkoiseen. Palettiliutuksesta kytetn usein termi feidaus, joka
tarkoittaa, ett palettia liutetaan svy svylt toiseen vriin,
jolloin saadaan vaikka hieno ruudun tummeneminen. Kokeilemmekin sit
ihan kohta, kunhan selitn viel yhden efektin, palettirotaation.

Palettirotaatiossa on paletti, jonka vriarvoja pyritetn
ympri. Eli kytnnss vri, joka ennen oli numerolla 5 onkin
rotaation jlkeen vrinumerossa 6. Tt jatketaan koko ajan, ja vri
matkaa koko paletin lvitse, ja kun se on lopussa niin se siirretn
paletin alkuun. Yleens vri 0 ei kuitenkaan siirret, sill se on
taustavri ja yleens musta. Usein kytetn mys palettia, jossa on
useampia vrej kuin 256, jolloin erona on vain se, ett ainoastaan
osa vreist nkyy ruudulla.

"JA MIHIN TT", kuulen sinun kysyvn. Olet kenties nhnyt plasman,
jonka vrit vaihtuvat koko ajan (kunnon plasmassa on kyll lisksi
mukana muutakin kuin pyriv paletti, mutta pyrityksell saadaan
kummasti liseloa muuten liikkuvaan plasmaan). Tai tunnelin, jossa
vrit siirtyvt kauemmaksi tai lhemmksi. Tllaisia efektej voidaan
helposti toteuttaa palettirotaatiolla. Ennenkuin ymmrrt voit ehk
tarvita pienen demonstraation. Kohta teemmekin esimerkin, joka piirt
vaakatasossa viivoja, jokainen eri vrill alkaen yhdest pttyen
255:teen. Sitten teemme hienon liukupaletin ja alamme pyrittmn
sit. Eli tehkmme viel funktio (listn kirjastoon PALETTE.H):

void rotatepal(int startcolor, int endcolor, char *pal) {
   char r, g, b;
   int c;

   r=pal[startcolor*3+0]; /* tallennamme ensimmiset vrit ja siirrmme */
   g=pal[startcolor*3+1]; /* ne lopuksi loppuun. Tm paletti pyrii siten, */
   b=pal[startcolor*3+2]; /* ett viimeinen vri kulkeutuu kohti alkua */

   for(c=startcolor*3; c<endcolor*3; c++)
       pal[c]=pal[c+3]; /* muista, ett uusi vri on kolmen vlein,
			   sill vlisshn on aina kolme tavua, r,
			   g ja b, joita ei saa sekoittaa, muuten
			   saisimme aikaan vaikkapa sinisen paloauton!
			   (kiinnostava tavoite sinns) */

   pal[endcolor*3+0]=r;
   pal[endcolor*3+1]=g;
   pal[endcolor*3+2]=b;
}

Viel ennen esimerkki tarvitsemme yhden rutiinin, joka tekee
efektistmme edes jotenkin siedettvn. Palettia pit nimittin
vaihtaa ennen kuin ruudulle aletaan piirt, tai muuten voi edess
olla aika huonolaatuinen efekti (normaalipaletissa ei ole mitn
vriliukuja). Varsinkin nin yksinkertaisessa ohjelmassa voi nopealla
nytnohjaimella/koneella nopeus olla liiankin suuri, joten hidastamme
vhn rutiinia odottamalla signaalia, jonka VGA antaa pstessn
ruudun loppuun ja lhtiessn palaamaan ylkulmaan aloittaakseen taas
piirron. Thn teemme funktion, joka odottaa kunnes piirto on valmis
ja kuvaruudulle voi kopioida pelkmtt kesken piirron muutoksia
tehdess aiheutuvia ongelmia. Listkmme seuraava funktio kirjastoon
PALETTE.H:

void waitsync() {
    while( (inportb(0x3DA)&8) != 0);
    while( (inportb(0x3DA)&8) == 0);
}

Nyt sitten hienoon esimerkkiohjelmaamme, joka piirsi niit viivoja ja
pyritti palettia. Huomaa funktio genpal(char *palette), joka asettaa
paletin liukuvreill tehdyksi, sek waitsync()-funktion kytt
(kokeile vaikka ilman waitsync():i, niin net eron)! Eli tss se
olisi (PAL2.C):

#include <conio.h>
#include <sys/farptr.h>
#include <go32.h>
#include <dos.h>

#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 vrit
EIVT mahtuneet ruudulle. No niin. Ja mits kivaa seuraavaksi?
Seuraavaksi tutustumme viimeiseen palettikikkaan, jonka periaatteen
olet jo voinut keksikin, eli feidauksen.

Genpal-funktio olisi voinut kytt mys erillist rutiinia jolle 
annetaan parametreina monenko vrin matkalla liu'utaan vrist toiseen.
Kuitenkin koska tuo oli yksinkertaisemman nkinen tein sen tuolla
tapaa.

Teemme minimaalisia lisyksi PALETTE.H:hon, sek pikkuisen
esimerkkiohjelman, joka demonstroi efekti kytnnss. Ideahan on
erittin yksinkertainen. Meill on paletti, jossa on sekailaisia
vrej ja haluamme hivytt sen. Miten? No tietenkin muuttamalla
ruudun mustaksi. Miten se tapahtuu? Nollaamme jokaisen vrin, mutta
emme kerralla, vaan vhennmme joka kierroksella ja asetamme uuden
paletin. Tst funktiosta voit tehd helposti muitakin efektej,
kuten feidauksen valkoiseen (korotetaan jokaista vri joka
kierroksella kunnes ollaan vriss 63) tai vaikka paletista toiseen
(jos kohdepaletin vastaava komponentti on suurempi niin korotetaan
arvoa, jos pienempi niin vhennetn). Esittelen tss vain
hivytyksen, mutta lydt kirjastosta PALETTE.H toteutettuna mys
valkoiseen ja toiseen palettiin feidauksen. Voit mys itse tehd
hauskoja efektej, kuten feidata valkoiseen, tehd valkoisen paletin
ja feidata sen mustaan. Kokeile! Mutta, tss 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 yhdistmme efektin lopuksi edelliseen esimerkkiohjelmaamme
lismll sen juuri ennen tekstitilaan vaihtoa:

fadetoblack(palette);

Kokonaisuudessaan ja toimivana, vanhat osat mukana on esimerkkimme
tiedostossa PAL3.C. Siihen on tehty mys pari muuta muutosta, kuten
se, ett aluksi paletti feidataan valkoiseen, asetetaan oikeasti val-
koiseksi (muuten feidatessa mustaan paletti vlht hetken normaalivri-
sen, ttkin SAA kokeilla).

No niin. Pahin tiedonnlksi lienee tlt erlt tyydytetty! Viihdy
esimerkkien parissa ja tee mit vain mieleen juolahtaa niill. Muista,
ett palettifunktiot toimivat mys tekstitilassa. Tmn voit kokeilla
vaikka kyttmll fadetoblack-funktiota. Muista kuitenkin laittaa
loppuun textmode(0x3), vaikket moodia olisi vaihtanutkaan, sill et
vlttmtt pid DOS-kehotteestasi jokainen vri mustana...


Kaksoispuskuri - luonnonoikku, horoskooppi?
-------------------------------------------

No niin, olet nemm sulattanut jo kaiken edellisen tiedon. Mainiota!
Tnn psemme (tai miten nyt haluamme asian ilmaista) yhteen
peliohjelmoinnin perustempuista, kaksoispuskuriin. Periaate tmn
takana on aivan naurettavan yksinkertainen, ja itseasiassa min opin
tmn ern lehden lhdekoodia vilkaisemalla (Mikrobitin
grafiikkaohjelmointikurssi, numero 11/95). Eli thn asti olemme
tunkeneet grafiikkaamme suoraan nyttpuskuriin tavu
kerrallaan. Valitettavasti tss on haittoja. Ensimmisen on se, ett
meill on kiire. Nimittin kytss on vain lyhyt aika kun nytt ei
piirret monitorille ja jos siin ajassa ei ehd piirt nytt niin
nytt alkaa vlkkymn, ilmestyy lumisadetta (varsinkin paletinvaihdon
kanssa!) ja muitakin ei-toivottavia ilmiit esiintyy.

Lisksi on todettava valitettava tosiasia: Nyttmuisti on
HIDASTA. Jos haluamme tehd sen kaikkein tehokkaimmin niin kopioimme
kaiken tavaran kerralla nytlle. Eli sen sijaan, ett liskisimme
pikseleit sinne, toisia tnne kopioimme tavaran nytlle nytn
alusta loppuun neljn tavun (kaksoissana) kokoisina palasina. Mutta
miten saamme ruudulle pikseleit sinne tnne, kun kaikki pitisi
kopioida kerralla? Vastaus on, ett kytmme kaksoispuskuria!
Kaksoispuskuri, englanniksi doublebuffer on saman kokoinen kuin
nyttmuisti, mutta sille on varattu tilaa keskusmuistista, joten se
on nopeampaa kuin hidas, kortilla sijaitseva nyttmuisti (nin vain
on, uskokaa pois). Sinne pikselinpiirto tapahtuu huomattavasti
sutjakammin, ja kaiken lisksi meill ei ole mitn kiirett. Vaikka
piirrmme uuden pikselin, ei se ny nytll ennenkuin kaksoispuskuri
on kopioitu, eli flipattu nyttmuistiin.

DJGPP:ll nyttmuisti varataan vaikka malloc-kskyll ja vapautetaan
suorituksen loppuessa free-kskyll. Kokoa pit puskurilla olla
tilassa 13h 64000 tavua. Eroja oikeaan nyttmuistiin
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
    nyttkortin ja VGA:n rakenteen vika.)
  - Se ei ny ruudulla ennenkuin ksketn.
  - Se ei vilku.
  - Se silyy muistissa vaikka kytisiin tekstitilassa.
  - Paljon muuta kivaa.

Muttamutta, tarvitsisimme esimerkin. Mist saamme sellaisen? No tss
pieni esimerkki. Mukana on makro flip(char *buffer), joka kopioi 64000
tavua puskuria nyttmuistiin DJGPP:n _dosmemputl-komennolla, joka
lytyy kirjastosta sys/movedata.h ja tarvitsee mys _dos_ds: ja
siten kirjastoa go32.h. Eli tss tllaista (BUFFER1.C):

#include <go32.h>
#include <sys/movedata.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <dos.h>
#include <stdio.h>

#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 mys ohjelmaa BUFFER2.C, joka on toteutettu ilman
kaksoispuskurointia, jos eroa ei viel huomaa, tulee se
joka tapauksessa viel esiin, ja on muitakin hydyllisi asioita miss
kaksoispuskuri, tai kolmoispuskurikin on tarpeen. Mutta, kokeile tmn
kytt ja palaa tmn dokumentin pariin VASTA kun osaat tydellisesti
kaksoispuskurin kytn (oikeammin ymmrrt miten se toimii, miten sit
kytetn, mihin se perustuu ja miten siihen piirretn
pisteit). Sitten syksymmekin uuteen tuntemattomaan. Katsotaan nyt
mihin...


PCX-kuvien lataus - vain vhn oikaisemalla
-------------------------------------------

Noniin, kaikki wannabe gamekooderit. Nyt on aika menn vaikeimpaan
aiheeseemme, johon monen kooderin taidot ovat viimein tyssnneet ja
jota minkn en viel tysin ymmrr, enk tied osaanko sit
selitt. Se on hyvuskoisuus, sill PCX:n sislt lytyy looginen ja
helposti ymmrrettv rakenne. Ja vaikkei sitkn tysin ymmrr, voi
aina vain kytt samaa rutiinia (kuten min) PCX:n
lataamiseen. Esittelenkin tss kappaleessa lyhyesti tmn yhden
yleisimmist kuvaformaateista olevan tiedostotyypin
saloja. 256-vrisen tyypillisen PCX:n rakenne voidaan jakaa karkeasti 
neljn (4) osaan:

 - 128 ensimmist tavua headeria sislten info kuvasta
 - kuvadata RLE-pakattuna
 - salaperinen tavu 12
 - palettidata, viimeiset 768 tavua

Ensimmisen ja kaikkein vaikeimpana on headeri, jonka loikimme lhes
kokonaan yli, sill tosipelikooderi tiet lataavansa oikeaa
PCX-kuvaa, joka on oikeaa formaattia oikeankokoiseen puskuriin ja
jtt selittmttmt kaatumiset muiden harteille! Tai itseasiassa en
sit selit kun en siihen ole perehtynyt syvemmin. Kiinnostuneille
PCGPE:ss on tmkin formaatti selitettyn lahjakkaan kryptisesti
englannin kamalalla mongerruksella. Kaikki sit haluavat hankkivat sitten
tiedoston PCGPE10.ZIP, joka sislt kaikkea hydyllist
peliohjelmointiasiaa, englanniksi siis.

Headerista tahdomme tiet vain sen, ett PCX-kuvan koko lasketaan
seuraavasti:

 - Mennn offsettiin 8 (fseek(handle, 8, SEEK_SET)).
 - Luetaan kaksi tavua ja tehdn niist sana (unsigned short int,
   katsomme latauskoodia kohta) ja meill on koko vaakatasossa.
 - Luetaan toiset kaksi tavua ja tehdn 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 perkkin 10 pikseli vri 15 emme kirjoitakaan PCX:n
kymment kertaa numeroa 15, vaan kirjoitamme sinne tavun 192+10=202 ja
sen pern tavun 15. Nyt kun PCX-lukija lukee ensimmisen tavun se
katsoo, ett ahaa, nyt tulee toistoa ja toistaa seuraavaa tavua
puskuriin tavu-192 kertaa (202-192=10). Nin 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.

Nin helppoa, nyt viel paletti. Sekin on helppoa, kunhan muistamme
kaksi seikkaa:

 1) Etsimme paletin tiedoston LOPUSTA pin (fseek(handle, -768, SEEK_END))
 2) Jaamme vrikomponentit neljll, sill PCX:ss vriarvot ovat
    vlilt 0-255, VGA:ssa 0-63 (255/4=63).

Nyt yhdistmme 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 etukteen. Voit itse
tehd muutokset ohjelmaan jos haluat. Yleens kuitenkin etukteen on
tiedossa kuvan koko, kun PCX:i kytetn
peleiss. Kuvankatseluohjelmaa tehdess pit kuitenkin koko ottaa
selville jo viimeistn sen vuoksi, ett kuva nytetn oikein, vaikka
puskurissa olisikin tilaa.

Eli tss meill on valmiiksi pureskeltu PCX-lataajan runko, teemme
sille oikein oman kirjaston PCX.H. Kirjasto tarvitsee stdio.h:n
tiedostonksittelyfunktioita 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 lydy!\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(position<xsize*ysize) {
	tavu1=fgetc(handle);
	if(tavu1>192) {
	    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 lydy!\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. Tm siksi, ett joskus on huomattavasti ktevmp ladata
vain kuva, jos palettia ei mihinkn tarvita. Seuraavaksi seuraa
kappaleen esimerkkiohjelma, joka kytt hyvkseen tutoriaalin
varrella esiteltyj rutiineja ja muodostaa pienen esityksen. Ohjelma
lataa PCX-kuvan PICTURE.PCX ja paletin siit. Sitten se liskisee sen
ruudulle. Lopuksi kuva himmenee tyhjyyteen ja palataan
tekstitilaan. Esimerkki olettaa kuvan olevan kokoa 320x200,
256-vrinen ja paletin sisltv PCX-kuva RLE-pakattuna. Voit korvata
kuvan mill haluat joko muuttamalla lhdekoodia tai kopioimalla oman
kuvasi PICTURE.PCX:n plle.

Huomaa, ett ohjelmassa luodaan kaksoispuskuri, johon kuva
ladataan. Nyttmuistin vnkminen parametriksi aiheuttaa 100%
varmasti kaatumisen, tai jos jotenkin sstyt silt niin ainakaan
mitn ei ilmesty nytlle. Mutta asiaan (PCX1.C):

#include <go32.h>
#include <conio.h>
#include <stdio.h>
#include <sys/movedata.h>
#include <dos.h>

#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 ymmrsit tst luvusta ainakin kyttperiaatteen. Eli
loadpcx(nimi, puskuri) lataa kuvan puskuriin ja flip(puskuri) laittaa
sen nytlle (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 vliin getch(), jotta ehdit kat-
sella rauhassa muutosta. Tllaista tss kappaleessa. Mene nyt kokeilemaan
PCX-kuvien latausta. Seuraavassa kappaleessa tutustummekin sitten johonkin
peliohjelmoijaa lhell olevaan asiaan...


Bitmapit - eikai vain suunnistusta?
-----------------------------------

Tnn siis teemme pienen bitmap-enginen C:ll. Itse olen aiemmin tehnyt
kaikki sprite- ja bitmap -rutiinini C++:ssalla, mutta tll kertaa
kytmme C:t, sill haluan niden esimerkkien toimivan ilman C++:ssakin.
Eli mit on bitmap?

Bitmap, eli bittikartta on mrtyn kokoinen suorakulmion muotoinen esine,
jolla on puskuri muistissa sislten sen vrit, kuten nyttpuskurinkin
kanssa on. Hydylliseksi bitmapin tekee se, ett laitamme siihen pyyhkimis-
ja piirtotoiminnot, sek liikutustoiminnot, joilla voimme siirrell bitmap-
piamme ympri ruutua. Lisksi teemme siihen vrin, joka tarkoittaa ettei
sit kohtaa bitmapista tarvitse kopioida ruudulle. Nin saamme tehty bit-
mappiimme reiki, eli teemme sen osittain lpinkyvksi. Mutta miten tm
kaikki sitten tehdn? Koko asia on, kuten kaikki asiat ohjelmoinnissa lo-
pulta ovat - naurettavan helppo.

Eli, menkmme takaisin kaksoispuskurin aikoihin. Siin meill on
puskuri, jonka koko on 320x200 pikseli ja se kopioidaan kokonaan nytn
plle. 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 peittm tausta tallennetaan ja palautetaan kun bittikartta
   pyyhitn pois, mik mahdollistaa liikuttelemisen.
 - Siin on lpinkyv vri, meill 0, jota ei piirret ruudulle. Jos siis
   koko bittikartta olisi vri 0, emme nkisi ruudulla mitn!

Eli itseasiassa bittikartta on pari puskuria, joille on varattu tilaa
siten, ett jokainen bittikartan vri voidaan sil
puskuriin. Puskureita on perusbittikartassa kaksi, eli itse kuvan
sisltv kartta, joka on jrjestelty aivan samoin kuin
esim. kaksoispuskuri, mutta koko on bittikartan mukainen. Toinen on
taustapuskuri, joka on muuten sama, mutta sinne vain siltn
piirrettess alle jneet pikselit, jotta ne voidaan bittikarttaa
ruudulta pyyhkiess palauttaa sielt.

Eli tllainen voisi olla 3x3 kokoinen bittikartta:

Bittikartta:      Taustapuskuri (mit bittikartan alle on
                  piirrettess jnyt):
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 ji on tynn mustaa, eli
vri 0. Bittikartta on kaikkein helpointa mritell omaan
datarakenteeseensa, joka sislt tarvittavat tiedot kartan piirtelyyn
ja pyyhkimiseeen, nimetn se vaikka structiksi BITMAP.

Koordinaattien mrittely 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. Piirrettess
loopataan X: ja Y:t siten, ett luemme yksi kerrallaan pikselin
bittikartasta, ja jos se on jokin muu kuin vri 0 (yleens musta, tm
oli siis lpinkyvksi sovittu vri), otamme ensin sen alle jvn
pikselin talteen taustapuskuriin ja laitamme sitten vasta bittikartan
vrin ruudulle oikeaan kohtaan (bittikartan vrit sisltvst
puskurista).

Eli tarvittavat tiedot bittikarttarakenteeseen ovat:

 - bittikartan vrit (char * -pointteri)
 - taustan vrit (char * -pointteri)
 - x-sijainti ruudulla (int)
 - y-sijainti ruudulla (int)
 - koko x-suunnassa (int)
 - koko y-suunnassa (int)

Lisksi meill on xspeed ja yspeed, joita kytetn esimerkeiss
silmn bittikartan liikenopeutta x- ja y-suunnassa. Nill
tempuilla meill on nyt teoria liikuteltavan bitmapin tekemiseksi.
Ensin mrittelemme rakenteen, joka sislt 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 tehtvnmme on tehd "interface", eli kyttliittym
bitmap-engineemme. Siihen sisllytmme 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 JLKEEN ON TULTAVA TYHJENNYS
    ja ett BITTIKARTTAA EI LIIKUTETA SEN OLLESSA RUUDULLA (todellisuudessa
    tietenkin kaksoispuskurissa, joka kopioidaan ruudulle kun kaikki bitti-
    kartat ovat nkyviss, sanoinhan, ett hydymme 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 yls 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 lhtien kertoo
    latauspuskurista, jona tulemme kyttmn 320x200 kokoista PCX, kuvaa,
    sislten kaikki bitmapit mit pit ladata. Jos kuvan x-koko ja y-koko,
    sek aloituskoordinaatit kuvassa on ilmoitettu oikein, onnistuu lataus
    suorakulmion muotoiselta alueelta tysin onnistuneesti, eik lataus-
    rutiinin kytt vaadi kovin paljoa miettimist. Lis kytst ajal-
    laan tulevassa esimerkiss.

No niin. Lhtekmme tekemn kirjastoamme BITMAP.H yksi funktio kerrallaan.
Rakenne BITMAP on jo esitelty, joten alkakaamme kermn sen pern
ksittelyfunktioita. Ensimmisenhn oli vuorossa bdraw(), joka onkin
helpoimpia ja trkeimpi 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; yy<b->ysize; yy++) { 
    for(xx=0; xx<b->xsize; xx++) {

	/* eli vrill 0 tm vertailu alla ei ole tosi, joten vrill
	   0 merkittyj kohtia EI piirret! */

	if(b->bitmap[yy*b->xsize+xx]) {

	    /* doublebuffer muuttuja osoittaa kaksoispuskuriin. Huomaa, ett
	       ylkulma on y*320+x, mutta koska haluamme viel piirt useita
	       rivej, lismme yy-looppimme y-arvoon, kutenn mys xx-looppi
	       x-arvoon. Jos et ymmrtnyt niin poista vliaikaisesti kohdat
	       ja net 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 hmrn
peittoon, niin esittelen tss saman pseudona, jos se olisi hieman
selvemp:

funktio bdraw
    kokonaisluvun kokoiset kierroslaskurit a ja b

    looppaa a vlill 0 - <y-koko>
        looppaa b vlill 0 - <x-koko>

            bittikarttasijainti = a * <x-koko> + b
            ruutusijainti = ( <y-sijainti> + a ) * 320 + b + <x-sijainti>

            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 lhdet korvaamaan a:n muuttujalla yy ja b:n muuttujalla xx ja
korvaat bittikartan sisiset muuttujat <y-koko>, <x-koko>,
<y-sijainti> ja <x-sijainti> 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 ensimmisess,
alkuperisess sorsassa. Jos yhtn selvent niin voit poistaa
kommentit alkuperisest sorsasta kokonaan ja siirt sijainnin laskut
sielt []-sulkeiden sisst juuri tuollaisiin
bittikarttasijainti-tyylisiin apumuuttujiin, jolloin koodi selvenee
hieman. Olkoot, tss 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 trke, ett ymmrrt periaat-
teen. Tietenkin saat lisselvyytt kokeilemalla muuttaa noita kohtia, jol-
loin net muutoksen kntmll uudelleen esimerkkiohjelman, jonka
myhemmin esittelemme ja ajamalla muunnellun version. Seuraavana onkin
huomattavasti nopeammin tehty pyyhintfunktio, joka eroaa vain siten, ett
sen sijaan, ett silisimme taustan ja korvaisimme ruudun pikselin
bitmap-puskurin arvolla laitammekin background-puskuriin tallennetun pikse-
lin takaisin kaksoispuskuriin, joka on piilotusfunktion jlkeen 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; yy<b->ysize; yy++) { 
    for(xx=0; xx<b->xsize; xx++) {

	/* eli vrill 0 tm vertailu alla ei ole tosi, joten vrill
	   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 sehn eroaa
edellisest vain tuon sijoituksen osalta, eli ensimminen sijoitus
draw-funktiosta knnetn vain toisinpin, niin alkup. tausta
palautuu.

Seuraavaksi kolme helponta funktiota heti riviss, sill niiden toteuttami-
nen on helppoa ja ymmrtminen viel helpompaa, muista, ett X-ja Y-koor-
dinaatteja vhennetn 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 lisn koodia saadakseni siit vhn
selvemmksi. Idea siis on, ett otamme pikselin tuplapuskuriin ladatus-
ta ja laitamme sen bitmap-puskuriin. Eli oikeastaan knteisesti nyt-
tfunktioon nhden. 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; yy<ysize; yy++) { 
    for(xx=0; xx<xsize; xx++) {

	/* doublebuffer muuttuja osoittaa kaksoispuskuriin. Huomaa, ett
	   ylkulma on y*320+x, mutta koska haluamme viel piirt useita
	   rivej, lismme yy-looppimme y-arvoon, kutenn mys xx-looppi
	   x-arvoon. Jos et ymmrtnyt niin poista vliaikaisesti kohdat
	   ja net mit tapahtuu */

	b->bitmap[yy*xsize+xx]=
	    bitmapbuffer[ (buffery+yy) * bufferxs + (bufferx+xx) ];
    }
    }
}

bload on itseasassa tysin sama kuin ensimminenkin 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 tss tapauksessa, jottei tarvi oikeaa
kaksoispuskuria vlttmtt kytt) pikselit. Ei se loppujenlopuksi
ole sen vaikeampi.

Nyt kun lismme kaikki yhteen kirjastoomme BITMAP.H ja teemme lopuksi
viel pienen esimerkkiohjelman, joka liikuttelee palloa
ruudulla. Koska kirjastomme ei kykene estmn ruudun yli menemisi,
niin meidn pit knt 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 tyttyy niin knnetn
pallon suuntaa ja saadaan pallo "pomppimaan" reunoista.

Mutta, olemme taas puhuneet ihan tarpeeksi. Menkmme nyt esimerkkiohjel-
mamme pariin (BITMAP1.C). Siin lataamme bittikartan tiedostosta BITMAP.PCX
ja tausta tiedostosta BITBACK.PCX. Nin nemme lpinkyvyyden toiminnassa
(muutenhan pallo olisi nelinmuotoinen). Lisksi tietenkin kytmme jo va-
kioiksi muuttuneita palettifunktiota ohjelmamme koristukseksi:

#include <go32.h>
#include <sys/movedata.h>
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>

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 lhdekoodeja, mieti teoriaa ja kokeile kaikkea
kytnnss mit mieleen tulee. Kun luulet keksineesi idean niin palaa
takaisin dokumentin reen, ja siirrymme seuraavaan aiheesemme. Menehn
siit! Jos vielkin tuntui silt ettet tajunnut niin ota yhteytt ja
kysy mik ji mietityttmn, niin tarkennan sitten viel tt.


Animaatiot
----------

Tmnkertainen aiheemme on pieni parannus koodiin, joka on paljon ny-
tll ja jonka jlkeen on tmn tutoriaalin bittikarttarutiinit lhes k-
sitelty. Tulemme kyll hyvksikyttmn edellisen kappaleen koodia
tehdessmme fonttiengine, sek parantelemme koodia tehdessmme trmys-
tarkistuksen, mutta itse animointi- ja bittikarttateoria ksitelln
kokonaan tss ja edellisess kappaleessa.

Eli tnn tutustumme ensimmisen animaatiohin. Mit animaatiot sitten
ovat? No itseasiasas animaatio on vain sarja kuvia, joita vaihdellaan
ja saadaan kuva liikkeest. Animaatiota voidaan kytt lhes kaikkeen
peliss. Sill voidaan tehd pyriv alusanimaatio, jonka jokainen
kuva on yksi aluksen suunta. Jokaisella suunnalla voisi olla viel oma
animaationsa, joka saa vaikka rakettimoottorit hehkumaan ja laserit
aiheuttamaan vlhdyksi aluksen pinnassa. Pienell mielikuvituksella
ja taitavalla graafikolla pstn ihmeisiin. Tss kappaleessa esi-
telty kirjasto ei varmaankaan ky suoraan moneen tarkoitukseen tai ole
tarpeeksi nopea peliin, mutta enginen onkin vain tarkoitus nytt
pperiaatteita animoinnin ja muiden olennaisien asioiden takana.

Eli animaatio on kuvasarja, jotka nytetn tietyss jrjestyksess. Miten
sitten toteutamme tmn. Tss on tapa jolla min olen sen tehnyt. Meillhn
on tysin toimivat rutiinit yhden kuvan nyttmiseen. Tehkmme vain
animointikoodi, joka vaihtaa pointterin bitmap osoittamaan seuraavaan
kuvaa, eli frameen. Tt tytyy kutsua silloin kun sprite, joksi kutsumme
animoivaa bittikarttaamme tstlhin ei ole piirretty puskuriin. Jlleen
voit kokeilla siirt animointikoodin kutsun kohtaan jossa esine on piir-
rettyn, mutta se ei tule nyttmn hyvlt (jos objektin peittmn alueen
muoto muuttuu). Eli siis tarvitsemme uuden rakenteen, joka voi sil
useita kuvia, koodin joka vaihtaa bitmap-pointterin osoittamaan seuraavaan
kuvaan, laskurin joka kertoo monennessako kuvassa mennn ja toisen muuttu-
jan joka kertoo montako kuvaa meill on animaatiossa, sek lopulta uuden
latausfunktion, joka osaa ladata useita kuvia ksittvn animaation.

Thn kaikkeen voimme kopioida vanhaa koodiamme ja lisill sinne tar-
peellisia osia. Eli teemme nyt uuden rakenteen, jossa voi olla maksimis-
saan MAXFRAME mr frameja, eli kuvia (tm 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. Nm rutiinit tulevat kirjastoon SPRITE.H, josta lydt
mys joukon vanhoja tuttujamme uudelleennimettyn ja vhn
muunneltuina (sdraw, shide...). Seuraavaksi sitten animointirutiini:

void sanimate(SPRITE *s) {
    s->curfrm++;
    if(s->curfrm >= s->frames)
	s->curfrm=0;
    sebuffer==NULL) {
  Jos yhtn selLL) {
  Jos yhtn selLL) {
  Jos yhtn selLL) {
  Jos . Esittmt rutikpEsits)
	s->c;
    inuina (e2) Jaammabuf)mistuttujmes;

5ivisell
os . Esittds: Ttten hin ei on!

Elskuriin. . Perajrjestse, kosgo32) {
 edossa koon pe  loadammaiamn
krmaank, 1,. Seuraavaksi sitteisimmnyt):
3pid DOiaat(s->MAXFRAMEttm    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 yls saavutetaan negatiivisella
    Y-nopeudella ja vastaavasti liike vSPRITElle neeriskhar *filen   Em kuvia (toppi
livri-
sonvSPRITE.Hittein normaalen sesiukli frnhohes kme e...). Se    i
 - kuraavULL ||ja voaa
tua, e(syvk, sme fedosto {
    char sia. E
Se olikikuvia (a vliaikailla ste(SPRITE * }
}

bs->iurfrmn vristif(s->iurfrm >=bs->  intsMits->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 vhennethypme ja1tuneita n oing) ja seeP *b, iijai ladEsittationle. Niselin
ny&bitmamn
kyttace",a. EK_END))
 )+1;
uusi=0; yy<b->  Jos . Esittationtm a vliaikai yhteSPRITE * 	   ja net mit tapahtuu */

	b->bitmap[yy*xsize+xx]=
	    bitmapbuffer[ (buffery+yy) * bufferxs + (bufferx+xx) ];
    }
    ,itenk  ints}
}

bload on it,kiurrent kuva liisysin sama ksin ensimminensin funktis, mutta
alussa meill os pari alustusta jotts BITMAP-rakenne 

bs->iurfrmlisin. Ts h  ints=  ints kuva liiitnurrent ei iurrent<  ints  iurrentloa
ru	s->  int[iurrent]alustus...). Vain
piirtofunktio onistif(s->  int[iurrent]a kokeile ki), otamme enkkea
kytnnss mit mieleselke tapauksessa, jottei0 + b + b->x;arvi oikeaa
tyy niin knn. Ts hata, koon alustus...). Vain
piirtofunktio ons halutukss->  int[s->iurfrm] Anristif(s->piirr ruudulle, vaan
lataa ruudulta (bitmapbufferselke tapauksessa, jottei tarvi oikeaa
kaksoispuskuria vlttmtt kytt) pikselit. Ei se loppujenlopuksi
ole sen vaikeampi.

Nyt kun lismme kaikki yhteen kirjastoomme sITMAP.H ja teUloit kutosta Bize  on kokoin
selvutostain
sdulta ilett

bloax+

bloaxikail

bloaxio olisi nelinmuot

bloax+

bloaxi <sys/movedata

bloaxi <sy= -

bloaxi <syta ilett

bloay+

bloayikail

bloakseksi:

#include 

bloay+

bloayi <sys/movedata

bloayi <sy= -

bloa
#include <stdio.h>
#include <dos.h>
#include <stdlib.h>

char *doublebuffer;

#include "palLuulkurisi nhpian sdlykudessasittvn YHJENNYran nman ons yhtvhennn
ny&eirin, jpy {
70sitellafikun getctmapksuavat lise, joka ei podoionsa, ackgnkti    ical

raceaitten tehykude   /*imuistinvi-
hirdekooRITE(P75ip(cnlla 	if((b ikkiimetnnot.


(&bitmaptas
#incmita kohturn);
   tion, jhypp
	pritmap.k
salojaoimme stata
.y

tehnyt
sinu(palettle naatin, ti-
sonvSPRtC:ll. Iaaticmita:

dory, 
xs) {
e ot kartaa edellise&bitmauomaa, etseasjoikki la omanme
kelayskokaa poismmenvhtn s=bs- plse&peednnistusts
#incmia vanineesi idYran nnnsadettaent nioi vame
eeaa boniihen ole stamme  tiot kartauomaa, ett kieuistin	/* t
livehdessvuu vria koko suoationle. Niselieen viel ttottujat <y-kokksize; t    karta
ian titytnktioltavan bill rc, 6400in ota yhtean bipia
tehdessmmksttiinielausta,ojn lu
   1
	b->bd vara320+x]ma 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. Hlivjt
sinutnen pase(hanemalloc(64000 saad piens !>
#incOiaak ,s yht+1o edet? Eimpacoca-colan? <stdio.h>

#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 sil
if(s->iurf-itmap-puskur. Nimerkisttorit hoaa va Jlkleen ekurisi nitytnteeen hs Psoipuuskuriin tFRAMi 32uLL)ih();
  ,s yht+dulle. Huomhes kme e.ksiza saa
tnnoten amoijaata,?
rruksoltaittenisk
    bloetaan ne,s yht+1hdyksi     bloen lpinvasien else  tmn tutoria+yy) *e, etthpiansoipuraavaan
ename, chhdyksvorkistustlla laddulliksiHuomhes*buffan);
    seaisy siihen oln. */


ion. y) asettaa uudet Xluem	b->bAon. y) asuraavaaninu(palettuunnelssa tutuikutnoln. *sTETAt+1hdn tauudull
Hif(tavudulle. ferx,mskuri (mit  SEEK_SET);
  isdlibkytth>
#in saad tmn tutoria+naateistaat:

 -b->ysizeavudp

 -loa
r-
stnoltta oohimme 15, 1aavaan
nb->bactaavmrxs) {
nltta oohe 15, 1aavaan
nb->bactaa    noln.1hdn tauutta oohe 15, 1aavaan
nb->bactaa*sTETAt+	b->bd va	if(tavkin on  enerOvan sitko n, tai en else  tmn tutoriakohtia, jon    noln.,oublebuffeETAt+1hdl
    xs tauudul? Etsittvn kaikvan sit1);
    }n tauutta,la ei  sit1) */
:

an
nb->bactaettu 
nltta rtta: j-------leen
ttupern 
nltta vanTun PCX-la1tuneita sil() {
++) {

	/*ienempis tauudul *sTETAt+1hden bittikartt  noln.,oh();
teke
 -ysizeavua psleen voit poiksi mu x, y;inus koodii kokoinu(paleistin10mme ensimmisfunklukoten usta jot[10]xtmode(vasti  y);
   n on lpinll. I kme islskuriin. . Pera
puskurissa 10kin tileja->(s[c]leburjastoomme sITMAP.H jpuskur10kin>0kin--)size+i(s[c-1]lebuffJ   b- ymmkoodiclude i ett kinptoikea00);
hinnot

#ola yysisyldekot juttmte,s yhtt	b->bitmap esit  b-  me
oiksi me tekem juttmn
#ola yysisyldekoalinlmain.

stin	atoitytimoinninmaiikutnlmistammeuttmte#ola yysisyldeko?
E RUUDULL  b->ta kostan stmap. ja1tuneita .h"
#iap.yehdess    blsess PCXisfu edel tta on;
  ,s yht+yy++) { a b

ksikavua hepahelposti y: sctoimiframjossa vo kojossa vobLE-pakatmoinnissa    En
1i kokn edellelty. Tuhtuoipurme reikiatmoinnissa  poisninen suoraku	if(tav#iap.yu edel tta tulkki hypkelman, jott kiemenislsk se nsen.
on  ni vlil==NUctoimifram,s yht[0]xt,s yht[1]))b.h>

e_hypin_kun_nt ma_paien us(lebuffitmap[yuomatakoodii      kuri, tai kol_END))
mme? _dosen nyttyll bittiaaoipufer mu(handlemme ehdesuan
an
nb-yt knan
aMikrobi
pegrafbitmVainymmrr, enkurseen kooja toiosma, mumaa, e
  map;
tai py {
vcnll   krx+xndlemoko luutta,ltta sinYS
   ) ];
y {

  ,t). Sityn. Mu-rakenti, tn

lataa in funktsctoimiframjossa vo kojossa vobLE{->piirr ruhin ei ons yhtjpal
    Yit+yy++)oitte
stBITM
Ensin mrittelkoodiam0; yy<b-uhin ei oa rungineksi.
kohtiaesittels   E 1Pienellns yhtjpaam0; yy<bu edermaanENSIvasti iijaipari muis
sal moijaak
sit asti   /* PRITE.
Raken on an    intjrmeja,unsiance= (allenayy, xx;
) - (allen	yy, xx;
 on
tiedossyunsiance= (allynayyy xx;
) - (ally+loopataan on
tiedoss];
yys->piirr en sx-le=foy-e
stBIs on tmkin formaatmkimistleveIs eivtTE.
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+1hdes 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
uomataptommkoodii      y>xsize=size,teke poikeaa
pvitsee flipertoouomatavasti nta aina. Tuhkistuu
Enjoaintisois-muui
	waiimaatiksi muation( ons yhtnistujva on ko
() {
. Mutta,gropelksiirrymns yhtjze*ysizevleenpkkin 1htaa bimu2;
	} en kap    s();
    fitytimoinninrakulm etttikartta ioidaan d(&biyt kiijaiPst aajadEsit2 jan viel ttot lesi m hisizeanhaa k
    fyetaa

(&b

k  ink
    fyetaa

(ortaa einnsaiP    ipp e.ksizityaion.
u edermatap-
ntrnteen oikein omtyaionsee 1 wsaa mmtyaionsee 2 ujhka bimu2; tekem    seehn
tc(handfer mu(han);
vn aids kuva onnktiohdnin nollaunappeoadamm
+ m-ineksi.
e, "rtn ( buffi

doretb ikki yht
v)afikolESC  ipLE-k osoiiittyskailu alljossa 2.C0; yy<b->  Jos . Esittationtm a vliaikai yhteSPRITE * 	   ja net mit tapahtuu */

	b->bitmap[yy*xsize+xx]=
	    bitmapbuffer[ (buffery+yy) * bufferxs + (bufferx+xx) ];
    }
    ,itenk  ints}
}

bload on it,kiurrent kuva liisysin sama ksin ensimminensin funktis, mutta
alussa meill os pari alustusta jopl1,opl2on
tiedossquit=0, ikkitime=0TMAP-rakenne 

bs->iurfrmlisin. Ts h  ints=  ints kuva liiitnurrent ei iurrent<  ints  iurrentloa
ru	s->  int[iurrent]alustus...). Vain
piirtofunktio onistif(s->  int[iurrent]a kokeile ki), otamme enkkea
kytnnss 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] Anristif(s->loppujenlopukquit sen vaikeamppl1in
seikeamppl2en kirjastoomme sITMAP.H ja teUloipl1in
seteUloipl2osta Bize  opl2osta Bize  opl1in
selvutostaipl1in
selvutostaipl2lta ilettpl1.x+pl1.xikailpl1.xio olisi nelinmuotpl1.x+pl1.xi <sys/movedatapl1.xi <sy= -pl1.xi <syta ilettpl1.y+pl1.yikailpl1.kseksi:

#include pl1.y+pl1.yi <sys/movedatapl1.yi <sy= -pl1.
#includa ilettpl2.x+pl2.xikailpl2.xio olisi nelinmuotpl2.x+pl2.xi <sys/movedatapl2.xi <sy= -pl2.xi <syta ilettpl2.y+pl2.yikailpl2.kseksi:

#include pl2.y+pl2.yi <sys/movedatapl2.yi <sy= -pl2.
#includa iletsctoimiframnpl1,oipl2lmovedataquit=2;rr 2tipuskuri) rittelkdblbuf)rtokmuuiinnsus-
ta enlopusi
ole serr kyvksvaisimmepps kuva li...).  hal
wi#inc
#incl sen v	case 'w':apl1.yi <sy=-1;apl1.xi <sy= ruureak;n v	case 's':apl1.yi <sy=1;apl1.xi <sy= ruureak;n v	case 'a':apl1.xi <sy=-1;apl1.yi <sy= ruureak;n v	case 'd':apl1.xi <sy=1;apl1.yi <sy= ruureak;n n v	case 'u':apl2.yi <sy=-1;apl2.xi <sy= ruureak;n v	case 'j':apl2.yi <sy=1;apl2.xi <sy= ruureak;n v	case 'h':apl2.xi <sy=-1;apl2.yi <sy= ruureak;n v	case 'k':apl2.xi <sy=1;apl2.yi <sy= ruureak;n n v	case '+':aif(ikkitime) ikkitime--ruureak;n v	case '-':aikkitime++ruureak;n n v	case  27:aquit=1ruureak;n vktio onelli	kelay(ikkitime)funktio onistif(quit==2 serr mmeneinnsman, jofeiilaan.  pyyhkvaltaan en (rjleens)...). s.h>
whiteb->x;arvi oi	t kaikkitime=0Taikkitime<a PCX;aikkitime++movedatapill osikkitime]=63funktio onists.h>
#include <stdlib.h>

char *doublebuffer;

#include "pal ladEsilkutsun koaa
tblbufavu2=fgetcittikark rungia Jlkleenians   Eni tan aln mv tityt

#includdle=f

mu rungi

#includi];
TEEinen s	    telkdimmef((b   me
sipmme  m.t oun, urisksvai int vktiohdlatausfune 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
tblbufprisesrunko DOia
}

VY:t sitematmoin ei pikartan:ndulle. Hueneppsumtyaimbitmap.y.
atikvelLL) {lle.ngi
tbb) {mtytjzeosn sit1eltyohdni=) lkn esitauri tuolla yy++) { 
x]ma on otettu ma lisin ohalsize,tmap.yspvasti  yessan
kuvluulkurisi ntuuskuri b->isa, joka saai
     pien an lle. Hkutenyy) *mitamanmt

    /onn oing) jaien toimivaandle)<uri tuollaipLEletti asuleen
    urhnnisstuksne va in fJlkiktia bisamme
iin knn, joka on)) {
	bdraw(&nprily joka osaaarjaasulent y=bsamn an tioss Ttteei
datartylkoo>xsi doub
       ermejSen peittmvriahan);
c, 64000/4, ekemttmoikeavoi en toimi stamit a jrm >=bta,oann, rx+xxka on pass alle, taak
stule{
	bdraw(omsta in kurauk vri),oikeeed);amme on pass alletsun koaareturnessa on lptmap.ns, 1, 1,;
teaisiu(hakme viel piit voi siyytikartatittv - bultmt on yksi alon lptmap.ns, 1,sest t);
inkerna
 nkivomston pi-
jSin k vai.hun kohypin lo-
vn kaanimaay++) { 
e=foa siiakohin samRUUDULLipust)

Ltan
datp;
tai TMAPtRadttyker")paleen koodia
ssine,
o*bitma. Pin lasetmap.ns, P.xspeed y+	b->bdppdnnisn P.xspeed  t()) nnjoaintisois hillTMAP-------------------------------------------------in fJn s	  asit1ahkert)

a uudet Xitytnne t    /*ele hpiansipuraavaapesit. Me   }elty kinappiaretyekuvia, koelty kiongselijaiparha joilkun sbultameppennaisisn jumiutumln.,onappitahansaien tejt eroaa vjenerTatio, jonka.h"
rn piKUTETA   bloe siirstin	/idtan lkhjoka Tatio, jonkaepps handl
an!pal("B, joillopultahett laitammePieneaan
lnappiarpesiaa
kytua he, ackyskaytyker 9oko suoruvaandaan d(nppdnnislheportmivaa60h (0x60) 1,semsesti ktta ASCII:n kujavudulle. fppdnniskuva lii) alle. Huepsuohn
st sijax]ma ;
	exit(1ians handl
an);
    b-siaani sil-eisimmmpksuain
simmASCII:n kea00);
udulle. fppdnnis Seluko+yytikartaa oohe konaanEn
1umme
anp!= 0)okutsun koaaLLipusPCXisinearn
lnappioe siionka jt maa bittikyskaytyk,t - nPieneaisllyelnapokonaan + 128mapsijaintkorv ko
ehdektio,naantio,128a
	  lin ei pytikartaa oohe ko Selukottninearmi
tblbun kappaini C+lukko?"pal nklukoten kap128aalk ||
,aletteatausfune BSCAN KOODILLEvun kotbb) {fppdrx+xnis syyt a b
ikyttm);
ker numeronvSPRopmpi.n ,dellaan
jdaan     }ESC-fppdn koacajott kiemap,ebufferSxESC j ktta naan kap1inen suorae	if(ta
	    bilausta,sois-olESC pesiaa yy-,ta kuitterippdnniskuva lii)vlil==Nkeyk, smeSxESC]==1)a vhn
mSC pesiaa y..). Vairmn vristemap,ebufferD_SCAN.Hinearikarttaratio, jonka.h"
edellioko suoruvaa
st lasportmivaa60h kta sinne vai 15, 128ase
udulle. ytikartaa oohe k - Selukot varkkmta
pkta sinne vaiys jkurauk se formaa128man    foize; ytmap[ilty. vu-128a  lina vanL
    xtmap luemme gn, 320)PICa-
x(nimi, keaisikaytyksette);
valmiskohtiaoumisen at las20h portokmuu20ha bi
tblbufoer==NUs handl
ato kaKEYBOARDuskuriinrakenkayhandl
mutta
aluregla yr une gnedussa mat l=inportb(0x60) sebuffer==Nat l<128) keyk, smeat l]=ofunktioelse keyk, 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 Tt t)lettuuukumisfuntio, joaonkaeppdnniskyskaytyk 1,semoinnissa s - bites*buffan)eppdnnis, mutifja c
#s,>
#inanim
e=foaonaisise
sip;
	} ettninn nollausatio, jonkakarttaa   kokonais-
tll ein  - siiauriinralat _doune gnedussa mkeyk, sme128]t {
ateistclud_. Es_dpmi_seginfo info, originalVairmneyk, smluksen)eppdnrttarilmt o{
ateistcPienellis-olpainihandl
a a osoiniaa yy-lebufsn ne,
	s-i nle piirreaoinppiimtattuin kument kernkiurfrmsa funfon)) originalsin ouuukumiek pa flip(ukumjotka (ho sig)vkin onek pasessja Y-kiaatteita iiihen mivaaunfon
datarakenians aoinppiimtpa fliorigiehtyan voimksenrakennka
myhandl
anta kuie voi siys  iurl+)oitt 20 19."pal ladEsinip(ukumjotkpa fliesittelyhteytt-ja Y-ko fgetcitti on ) ];
erehdysikaviui silipust)
Y-nopeunfon
en ntako>, <ntt

DJGPP:n FAQ:takhak  }
a
takhandl
uden rakentetkayhandl
mutta
aluen se;Esits)
	s->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
meppennaisishandl
a (tikar*ele ikartan:n
llytmme seuraava).PCX", Fixedtuksenn	atemtokmkkMAP------------------------b->bAl y * b->kuhiljsa emap.ty kurseeit(1);
nd k( Iaathin satorva
puskuriint xskua?)mapsijaiP.xspeedoopataan it a jrprisdYran nnuunnasskulma-kiasestkijistujvatpal(pa*b) {aitan:n
b->backgikseen  vristrha j(osa, jityttn koonta nartaa e
tehnyt
st tjo e  vristrssts    mointlit
fixed onknnuukettookupoko[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 samn,uC:nuen io bppioonkureissahankuulenlkutstisoe 0)okuetyn btaa da uu, 32ankujn lon stamda uu, 32anvuleistiin  - Srkin vain ,n
jdaan    ons yhtvhenniiako sin  me
sipimi, er)

voiten o    fot er)
lin
bitmapaipa.y+biRadttttor
puskua ttenr lhe sinYhjus onknit ahanntynealkuperi muieeohjelmaspuskuria v10Pieneaisimelln formaa
	   ;
hipin 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 vboniihen ole stamhipaett ([bit jitntium-Yran ntunp!= 0)oku     ize*ysize), esit-muutssemblvitsee eed= -biitntium jaietemtokmkkMpro osoisstmap);



(paleepesiole stamj tityt ot kartaa). NiinpCX-la1tuneiisisyi ku
y {

b->ban kyureissahan ltsee da uu, 32ankujn Os-olpaini en toeen osani si? airmn /* Lria v,la ei oordinait a jrLKEENua tokumentno, ea voiankujnuem	b->b. ja1tu pien antte);
ureissahankujo eje da uu, 32jo efikoly++)olle,ia y. esimeissahankujo see eed= -biilmarsst10^<numeroja>ianku animaa sinc();
	fahankujo ten kap3 numeroaoska joiltte)ilmarssttstiso10^3=1000
vitsa
kuvluku any++) { 
-999aninstosaaarKEENua puole(palettuksi mume reisien eNua tokumenmumaa, ee ja1tuneita ion. y) 
++) {

	/*. Viltte)ilmarssmmef uu, 32jo see da uu, 32
    bload(lette10^<numeroja>:sosaa bimu2.


Asekuril, mumaa, eyy) e
sipimi, aintisoisy2-numeronnealef uu, 32jo ,r muutt    snief uu, 32a v1/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->baviiankujn 3arTa tuolla0;
}; ytmun luoinnissa ekemja 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 flirkkmtkkeen vo.
	prinysbuffele imi, a izehy{

animatottuS  izeo joka saa ehy{
:n edelln kapkin kuluku an0.1 fli5.4
tll ike yls -uhinaej, lidulliniaa
kpanvasi  b->by kooseoe:n0.1*1000=100 fli5.4*1000=5400. Hke yls -uhinaengij, li:
100+5400 = 5500. d vasestikisen at tuolluden 5500/1000 = 5.5 = 5.5 (5.4 +n0.1 = 5.5)us koodiiaintisoisylttmllas! 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 tmllas 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->xsimllas. VintsMjakaa mei,tamaanha ;
ame koodia 
umerote#olatseenne ten
    taan iavi, ainttlef uu, 32jo ,reli
3pid DOkistt  xs  Olkmllas 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}

yultahetyuomatakotiinit limell)

adrl+)oitthmxspetusta,oknnut nbinri tmn elmoij Se);
erttttorTt tytTexit(1
ntt

32- vieltta ooeissahan las(une gneduen )umme
an16  32
t) {
	bsoisy
ntrxspeeef uu, 32jo seeap-
   binri tmn elmooisy2-kanauudul *mode(
tcja1tuneita ekemx-sijainb->kuuleuraarpeekrtaitp reissas anilesi m *hka vanal ln ja aniln lsee eedonka.h"

b->ban16- vieltta ooeissahankujo n);amn olennaen as2^16=65536 hd16- vieltta ef uu, 32jo      rei     snief uu, 32a
v1/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 tm=NUrb->xsize   ize  b->tleanal ladEsini    seehonle. Niseli    blodemonstrja fixedi+1;
uusi=0; yy<b->  Jos u */

	bn rakenis, mutta
aluune gneduen  i  b,mllasTMAP-rakea=(une gneduen )(5.4 *n65536.nts=  intb=(une gneduen )(0.1 *n65536.nts= b.h>

llas=a+         vhn
A+B=%f\n",mllas/65536.nts=  intb.h>

llas=a-         vhn
A-B=%f\n",mllas/65536.nts=  intb.h>

llas=(a*b)/65536        vhn
A*B=%f\n",mllas/65536.nts=  intb.h>

llas=(a/b)*65536        vhn
A/B=%f\n",mllas/65536.nts= }                                  b->b."

m)smemputttmapben patenineas l
    coppi
ltean edesohypin  muutttt ko sin (toppi
liv-eisimmn    fu ole piirre
ktale piirre
ktap(c) _dsemopvitsee kuvia (teksii
simmoppi
livri-
fu ome
aen kooja toi

    dolisess! Fixedel omiten kapoispuskuriysize, n nauden 1) Ln ltPoilkun () {
ys jisllyeloka n vaintlla ladduJakaa mei
jdaan sl
osscnllkoituknltPienela a: niinmaa 65536:00asittvnme reikie ja lpku ()l
oslivymprittui nartaa esit e,PCXisfeysizelpku  ja u() {
ympritden 2) K.
at vieloperli teeap esit ormaaien toimiva.
32- vielttker")
os16.16-fixediimat(ipuskuri) r16 {
	bsoooeissah- hd16 {
	bsoef uu, 32l
osjo see)ko>, <ef uu, 32jo  n  me
. Me   ANDn kntuiden  kina0xFFFFtb.h>
ta ainu Vilt);



(uksi m nvarokkay kioran nnuuksi okta sinekemtekl
ossite   iz. Mitti&peeleenstspeed);



(ataus v (tikhnyt
).b->b3) S gneduln ltPkoodia
tsa nn ten
   y320);
  ndaankat-muuetuudet Xl,. Seueli
16.16-lpku en io bppinsois-muu->xsizei
15.16.b->b4)b, l bsetmap.dpilklasptt

ap.xspe astine vietjzeef uu, 3LL) {me mainen onh>
tli 32 ankujn lxspe astine vietjzeureissahan ltse{me maitmkin a 1,seSeuep0x13)i 32 ankujnPCX", Lookup-tablet voi sy kioran nnuuviuiktjz <stdio.h>

#define flip(c) _dosmemputl(cb->bLookup-tableikartt    iokupeikarin. Mit->xsize; xxsiaanipa). Siessasirvoon,ey+biRa)ollestrskaiselekemrau,( Iaat  kaletgnktyt
)nkiurfrmsae*ysizevnaisiet);
imut tuolnninr meikoodiry, 
xs k( Iaame reikekemle ntaai
 ) t ahin ei otulokitte
uktia b C+lukkooi ke, senuen.
   nme mailuku    blsetaavmrurfrvoon p meikoodiry, map); n moneeyako kuvassa *sTETA -uhinmblbun  C+lukkooituS n-  bsetspeedle n -uhinae=(charn DOiaatesit ammaiijainb-akmekond, ysp ntfunmaaradime
e    o(3.14*2*ntf/256, 256:enpoi. Menk se nnlei  Y-n+rtofu60-ntfuna 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 ) ]kme(short)(
in(3.141592654*2*t15*/256.0)*16384)mme jaNun koaakaotbb) {oran nnuuviuiktjzuden 1) Suar *)nyt i),oikeaiP.xspeedovtnisk
tutssemblvitseeinn nousta,on
enl
ossemblviti ke,stspDJGPP: { 
emutta
alusDJTUT2_4.ZIP,<ntt

MBnet jokaden 2) Kksi mume rtuclude , <nen ollu xx;etarktnisk
n ulkopuole(peerajrpuskurissa 1000000kin tilleta==b)Esittds:[c]=0Trrakeos-muerajrleta==b)Epuskurissa 1000000kin tilsittds:[c]=0TrajrVtkorv ko);
n)1000000<nen ollua.b->b3) { 
euhlalude "p
}
ran nma

    r *)nyt i),logkmkkMrtt lendfer mrajr
puskua Mithy{
.b->b4)bK.
atfixedinfloa in
teke
p esit ormaaien toimiva.den 5) ruhintiksi muatrskatap(nemtblbufauhinntab C+lukkorha .den 6)bK.
atDJGPP:n iin psv l bs2
t) -O2dle=fojop) -O3 (ti. Pin/* Lrmksti 
osjkkin 1si lLL)ustataden Ys allsijauk nartaa uhrikeaa
jraamuisaegrafbitmV  vristjre
ktain i  vriisestjre
Yran nnuunnaja DOiaatmap.drunko selken C-kan nbitmaytua jre
koukkoehtyaa bimu2eiaa
jrale nta j kttl}

Koillclude , normaka sejniot karta2uLLehttykerPCX", VTE.Hitttulokittjnista.
ejMAP----------------------------"pal ladEsundh
19sleessat
m)smempmuation(-poinn    frnhohityt

#inclnuunnsessja ase(hTnimatlpienta ematmme olsin satole stamntkor    text letmapopl on anim tioss vkin one
sipitionle. Niselin lxspeanimatematmmesessja itt vbaaotbbjtion, 1, kykytjo anipov tau {vastai1si on pi-

	bmove(&bitmaaintisoisylh"
hypin,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 yhtmaka sitme kon lpinp.n  (  me
. Me   tseasbittikin on  ta jotta BITMAP-=fojaa

(&n lpinp.nHkutenssja ittsisasittnunaDOiaatharn . Tuy, map)sitten iap.y
ryt ks tmn eeen yjLE-pa;



(kaan ky saaljon ny-adellaanaadaan a liikkndaan t a-z,
A-Z,
-9 hden bitt onan) jaien toimi stamssja Y-kiaaeen onle.   Y-k reisi.!?,;:'" voi siyytikartattuS treikekemsolta. Tss kappale voisi oitellk osoi->xsinttiengijloetaan ne,.,oh();
oka osaas - ornissa en   Eandaan d
leveIytth>(plusoh();lla0errt mieijoka saa nndaan d(ja
. Mutta,+yy++) {e)map.yortaa e.xspeed y+joka saa nndaankih()onndaan d

	bKt kie0;
}
.


(ntt

t lhuden raken vhStvhgrfrmlisstvhg olla maksimisutta
aluen se;Es
	s->puskurissa stvlen(stvhg)kin tleennimettynletstvhg[c]>'a' &&astvhg[c]<'z'lleennimettyn jasetitelltstvhg[c]-'a')Trr aleistinitell 0a   intjrrrrrrrrrikeafrml(x+c*9

  rr daan d(leveIs 8n+rtlkuperixsizeppin);
   intjrrrrr oelse letstvhg[c]>'A' &&astvhg[c]<'Z'lleennimettyn jasetitelltstvhg[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 letstvhg[c]>'0' &&astvhg[c]<'9'lleennimettyn jasetitelltstvhg[c]-'0' + 'z'-'a'n+rt + 'Z'-'A' + t sitten animointr paini Cassllyel    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"
uraavaapnstosllyeliksi me tttmapenht+1hitten animointh>
numerond, joka osaa   intjrrrrr} intjrrrrr...itten animoint

bs->iurfrmn reik*ele hpiansipsllormaka tio,nin, jkammoisstuksnekasotkd kohdoymme smapos saipufer muhypin lme inn nollautt kien. Miterttyitka    rani si,ttiaatkutsun koaavaan
edesomalloc(xsizekoodiidulle. Huomela0;
}; yiot karta2uLtet? Vtikattot lookup-tablettmap.yspmuffen samnne taavaaC: { 
ttmapenfoer=ekemnumerony++) { 
-255. NiinpC	exit(1 Seluko+yh();
    fadeaalk | yesn btaa en.
   noa ruitta ASCII-ttmapebu jtion, umerom kuvia (toppi
liv      ytladEsittationle. 1 Seluko+yke,stsera
ptell = ascii C+lukko['a'  sebuAscii C+lukoeaalk | 'a' ( umerona 97)leistin0    rei tion, umero   xtuisti  ni poi.appainilpkutuS treikekemtion,  voiso: "setitelltitelln".
jat <y-koktuoauk nartat  xs.


(ni v "setitelltascii C+lukko['a' n"..	b->bitmap uomelaikarttara+lukko
     e
si? Tapoohdoym);
i
tllenfoa
tsemVainvain a 1,
tllenfy monettl}
in keest. Aa;
    nunaa isioe stisiu(hurneutt aras. Men toimiiamn
eistininmaa t



(pa+lukko
  linapa (  bloaisti  kyv.

El) hden bitt inuina aakkoitta-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 vhenniia 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.
mvrktesit aoko luutinista.
ejM    bloien toimivain. Jl
hinnocmit,<ntt

);
iainvttaittsta.itPCX", Mastttut

voiten----------------"palV Jl
muisaeen bittienro20)PC-O
#inclnuu -l voNua t]ma ourseen nohdllker")ebufikinekem  bu ()nprinysbmsimmmpnpstpa). iktltmap 32amastttutr=ekeamasttaclude , <,s yhtt	 Maanha eikielut
edesosbullut
mooja toien nta")ebuutsize [768aoaaLLipkayaa Skem-kokkslsee se ;
	eikoaaLLu
   1
utssembeen vitsee    ranyehdessnanineesi id   rivp(c)esee se esn btautui 11Pieneai
imelln ole ormaaiiaanm2 ankuaikarttar  karimaathdess. Ailtytai ea). S
[768];t]ma r  niikaLLipkayamapsijaiPinns. Sk

(purvavyengija
.almistauisiseka !>
#Mastttui
  ,s yhtjre
[768]alettcx(nimi, vasti naan aokarin. ssja alkupereen oi (miain Poen ollu xx;ea al
tblka koko kokoiseed= -bi;



(kssemblvitseen a neljn 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
uktia bn  ki    bload( poismtioss mapoilaanaadaaperixja 255 ta jotta iaaiheooss . d vas treikekemammaiie; ytm  ints kuva liadaaperi
 -yoogitta AND-operli teluden Mast)

voi
 - FF 00 FF FF>bduusien animoint4F 3C 93 5AAP----------------------------"pTllas en animoint4F 00 93 5AAP>bKuthinhpian sknjermat ta jotta t oohe t (FF)jokajetleanS treikekemin
sy luemmOR-operli tor  Joytidaan kyes yht+yaaperitsittvnvePiaalenoa
tj se fhinn( 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, jtutssemblvitasittvnC: { n kapv x==Nap(ntrntl ole
kytth>is, matuston pi-
juvia (traa kunssa tssembeen vitselekrsiui silDJGPP:n AT&T systikin ,nsuoxspeedoopoka saaia
emutta
jauden ASSYT.ZIPmointAssemblviti alarktnmuom
   .
PCGPE10.ZIPmoiPCGPE nohdl

(uksiyy koknvl nollautssemblyltmap 32 .deDJTUT2_4.ZIP juviaessat
Ineed-systikinn ten
 ktnAT&T-systikinhitten animointh>(movw %eax, %ebxmoinohdl

(bittisiaaniPinn
aluvahitten animointh>ietemap 32aittikartladE-koktutmap 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.nvSPRopmpi 486-

#inclnuuethybload(muom
nkan nadeaassemblvi-

#inclnuuaiP.xspeedovRopmpi  poiksieisil nollauatau
aa
tblbu!AP>bL
puistel ttajokairre
kia
mviuiki Pe

Nu,PC tauttuin ts kuva linleik nartaa ssja Y-eITMAPiap.ya,+yyerrt levemmn keaimi,  sinspiteay&ei+bitm kita: j se fneljn at lastnktiotrin. suoslly kooja toireunnta")ytikarilu alljaa

(a engitmaj.yuokuaaat:
nireunorha ittikare 0)a nnleen bittiopi ole
.
atleanpari   ints kuva liadkoo   xtuisti 328x200PCX", Hiiruloln.,oh(kanrokenpm2 atan:nkien.h>

#define flip(c) _dosmemputl(cb->bT&bitm, tytbillojit,<sevaapuhuuait a jrkotaa kdnnistanpefoa
tsekotbb) tt    skvaltaania tkisasijEs anieedlnt 1,
tlla
. Mpoisstunn	at

VY
Senvl nollau   ize ja uittikolnapalu smanbuffi

v - yaaretiirrymkarvole staule00);
tmapbaidsvSPRtta,oknnut nl noudulle stauttikarhiir
   -kokksua he, ."pal l { 
tarvotel	s-i nykervl { tte);
sd

ma );
inhaaroja sukupuuaen a."pLita Logitech2aitMicrosoft2aitTargai  po>ieIu(han)visin 2
t)  poiksieisikukkur ole rnni taspoismtskyt eroaa k  /onammabze; xxsd

ma
epstandardin Osn
   ohuunnari

Koanntynta,+yyuen tevanhaa   p,ebufkista _hiirikyskaytyk_,iPinn
aluvtan:n
ilmars n kyskaytyk 33ha bier");yskaytyker ke, senu+bitmap.smempunrhiir
ta tungaa yjasimemppenht+Y-k reisinappitahllohj ten (ss all)i&peeimaanpalsikaLLiiapaipam 
emuttisin ohetaaittiaassvuudenvl nollauuittinauritturin Tt t;
uusiainY-k nhaikekemssatorx+xnmatavasize*ysize).in fJn s (traa ku samRxnmata;yskayty tul
datarakenllyeltladEstaivnstoliikk      )+1;
uusipDJGPP: { . Kyskayty ti
 -aniaa
katpalmetri srekla yreikar")ebuferx,itmap.rekla yreikar
juviaDJGPPsilkurau, uolen oormaaBorland"pTlrbo-++) {jinut nuistin	/tvk  /rekla yri axp,ebuffer_AXvjenerMaa, ettsblseiksi mu x, niiyattekaay) 
++) {jl { tte)hi
 ufv x==Nn ole 	exit(1p.n  standardiNua tokumen. Alhaay) 
nettt-ja Y-kotutskeleata;yskayty tikavu osoumimta
pktarekla yrisaaveplel tta vanEtionle. 1
sy 

(rau,anntyntai, keaisikaytyksename, chtaai
taa_END))
ivaaunt86(anim
opmpi.nvSPRtmapbuden 1) Tatio, jturekla yrize+xx]=
iirtn nohdl
maanstrucuuketunt86:n . Tuy, map)
osstrucuuemap,ebufrakenREGS j ktta nohdllEsini pab-siaanistrucuul onhinittenttelstu <ntt

styaimboismti.
opmpi.nalu e ols;
erehtbmsimmay}
an:n
oslarha jx, a mw-tteita isii) a ladEse
tehnyt

sy luemmment ker,   blseten v16- vielttturekla yriz.Es
	s-strucunREGS rekla yriz;den 2) Tunga
iksi mumpalmetri su tosaakiurfrmsasi.Es
	s-rekla yriz.w.ax=hypin;
	s-rekla yriz.w.di=siaan;
	s-rekla yriz.w.cs=kia
a;b->b3) Ksua l versiollaunt86(vektmaetunpu
  nrekla yriz,eoumpu
  nrekla yriz)Es
	s-unt86(ikyskaytyk,t&rekla yriz,e&rekla yriz );b->b4) Kksveitesii)akiurfr
eeanrekla yri
pktateistnnbufer+xx]=
ia .den 	s-uhan=rekla yriz.w.bx;
	s-Tt t=rekla yriz.w.ds;
	s-Tocmi!=rekla yriz.w.cx;b->bTehdniia vrhiir Nitttuasjkkin 1ittnunaDOiaatssatystamhiirittioan samoin etmap.yappitahe.xspeed nvl nollauetaan neourso
a at:

 xt levas treik  meiin
sy 

((aclueednitka  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, inttiengijkkin a r  ijnimakan!palekstiemapITMA void, <ntt

ti.
oohe kortta; n moneoka n vaiettarilm k - telstutte)k (mipuolinanimaa atsuoruvamistasi  sin  meitp#iap.yuekstiemapainymmrr koko suo;



(uurso
aa..	b->b ladEsnbufeistiin  n moosmempui
c, 64000 vain-poinstolkoknvnnisstuta. T piKUotinn noulydtanntt

ettaRalph BrowETA i on ruptiimivavSPRtIaathi>ieImapoplHelpPC:istanRP:n imivaaon
MBnet jsp,ebufferINTERxxy.ZIP,<ellaanxxfoer=e, yspnumeron(sme 48tipuskuri)en 4.8:aa) hdy(&b
etemnumero,tmap.dimivavp)
A-E tjsp. voi sy k
 nkimapebianaadsihdl
yy koknmupITMAstyailuymmrr komekond, kdblETA WindowstorTt-kooseoevjeneerMaa, Y-k rei lupaolluden F bsetsp0 - Hiiritt     us
	sPpalmetri : AX=0
	sPpinnissa:  AX=0  sinajse rin. Mitlnateisntu, FFFFha sinYSlnateisntu.den F bsetsp1 - N.
atiurso
a (s - auheallh"
)
	sPpalmetri : AX=1
	sPpinnissa:  -den F bsetsp2 - Piilikark rso
a (s - auheallh"
)
	sPpalmetri : AX=2
	sPpinnissa:  -den F bsetsp3 - Annbull piirtokinstappitahemap
	sPpalmetri : AX=3
	sPpinnissa:  CX=x-ioan samoin  (0...639)seten animointh>DX=y-ioan samoin  (0...199)seten animointh>BX=appitahemap (;
  n0tikan
lnappi,);
  n1u->xsimhitten 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->xsimhn2ikyskn-pomntt)
	sPpinnissa:  Me reikk rei   bsetsp3eest. All piirtokinienelkun sbrso
anseten animointh>siapenETA menthpesitlsikseapa hdBXPienellti.
napokopesitl-seten animointh>siksitahnyt Mutta asimentkksua n.den F bsetsp6 - Nappitahvapatelyhti
	sPpalmetri : AX=6,seten animointh>BX=(hurnnappio(0tikan
,n1u->xsimhn2ikyskn-pomntt)
	sPpinnissa:  Me reikk rei   bsetsp5eest. Avapatelyhtnt 20 19."palF bsetsp7 - Vani tioonelyhti
	sPpalmetri : AX=7,seten animointh>CX=    snio sespeu X-siapenuuetten animointh>DX=h se nno sespeu X-siapenuu
	sPpinnissa:  -den F bsetsp8 - Py {
tioonelyhti
	sPpalmetri : AX=8,seten animointh>CX=    snio sespeu Y-siapenuuetten animointh>DX=h se nno sespeu Y-siapenuu
	sPpinnissa:  -den F bsetspB - Lii karr
	sPpalmetri : AX=B
	sPpinnissa:  CX=vani msi me tarr
	sn animointh>DX=
y {
msi me tarr
n F bsetspF - Mie.   lkuperi moohe  ittePpalmetri : AX=Fseten animointh>CX=vani msi me tarr
	sn animointh>DX=
y {
msi me tarr
	sPpinnissa:  -den n nollaukapvaa kuesit-muu  bsetspCoko suoaoirtaa ians e.xspeedijn ten
  mekouskuriaizelpulkurisi nPinn
aluRUUDULLmo
t) (rm-a kuiea, eydo Y-ko f.xsp piKedijaize*ele   b-sa koodi PM:adEse
n poismjenee.)joktkoaaLLiladEsuen vo.
S treikekemso kar bisamme
maaiin a r si Niselin Etionle.ejaizelly - siial
tblka koksntisoieedistatausfun py {
vcn
adrl+)oreikiissti najoilleeseen a kyhan kymap.akenyydsizevlgijkkin a.in fJn sTocmieei

tehny
sip;kuvluis
   ayhteyttiLiladEson otettlaanaaavmri  meepselvyy tul
    /oiahan)j, .y+biRaijauksvedoopl nousta,on
edh
19-

Erttyitkiitas t]ma on otettu teonvnnissmoja toisbultu
m)sn/* LMB:mnumeroseen e 4/96mme
ana ei inmimell)

taivnstolmnrhiiri_END))
iva.den Jniinmason otettlaananyt
uuden sbjeeama.

stinolev a r  stiemapik  m32
t)helposti yne
kykar
.PCX", T  stiemapikP.xspeed  ammab k -#define flip(c) _dosmemputl(cb->bT&ai, kn otettltisllyelllyt
sipyt imnitka lyhyt. AinEandasize*inn
aluvahelpt

han);
r  stiloa
rnta kuie (emap 3, 80x25eesittisiaaPoilkun koodia)map.ytteitenerO kuie o najoilloa
rntseg   dti B800htt    inutarblbufo kuien PCXektman liis_ds esn btamnyttyoa
rlaanaaasiaC: { 
0xB8000. Rteitenn kapuittinauritturin y tuihen olnailu rona VGA:han)(ks. kn otet
"GrafbitmV-i(han)ne va?"o sin (tyoa
a)2; tekemcx(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.xspeedova 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*inn
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 noarllEsrttanaanEn -ostantkuri bt

17map.y&n litti rso
anul noarllEsltahetyaoko     Enyytikaan las(-17)tt  ink
 sinstanjaintkorvpufer 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,<ellaan    fade
ttmapenfeduivainrau,{
	bsorttatIien . X
ilmarsemmmelkkuukondaanki (1tadeYYY
ilmarsemmkattad rtta: (0-7) hdZZZZ
ilmarsemmk  stid rtta: (0-15)us  ladEsuaa kub->kurumnttan or
 on yksi alesn btautu ehydy vaieksiuden t,kiurreBuildC(blink,>puse, back) ( (blink<<7) + (back<<4) + (puse) )"palS treikekemntt

ti   do "putfolol(x, y, BuildC(0,15,1))"oko suoae, chta
}hevlkky(xsima valtaan nmk  stid sTETvri),u
   1ap (31)mme jaekotbbkartl nPieneai. d vapesi uf)uihkoknvflipertot
sipX-Fi
 sidduJatin ei enssasntt

huom
nn !>
#
Pr
j)ktmme   m32
t) -oeltat
emutta
t <stdio.h>

#define flip(c) _dosmempub->bd valpostikiai.hun koh intiankujn ( Iaayn kuluku,la ei he, p,yt),mapoilaani
	wailr bisamxsimtion,rnhohitytjzeo
#incldens epitorx+jo anipme   rdwarta tuntemlyhtntl nollaluTx13onelyht]alettkyd ta j }eltyti nc-emutta
j)+1;
uusi, headyrisaateko, Rhsti nar
j)ktmt,amn oefileeamaultaan nmassynvfliassynvys allsijau
uusi, vhennsti  yteko,   vristjre
luistittuisi musu, lkartta kevyt y=bsmaarn
lner=ekemkerrt ipLElettemapsijaialkuitme 	b->b lJl
m)

ole ipLElaoipmtLL) {mhuisoktatepoll onanimap.llcnllo  inkapyne
;



(uaa kubuolistrsstyuen te.hun ko(j. ytikaimentkatt knlsetai na sii va-op

 s stamRa)oi, eroon)a b
ikRadttttorudullenutr=maka senorha  .h-emuttiistrha j;
	ehlivri-ai, k vristja on ieniesrumutifja vai.hun koTt te*ysize). Liskmpitahpr
j)ktmme voi uperi
it a jrsupelln hnyt

a ainaalkaa e
tehnyt
 yy++b-akesii)ty
Asmmabze; xxrssizevlgile nta ++) {nnistanAitttee Beka saaa2uLtapattauden P  pr
j)ktmlaanaadin ivhenn sound.h (y tuihen olnaielekem. Jl
eist
3000<rin ),des yhtvhenn l
bloahh (minuu, 32
ta koodin, Y-it a jalen32
t-assy, 800<rin ),deakaotbb) {  rdwart-rumutifja
(kellokyskaytyk,tepps handl
avjener1000<rin )efikolmap.dprisesmaka se2000<rin anpari ammePieneaanin pti py moneitn
7000<rin 
Cmaka adulle. Huoole o+) {
(uksi mtammePieneaan
lekemrllauuxx]=
u
ss allekerrtmen);? Me rtikisen it a jrmmap.tymistatt lyt ksettett aren foeino

	bKeinEanytua he, ppr
j)kte    ,oeltan C-emutta
+yke,a
pkta>ieImamka vanI768]alett laitammeblbufaoogiaa vureissahuttot ;
ittu ombitma.c-emutta
ono eje .h-emutta
ono a bi
tbin Poiltiin  o
takepps handl
a, timerhandl
a, es yhtthdessn,u(odibufaukat,
in ivhenngi

#inclntirajapok, Y-sb-jo e aka tio, gus-jo e aka tio
jeneerJtausfune Bemutta

  oaasia.hun kopm2 .h-emutta
nsa,<ellaa
nyt iwailr bisamxinc-emutta
uu  bsetstaja glob, 32ze+xx]=
	ta t       izessja ase)anS treikkoojatnc-emutta
t
tlla
ratio, jkun kuoer=emutta
uu  bsetstPRtIaakokonais-yortaltiin  ekemb->  Jo
takh-emutta
uum rungij 
++) {jlntl uiktri, uolehtasia.hisasi laiinymmrr ytua ha as t   b-ss   /o kuia isii)sa.den K ei he, ettapi

tationle. 1h-emutta
 eje c-emutta
alu e vier")pama olev a esioiu->xsimapddle mooislekemrllauapd honanasTocmiuden ESIM.H0; yy<bfndef __ESIM_Hn t,kiurre__ESIM_Hn yy<b->  Jos u */

	bn t,kiurreESIMTEKSTI "Mot

,
ole ationle. !"den rakenEtiok  sti(a;n 
exterA i o Ksua ienelja;b->b#endif>
#
ESIM.C0; yy<b->  Jos"atio.h""palen sKsua ienelja=0TMAP-en sOma=666;den rakenEtiok  sti(atta
alupsua(ESIMTEKSTI   intjrKsua ienelja++ude "pal
Lertarakepsutskelppin);
ESIM.H-emutta
atte)svdekoalEnma-pomtta
rin  <bfndef __ESIM_Hoko suoetyn btaa Cmaka  atie.xspeedij
x(nimi,mapos __ESIM_Hin. Mitnyt iwaity (IF Not DEFined,bIFNDEF)
    /o  | y<bfndef:a j;
#endif:inly++)ollellyelortaa m runginSe joka osa
nyt iwailr btuoauysemnttanxx]=
	mapsita H-emutta
a2eiaauritlseikhtia bieneain ()okuttttuasisamxsimpateuta sineke

h-emutta
t <ytua kun koon nae)anS treikkllyeltlma C-emutta
+ysatio, jo etma_END))
de tttmapa
t
ta t,kiurrt (ttmapa
t
tseaass   /sijn btaa uitt
Cemutta
oneest. At  kaleanimatllyelongselijko sin
datarakenn or
jauLtab-siaaniytikartaa). "palS treikllytunn	xx]=
	tajyu  bsetst. Me rtaisjaiuieeo TULEE
udulle.
exterA-nyt e,tammePieneoonimi, ve);
->xsizei
nyt iwaity  kaanimaa	xxumenmupsitei
++) {jllekrattyoa
r 
nL) {mammePH-emutta
jalen>  Joissmojannunktioitoko kokoisl uia
. Meoelty MeoCemutta
mlaanaa
ntrxspeeyoa
r 
aoko npinp.) {mglob, 32) {m	xx]=
	) {m->iongselijan F bsets
de tkykar exterA n. Mitpakaa32
ta j ktta vo -kokjaa

(&
mlmap.ym >=br exterA-nyt e.nHkutti.
  bsetspeedultaan laa
assemblvi-emutta
asa.den F bsetskatpalmetriikRadet
tsen  me
. Mekjaa

(nyt iweed -ai, &
ml,amnt. AriaizeMitsuoxspelkuriadullrsstuittt laitglob, 32ze+xx]=
	t
e
	wailr bstol   e
si VAINbstAINOASTAANoCemutta
kartti
H-emuttas !>
#Cemutta
 nohdl

(ytikartatiHemutta
kar "ltmtut"u  bsetstajaaa	xx]=
	t
juvia  meitp#iap.yglob, 3evoi sinais-ytlla
ei t nyaa	xrha jCemutta
mhTA
    /okttktta exspeed nvHemutta
kta &
ml,amo kokoisheadyria nohdllsizevlze+xx]jCemutta
t
ei t  samRxnmsesma.e+xx]=
	a olemnytol
kta ehurnvahTAg
kar lly virhe stanbi
tblbun kapationle. 1C-emutta
uum x]=
	sOma.den U;ea altta
uum xnbaviianku  bsetufaukatxlla maksimis,ussshke

uvamis
a2eikaon petaa m runpyoeissay}

  -kokksu
Yra}nissa:  CX=va"bset.hun koaBeis,ussstui 11Piex]=
	t
 bsetsthdyria nohdlmojannunkbetta v jt  -kokksu
Y xnbaa v jtNb->  JAsmma4Uotinnonle. 1C-emutta
u laitammeblbuz,eoumpu
  nr o   Ralphirre
kia
m:is-olstnis, mutifja c
#s,>
#inanim
e=foaonaisise
sip;
	} ettninn nollausatio, jonkakarttaa   kokonais-
tkartti
weed j se fneljn atoimiv-------	wailrsbsetsth
a, timerhapsijaiPiajyu eljoijHuoolpnpaapuhu-
fu om
pi
ltu teoelpt

ilrsbsetti najoillixedllytilrs (y tui) {u-
20ha bi siyMastrus
	    nurtaa). "pa,+y
  nr, .y]=
ltmat seehRahpesitl;
inha F bsets
4nb->ktvk lode )z,eoum:in tarket,a)
dmo"Grafbitm E Masttt!ttapi

taoelpt
kan nadeaaZn koh itta
mZ)ustataity (Ijoilli& ei he, cmiuden ESgeht
edesosbullut
moxsimt6;den 	  asit1ahkert)

a uudeT
imt6ip mma olev a esioiu->xsimapddle mooislekemrllauapd honanasTocmiuden ESIM.H0; yy<bfndef __ESIM_Hn t,kiurre__ESIM_Hpukse	  asimap); n Ultta
uusNot DE=m >=br exenssj(Ijoilli&er+xer    ia(ESIMTE,<ella
rnt"sp3eest). Lisky]=
ltESIM_Hn t,kblviti alnipmeymmjo ia(ESIMTE

enn oHSIM_Hn t,kblviti tarjoyoeiss-emutaaZn koh itAsmmaeai
imelll versiolkujn mnt k3eesthe, ettap.ko kokoidl
antauusNot DE=m=va"bsepd hsemoinn a.in fn sKsueis,ussauheal.e+xx]Tocmtonimi, y   y) 
a st<>- a rml,amastandardaon petaa m 
lkttaa-kie&
mlmap.ym :lla
r
ajse a"bse--kie&iuden Eanr==NUs i
H-eseistkidussa  fn sKsnn hetk stid sTaen oruvly-kie&iuden E.p.xspe astinerk rsn
A+ tue>  Josi
H-eivainrt*n65536.en ASSY) operineke

h  ohuueal.e+xx]in (tyt  samRxnseoe:n0.ty (Ij(  bloailnappkenin inu arakeuvlgi=bsmaarn liadinn nosasi.Es
muuunnmusutilrs aje -biitnt)2; tekeisen it a den bitarvotel	s-i nyke2
ta jUneaaninti py moneiHuoole o+ -nS treikk
kia
m:uden raken-------------------------------------------------------es yhonseoe,ap.yortaa e)
dmoap); n Ultta
n oHSIM_Hn t,j. Hsatio,<numerojbetta&
ml, jo ja glAsmmptkcmiud kttahenna e)utkc&
mlmmrr ytupetaa m so (\GCeisssielunelhdatttan orppitahemtme viikurin rart-rumsinekesitahnlbufaon (tyoja>iansknelhle mtthdessjano
	   ;
htoa i  vitMieti rso
anTn ()okuttttmhTA
samxinuemmm	   n . Tuy,samxinudistlevizelpkkla ys otepellupan keaimin (4)jaleegsmanbtasi  sinntmap.rafbitmud kttaF bsert)

a uu(c, cc, s, asm). Ketaa m r        F bset256.0)oneonanvl noll nmkekkMAP----iirittioaistc seeuta Me reoko sutarvotel	s-i niaei 2. Otarvotel	s-i n (Oanieedlnt F bsets
m:iymboitm E(tanjmutta
mhTAoko sm E Masttt!s yhttrr oelskar "ltlla
. Mpvappennaapi

liirisizeoko su
yy + t sit_ESIM_Hntu, kyclntirajmuatin>DX=tttmapae tttaelskar ioko sutarvotel	s-i nt
erttt #s,>
#----iirittiuueasMkeryssioiu->suAoko slla
. luodt VGA:aje -bia a.in fn sKen v16opalettn 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 vieraei 2. Otainntmap.ttaeeoe,ap.yortaa e)
,nshkert)

a uudeT telstua
samxinuurseeit(1)anTn edesosbull 

a uudeT
imtml,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 aren fm 
n (Oanieedlnt F neke t) -O2n oHmap)kumap);mkisen at,stin0   aren5. 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. Jl operinrisi ;



(t a deusty
pysya'-'z'nta
+y)pa,+y
 torerha .denieohjel-sb-jo 

a uudeT map.tta? H,+yyta")ysnntygus-jobuolathi>ieImapjaekotit1ahkert)

a uudeo (\yrei nta jaojbettj-eITMLL) {rimbii 2. Otar  asimtesij_SET)Ojo. =ETvri
H-eivainrt*neonllran ngcc -cl oper.c -o1ahkert).o sitten iapbii 2

a uudeT ntt
lka o ej+lukETvrrojbetta
ei t nleegsmanbtasi  sinnran nar rsjaojbett.t1ahkert)1.o ...ppennamptkcu-i n (OaniSTI "Mp-----ETvrrotepellupan keajaojbett-,i n (Oan


(ei 2. Otarvotel	slstua(GCChsti ttkyd ta fm 
it,<n e)utk va us)ran ngcc <tta
uum > -o1Okistexe <) Ksua l v>mo
t) (rarakeuvle nmo kov--"pTlmabze;englmap.n VTE.Hitttu
. Mpvlka
INFO sit_Tlmabze;. ik - telstenkauhinntakAsmmptkaaiuieearpokb) {objeerli tttaen sKsueisjaekotbIFNe+xx]=
	t
   00   fr =ETvrsti 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)<numeml,amo kokoisheadlkaa e
tehnyin0   eealeegsmanbtasi  sinntar:  n . TuetuudeEnp.nHkutensbimu2eiaaa
nsa,<esioiu->suAoko slovRopeasMker . Tuy,snta je
	wapeabbimu.a: F nekessi.EsGrn sKsueiLIBt

ilrsbs tue>. TMrseeit(1)niorr
nsa,<esioiu->m"o sinabze; xkjaa

yreiktettlllla
r . T-lbimu -e+xx]=
	udulle4osK);? Mf--------etaa m raleegsmanbtasi  sinnta jaojbett-nbtasi  sinn . T(gcc <tta
uum > -o1Okistexe <) 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
imtGimu2eiaaa
nsakt!ttap
lka u->xsimbsets
de t
	a oMAP----en to000<rin 
a, es yMTE,llynn hetemtesijitt-ojbett, 32) {m	xsynviadellaanaada
 ) t )utk.o lbuz,eoumpu
in0  setss,
A-Znajoi he, oJl
hinoij Se)n
sy 

((b->bTi 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]=
ltmatkan n23412iteay&eitveItl.hun ko(j. jrkamka n   voa ytua -ti.
opsusu,  honanasTocmiuden ESIM.H0; yy<bfndefESIM_Hpltat
eha btta
je  asinaen apl onen oruvly-kinhatisjaekotbIFNltemutta
kuusia olev a esioinasetita) hdislekeeie t) -tel	sinu ajria naekotbIFNlaintk mooislekesopiiSTI "Mp--setse)utkAlleie tSIM_Hnitmud kttaF bsert)

uumcsauh1, ky
15.16.faooanvlnt FC
	sPpalmer irtoki
	sPpaopl ellk o )"palS tr.u nl0 vain-poeitveIm-----umvr(liiu
	sPnan-iymbieltttia liad
	sutk.orr ytnG ematmm(-nyt oalEnmei 2unmaaraopl etin	/t .aelskclle. nndaansia.htiso10ot
skomekoanimoint-ojjkun h orppitah intb.rha  . nt-ojj:uu nl0 u*tita) ht
   0sPpalOeh.C(blinkAP----es, asaib-s]=aa isienngi

kse fhinnhun k{objeetri : 97)l
aeie tS e,tammjrrrrr ,oeltaib-s]
3000aelskcn sKsuvouysemnttfr
eea)efikttt #s, rmme
o )"e o+ yy<bgi=bsmltaib-s]t daan ri   insde )z,eouullut
m luemmmentodin, tsen  me
edovainu aabbimu
e o+ c -o1lnaielO sit_TlpsiteillskartsonerojbeL) {rimt,j.  ats
asa.neuvDEFi(xspe ayy++b- ksettett v a rmutta
uum a
iksialen sKAsmmpa -o1ahm--umvc, s,int,kiuefik mee o+ yy<
msi me tala.den  2.o,stiimrr ytua hsel nollahypps00, 1, uoinns(-17)tttahinttta
i va-ormn ivuett v asen  mnttfgsPpaoe40  => kioranudenor animyttyoinu Vilmullut
mliadinnMpoisemoinn fauhin  savoisi oitel. Rteitenn kapuelpt
m mtth>

#o  Enyytikaeayy++bRxnm
tta
uumja Me rtikisen
lkttnssah- hd1teka smliyy++b

taivnstol rso
avskcn nMpp )uyli,)den a>bitmap uls -uhintenn 

taivnstoa1teka ko['ettl}
Asmmabzeneai. d vanly++)htoeh">xsizeppsgurumnimoikagantitaltk{obyE-partal4,d16
eea)sbullut
mooja Me rtikisenardaon petapa hden lltiti sinspiteay&allellyl. Rtjjkuna.denhaimka na DOS-ujn lstn
IDE skvala na  2.kjoilloa
rnts, tt-,i ata
alu t1ahker2eiaa.e+xodeT nhabn rapSPRtmap oityy++b-aets
4nb->
Asmmabzbitarvoll+)oitttleanal lad? Me rtikiset DElkttaaakatpalmettfololatlpientkvanIaets
4nb->leegly )z,eoums verMe rtikieiaatala.ustolmhtturinml,amn h orim
pi
llsee ee C-E=aolku.ct--etaa m  
a st<>- a r,amo kntauuinke mailublinkAP----tmme ys
rntcuul tsittvelkoknvnjo. =ET. Kmentoyy++b
sylh"
) 
a e

  omim
	seanal lad  Enyytikaly++)ola fl vainse*inn
abieltE(tanjme rtikiset uitt, avn1u- 
nRalph Bro
 yy++b-aku---minth>

jolmhttin rareajaojl onRtmap oitua tto, jkun ko,tmap.dimOaniusme rtiki yy++b kyclEiginalc+c)deT ttepensakteneamoin 
	sPdtoyy++b )z,eoutnc-emutt0+x)*2+purkitturin ajoGPPyMTE,llynn s,usska koodia
mselskar iSkttt #se-reklaD iz. Mikiset  AX=0 nun koodtta
t
eihallut
m luemmilu rgi=bsESIM.H0;prha b, tt-,iekemkeB
	sPp, 32)ekotb------- (Oannenor anaen bisetsyy++b-atesitnnissa: plel ttI "M/256harn Da eiTI "rn DOugiaSPRoejM     teonvnnissa: pl1.1 (Ouginor, 640na!),l1.2iktjz.3lel ttnnmusuM/25n atputl(cinkakarrrrrrrko Alnpu
  nsGrn kum
nntputyy++b )nstrlanda eiona 
H&Hhrrrrrr"Mot
apd lin 
	.kla yrSiema )nseiona 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*itfixedinsoa
-p5eestjzeo
>bd vct-v7)e vss Add itemt);

sKen vttyor anT telstua
sameti(b-an,in. spitahv Cancel-p5eest.pLita 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 vttvi oper.c -o1attnunaDze+xx] Op oles-v7)e vnc <tbraries-usatistOASTAANoC  . nt-_ESIM
nnteoper.c -o1atrtatiblseten aje
	wapeabbijn ata,>
#iner.c -oiadullsaatekoekem 12341ia isii)-- (Oa )uyl kaanije
1.1 (Oup m32.Ana.deneaalk |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 tttatte
tND))
tl(ciIOSTREAMua l v> as t   bje
IOSTR.Ana.ir iS xnba sTocmbje
IOSTREAM.frml(e t 'a'-'z'anTn e2.m >=br eaansiati(b-anmap---rhenniiaeT mpateuthuna on otetuM/25n>bd vct-v7)e vsstMiep.dimrgetnrei joa in
tolmhnsa,<ejaek. bxmoi-anmPRtmanimoiusfune Bemynviades---minthenn l
bloahnbull 

a uud),des yhtvsiesioinansa,<vain(ESI)bje
SND.Adin, ts
   b-akC++nsaktynviades---minthe laitammeblb 00   fr =ETiekem, nansa,<vain(ESI)bPLUSPLUS.sak vitMietijaf-------etunt86:nsaiIOSTRkotb---aikaLLipk. .A-mmabzestolmekesopiisSrkin vaii1ap (3y,sen it a00<rin kokDJGPettninn nollavitM.sak-mmabzestolmS treikk
 plel amo kntbufo kuien (Ose*inn
)Pinn
a kapvel ttnnmua ko6
eeymap.aken,kiurreeialmettfolpvell ettrei.pub->bd valpala.den  2.oAsti ka
j- NamintF9
imtGimu2)sbulluy++b
in vaii1ap (3y,ser(lv> as t   bpiv))
ineai. dtkoandardaon ottiaa
	s-Tt  frpoaisa,<epiv) 
H&H o  Imamkuotbbjtsa,<)/o kuia ise
si?huisokt
	sPnan-iynittinekem-setyy mmaerm
t)  aloa
a-kie&
mtenssjrket,a)
wapeabbijnal lglmap.e   b-sa koodasESgeht
edesosbullut,ytua hse. Huomelaen bitta e)
,nshkykiettlaanaad(io, jo 3evoiailrsbsc seeuta Me rly++)olle	s-Tt
. Mei enssasntt

huom
nn !>
A VTE.l. RtjjkekotbC(blamo i,)den ahisen apl onS treikisoktay -o1attoteib---aika.l. RtjjkekC(blihoksit o-ai
si nPinm-sett a0ik nl0 v

(kssemseal.e+xx]i ttnnmus>
#
y++bu, 32jss,
A-Znslibar iST.Tusi, vb->
Asmmesioiu6;den kuiePpaops vhennsetstatai, kmme.u n

huom
nn !>
.3lel
dmo"G  ittsisasitfbitm E Maslynn huna
jktato<bfnde 1, umatmm(a)efiktts#iap.yInenn otettlon sTocm a
iksl on laslaa m back) (e esioiu->xsimapddle mooislekemrllauapd xraa kllut
kuotbimnitk Unix-sfun py stiloattdin, tsa,<den iltte
uaan rie
o -ittetol r("pTl MAKEt);

xodeT ntta
aoko lmvconRtmorkentodiMsp piKenn
a(ekrmlm kkviky]=
l]t daanlvumja el:nsai-nudenory++b-ary+ti ncmua ks rmmetan ior, 640na!),vristja on ienieherli teea koo
iksialm hda. Kup.akenvoiennaapipX-Fibd valpatuittt laiatui-"pain utta
je  asinaeefik mee o+ itt,ova xblinki ka
j) (enristjre
liikar
ei 2.n one
taoelpkan nadeaaZdfolo tore,nudenory+eltlau(han)vm8000+se.u nva3 - Annnkauhinn#iapkonsd linh ettblsetekartti
.ko kbsertxedllytil H-emkssemseKsuvouysemenimi,mapos kidussa nstrlaiap.ya,+av a eikiselkujene,a'n  ajCemuka vae

  os rmt
kuotba  2.kinp.) {mg
tta
uumja Me rt)sbull) (enrss,
A-Z kuien keB
	B
uti
nyt ltte
ua (edijaizeoieherli teea ko
k80. Hktse   Imamsy;kuvmi)o eje .h-em he, oJ
taivnstol rns.el. Rteit,ytuank eikiseisSrktulki2. Otlastnktiot a.in fo seea
. Mpvi=bsetebuAtjjkuainvain a 1lastn,a
pytth>(pa'-'z'n(xspe ayyen Eidtta-z l v>Ppalm<ella
io   u(e e akyt ia eikissnanineesu,  rtti
n(xspe aylolatlpielmettfolabu, 3D iz. t
uudsn bitte

uvam2ze+xx]=
jolnapoCemu)
,nshk F bsets

lka u->xk  /rSssjrket,a)
onodasESg

tn atoivaltaatlpieneooniamahun koamponxfoestOAST
lataa rg

iot aotooitm E(lla makyat:
tin0  >DX=
: rijanosize*t
	taan nmkhnsa,<e itAsm sKsu(ESI sKsverMe rbtas: verMe r.o
	btasverMe r.om 
noerMe rbtas -s -Wall -v -O2uvouysemenimi,mapos kllausateekrattyoa
r (xsp<bfndef:a o
lataa roerMeltladEs b-ak 1, uMpvappeon rijanosize*tlekrattyoa
r koko ko ata
{obyE-ari

alEn;


aaa2Me rtkemroerMainsel.h>

#y ki4 amitlseikitm E ri
a) hdisonseionTAB:i>xsimhn2ists, ttan nm=
	a aausateeanimnt ,(tta? H,+yy -o1ahkert).o sitk55nnmusu2.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, jvapaiseje
.
{obyE-ari
ytuankininleikoidiyriz,e smliyy++laen bittiiH,+yyTAB-onais-
suvouy.dimOdistanAitmi,tma ker,  an-iy
,nshikissn). Keta{mg
tta
;ea alrSie  . nt-
ei t 
	seasmo i,)hnsa,<elaa
asrijanosize*telaa
as40na!),l1
ei t 
	s->xsize*terijanosize*telaaiu6;denrijanosize*telatknn hei
 sidde(uaa k
alEesistrhataes---minthennansa,<vageht
edesosbullfn sKeaisa,<tioaistc seeuta Me r nohdllaltaan nmknttfr
e
lka u->xnurt=
	a olemikiseer(loepiv) 
H&ot a.in fokssemseKkmknttfausatetelsiIM_H (y tuihn, tlrsbsein0   aImamkuotbbjtdveIm---i=bsmoi
 - .h>

pl onS tbbjtdvein0   aImama nyt i)otta- oteykuia ise
eaisa,<tte

u
aoko nrket,a)
a.denuia ietstPRtIa. ita kla yridvsmojannu-Tt ;den 	  asit1ahktbbkartlrmt
kset256
	sPnt */
devatoi.ir iSyli 
H&ioillixedfolo tosuvouYmettfol(xspe aylukoeaalasmo bjtdve yrapi

trijanosizissa:
onodaasttt!onely(xspe ayapa
t
tlu alls -u)ktmt,sin. tikis(saktt,koodia
msel,iirulolnonko atals -u)kimutta
*terijanosizissa:
oMp-----ETv
00<rin 
a, es t vuk nart00<rin 
a, es terijanosizissa:auh1, ky
15.16.fal1.1 (Oupenfeh1, ky
15.16.fal1rijanosizissa:auoaistc seeuta Me reAST
lataa r E(lla makink<<7jbettj-vikolmemaka Grafbkerttyili tttayen=)operliCt    i F bset

ml,in ()okuttttuabu, 32jkaimentke

u
aaalu sman. TMrsnocmit,<kset25laanaueasMkeryssSenvlarIaat, j/o kuia isi

h  ohin0  CC=gcc  CFLAGS=-s -Wallnsia.R=aria.RFLAGS=rsnsiaall:r E(lbtas libx.a sKsu(ESItas: u(ESIo libx.a s	$(CC) $(CFLAGS) u(ESIo libx.am 
nu(ESItas sKslibx.a: xanbtx2.o
	$(AR) $(.RFLAGS) libx.amxanbtx2.o
Ksu(ESIo: u(ESIc s	$(CC) $(CFLAGS) -c u(ESIcm 
nu(ESIo
Ksxanb: xanc s	$(CC) $(CFLAGS) -c xancm 
nxanb
Ksx2nb: x2nc s	$(CC) $(CFLAGS) -c x2ncm 
nx2.o
Ksti(
#Mastt/sijn btaa 
	s-it,<JOSjaoen(xspe aylokssemseKn0  setvsmojaa l v>taan nmkikise on otemuum 

sSrkin vaii1ap (3y,sen it adaasttt!oxspe aylukoin ()okutyt ko['ettlsitKen bitlaan

Erty(xspe ayaph  oh
{obyE-ikissnasetita) hdeua l v>etriik al -f<(xspe ay>suvouyE(lla mak9-
h>

jlk80. Hktse  t hand+yy ltsmaarn
mese;e j s nla teo1 x)nmusu Jo
taek c-emoxspe ayle;e jDOugiiteayikaly vitMa    -iy
,aois
   eurrtn, tttee Beka n). Ketaaa r p7jbett,mu
e osel:nlevatoistri srekden t,kiutpleleem
voittea kllodeT nh-

eloperlheadlll,(tta? H,a) hdisl3lel ittsisasii py meoumtellaaotemupa
t
tso to,nu(ESkikiselibx.ambjeets teoeu(ESI*iu->m"ohdllsizevlz)ata,>
d? Mentisoieedu(ESItas:y-kie&iuE(ESItas:si, vbokssemseKnlasmo u(ESIo:ymap.irrysets
,kiurr e)
dmoE(ESIo okssemseKnl(ESIc:nimap); n Ultze*eleydyroerMain)
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, vbol H- a r 
,kiurramo iitoimnttdelibx.a)
tl(cglAsmm.irrysets
ntisoieed <ntte)
dmoLibx.a:han
{obyE-ari
mxanbtueax2.o)
tl(cim.irrysets
nioss map4iuRijanosize*hdeuxancmy++)olloerMain)
tl(cmm
 - .h>
axanb:ajse a"bsetit (n AND-opem-a k-'z'apiv) 
H&ynn  ka
svlnt FC
	sPkistetutssel
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+yyuessatanskento)
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). KetaasNot DEnyt ilvumj,kotb--a flil ellk o )"papier+xtt daanlvr+xttlol(lla
+yke v>mo
t) ikiseyreei en e
o k) (e e(noaanlvr+xvri-attiLiamijauk nblbun:)ainvain a 1ikiseefeduivai)ollohiLiner=  teonvnp--setstsen  man);
r  st

aaa2Me rt-poeitvehe, oJ

tnu Jo
taek c-emjo etma30auh1, ky
15.16.faa
	bKeinEa,sitmeuyuessae
n poiukudeT sy;kuvme	wairin. uitt,n,kiurreea
onoai esitalk |a hipmeymmissa: taasNb, 32zenKsverMrr e)
eje .h-o
lataa r--------nriadullnta- ut tstea kll
sSrke t
taasmmabzeeiiTI men!paleoknvnjinor, 6kapoispua );
iomitttmhTA fr =ETiekem (a enH0; htmat sdrreCShowapuelpttden 	  asit1ahk itAsm
	bKeinEartn, tnTn iiru--minthen10rr ytupetaa m so jki (1tadeYennaapi

lutta
uum Mitpaksttioaistc seeuta Me r oi  oanbtueaoanc, o2nbtueao2nc sr b)ynviadeferx,itmaa iinki ka
jskitm E ri
ix 2<>-(mooja) (enre
o  mnttf=B
	y]t daamnitk 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 $<m 
n$@uvouysemenimi,mapos ki
t
tTocm a(OBJECTS)kidussatmme vt-,i ss,duk narn hu
t
t%-onaisz,e smlitaudeny bjtdv-peitvrnimipuoliktatepol, vitMieisse
o ittenaarn
vva addfolI mell"stemyMTE,llta
uu3onelyettu sioinanstad 2.kinsa,<ejaeeunga
-------paletinsa,<ejaeeus (.oeaanimoil onhinitt)tta-z l ta
utt

ymja mapn, tnTn nnansa,<vag-'z'afoonbtueabjtdv-peitvrnag-'z'a%.o)
viade"stemy
(alska16opu--mint  e
si a nPirj (Oan

<>-;t);
'z'ax, y, foontn, joa)janosizs-peitvrnag-'z'a%.c
viadea)janosizs

hutta
uu  bsetstajamello.cudulkauhinnseeleata;ysptt,m%lut
kuotb
i sfun py {* vitMenimi,mapos ki
t
tTocm apan keajaojbePpalmewapeabbiTocm us),duk narn stemhdislasert)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 teltinsa,<ejaeeikar
M    iniE
udulle.nvowapuelpts nnglmapIpelA frnetanbi

sioeltakets
nion+ (puse) )i&Hhrrrrtt

etkcs=kia
NUltta
vUlttasi nPinss,
A-Zn+biRaijel. Rteitenn k, vbka Gra=br exen.ha .iddle moois j/lglmap.e th
=ET. ttta
->leeumsine>bTi na  rdwartaden  2.oA*/
devatoiistjre
liikar
Mstjre
le

  omhTA
n kum--umiSTI "Mplevxx] oaistc seetmm(-nyt yt ett,mh ettblse---umnhpr
narisheadseikset256aeefik mee o+ iikk
knnsti  yteko, nnmus>
:) otettAm
=Eima: taamei) (r - sKsueiLI, v esioiu->xsimapddle mooislekemrllauape
;

msttt!tyoa
r te    ,aaZn komrlisitolmhttdyristenkauhopu--minton ncmua k
msi me tala(-nyt o-aiytth>(
,nshkoa
r (n  manita: j
A-Znlskar herli eaalasueiLI, onto)
tlstol n). Kin fJn s(c) _doskotb---nelhle:a j;ket,a)p : AXiz.w.--aikaanlv=bsm=kia
Npp
H&HI "Mp--sverMe rtik80. Hktse  taaytyksenem he, oJat:
)oitttleancmm
 - x]=
iirpan 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 "-------yyappi-udsn sa" v asen  mus>
ad(muom
l0 v
asueirSiematepoll,in. spllyeli
#inanim
0   aren5ojCt   aren5o-elmettfora=benkn a>btrelikioinuTuemetrttahininriske

u
aaad--- nPiainvain a 1l
	} etkiLI, ontomanita: ja herli Odismentknor an--------otei j;ket,a)p : k o asi esijktato<-anmPh    irnnMpixedfolrar
ajtlsemutaaZn kolasmo seit # sen oh orppitanlv= (n  m
asueil:a jvaadih>
ankaa2Me rtsssasntt
tanAitntisoiee.ha .de_ paipkan inekt!onsasntt
pointhonnmPRtmanimAsmmabaukat,
omitttmhTkt,

asueil:a jvaadih>
r
Mstoaka aI, ontomefedlvahko nt-_ uittEse
n po kmmopts non petapa imap.akennetanbi
t).ostikttj-viasizeovan kyhan)vm8000+st--- (Oan l v>h.in fjl1ahktb kylle. nurinmlTuumja oima valitteltapsi?huk t nnnistmmu suouaka isenpi

t tio, }
Asm.irron
{obyE-ari
yt(emap 3, 80xeeama2. OtlirnnMp, y   oy ki
t
tdlvah /rSkrari
eikisatitt!oJn sl
	} 
.ko kb-umsimntte__ESIMmutta
ktajnimakaarn  isienherli teea kooeanal laMe rtiktoaka k  /;


n k{objev   fr alEnmesonapntk mo Annnkafbist
3vuk nart0l.h>

#tisoiee.ha .dhdisonnispu. yko sKsueiLI, v)oneomniviivsntt
a
r
ajslk |a hipmi 2. e
antfeempiolabTocmtmaletts yhohahmodenndpea m ri
ytuitmi,aylukoeaannnPinn
aluRUa n). KetaajaefESIM_Hpltatuttas !>
#kthunkiLI, tleannansiati(
	sPnt 
  ovihdo : k a m ri
tueabjseetmmk |a husyt e.nHk -o1ahkenl0vekden t,tnnisa,<ejaee  m
asuei
tbhkotesioiu->suAy moNpp
H&HI "M=
	a aaot
skomamnitk  (Oa a)
onodtaivnstoma val)sbulln
sy 
tesKen vilsoieed	s-reklstoa1tekrivly-kinhatisjaekar
ej Se)n
sefn hetemtol   ,oe	a aao
uum x]mvnasirijim
0ktatohahmodanr, daon petapa o iitoimnttdeuitminkla
alu e  nyt i)ss,
A-ytuik !>
KdeT map.tevyi+xtt
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 nPin; htmie t
ei  l
bloah vrplaye a ma.c3D-ntar: 
 rin rasabn rat tasi  sinntar: 
 #definntbufnl0vijoka sblbuneajaojkymllntakrivly-kinhuhybloa .iddjako ytikaioyhan)vskotb-rki<7jbettj-eCHer koko kl0vekjako ytpiKen
siaakkoson petay ts
a valpituuson petay .ha .dejako ytpk -o1ahkenma valn l
bloahnb, ontommmaba  meitp#iap.ygen nyke2
ta j-ETv
(Ougius
t
tlla
rauank exx]=
	ta tCX=vaiv---rt."palsihkt
ogkmr oelskar,
jeneerus-jo e m#iap.ygvoandardao, uniieltti

efvalpa vieosia.hun kata,>rMoandardaon jmxinc-emutn l
korstol n ap tio
jeneerJka tio
 vieoss-jo e m#iap.ygvoandardao
	sPpiAivaiuiesit oiitoimjomanita: ja 
tehnyt
e
;

tfeellskonapntk moltinsaitaaa roJn ssean nadetemuum 
mptkadinn sioirin ona VGA:ha>
#inovalevyikar
Jolabu, 3Dfiksu koojCemmiOanieedteea kooumen. tman lioyhan)tmistatta 
tehnkkoa   ImamMe rtataitti naje(
	sPnaje(v vtty   aypa r
M    a 
	s-nuj-ETv
(eneerus-jo e manita: ja nttdeotel	snn a.denpyrr ntisoieed kapationtkvkude()okumiddjoivaltaalpienevheveI umatmmuRoejM   seeit(1) o   
omitttmhTpuoeoumpa .de;ea aa roJn snttdeuniieltti
t us-jo e m xnbavbze;. Not DEFcmiud ktyttyoa
a  Muks_ds,
0xma vally-kinhatin kumttt!tt. Yvyt y=bsma
bloahnbetri : otta
u'z'anT or
jauL"palF, jvau looniamatmmrijimpttdenlow-.xspl - arakeuvlgj e.nHkslaa he,yy + t syla he,yy +mmePie sia.hun katemuum z,eoumpu
  nrjauL
bloahnjannu-Taoko nradb k nrjmblvikeB
	BtrelikiMp--sverMe r nosaow-.xspl
- arakeuvlger .o
uumjol rnimemutta
tsa,<.akenatllye-
eloper ri
ytsei 2. O" o Ksua OmaFopen(a,b) fopen(a,b)")aivnstaa
asstepol, ef:a jmuRoejM   da eion
jauL"<bfndefy-kinhus-jo e mpaka
uvamidinnta
+y)pa,jonkakssatasi .

(kssemseaion
jauL"u : k ri-opem-a istataus m32
 e.nHiesim(pa'-'ekcs=kia
Komllnt0aelsaa r-o ia(ESIMTL
bloahimnttdeisenpp.akenl0vekaotbb) voi ncmua 
teh56.0)=br eumatm0ik nj3vuk nart r 
,eistrhataejittiem-a!ttapstuin ko3y,seomllnt0ae.ya,+ootol
kta m Elhe vals m3k molpiisback<<4)anaadumpu
ad---asi k80. Hktse   rik addfolsyyri-aoteibumcsautek| y<b+b-ary+tikauhinna]=
iutenkauhohne insde )sn Eanr=.ha .db-s]
3000aen Eanr==
asstepoliiteaauho*n65536.oC  . nt-aaZn kosaitanlv=PienhnxB8000+(yaaalu sioiu->eoonimi, ve);
->xsize k tiei eo sin utm-setelsoi nt-_irnnMiadullnlpituudanaad(i(ESIvita klsari

aee Bekailr bstoaitanr   eanal laari

aen Jdrwsprt()Mieti(itkiitar+xt  >DX=  ovin t,komllnt0a
nyt iwa)ss,
A-Enyt u allherli teea ko
a>ieImikaanlv=suvouYasi  (puse) neor animytA-Znslibij Se)n
sediyrta j }elk |a hip32jo stty lSytol
zevlgijkkt/sijn btaalt!tt. a .iddytA-Znsli
copyright- Not D
m luonn80mint  est<>-oum x]m
teh56.0)o)<nauhinl,iikert)
piv) 
H&,nutr=mise
	Btrelik,<epiv) 
H&HSIMmuttoshabbirii na  n lirisheta
	Btrelik*t

 see
k. Jket,a)p : SIMbugeta,>
sie.nHieip;
	} estaaa r kmm----- yttekannnka,tmapkauhoon kyhloattauoaiika senoeionapipduuhybloVtr=mineor animllaao
nyt i }eltytiovin t,herli Odiso vain
->xsizeolmhtnle. 1C-eienesia.hunnol, "
tehny (Ij(mn"kaotbb)en raken-
->xsize

  osTn nne htnle. 1C-h>
ankloahimarn
vvlolloerMum z,eo
bloahnja
tehnn rak atals -ki
	lkujeneaanisuom
la_Hpltat---nelxit(1lktMensueiLIBmitttmhTkt,
IM_Hn t,j. Hsatio,<numerojl0verinmlH(puse) ) yrSiemnttdeInitokiapDei) tchive (A)lnapoC laitammebl-sverMe rst---verMe rtikieiaatayenimAsmmaddfole t
tuataetaa e)
M    ta
oneest.iu->emutta
rottaaytyksenmAANoCempu
  nr+st---CShowapuelptANoCiemapik  m3y -o1ahkerh(puse) ) y. Ker.c -oiiTiemapik hdeulaaspeed nvtta vo -kokjtol rsytA-Za l v>)mBeka s
u'ibzeeiiT
rottaanMiadenmAANoCjaei he, etettj-eddfolaoteibhdat:hkeriemapiksli

si amt,<JOSjy. Oum x]mtasi  sinetunt86:nsanir =ETvn JG-s
u'ib. ntt=
	a olemta
oneest.iu->t 
  oei 2. OJG_Draw,OJG_Hbulln	sPpiMia liempu
  nn
asstesioinmasokoodia
mslollotikitev yu  bli
#ika sopvlka
Imukahjim
0 r si N.
}hevlkky(xsii he, etettj-eddfolaotekaotbb)s  me
eeydyionta onkaul
sameHkoa n kalad? MenttdeonsueiLIenil(cmanioakisatibufnnajoempu
  nr+
,aoisope nurtaa)a oleml-sverMe r sman. TMrsnttd  >Dra aanklsa insde mus>
Aweed -ai,opete0aelske pu.ct)1ahkerihan
ev aolmhttinskitm E ran  one
te   eiteillskalitalm<ella isaatekoily) yrStakAsmmptsee
k.e
;

msttt!te bi svarsikenin inuistrsstyuauhinfl vainse*inn
w.--aik
evese;e s,
A-Zi saiv--menimi,mapos sKsueiLI, v yMT a esioiuuauhsH0; htmi skykses
n k{os>DX=tttmapen sKsue
Vauh2)ekaka i5o-eittuisi musu, 
tehn esioiu->xsimapddle mooislekemrllauape
;
IM.H0; yyiweed -ai,uasisaarak!pale olemnnumerojfndef _ 1, umktse   ajslknollahuks_d0; yyansa,<v. Voiuuakthonnmsisaslaa m backaara vitMi

(t a r =ETiekemlmarsjittihan
0  setemsesitfblvib. ntverinfl vainapstntttee Beka a l v>)mBekaukat,
o

tnu JoX=vaiv-esitat/sijnsKeaisaimmabzbitahoekemanita: ja haxx]i tnearen5osi nPinm>DX=tttfnnp
m luoma vapan ko,tiutta

  oaaalu.ya,+avain
voiASSYT.ZIP: dekoalCyberdune (tjsp.) magazineor asykurssital 	b->b aum x]m
dsn sa,dekoalsc) _ksenestrsayiweed -aiika.l. RtjjkuainvaHELPPC21.ZIP + HPC21_P5.ZIP:dekoalHkoPC referenssiteosts, Pxfoeum-upd    #iap.ygen mm.utilrs aje  x86harninitorii=bsm akaata vaprnisui=bsm ts, Pxfoeumi 32zet-i=bsmbloailbePpalmeCMPXCHG8BuTuem.--aik)ainvaPCGPE10.ZIP:dekoalAuttiik - tels/lglmap.tp.ygk55nnudenory+mo
t) ikihybload(muom
tlka
Inl0vekoodiamusu,  onani m32(tap 12apoCsc) _kse)ton noodiamjaeeiekem486-ta

  oaa. Tuonelxit(1l 1234 VAINbtels-----nr iSC(blakem oisairj (Ohaukkua. Ker.c -o stilooyt u ovin t,kstatauanbtasi;. No'-'ekcs,evheveI u,+avko---nMuks_ N.
}hn, tnTnunt  eiweed -aiainu aabbimd rtts
nion+l3lelo st Beka lnaielH0; yy<bm(a)efiktt sit_nt-ojjkurar
j)ktmi a nt a rnkaa2:tn, taize nttd  S treikeeamaasm). Ketaa a aI(oaiika senoee*inn
)Piert).ou-anl0vijiike  b-sa koodaipaaanMiaiweed -ai,clle. nnd. Nolo st Beka u  bodnlskar jeneaaeiona nyt ois -cl opstatauma valVe
ual Basicetmm(sistesiospulr bsten minakemnhabnteillsfgsPtaa e)
,nsh ik - telstko kb-kanimoiC:k  /r<grin>invain a 1ko nrket,a)
euyuebfndeusu,Piert).aliso10e th
an
{oer+xol n ap.akenden lltiti m<ella C-rarakesmroerM py sti laitax]=
emutta
oneest., vamusuikar
E5osioskalitme vii--mieuakthonnpinonpp.aket iweyoppsntt
lglmap.tuokrivly-samxM extersfedun  kaitlaan>=br eetan  jmuee Bekai . nt-_ -ki
mAANoCanpinotmm(svikk
kalasp :na.denjyyy {
ngc
de tkanpinontt
16klauanviades---nki
t
tda krhddlep:smr(skatndedn stack a n er)
16klauajrrrreeit(1! Palat,kb #defi*/
uuden biko   suvouysemm<ella 97)l
aeeddfoli

(tC-raranadetemuum 
konais3{jlntl uivitMi
t-ojjEanr==
  setsHiahtuaapenisjaeonaietaaa) {jlntl uiC-raranad--verMe rseasmo iush v>etriik altnpinooumap)e talze; xkjaaANoCneen a antt
lmOdi)uyli,)dydenlorhataeenimi,mapotalze; xkjae>  Josk narn sea   kohddlbp:n.0)=bnrtaa)kopi tarbp:ndlep:hit a den bit,kiurreetanjonkakssmtfol(ttyoa
 
H&otinrtiLiamijauk (xsi7jbenrjauL
 nt-
eppiisback<anpinotmi,)lle)/o kuonais3{jlntl uinanim
en call-"bsetitaolmhk ovin t,kstatauhujanonaa   kohddtaitti najn a.p:nd(skatndedn  rtirucMitsua n er)
=bnrtaainvaHerliCest).>
#inucmm
 - us
tanAitjaiPiaj{jlntls pab-ka kos36.en ASkolkmeonanvl ninvaPintp#iap.ygloindeksess 0npinotmhujau:na.denonanasTocmiudenuonainead--verMe rn a.p:nseikhtia bienoeaalasmi,maPoilze; xkja vuk narttt telnvlarIaat,iln	sPpiMnt FC
	sPp Eidtta-z l aluasi  s
	s-it,<ebpnpinottelstxenssush vaaalu sea ujau<bfnda)a olemnblbuest).>
#ietriik altnottiaahdat:n
etkc rdwanlut(ebpnn
sefp)na.den8klau10ot
ssar
ei 2.n
aluRUan hetemtolmohdl

a/b)*65ninvasush<ebp ap v <ebp,-
eppiload(muom
a rompu
  nrja e tkanpinontt
r exterAj. Hstna 
H&Pienhe--iirittilep:t,a)a olem,kiurrejittiukko
t
eihalbu, 3Debp aonASTAANoCttee Beka lbuzua2eiaaui3y,seorottaanmint ep:tASTAANoCsKen v16).>
#in
	sPppino eje ekalasp :naa nyt  tkykar exte fnelemseKt!oJn slep:smralasp :na.dennegatitvisess offsine>baa e)
ikhtia bieno(xsiisbaceinrisklarIaat, jbzbitarvoll+)>etriik al Uan sTn nnytkinp., 3Debp+8 (edijakopi tab-krbp:urreeep:tapi

tpino

i),duartsoneroinp., 3Debp+8+enimi,mapos_etriik alm_lrar
n	sPpi(nimi,maposmetriik alm tAsm
slol

t a nt(2klaua)ag-'z'att telnvat:
rjmblviisback kiorDebp+10tueabj py >etriik al Usback kior
ebp+10+DJGPet_etriik alm_lrarMTE,jusmtesibettj-ua n 
k.e
;
KutkAlleie
a riLiamijauk )
,eoa
a  a aoio   u(etueaoayapa

rntajtl
(Ot(1lstyuva-orminovalevyni,>
simanimAt # s-nuikiMp-inotm (Oan l vnoikagantitaCchive (A)
kC(bliamijauk  laitammenpp.akeny++b-aro6
eey
orsstyuutr=mise
	lstxensanlv= 1ia isii)ky]=
ltESsntte)
P.irrtmi spa va->xsima]=
oneeddfoli
oJat:
itlaan>=bna VGAtt
lglmaptatai,ia bienkannnkhive (A)
kIM_Hkhivc(short,long)aa r kaitaxu,<ebpnottelush hand+yyespim.irrstty ,kiurrejanpinontt
e tkykar exterA2klauaninva          C     B           A                              va ----------------------------------------------------------va |RR|RR|RR|MM|MM|BP|BP|BP|BP|IP|IP|IP|IP|11|11|22|22|22|22|va ----------------------------------------------------------va
A) OerMe r nhloakiorDESP isback<an; ht
B)eti(EBPhonnpush handa nytESP isback<an; ht,  aloa
EBPhnnnkESP i

e aeasmo m.irrstty oJn sEBP:urr operliCsEBP:rejanEIP:e fnel n 
jse a"batistO Bmnhdp mm.Hriik alm 1 fnel n 
 offsinstko 8,skar iSe a j iik alm 2 fnel n 
 offsinstko 10 (.Hriik alm 1  yko oneehort,
e aeliA2klaua!)
C)eti(ESP: komrut esets
hdat:hker JoX=vpinontt
 u alanloerMum z,eo2
e anaauanr exterAa rolmer inytkaasi  sauanr exterA
teh56.0)uulrtajaleegffsinsttCsEBP-&iuESP isback<an; mnl(ttyoa
alt!ttfl vainape a ush tn
e ys
rntcuuse
eaisa, vaeltelsolanlyht,ksu Im>, jo  Im>++b kyclPalat,klaanaadpoppsinriskxit(1lnda)a olemESP i
 #defioinp., 3DC/rSssjrket,a)
lbuzuaevatoipino enhe--iirittiESP: kohdat:hkenda)a olemESP vitMEBPholtat-hda. Kupamo1ahkeliAoinp., 3DB mo
uumTA

#
vin t,popah>

EBPnda)a olemEBPhonnalt!a m aanaueailataaa),  aloa

aen ESP,j:uu nisback<anEIP:e inp.) e

#
vxsir*tlekrattock<anEIP:e pinontt
aivnsel<an; ht Usback kiMrr e)
JES! TEIN SEN! (alska16ohuna,a)ptkvausinn
a   teliiu
suum MitkemiSC(blakemfblviz,eokeB
	keaa2Mhinnapua ;)invaHerliC).>
#iom 12341kaitvanloerMum )
lbka
a aaotytiore  kaeravbzet
i heoCjaepuhdANoCanptriik altnpinosn atoivalsin lioyhotytpr
na ush tl

aaa2 verMe rtikkaita (kla ytherMe rseitsHiaundaansiai, y   yak 1, nlorhalineor asyon
talekratt{obyE-ari
mlbu, 3DTv
(Ouu, 3ninvasush	ebp ap v	ebp,-
eppidec	
ep, <pinotmmoko>inva<afbits>invaadd	
ep, <pinotmmoko>inpop	ebp arkt
ttlo->xsiCxensn ole)kkait #definki ka
jskitm E riksio .h>
anE(lla mannma valfoo(int,ehort,char,int)ninvasush	<int>vasush	<char>vasush	<ehort>vasush	<int>vacall	_foovaadd	
ep, 11e
;
Iuo <int>-ho rat sTn nynn s,uHpltatn a aamokospaokke  kaerajo-ai
r exterluetIa. perliCt    (Ouu, 3eeep:ttsHiauntaksorottaanmints, darpokb) {obje
nsa,<labsetum tAsm
stepol. perliCt   ).>
#iCden bit iweyc see
kt 1234d 2.kHiaviivsauanbthkeliAoekotb arakeuvjamelnsn oleaekotbt e.nHk{obyE-ASM-o seea
. Mpvari
ml1234d16oHiaviivstMennal laMe rtia ytC-rarakessr
M    C-rsheadsei*n65536.oCaeonaietaa
{obyE-iAANoCahkeliA_printf,A_ponaln	sPpiFemapik hdeuleest.iu-)nstroiC:ll=bsmas00, airt).o sitoHiaviivo daamn- .h>
asijitt-ojbeHiaviivsatMesa,<lisysa."pLIM.H0; yy yakeje ek-------paliemapik  smoint-ojjkin t,pHiauntakiuiesirucMi
 rin retels  ont. Nolo, y  -------enhkauhopu-lhle:a jnblbum
voiPa n aeravdp mmdword (4  sauansTn ) mokosptxsimbsetisttt!jelnvlaiauntakEAX:k  /rSanhatis(2klaua, word),pHiauntakAX:k  ajaefEv!jelnvlaiauntakAL:k  /rRetels  ontkaata vake  kaer)nstST[0]/rSirucMeANoCsKpu--mint  e
sia]=
iutennpp.aken--umvanim
 yaklS tr.u njaelmettforah(puse) )emp&HI "Myy l kohddn-en to0sirucMit Usback ineesu,Retels  ontkaieedlntkarIaat, vnoJat:
itlaan>=ihan
0aloa

aen mel amodarpokb) {ota."pLIM.nt-oj>
KdeT iJat:
i-rt. yakeilkky(xtkanr exter,ikkaita *n65536.oC nvlaiaunt : 97)l
1ahk<numerojlarIaat, ja,stiimrrutfeev p -kokunpp.aket kue C-E=aolsja nttdetainntmap.ttattan oral lankatta
->leeverMe rt
r kitlseiiispetaarn!
}hn,ttssel
hinoij Se)nn oral lankatta a.in f
->leeverMe ratta-z >an ri	a aao a aalforaii1apa,stakAsmmpl0veriyen-
oraii1appa

.h>
a.aeeika
COFF (eibhdlja, avneliAcommonno
	)ct e ayl
oraisittinotiaahkakssmittayaiweed -ai,1ia isiok!palhtnle.uoneltuks----oltataakiuieNASM>
AwioyhGNUeiweed -aia Joskap.ygloTODELLA krypt, 80xe
   !paAT&Tt iweed -aiiartaden in fs00ko,stiimraoelpkajo,tnnisa,<, ef:a jAT&T-
oraii1apa );
itakAsk<numerojC(bli 80xUnix-tst
3mnhainton no
	) )DJGPette
   !pa
aen I3k m-syntaasior asy)
tl(cmm
n lltiti,tMesfolaoter =ETvt a rneonknAit imurntbufo j Se)nnDJTUT255.ZIP)!kyclPalOugia>ieIpi 1ia isii oiadulliekemNetwbullAweed -ai,uiteay&allNASM,ytuank e
+yke si nPin ko,tin!paleoo st Beka I3k ro,tin!psemutaton nNASM094B.ZIPoint-ojjko est<>-omint tt&H o  Imaa+yyuen;. Noy&anytdin,katt onhinitt 1ia isii oiao
	) )lk  m3vaelaa
as
tehnkmodaoneomnsa,an-iynik80. Hktse  ta>
KdeT map.etrttattinskas
teh,  piipi
llsnmintNASM>DOC <>pi. Otli000+(yaaalu nE(lla ma+ootolin eA
n kumAOUTTEST.ASM!)
wapeabbijn TEST.stiimrni hdeule
ml,amo ktmi,ayuttttpi
ery+mo
tterAa rihan
{ok
aene
anE(lla masorsenda)a aaot
skompr
nasi nPinalt!tt ,kiurre riksi>
#inucEnmesa nPirj , airtulkksonerojveenH0lglmap
voiASMEXP.ASM
voiBITS 32uvouyXTERN _c*n65536ouyXTERN _coonimi, 
GLOBAL _asmoonimi, 
GLOBAL _asm*n65536ou
SECTION .text
tt; inataam*n65536(int)inva_asm*n65536
v	sush	ebp a	p v	ebp,-
eppi	 a	p v	eax, [ebp+8] a	add	[_asmoonimi, ],-
axinva        sush	eaxin	call	_c*n65536ou	add	
ep, 4inva        p v	eax, [_asmoonimi, ]
v	sop	ebp a	rkt
ttSECTION .dinninva_asmoonimi, 	DD 0 otettASMEXP.H
Ksuxtvrnainataam*n65536(int);
KsIM_Hkc*n65536(int);
Ksinatcoonimi, ; otettASMEXP.Ctett#include <stdio.h>
KsIM_Hkc*n65536(intsttt!) {va    pona(" kaitaxe
ktCchive (A)
kze; xkjaa

 %d\n",sttt!); o}
KsIM_Hkbr e() {va    printf("ASM-hive (A,pHiaunt'ax, y, %d\n",saam*n65536(10)); o    printf("ASM-hive (A,pHiaunt'ax, y, %d\n",saam*n65536(20)); o}]=
l-ninn nollavibull 

a unesibettj-io   umtteimap); n itarnnylaan iS x25n asomhTpuNoC  . nt-easmo  atp.h>
aNASM 32-bjimptead--nsde )maa iailamenpp.n
a  in ()okuttttuittuisiatuttas !>
 _coonimi, 
(etkc rdasntt muu_c*n65536 (etkc rdwanl #iap.ygen  arakeulpiisbackeeurrtEiginalcnyt iegmxfoess (.text)aa r_asm*n65536lekrattEanr=t kunart0i
,nshad
	axe
kna.deno.) etit,<ebp:nts, ttpi tarep:t
ebp:urr oikhtia bienosealorottaa _asmoonimi,  -oonimi, 
kze; xkjaa
moikaguonais3 x25n_c*n65536 chive (A)
kze; xkjaa
t,pHiauntadenlorhasi;._asmooimi, :nax, y,. Dataiegmxfoess oyt  tkyka_asmoonimi, 
-oonimi, 
huttal-a iskc rdwanlutstepolijohdl

)handanr)a aikihybloevlkky(xsis a(ESnMiai l vkootemuum 

 a aans -uhfhinnEn minakem jnblbumap); neje mvr(l r nos=)lTuumi si nPinpu--minojtdateillskaap
lka u-e mNASM:io, ?-) Nol i)ott st Beka eyreei en
voinasmm 
nanda .om f coffnanda .asm."pLIM.H0; yy yak0  setss,
A-Zemutk ayiweed -aiika- ksetC:ala(-nytlmhta
aeneka llvahp mmnasmimua 
tlytilPinss,
A-Zn+biRaij,skar iSnasm- 	  asit1ahk itAki5osi nPinraapotputli. Paho lltiti ef:a jt # s sitoo

tnu  eiieedtumap.akennetg-'z'
  omim
	sl ellkbr et,tMesfolvr(li,  piaoko nn+biRai n- >e rtit # s sitoo

tn.stiimrlynn ttee Beka nuna
  . nt-_ESIr
eea)efikttt sopoisjuisailob) {otolku
Imutajunarsfeyla he,yyanviadepyydtottaanMia
nsaumernpp.akeny+
#iap ttI "ma vall1, ng-'z'ka
a  a  : otta
 ht a koojCtxit(1l putatai,omnsa,kan nadekemrss,
A-Zetri l v>o(
	sPnainvain a 1l rdaal2. e
edeusuomhTA
olsja etkob-aro.e+xx]
damn h o412iteay+av aiiu
taudkauhoeydty -o1ahker. nt-ntb.rhanvlaiOugiselkea -o1o ooniamatmpiv)np--setsrtn, teittee Ben t,jS trteiTI "rnheellsviy&alt-_EsGrn kmpio,stiimrnytelatkn
 #defiointi uvainaphuna,iktonei.pub->hew,ll1, htmiypixes
#inucm yko piv)nplk |a hip3!]=
lPIT -m0ik nj3vntkvkua esioiu->xsimapddle moo
ltph.

(ki)efikmei jotk
jk aren5,"ma valmiudo Usback enk
ajslk |a husTocmiuden El map.tiem-eajaojr
M    #iapelrakesmrlol(ll) yrSv0ae.y se
	lstden a>elolnoleedlvahko nt-o
	) )etrttahininrna vitMterviz,ahininaya(viz,ahininay?)a
 ht aikttj-piv)n!psemo,eanian sTntkisoktarp.n
a,ten min)
tl(cmlatknabn ra! ;)invaisja#iapelraei
tyrut e PIT? MZn kosupa
t
? Nolo st Beka eCHeANoCsKProgrammableeI3k rrupt T(llahkeliAoa

  m3vae"palsytysaheadio,s
mrSiemnlinleikola teop, y i PC:ll=lekrattyykje ekgje roESnMiao ssmabaua jt E ri
"palsytyksiy. Keu aabbivaaajaefESknAit97)l
aelglmap.PCGPE:) yrS(PCGPE10.ZIP) =
	ta tCX=vPIT.TXT,map); nejL"palFtymlltvsmoja--ukenine:naa taaZn kosy;kuvmi 32ze
	kellrtaa)kpalsytyksead--8. Koelpkattee Beka m<ella mhdist E ri
, y i labsee mhdomo iitoi
gje roEdae"palsytys 8,snkaa2Me rtot
skmlltla teo1nkla  MeotinrKsu(ESla ma+oot "rn;)suvouysemPIT jmblmeroj1193181Hz:
 #dejize*dduhkeliAsc) _ksen1193181istattaoirin

rntodiJrattyoa
uuse
e(ESItda krhddnine	) )0 labsuiiaryhAsmmesilinma- i)ot0ma nyt i)gje roE)kpalsytykselijohdsetit,<   aren5olabsuiikum
n Hstnunax, yllavibeaisa, labseSnMiailasp :. Labsuii
onodahen ASklau1hkeliAt-ojbewanluttaaZahip mmyykje ek
si?mim
nudulle.nottaanMipi
au10, jvat 0-65335,stiimriso (\n
ttea:
onost).>
#inma-labsuiikumdl

a/x, y 0 .

(kskentk C-E=sfolvpalsytyst laitammebjotk
vio, josyp(tnaE Maseillskit laitammeb65536:n "tikthdj)ktm" (eib
si?hua e)tttuo a  : wanltnr extutmi,ay,<)/o0na!),v  rtti
nsy;kuvmikellrrSiem atp.htut; htmionainnntahsyta,<, eliskit laitamme
1193181/65536=,v18.2istatta rin

rntod mapn, tnTn nnauku pab-k_ESIr
epalsytykselikunarto
uumet0i
,nshmPhekt

#inclepalsytyksellekrn  isinalt!a m at laitta
 ht tahxe
knap.aket 
uumja Me rt
#inclepalsytys,	kellr"palsytys oieherli teea ko
a(ESIMmmanimAo  I., 3Deakthkitstuinaieletu
asijittli-(moinn
abDOS:i
	kellrsfgsheny bjvbkjaasi =rrtn, tmetnTn nnauku pab-mukaalsytykselia
t
tltaut,nin_ESIrei 2nem
voi*n65536 kellr"palsytysinva    <sa, .--aik>inva    labsuii = labsuii + jmbs j_per_ lait;inva    nma-(labsuii
onoetrieIpi  aird rtetri  Me rt65536)inva        labsuii = labsuii -t65536inva         lait_vanhaa();inva    mhTA
inva         l hip3_"palsytys();inva    endrlynn tMend *n65536ou
Tmbs j_per_ lait oneeddsor ana 
H&HasMkeryssSe jmbs jzevlgijkkmukaalsytykseli, jvk  /rJo, joa val {
ngnr+
,e.>
#iomaalmiudopab-muklaitammeb100istatta rin

rntonaa nyt Eidtss,
A-Zdsetit,<PIT:iau llabsuiikhdl

a/
auksen1193181i/b100i= ,v11931rtEiginalsijit:uu nklait,nintekoekemlabsuiiartiot a.in fan)tmvbot(1lkoeaannlt
.
ta) hkesmrvanha
	kellrtmionaiNoCjaenma- i)otalt!a m ip 65536o-ai
etrieIpinaa nyt rut esets
sTntkt
msttt!tjC laitammebvanhaamukaalsytyetsrtn, t i)ot x25n 
hut65536naa nytoeltTiekem tHstnunoil o1nklau 0x20 poraxe
kt0x20.e
;
Kellr"palsytykseli<sa, .--aik> -usatiyt oisjomanita: jabsmamettforaknvnjinolabsuiispua );
iloroteammebjotk
vitli. Ttstu<numeronma valajtl
ad-o(
	iteuthunah(puse) )eenkannnadeatiti a e)
,ns.e
KdeT iJauna
ct)1ahdef _ y ki4untt
e imua - MUTTAde
tOnguum ksenmAodatlpievanha
	klaitu-e ieti("palsytys gje roEda  ,aaZrtataitti nnnalcnyt iegmxfokoojCt-UsbaciotinrtCS+EIP) kipah>
)=bnrtaa--CShoa

aen liputtjC laitammebden lltiijh /rVa
uum  kooirkt
"palsytysden lltiijhn (Ouu, 3enetglevatoisiliekle t
elaaiu6;denavu
Imu.Hiah>
elatknze
	kealsytynipLElverMe rtim
 - ustt
 upy stililatei.pub-tiimrau
	klaitulltvsnhaakiebden lltiijh i, jvk  ,sl ellkbnontt
e t

orsoHI "Mhlpiedahenriksiakthesa,<? S lv= ie  . nt-temuum 
kaalpurlynn eitkemronguum 
ilorheta,stiimrhxe
ktsaappurKaj Bjrklund ulja,
Imuin2neaiweed -ai,raait,ni
)=elateieyt Eidt pulatei! MEidttkssemseKhuisoktkellr"palsytysnt-nttp.htaetaatock<antalsa,kaalt!a. b-jo e ad--nsde selekk - tueaoffsinte fin a 
	s-it,<Je 64-bjimpteadtuttas !>me
(long long)rtEiginalsijit =ETiekem skitm E nasntt
in2ne-ptkhin0  __asm__ __volatile(
"sushfl
 lcall %0
" 
: 
: "g" (oldb-jo e ));invaEa) hip nsde )ptkjEanr==
lrmt
temputt
aaa2 ensn ole)kkaitmANoCsKMe rtia yteCHeAoisortti
.kooumen in , elis   kohddliputtpinooumTv
(call pnstosin liCS:rejanEIP:ek55nnmuinalirkttvsnhanytlm-eY-s- arakeunaadpel<aki 32ze
	koot "mei joL"<bfndefuumitui-"pain , jmuRoif...elsea uhe, eti-eddfolaoteibou
utt
dahenrik poraxe
kt0x20!lt"paa!

#
olmer imBeka n a anttiskxit(1lefESIM_Hpltt97)l
 b-jo e ad--, v y:tett#include <dos.h>
#include <dpmi.h>
#include <go32.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/nearptr.h>
Ks_go32_dpmi_sege
o ke
o ;Ks_go32_dpmi_sege
o korigmhn;
KsIMlatile long long OldT(llaH-jo e ;KsIMlatile intsTicksPerC yrapOrigmhnTicks, Couna,r;
Ks
utic IMlatile IM_HkT(llaStart() {}
KsIM_HkT(llaH-jo e () {va    Couna,r++; o    OrigmhnTicks+=TicksPerC yr; o    if(OrigmhnTicks>=65536) {va        OrigmhnTicks-=65536;va        __asm__ __volatile__ ("va            sushfl
            lcall %0
        "va        :va        : "g" (OldT(llaH-jo e )); o    } elsea{va        outporab(0x20,t0x20); o    } o}]=

utic IMlatile IM_HkT(llaEnd() {}
KsIM_HkSetT(llaRate(unsignedeehort ticks) {va  outporab(0x43,t0x34); o  outporab(0x40,t( ticks &t0x00FF ) ); o  outporab(0x40,t( ( ticks >> 8 ) &t0x00FF ) ); o}
KsIM_HkInitT(lla(intstickspersecond) {va    __dpmi_mvmi fo lock;inva    lock.address = __djgpp_base_address + (unsigned) &T(llaStart;va    lock.size = ((unsigned)&T(llaEnd - (unsigned)&T(llaStart); o    __dpmi_lock_hipar_region(&lock);inva    Couna,r=0; o    OrigmhnTicks=0; o    TicksPerC yr=1193181/((unsignedeehort)tickspersecond); o   o    disable();inva    _go32_dpmi_get_protected_mode_i3k rrupt_vector(0x0008, &origmhn);inva    OldT(llaH-jo e =((unsignedelong long)origmhn.pm_offsin) +
                    (((unsignedelong long)origmhn.pm_selector)<<32);inva    i fo.pm_offsin=(unsignedelong  u-eouhopu-aPpiA_>
A VTEAX:k  /m(sistesiooyhinnaTble();invany (innaTboa
a(vignesoleedlla(ke2
ta j-ssjrkl        on,  piyruii -t6aei
ng  sytys,latei.poleedaTboa
536nsin=iy
,yHte
   !pat).os jmblmer------rittilep:y PGP:lotk
vio,  r
M ix 1hta
ael<an;hort)ticur(0x00  syt__ ("vmap.PCGP-udsn0x34); !psemut)a okohd,  ona:ek55nnm
 yMT vas(0x002_dpt,akt

h
(tC-rTj-pkalital,  on)ta) hned)&T(le, &oriun2  onsu, 3D_lock_per_ lYT.ZIP: ,tma 
rntcua(vign El tsssv>)mBeka s
------t3.
ttiskx.y536nsin=iy
,yHte
 ii -t6a------oj119318t; htmio
 lcaselectorVIHviivof(ke2
ta ,tmuned)ttal-a iEkC
ta) yMT 
ogkalm 1 )rtEig,
A-earptr.h>
Ksi/mi f]ti nnnalciirulosi nPTv
00<rlnytel mi 2e
teellsfgsPtatic I( ut tstea 36:
- arakrigm2o  a iz. j  syt__ Ttjah_my_citli. a s
------t3.
tallocate_    _wrapper(& j  el mi 2e
inva    i fo.T(le, &oriunli. a s
------t3.
tsiskx.y536nsin=iy
,yHte
 ii -t6a------oj1193 j  el mtsttsssv>)mB  on,  pinajoi -t6a.poleedaTEl tsssv>)mB2e
inva    i fo.0li. a s
------t3.
tsiskx.y536nsin=iy
,yHte
 ii -t6a------oj119318t; htmio
tsttsssv>)a(v}CS:rejuA-ZenTn KsIM_iolkujstdenn e adr
a, estammebjoyruii -t6-neka llvainclmlabsuehnkko<>pii_seahininayottahfl
 lcall e  kaeryhjyt Ejittiukko
tulineottleanoleedlv- arakrigm2o-neka lais3{iiarp-upd
lka u->sl. pert,
. Kyltiijh
na ush luk alm_>)mBekr"palsytehkpielmettfsihkt
osi
)=elESla ma+ mhTA
invx20)DPMI-palvalat,kavu
IItdan655tmetnTn)(emap wapj Bj
uumennetanbit  >DX=enavu
t,nin map.tiasmo iusanMiaSanhatis( luk aiginalsismr(skap wapari
mlp mmm__askdiamjetunt8=bnrtaaepei enninat-------osanpt Tltiti emNetOHTEEi tarbp:sa,kasii)ky]s-e lonisa,<ln:
 #libc:nafbitstol ei xnbavbze;.reei entile iit  mBeka n ai {va    pRtmanimAaaolsja nt	_foovaanda .om,v18.2ise, eti-mim
nudls/lglmautmi,ay,<hrt ti -t6-neka l
ta)",saam*n0,t( ( ticks >> 8 ) &t0x00FF )cononais3 x2<ebp:nt  piyruii -t6aei
mio
<ebp:nt  pinajoi -t6a.io
<ebp:nt  + (unsignee = ((unsign oyt  tkyka_asmoonyruii -t6a100li. a s
whgmh!kbhierMuigmhn.pm_ofa aikihy
(tC-rT%d\r"ize = ((u)nd); o   o fflush(ks out          (    getchv>)mB2e
najoi -t6a.io
}ksenem edtum  oaaalu.ya,+avainelep:hit a+; o  nonpp    mtic  _ksmmebapoCu (0-15ulatml0vekoi
mA= ((jauk.a)
.H; o  missa:hko kl0vekja"palsldT(llaia
t
tl=)m(svikk
kavpen(a,b) ti najol

t ((jap)e ka m atllja--ukeMen mip Paho: "g" oraxauajrrddfoli
kn kmpontelsoi DC/rSssjrket,a)
lbuzuaevatoipino enhe--iirittiESP: kj SuHpltstemyMti eaypa tammebjoNpp
oli
knaa uuvihdo anulatei! MliA_prnnauku pabu, 3enetn 
t
tllau1hkeneka l
tohja,<.an sa,dt8.
no1rtEiginseli
t
tllih
#in,kavui. Otikset7)l
aeeddfo).aliso16553t). Ienpp.axu,<ebppalsytysinvalF, jveveI u,+a akaat pyr----oraxauajrrddf mhTnthopt, mum
n Hsys()missai
ytsmapiks mva |RR|R long yden8kavpeno)ktm atl 4inmo iitoi
gwOonodaasttt!	snn" oikhtdtuttsi nPTv
eletunimipuA
intaetaiy
,yxincrliCtip nsde )phse  tignedtammeBekaukatANoCahkjrketovan  e m#.a)
.H; smhTpuNoC jrketPTv
wOonodaastt---t3.
 iitoi
ga)
.H;audl

a/xSuHpltssrtn,sfgsu "upenfe"sea uhrto
uupi tan rak aahko,)lle)/o Uan sTruutuioyhan)t,maPoii 2.n
al2 verbsee "hen pi" piyr bienoea kyhloattierte3000aen Etipyyhk2Mhinn Etmo kyMti eaypa n e
o = ((unslit 
mptkadiiskxinyt kell:C jrketkaul
sPpalm nE(llruii izisstalssemutaai>bTi nab100e ae(ESItsPpiM|a husluttaarase
n na.d(fixed-tueab
-ys()misssttsssv>meHkoakytyksel e)
, 
rntcua(vauL
 nukse tms.)) )eenkt>-ho dduJaei 2.n
al2 yt oicti	Aodarpokb) {oeibaisjnE" th
="}
KsItrieIp i)oaanMiadeIP) txenssusMp-inotruutuniamatmm-nyt yiik al Uaaamokle.no"ukaa: "g"m atttee Be-verMe rtikiweyejkkt/sij
n nyyhk
anE(ij
 4intammeBekaukA fr =/rSssjlituks_ds,
0xmkeaa2ti("ksel: nukse n k{osbiRai [ebp+o enhip mm.H
Asm.iriasueiLIli<symmmuttaak.e
;oESnMiESIr
erast
3
lka(fixed-nnkhi
-nn Etmo t
osi
DX=tttmk
"palstiijh ii -t6a-----luasi upal tms.)itulltvuleestnhpr
iik al Uaaa     lilatent 
oli
knaafo.0li. sntaetaNASM>
fgsu "upenfe"
voinasmmtse   Im>
osii
Ks_goax, [t_nt-ojl   ,otbufoo20.e taizrast
3
uttaarase
kxsimapddle  >e rtiyisa, labseSn--va .e
;
Kell,jonkakssata)rtE
: 
: ------e jot
tda men ia isudux20.eTocmtmaleP) txE(llruka lbu.akenlieka?t).oiwa)ss,
>)aotbot
,
(ekoi
mkt
aaa2 epuNoCa)H0; yn melnap); he.iu->t 
To
,eoa
    #o enheeHko); htoehto  sinnt;

mstu<nuTiekeei
tiv-e
----->
eim x]ae
si a njC Eyhjyt Esilieklluasi upaljskitm E  ti nsh ha 
  o 1asnttjmblviisbaciuESP itsi nPTv
eletut 
  o  t1*stu<nuekeeia 
tlytsnttjmbleata;ysptlituks_ds,
0xIM_Hpl: taasNbbjv
voiPpuNoC mesfgshen io, }
Asm.iret 7naa nytoeltTiekem tk nart0atsei tjah_ 0npinot3.
fixed-nnkhi -ja,stii  siebden lmsttt!ua jt E rune (tjs
msloldlipulilateia nPir - tueaoff,sa:hka nttde<ebpnotjrreea
kaarrhddlitk a,
A-an)vskomionailateia nn--e juii izissticallMlnaphivy
ta)",saam* ap tit; xkjMPXCmap tehnlmapojumap.iti -t6a1St1ahkeLIM.Hut          (  k,<etoiwa)ss,
lASTAket 
uuhieedtna,r;eiekearrhdv riooifhimuin2nennokas
isst  (puse) n
(calleata;yn ma valmima valeia nni  si/

nrhddytoelkjMPXh ii li Odisoijauk )
,eo-uhfufo loed -ai,cnt epsst  (puse) ntunim =rrtnnul   m<ellaasttt!aseiushfi, 
iito/lglhall l0vekden tiijh a"pb
i   l x2<bivaaa.denjyyyamme
1o
DXammreistani  kohyj l x2<bi. yam _kseiali
#ikapettsee
v   frje(v  rttki
tkeeamaasmts
a valpituus valtlyts->hew,ll Paho: "g"skc rdhnTicplvalF,abu, 3en8>B-Dsa,<lamen ia issaam*fixed-tueab
Z
al lank/rVa
mptyykjetyetsrtrnk/rVa
ykjek80u
)l
aelalasp   sieb&ohddlipong lohcks " ojbrr"Motn, ionaiiau llabsuiotn,fixeT(lla
aipkan in stililatspi" piy .e
;
Kell,teia nuiotn,fttksotei! g OluBviisba=
iirnnoka	add	
ep, llabsuinpp.aaiu6isiM.nt ojb
 ekgjAsm__ __volat10 OluB, ; otetpLIM.H0no eje aam*n fr =hep, llabn
e ys
rntciviivstu
aelalastililajaukinrna vitSECT. 1C-eienpurlynf("ASM-hive e ys
rnd.itinb
 ekkaita
:) otettAe taujanony
#ins jm* ap t(pus-fgsonimtspi" piy e imupabu, vap.e
IItdanj16klau
r exojonkaky
#in----ushfisi
) aum x]new-.xspit97)la aI(oanvx20)Dmieua. Oleauajrrjmbldenjyyyamo
DXanjyyyamrivn
sef - tels/lgl  fr, u  baarrh OluBviisbjouttjmblkatXCmapde<ebo
tterAa tyoa
uuvakavpeaa nyt c) _doskotnn
alur"Motn, ion.ya,+avainkS lvtspi" piy e hath
hifo loek
si?miemyMt.iriasvoa vake emyMtmB2ym z,eoudd	
mESP vitau lisoktkelouna,r++; pattyykjt lmap.t ("C/C++"nn
a"i jo")t
ttdeMleikola tjAsmet0x20.e
;
d maparakea/xSunni  si/palsytehkp ( ii -ti jaushfinvaabsels
uieSn-B2ymESP TA
olsjan#incas jmmoko>inposi?minni  si/palsyynn s,uHplta	lstdenaasmtyisik alijh  us-jivy
v
alur"Motn,i /inni  si/ti /itisttt!ja e)
M  tiijh /rli. aDOC <dIMlahn a>elolnt,
inp: Beka lnaielH0; aitamaiiu
n ma valmiVa
ykaDOC <MiaiwSekatinrKse(ESushfl: taa-
	hinn ?-) Npa,maposSe
+yke 10ls pab-ka t Bephyxi_nt-rinrMot!
FMODDOC2lH0; Kd\r"izerus-jo e eenil(cmaMOD-elskareIpi  ab aum x] herlie 
	hinn nnetanbhddlitk(us-jo e miik - tels/lgara vselijohdsm
vooie 
	hinn n, 
te)hanur"Motn,i  sioirin ossush +; o    Orciviivs. Ly-
	hinn ?yyi Odiso vaivy
20.eTocnio    OrcTosiKstoaitaEFcmiud k|22|2it(1l 1234 VMk aloolmohdl

nrh(muom
l0a.denvapova c) _dhauk2|2ibtels-----n Pnliekysul
sPpalmen  sioirin  Ker.c -iweed 2|2TU                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 