| ; Static Name Aliases |
| ; |
| TITLE bn_mulw.c |
| .8087 |
| F_TEXT SEGMENT WORD PUBLIC 'CODE' |
| F_TEXT ENDS |
| _DATA SEGMENT WORD PUBLIC 'DATA' |
| _DATA ENDS |
| _CONST SEGMENT WORD PUBLIC 'CONST' |
| _CONST ENDS |
| _BSS SEGMENT WORD PUBLIC 'BSS' |
| _BSS ENDS |
| DGROUP GROUP _CONST, _BSS, _DATA |
| ASSUME DS: DGROUP, SS: DGROUP |
| F_TEXT SEGMENT |
| ASSUME CS: F_TEXT |
| PUBLIC _bn_mul_add_words |
| _bn_mul_add_words PROC FAR |
| ; Line 58 |
| push bp |
| push bx |
| push si |
| push di |
| push ds |
| push es |
| mov bp,sp |
| ; w = 26 |
| ; num = 24 |
| ; ap = 20 |
| ; rp = 16 |
| xor si,si ;c=0; |
| mov di,WORD PTR [bp+16] ; load r |
| mov ds,WORD PTR [bp+18] ; load r |
| mov bx,WORD PTR [bp+20] ; load a |
| mov es,WORD PTR [bp+22] ; load a |
| mov cx,WORD PTR [bp+26] ; load w |
| mov bp,WORD PTR [bp+24] ; load num |
| |
| shr bp,1 ; div count by 4 and do groups of 4 |
| shr bp,1 |
| je $L555 |
| |
| $L546: |
| mov ax,cx |
| mul WORD PTR es:[bx] ; w* *a |
| add ax,WORD PTR ds:[di] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di],ax |
| mov si,dx |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+2] ; w* *a |
| add ax,WORD PTR ds:[di+2] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+2],ax |
| mov si,dx |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+4] ; w* *a |
| add ax,WORD PTR ds:[di+4] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+4],ax |
| mov si,dx |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+6] ; w* *a |
| add ax,WORD PTR ds:[di+6] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+6],ax |
| mov si,dx |
| ; |
| add bx,8 |
| add di,8 |
| ; |
| dec bp |
| je $L555 |
| jmp $L546 |
| ; |
| ; |
| $L555: |
| mov bp,sp |
| mov bp,WORD PTR [bp+24] ; load num |
| and bp,3 |
| dec bp |
| js $L547 |
| |
| mov ax,cx |
| mul WORD PTR es:[bx] ; w* *a |
| add ax,WORD PTR ds:[di] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di],ax |
| mov si,dx |
| dec bp |
| js $L547 ; Note that we are now testing for -1 |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+2] ; w* *a |
| add ax,WORD PTR ds:[di+2] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+2],ax |
| mov si,dx |
| dec bp |
| js $L547 |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+4] ; w* *a |
| add ax,WORD PTR ds:[di+4] ; + *r |
| adc dx,0 |
| adc ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+4],ax |
| mov si,dx |
| $L547: |
| mov ax,si |
| pop es |
| pop ds |
| pop di |
| pop si |
| pop bx |
| pop bp |
| ret |
| nop |
| |
| _bn_mul_add_words ENDP |
| PUBLIC _bn_mul_words |
| _bn_mul_words PROC FAR |
| ; Line 76 |
| push bp |
| push bx |
| push si |
| push di |
| push ds |
| push es |
| xor si,si |
| mov bp,sp |
| mov di,WORD PTR [bp+16] ; r |
| mov ds,WORD PTR [bp+18] |
| mov bx,WORD PTR [bp+20] ; a |
| mov es,WORD PTR [bp+22] |
| mov cx,WORD PTR [bp+26] ; w |
| mov bp,WORD PTR [bp+24] ; num |
| $FC743: |
| mov ax,cx |
| mul WORD PTR es:[bx] |
| add ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di],ax |
| mov si,dx |
| dec bp |
| je $L764 |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+2] |
| add ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+2],ax |
| mov si,dx |
| dec bp |
| je $L764 |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+4] |
| add ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+4],ax |
| mov si,dx |
| dec bp |
| je $L764 |
| ; |
| mov ax,cx |
| mul WORD PTR es:[bx+6] |
| add ax,si |
| adc dx,0 |
| mov WORD PTR ds:[di+6],ax |
| mov si,dx |
| dec bp |
| je $L764 |
| ; |
| add bx,8 |
| add di,8 |
| jmp $FC743 |
| nop |
| $L764: |
| mov ax,si |
| pop es |
| pop ds |
| pop di |
| pop si |
| pop bx |
| pop bp |
| ret |
| nop |
| _bn_mul_words ENDP |
| PUBLIC _bn_sqr_words |
| _bn_sqr_words PROC FAR |
| ; Line 92 |
| push bp |
| push bx |
| push si |
| push di |
| push ds |
| push es |
| mov bp,sp |
| mov si,WORD PTR [bp+16] |
| mov ds,WORD PTR [bp+18] |
| mov di,WORD PTR [bp+20] |
| mov es,WORD PTR [bp+22] |
| mov bx,WORD PTR [bp+24] |
| |
| mov bp,bx ; save a memory lookup later |
| shr bx,1 ; div count by 4 and do groups of 4 |
| shr bx,1 |
| je $L666 |
| |
| $L765: |
| mov ax,WORD PTR es:[di] |
| mul ax |
| mov WORD PTR ds:[si],ax |
| mov WORD PTR ds:[si+2],dx |
| ; |
| mov ax,WORD PTR es:[di+2] |
| mul ax |
| mov WORD PTR ds:[si+4],ax |
| mov WORD PTR ds:[si+6],dx |
| ; |
| mov ax,WORD PTR es:[di+4] |
| mul ax |
| mov WORD PTR ds:[si+8],ax |
| mov WORD PTR ds:[si+10],dx |
| ; |
| mov ax,WORD PTR es:[di+6] |
| mul ax |
| mov WORD PTR ds:[si+12],ax |
| mov WORD PTR ds:[si+14],dx |
| ; |
| add di,8 |
| add si,16 |
| dec bx |
| je $L666 |
| jmp $L765 |
| $L666: |
| and bp,3 |
| dec bp ; The copied value of bx (num) |
| js $L645 |
| ; |
| mov ax,WORD PTR es:[di] |
| mul ax |
| mov WORD PTR ds:[si],ax |
| mov WORD PTR ds:[si+2],dx |
| dec bp |
| js $L645 |
| ; |
| mov ax,WORD PTR es:[di+2] |
| mul ax |
| mov WORD PTR ds:[si+4],ax |
| mov WORD PTR ds:[si+6],dx |
| dec bp |
| js $L645 |
| ; |
| mov ax,WORD PTR es:[di+4] |
| mul ax |
| mov WORD PTR ds:[si+8],ax |
| mov WORD PTR ds:[si+10],dx |
| $L645: |
| pop es |
| pop ds |
| pop di |
| pop si |
| pop bx |
| pop bp |
| ret |
| |
| _bn_sqr_words ENDP |
| PUBLIC _bn_div64 |
| _bn_div64 PROC FAR |
| push bp |
| mov bp,sp |
| mov dx, WORD PTR [bp+6] |
| mov ax, WORD PTR [bp+8] |
| div WORD PTR [bp+10] |
| pop bp |
| ret |
| _bn_div64 ENDP |
| F_TEXT ENDS |
| END |