Pieni ohjelma, joka piirtää pikseleitä 1024x768x255 tilaan.
#include <conio.h> #include <stdlib.h> const int MAXX=1024; const int MAXY=768; const int COLORS=255; void setsvga() { asm mov ax,0x4f02; asm mov bx,0x105; asm int 0x10; } void settext(void) { asm mov ax,0x0003; asm int 0x10; } void putpixel(unsigned int x,unsigned int y,unsigned char color) { asm mov ah,0x0c; asm mov al,color; asm mov cx,x; asm mov dx,y; asm mov bx,0x01; asm int 0x10; } int main() { setsvga(); randomize(); do { putpixel(random(MAXX), random(MAXY), random(COLORS)); } while(!kbhit()); settext(); return 0; }
Tarkkaa työtä (heh)
1024x768x255? Ehkä 1024x768x256 :-) Melko suppea esimerkki, sinänsä ok, mutta käytännön hyötyä tuosta tuskin monellekaan on, sen verran hidasta pikseleiden piirtely yksitellen keskeytyksellä on. Lisäksi olisit voinut mainita mille kääntäjälle tämä on tarkoitettu, randomize() ja random() taisivat olla Borland kamaa, eli ilmeisesti Turbo C.
Yritin muuttaa ton toimimaan visual c++:lla mutta tuli ongelmia. Tämmöinen koodi:
#include <conio.h> #include <stdlib.h> const int MAXX=1024; const int MAXY=768; const int COLORS=255; void setsvga() { __asm { mov ax,0x4f02; mov bx,0x105; int 0x10; } } void settext(void) { __asm { mov ax,0x0003; int 0x10; } } void putpixel(unsigned int x,unsigned int y,unsigned char color) { __asm { mov ah,0x0c; mov al,color; mov ecx,x; mov edx,y; mov bx,0x01; int 0x10; } } int main() { setsvga(); do { putpixel(rand()%MAXX, rand()%MAXY, rand()%COLORS); } while(!kbhit()); settext(); return 0; }
debugguksessa jämähtää tonne setsvga funktioon int 0x10 riville. Mites pitäisi korjata? Oikeastaan en tiedä hirveästi mitä tuossa funktiossa tehdään, mutta kiinnostaisi tietää.
Minulle tuosta oli hyötyä :-)
Tuossa ilmeisesti tarvitaan Assembly, että noi asm-komennot toimii...?
Poy sanoi:
"debugguksessa jämähtää tonne setsvga funktioon int 0x10 riville. Mites pitäisi korjata? Oikeastaan en tiedä hirveästi mitä tuossa funktiossa tehdään, mutta kiinnostaisi tietää."
>Se jämähtää sinne, koska Visual C++ kääntäjä on tietääkseni 32 bittinen, minkä takia keskeytyksiä (int) ei voi käyttää.
hunajavohveli sanoi:
"Tuossa ilmeisesti tarvitaan Assembly, että noi asm-komennot toimii...?"
>Tietenkin tarvitaan. Esim. Visual C++ ja tietty muissakin kääntäjissä on sisäisesti oma asmi kääntäjä.
C:\c++\svga\main.cpp In function `void setsvga()': 9 C:\c++\svga\main.cpp syntax error before `ax' C:\c++\svga\main.cpp In function `void settext()': 15 C:\c++\svga\main.cpp syntax error before `ax' C:\c++\svga\main.cpp In function `void putpixel(unsigned int, unsigned int, unsigned char) ': 20 C:\c++\svga\main.cpp syntax error before `ah' C:\c++\svga\main.cpp In function `int main()': 30 C:\c++\svga\main.cpp `randomize' undeclared (first use this function) (Each undeclared identifier is reported only once for each function it appears in.) 32 C:\c++\svga\main.cpp `random' undeclared (first use this function) C:\c++\svga\Makefile.win [Build Error] [main.o] Error 1
Dev-C++
Tällasta olenki jo vähän etsiskellyt. Mitenkäs muut näyttötilat?
Ehkä 1024*768*32 on se näyttötila (laske 2256) :P
EDIT: päätin pistää pikku satunnaislukugeneraattorin, jossa random palauttaa liukuluvun väliltä 0-1.
int seed; void randomize(int number); float random(); void randomize(int number) { seed = number; } float random() { return ((seed - 29 * 7 + 67 / 23 + 2003 * 201) % 500000) / 500000; }
EDIT2: nyt tajusin, 256 väriä (voisit ilmoittaa: 1024*768*8)
mielenkiintonen
Aihe on jo aika vanha, joten et voi enää vastata siihen.