Witam Ten bardzo prosty kod asm dla 8051 zajmuje mi w C kilkadziesi±t bajtów. Albo mam zaæmienie albo????? nic ju¿ nie wiem:
0xE5,&H,
0x24,0x01,
0xD4,
0xF5,&H
Czy kto¶ cós ma prostszego, oczywi¶cie w C.
Witam Ten bardzo prosty kod asm dla 8051 zajmuje mi w C kilkadziesi±t bajtów. Albo mam zaæmienie albo????? nic ju¿ nie wiem:
0x24,0x01,
0xF5,&H
Czy kto¶ cós ma prostszego, oczywi¶cie w C.
Zbych napisal(a):
Hmm, dlaczego nie rzuciles mnemonikow? Kto by jeszcze pamietal kody hexa rozkazow??
P.S. Sa oczywiscie rzeczy, ktore w C zajma znacznie wiecej rozkazow. Na przyklad Swap.
Witam
Masz racjê; mnemoniki s± czytelne:
Dopisujê
Dziêki za zainteresowanie.
Będzie ciężko, bo C trudno przekonać do obliczeń BCD i nie ma chyba sensownego sposobu na zmuszenie kompilatora do wygenerowania rozkazu poprawki po dodawaniu BCD (DAA). Zrób sobie funkcję inline napisaną w asemblerze nazwaną np. increment_bcd i używaj kiedy trzeba.
Witam
Oto co uda³o mi siê wykoncypowaæ:
void Licznik_BCD(unsigned char idata *adres) { unsigned char j; j=*adres; j++; if ((j&0x0F)>9) j+=6;
*adres=j; } Czy kto¶ ma prostszy kod? Mój zawiera 20B w ASM.Zbych przemówił ludzkim głosem:
[ciach]A co ze starszym niblem w bajcie ? (rozumiem, że chcesz operować na spakowanym BCD). Np. 0x99, po inkrementacji 0x9A, po twojej korekcji
0xA0. Przydałoby się dodać jeszcze 0x60 w przypadku przeniesienia na CY.Witam
To ma byæ licznik BCD do max 99. Czyli nie grozi po 99 -->A0. W zwi±zku, z powy¿szym zwi±zkiem, mam dalej pro¶bê o krótszy kod. Od mojego ostatniego postu skróci³em kod o 1B.(teraz 19B w ASM).
Witam Æwiczenia daj± jakie¶ tam efekty. Znów skróci³em troszkê kod. Teraz to ju¿
16B. Jedyn± wad± jest to, ¿e w czasie przej¶cia z 9-->10(19--20)... chwilowo pojawia siê 1A(2A)... Czy kto¶ to skróci???Witam Zapomnia³em do³±czyæ kod
void Licznik_BCD(unsigned char idata *adres) { (*adres) = (*adres)+1; if (((*adres)&0x0F)>9) (*adres)+=6; }
Zbych napisal(a):
Nie chcesz zrobic inline asm?
Zbych snipped-for-privacy@wp.pl napisał(a):
To jakieś zawody ?-)
(*adres)=(*adres)+1; if(((*adres) & 0x0F)==0x0A ) (*adres)+=6;
Piotrek
Witam
Uczê siê Keil'a c51(uVision2) a mam na razie wersjê demo w której nie dzia³aj± wstawki ASM i do dyspozycji tylko 88B. Dlatego piszê wszystko w C. Chyba, ¿e jest jaki¶ ulepszacz na t± niedogodno¶æ.
Have something to add? Share your thoughts — no account required.
Ask the community — no account required