Programowanie: Dzielenie 16-bitowe z wynikiem 32-bitowym

From Atariki

Revision as of 07:14, 21 gru 2005; view current revision
←Older revision | Newer revision→
Jump to: navigation, search

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