[comp.sys.atari.st] Screen Saver?

atwell@utah-cs.UUCP (Bart L. Atwell) (01/13/87)

About a year ago, an accessory was posted that would turn off the screen.
Unfortunately, it required you to select a desk accessory to do it.  Does 
anybody have one that turns off the screen after a certain amount of idle 
time and turns it back on at a key/mouse click?

My phosphors thank you and I thank you,

Bart

XCG112@DBNUAMA1.BITNET (01/15/87)

I think this is what you want ...

If you turn your ST off after short times of usage, it will eventually suffer.
Solution: keep it turned on most of the time, even if you're not going to use
it for a while. Also, the RAM disk stays intact - none of that cold start
copying necessary. The disadvantage is that one has to turn the monitor off
to prevent burn-ins after prolonged use.

This posting contains a short utility that solves the problem by shutting
off the monitor CRT (like the video controllers in most modern terminals).
Since it is short, I post the assembler source. If anyone needs an uuencoded
copy, email me  - I haven't been able to upload it yet.


- What it does:

    NIGHT is a PD program published by the German computer magazine c't that
    helps to extend monitor life by shutting off the CRT display after a pre-
    specified time interval has elapsed and no user action (such as keys
    pressed or the mouse moved) has occurred.
    If any key on keyboard or mouse is pressed, if the mouse is moved or the
    running program requests screen output via BIOS calls, the screen is
    turned back on.

- How it works:

 a) Put NIGHT.PRG into your AUTO folder. On system-startup, it will auto-
    execute, display a short message telling you the default delay currently
    set, and install its resident part.

 or

 b) Rename NIGHT.PRG to NIGHT.TTP, then invoke it from the desktop. Enter
    the desired delay on the command line. Example:  "360" will make the
    system wait for 6 minutes of inactivity before it turns blank on you.
    For the sake of program compactness, no particular error checking is
    provided for whatever you enter.
    (Note: if you call NIGHT from the desktop, be sure that you don't already
    have a copy of it sitting in memory. Otherwise, you might sit around in
    darkness forever...)

    In both cases, NIGHT installs its resident part by redirecting the system
    vectors for timer, bios and xbios, then intercepting system calls via
    those vectors. For details, see the commented source code.
    The screen is turned blank by setting the video sync mode to EXTERNAL.
    Since there (usually) is nothing to provide sync signals, the screen just
    turns blank. Thus, the program <should> work in all resolutions (I could
    only try it on my mono system, however).

- Why I like it:

    NIGHT is short, efficiently programmed and handles the system vectors
    in a sensible way and thus serves as an example for people wishing to
    learn how to write such "deep-down" utilities (like myself).

Note: this program does not work when the ETERNAL RAM-Disk (posted earlier
in this discussion) is resident (why ? anyone has a fix ?).

                                            Volker A. Brandt
                                            (Bonn, W. Germany)

--------- NIGHT.ASM: source code for NIGHT utility ---------------------------

        title   NIGHT - monitor CRT protection utility V0.2
        section NIGHT
        pagelen 74

* NIGHT - monitor CRT protection utility
*
* To assemble with the GST 68000 Macro Assembler:
*
*          ASM NIGHT       (ignore messages 'WARNING 5F ....')
*          LINK NIGHT
*
* Usage:   NIGHT           sets the delay to default (currently 120 sec)
*          NIGHT <value>   sets the delay to <value>
*
* This program is based on a publication in "c't Magazin fuer Computertechnik"
* no. 12/1986 and is public domain. It may not be used for commercial purposes
* in any way. Copying for non-profit use only.
*
* This version is for the GST Assembler, but can easily be converted for use
* with others.
*
* Original program (c) by P. Glasmacher / c't 1986
* Improved program with english comments by Volker A. Brandt
*
* last mod: 05-Dec-86  VAB
*
* Notes: - global constants and vectors appear in UPPER CASE.
*        - I have used a PASCAL-like notation:
*          " := " means assignment, " = " means comparison.

GEMDOS  equ       1             GEMDOS trap number
XBIOS   equ      14             XBIOS trap number

TERM    equ       0             GEMDOS: terminate process
PRTS    equ       9             GEMDOS: print string
TERMRES equ     $31             GEMDOS: terminate and keep process resident
MSHRINK equ     $4A             GEMDOS: return unused memory
SUPEXEC equ      38             XBIOS:  supervisor execution

LF      equ      10             line feed
CR      equ      13             cursor return

* system variables that will be affected

BIOSVEC equ    $0B4             BIOS trap vector
TIMVEC  equ    $114             system timer vector
KBDVEC  equ    $118             keyboard IRQ

* video shifter registers:
*
* VSYNC bit 0 = 1: external synchronisation
* VMID  bit 7 = 1: activate ("just before VBLANK")

VMID    equ     $FFFF8207       video counter mid
VSYNC   equ     VMID+3          sync register
SYNCBIT equ     0               sync bit position

* set the following value to your favourite delay:

DEFAULT equ     120             default value: 120 seconds delay

* start of RAM-resident routine

        bra     start           call non-resident init routine

* timer trap - called every 5 msec
*
* check if count = limit. If so, set sync to external.
* exit: old timer trap vector

timtrp  movem.l a0-a1,-(sp)     save work registers
        lea     count,a0        A0 := count
        lea     limit,a1        A1 := limit
        addq.l  #1,(a0)         increment count
        cmp.l   (a0)+,(a1)+     count = limit ?
        bhi.s   norm            not yet: continue normally

        lea     VMID,a0
tim1    cmp.b   #$80,(a0)       wait for VBLANK
        bne     tim1

        bset    #SYNCBIT,VSYNC  sync bit := 1 ... good night !
        lea     ecb,a0
        addq.w  #1,(a0)         post ecb ("event control byte")
norm    movem.l (sp)+,a0-a1     restore registers ...
        move.l  timold,-(sp)    ... and exit via original timer vector
        rts

* keyboard trap - called on every mouse or keyboard interrupt

kbdtrp  bsr.s   manip           perform operation ...
        move.l  kbdold,-(sp)    ... and exit via original keyboard vector
        rts

* BIOS trap - called on every BIOS call
*
* check if Bconout() is specified. If so, set count to 0. Reset screen to
* normal if ecb was 1.   Exit to original BIOS trap handler.

biostrp move.l  d0,-(sp)        save D0
        move.w  10(sp),d0       D0 := specified BIOS function code
        cmp.w   #3,d0           is it Bconout() ?
        bne.s   noout           no:  continue normally
        bsr.s   manip           yes: perform operation ...
noout   move.l  (sp)+,d0        ... restore D0 ...
        move.l  biosold,-(sp)   ... and exit via original BIOS trap vector
        rts

* common code for BIOS and keyboard traps:
*
* reset count to 0. If ecb = 1, set screen mode back to normal.

manip   tst.w   ecb             is it day or night ?
        beq.s   retr            still day: do nothing
        bclr    #SYNCBIT,VSYNC  it's nighttime: turn on lights !
        clr.w   ecb             ecb := 0
retr    clr.l   count           count := 0
        rts

* storage for flags and pointers

limit   ds.l    1               timer limit (delay x 200)
count   ds.l    1               timer count (ticks every 5 msec)
ecb     ds.w    1               night/day flag (0 = day)
timold  ds.l    1               original system timer vector
kbdold  ds.l    1               original keyboard interrupt vector
biosold ds.l    1               original BIOS trap vector

* end of RAM-resident routine, start of initialisation routine
* (all this will be killed after init)

start   move.l  4(sp),a5        A5 := start of program
        move.l  #start,d0       D0 := end of resident part
        sub.l   a5,d0
        move.l  d0,prglen       PRGLEN := D0 - A5

        move.l  d0,-(sp)        return unused storage to GEMDOS
        move.l  a5,-(sp)
        move.w  #0,-(sp)
        move.w  #MSHRINK,-(sp)
        trap    #GEMDOS
        lea     12(sp),sp       adjust stack pointer

        tst.l   d0              MSHRINK successful ?
        bne     error           no: abort with error message

        bsr.s   init            everything ok: resume initialisation
        move.w  #0,-(sp)
        move.l  prglen,-(sp)
        move.w  #TERMRES,-(sp)  terminate, keep run-time part resident
        trap    #GEMDOS

* check command tail (if any), init vectors

init    lea     $80(a5),a0      A0 ==> command tail
        sub.l   d0,d0
        sub.l   d2,d2           clear work registers
        move.b  (a0)+,d0        D0 := length byte
        beq.s   setlim          length = 0: use default

*  convert ASCII parameter string to binary

        move.l  a0,d7           D7 := start of command tail
        move.w  d0,d1                 (used for display message)
        move.l  a0,a1
        add.l   d0,a1           A1 := A0 + D0 (one past last char on cmd line)
        clr.b   (a1)            add end-of-string marker
        subq.w  #1,d1           decrement length
cloop   move.b  (a0)+,d0        D0 := current command line character
        sub.b   #'0',d0         ASCII --> binary
        bmi.s   noval           < digit: assume end of value specification
        cmp.w   #9,d0
        bgt.s   noval           > digit: assume end of value specification
        mulu    #10,d2
        add.w   d0,d2           valid digit: D2 := 10 * D2 + D0

noval   dbra    d1,cloop        repeat for all chars in cmd line

setlim  tst.l   d2              any result ?
        bne.s   setl1           yes: use it
        move.l  #DEFAULT,d2     no:  use default
        clr.l   d7
setl1   bsr.s   signon          display signon message
        mulu    #200,d2         convert seconds to timer ticks (every 5 ms)
        move.l  d2,limit        save result

        move.l  #ivec,-(sp)     set new vectors in supervisor mode
        move.w  #SUPEXEC,-(sp)
        trap    #XBIOS
        addq.l  #6,sp
        rts                     all done, resume

* set system vectors: save original ones, replace them by new ones

ivec    moveq.l #2,d0           we've got 3 vectors to process
        sub.l   d1,d1           clear D1 (index registers)
        lea     oldtab,a0       A0 ==> table for original vectors
inxt    move.l  00(a0,d1.l),a1  A1 ==> vector address
        move.l  12(a0,d1.l),a2  A2 ==> storage area for old value
        move.l  24(a0,d1.l),a3  A3 ==> storage area for new value
        move.l  (a1),(a2)       save old value ...
        move.l  a3,(a1)         ... and set new vector
        addq.l  #4,d1           increment index register
        dbra    d0,inxt         repeat for all 3 vectors
        rts

oldtab  dc.l    BIOSVEC,KBDVEC,TIMVEC   system vector locations
        dc.l    biosold,kbdold,timold   old vector values
        dc.l    biostrp,kbdtrp,timtrp   new vector values
prglen  ds.l    1

* display signon msg and selected delay value

signon  lea     nmsg1,a0        A0 ==> signon message
        bsr.s   prt             show it
        lea     deft,a0         A0 ==> default value string
        tst.l   d7              use default ?
        beq.s   deflt           yes: skip
        move.l  d7,a0           D7 ==> command tail
        bsr.s   prt             show it (and hope it makes sense)
        lea     deft+3,a0       pick up string after default value
deflt   bsr.s   prt             show whatever is left to show

* simple wait loop (only necessary for GEM desktop users)

*wloop  moveq.l #20,d1          D1 := outer loop counter
*loop2  moveq.l #-1,d0          D0 := outer loop counter
*loop1  dbra    d0,loop1        execute inner ...
*       dbra    d1,loop2        ... and outer loop

        rts                     return from subroutine "signon" as well

* display "load error" message and return to O/S

error   lea     errmsg,a0       A0 --> start of string
        bsr.s   prt
*       bsr     wloop           call wait loop (so a desktop user can read
        move.w  #TERM,(sp)                      the message)
        trap    #GEMDOS         terminate process, return to caller

prt     move.l  a0,-(sp)        display string starting at A0
        move.w  #PRTS,-(sp)
        trap    #GEMDOS
        addq.l  #6,sp
        rts

* signup and error message area

errmsg  dc.b    'NIGHT utility load error',CR,LF,0
nmsg1   dc.b    'NIGHT monitor CRT protection utility - delay: ',0
deft    dc.b    '120 seconds',CR,LF,0
        end

------ End of NIGHT utility -------------------------------------------------

braner@batcomputer.tn.cornell.edu (braner) (01/16/87)

[]

Here is a simplified version of 'night', coupled with 'killer'.
(It is modified to conform to my "resident utility protocol".
The source code (in assembler language) is available upon request.)

Reminder:  'Night' blanks out the screen after 2 minutes of no activity.
Any mouse or keyboard input, or any BIOS text output, will turn screen
on again.  'Killer' enables escape from hung-up programs: hold down the
<Control>, <Alternate>, and BOTH <Shift> keys and press <Return>.
'Nite' combines the two utilities.

*   WARNING:
*
* This is NOT a "well-behaved" TOS program.  In fact, it probably
* will not work as-is with the next version of the TOS ROMs.
* (It's the 'killer' portion that's naughty, not the 'night' portion.)

BTW:  It works fine with the 'eternal' RAM disk.  Just make sure the RAM
disk is installed before 'nite'.  (Put them in the 'auto' folder in that
order.)

- Moshe Braner

~~~~~~~~~~~~~~~ cut here ~~~~~~~~~~~~~~~~
begin 644 NITE.PRG
M8!H   '0                             &   *I.251%     $CG ,!!
M^@"40_H C%*0LXAB%D'X@@<,$ " 9OH(^   @@I!^@!Z4E!,WP, +SK_SDYU
M3DE410    !A/@@7  5F% PX  \.&V8,"-< !2]\ /P*6@ "+SK_WDYU3DE4
M10     O # O  H,0  #9@)A"" ?+SK_ZDYU2GD   "J9PP(N   @@I">0  
M *I"N0   *9.=0  7<         J;P $(#P   "LD(TCP    4@O "\-/SP 
M #\\ $I.04_O  Q*@&8  (QA="\\    ]#\\ "9.3ER//SP  "\Z %P_/  Q
M3D%!^ $8(% ,J$Y)5$7_^&<>< *2@4'Z !HB<!@ )' 8#"9P&!@DD2*+6(%1
MR/_L3G4   "T   !&    10   !L    0@    @   !P    1@    P     
M0?H 1&$<<A1P_U'(__Y1R?_X3G5!^@ 880AAZCZ\  !.02\(/SP "4Y!7(].
M=0T*"@E.251%.B!L;V%D(&5R<F]R(0T*  T*"@E.251%.B!#4E0@<')O=&5C
M=&EO;B!A;F0@87-S87-S:6X@=71I;&ET>2 M(&EN<W1A;&QE9"X-"@      
-B X&%@@@5@0$! 0$    
 
end

ccs011@vega.ucdavis.edu (Bill Frazer) (03/25/88)

    I've just written a program that allows me to generate/display 
  the Mandelbrot set (at variable magnification).  I'd like to be
  able to save them in Degas compatible files, but I'm not familliar 
  with Degas format.                       

    I was wondering if any of you could tell me where I could find
  the specs on Dega files, or, if its not too much trouble, send
  me a description.  Better yet, if anyone has some C source
  (preferably Megamax, but its not neccessary) that will save the screen
  to a Degas file please send it to me!        

						Thanks in advance,

						ccs011@vega.ucdavis.edu
						..!ucbvax!ucdavis!vega!ccs011

unpowell@csvax.liv.ac.uk (04/21/88)

In article <1524@ucdavis.ucdavis.edu>, ccs011@vega.ucdavis.edu (Bill Frazer) writes:
> 
>     I was wondering if any of you could tell me where I could find
>   the specs on Dega files, or, if its not too much trouble, send
>   me a description.  Better yet, if anyone has some C source
>   (preferably Megamax, but its not neccessary) that will save the screen
>   to a Degas file please send it to me!        
> 

	A Degas file (without animation data) is 32034 bytes long. The last
32000 bytes is the actual screen image. The first 34 bytes are the resolution
and the pallettes.
	The first word of these bytes is the resolution (0,1 or 2) and the
next 32 words are the pallette registers 0 to 15.
	I don't the format of the compressed files.

C source? ... Yeuch!

        	Mark Powell
	
********************************************************************************

 "...I hate the white	JANET unpowell@uk.ac.liv.csvax
  man, and the man	UUCP  {backbone}!mcvax!ukc!mupsy!liv-cs!unpowell
  who turned you all	ARPA  unpowell%csvax.liv.ac.uk@nss.cs.ucl.ac.uk
  loose..." R. Harper

********************************************************************************