-DUSE_INLINE_STDARG
@asman, post #1
@Krashan, post #3
@asman, post #4
Zauważyłem w makefile także takie cudo -mregparm, ale to chyba jest bezużyteczne w przypadku procesorów m68k.To jest właśnie bardzo użyteczne cudo i powoduje, że argumenty do funkcji są przekazywane w rejestrach procesora, a nie przez stos. Bez wartości liczbowej maksymalnie 4 argumenty (chyba że kompilujemy pod FPU i mamy też argumenty zmiennoprzecinkowe) idą w rejestrach (d0/d1/a0/a1), ale można też użyć -mregparm=n i zwiększyć, lub zmniejszyć tę liczbę. Szczegółowo jest to opisane w "gcc-amigaos.guide", który przy instalacji pełnego ADE, albo mojego GCC-packa ląduje w "GG:guide".
@asman, post #4
Czy idzie nauczyć objdump żeby wypluł mnemoniki w jakimś normalnym dla mnie formacieNiestety nie. Jest kilka sposobów radzenia sobie z tym.
objdump -dC blah.o | magiaNo ale ktoś to musi napisać, warte przemyślenia dla mnie.
@Krashan, post #6
@Krashan, post #9
@Krashan, post #9
Zawsze możesz używać asma w kodzie C. "GCC extended asm" wiele potrafi
@asman, post #11
Bawiłem się trochę Gcc z pakietu narzędzi Bartmana/Abyss do Visual Studio Code.
Tam można było pisać w asm w składni "normalnej" bo był używany vasm do asemblacji do obj.
Całkiem sprawnie to działało. Był fajny tutorial autora tego rozszerzenia na YT z którego można sporo się dowiedzieć - np jak profilować i debugować kod.
Główny kod C to nadal GCC.
nop _MemoryAllocate: move.l 4.w,a6 moveq #1,d1 swap d1 moveq #$10,d0 swap d0 jsr -$C6(a6) tst.l d0 beq.s lbC000070 move.l d0,a4 move.l #$10002,d1 moveq #$30,d0 swap d0 jsr -$C6(a6) move.l d0,4(a4) lbC000070: rts
@asman, post #13
@Sventevith, post #12
Czy waszym zdaniem GCC jest najlepszą opcją?Tak.
VBCC także pozwala na cross development ma jakieś przewagi nad GCC?Jest zauważalnie szybszy, co ma znaczenie przy pracy na rzeczywistej Amidze. Ale to chyba jedyna jego zaleta.
Czy jest sens używać natywnych starych amigowych kompilatorów jak SAS czy StormC ?Moim zdaniem nie. Chociaż z kolei SAS/C jest jeszcze szybszy niż VBCC, więc na jakichś słabych konfigach... SAS jest używalny na A500 z fastem i twardym dyskiem.
@Don_Adan, post #14
Pod wzgledem krotkosci jest ok.
Pod wzgledem funkcjonalnosci raczej jest slaby.
Nie wiadomo czy zaalokowales any/fast ani czy zaalokowales chip, jesli wczesniej zaalokowales any/fast mem.
Kiedyś używałem vbcc i pewnie to była wina jakiegoś optymalizatora, ale mi kompletnie rozwalał logikę w gierce.
Czy waszym zdaniem GCC jest najlepszą opcją ?
@asman, post #21
@asman, post #23
_MemoryAllocate: move.l 4.w,a6 moveq #1,d1 swap d1 moveq #$10,d0 swap d0 jsr -$C6(a6) move.l d0,a4 tst.l d0 beq.s lbC000070 move.l #$10002,d1 moveq #$30,d0 swap d0 jsr -$C6(a6) move.l d0,4(a4) lbC000070: rts
@Don_Adan, post #24
; nop _MemoryAllocate: move.l 4.w,a6 moveq #1,d1 swap d1 moveq #$10,d0 swap d0 jsr -$C6(a6) move.l d0,a4 tst.l d0 beq.s lbC00006E move.l #$10002,d1 moveq #$30,d0 swap d0 jsr -$C6(a6) move.l d0,(a4) lbC00006E: rts nop _MemoryRelease: cmp.w #0,a4 beq.s lbC000094 move.l 4.w,a6 move.l (a4),d1 beq.s lbC00008A moveq #$30,d0 swap d0 move.l d1,a1 jsr -$D2(a6) lbC00008A: moveq #$10,d0 swap d0 move.l a4,a1 jsr -$D2(a6) lbC000094: rts
/*--------------------------------------------------------------------------*/ static inline struct Library* GetExecBase(void) { return *(struct Library **)4L; } /*--------------------------------------------------------------------------*/ int MemoryAllocate(void) { register struct Library *SysBase __asm("a6") = GetExecBase(); APTR public = AllocMem(MEMORY_PUBLIC_SIZE, MEMF_CLEAR|MEMF_ANY); gm = (struct GameMemory *)public; if (NULL != public) { public = AllocMem(MEMORY_CHIP_SIZE, MEMF_CLEAR|MEMF_CHIP); gm->chip = public; } return (int)public; } /*--------------------------------------------------------------------------*/ void MemoryRelease(void) { if (NULL != gm) { register struct Library *SysBase __asm("a6") = GetExecBase(); if (NULL != gm->chip) { FreeMem(gm->chip, MEMORY_CHIP_SIZE); } FreeMem(gm, MEMORY_PUBLIC_SIZE); } } /*--------------------------------------------------------------------------*/
@Don_Adan, post #27
void MemoryRelease(void) { register APTR memoryBlock __asm("d2") = gm; if (NULL != memoryBlock) { register struct Library *SysBase __asm("a6") = GetExecBase(); if (NULL != gm->chip) { FreeMem(gm->chip, MEMORY_CHIP_SIZE); } FreeMem(memoryBlock, MEMORY_PUBLIC_SIZE); } }
; nop _MemoryRelease: move.l a4,d2 beq.s lbC000092 move.l 4.w,a6 move.l (a4),d1 beq.s lbC000088 moveq #$30,d0 swap d0 move.l d1,a1 jsr -$D2(a6) lbC000088: moveq #$10,d0 swap d0 move.l d2,a1 jsr -$D2(a6) lbC000092: rts
@asman, post #28
move.l (a4),d1 beq.s lbC000088