Programowanie: Mnożenie 16-bitowe z wynikiem 32-bitowym
From Atariki
(Różnice między wersjami)
| Wersja z dnia 06:27, 21 gru 2005 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 06:30, 21 gru 2005 KMK (Dyskusja | wkład) Next diff → |
||
| Linia 1: | Linia 1: | ||
| - | Procedura mnoży dwie 16-bitowe liczby bez znaku umieszczone w rejestrach FR0 ($D4) i FR1 ($E0). 32-bitowy wynik umieszczany jest w FR0. | + | Procedura mnoży dwie 16-bitowe liczby bez znaku umieszczone w rejestrach FR0 ($D4) i FR1 ($E0). 32-bitowy wynik umieszczany jest w FR0. Jeśli po zakończeniu procedury znacznik C jest ustawiony, oznacza to, że nastąpiło przepełnienie i wynik nie jest prawidłowy. |
| <pre> | <pre> | ||
| Linia 43: | Linia 43: | ||
| bne ?mul | bne ?mul | ||
| clc | clc | ||
| - | rts | + | ?exit rts |
| ?clr ldx #$03 | ?clr ldx #$03 | ||
Wersja z dnia 06:30, 21 gru 2005
Procedura mnoży dwie 16-bitowe liczby bez znaku umieszczone w rejestrach FR0 ($D4) i FR1 ($E0). 32-bitowy wynik umieszczany jest w FR0. Jeśli po zakończeniu procedury znacznik C jest ustawiony, oznacza to, że nastąpiło przepełnienie i wynik nie jest prawidłowy.
int16mul
?frf = fr1+2
clc
lda fr0 ;gdy mnoznik albo mnozna jest zerem
ora fr0+1 ;to zerem jest rowniez wynik.
beq ?clr
lda fr1
ora fr1+1
beq ?clr
ldx #$01 ;kopiujemy mnozna do rejestru pomocniczego
?cp lda fr0,x
sta ?frf,x
dex
bpl ?cp
jsr ?clr ;zerujemy bajty wyniku
ldx #16
?mul lsr fr1+1 ;glowna petla
ror fr1
bcc ?noad
clc
lda fr0+2
adc ?frf
sta fr0+2
lda fr0+3
adc ?frf+1
sta fr0+3
bcs ?exit
?noad lsr fr0+3
ror fr0+2
ror fr0+1
ror fr0
dex
bne ?mul
clc
?exit rts
?clr ldx #$03
lda #$00
?cl sta fr0,x
dex
bpl ?cl
rts
