Xref: utzoo alt.msdos.programmer:1331 comp.sys.ibm.pc.programmer:225 Path: utzoo!utgpu!jarvis.csri.toronto.edu!cs.utexas.edu!uunet!mcsun!ukc!icdoc!zmact61 From: zmact61@doc.ic.ac.uk (D Spinellis) Newsgroups: alt.msdos.programmer,comp.sys.ibm.pc.programmer Subject: Re: Screen Saver (was Re: idling in the interpreter) Message-ID: <1663@gould.doc.ic.ac.uk> Date: 2 Mar 90 17:03:20 GMT References: <25ed7a61.29c1@polyslo.CalPoly.EDU> Sender: news@doc.ic.ac.uk Reply-To: dds@cc.ic.ac.uk (Diomidis Spinellis) Organization: Imperial College Department of Computing Lines: 64 In article <25ed7a61.29c1@polyslo.CalPoly.EDU> tbechtel@polyslo.CalPoly.EDU (TrevorB) writes: > >pas@lcs.mit.edu (Paul A. Selkirk) writes: >>Does anyone know of a bulletproof way for a TSR to tell whether DOS (assume >>2.x or 3.x) is idling in the command interpreter, or executing a program? [...] >>is idling. There are dozens of screen-savers, but I need one that won't kill >>a lengthy graphics program. [...] >How about this, run the screen saver off of the timer interrupt. If >the correct amount of time has passed, then change the pallette to all >black (if EGA or VGA) or do a memory copy of the screen and blank it >(if < EGA). While the screen is blank, the screen saver won't stop >any program that's currently running, but will latch on to the >keyboard or mouse interrupt. And, of course, when the keyboard/mouse >interrupt is caught, you simply restore the screen by restoring the >palette (if >= EGA), or copy the screen back into video memory (if >< EGA). You don't need to mess with screen copying and pallette saving and restoring. The following code will do the trick for VGA by setting a bit in the sequencer that indicates that video access to the memory should be dissabled. The result of this is that the screen blanks. mov dx,3c4h ; Sequencer index mov al,1 ; Clock register out dx,al inc dx ; Point to data in al,dx ; Get it or al,20h ; Set video disable bit out dx,al ; And set it On the other cards (CGA, MDA etc.) you clear the screen enable bit in the mode select register. The following code illustrates it: data segment at 40h org 49h crt_mode db ? crt_cols dw ? crt_len dw ? crt_start dw ? cursor_pos dw 8 dup(?) cursor_mode dw ? active_page db ? addr_6845 dw ? data ends mov ax,40h ; Address of data area assume cs:code,ds:data,es:nothing mov ds,ax ; Establish addressability mov dx,addr_6845 ; Primary card address add dx,4 ; Address of 3X8 register (mode select) mov al,crt_mode_set ; See old value and al,not 1000b ; Make the display enable 0 mov crt_mode_set,al ; Save it out dx,al ; Out it Diomidis -- Diomidis Spinellis Internet: dds@cc.ic.ac.uk Department of Computing UUCP: ...!ukc!iccc!dds Imperial College JANET: dds@uk.ac.ic.cc London SW7 2BZ #include "/dev/tty"