'===========================================================================
' Subject: POPUP DOS SCREEN SAVER             Date: 01-16-00 (21:39)       
'  Author: Ken Sims                           Code: PB                     
'  Origin: mrken@megsinet.com               Packet: PB.ABC
'===========================================================================
'ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
'³   This  program demonstrates a complete popup TSR program known      ³
'³   as POPSAVER which can be STARTED when ALT-A is pressed.            ³
'³  In order to run this program do the following:                      ³
'³    1. Load PowerBASIC by typing PB at the DOS prompt.                ³
'³    2. Load the file popsaver.BAS from the Open option of the         ³
'³       File pulldown menu.                                            ³
'³    3. Compile by pressing ALT-F9                                     ³
'³    4. Exit PowerBASIC by pressing ALT-X                              ³
'³    5. Type POPSAVER from the DOS prompt                              ³
'³    6. Popup the TSR by pressing ALT-A                                ³
'³    7. Popdown the TSR by pressing ESC                                ³
'³    8. If you desire, un-install the TSR by pressing                  ³
'³       lowr case  q while it is popped up                             ³
'ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ

$DIM NONE
$COMPILE EXE                  ' this tells PB to make a standalone EXE
$LIB IPRINT OFF               ' allow graphic characters to print
$OPTION CNTLBREAK OFF         ' not wise in a tsr
POPUP QUIET 1000
x& = SETMEM(-700000)          ' release unused memory
CALL CLR
COLOR 4,7
LOCATE 1,1
PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿"
PRINT "³   This  program demonstrates a complete popup TSR program known      ³"
PRINT "³   as POPSAVER which can be STARTED when ALT-A is pressed.            ³"
PRINT "³  In order to run this program do the following:                      ³"
PRINT "³                                                                      ³"
PRINT "³     FREEWARE from KASA Entertainment-Presents & Ken Sims             ³"
PRINT "³      Updated REL of POWERBASIC'S ASCIITSR.BAS 01/16/2000             ³"
PRINT "³                                                                      ³"
PRINT "³                                                                      ³"
PRINT "³    1. Type POPSAVER from the DOS prompt (you allready did that)      ³"
PRINT "³    2. Popup the TSR by pressing ALT-A                                ³"
PRINT "³    3. Popdown the TSR by pressing ESC                                ³"
PRINT "³    4. If you desire, un-install the TSR by pressing                  ³"
PRINT "³       lower case q while it is popped up                             ³"
PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ"
POPUP KEY CHR$(8,30,247)      ' ALT A is the hot key

POPUP MULTIPLEX &HC000, 254   ' reg AX and DX get this pattern as an ID
REG 1, &HC000 : REG 4, 254    ' set pattern to check for already installed
CALL INTERRUPT &H2F           ' do the multiplex interrrupt
IF REG(1)<>&HC000 AND REG(4)<>254 THEN END 'we were already installed

SwapFile$ = LEFT$(CURDIR$,2)+"\ASCTSR.SWP"

PRINT "POPSAVER available as ALT-A"
REG 1, &HC001 : REG 4, 252    ' Alter AX,DX to show we were here
POPUP SLEEP USING EMS, SwapFile$       ' before going to sleep

WHILE 1=1
  x% = POS : y% = CSRLIN
  DEF SEG = &hB800
  SaveScreen$ = PEEK$(0,4000) ' save the entire screen
  IF REG(1)=&HC000 AND REG(4)=254 THEN
    LOCATE 12,20
    PRINT "ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿";
    LOCATE 13,20
    PRINT "³      POPSAVER  is already installed ³";
    LOCATE 14,20
    PRINT "ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ";
  ELSE
    GOSUB showsavers
  END IF
  a$ = INPUT$(1)                               'wait for key to cancel
  POKE$ 0, SaveScreen$ :  LOCATE y%, x%        'restore screen
  IF UCASE$(A$)="Q" THEN IF POPUP(1) THEN END  'this uninstalls us
  REG 1, &HC001 : REG 4, 252  ' Alter AX,DX to show we were here
  POPUP SLEEP                 ' before going to sleep
WEND

showsavers:
'                       SCREEN SAVER FOR POWERBASIC
'
'       This program runs TEN different screen saver screens sequentialy.
'All screens are colorful and randomly generated so that no two are exactly
'alike.
'
'From KASA Entertainment-Presents & Ken Sims
'
'
DEFINT A-Z
CALL screen1
SUB screen1
CALL CLR
SCREEN 12
FOR i% = 1 TO 320
        FOR c% = 0 TO 15
12                   IF INKEY$ = CHR$(27) THEN 14
                     x% = RND(TIMER) * 1000
                     y% = RND(TIMER + 1) * 1000
                     IF x% > 640 THEN 12
                     IF y% > 480 THEN 12
                     PSET (x%, y%), c%
        NEXT c%
NEXT i%
CALL screen2
14
END SUB

SUB screen2
CALL CLR
SCREEN 12
FOR i% = 1 TO 32
        FOR c% = 0 TO 15
20                   IF INKEY$ = CHR$(27) THEN 21
                     x% = RND(TIMER) * 1000
                     y% = RND(TIMER + 1) * 1000
                     z% = RND(TIMER + 2) * 1000
                     w% = RND(TIMER + 3) * 1000
                     IF x% > 640 THEN 20
                     IF y% > 480 THEN 20
                     IF w% > 640 THEN 20
                     IF z% > 480 THEN 20
                     LINE (x%, y%)-(w%, z%), c%
        NEXT c%
NEXT i%
CALL screen3
21
END SUB

SUB screen3
CALL CLR
SCREEN 12
FOR i% = 1 TO 32
        FOR c% = 0 TO 15
22                   IF INKEY$ = CHR$(27) THEN 23
                     x% = RND(TIMER) * 1000
                     y% = RND(TIMER + 1) * 1000
                     z% = RND(TIMER + 2) * 1000
                     w% = RND(TIMER + 3) * 1000
                     IF x% > 640 THEN 22
                     IF y% > 480 THEN 22
                     IF w% > 640 THEN 22
                     IF z% > 480 THEN 22
                     LINE (x%, y%)-(w%, z%), c%, BF
        NEXT c%
NEXT i%
CALL screen4
23
END SUB

SUB screen4
CALL CLR
SCREEN 12
FOR i% = 1 TO 100
        FOR c% = 0 TO 15
24                   IF INKEY$ = CHR$(27) THEN 25
                     x% = RND(TIMER) * 1000
                     y% = RND(TIMER + 1) * 1000
                     z% = RND(TIMER + 2) * 100
                     IF x% > 640 THEN 24
                     IF y% > 480 THEN 24
                     CIRCLE (x%, y%), z%, c%
                     PAINT (x%, y%), c%, c%
        NEXT c%
NEXT i%
CALL screen5
25
END SUB

SUB screen5
CALL CLR
SCREEN 12
FOR i% = 1 TO 15
        FOR c% = 0 TO 15
26                   IF INKEY$ = CHR$(27) THEN 27
                     x% = RND(TIMER) * 1000
                     y% = RND(TIMER + 1) * 1000
                     z% = RND(TIMER + 2) * 1000
                     w% = RND(TIMER + 3) * 1000
                     a% = RND(TIMER + 4) * 1000
                     b% = RND(TIMER + 5) * 1000
                     IF x% > 640 THEN 26
                     IF y% > 480 THEN 26
                     IF w% > 640 THEN 26
                     IF z% > 480 THEN 26
                     IF a% > 640 THEN 26
                     IF b% > 480 THEN 26
                     LINE (x%, y%)-(a%, b%), c%
                     LINE (a%, b%)-(w%, z%), c%
                     LINE (x%, y%)-(w%, z%), c%
        NEXT c%
NEXT i%
CALL screen6
27
END SUB

SUB screen6
FOR h% = 1 TO 10
CLS
SCREEN 12
28 x% = RND(TIMER) * 1000
29 y% = RND(TIMER + 1) * 1000
IF INKEY$ = CHR$(27) THEN 30
IF x% > 640 THEN 28
IF y% > 240 THEN 29
r% = 0
FOR i% = 1 TO 10
        FOR c% = 0 TO 15
                FOR t% = 1 TO 3
                    r% = r% + 1
                    CIRCLE (x%, y%), r%, c%
                NEXT t%
        NEXT c%
NEXT i%
FOR g% = 500 TO 1 STEP -1
        CIRCLE (x%, y%), g%, 0
NEXT g%
NEXT h%
CALL screen7
30
END SUB

SUB screen7
FOR h% = 1 TO 10
CLS
SCREEN 12
31 x% = RND(TIMER) * 1000
32 y% = RND(TIMER + 1) * 1000
33 w% = RND(TIMER + 2) * 1000
34 z% = RND(TIMER + 3) * 1000
IF INKEY$ = CHR$(27) THEN 35
IF x% > 640 THEN 31
IF y% > 240 THEN 32
IF w% > 640 THEN 33
IF z% > 240 THEN 34
IF x% > w% THEN 31
IF y% > z% THEN 32
r% = 0
FOR i% = 1 TO 20
        FOR c% = 0 TO 15
                FOR t% = 1 TO 3
                    x% = x% - 1
                    y% = y% - 1
                    w% = w% + 1
                    z% = z% + 1
                    LINE (x%, y%)-(w%, z%), c%
                NEXT t%
        NEXT c%
NEXT i%
NEXT h%
CALL screen8
35
END SUB

SUB screen8
FOR h% = 1 TO 15
CLS
SCREEN 12
36 x% = RND(TIMER) * 1000
37 y% = RND(TIMER + 1) * 1000
38 w% = RND(TIMER + 2) * 1000
39 z% = RND(TIMER + 3) * 1000
IF INKEY$ = CHR$(27) THEN 40
IF x% > 640 THEN 36
IF y% > 240 THEN 37
IF w% > 640 THEN 38
IF z% > 240 THEN 39
IF x% > w% THEN 36
IF y% > z% THEN 37
r% = 0
FOR i% = 1 TO 20
        FOR c% = 0 TO 15
                FOR t% = 1 TO 3
                    x% = x% - 1
                    y% = y% - 1
                    w% = w% + 1
                    z% = z% + 1
                    LINE (x%, y%)-(w%, z%), c%, B
                NEXT t%
        NEXT c%
NEXT i%
FOR j% = 1 TO 970
        LINE (x%, y%)-(w%, z%), 0, B
        x% = x% + 1
        y% = y% + 1
        w% = w% - 1
        z% = z% - 1
NEXT j%
NEXT h%
CALL screen9
40
END SUB

SUB screen9
CALL CLR
CONST = TRUE
CONST = FALSE
LOCATE 2, 3, 0
LOCATE 3, 3, 0
LOCATE 5, 3, 0
RANDOMIZE TIMER
CLS
num = 20
SCREEN 1
x = 0
y = 0
DONE = 0
DO UNTIL DONE = 21
  colr = 1
  colri = 0
  CLS
  a = INT(20 * RND)
  b = INT(30 * RND)
  C = INT(70 * RND)
  FOR i = 1 TO 1000 * num
    PSET (x + 160, y + 100), colr
    x1 = y - SGN(x) * SQR(ABS(b * x - C))
    y1 = a - x
    x = x1
    y = y1
    colri = colri + 1
    IF colri > 3000 THEN
      colr = colr + 1
      IF colr = 4 THEN colr = 1
      colri = 0
    END IF
    IF INKEY$ > "" THEN
      DONE = 21
      i = 1000 * num
      GOTO 41
    END IF
  NEXT
INCR DONE
LOOP
CALL screen10
41
END SUB

SUB screen10
        DONE = 0
        CLS                                       ' Clears screen.
	SCREEN 12                                 ' High Resolution.
        COLOR 0,2
	LOCATE 14, 29                             ' Where the words go.
	FOR i% = 1 TO 700                         ' How many pixels
	 PSET (i%, 220), 7                        '  to move across the screen.
	 PSET (i%, 210), 8
        FOR COOLIT% = 1 TO 500                     ' How fast it goes.
        NEXT COOLIT%
	NEXT i%
	SLEEP 1                                   ' How long it pauses.
	SLEEP 1
	DO                                        ' Do the do....for your loop.
	FOR j% = 100 TO 300
	RANDOMIZE TIMER                           ' Makes Random Numbers.
	 x% = INT(RND * 600) + 1
	 y% = INT(RND * 600) + 1
	 c% = INT(RND * 15) + 1
	CIRCLE (j%, x%), y%, c%                   ' Random Circle Sizes.
	LINE (y%, x%)-(x%, y%), c%, BF            ' Random Sized/Filled Circles.
        FOR COOLIT% = 1 TO 200: NEXT COOLIT%
	NEXT j%
        IF INKEY$ = CHR$(27) THEN 42
        INCR DONE
        LOOP UNTIL DONE = 25
        COLOR 7,0
        CALL SCREEN1
        42
END SUB

SUB CLR
A = 80
C = 12
D = 12
FOR B = 1 TO 12
LOCATE C,A
PRINT "                                                                                "
PRINT " "
LOCATE D,A
PRINT "                                                                                "
PRINT " "
A = A - 1
C = C - 1
D = D + 1
DELAY .1
IF C = 0 THEN
  C = 24
  CLS
END IF
NEXT
LOCATE 24, 1

END SUB
RETURN
