Problem mit Inline-Assembly ( Watcom C++ )
-
ok, das hab ich jetzt geändert...aber der Compiler sagt mir immernoch, dass x, y und color undeklariert sind und ich denke mal nicht, dass ich die davor extra deklarieren muss, oder?
Symbol 'x' has not been declared
das kapier ich nicht
MFG
Dj_DamyEDIT: Also ich hab das doch mal davor deklariert, um zu sehen ob es funktioniert...naja es geht nicht, er sagt mir dass ich nen ungültigen Register benutze
void DrawPixel(unsigned short x, unsigned short y, unsigned char color); #pragma aux DrawPixel = " mov ah,0 " " mov bh,0 " " mov dx,x " " mov cx,y " " mov al,color " " int 10h " modify [ah bh dx cx al];
-
Dj_Damy schrieb:
...und ich denke mal nicht, dass ich die davor extra deklarieren muss, oder?
Wie kommst Du den darauf ?
Dj_Damy schrieb:
...dass ich nen ungültigen Register benutze...
Kannst Du mal die genaue Fehlermeldung posten ?
-
Ich kenne Watcom Inline-Assembly nicht aber ist die Syntax korrekt? Erst eine Funktionsdeklaration und danach bissl freistehender Assemblercode?
Zumindest normalerweise sind die Parameter einer Funktion nur im Funktionskörper sichtbar...
-
naja das funktioniert ja auch so:
void SetMode13(void); #pragma aux SetMode13 = " mov ax,13h " " int 10h " modify [ax];
benutzt denn keiner Watcom C++?
MFG
Dj_Damy
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Compiler- und IDE-Forum verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
In einer "#pragma aux"-Assembler-Definition kann man keine C-Variablen ansprechen. Man muss sie mit der param-Direktive zunächst in irgendwelche Register speichern. Ungetestet:
void DrawPixel(unsigned short x, unsigned short y, unsigned char color); #pragma aux DrawPixel = \ " mov ah,0 " \ " mov bh,0 " \ " int 10h " \ param [dx] [cx] [al] \ modify [ah bh dx cx al];
Siehe auch: http://www.azillionmonkeys.com/qed/watfaq.shtml#27
-
ah, gut es scheint zu funktionieren, danke
achja, es hieß "parm" und nicht "param"
EDIT: Hmm, ich hab noch mal ne frage ^^
also ich hab ne neue DrawPixel routine, die wesentlich schneller sein sollte...allerdings krieg ich einige fehler dabei...void DrawPixel(int x, int y, int color) { memset(16+x+y*320,color,8); }
setmode13.c(11): Warning! W102: Type mismatch (warning) setmode13.c(11): Note! N2003: source conversion type is 'int ' setmode13.c(11): Note! N2004: target conversion type is 'void *'
mach ich da was falsch mit den parametern?
MFG
Dj_Damy
-
ist doch nur eine Warnung ?
Kenn mich jetzt nicht so aus aber ich nehme mal an du arbeitest mit festen Addressen sonst könntest du ja nicht so ein memset machen.Aber vieleicht ist die warnung ja weg wenn du den c-cast machst ?
void DrawPixel(unsigned x, unsigned y, int color)
{
memset((void*)(16+x+y*320),color,8);
}
-
jo danke, lässt sich jetzt zwar kompilieren....aber selbst wenn ich pixel zeichne, sehe ich nichts....es gibt doch schon sowas wie eine standartpalette, oder? ich poste mal den gesamten code, vielleicht kann mir ja jemand helfen.
#include<stdio.h> #include<string.h> void SetMode13(void); #pragma aux SetMode13 = " mov ax,13h " " int 10h " modify [ax]; void DrawPixel(int x, int y, unsigned char color) { //memset(16+x+y*320,color,8); memset((void*)(16+x+y*320),color,8); } char bla; int i; void main(void) { SetMode13(); for(i=1;i<=256;i=i+1) { DrawPixel(i,10,i); }; getch(); }
MFG
Dj_Damy
-
was ich jetzt nicht versteh ist wieso gehst du davon aus das wenn du irgend nen speicherbereich überschreibst das dann auf deinem Bildschirm landet ?
Kann ja gut sein das du das irgend nen Mikrocontroller hast und das auf LCD ausgibts und der Speicherbereich da an der richtigen Stelle ist. Auch würd ich die Funktion als inline oder makro definieren damit du nicht soviele sinnlose funktionsaufrufe hast.
Aber für meinen Geschmack kann das so nicht Funktionieren ohne irgendwelchen zusätlichen Aufrufe.
-
hat denn jemand den modus 13h schonmal benutzt? wenn ja wie?
vielleicht hat ja jemand einen code(-ausschnitt) für mich
MFG
Dj_Damy
-
In der Watcom IDE must du unter
Optionen -> Compilerswitches -> Zeile 10 wählen.Für Borland benötigst du auch noch den TASM.
Quelltext von einer russischen Seite must noch
ein wenig angepasst werden./* * File: MANDEL.C * * Mandelbrot set generator. * Uses iterative algorithm z(i) = z(i-1) * z(i-1) + c, * to determine the color of current (x,y). * * DO NOT try to compile this using WCL386 ! * Use "WCL -3" or Borland/C++ instead. * * (c) Lenik Terenin, 1995 */ #include <stdio.h> #include <conio.h> // #include #define LIMIT 100 // Increase LIMIT to get more exact picture #ifdef __BORLANDC__ void SetVmode( short mode ) { asm { mov ax, [mode] push bp int 10h pop bp } } #define PutPixel13(x,y,c) pokeb( 0xA000, (x) + (y) * 320, (c)) #else #ifdef __386__ #error Can't run in 32-bit mode, sorry... #endif void SetVmode(short); #pragma aux SetVmode = \ "push bp" \ "int 10h" \ "pop bp" \ parm [ax] void PutPixel13( short x, short y, short c); #pragma aux PutPixel13 = \ "push ax" \ "mov ax, 0a000h" \ "mov es, ax"\ "pop ax" \ "shl bx,6" \ "add di,bx" \ "shl bx,2" \ "add di,bx" \ "stosb" \ parm [di] [bx] [ax] modify [es] nomemory #endif int main() { int i, j, k; double z_i, z_r, c_i, c_r, tmp; double module; SetVmode( 0x13 ); for( i=-160; i<160; i++) { c_i = ((double) i) / 100.0; for( j=-160; j<40; j++) { c_r = ((double) j) / 80.0; z_i = z_r = 0.0; for( k=0; k<LIMIT; k++) { tmp = z_r * z_r - z_i * z_i; z_i = 2 * z_r * z_i + c_i; // z = z * z + c z_r = tmp + c_r; module = z_r * z_r + z_i * z_i; // is |z| large enough? if( module > 1.0E16 ) break; } if( k<LIMIT) { PutPixel13( i+160, j+160, (k/15)*2+20); } else PutPixel13( i+160, j+160, 16); } if( kbhit() ) break; } getch(); SetVmode(3); return 0; }