File:  [PGP] / pgp / src / fprims.asm
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 16:37:52 2018 UTC (8 years, 1 month ago) by root
Branches: phill, MAIN
CVS tags: pgp10, HEAD
PGP 1.0

	TITLE   fprims

;	Fast 8086 assembly primitives for add, subtract, rotate left,
;	and set precision bits for multiprecision integers.
;	Callable from Microsoft C or Turbo C.
;	Implemented Jan 1987 by Zhahai Stewart.
;	Used by Philip Zimmermann's RSA public key cryptography library.

;	Much faster primitives that implement a combined multiply/modulo
;	operation are available by contacting Philip Zimmermann, 
;	at Boulder Software Engineering, phone (303)444-4541

;	Static Name Aliases
;
_TEXT	SEGMENT  BYTE PUBLIC 'CODE'
_TEXT	ENDS
CONST	SEGMENT  WORD PUBLIC 'CONST'
CONST	ENDS
_BSS	SEGMENT  WORD PUBLIC 'BSS'
_BSS	ENDS
_DATA	SEGMENT  WORD PUBLIC 'DATA'
_DATA	ENDS
DGROUP	GROUP	CONST,	_BSS,	_DATA
	ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: DGROUP
PUBLIC	_P_SETP		;set global precision, maximum of 1024 bits
PUBLIC  _P_ADDC		;multiprecision add with carry
PUBLIC  _P_SUBB		;multiprecision subtract with borrow
PUBLIC  _P_ROTL		;multiprecision rotate left 1 bit
_DATA	SEGMENT
_DATA	ENDS
_TEXT      SEGMENT

mswoff	dw	(?)
adcx	dw	(?)
sbbx	dw	(?)
rclx	dw	(?)

;--------------------------------------------------------------
;	precision=bp+4		precision in bits
;				prec means precision in wds

	PUBLIC	_P_SETP
_P_SETP	PROC NEAR
	push	bp
	mov	bp,sp
	mov	ax,[bp+4]

;	add	ax,15	round up
;	shr	ax,4	number of words
;	dec	ax	number - 1
;	shl	ax,4	back to number of bits: 16 * (prec - 1)
	dec	ax	; faster alternate way to do same thing
	and	al,0F0h

	cmp	ax,1008	; 16 * (64-1)
	jg	x_setp	; out of range

	shr	ax,1			; ax = 8 * (prec - 1)
	shr	ax,1			; ax = 4 * (prec - 1)

	mov	bx,offset adc01
	sub	bx,ax
	mov	cs:[adcx],bx	; adcx = &adc01 - 4 * (prec - 1)

	mov	bx,offset sbb01
	sub	bx,ax
	mov	cs:[sbbx],bx	; sbbx = &sbb01 - 4 * (prec - 1)

	mov	bx,offset rcl01
	shr	ax,1			; ax = 2 * (prec - 1)
	mov	cs:[mswoff],ax	; mswoff = 2 * (prec-1) = msword offset
	sub	bx,ax
	shr	ax,1			; ax = prec - 1
	sub	bx,ax
	mov	cs:[rclx],bx	; rclx = &rcl01 - 3 * (prec - 1)

x_setp:	pop	bp
	ret
_P_SETP	ENDP


;--------------------------------------------------------------
;	r1=bp+4
;	r2=bp+6
;	carry=bp+8

	PUBLIC	_P_ADDC
_P_ADDC	PROC NEAR
	push	bp
	mov	bp,sp
	push	si
	push	di

	mov	di,[bp+4]	; r1
	mov	si,[bp+6]	; r2
	add	di,cs:[mswoff]	; offset to msw
	cld			; go fwd

	mov	al,0FFh		; set cy flag if carry non-zero
	add	al,[bp+8]	; carry in
	call	cs:[adcx]
	mov	ax,0		; don't affect flags
	rcl	ax,1		; set ax = 0 if no borrow, 1 if borrow out

	pop	di
	pop	si
	mov	sp,bp
	pop	bp
	ret	
_P_ADDC	ENDP

;--------------------------------------------------------------
;	r1=bp+4
;	r2=bp+6
;	borrow=bp+8

	PUBLIC	_P_SUBB
_P_SUBB	PROC NEAR
	push	bp
	mov	bp,sp
	push	si
	push	di

	mov	di,[bp+4]	; r1
	mov	si,[bp+6]	; r2
	add	di,cs:[mswoff]	; offset to msw
	cld			; go fwd

	mov	al,0FFh		; set cy flag if borrow non-zero
	add	al,[bp+8]	; borrow
	call	cs:[sbbx]
	mov	ax,0		; don't affect flags
	rcl	ax,1		; set ax = 0 if no borrow, 1 if borrow out

	pop	di
	pop	si
	mov	sp,bp
	pop	bp
	ret	
_P_SUBB	ENDP

;--------------------------------------------------------------
;	r1=bp+4
;	c=bp+6

	PUBLIC	_P_ROTL
_P_ROTL	PROC NEAR
	push	bp
	mov	bp,sp
	push	di

	mov	di,[bp+4]	; r1
	add	di,cs:[mswoff]	; offset to msw
	mov	al,0FFh
	add	al,[bp+6]	; c (carry)
	call	cs:[rclx]
	mov	ax,0		; don't affect flags
	rcl	ax,1		; set ax = 0 if no carry, 1 if carry out

	pop	di
	mov	sp,bp
	pop	bp
	ret	
_P_ROTL	ENDP

;========================================================================
dummy	proc	near

adc64:	lodsw
	adc	[di-126],ax
	lodsw
	adc	[di-124],ax
	lodsw
	adc	[di-122],ax
	lodsw
	adc	[di-120],ax
	lodsw
	adc	[di-118],ax
	lodsw
	adc	[di-116],ax
	lodsw
	adc	[di-114],ax
	lodsw
	adc	[di-112],ax
	lodsw
	adc	[di-110],ax
	lodsw
	adc	[di-108],ax
	lodsw
	adc	[di-106],ax
	lodsw
	adc	[di-104],ax
	lodsw
	adc	[di-102],ax
	lodsw
	adc	[di-100],ax
	lodsw
	adc	[di-98],ax
	lodsw
	adc	[di-96],ax
	lodsw
	adc	[di-94],ax
	lodsw
	adc	[di-92],ax
	lodsw
	adc	[di-90],ax
	lodsw
	adc	[di-88],ax
	lodsw
	adc	[di-86],ax
	lodsw
	adc	[di-84],ax
	lodsw
	adc	[di-82],ax
	lodsw
	adc	[di-80],ax
	lodsw
	adc	[di-78],ax
	lodsw
	adc	[di-76],ax
	lodsw
	adc	[di-74],ax
	lodsw
	adc	[di-72],ax
	lodsw
	adc	[di-70],ax
	lodsw
	adc	[di-68],ax
	lodsw
	adc	[di-66],ax
	lodsw
	adc	[di-64],ax
	lodsw
	adc	[di-62],ax
	lodsw
	adc	[di-60],ax
	lodsw
	adc	[di-58],ax
	lodsw
	adc	[di-56],ax
	lodsw
	adc	[di-54],ax
	lodsw
	adc	[di-52],ax
	lodsw
	adc	[di-50],ax
	lodsw
	adc	[di-48],ax
	lodsw
	adc	[di-46],ax
	lodsw
	adc	[di-44],ax
	lodsw
	adc	[di-42],ax
	lodsw
	adc	[di-40],ax
	lodsw
	adc	[di-38],ax
	lodsw
	adc	[di-36],ax
	lodsw
	adc	[di-34],ax
	lodsw
	adc	[di-32],ax
	lodsw
	adc	[di-30],ax
	lodsw
	adc	[di-28],ax
	lodsw
	adc	[di-26],ax
	lodsw
	adc	[di-24],ax
	lodsw
	adc	[di-22],ax
	lodsw
	adc	[di-20],ax
	lodsw
	adc	[di-18],ax
	lodsw
	adc	[di-16],ax
	lodsw
	adc	[di-14],ax
	lodsw
	adc	[di-12],ax
	lodsw
	adc	[di-10],ax
	lodsw
	adc	[di-8],ax
	lodsw
	adc	[di-6],ax
	lodsw
	adc	[di-4],ax
	lodsw
	adc	[di-2],ax
adc01:	lodsw
	adc	[di],ax
	ret

sbb64:	lodsw
	sbb	[di-126],ax
	lodsw
	sbb	[di-124],ax
	lodsw
	sbb	[di-122],ax
	lodsw
	sbb	[di-120],ax
	lodsw
	sbb	[di-118],ax
	lodsw
	sbb	[di-116],ax
	lodsw
	sbb	[di-114],ax
	lodsw
	sbb	[di-112],ax
	lodsw
	sbb	[di-110],ax
	lodsw
	sbb	[di-108],ax
	lodsw
	sbb	[di-106],ax
	lodsw
	sbb	[di-104],ax
	lodsw
	sbb	[di-102],ax
	lodsw
	sbb	[di-100],ax
	lodsw
	sbb	[di-98],ax
	lodsw
	sbb	[di-96],ax
	lodsw
	sbb	[di-94],ax
	lodsw
	sbb	[di-92],ax
	lodsw
	sbb	[di-90],ax
	lodsw
	sbb	[di-88],ax
	lodsw
	sbb	[di-86],ax
	lodsw
	sbb	[di-84],ax
	lodsw
	sbb	[di-82],ax
	lodsw
	sbb	[di-80],ax
	lodsw
	sbb	[di-78],ax
	lodsw
	sbb	[di-76],ax
	lodsw
	sbb	[di-74],ax
	lodsw
	sbb	[di-72],ax
	lodsw
	sbb	[di-70],ax
	lodsw
	sbb	[di-68],ax
	lodsw
	sbb	[di-66],ax
	lodsw
	sbb	[di-64],ax
	lodsw
	sbb	[di-62],ax
	lodsw
	sbb	[di-60],ax
	lodsw
	sbb	[di-58],ax
	lodsw
	sbb	[di-56],ax
	lodsw
	sbb	[di-54],ax
	lodsw
	sbb	[di-52],ax
	lodsw
	sbb	[di-50],ax
	lodsw
	sbb	[di-48],ax
	lodsw
	sbb	[di-46],ax
	lodsw
	sbb	[di-44],ax
	lodsw
	sbb	[di-42],ax
	lodsw
	sbb	[di-40],ax
	lodsw
	sbb	[di-38],ax
	lodsw
	sbb	[di-36],ax
	lodsw
	sbb	[di-34],ax
	lodsw
	sbb	[di-32],ax
	lodsw
	sbb	[di-30],ax
	lodsw
	sbb	[di-28],ax
	lodsw
	sbb	[di-26],ax
	lodsw
	sbb	[di-24],ax
	lodsw
	sbb	[di-22],ax
	lodsw
	sbb	[di-20],ax
	lodsw
	sbb	[di-18],ax
	lodsw
	sbb	[di-16],ax
	lodsw
	sbb	[di-14],ax
	lodsw
	sbb	[di-12],ax
	lodsw
	sbb	[di-10],ax
	lodsw
	sbb	[di-8],ax
	lodsw
	sbb	[di-6],ax
	lodsw
	sbb	[di-4],ax
	lodsw
	sbb	[di-2],ax
sbb01:	lodsw
	sbb	[di],ax
	ret


rcl64:	rcl	word ptr [di-126],1
	rcl	word ptr [di-124],1
	rcl	word ptr [di-122],1
	rcl	word ptr [di-120],1
	rcl	word ptr [di-118],1
	rcl	word ptr [di-116],1
	rcl	word ptr [di-114],1
	rcl	word ptr [di-112],1
	rcl	word ptr [di-110],1
	rcl	word ptr [di-108],1
	rcl	word ptr [di-106],1
	rcl	word ptr [di-104],1
	rcl	word ptr [di-102],1
	rcl	word ptr [di-100],1
	rcl	word ptr [di-98],1
	rcl	word ptr [di-96],1
	rcl	word ptr [di-94],1
	rcl	word ptr [di-92],1
	rcl	word ptr [di-90],1
	rcl	word ptr [di-88],1
	rcl	word ptr [di-86],1
	rcl	word ptr [di-84],1
	rcl	word ptr [di-82],1
	rcl	word ptr [di-80],1
	rcl	word ptr [di-78],1
	rcl	word ptr [di-76],1
	rcl	word ptr [di-74],1
	rcl	word ptr [di-72],1
	rcl	word ptr [di-70],1
	rcl	word ptr [di-68],1
	rcl	word ptr [di-66],1
	rcl	word ptr [di-64],1
	rcl	word ptr [di-62],1
	rcl	word ptr [di-60],1
	rcl	word ptr [di-58],1
	rcl	word ptr [di-56],1
	rcl	word ptr [di-54],1
	rcl	word ptr [di-52],1
	rcl	word ptr [di-50],1
	rcl	word ptr [di-48],1
	rcl	word ptr [di-46],1
	rcl	word ptr [di-44],1
	rcl	word ptr [di-42],1
	rcl	word ptr [di-40],1
	rcl	word ptr [di-38],1
	rcl	word ptr [di-36],1
	rcl	word ptr [di-34],1
	rcl	word ptr [di-32],1
	rcl	word ptr [di-30],1
	rcl	word ptr [di-28],1
	rcl	word ptr [di-26],1
	rcl	word ptr [di-24],1
	rcl	word ptr [di-22],1
	rcl	word ptr [di-20],1
	rcl	word ptr [di-18],1
	rcl	word ptr [di-16],1
	rcl	word ptr [di-14],1
	rcl	word ptr [di-12],1
	rcl	word ptr [di-10],1
	rcl	word ptr [di-8],1
	rcl	word ptr [di-6],1
	rcl	word ptr [di-4],1
	rcl	word ptr [di-2],1
rcl01:	rcl	word ptr [di],1
	ret
dummy	endp

_TEXT	ENDS
END

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.