;Copyright (c) 1998 - 1999 Microsoft Corporation page 85,132 ;***************************************************************************** ; ; yielddos.asm ; DOS TSR to yield when too many get time request float by ; ; Copyright Citrix Systems Inc. 1993 ; ; ;***************************************************************************** TEXT segment public 'CODE' assume CS:TEXT,DS:TEXT,ES:TEXT,SS:Nothing .286p ORG 100h main proc far jmp init main endp ;************************************************************************** ; Int21Hook ; ; Function: Int 21 Handler for yielddos ; ;************************************************************************** Int21Hook proc far ; move current cmd to previous cmd push ax mov ah,cs:CurrCmd mov cs:PrevCmd,ah pop ax ; save current cmd mov cs:CurrCmd,ah ; is request get time? cmp ah,2ch jne short NotMine ; move current time to previous time push ax mov ax,cs:CurrHourMin mov cs:PrevHourMin,ax mov ax,cs:CurrSec mov cs:PrevSec,ax pop ax ; get the current time pushf call dword ptr cs:[OldInt21] pushf ; save the current time push dx and dl,0f0h ; look for changes within 16/100 sec mov cs:CurrHourMin,cx mov cs:CurrSec,dx pop dx ; was the previous cmd Get Time? cmp cs:PrevCmd,2ch jne short NoYield ; are the times the same? push ax mov ax,cs:CurrHourMin cmp ax,cs:PrevHourMin pop ax jne short NoYield push ax mov ax,cs:CurrSec cmp ax,cs:PrevSec pop ax jne short NoYield ; yielding if time the same and command repeated push ax push cx mov cx, cs:YieldCount kbdJ: mov ax,1680h int 2fh dec cx jnz kbdJ pop cx pop ax NoYield: popf retf 2 NotMine: ; send to previous Int 21 handler jmp dword ptr cs:[OldInt21] Int21Hook endp ;************************************************************************** ; Int33Hook ; ; Function: Int 33 Handler for yielddos ; ;************************************************************************** Int33Hook proc far ; is request get button status and mouse position cmp ax,0003h jne short NotMine33 ; get the mouse information pushf call dword ptr cs:[OldInt33] pushf ; Count Int33 func 0003 inc cs:Int33Func3 push ax push cx mov cx, cs:YieldCount mouseJ: mov ax,1680h int 2fh dec cx jnz mouseJ pop cx pop ax popf retf 2 NotMine33: ; send to previous Int 21 handler jmp dword ptr cs:[OldInt33] Int33Hook endp OldInt21 dd 0 ; Old int 21 handler OldInt33 dd 0 ; Old int 33 handler Int33Func3 dw 0 ; Int33Func3 count CurrCmd db 0 ; Current Int 21 PrevCmd db 0 ; Old Int 21 CurrHourMin dw 0 ; Current Hour/minutes CurrSec dw 0 ; Current Sec/100th Sec PrevHourMin dw 0 ; Previous Hour/minutes PrevSec dw 0 ; Previous Sec/100th Sec YieldCount dw 20 ; Yeild Loop Counter ORG $ + 15 ;* ;* End of resident code and data ;* ResidentMark label byte ;* ;* Start of init code and data ;* init: ; save regs push ax push bx push cx push dx push si ; command line arg? mov cl, byte ptr ds:[80h] cmp cl, 0 je no_arg ; set up pointer and counter mov si, 81h xor bx, bx jmp short getfirst getnum: dec cl jz done getfirst: lodsb sub al, "0" jb not_int cmp al, 9 ja not_int cbw xchg ax, bx mov dx, 10 mul dx add bx, ax jmp getnum not_int: cmp bx, 0 je getnum done: cmp bx, 0 je no_arg mov YieldCount, bx no_arg: pop si pop dx pop cx pop bx pop ax ; Hook Interrupt 21 call HookInt21 ; Hook Interrupt 33 call HookInt33 StayRes: ; Free the environment xor ax, ax xchg ax, word ptr ds:[2ch] ; get env from PSP or ax, ax jz short skipenv push es mov es, ax mov ah, 49h int 21h pop es skipenv: ; Keep program running to catch Int 21 Func 3D requests mov ax, 3100h mov dx, offset ResidentMark shr dx,4 int 21h ;***************************************************************************** ;* HookInt21 ;* ;* Function: Hook Interrupt 21 for yielddos ;* ;* Notes: ;* Saves the Old Int 21 handler for restoring and calling ;***************************************************************************** HookInt21 proc near push es push bx push dx mov ax,3521h ; get int 21 value int 21h mov word ptr [OldInt21],bx mov word ptr [OldInt21]+2,es mov ax,ds mov es,ax mov ax,2521h mov dx, offset Int21Hook int 21h pop dx pop bx pop es ret HookInt21 endp ;***************************************************************************** ;* HookInt33 ;* ;* Function: Hook Interrupt 33 for yielddos ;* ;* Notes: ;* Saves the Old Int 33 handler for restoring and calling ;***************************************************************************** HookInt33 proc near push es push bx push dx mov ax,3533h ; get int 21 value int 21h mov word ptr [OldInt33],bx mov word ptr [OldInt33]+2,es mov ax,ds mov es,ax mov ax,2533h mov dx, offset Int33Hook int 21h pop dx pop bx pop es ret HookInt33 endp ;* ;* Init DATA ;* messages and temporary storage discarded after init ;* TEXT ends end main