Programowanie: Mnożenie 16-bitowe z wynikiem 32-bitowym
From Atariki
(Różnice między wersjami)
Wersja z dnia 06:24, 21 gru 2005 KMK (Dyskusja | wkład) ← Previous diff |
Wersja z dnia 06:27, 21 gru 2005 KMK (Dyskusja | wkład) Next diff → |
||
Linia 6: | Linia 6: | ||
clc | clc | ||
- | lda fr0 ;if one of the numbers is 0 | + | lda fr0 ;gdy mnoznik albo mnozna jest zerem |
- | ora fr0+1 ;the result is 0 as well | + | ora fr0+1 ;to zerem jest rowniez wynik. |
beq ?clr | beq ?clr | ||
Linia 14: | Linia 14: | ||
beq ?clr | beq ?clr | ||
- | ldx #$01 ;copy fr0 to frf | + | ldx #$01 ;kopiujemy mnozna do rejestru pomocniczego |
?cp lda fr0,x | ?cp lda fr0,x | ||
sta ?frf,x | sta ?frf,x | ||
Linia 20: | Linia 20: | ||
bpl ?cp | bpl ?cp | ||
- | jsr ?clr ;clear the fr0 (result) | + | jsr ?clr ;zerujemy bajty wyniku |
ldx #16 | ldx #16 | ||
- | ?mul lsr fr1+1 ;main loop | + | ?mul lsr fr1+1 ;glowna petla |
ror fr1 | ror fr1 | ||
bcc ?noad | bcc ?noad |
Wersja z dnia 06:27, 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.
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 rts ?clr ldx #$03 lda #$00 ?cl sta fr0,x dex bpl ?cl rts