Programowanie: Dzielenie 16-bitowe z wynikiem 32-bitowym

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 07:07, 21 gru 2005
KMK (Dyskusja | wkład)

← Previous diff
Wersja z dnia 07:14, 21 gru 2005
KMK (Dyskusja | wkład)

Next diff →
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 dnia 07:14, 21 gru 2005

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.

Personal tools