Programowanie: Dzielenie 16-bitowe z wynikiem 32-bitowym
From Atariki
(Różnice między wersjami)
| 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).
