'===========================================================================
' Subject: SOME NICE TEXT SCREEN SAVERS       Date: 01-24-00 (09:09)       
'  Author: MARiO Lorenz                       Code: QB, PDS                
'  Origin: mario@the-real-world.de          Packet: TEXT.ABC
'===========================================================================
REM ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
REM ³@SRM@MM@BZBMD@NSBSBB@MB@0@ZBBZ@@B[ÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
REM ³0MZZWZMZEZB@@ST_   .'?~?*B@Z@Z#BM[º  TXT-SCR-Saver           º
REM ³BNMB@0S0MMG=_|xD3 i^^"_ {k}DBMRNMlº  coded by  MARiO '2k  º
REM ³ZBZB@QMM \bgEO&0v6J_=-x15s\s%&SBM1º  www.the-real-world.de   º
REM ³ZBZMBMSum$BZMZSMBdf3=-.q/=R^}\sRScº  mario@the-real-world.de º
REM ³BBZBNMEMZSwMBDpSkG^+=_^-u`3P>}-B@[ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼
REM ³@BMBE0EB&BB*A9P&wS*C\!" ;n- {vqkW}º
REM ³@M@00SMQZM5}./4>.~?fpg1`)/,_-( :&fÇÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ·
REM ³ZZEEZL^~GhU:,u %{%;z=%cc-a~' ~L @[º  Types:                      º
REM ³BZB#@Bvg5v?;3+sxxjZAPdX^`\- c{{ZMfº                              º
REM ³@#Z@EZ0Pd,=~-$&E00C2L?k>`')/c3q@B[º  Shuffle          01-06-97   º
REM ³REBZZMj ."__&ZSXPbLuC%:=.M=s25dBB[º  Worms            07-06-98   º
REM ³PB0@EBGq%Cg1&503zkhrtia--s.3YpBZZ[º  Stars            07-06-98   º
REM ³SZZZB@gyx__d2Lqq4z*~O0%~^x._qM@ZB[º  Cascade          07-06-98   º
REM ³&SWBEZBZq&xSYI~SX^}``\%j/=gZ@BBB0fº  Pacman           07-06-98   º
REM ³5S4MR@WptGTZP8e>'/=,_q_?1BEM0Z*SM6º  Snowfall         01-10-98   º
REM ³P/$P+PE!~O32`  __.-: c=']-~;;7/f$ º  TV-Zapping       15-04-99   º
REM ³TOx\,a_s-;G$px-^_%r:\>1=ZW?Sf#=*^}º  Wavetime         15-04-99   º
REM ³i; ".-`=" q5ZR&y9%/>-1%i,[~-^%_%i'º  Mandelbrot       15-04-99   º
REM ³_1Ca=   a^^hMGS&qC=x=*\,f;=,--grP[º  Millennium       05-01-2k   º
REM ³~^'   ..~>~-SESuav>ph_C '-~?._/^*)ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼
REM ÔÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ¼
REM ----- * Quellcode "QUAX.BAS" * System : QuickBASIC 4.5 * ----------------
DEFINT A-Z
TYPE RegTypeX
  ax AS INTEGER: bx AS INTEGER: cx AS INTEGER: dx AS INTEGER: bp AS INTEGER
  si AS INTEGER: di AS INTEGER: flags AS INTEGER: DS AS INTEGER: ES AS INTEGER
END TYPE
DECLARE SUB InterruptX (intnum AS INTEGER, inreg AS RegTypeX, outreg AS RegTypeX)
DECLARE SUB Cascade ()
DECLARE SUB Mandel ()
DECLARE SUB Millennium ()
DECLARE SUB Pacman ()
DECLARE SUB Pause (Break)
DECLARE SUB SchonFrage ()
DECLARE SUB Snowfall ()
DECLARE SUB Stars ()
DECLARE SUB Wave ()
DECLARE SUB Zapping ()
DECLARE SUB Shuffle ()
DECLARE SUB ScrSave (Name$, SW!)
DECLARE SUB Worms ()
DIM SHARED RegX AS RegTypeX, Stopp, ScrDat(2000, 2), bi(6)
REM ----- BackSCR -----------------------------------------------------------
SCREEN 0: WIDTH 80, 25: VIEW PRINT 1 TO 25: CLS
OPEN "txtsave.txt" FOR INPUT AS #1
RANDOMIZE TIMER
DO
v = INT(RND * 15) + 1
h = INT(RND * 8) + 1
LOOP WHILE h = v
COLOR v, h
PRINT STRING$(2000, 176);
LOCATE 2
DO UNTIL EOF(1)
  LOCATE , 3
  LINE INPUT #1, Txtline$
  PRINT Txtline$
LOOP
CLOSE
RESTORE DatBit:                    'important for zapping, snowfall, stars
FOR x = 1 TO 6: READ bi(x): NEXT
REM ----- input-Box ---------------------------------------------------------
CALL ScrSave("Auswahl", 1)
PosY = 1
Start:
DEF SEG = &HB800
COLOR 15, 1
BoxPosX = INT(RND * 65) + 1
BoxPosY = INT(RND * 12) + 1
LOCATE BoxPosY, BoxPosX: PRINT "ÉÍÍÍÍÍÍÍÍÍÍÍÍ»"
RESTORE DatBox
FOR x = 1 TO 10
  READ box$(x)
  LOCATE BoxPosY + x, BoxPosX: PRINT "º " + box$(x) + " º"
NEXT
LOCATE BoxPosY + 11, BoxPosX: PRINT "ÈÍÍÍÍÍÍÍÍÍÍÍÍ¼"
Eing:
COLOR 12, 7: LOCATE BoxPosY + PosY, BoxPosX + 1: PRINT " " + box$(PosY) + " "
DO
Taste$ = INKEY$
LOOP WHILE Taste$ = ""
OldPosY = PosY
IF LEN(Taste$) = 1 THEN Taste = ASC(Taste$) ELSE Taste = ASC(RIGHT$(Taste$, 1)) * -1
SELECT CASE Taste
  CASE -72, -75: PosY = PosY - 1
  CASE -80, -77: PosY = PosY + 1
  CASE 27: KILL "*.TMP": COLOR 7, 0: CLS : END
  CASE 13: CALL ScrSave("Auswahl", 2)
    FOR x = 1 TO 2000              'important for zapping, wave
      ScrDat(x, 1) = PEEK(x * 2 - 2): ScrDat(x, 2) = PEEK(x * 2 - 1)
      POKE x * 2 + 3998, 0: POKE x * 2 + 3999, 0
    NEXT
    SELECT CASE PosY
    CASE 1: CALL Cascade
    CASE 2: CALL Mandel
    CASE 3: CALL Millennium
    CASE 4: CALL Pacman
    CASE 5: CALL Shuffle
    CASE 6: CALL Snowfall
    CASE 7: CALL Stars
    CASE 8: CALL Wave
    CASE 9: CALL Worms
    CASE 10: CALL Zapping
  END SELECT
  Stopp = 0: CALL ScrSave("Auswahl", 2): GOTO Start
END SELECT
IF PosY = 11 THEN PosY = 1
IF PosY = 0 THEN PosY = 10
COLOR 15, 1: LOCATE BoxPosY + OldPosY, BoxPosX + 1: PRINT " " + box$(OldPosY) + " "
GOTO Eing:
REM ----- Data's ------------------------------------------------------------
DatPacman:
DATA 0,  7, 31, 63, 63,127,127,127,127,127,127, 63, 63, 31,  7,0
DATA 0,224,248, 60,252,254,246,104,158,254,254,252,252,248,224,0
DATA 0,224,248, 60,252,254,224,  0,192,240,254,252,252,248,224,0
DatMillenn:
DATA 0,8,7,15
DATA 0,1,9,15
DATA 0,2,10,15
DATA 0,3,11,15
DATA 0,4,12,14
DATA 0,5,13,15
DATA 0,6,14,15
DatBit:
DATA 0,250,7,43,42,15
DatBox:
DATA "Cascade   "
DATA "Mandelbrot"
DATA "Millennium"
DATA "Pacman    "
DATA "Shuffle   "
DATA "Snowfall  "
DATA "Stars     "
DATA "Wave      "
DATA "Worms     "
DATA "Zapping   "

SUB Cascade
REM ----- CasCade -----------------------------------------------------------
DO
PosY = INT(RND * 24)
PosX = INT(RND * 80)
TypA = PEEK(PosY * 160 + PosX * 2)
TypC = PEEK(PosY * 160 + PosX * 2 + 1)
xA = 0: xC = 0
FOR x = PosY + 1 TO 24
  ea = PEEK(x * 160 + PosX * 2)
  eC = PEEK(x * 160 + PosX * 2 + 1)
  POKE x * 160 + PosX * 2, TypA
  POKE x * 160 + PosX * 2 + 1, TypC
  POKE (x - 1) * 160 + PosX * 2, xA
  POKE (x - 1) * 160 + PosX * 2 + 1, xC
  xA = ea: xC = eC
  CALL Pause(5)
  CALL SchonFrage: IF Stopp THEN EXIT FOR
NEXT
LOOP UNTIL Stopp
END SUB

SUB Mandel
REM ----- Mandelbrotmenge ---------------------------------------------------
MaxP = 63
MaxX = 80
MaxY = 25
MaxI = 16
AngleR! = -2
AngleL! = -1.25
Side! = 2.5
DIM PalM(MaxP)
FOR x = 0 TO MaxP
  PalM(x) = x
NEXT x
DistX! = Side! / MaxX%
DistY! = Side! / MaxY%
FOR y = 1 TO MaxY
  FOR x = 1 TO MaxX%
    cr! = x * DistX! + AngleR!
    cl! = y * DistY! + AngleL!
    zr! = cr!
    zl! = cl!
    It = 0
    DO
      a! = zr! * zr!
      b! = zl! * zl!
      Length! = a! + b!
      zl! = 2 * zr! * zl! + cl!
      zr! = a! - b! + cr!
      It = It + 1
    LOOP UNTIL Length! > 4 OR It > MaxI
    POKE (y - 1) * 160 + (x * 2 - 1), It MOD 16
  NEXT x
NEXT y
DO
CALL Pause(20)
CALL SchonFrage
FOR x = 1 TO MaxP
  PalM(x) = (PalM(x) MOD MaxP) + 1
NEXT x
PALETTE USING PalM(0)
LOOP UNTIL Stopp
PALETTE
END SUB

SUB Millennium
DEFINT A-Z
REM ----- Copper ------------------------------------------------------------
RESTORE DatMillenn
Fb = 8
DIM CoppCol(7, Fb)
FOR x = 1 TO 7
  FOR y = 1 TO Fb / 2
    READ z: CoppCol(x, y) = z: CoppCol(x, (Fb + 1) - y) = z
  NEXT
NEXT
DO: Hi = INT(RND * 4) + 1
SELECT CASE Hi
  CASE 1: Minz = 0: MaxZ = 81: VzZ = 1: MinX = 0: MaxX = 24: t = 1
  CASE 2: Minz = 81: MaxZ = 0: VzZ = -1: MinX = 0: MaxX = 24: t = 1
  CASE 3: Minz = 0: MaxZ = 26: VzZ = 1: MinX = 0: MaxX = 79: t = 2
  CASE 4: Minz = 26: MaxZ = 0: VzZ = -1: MinX = 0: MaxX = 79: t = 2
END SELECT
  CoppTyp = INT(RND * 7) + 1
  FOR z = Minz - (Fb * VzZ) TO MaxZ + (Fb * VzZ) STEP VzZ
    FOR x = MinX TO MaxX
      FOR y = 1 TO Fb
        IF (((z + y) > Minz AND (z + y) < MaxZ) AND VzZ = 1) OR (((z + y) < Minz AND (z + y) > MaxZ) AND VzZ = -1) THEN
          SELECT CASE t
            CASE 1: POKE z * 2 + x * 160 + (y * 2 - 1), CoppCol(CoppTyp, y)
            CASE 2: POKE z * 160 + x * 2 + (y * 160 - 159), CoppCol(CoppTyp, y)
          END SELECT
        END IF
      NEXT
    NEXT
    CALL Pause(5)
    CALL SchonFrage: IF Stopp THEN EXIT FOR
  NEXT
IF Stopp THEN EXIT DO
LOOP
END SUB

SUB Pacman
REM ----- Pacman ------------------------------------------------------------
DIM PacScr AS STRING * 48
DEF SEG = VARSEG(PacScr)
RESTORE DatPacman:
FOR x = 1 TO 48
  READ y: POKE VARPTR(PacScr) + x - 1, y
NEXT
DEF SEG
RegX.ax = &H1100: RegX.bx = 256 * 16: RegX.cx = 3: RegX.dx = 214
RegX.ES = VARSEG(PacScr): RegX.bp = VARPTR(PacScr)
CALL InterruptX(&H10, RegX, RegX)
DEF SEG = &HB800
les = 2
DO: IF les = 1 THEN les = 2 ELSE les = 1
FOR x = 1 TO 2000
  IF x / 2 > FIX(x / 2) THEN Face = 215 ELSE Face = 216
  IF les = 1 THEN
    POKE x * 2 - 2, 0: POKE x * 2 - 1, 0
  ELSE
    POKE x * 2 - 2, ScrDat(x, 1): POKE x * 2 - 1, ScrDat(x, 2)
  END IF
  POKE x * 2, 214: POKE x * 2 + 1, 14
  POKE x * 2 + 2, Face: POKE x * 2 + 3, FIX(PEEK(x * 2 + 3) / 16) * 16 + 14
  CALL Pause(7)
  CALL SchonFrage: IF Stopp THEN EXIT FOR
NEXT
LOOP UNTIL Stopp
END SUB

SUB Pause (Break)
REM ----- Pause -------------------------------------------------------------
FOR pp = 1 TO Break: WAIT &H3DA, 8: WAIT &H3DA, 8, 8: NEXT
END SUB

SUB SchonFrage
REM ----- Tastatur-/Mausabfrage ---------------------------------------------
IF INKEY$ <> "" THEN Stopp = 1
END SUB

DEFSNG A-Z
SUB ScrSave (Name$, SW)
REM ----- Bildschirmspeicherer und -leser -----------------------------------
DEF SEG = &HB800
SELECT CASE SW
CASE 1: BSAVE Name$ + ".TMP", 0, 4000
CASE 2: BLOAD Name$ + ".TMP", 0
END SELECT
END SUB

DEFINT A-Z
SUB Shuffle
REM ----- Shuffle -----------------------------------------------------------
DIM Puzz(5, 16)
x1 = FIX(RND * 10) + 1: y1 = FIX(RND * 5) + 1
DO: DO: Oldx1 = x1: Oldy1 = y1: ri = FIX(RND * 4) + 1
    SELECT CASE ri
      CASE 1: x1 = x1 + 1
      CASE 2: x1 = x1 - 1
      CASE 3: y1 = y1 + 1
      CASE 4: y1 = y1 - 1
    END SELECT
    IF x1 > 10 OR x1 < 1 OR y1 > 5 OR y1 < 1 THEN x1 = Oldx1: y1 = Oldy1
  LOOP WHILE x1 = Oldx1 AND y1 = Oldy1
  IF Oldx1 = x1 THEN ze = 5 ELSE ze = 8
  IF Oldy1 - y1 = 1 OR Oldx1 - x1 = 1 THEN xs = 5: xe = 1: xst = -1: ys = 16: ye = 1: yst = -1 ELSE xs = 1: xe = 5: xst = 1: ys = 1: ye = 16: yst = 1
  FOR z = 0 TO ze
    CALL Pause(2)
    FOR x2 = xs TO xe STEP xst
      FOR y2 = ys TO ye STEP yst
        xyz = (y2 - 1) + (160 * (x2 - 1)) + (800 * (y1 - 1)) + (16 * (x1 - 1))
        IF z = 0 THEN
          Puzz(x2, y2) = PEEK(xyz)
        ELSE
          POKE (xyz + (z * 160 * (Oldy1 - y1)) + (z * 2 * (Oldx1 - x1))), Puzz(x2, y2)
          IF PEEK((y2 - 1) + (160 * (x2 - 1)) + (800 * (Oldy1 - 1)) + (16 * (Oldx1 - 1))) <> 0 THEN POKE (xyz), 0
        END IF
      NEXT
    NEXT
  NEXT
  CALL Pause(30)
  CALL SchonFrage
LOOP UNTIL Stopp
END SUB

SUB Snowfall
REM ----- Snowfall ----------------------------------------------------------
XRes = 80: YRes = 25: Dots = 40
DIM XPos(Dots), YPos(Dots)
FOR x = 1 TO Dots
  YPos(x) = INT(RND * YRes) + 1
  XPos(x) = INT(RND * XRes) + 1
NEXT
COLOR 15, 0: CLS
DO: FOR x = 1 TO Dots
  POKE (YPos(x) - 1) * 160 + XPos(x) * 2, 0
  YPos(x) = YPos(x) + INT(RND * 3)
  XRnd = INT(RND * 6) + 1
  IF XRnd > 3 THEN XRnd = 3 - XRnd
  XPos(x) = XPos(x) + XRnd
  IF YPos(x) > YRes THEN YPos(x) = 1: XPos(x) = INT(RND * XRes) + 1
  IF XPos(x) > 80 THEN XPos(x) = 80
  IF XPos(x) < 1 THEN XPos(x) = 1
  POKE (YPos(x) - 1) * 160 + XPos(x) * 2, bi(INT(RND * 2) + 2)
NEXT
CALL Pause(10)
CALL SchonFrage
LOOP UNTIL Stopp
END SUB

SUB Stars
REM ----- Stars -------------------------------------------------------------
COLOR , 0: CLS
DO
Pose = INT(RND * 2000) * 2
Art = INT(RND * 15) + 1
SELECT CASE Art
  CASE 1 TO 10: Typ = 0
  CASE 11 TO 12: Typ = 7
  CASE 13 TO 14: Typ = 250
  CASE 15: POKE Pose + 1, 15
  FOR x = 1 TO 12
    IF x <= 6 THEN POKE Pose, bi(x) ELSE POKE Pose, bi(12 - x + 1)
    CALL Pause(7)
  NEXT
END SELECT
IF Art < 15 THEN POKE Pose, Typ: POKE Pose + 1, 11: CALL Pause(7)
CALL SchonFrage
LOOP UNTIL Stopp
END SUB

SUB Wave
REM ----- Waver -------------------------------------------------------------
DIM SPosY(80)
DO: Hi = INT(RND * 4) + 1
SELECT CASE Hi
  CASE 1: Max1 = 0: Max2 = 80: Vz1 = -1: Vz2 = 1: yy1 = 0: yy2 = 24: xx1 = 1: xx2 = 80: MaxW = 80
  CASE 2: Max1 = 80: Max2 = 0: Vz1 = 1: Vz2 = -1: yy1 = 0: yy2 = 24: xx1 = 1: xx2 = 80: MaxW = 1
  CASE 3: Max1 = 0: Max2 = 25: Vz1 = -1: Vz2 = 1: yy1 = 1: yy2 = 80: xx1 = 0: xx2 = 24: MaxW = 25
  CASE 4: Max1 = 25: Max2 = 0: Vz1 = 1: Vz2 = -1: yy1 = 1: yy2 = 80: xx1 = 0: xx2 = 24: MaxW = 1
END SELECT
  FOR y = yy1 TO yy2
    SPosY(y) = MaxW
  NEXT
  ri = 2
  DO: IF ri = 2 THEN ri = 1 ELSE ri = 2
    DO: FOR y = yy1 TO yy2
          SELECT CASE ri
          CASE 1: SPosY(y) = SPosY(y) + (RND * 1.5) * Vz1
            IF Vz1 = -1 THEN Verg1 = SPosY(y): Verg2 = Max1 ELSE Verg1 = Max1: Verg2 = SPosY(y)
            IF Verg1 < Verg2 THEN SPosY(y) = Max1
          CASE 2: SPosY(y) = SPosY(y) + (RND * 1.5) * Vz2
            IF Vz1 = -1 THEN Verg1 = SPosY(y): Verg2 = Max2 ELSE Verg1 = Max2: Verg2 = SPosY(y)
            IF Verg1 > Verg2 THEN SPosY(y) = Max2
          END SELECT
        FOR x = xx1 TO xx2
          Pok1 = 0: Pok2 = 0
          SELECT CASE Hi
          CASE 1: IF x <= SPosY(y) THEN Pok1 = ScrDat(y * 80 + x + (80 - SPosY(y)), 1): Pok2 = ScrDat(y * 80 + x + (80 - SPosY(y)), 2)
          CASE 2: IF x > SPosY(y) THEN Pok1 = ScrDat(y * 80 + (x - SPosY(y)), 1): Pok2 = ScrDat(y * 80 + (x - SPosY(y)), 2)
          CASE 3: IF x < SPosY(y) THEN Pok1 = ScrDat((x + (25 - SPosY(y))) * 80 + y, 1): Pok2 = ScrDat((x + (25 - SPosY(y))) * 80 + y, 2)
          CASE 4: IF x >= SPosY(y) THEN Pok1 = ScrDat((x - SPosY(y)) * 80 + y, 1): Pok2 = ScrDat((x - SPosY(y)) * 80 + y, 2)
          END SELECT
          SELECT CASE Hi
          CASE 1, 2
            POKE (y * 80 + x) * 2 - 2, Pok1
            POKE (y * 80 + x) * 2 - 1, Pok2
          CASE 3, 4
            POKE (x * 80 + y) * 2 - 2, Pok1
            POKE (x * 80 + y) * 2 - 1, Pok2
          END SELECT
        NEXT
        CALL SchonFrage
        IF Stopp THEN EXIT SUB
      NEXT
      CALL Pause(3)
      FOR y = yy1 TO yy2
        Wei = 0
        IF ri = 1 THEN
          IF Vz1 = -1 THEN Verg1 = SPosY(y): Verg2 = Max1 ELSE Verg1 = Max1: Verg2 = SPosY(y)
          IF Verg1 > Verg2 THEN Wei = 1: EXIT FOR
        ELSE
          IF Vz1 = -1 THEN Verg1 = SPosY(y): Verg2 = Max2 ELSE Verg1 = Max2: Verg2 = SPosY(y)
          IF Verg1 < Verg2 THEN Wei = 1: EXIT FOR
        END IF
      NEXT
    LOOP WHILE Wei
  LOOP WHILE ri = 1
LOOP
END SUB

SUB Worms
REM ----- Worms -------------------------------------------------------------
fly = 7
FlyL = 6
DIM x(fly, FlyL + 1), y(fly, FlyL + 1), d(fly, FlyL + 1)
FOR I = 1 TO fly
  x(I, 1) = INT(RND * 80) + 1
  y(I, 1) = INT(RND * 25) + 1
  d(I, 2) = INT(RND * 8) + 1
NEXT
DO
FOR I = 1 TO fly
  FOR j = FlyL TO 1 STEP -1
    SELECT CASE j
    CASE 1: COLOR 15 - I
      ri = INT(RND * 5) + 1
      SELECT CASE ri
        CASE 1: d(I, 1) = d(I, 2) + 0
        CASE 2: d(I, 1) = d(I, 2) + 1
        CASE 3: d(I, 1) = d(I, 2) + 2
        CASE 4: d(I, 1) = d(I, 2) + 6
        CASE 5: d(I, 1) = d(I, 2) + 7
      END SELECT
      IF d(I, 1) > 8 THEN d(I, 1) = d(I, 1) - 8
      SELECT CASE d(I, 1)
        CASE 1: x(I, 1) = x(I, 1) + 1
        CASE 2: x(I, 1) = x(I, 1) + 1: y(I, 1) = y(I, 1) + 1
        CASE 3: y(I, 1) = y(I, 1) + 1
        CASE 4: x(I, 1) = x(I, 1) - 1: y(I, 1) = y(I, 1) + 1
        CASE 5: x(I, 1) = x(I, 1) - 1
        CASE 6: x(I, 1) = x(I, 1) - 1: y(I, 1) = y(I, 1) - 1
        CASE 7: y(I, 1) = y(I, 1) - 1
        CASE 8: x(I, 1) = x(I, 1) + 1: y(I, 1) = y(I, 1) - 1
      END SELECT
      IF x(I, 1) < 1 THEN x(I, 1) = 80
      IF x(I, 1) > 80 THEN x(I, 1) = 1
      IF y(I, 1) < 1 THEN y(I, 1) = 25
      IF y(I, 1) > 25 THEN y(I, 1) = 1
      LOCATE y(I, j), x(I, j): PRINT "™";
    CASE 2 TO FlyL - 1: COLOR 15 - I
    IF y(I, j) > 0 AND x(I, j) > 0 THEN LOCATE y(I, j), x(I, j): PRINT "o";
    CASE FlyL: COLOR 0, 0
    IF y(I, j) > 0 AND x(I, j) > 0 THEN LOCATE y(I, j), x(I, j): PRINT " ";
    END SELECT
    CALL SchonFrage
    IF Stopp THEN EXIT SUB
    x(I, j + 1) = x(I, j): y(I, j + 1) = y(I, j): d(I, j + 1) = d(I, j)
  NEXT
  CALL Pause(1)
NEXT
LOOP
END SUB

SUB Zapping
REM ----- Zapping -----------------------------------------------------------
COLOR 7, 0
DO: Sy = 1: sx = 1: Sb = 80: sl = 25
DO: FOR y = Sy TO sl
  IF y = Sy THEN
    LOCATE y, sx: PRINT "Ú" + STRING$((Sb - 2), "Ä") + "¿";
  ELSEIF y = sl THEN
    LOCATE y, sx: PRINT "À" + STRING$((Sb - 2), "Ä") + "Ù";
  ELSE
    LOCATE y, sx: PRINT "³";
    LOCATE y, sx + Sb - 1: PRINT "³";
  END IF
NEXT
CALL Pause(3)
FOR y = Sy TO sl
  IF y = Sy THEN
    LOCATE y, sx: PRINT SPACE$(Sb);
  ELSEIF y = sl THEN
    LOCATE y, sx: PRINT SPACE$(Sb);
  ELSE
    LOCATE y, sx: PRINT " ";
    LOCATE y, sx + Sb - 1: PRINT " ";
  END IF
NEXT
sl = sl - 1: Sy = Sy + 1
sx = sx + 1: Sb = Sb - 2
CALL SchonFrage
IF Stopp THEN GOTO ZappEnd
LOOP WHILE sl <> Sy
FOR y = 1 TO Sb / 2
  LOCATE Sy, sx + y - 1: PRINT " "; STRING$((Sb - y * 2), "Ä"); " ";
CALL Pause(2)
NEXT
PosZ = (Sy - 1) * 160 + (sx + y) * 2
FOR x = 1 TO 12
  IF x <= 6 THEN POKE PosZ, bi(7 - x) ELSE POKE PosZ, bi(x - 6)
  CALL Pause(7)
NEXT
FOR y = Sb / 2 TO 1 STEP -1
  LOCATE Sy, sx + y - 1: PRINT " "; STRING$((Sb - y * 2), "Ä"); " ";
  CALL Pause(2)
NEXT
CALL SchonFrage
IF Stopp THEN GOTO ZappEnd
DO
sl = sl + 1: Sy = Sy - 1
sx = sx - 1: Sb = Sb + 2
FOR y = sl TO Sy STEP -1
  IF y = Sy THEN
    LOCATE y, sx: PRINT "Ú" + STRING$((Sb - 2), "Ä") + "¿";
  ELSEIF y = sl THEN
    LOCATE y, sx: PRINT "À" + STRING$((Sb - 2), "Ä") + "Ù";
  ELSE
    LOCATE y, sx: PRINT "³";
    LOCATE y, sx + Sb - 1: PRINT "³";
  END IF
NEXT
FOR y1 = Sy TO sl - 2
  FOR x1 = sx TO Sb + sx - 3
    POKE (y1 * 80 + x1) * 2, ScrDat((y1 * 80 + x1) + 1, 1)
    POKE (y1 * 80 + x1) * 2 + 1, ScrDat((y1 * 80 + x1) + 1, 2)
  NEXT
NEXT
CALL Pause(3)
LOOP UNTIL Sy = 1 AND sl = 25
FOR x = 1 TO 2000
  POKE x * 2 - 2, ScrDat(x, 1): POKE x * 2 - 1, ScrDat(x, 2)
NEXT
FOR x = 1 TO 200
  CALL SchonFrage
  CALL Pause(1)
  IF Stopp THEN GOTO ZappEnd
NEXT
LOOP
ZappEnd:
END SUB
