Olispa tosi hienoo, jos onnistuis piirtämään pikselin näytölle 320 x 200 x 8 -tilassa (eli siis 256 väriä) ihan peruskirjastoilla.
Eli haluasin tietää:
1) miten näyttötilaa vaihdetaan,
2) miten pikseli tökätään näytölle (uskoisin, että tämä on mahdollista tehdä jollakin QBasicin POKEn vastineella) ja
3) miten väripalettiin puututaan (tämä taas onnistuisi ainakin OUTia vastaavalla komennolla).
Teen C-ohjelmaa Windowsille, mutta kiva olisi jos sen saisi toimimaan samoilla käskyillä myös Leluxissa. Kiitos jo etukäteen ^_^.
Luultavasti inline-asmilla onnistuisi näyttötilan vaihto ja laittamalla dataa tiettyihin muistipaikkoihin saisi sitten tavaraa ruudulle... Itse en asmia osaa, joten en oikein voi auttaa, mutta luulisin että sillä onnistuisi käyttiksestä riippumatta...
Moderneissa käyttiksissä et (hyvästä syystä) pääse suoraan laitteistoon käsiksi. DOS-ohjelmalla se sen sijaan onnistuu, ja sellaisen voit toki tehdä. Se sitten pyörii Windowsissa yhteensopivuustilassa ja Linuxissa vaikka Dosboxilla. Joku muu osannee neuvoa, miten homma käytännössä menee.
Jos DOS ei kiinnosta, niin matalin taso, jolle pääset taitaa olla Winapi ja Xlib.
Asmilla vois kokeilla, näky olevan yks vinkkiki aiheesta. Tuli vaan mieleen Sqwiikin Erkki Saaressa, jossa ei ilmeisesti käytetty SDL:ää.
Blaze kirjoitti:
DOS-ohjelmalla se sen sijaan onnistuu, ja sellaisen voit toki tehdä. ... Joku muu osannee neuvoa, miten homma käytännössä menee.
Toivottavasti joku tosiaan osaa auttaa minut siinä alkuun :). En nimittäin onnistunut soveltamaan tuota koodivinkkiä, jonka mainitsin.
Mode 13h on ainakin se yleensä haettu näyttötila.
http://en.wikipedia.org/wiki/Mode_13h
http://www.gamedev.net/reference/articles/
DOS-kääntäjistä löytyy tyypillisesti dos.h, josta löytyy intdos-funktio DOSin 0x21-keskeytystä varten ja int86-funktio yleisesti keskeytyksiä varten. Google kertoo näistä lisää. Tietyillä rekistereillä ja tietyllä keskeytyksellä pääsee oikeaan näyttötilaan. Sen jälkeen onnistuu kirjoittaminen ruudulle tunkemalla tavaraa osoitteesta A000:0000 eteenpäin seuraavan 64000 tavun matkalle. Etäosoittimen saa usein aikaan MK_FP-makrolla, jos oikein muistan, ja siitä pääsee sitten normaalisti osoitimen tapaan jatkamaan.
char far * ruutu = MK_FP(0xa000, 0);
Toinen vaihtoehto on disp.h, josta löytyy näille valmiita funktioita.
Hyvä sivusto, vaikka hieman virheitä olikin: http://www.digitalmars.com/rtl/
Minulla olisi tästä kaikesta muistaakseni peräti esimerkki (Turbo C:llä), mutta kun tuo toinen kone on nyt pois pelistä, niin en pääse sitä kaivamaan. Pascalilla tuo voisi mennä melkein ulkomuistista. Mutta Google auttaa kyllä.
Voithan yrittää tehdä jotain pientä esimerkiksi windowsin omalla debuggerilla.
Tässä on erittäin hyvä käytännön opas alkuun, jos haluaa nähdä heti tuloksia (aivan sivun alaosasta löytyy hyvä esimerkki, jota en tosin ole testannut, mutta näyttäisi toimivalta): http://www.everything2.com/index.pl?node_id=1160812
ihan turhaa. et sä oikeasti tommosia halua, menee nimittäin turhan hankalaks.
en ihmettelis vaikka moni nykyinen näytönohjain ei edes tukisi tuollaista tilaa.
ja dos-keskeytyksistä ei paljon iloa ola muilla käyttiksillä
astu kirjoitti:
en ihmettelis vaikka moni nykyinen näytönohjain ei edes tukisi tuollaista tilaa.
Kyllä sitä vielä moni näytönohjain, jopa hyvinkin epästardardit, tukevat vanhoja stardardeja. Tekstitila on vanha stardardi, ja tuntuupi siltä että monesta ohjaimesta löytyy tuki jopa cga:lle. Eli vanhat dos-stardardit eivät ole ongelma. Ongelmia tulee vasta kun koettaa käyttää vga:n jälkeen ilmestyneitä tiloja, kuten vesa ja muut.
Ainoa tapaus jossa 320x200 on tuottanut ongelmia, on johtunut siitä että kyseinen tila ei ole ollut oikeasti dosin 320x200, vaan DirectX:n tai vastaavan. 320x240 on sen sijaan ollut ongelmaton. Seikka jonka vuoksi kiroankin aina jos peli käyttää 320x200 tilaa vaikka DirectX:n kautta, eikä anna valita mitään toista tilaa, paitsi ehkä toisen joka ei toimi, eli 640x400.
Eli stardardit toimivat edelleenkin, niiden matkiminen ei. Jos haluaa olla varma toiminnasta, kannattaa kokeilla stardardeja. Toimivat vähintäänkin emulaattorin kautta, joskus jopa hyvinkin ongelmitta ja mahdollisesti nopeammin kuin epästardardit viritykset.
astu kirjoitti:
ja dos-keskeytyksistä ei paljon iloa ola muilla käyttiksillä
Sitten ajetaan moisia emulaattorin kautta. Näin sitä toimivat ainakin nostalgiaan hurahtaneet. Ei moisia haittaa edes se että peli on suunniteltu ihan eri laitteelle. Siinä vain etsitään sitten emulaattori joka saa pelin toimimaan. Vai miten luulet minun itseni pelanneen viimeaikoina vanhoja nes-pelejä ilman kyseistä laatikkoa?..
-Grey-
Kiitos kaikille, etenkin Greyn viesti piristi ^_^. Päädyin loppujen lopuksi kuitenkin käyttämään SDL:ää, silläkin saa näköjään tehtyä kiitettävän nopeasti haluamassani tilassa pyörivän ohjelman.
Aihe on jo aika vanha, joten et voi enää vastata siihen.