'===========================================================================
' Subject: SPLIT/MERGE TEXT SCREEN FOR PB     Date: 11-19-97 (20:15)       
'  Author: The ABC Programmer                 Code: PB                     
'  Origin: voxel@freenet.edmonton.ab.ca     Packet: TEXT.ABC
'===========================================================================
'===================[ Split/Merge Text Screen]===================
' Creates a neat split/merge effect to change text screens.
' Programmed by William Yu  (100% Public Domain) for PB.
'
' Sucks up a fair amount of memory though, but normally just 8K
' to switch from one screen to the next, but you can always
' re-use your arrays.
' You may experience flicker during SplitScreen, but that's
' because I gave up optimizing the SUB and used a cheap effect.
'================================================================

$OPTIMIZE SPEED
$ERROR ALL OFF
$LIB ALL OFF
$STRING 8

%Height = 25   '' Works for ANY Height, too bad you don't have that many.

DEFINT A-Z
DIM Scr1(1 to %Height) AS STRING*160
DIM Scr2(1 to %Height) AS STRING*160

WIDTH 80,%Height
DEF SEG=&HB800     '' Works fine with Monochrome as well (&HB000)

FOR N=0 TO %Height*160 STEP 160         '' Create some random characters
  POKE$ N, STRING$(160,CHR$(RND*255))
NEXT N
Drawbox 1,1,40,INT(%Height/2),11,5,0,2
Drawbox 3,2,38,INT(%Height/2)-1,11,5,1,2
Drawbox 41,1,80,INT(%Height/2),11,5,0,2
Drawbox 1,INT(%Height/2)+1,40,%Height-1,11,5,0,2
Drawbox 41,INT(%Height/2)+1,80,%Height-1,11,5,0,2
LOCATE 5,10:COLOR 15:?"Hello World!"
Screen1$=PEEK$(0,%Height*160)           '' Save entire screen as String
FOR N=1 TO %Height
  Scr2(N) = PEEK$((N-1)*160,160)        '' Save entire screen to Array
NEXT N

Drawbox 1,1,40,INT(%Height/2),15,1,1,1              '' Create another screen
Drawbox 3,2,38,INT(%Height/2)-1,11,3,1,1
Drawbox 41,1,80,INT(%Height/2),15,1,1,1
Drawbox 1,INT(%Height/2)+1,40,%Height-1,15,1,1,1
Drawbox 41,INT(%Height/2)+1,80,%Height-1,15,1,1,1
Screen2$=PEEK$(0,%Height*160)
FOR N=1 TO %Height
  Scr1(N) = PEEK$((N-1)*160,160)       '' Save it
NEXT N

I=0
Do                                     '' The loop
  IF I=0 THEN
    SplitScreen Scr1(),Screen1$
    MergeScreen Scr2()
    Sleep .1
  ELSE
    SplitScreen Scr2(),Screen2$
  END IF
  I = NOT I
Loop until inkey$<>""


END


SUB SplitScreen (Scr1() AS STRING*160, Scr$)
''====================================================================
'' Inputs: Src1() is the current screen image that you want to split.
''         Scr$ is the saved screen you wish to reveal.
''--------------------------------------------------------------------
M=1
HalfH=INT(%Height/2)-1
K=HalfH
DO
  X=0
  T!=TIMER
  POKE$ 0,Scr$  'Perhaps not the best approach, but I'm lazy, this will do.
                'my original plan was to... eh, nevermind.
  FOR N=1+(HalfH-K) to HalfH
    ''Hmmmm, why try to understand?  Just marvel that it actually works. :)
    POKE$ X*160,mid$(Scr1(N+1),M,78-(M-3))
    POKE$ X*160+82+M-3,mid$(Scr1(N+1),81,78-(M-3))
    POKE$ (X+HalfH+2+(HalfH-K))*160,mid$(Scr1(X+HalfH+2),M,78-(M-3))
    POKE$ (X+HalfH+2+(HalfH-K))*160+82+M-3,mid$(Scr1(X+HalfH+2),81,78-(M-3))
    INCR X
  NEXT N
  DO:LOOP UNTIL TIMER-T!>.01    '' oooh look, precision timing
  INCR M,4
  DECR K
LOOP UNTIL K<0 OR M>81
END SUB

SUB MergeScreen (Scr1() AS STRING*160)
''====================================================================
'' Inputs: Src1() is the screen image that you want to merge.
''
'' Basically just a reverse of SplitScreen, still a mess :)
''--------------------------------------------------------------------
M=%Height-(%Height MOD 2)-1  '' What?  Cool eh? <g>
HalfH=INT(%Height/2)-1
K=1
DO
  X=0
  T!=TIMER
  FOR N=1+(HalfH-K) to HalfH
    POKE$ X*160,mid$(Scr1(N+1),M,78-(M-3))
    POKE$ X*160+82+M-3,mid$(Scr1(N+1),81,78-(M-3))
    POKE$ (X+HalfH+2+(HalfH-K))*160,mid$(Scr1(X+HalfH+2),M,78-(M-3))
    POKE$ (X+HalfH+2+(HalfH-K))*160+82+M-3,mid$(Scr1(X+HalfH+2),81,78-(M-3))
    INCR X
  NEXT N
  DO:LOOP UNTIL TIMER-T!>.01
  DECR M,2
  INCR K
LOOP UNTIL M<0
END SUB

SUB DrawBox (X%, Y%, XX%, YY%, C%, BC%, Solid%, CharSet%)
'' Routine to draw a simple 2D box.

 IF CharSet% = 1 THEN
   Char1$ = "Ú"
   CharHoz$ = "Ä"
   Char2$ = "¿"
   CharVert$ = "³"
   Char3$ = "À"
   Char4$ = "Ù"
 END IF

 IF CharSet% = 2 THEN
   Char1$ = "É"
   CharHoz$ = "Í"
   Char2$ = "»"
   CharVert$ = "º"
   Char3$ = "È"
   Char4$ = "¼"
 END IF

 COLOR C%, BC%
 A = (XX% - X%) - 1
 LOCATE Y%, X%: PRINT Char1$; STRING$(A, CharHoz$); Char2$
 FOR I = Y% + 1 TO YY% - 1
   LOCATE I, X%: PRINT CharVert$;
   IF Solid% THEN PRINT SPACE$(A);
   LOCATE I, XX%: PRINT CharVert$;
 NEXT I
 LOCATE YY%, X%: PRINT Char3$; STRING$(A, CharHoz$); Char4$;
END SUB
