; int _AddUnsArrToUnsArr(src1,src2,dst,n) ; ; ARGUMENT ; unsigned *src1, *src2, *dst; ; unsigned n; /* number of ints to add */ ; ; DESCRIPTION ; ; Adds src1 to scr2 giving dst. src1 and scr2 are unchanged. ; src1, src2 and dst point to unsigned arrays. ; ; SIDE EFFECTS ; dst is indeterminate on overflow. Note that although we are using ; unsigned, we return an overflow status from here if the high-order bit ; goes set. Caller can then determine if that is an error in his case. ; ; RETURNS ; Returns GM_SUCCESS if no overflow, otherwise GM_FAILURE. ; ; AUTHOR ; Andy Anderson 13-JAN-1987 13:30 ; Copyright (C) 1987-90 Greenleaf Software Inc. All Rights Reserved. ; ; MODIFICATIONS ; Andy Anderson 16-jul-87 80-bit ; ; include model.h include prologue.h include gm.equ pseg gmath ; ; if large memory model then: ; ; parm1_ = ptr to source 1 ; parm3_ = ptr to source 2; ; parm5_ = destination segment ptr ; parm6_ = destination offset ptr ; parm7_ = number of unsigned's to add ; ; for if small model then ; parm1_ = ptr to source1 ; parm2_ = ptr to source2 ; parm3_ = ptr to destination ; parm4_ = number of unsigned's to add ; cproc _AddUnsArrToUnsArr,,agmn if _LDATA push ds push es lds si,parm1_ ; ptr to a les di,parm3_ ; ptr to b mov cx,parm7_ ; number of uns's to add else mov si,parm1_ mov di,parm2_ mov cx,parm4_ mov dx,parm3_ ; offset to dst endif xor bx,bx ; clear flags and offset addlp: if _LDATA mov ax,[si+bx] ; get a digit adc ax,es:[di+bx] push ds ; have to exchange for large model push si lds si,parm5_ ; destination seg:offset mov [si+bx],ax ; mov partial product pop si ; restore ptr to src1 pop ds pushf ; save overflow flag inc bx inc bx ; move to next unsigned loop addlp else mov ax,[si+bx] ; get a digit adc ax,[di+bx] xchg dx,si mov [bx+si],ax xchg si,dx pushf ; save overflow flag inc bx inc bx ; move to next unsigned loop addlp endif pop bx ; get back last undisturbed flags test bx,0800h ; mask the overflow bit jnz overf mov ax,GM_SUCCESS ; set SUCCESS return for caller exit: if _LDATA mov cx,parm7_ else mov cx,parm4_ endif dec cx ; since we've already poped one off sal cx,1 ; the stack, make byte offset -2 add sp,cx ; clean up stack from pushf's if _LDATA pop es pop ds endif cproce overf: mov ax,GM_FAILURE jmp short exit endps END