;/* CALCASM.A86 2/3/84 - 06/24/85 Lee Jay Lorenzen */ ;/* for Lattice C ==> AX=HI, BX=LO ; added printer number 11/3/87 mdf ; cseg ; PUBLIC ADDR PUBLIC cxc33, cxm33, cxd33,beep PUBLIC __DOS PUBLIC LBCOPY PUBLIC spol_int PUBLIC spol_out PUBLIC toupper PUBLIC strcmp PUBLIC strlen ; dseg EXTRN DOS_AX:WORD, DOS_BX:WORD, DOS_CX:WORD, DOS_DX:WORD EXTRN DOS_DS:WORD, DOS_ES:WORD, DOS_SI:WORD, DOS_DI:WORD EXTRN DOS_ERR:WORD EXTRN spol_prn:WORD old_int17 dw 0 dw 0 ; ; cseg savax dw 0 savds dw 0 ; ; ; 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 ; ; ; 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 ; ; ;/* Desk Acc print spooler assembler module */ ; spol_int: push es xor ax, ax mov es, ax mov di, 4*17h pushf cli mov ax, es:[di] mov old_int17, ax mov ax, es:2[di] mov old_int17+2, ax popf pop es ret ; ; spol_out: push bp mov bp, sp mov ax, 4[bp] pop bp mov ah, 0 push ax mov ah, 2 mov dx, spol_prn pushf callf dword ptr old_int17 and ah, 90h cmp ah, 90h pop ax jnz spol_err mov dx, spol_prn pushf callf dword ptr old_int17 test ah, 1 jnz spol_err mov ax, 1 ret spol_err: xor ax, ax ret ; ; ; beep: push bp mov bp,sp push ds push es push di push si mov dx,0007h mov ax,0200h int 21h pop si pop di pop es pop ds mov sp,bp pop bp ret ; ; ; LBCOPY(pdstoff, pdstseg, psrcoff, psrcseg, numbytes) ; ; LBCOPY: push bp mov bp,sp push ds cld les di,4[bp] ; dest off lds si,8[bp] ; src off mov cx,12[bp] ; count rep movsb pop ds pop bp ret ; ; ; __DOS: push bp mov bp,sp push es push si push di mov ax,DOS_DI mov di,ax mov ax,DOS_SI mov si,ax mov ax,DOS_ES mov es,ax mov ax,DOS_AX mov bx,DOS_BX mov cx,DOS_CX mov dx,DOS_DX mov savax,ax push ds mov ax,DOS_DS mov ds,ax mov ax,savax int 21h mov savax,ax mov ax,ds mov savds,ax pop ds mov ax,savax jc d_error mov DOS_ERR,0 jmps d_exit d_error: mov DOS_ERR,1 d_exit: mov DOS_AX,ax mov DOS_BX,bx mov DOS_CX,cx mov DOS_DX,dx mov ax,savds mov DOS_DS,ax mov ax,es mov DOS_ES,ax mov ax,si mov DOS_SI,ax mov ax,di mov DOS_DI,ax pop di pop si pop es pop bp ret ; ; ; ; cxc33: push bx push dx cmp ax,cx jnz cxc1 shr bx,1 shr dx,1 cmp bx,dx jnz cxc1 pop dx pop bx cmp bx,dx jmps cxc2 cxc1: pop dx pop bx cxc2: ret ; ; cxd33: xchg ax,bx mov cx,dx jcxz div0 cmp cx,1 jne not_div1 xchg ax,bx xor cx,cx mov dx,cx ret not_div1: xor dx,dx xchg ax,bx push ax div cx mov di,ax mul cx pop dx sub dx,ax mov ax,bx div cx sub cx,cx mov bx,ax mov ax,di ret div0: mov ax,-1 mov bx,ax ret ; ; cxm33: push dx mul dx pop dx push ax mov ax,bx push dx mul cx mov cx,ax mov ax,bx pop dx mul dx add dx,cx pop cx add dx,cx mov bx,ax mov ax,dx ret ; ; ; LONG ; ADDR(shrt_addr) ; ADDR: push bp mov bp,sp mov bx,4[bp] mov ax,ds 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 ; ; ; end