;/* OPTIMOPT.A86 3/20/85 - 06/10/85 Lee Jay Lorenzen */ ;/* ;* Copyright 1999, Caldera Thin Clients, Inc. ;* This software is licenced under the GNU Public License. ;* Please see LICENSE.TXT for further information. ;* ;* Historical Copyright ;* ------------------------------------------------------------- ;* GEM Application Environment Services Version 2.1 ;* Serial No. XXXX-0000-654321 All Rights Reserved ;* Copyright (C) 1985, 1986 Digital Research Inc. ;* ------------------------------------------------------------- ;*/ cseg PUBLIC r_get PUBLIC r_set PUBLIC rc_equal PUBLIC rc_copy PUBLIC inside PUBLIC min PUBLIC max PUBLIC toupper PUBLIC scasb PUBLIC movs PUBLIC bfill PUBLIC strlen PUBLIC strcmp PUBLIC strchk PUBLIC strcpy ; VOID ;r_get(pxywh, px, py, pw, ph) ; WORD *pxywh; ; WORD *px, *py, *pw, *ph; r_get: push bp mov bp,sp mov dx,ds mov es,dx mov si,4[bp] lodsw mov di,6[bp] stosw lodsw mov di,8[bp] stosw lodsw mov di,10[bp] stosw lodsw mov di,12[bp] stosw pop bp ret ; VOID ;r_set(pxywh, x, y, w, h) ; WORD *pxywh; ; WORD x, y, w, h; r_set: push bp mov bp,sp mov dx,ds mov es,dx mov di,4[bp] mov ax,6[bp] stosw mov ax,8[bp] stosw mov ax,10[bp] stosw mov ax,12[bp] stosw pop bp ret ; WORD ;rc_equal(p1, p2) ; WORD *p1, *p2; rc_equal: push bp mov bp,sp cld mov cx,4 ; count mov si,4[bp] ; src off mov di,6[bp] ; dest off mov dx,ds mov es,dx rcloop: lodsw scasw jne rcfalse loop rcloop mov ax,1 pop bp ret rcfalse: mov ax,0 pop bp ret ; VOID ;rc_copy(psxywh, pdxywh) ; WORD *psxywh; ; WORD *pdxywh; rc_copy: push bp mov bp,sp cld mov cx,4 ; count mov si,4[bp] ; src off mov di,6[bp] ; dest off mov dx,ds ; src mov es,dx ; dest rep movsw pop bp ret ; UWORD ;inside(x, y, pt) ; WORD x, y; ; GRECT *pt; inside: push bp mov bp,sp mov ax,4[bp] ; ax = x mov cx,6[bp] ; cx = y mov si,8[bp] ; si = *pt cmp ax,[si] jl infalse cmp cx,2[si] jl infalse mov dx,4[si] add dx,[si] ; dx = x + w cmp ax,dx jge infalse mov dx,6[si] add dx,2[si] ; dx = y + h cmp cx,dx jge infalse mov ax,1 pop bp ret infalse: mov ax,0 pop bp ret ; WORD ;min(a, b) ; WORD a, b; min: push bp mov bp,sp mov ax,4[bp] mov bx,6[bp] cmp ax,bx jle minret mov ax,bx minret: pop bp ret ; WORD ;max(a, b) ; WORD a, b; ; max: push bp mov bp,sp mov ax,4[bp] mov bx,6[bp] cmp ax,bx jge maxret mov ax,bx maxret: pop bp ret ; BYTE ;toupper(ch) ; BYTE ch; toupper: push bp mov bp,sp mov ax,4[bp] and ax,00ffh cmp al,'a' jl toupret cmp al,'z' jg toupret sub ax,32 toupret: pop bp ret ; BYTE ;*scasb(p, b) ; BYTE *p; ; BYTE b; scasb: push bp mov bp,sp cld mov si,4[bp] mov bx,6[bp] and bx,00ffh lpscas: lodsb cmp al,bh jz scasret cmp al,bl jnz lpscas scasret: mov ax,si dec ax pop bp ret ; VOID ;movs(num, ps, pd) ; WORD num; ; BYTE *ps, *pd; movs: push bp mov bp,sp cld mov cx,4[bp] ; count mov si,6[bp] ; src off mov di,8[bp] ; dest off mov dx,ds ; src mov es,dx ; dest rep movsb pop bp ret ; VOID ;bfill(num, bval, addr) ; REG WORD num; ; BYTE bval; ; REG BYTE *addr; bfill: push bp mov bp,sp cld mov cx,4[bp] ; count mov ax,6[bp] ; byte value mov di,8[bp] ; dest off mov dx,ds mov es,dx ; dest rep stosb pop bp ret ; WORD ;strlen(p1) ; BYTE *p1; strlen: push bp mov bp,sp cld mov bx,4[bp] ; remember start of string mov di,bx ; destination string offset mov ax,ds mov es,ax ; destination string segment xor ax,ax ; look for a null mov cx,7fffh repnz scasb mov ax,di sub ax,bx dec ax pop bp ret ; WORD ;strcmp(p1, p2) ; BYTE *p1, *p2; strcmp: push bp mov bp,sp cld mov si,4[bp] mov di,6[bp] mov dx,ds mov es,dx xor ax,ax ; clear ah,al lpsc: lodsb ; pick up source scasb ; compare with destination jne scfalse ; if not same then false cmp al,ah ; if no more string jnz lpsc ; then exit true sctrue: mov ax,1 pop bp ret scfalse: mov ax,0 pop bp ret ;/* ;* Return <0 if s0 if s>t ;*/ ; WORD ;strchk(s, t) ; BYTE s[], t[]; strchk: push bp mov bp,sp cld mov si,4[bp] mov di,6[bp] mov dx,ds mov es,dx xor ax,ax ; clear ah,al lpschk: lodsb ; pick up source scasb ; compare with destination jne scplmn ; if not same then false cmp al,ah ; if no more string jnz lpschk ; then exit true scplmn: mov bl,-1[di] mov bh,0 sub ax,bx pop bp ret ; BYTE ;*strcpy(ps, pd) ; BYTE *ps, *pd; strcpy: push bp mov bp,sp cld mov si,4[bp] mov di,6[bp] mov dx,ds mov es,dx xor ax,ax ; clear ah,al lpcpy: lodsb ; pick up source stosb ; put in destination cmp al,ah ; if no more string jnz lpcpy ; then copy done cpydne: mov ax,di pop bp ret