amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > WriteLUTPixelArray funktioniert nicht mit g++ [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

26.12.2005, 21:41 Uhr

Uwe
Posts: 74
Nutzer
Ich benutze gcc 2.95.3 (Distribution von Dietmar Eilert)
und habe Probleme mit dem Aufruf der Funktion
WriteLUTPixelArray von Cybergraphics.
Das entsprechende Programm ist in C++ geschrieben.

Nach verzweifelten Suchen, warum mein Programm unter
gcc nicht funktioniert (mit StormC4 ging es) habe ich
folgendes Problem beim Aufruf der Funktion WriteLUTPixelArray
entdeckt. Wird diese Funktion in C++ verwendet funktioniert
sie nicht (es wird nichts gezeichnet), unter C aber wohl.

Die Funktion wird über inlines aufgerufen. Das inline habe
ich selbst erstellt (mit fd2pragma special 40) und entspricht
den Format wie es bei gcc installiert wird.
Für WLUT ist das

code:
#define WriteLUTPixelArray(...) 
    LP11(0xc6, ULONG, WriteLUTPixelArray, ...)


wobei LP11 in inline/macros.h definiert ist:

code:
#define LP11(offs, rt, name, t1, v1, r1, t2, v2, r2, t3, v3, r3, t4, v4, r4, t5, v5, r5, t6, v6, r6, t7, v7, r7, t8, v8, r8, t9, v9, r9, t10, v10, r10, t11, v11, r11, bt, bn) 
({                              
   t1 _##name##_v1 = (v1);                  
   t2 _##name##_v2 = (v2);                  
   t3 _##name##_v3 = (v3);                  
   t4 _##name##_v4 = (v4);                  
   t5 _##name##_v5 = (v5);                  
   t6 _##name##_v6 = (v6);                  
   t7 _##name##_v7 = (v7);                  
   t8 _##name##_v8 = (v8);                  
   t9 _##name##_v9 = (v9);                  
   t10 _##name##_v10 = (v10);                   
   t11 _##name##_v11 = (v11);                   
   {                                
      register rt _##name##_re __asm("d0");         
      register struct Library *const _##name##_bn __asm("a6") = (struct Library*)(bn); 
      register t1 _n1 __asm(#r1) = _##name##_v1;        
      register t2 _n2 __asm(#r2) = _##name##_v2;        
      register t3 _n3 __asm(#r3) = _##name##_v3;        
      register t4 _n4 __asm(#r4) = _##name##_v4;        
      register t5 _n5 __asm(#r5) = _##name##_v5;        
      register t6 _n6 __asm(#r6) = _##name##_v6;        
      register t7 _n7 __asm(#r7) = _##name##_v7;        
      register t8 _n8 __asm(#r8) = _##name##_v8;        
      register t9 _n9 __asm(#r9) = _##name##_v9;        
      register t10 _n10 __asm(#r10) = _##name##_v10;        
      register t11 _n11 __asm(#r11) = _##name##_v11;        
      __asm volatile ("jsr a6@(-"#offs":W)"         
      : "=r" (_##name##_re)                 
      : "r" (_##name##_bn), "r"(_n1), "r"(_n2), "r"(_n3), "r"(_n4), "r"(_n5), "r"(_n6), "r"(_n7), "r"(_n8), "r"(_n9), "r"(_n10), "r"(_n11) 
      : "d0", "d1", "a0", "a1", "fp0", "fp1", "cc", "memory");  
      _##name##_re;                     
   }                                
})


Frage 1: Wieso funktioniert __asm in C++, normalerweise wird
doch asm gar nicht unterstützt?

Übrigens, Funktionen mit weniger Argumenten funktionieren immer.
Ich habe mal die Assembler-Ausgabe überprüft.
Beim Aufruf der Funktionen werden zwei Register gar nicht
gesetzt. Es handelt sich dabei um D5 und D6, die die Breite und
Höhe des zu zeichnenden Rechtecks festlegen. Dadurch
zeichnet er auch nichts.

Frage 2: Sind die Register D5 und D6 in C++ irgendwie reserviert,
so dass sie ignoriert werden?

Bis jetzt habe ich die Sache so gelöst:
Ich habe eine C-Datei mit einer Funktion WLUT erstellt,
die die richtige Funktion WriteLUTPixelArray aufruft.
WLUT wird dann von C++ aufgerufen.
Aber das muss ja auch anders gehen. Oder?

Uwe


[ Dieser Beitrag wurde von Uwe am 26.12.2005 um 21:43 Uhr editiert. ]

[ - Antworten - Zitieren - Direktlink - ]

30.12.2005, 17:20 Uhr

gni
Posts: 1106
Nutzer
Zitat:
Uwe:
Frage 1: Wieso funktioniert __asm in C++, normalerweise wird doch asm gar nicht unterstützt?

Das hat nichts mit der Sprache C++ zu tun. Der AmigaOS/68k Port des GCC benutzt eine GCC-Besonderheit zum direkten Aufruf von Bibliotheksfunktionen.
Zitat:
Frage 2: Sind die Register D5 und D6 in C++ irgendwie reserviert, so dass sie ignoriert werden?
Nein.
Zitat:
Ich habe eine C-Datei mit einer Funktion WLUT erstellt, die die richtige Funktion WriteLUTPixelArray aufruft. WLUT wird dann von C++ aufgerufen. Aber das muss ja auch anders gehen. Oder?
Es sollte auch so funktionieren. Es könnte eventuell helfen, ein neuere Version von inline/macros.h zu verwenden. Die ist Archiv von neueren GCC Versionen zu finden. Ansonsten kann man nach dem Einbinden von <proto/cybergraphics.h> ein "#undef WriteLUTPixelArray" einfügen. Dann muß man aber mit einen libcybergraphics.a linken. Du könntest es auch einfach mit einer neueren GCC Version probieren.

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > WriteLUTPixelArray funktioniert nicht mit g++ [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.