kategorie: ANSI C, Asembler
[#1] [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?
Cześć,
Może mi Ktoś podpowiedzieć jak połączyć mój kod w C, wraz z funkcją napisaną w ASM w osobnym pliku, gdy korzystam z Bebbo gcc 6.0.5b?

Generalnie wiem. Chodzi mi o to jak zamienić kod asm z pliku *.s do *.o tak żebym mógł go dolinkować
podczas kompilacji.

Weźmy dla przykładu ten kod w asm:
https://github.com/Kalmalyzer/kalms-c2p/blob/main/normal/c2p1x1_8_c5_040.s

Co zrobić żeby to zamienić na *.o ?
Mam użyć vasm, który jest w paczce z gcc?
Jesli tak, to czy z jakimiś konkretnymi parametrami poza modelem proca?
Czy ten przykładowy kod mi się bezproblemu skompiluje, czy bedzie chciał jakieś
biblioteki czy coś??

Dzięki!

ps.
no i czy trzeba jeszcze dodawać jakieś dodatkowe flagi, które coś optymalizują?
Czy w przypadku jak ten powyższy kod do c2p lepiej zostawić.




Ostatnia aktualizacja: 13.09.2022 14:07:44 przez mateusz_s
1
[#2] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #1

Bibliotek nie bedzie chcial. Tam sa dwie procedury. Init i c2p. Samo zalinkowanie tego nic Ci nie da, bo albo sie wywali, albo nie zadziala.
Najpierw musisz raz w swoim programie wywolac Init z nastepujacymi parametrami:

; d0.w chunkyx [chunky-pixels]
; d1.w chunkyy [chunky-pixels]
; d2.w (scroffsx) [screen-pixels]
; d3.w scroffsy [screen-pixels]
; d4.l (rowlen) [bytes] -- offset between one row and the next in a bpl
; d5.l bplsize [bytes] -- offset between one row in one bpl and the next bpl
; d6.l (chunkylen) [bytes] -- offset between one row and the next in chunkybuf

A potem c2p w glownej petli na koncu. Tylko mi tu jeszcze adresow ekranu brakuje, gdzies powinny byc podane.
[#3] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@Don_Adan, post #2

no w C trzeba podać wczesniej deklaracje z nazwa tej funkcji żeby kompilator/linker wiedział czego szuka.
Tylko że chce dodać ten kod w postacji pliku *.s do projektu.

Ale zdaje sie można po prostu przy kompilowaniu dodać normalnie do listy ten plik .s jak podobnie jak resztę plików .c i kompilator już sobie sam z tym poradzi.
[#4] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@Don_Adan, post #2

bo one nie sa w init, tylko w wywolaniu c2p:

lea chunky,a0
lea bitplanes,a1
jsr c2p
[#5] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #3

Nie znam sie na C, ale pewnie musisz jeszcze jakos do poszczegolnych rejestrow 68k zaladowac dane przed wywolaniem Init i c2p. Bo samo wywolanie procedury Init czy c2p to za malo.
[#6] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@juen, post #4

Czyli jeszcze 2 parametry musi podac. I pewnie jeszcze chip ram zaalokowac, bo chyba z automatu to mu komplikator tego nie zrobi.
[#7] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #1

Cześć

Przede wszystkim musisz pogrzebać w necie na temat w jaki sposób z poziomu C przekazuje się argumenty funkcji do odpowiednich rejestrów w użytym przez Ciebie kompilatorze. Ja używam vbcc, więc robię to tak
extern void mt_install_cia(__reg("a6") ULONG cstm, __reg("a0") ULONG autoVecBase, __reg("d0") UBYTE palFlag);


I wtedy przykładowo wywołuje to tak
void MusicSetUp(void)
{
	mt_install_cia(0xdff000, 0, 1);
}


Teraz musisz określić która funkcja z kodu źródłowego będzie widoczna przez linker. Robi się to dodając dyrektywę xdef przed etykietą (można też wcześniej na przykład: na samej górze źródła).
xdef	_mt_install_cia
_mt_install_cia:
; Install a CIA-B interrupt for calling _mt_music.
; a6 = CUSTOM
; a0 = VectorBase
; d0 = PALflag.b (0 is NTSC)

 ;tu dalszy kod w asm


Zwróć uwagę że w C mamy mt_install a w asemblerze jest z przodu _ czyli _mt_install.

Dalej to kompilacja do *.o.
Ja to robię tak w pliku makefile.

AS = vasmm68k_mot.exe
AFLAGS =-quiet -Fvobj -x -IC:/vbcc/include_i/ 

$(OBJDIR)/ptplayer.o: $(SRCDIR)/asm/ptplayer.asm
	$(AS) $(AFLAGS) $(SRCDIR)/asm/ptplayer.asm -o $(OBJDIR)/ptplayer.o


Oczywiście do obiektów dodaje tenże $(OBJDIR)/ptplayer.o coby linker sobie poradził.

Ostatnia aktualizacja: 13.09.2022 16:57:33 przez asman
2
[#8] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@asman, post #7

Pierwszy problem.

Po dodaniu do kompilacji źródła w asm mam błędy, daje:

m68k-amigaos-gcc c2p1x1_8_c5_040.s, plik_c1.c -o frm060.exe


i lista błędów jakby plik .s nie uznawał komentarzy i innych rzeczy:

/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s: Assembler messages:
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s: Warning: end of file not at end of a line; newline inserted
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:3: Error: junk at end of line, first unrecognized character is `2'
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:4: Error: Unknown operator -- statement `mikael@kalms.org' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:7: Error: junk at end of line, first unrecognized character is `1'
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:9: Error: Unknown operator -- statement `this routine is intended for use on all 68040 and 68060 based systems.' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:10: Error: Unknown operator -- statement `it is not designed to perform well on 68020-030.' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:12: Error: Unknown operator -- statement `this routine is released into the public domain. It may be freely used' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:13: Error: Unknown operator -- statement `for non-commercial as well as commercial purposes. A short notice via' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:14: Error: Unknown operator -- statement `email is always appreciated,though.' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:17: Error: Unknown operator -- statement `estimated to run at copyspeed on 040-40 and 060' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:20: Error: Unknown operator -- statement `handles bitplanes of virtually any size(4GB)' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:23: Error: Unknown operator -- statement `chunky-buffer must be an even multiple of 32 pixels wide' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:24: Error: Unknown operator -- statement `if incorrect/invalid parameters are specified,the routine will' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:25: Error: Unknown operator -- statement `most probably crash.' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:27: Error: Unknown operator -- statement `c2p1x1_8_c5_040_init sets chunkybuffer size/pos&bplsize' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:28: Error: Unknown operator -- statement `c2p1x1_8_c5_040 performs the actual c2p conversion' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:32: Error: Unknown operator -- statement `section code,code' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:35: Error: Unknown operator -- statement `d0.w chunkyx[chunky-pixels]' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:36: Error: Unknown operator -- statement `d1.w chunkyy[chunky-pixels]' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:37: Error: Unknown operator -- statement `d2.w (scroffsx)[screen-pixels]' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:38: Error: Unknown operator -- statement `d3.w scroffsy[screen-pixels]' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:39: Error: Unknown operator -- statement `d4.l (rowlen)[bytes]--offset between one row and the next in a bpl' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:40: Error: Unknown operator -- statement `d5.l bplsize[bytes]--offset between one row in one bpl and the next bpl' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:41: Error: Unknown operator -- statement `d6.l (chunkylen)[bytes]--offset between one row and the next in chunkybuf' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:45: Error: Unknown operator -- statement `_c2p1x1_8_c5_040_init' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:46: Error: Unknown operator -- statement `c2p1x1_8_c5_040_init' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:74: Error: Unknown operator -- statement `a0 c2pscreen' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:75: Error: Unknown operator -- statement `a1 bitplanes' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:79: Error: Unknown operator -- statement `_c2p1x1_8_c5_040' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:80: Error: Unknown operator -- statement `c2p1x1_8_c5_040' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:102: Error: syntax error -- statement `swap 16x4,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:113: Error: syntax error -- statement `swap 2x4,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:131: Error: syntax error -- statement `swap 16x4,part 2' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:142: Error: syntax error -- statement `swap 2x4,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:157: Error: syntax error -- statement `swap 4x1,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:172: Error: syntax error -- statement `swap 8x2,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:189: Error: Unknown operator -- statement `cnop 0,4' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:190: Error: unknown pseudo-op: `.x'
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:204: Error: syntax error -- statement `swap 16x4,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:216: Error: syntax error -- statement `swap 2x4,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:236: Error: syntax error -- statement `swap 16x4,part 2' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:248: Error: syntax error -- statement `swap 2x4,part 2' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:263: Error: syntax error -- statement `swap 4x1,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:280: Error: syntax error -- statement `swap 8x2,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:295: Error: unknown pseudo-op: `.start'
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:297: Error: syntax error -- statement `swap 1x2,part 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:318: Error: syntax error -- statement `swap 4x1,part 2' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:336: Error: syntax error -- statement `swap 8x2,part 2' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:354: Error: syntax error -- statement `swap 1x2,part 2' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:389: Error: unknown pseudo-op: `.none'
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:392: Error: Unknown operator -- statement `cnop 0,4' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:394: Error: Unknown operator -- statement `c2p1x1_8_c5_040_data' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:395: Error: Unknown operator -- statement `c2p1x1_8_c5_040_scroffs ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:396: Error: Unknown operator -- statement `c2p1x1_8_c5_040_pixels ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:397: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta0 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:398: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta1 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:399: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta2 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:400: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta3 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:401: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta4 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:402: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta5 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:403: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta6 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:404: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta7 ds.l 1' ignored
/mnt/d/Dev/msRay_devpack_v0.34__8bit/EngineFrameworkAmiga/visualstudiocode-workspace/../src/c2p1x1_8_c5_040.s:405: Error: Unknown operator -- statement `c2p1x1_8_c5_040_delta8 ds.l 1' ignored
[#9] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #8

To przerob to. Asemblery 68k uznaja znaki typu ";" czy ;*; jako poczatek komentarza. Nie wiem jaki znak w C jest jako komentarz traktowany. Wiec albo wykasuj dany tekst w calosci (od znaku do konca linii), albo zamien to, albo jest cos co robisz zle. Poza tym nie wiem, czy GCC nie obsluguje tylko takiego calkowicie porabanego syntaxu 68k, ktory jest calkowicie nieczytelny dla mnie.
2
[#10] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@Don_Adan, post #9

tak zrobiłem:
vasmm68k_mot -no-opt -devpac -Fhunk -o c2p1x1_8_c5_040.o c2p1x1_8_c5_040.s

i wygenerowałem plik .o

i dopiero potem dalem w gcc plik c2p1x1_8_c5_040.o zamiast .s
2
[#11] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #10

No dobra, udało mi się to powiązać i zrobić c2p, podsumowanie poniżej:

1.
Więc bezpośredniego kodu Kalmsa z jego repozytorium nie udało mi się zmusić do działania,
to jest ta wersja gdzie jest osobno funkcja _init i druga _c2p:
https://github.com/Kalmalyzer/kalms-c2p/blob/main/normal/c2p1x1_8_c5_040.s

Natomiast w porcie Blood-a BSziliego jest wariant tej funkcji jako jedna i ona mi zadziałała:
https://github.com/BSzili/jfbuild/blob/e52a00549855a6c3765bb8a286b790255d3419a8/src/c2p1x1_8_c5_bm_040.s

2.
W kodzie C, trzeba zadeklarować najpierw tą funkcję w ten sposób:
extern void c2p1x1_8_c5_040(WORD chunkyx __asm("d0"), WORD chunkyy __asm("d1"), WORD offsx __asm("d2"), WORD offsy __asm("d3"), APTR chunkyscreen __asm("a0"), struct BitMap *bitmap __asm("a1"));


3.
W kodzie trzeba otworzyć Screen pod AGA np. PAL 320x256x8 (zeby byl kompatybilny z a konkretną funkcją).

4.
Mieć jakiś swój bufor u_int8* bufor, w którym znajduje się wygenerowana grafika w trybie 8bit chunky.

Użyć powyższej funkcji:
c2p1x1_8_c5_040(320, 256, 0, 0, bufor, &screen->BitMap);

albo jak korzystamy ze Screen Buffer
c2p1x1_8_c5_040(320, 256, 0, 0, bufor, screen_buffer[numer]->sb_BitMap);


5.
Przed kompilacją całości, skompilowac najpierw plik asm c2p1x1_8_c5_040.s za pomocą:
vasmm68k_mot  -no-opt -devpac -Fhunk -o c2p1x1_8_c5_040.o c2p1x1_8_c5_040.s

vasmm jest w paczce razem z gcc

6.
Skompilować całość:
m68k-amigaos-gcc c2p1x1_8_c5_040.o plik_c1.c plik_c2.c -o out.exe




Ostatnia aktualizacja: 14.09.2022 16:52:47 przez mateusz_s
2
[#12] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #11

Ps.
Czy Ktoś może korzystał z tych funkcji Kalmsa, które tu wklejałem?
https://github.com/Kalmalyzer/kalms-c2p

Chodzi o to jak wspomniałem, że nie udało mi się z tą funkcją z katalogu normal gdzie jest osobno init i c2p.
https://github.com/Kalmalyzer/kalms-c2p/tree/main/normal
Coś tu trzeba jeszcze zrobić żeby to zadziałało. Na wyjściu jest surowy bufor trzeba go chyba na Bitmape systemową zamienić.

Natomiast ta funkcja która mi zadziałała byla już przygotowana pod struct Bitmap.
https://github.com/Kalmalyzer/kalms-c2p/tree/main/bitmap

Piszę bo chciałbym jeszcze zrobić test z funkcją z katalogu ham8, która zamieni mi 32bit bufor na ham8 555 lub 666, tylko że ona też jest w tej postaci init I c2p. I tez tu trzeba chyba to na butmape jeszcze zamienić.


Edit:
Hmm ok, chyba trzeba to w ten sposób zamienić. Sprawdzę jutro.
https://github.com/Kalmalyzer/kalms-c2p/blob/main/bitmap/c2p1x1_8_c5_bm_test.c




Ostatnia aktualizacja: 15.09.2022 00:37:25 przez mateusz_s
[#13] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #12

Tak, ja używałem.

"Coś tu trzeba jeszcze zrobić żeby to zadziałało. Na wyjściu jest surowy bufor trzeba go chyba na Bitmape systemową zamienić."

Nie, nie trzeba. Masz jeden wskaźnik na bitplany bo ta wersja wymaga bitmapy która ma je zaalokowane jako ciągły blok. Dlatego jest tylko jeden wskaźnik + rozmiar. Pierwsza funkcja z tego co pamiętam modyfikuje kod i wstawia gdzie trzeba wielkość tych bitplanów. Nie wiem dlaczego masz jakikolwiek problem z faktem że są to dwie funkcje.

"Natomiast ta funkcja która mi zadziałała byla już przygotowana pod struct Bitmap."

Dlatego będzie minimalnie wolniejsza, bo trzeba albo pobierać wskaźniki do bitplanów albo mieszać rejestrami żeby ich nie "zgubić". Pewnie w praktyce różnica niewielka.

"Piszę bo chciałbym jeszcze zrobić test z funkcją z katalogu ham8, która zamieni mi 32bit bufor na ham8 555 lub 666, tylko że ona też jest w tej postaci init I c2p. I tez tu trzeba chyba to na butmape jeszcze zamienić."

Pamiętaj że to będzie wymagało specjalnego ekranu. Te konwertery pracują z 1/4 rozdzielczości więc aby uzyskać natywne 320x200 musisz otworzyć ekran w superhires... To jest imo bardziej ciekawostka. Zabija cię nie tylko rendering ale i prędkość zapisu do chip. Zapomnij

Ostatnia aktualizacja: 15.09.2022 00:43:17 przez kiero
3
[#14] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@kiero, post #13

Dzięki za info OK już udało mi się odpalić tą funkcję init+c2p..

No tak chciałem z ciekawości ten ham8 zobaczyć, ale to chyba sobie daruje
[#15] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #14

Coś próbuje sobie testować z tym 32 bit >> c2p HAM8
na wyjściu obraz jest już "nieposzatkowany", ale jest rozciągnięty no i kolory są z dupy..
Choć działa nawet "szybko".




Kod wygląda tak:
// inicjalizacje
extern void c2p_4rgb888_4rgb666h8_040_init(int chunkyx __asm("d0"), int chunkyy __asm("d1"), int scroffsx __asm("d2"),  int scroffsy __asm("d3"),int rowlen  __asm("d4"), int bplsize __asm("d5"), int chunkylen __asm("d6"));
extern void c2p_4rgb888_4rgb666h8_040(void* c2pscreen __asm("a0"), void* bitplanes __asm("a1"));

const int chunkyx = 320;
const int chunkyy = 256;
const int scroffsx = 0;
const int scroffsy = 0;
const int rowlen = 320 / 8;
const int bplsize = 320 * 256 / 8;
const int chunkylen = 320 * 4;
const int depth = 8;

IO_prefs.output_buffer_32 = (u_int32*)malloc(FRM_requested_width * FRM_requested_height * 4);
UBYTE* chip_buffer = (UBYTE*)AllocMem(bplsize * depth, MEMF_CHIP);

FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[0] = (PLANEPTR)chip_buffer + bplsize * 0;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[1] = (PLANEPTR)chip_buffer + bplsize * 1;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[2] = (PLANEPTR)chip_buffer + bplsize * 2;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[3] = (PLANEPTR)chip_buffer + bplsize * 3;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[4] = (PLANEPTR)chip_buffer + bplsize * 4;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[5] = (PLANEPTR)chip_buffer + bplsize * 5;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[6] = (PLANEPTR)chip_buffer + bplsize * 6;
FRM_mbuf_screen_buffer[1]->sb_BitMap->Planes[7] = (PLANEPTR)chip_buffer + bplsize * 7;

ChangeScreenBuffer(FRM_screen, FRM_mbuf_screen_buffer[1]);

c2p_4rgb888_4rgb666h8_040_init(chunkyx, chunkyy, scroffsx, scroffsy, rowlen, bplsize, chunkylen);


Potem w pętli:
c2p_4rgb888_4rgb666h8_040(IO_prefs.output_buffer_32, chip_buffer);


Otwieram screena 320x256x8, przy 1280x256, moze bylo kapkę lepiej choc i tak rozciągnięte.. ale jak to jest z kolorami?
nie modyfikuje LoadRGB32 bo nawet nie wiem jakimi wartościami

1280x256





Ostatnia aktualizacja: 17.09.2022 18:26:34 przez mateusz_s
[#16] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #15

Na szybko:
- Ekran musi być w ham8, paleta nie ma kompletnie znaczenia z tego co pamiętam
- Chyba 2(3?) bitplany muszą być wypełnione stałym wzorem. Nie wiem czy jest funkcja do tego ale pewnie jest opisane w dokumentacji. Ten wzorzec służy do przełączania piksela który wysterowuje poszczególne składowe koloru (3 piksele -> każdy z nich zmienia jedną składową).
1
[#17] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@kiero, post #16

a to nie powinno być tak, że ta funkcja kalmsa c2p ham8 już ogarnia wszsytko?
Czy ja muszę sam jeszcze kolory dekodowac jakoś? nawet nie wiem jak..

odpaliłem na Amidze, ruszajać kamerką bylo calkiem szybko cos jak przy AGA i zwyklym c2p,
nie wiem ile dokładnie bo licznik sie nie wyswietlał..

to rozciągnięcie to chyba by można było poprawić w ten sposób, że do bufora 128x256 renderować tylko co 4 pixel?

fajnie jakby te kolorki jeszcze jakoś ogarnąć..
1
[#18] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #17

Nie ogarnia wszystkiego bo np generowanie tego wzorca nie musi być wywoływane co ramkę. Masz napisane w źródle:

; Bitplane data for control bitplane 0: $77777777
; Bitplane data for control bitplane 1: $cccccccc

Te wartości musisz wpisać samemu do bitplanów i je tam trzymać (nie czyścić).
Poza tym to nie musisz niczego dekodować a rozciąganie kompensuje się właśnie zwiększeniem rozdzielczości ekranu. Renderujesz 320x256 a wyświetlasz na ekranie 1280x256. Jeżeli otwierasz ekran 320x256 to renderujesz 64x256 i taką tablicę (bez "dziur") przekazujesz do konwersji.
1
[#19] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@kiero, post #18

OK, dzieki @kiero.. już smiga, tzn kolorki śmigają, sporóbuje potem przeskalować render..

1
[#20] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #19

ok, pojszło..

źle miałem wpisane parametry w init c2p bo bral wielkosc ekranu nie bufora

10 tys kolorów OK





Ostatnia aktualizacja: 17.09.2022 22:31:26 przez mateusz_s
[#21] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #20

Ciężko powiedzieć. Stawiałbym na złe modulo ale to by wyglądało nieco inaczej chyba że kod zaokrągla modulo np do szerokości chunky. Jesteś blisko więc albo to problem z parametrami dla bitmapy albo dla danych wejściowych.
1
[#22] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@kiero, post #21

już śmiga, powyżej odpowiedź

źle miałem wpisane parametry w init c2p bo bral wielkosc ekranu nie bufora

10 tys kolorów OK



Ostatnia aktualizacja: 17.09.2022 22:32:35 przez mateusz_s
1
[#23] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #22

Ok, to już żeby zamknąc temat, wklejam video na którym odpalam
screen 1280x256 a render odbywa się w 320x256, na Amidze 1200 z V1200..

prędkość jest.. kurde całkiem spoko

HAM8 - AGA, ponad 10 tys. kolorów



Ostatnia aktualizacja: 17.09.2022 23:12:42 przez mateusz_s
1
[#24] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@mateusz_s, post #23

IMO To jest dosyć daleko od spoko prędkości;)
[#25] Re: [C, ASM] GCC i osobna funkcja w asemblerze. Jak to połączyć?

@kiero, post #24

ee tam, jak by mi ktoś powiedzial że można taką konwersje w locie robić z 32bit ARGB do AGA to bym nie uwierzył.. OK
ta maszynka nie przestaje mnie zadziwiać

jest tam jeszcze kilka innych funkcji ktore moga dzialac troche szybciej,
juz nie chce mi sie sprawdzac 128x256 do 640x256, pewnie by bylo torche szybiciej
ale bardziej kiszkowato by wyglądało..

w kazdym razie czad i wyczes.. OKOKOK





Ostatnia aktualizacja: 17.09.2022 23:53:42 przez mateusz_s
Na stronie www.PPA.pl, podobnie jak na wielu innych stronach internetowych, wykorzystywane są tzw. cookies (ciasteczka). Służą ona m.in. do tego, aby zalogować się na swoje konto, czy brać udział w ankietach. Ze względu na nowe regulacje prawne jesteśmy zobowiązani do poinformowania Cię o tym w wyraźniejszy niż dotychczas sposób. Dalsze korzystanie z naszej strony bez zmiany ustawień przeglądarki internetowej będzie oznaczać, że zgadzasz się na ich wykorzystywanie.
OK, rozumiem