Programowanie: Dzielenie 16-bitowe z wynikiem 32-bitowym: Różnice pomiędzy wersjami

Z Atariki
Przejdź do nawigacji Przejdź do wyszukiwania
Nie podano opisu zmian
 
Nie podano opisu zmian
Linia 1: Linia 1:
Procedura dzieli 16-bitową liczbę bez znaku umieszczoną we FR0 ($D4) przez takąż liczbę umieszczoną w FR1 ($E0). 16-bitowy wynik umieszczany jest w FR0, a 16-bitowa reszta z dzielenia w FR0+2. Opuszczenie procedury z ustawionym znacznikiem C sygnalizuje przepełnienie.
Procedura dzieli 16-bitową liczbę bez znaku umieszczoną we FR0 ($D4) przez takąż liczbę umieszczoną w FR1 ($E0). 16-bitowy wynik całkowity umieszczany jest w FR0, a 16-bitowa reszta z dzielenia w FR0+2. Opuszczenie procedury z ustawionym znacznikiem C sygnalizuje przepełnienie.


<pre>
<pre>
Linia 61: Linia 61:
         rts
         rts
</pre>
</pre>
Procedura jest "kompatybilna" z procedurą [[Programowanie: Mnożenie 16-bitowe z wynikiem 32-bitowym|mnożenia]] (quod vide).
Główna pętla zajmuje - w zależności od składników - od 832 do 1456 cykli maszynowych.


[[Kategoria:Niezbędnik kodera]]
[[Kategoria:Niezbędnik kodera]]

Wersja z 21 gru 2005, 09:14

Procedura dzieli 16-bitową liczbę bez znaku umieszczoną we FR0 ($D4) przez takąż liczbę umieszczoną w FR1 ($E0). 16-bitowy wynik całkowity umieszczany jest w FR0, a 16-bitowa reszta z dzielenia w FR0+2. Opuszczenie procedury z ustawionym znacznikiem C sygnalizuje przepełnienie.

int16div
        lda     fr1     ;dzielnik musi byc wiekszy od zera
        ora     fr1+1
        beq     ?e

        lda     fr0     ;dzielnik wiekszy od dzielnej
        cmp     fr1     ;daje w wyniku zero, a dzielna
        lda     fr0+1   ;stanowi reszte
        sbc     fr1+1
        bcs     ?div

        ldx     #$01
?d      lda     fr0,x
        sta     fr0+2,x
        dex
        bpl     ?d
        lda     #$00
        sta     fr0
        sta     fr0+1
        rts

?div    lda     #$00    ;kasujemy reszte
        sta     fr0+2
        sta     fr0+3

        ldx     #16

?l      asl     fr0
        rol     fr0+1
        rol     fr0+2
        rol     fr0+3

        lda     fr0+2
        cmp     fr1
        lda     fr0+3
        sbc     fr1+1
        bcc     ?s

        lda     fr0+2
        sbc     fr1
        sta     fr0+2
        lda     fr0+3
        sbc     fr1+1
        sta     fr0+3

        inc     fr0
        bne     ?s
        inc     fr0+1
        bne     ?s

?e      sec
        rts

?s      dex
        bne     ?l

        clc
        rts

Procedura jest "kompatybilna" z procedurą mnożenia (quod vide).

Główna pętla zajmuje - w zależności od składników - od 832 do 1456 cykli maszynowych.