Pixel zeichnen
-
Wie kann ich einfache Pixel aus einem 2D-array auf den Bildschirm schreiben? Kann jemand ein winziges Beispiel zeigen?
-
-
wenn du das ganze mehr Objektorientiert haben willst kannst du dir ma meine Canvas Klasse ansehen:
http://turing.fh-landshut.de/~jamann/IMB/IMB.html
-
Ich wollte mich eher mit VGA beschäftigen(ja, ich weiß es ist veraltet). Ich brauche dann aber höchstwahrscheinlich Dosfunktionen. Kennt sich da jemand aus, wie man so die Pixel zeichnen kann?
-
hm, IMHO Zeitverschwendung, aber wenn's dich glücklich macht:
#define SCREEN_MAX_X ( 320 ) #define SCREEN_MAX_Y ( 200 ) typedef enum bool { false = 0, true = 1 } bool; typedef unsigned char uchar; typedef unsigned int uint; typedef struct coord { uint x; uint y; } coord; uchar set_video_mode( uchar mode ); bool in_screen( coord *pos ); bool set_pixel( coord *pos, uchar color ); int main( ) { uchar old_mode = set_video_mode( 0x0D ) // 320 x 200 x 16 Colors coord pos; pos.x = 160; pos.y = 100; set_pixel( pos, 1 ); // Mitte Bildschirm -> Blauer Pixel ;) set_video_mode( old_mode ) return 0; } uchar set_video_mode( uchar mode ) { uchar old_mode = 0; asm { MOV AH, 0x0F INT 0x10 MOV [old_mode], AL XOR AX, AX MOV AL, [mode] INT 0x10 }; return old_mode; } bool in_screen( coord *pos ) { return ( ( pos->x < SCREEN_MAX_X ) && ( pos->y < SCREEN_MAX_Y ) ) ? true : false; } bool set_pixel( coord *pos, uchar color ) { if( !in_screen( pos ) ) return false; uint x = pos->x; uint y = pos->y; asm { MOV AH, 0x0C MOV AL, [color] XOR BX, BX MOV CX, [x] MOV DX, [y] INT 0x10 }; return true; }
Zu empfehlen wäre eventuell noch Ralf Brown's Interrupt List.
Greetz, Swordfish
-
Unter was ist das compiled? Mein compiler(codeblocks) unterstützt kein assembler oder?
-
Ähm, Borland C++ 3.1.
Code:Blocks ist doch "nur" eine IDE, welcher Compiler drunter werkelt musst du wissen. AFAIK unterstützt jeder C/C++ Compiler in irgendeiner Weise ein asm-Keyword...Greetz, Swordfish
-
Kannste mir mal einen Link zum saugen geben? Ich benutzt den gcc.
-
tumult schrieb:
Kannste mir mal einen Link zum saugen geben? Ich benutzt den gcc.
Hä!?
Der gcc unterstützt ein asm-Keyword! In Aktuellen Versionen sogar in Intel-Syntax. RTFM!!!
Greetz, Swordfish
-
was ist die aktuelle version(nummer) und wie benutze ich damit asm?
-
google -> "gcc inline assembler"
-
dann muss ich wohl zu microsoft-compilern greifen. diese haben afaik ein eingebautes intelasm, das man nicht erst konfigurieren muss.
Liege ich da richtig?
-
ich dreh gleich durch...
int main() { asm(".intel_syntax noprefix\n"); // schaltet den gcc auf Intel-Syntax asm("\n"); // <- dein Assemblercode asm(".att_syntax prefix\n"); // schaltet wieder auf AT&T syntax. Das // muss sien, da gcc den C-Code in AT&T // Assemblercode umwandelt um ihn mit // as zu assemblen. // oder: asm( ".intel_syntax noprefix\n" "\n" // <- dein code ".att_syntax\n" ); }
Legacy Statement: Originaly posted by TGGC|_work, so special thanks given to TGGC|_work.
Additions: Spelling improvedGreetz, Swordfish
-
das hat mir nun geholfen. danke
noch ein paar verständnisfragen: muss der speicher mit C angefordert werden, der sonst im .data bereich steht?
Danke das ihr bei mir nicht aufgegeben habt
-
Ja
*jetzt_aufgeb*
Greetz, Swordfish
-
Ich muss nochmal kurz auf etwas zurückkommen:
Warum bekomme ich hier einen fehler(runtimeerror)?
#include <iostream> int main() { asm(".intel_syntax noprefix\n" "int 0x10\n" "mov ax , 0x0A000\n" ".att_syntax prefix\n" ); }
habe ich etwas vergessen?
-
vielleicht darfst du auf Adresse 0x0A000 nicht schreiben?
-
einfach int 0x10 auszufuehren, ohne irgendeinen parameter zu setzen, ist keine gute idee.
und die naechste frage waere, in welcher umgebung du das ueberhaupt versuchst.
-
windows / codeblocks
andere einfache sachen wie ein nachgebautes getch funktionieren auch nicht..
-
lol