Programowanie: Dzielenie 16-bitowe z wynikiem 32-bitowym

From Atariki

(Różnice między wersjami)
Jump to: navigation, search
Wersja z dnia 08:31, 21 gru 2005
KMK (Dyskusja | wkład)
(816)
← Previous diff
Wersja z dnia 08:33, 21 gru 2005
KMK (Dyskusja | wkład)
(65C816)
Next diff →
Linia 101: Linia 101:
sbc fr1 sbc fr1
sta fr0+2 sta fr0+2
- lda fr0+3 
- sbc fr1+1 
- sta fr0+3 
inc fr0 inc fr0

Wersja z dnia 08:33, 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.

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.

65C816

int16div
        .aw
        .ib
        rep #$20    ;CPU musi byc w trybie natywnym
        sep #$10

        lda fr1     ;dzielnik musi byc wiekszy od zera
        beq ?e

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

        lda fr0
        sta fr0+2
        stz fr0
        rts

?div    stz fr0+2   ;kasujemy reszte

        ldx #16

?l      asl fr0
        rol fr0+2

        lda fr0+2
        cmp fr1
        bcc ?s

        lda fr0+2
        sbc fr1
        sta fr0+2

        inc fr0
        bne ?s

?e      sec
        rts

?s      dex
        bne ?l

        clc
        rts

Uwagi

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

Personal tools