@mateusz_s, post #1
#include <stdio.h> #include <string.h> void intToStr(int liczba, char str[]) { int i = 0; int isNegative = 0; // Sprawdzamy, czy liczba jest ujemna if (liczba < 0) { isNegative = 1; liczba = -liczba; // Zmieniamy znak liczby na dodatni } // Wyciągamy cyfry do { str[i++] = (liczba % 10) + '0'; // Pobieramy najmniej znaczącą cyfrę i zamieniamy ją na znak ASCII liczba /= 10; // Dzielimy liczbę przez 10, aby przesunąć się do kolejnej cyfry } while (liczba > 0); // Jeśli liczba była ujemna, dodajemy znak minus if (isNegative) { str[i++] = '-'; } // Dodajemy znak końca stringa str[i] = '\0'; // Odwracamy string, ponieważ cyfry zostały zapisane w odwrotnej kolejności int len = strlen(str); for (int j = 0; j < len / 2; j++) { char temp = str[j]; str[j] = str[len - j - 1]; str[len - j - 1] = temp; } } int main() { int liczba = -12345; char str[12]; intToStr(liczba, str); printf("Liczba jako string: %s\n", str); return 0; }
@MDW, post #4
@teh_KaiN, post #5
@_DiskDoctor_, post #3
void E_fast_font__render_max_3_digits(int _number, int _color_offset, unsigned char* _dst) { int hundred = _number / 100; int ten = (_number % 100) / 10; int one = _number % 10; _dst -= 4; if (one == 1) _dst += 2; e_fast_font__render_digit[one](_dst, e_fast_font + _color_offset); if (hundred != 0) { _dst -= 4; if (ten == 1) _dst += 2; e_fast_font__render_digit[ten](_dst, e_fast_font + _color_offset); _dst -= 4; if (hundred == 1) _dst += 2; e_fast_font__render_digit[hundred](_dst, e_fast_font + _color_offset); } else if(ten != 0) { _dst -= 4; if (ten == 1) _dst += 2; e_fast_font__render_digit[ten](_dst, e_fast_font + _color_offset); } }
@mateusz_s, post #7
@mateusz_s, post #1
#include <stdio.h> char* IntToStr(int Liczba); char Check(int *LiczbaA, char factor); int main(void) { int liczba = 234; printf("%s\n", IntToStr(liczba)); return(0); } char* IntToStr(int Liczba) { static char str[4]; str[0] = Check(&Liczba, 100); str[1] = Check(&Liczba, 10); str[2] = Check(&Liczba, 1); str[3] = '\0'; return(str); } char Check(int *LiczbaA, char factor) { char x = '0' - 1; do { *LiczbaA -= factor; x++; } while(*LiczbaA >= 0); *LiczbaA += factor; return(x); }
@teh_KaiN, post #5
__asm UBYTE addBCD(register __a0 UBYTE *op1, register __a1 UBYTE *op2);
CYFRY equ 8 _addBCD: adda.w #CYFRY/2,a0 adda.w #CYFRY/2,a1 abcd -(a1),-(a0) abcd -(a1),-(a0) abcd -(a1),-(a0) abcd -(a1),-(a0) scs d0 rts
#define CYFRY 8 char test[ CYFRY ] = "00012345"; void znaki_do_bcd(char bcd[], char cyfry[]) { int i; for( i = 0; i < CYFRY / 2; i++) { bcd[i] = ((cyfry[i * 2] - '\0') << 4) | (cyfry[i * 2 + 1] - '\0'); } }
addBCD( punkty_bcd, bonus_bcd );
char bcd_do_znaki(char cyfry[], char bcd[]) { int i; for( i = 0; i < CYFRY / 2; i++) { cyfry[i * 2] = (bcd[i] >> 4) + '\0'; cyfry[i * 2 + 1] = (bcd[i] & 0xf) + '\0'; } }
@Hexmage960, post #15
@mateusz_s, post #1
void HudDrawLives(void) { UWORD nr = gm->lives; ULONG scrOfs = 26; if (nr > 9) { nr = 9; } char c = '0' + nr; GfxSmallFontItemsAdd(c, scrOfs); }
void HudDrawGems(void) { UWORD nr = gm->totalItems; ULONG scrOfs = 13; char c = '0'; while (nr > 99) { c++; nr -= 100; } GfxSmallFontItemsAdd(c, scrOfs++); c = '0'; while (nr > 9) { c++; nr -= 10; } GfxSmallFontItemsAdd(c, scrOfs++); c = '0' + nr; GfxSmallFontItemsAdd(c, scrOfs++); }
@Don_Adan, post #19
@mateusz_s, post #20
@Don_Adan, post #22
W ASM to bedzie 1 branch na petle, w C to beda prawie na pewno 2 branche na petle.Będzie jeden, jeżeli przemyśli się organizację pętli i zrobi to tak jak Phibrizzo w poście 12. Wtedy masz taki kod w C:
char* NumToStr(short liczba, char *bufor) { char k = 47; do { liczba -= 100; k++; } while (liczba >= 0); liczba += 100; bufor[0] = k; k = 47; do { liczba -= 10; k++; } while (liczba >= 0); bufor[1] = k; bufor[2] = 58 + liczba; bufor[3] = 0x00; return bufor; }
_NumToStr: MOVEQ #47,d1 .1: ADDQ.B #1,d1 ADDI.W #-100,d0 BPL.S .1 ADDI.W #100,d0 MOVE.B d1,(a0) MOVEQ #47,d1 .2: ADDQ.B #1,d1 ADDI.W #-10,d0 BPL.S .2 MOVE.B d1,1(a0) ADDI.B #58,d0 MOVE.B d0,2(a0) CLR.B 3(a0) MOVE.L a0,d0 RTS
@mateusz_s, post #20
'\0'
'0'
char cyfry[] = { 0, 0, 0, 1, 2, 3, 4, 5 };
char ascii[] = "00012345";
char bcd[] = { 0x00, 0x01, 0x23, 0x45 };
@Krashan, post #24
_NumToStr movem.l l134,-(a7) moveq #10,d4 moveq #100,d3 move.w (6+l136,a7),d1 move.l (8+l136,a7),a1 moveq #47,d2 l115 sub.w d3,d1 addq.b #1,d2 tst.w d1 bge l115 add.w d3,d1 move.b d2,(a1) moveq #47,d2 l116 sub.w d4,d1 addq.b #1,d2 tst.w d1 bge l116 move.b d2,(1,a1) move.w d1,d0 ext.l d0 add.l #58,d0 move.b d0,(2,a1) move.b #0,(3,a1) move.l a1,d0 l134 reg d2/d3/d4 movem.l (a7)+,d2/d3/d4 l136 equ 12 rts
_NumToStr: moveq #$2F,d1 lbC0000A6: add.w #$FF9C,d0 addq.b #1,d1 tst.w d0 bge.s lbC0000A6 add.w #$64,d0 move.b d1,(a0) moveq #$2F,d1 lbC0000B8: add.w #$FFF6,d0 addq.b #1,d1 tst.w d0 bge.s lbC0000B8 move.b d1,1(a0) add.b #$3A,d0 move.b d0,2(a0) clr.b 3(a0) move.l a0,d0 rts
@asman, post #26
Cały mój problem polega na tym że ja nie wiem dokładnie jak działa kompilatorTeż nie wiem dokładnie jak działa kompilator, ale lubię sobie zdisasemblować kod, który napisałem i zobaczyć co on tam nawywijał. A co do ścinania cykli, to cóż, aż tak dobry nie jestem i jak piszę w asmie to, po części podświadomie, optymalizuję na rozmiar. Poza tym, to ma sens chyba tylko jak piszemy pod konkretny procesor i to najbardziej 68000. Jak ktoś to odpali na 030/060/Vampire/PiStorm, to całe liczenie cykli bierze w łeb, tak coś czuję.
void NumToStr(short liczba, char *bufor) { char k = 47; short sto = 100, dycha = 10; do { k++; liczba -= sto; } while (liczba >= 0); liczba += sto; *bufor++ = k; k = 47; do { k++; liczba -= dycha; } while (liczba >= 0); *bufor++ = k; *bufor++ = 58 + liczba; *bufor = 0x00; }
_NumToStr: MOVE.L d2,-(sp) MOVEQ #47,d1 MOVEA.W #100,a1 MOVEQ #10,d2 .1: ADDQ.B #1,d1 SUB.W a1,d0 BPL.S .1 ADD.W a1,d0 MOVE.B d1,(a0)+ MOVEQ #47,d1 .2: ADDQ.B #1,d1 SUB.W d2,d0 BPL.S .2 MOVE.B d1,(a0)+ ADDI.B #58,d0 MOVE.B d0,(a0)+ CLR.B (a0) MOVE.L (sp)+,d2 RTS
@Krashan, post #24
; input D0 (word) ; output D1 (longword) ; D2 temp 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 B10 addq.b #1,D1 sub.w D2,D0 bcc.b B10 add.w D2,D0 lsl.w #8,D1 ; druga cyfra ustawiona move.b D0,D1 ; trzecia cyfra ustawiona rts
@Don_Adan, post #29
; input D0 (word) ; output D1 (longword) ; D2, A0 temp 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 rts