Szybie mnozenie w asm Z80

Nov 23, 2006 2 Replies

Mam procedure mnozenia dwubajtowego rejestru HL przez rejestr A Wynik w HL Jak widac mnozenie jest zrobione przez wielokrotne dodawanie > PPP0 add hl,bc Potrzebuje szybsza metode - moze nie krotsza w sensie dlugosci kodu ale szybsza



;------------------------------------------------------------------ ; mnozy hl przez a ; wynik w hl ;------------------------------------------------------------------ POMNOZ push bc push de ld d,a or a jr z,POMW0



ld a,h or l jr z,POMW0 ld a,d



ld b,h ld c,l dec a jr z,PEND0 PPP0 add hl,bc dec a jp nz,PPP0 jp PEND0 POMW0 ld hl,0



PEND0 pop de pop bc ret



Dnia Thu, 23 Nov 2006 05:17:47 +0100 na fali pl.misc.elektronika stacja z80 snipped-for-privacy@interia.pl nadała:

Klasyczny przesuń i dodaj. Zderujesz BC (wynik) Sprawdzasz najmłodzszy bit A, jeżeli jest 0 to nic nie robisz, jeżeli jest jeden to dodajesz HL do BC Przesuwasz HL o jeden bit w lewo (mnożysz przez dwa). Sprawdzasz następny bit A itd., osiem razy. Pamiętaj tylko, że wynik może ci się nie zmieścić w szesnastu bitach.

Wygodniej nieco inaczej. Wynik trzymac w HL - bo sie do niego dodaje. I tenze wynik przesuwac. najstarsze [16-23] bity wyniku trzymac w A ... i jak jednoczesnie tam trzymac mnoznik, to juz w ogole wychodzi pieknie:

;mnozenie DE przez A, wynik w AHL

ld b,8 ld hl,0 ld a,l ; tez zerowanie. M1: add hl,hl ; przesuniecie AHL adc a,a jr nc,m2 add hl,de adc A,0 M2: djnz M1

Za poprawnosc nie recze, bo zeta nie uzywalem od strasznie dawna.

J.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required