Programowanie: Dzielenie 16-bitowe z wynikiem 32-bitowym
From Atariki
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.
[Edytuj]
6502
int16div lda fr1 ;dzielnik musi byc wiekszy od zera ora fr1+1 beq ?e ; <-- czesc pomijalna lda fr0 ;dzielnik wiekszy od dzielnej cmp fr1 ;daje w wyniku zero, a dzielna lda fr0+1 ;stanowi reszte sbc fr1+1 bcs ?div lda fr0 sta fr0+2 lda fr0+1 sta fr0+3 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 sec lda fr0+2 sbc fr1 tay lda fr0+3 sbc fr1+1 bcc ?s sty fr0+2 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.
[Edytuj]
65C816
int16div .aw .ib rep #$20 ;CPU musi byc w trybie natywnym sep #$10 lda fr1 ;dzielnik musi byc wiekszy od zera beq ?e ; <-- czesc pomijalna 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 sec lda fr0+2 sbc fr1 bcc ?s sta fr0+2 inc fr0 bne ?s ?e sec rts ?s dex bne ?l clc rts
Elegancka procedura biblioteczna powinna jeszcze przechowywać na stosie i przed powrotem do miejsca wywołania przywracać rozmiar rejestrów. W powyższym przykładzie pominięto to, żeby nie zaciemniać zagadnienia.
[Edytuj]
Uwagi
Procedura jest "kompatybilna" z procedurą mnożenia (quod vide).