;/* GSX2.A86 6/26/84 - 10/16/84 Don Heiskell */ ; ;/* ;* Copyright 1999, Caldera Thin Clients, Inc. ;* This software is licenced under the GNU Public License. ;* Please see LICENSE.TXT for further information. ;* ;*/ ; GSXENTRY equ 0efh ; public gsx2 public umul_div public mul_div public i_ptsin public i_intin public i_intout public i_ptsout public i_ptr public i_ptr2 public i_lptr1 public m_lptr2 cseg gsx2: mov cx,473h mov dx,offset pblock ;point at the parm block int GSXENTRY ret eject ; ;*************************************************************************** ; ; MUL_DIV (m1,m2,d1) ; ; ( ( ( m1 * 2 * m2 ) / d1 ) + 1 ) / 2 ; m1 = signed 16 bit integer ; m2 = unsigned 15 bit integer ; d1 = signed 16 bit integer ; ;*************************************************************************** MUL_DIV: push bp ;save the callers bp mov bp,sp mov ax,06[bp] shl ax,1 ; m2 * 2 mov bx,04[bp] imul bx ; m2 * 2 * m1 mov bx,08[bp] idiv bx ; m2 * 2 * m1 / d1 and ax,ax ; set flags js mul_div_neg inc ax shr ax,1 ; m2 * 2 * m1 / d1 +1 / 2 pop bp ret mul_div_neg: add ax,-1 neg ax shr ax,1 neg ax ; m2 * 2 * m1 / d1 -1 / 2 pop bp ret ; ;*************************************************************************** ; ; UMUL_DIV (m1,m2,d1) ; ; ( ( ( m1 * 2 * m2 ) / d1 ) + 1 ) / 2 ; m1 = usigned 16 bit integer ; m2 = unsigned 15 bit integer ; d1 = usigned 16 bit integer ; ;*************************************************************************** UMUL_DIV: push bp ;save the callers bp mov bp,sp mov ax,06[bp] shl ax,1 ; m2 * 2 mov bx,04[bp] mul bx ; m2 * 2 * m1 mov bx,08[bp] div bx ; m2 * 2 * m1 / d1 inc ax shr ax,1 ; m2 * 2 * m1 / d1 +1 / 2 pop bp ret i_ptsin: push bp mov bp,sp mov ax,04[bp] mov ptsioff,ax pop bp ret i_intin: push bp mov bp,sp mov ax,04[bp] mov intioff,ax pop bp ret i_ptsout: push bp mov bp,sp mov ax,04[bp] mov ptsooff,ax pop bp ret i_intout: push bp mov bp,sp mov ax,04[bp] mov intooff,ax pop bp ret i_ptr: push bp mov bp,sp mov ax,04[bp] mov contrl+14,ax mov ax,ds mov contrl+16,ax pop bp ret i_ptr2: push bp mov bp,sp mov ax,04[bp] mov contrl+18,ax mov ax,ds mov contrl+20,ax pop bp ret i_lptr1: push bp mov bp,sp mov ax,04[bp] mov contrl+14,ax mov ax,06[bp] and ax,ax jnz i_lptr11 mov ax,cs i_lptr11: mov contrl+16,ax pop bp ret m_lptr2: push bp mov bp,sp mov bx,04[bp] mov ax,contrl+18 mov [bx],ax inc bx inc bx mov ax,contrl+20 mov [bx],ax pop bp ret dseg extrn contrl:word extrn ptsin:word extrn intin:word extrn intout:word extrn ptsout:word pblock dw offset contrl dw seg contrl intioff dw offset intin dw seg contrl ptsioff dw offset ptsin dw seg contrl intooff dw offset intout dw seg contrl ptsooff dw offset ptsout dw seg contrl end