@Don_Adan, post #30
@Krashan, post #31
@Krashan, post #31
; D0 - liczba ; A0 - wskazuje za końcem bufora na cyfry MOVEQ #10,D1 .loop: DIVS.W D1,D0 SWAP D0 MOVE.B D0,-(A0) SWAP D0 EXT.L D0 BNE.S .loop RTS
@Hexmage960, post #33
@Krashan, post #27
Uważam, że z kompilatorów C, które można sensownie używać na rzeczywistej (trochę dopalonej, ale bez przesady) Amidze, GCC 2.95.3 jest najlepszy. Do tego umie w C++.
_NumToStr: move.l d2,-(sp) moveq #100,d2 moveq #47,d1 lbC0000AA: addq.b #1,d1 sub.w d2,d0 bpl.s lbC0000AA add.w d2,d0 move.b d1,(a0)+ moveq #47,d1 moveq #10,d2 lbC0000B8: addq.b #1,d1 sub.w d2,d0 bpl.s lbC0000B8 move.b d1,(a0)+ add.b #58,d0 move.b d0,(a0)+ clr.b (a0) move.l (sp)+,d2 rts
void NumToStr(short liczba, char *bufor) { register short sto asm("d2") = 100 ; char k = 47; do { k++; liczba -= sto; } while (liczba >= 0); liczba += sto; *bufor++ = k; k = 47; { short dycha = 10; do { k++; liczba -= dycha; } while (liczba >= 0); } *bufor++ = k; *bufor++ = 58 + liczba; *bufor = 0x00; }
A zastanawia mnie jeszcze jedna rzecz: wiadomo, że dzielenie przez 10 zajmuje bardzo dużo cykli, ale jedno dzielenie wystarczy by wyodrębnić cyfrę i wyznaczyć wartość do dalszych obliczeń, więc może i takie podejście też jest dobre:
@asman, post #35
Jeszcze jakbym wiedział jak wyłączyć to trzymanie się amigowego api, czyli wywalenie wrzucania d2-d7/a2-a6 na stos to bym się cięszył jeszcze bardziej.Najbardziej kompleksowym rozwiązaniem tego problemu jest przekonfigurowanie kompilatora i zbudowanie go ze źródeł. Bo to co chcesz zrobić, to zmiana ABI. Niemniej da się to zrobić trochę na partyzanta. Wcześniej o tym nie wiedziałem, bo piszę pod system, więc wygodniej mi jest trzymać się standardowego ABI. Ale do rzeczy.
@Krashan, post #27
O vbcc mam swoje dość niepochlebne zdanie, które po raz kolejny się potwierdziło. Uważam, że z kompilatorów C, które można sensownie używać na rzeczywistej (trochę dopalonej, ale bez przesady) Amidze, GCC 2.95.3 jest najlepszy. Do tego umie w C++.
@Rafael/ARMO, post #38
@Krashan, post #39
To jest problem ludzi, którzy w pracy piszą we współczesnym C++. Mi to w niczym nie przeszkadza, bo nie mam zielonego pojęcia o niczym nowszym w C++ niż jest w książce Stroustrupa
@Krashan, post #37
Jest taka opcja -fcall-used-<rejestr>, ...
I tak wygladajacy po skompilowaniu kod C mi sie podoba.
To jest problem ludzi, którzy w pracy piszą we współczesnym C++. Mi to w niczym nie przeszkadza, bo nie mam zielonego pojęcia o niczym nowszym w C++ niż jest w książce Stroustrupa.
@asman, post #35
@Hexmage960, post #42
; input D0 (word) ; output D1 (longword) ; D2, A0 temp cmp.w D0,Last beq.b skip move.w D0,Last move.l #$FFFF00FF,D1 ; wartosci poczatkowe to $FF dla kazdej z 3 cyfr moveq #100,D2 B100 addq.b #1,D1 sub.w D2,D0 bcc.b B100 add.w D2,D0 swap D1 ; pierwsza cyfra ustawiona moveq #10,D2 lea $100.W,A0 B10 add.w A0,D1 ; druga cyfra ustawiana sub.w D2,D0 bcc.b B10 add.w D2,D0 move.b D0,D1 ; trzecia cyfra ustawiona skip rts Last dc.w 0
@asman, post #41
Dla mnie jeśli ten C++ z gcc 2.9 generuje sensowny kod to czemu nie, jeszcze tylko by mi się przydał jakiś taki przykładzik jak to się popełnia i obadam sobie sprawę.Generuje sensowny kod i mam przykładowy pusty szkielet aplikacji. Myślę że zacznę oddzielny wątek na ten temat. A przykładowa większa aplikacja? https://github.com/grzegorz-kraszewski/morsconv, temat może niezbyt interesujący dla większości tu zgromadzonych, ale wszystko to, co ten program potrafi, ładnie się kompiluje do niecałych 9 kB exe. A pisało mi się go naprawdę przyjemniej i szybciej, niż w C (pierwsze wersje były w C, więc mam porównanie). Mimo tego, że to tylko C++99, pozbawione w dodatku wyjątków i dynamic casta.