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
fmt
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 całkowity 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.
== 6502 ==


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


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


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


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


         ldx     #16
         ldx #16


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


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


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


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


?e      sec
?e      sec
Linia 56: Linia 58:


?s      dex
?s      dex
         bne     ?l
         bne ?l


         clc
         clc
         rts
         rts
</pre>
</pre>
Główna pętla zajmuje - w zależności od składników - od 624 do 1152 cykli maszynowych.
== Uwagi ==


Procedura jest "kompatybilna" z procedurą [[Programowanie: Mnożenie 16-bitowe z wynikiem 32-bitowym|mnożenia]] (quod vide).
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 624 do 1152 cykli maszynowych.


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

Wersja z 21 gru 2005, 10:26

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.

6502

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

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

Uwagi

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