'===========================================================================
' Subject: 132-COLUMNS TEXT PLASMA            Date: 09-29-98 (13:22)       
'  Author: Anders Olofsson                    Code: QB, QBasic, PDS        
'  Origin: anders.olofsson@mail.bip.net     Packet: TEXT.ABC
'===========================================================================
' Slightly modified "plasma.bas" - 132-column Text Plasma
'
'                                  by Anders Olofsson 1998.
'
'                 e-mail: anders.olofsson@mail.bip.net
'
'  Compile for maximum speed!
'

DEFINT A-Z
DECLARE SUB TxtPalSet (C%, R%, G%, B%)
DECLARE SUB ResetScreen ()
DECLARE SUB Center (Row%, Text$, ForeColour%, BackColour%)
DECLARE SUB pPrint (Row%, col%, S$, ForeColour%, BackColour%)
DECLARE SUB Set132 (Rows%)
DECLARE SUB ClearScreen ()
DECLARE SUB PutScr (Row%, col%, Buffer%(), Scrnum%)
DECLARE SUB GetScr (Row1%, Col1%, Wid%, Hei%, Buffer%(), Scrnum%)

' Change these to suit your needs.
 COMMON SHARED ScreenWid, ScreenHei, ScreenSeg
 ScreenWid = 132: ScreenHei = 43: ScreenSeg = &HB800

 DIM Sine(525) AS INTEGER, Cosine(405) AS INTEGER

  Set132 43
  LOCATE , , 0

NewPattern:
 RANDOMIZE TIMER * TIMER
 
  ClearScreen

  DEF SEG = &HB800
  FOR I = 0 TO ScreenHei * ScreenWid * 2 STEP 2
GetChr: C = RND * 254 + 1
   IF C = 32 OR C = 255 THEN GOTO GetChr ELSE POKE I, C
   POKE I + 1, 0
  NEXT
 
 R1 = RND * 5 + 1: R2 = RND * 5 + 1: R3 = RND * 5 + 1
 FOR C = 0 TO 15
  I = C: TxtPalSet I, C * R1, C * R2, C * R3
  IF RND AND 1 AND C = 6 THEN
   I = C: TxtPalSet I, C * R3, C * R2, C * R1
  END IF
 NEXT

 Rad1! = (4 * ATN(1)) / (50 + RND * 50): Rad2! = (4 * ATN(1)) / (50 + RND * 50)

 FOR x = 0 TO 520: Sine(x) = SIN(Rad1! * x) * 15: NEXT
 FOR x = 0 TO 400: Cosine(x) = COS(Rad2! * x) * 15: NEXT
 Current1 = RND * 200: Current2 = RND * 200

  C1 = RND * 4 + 1: C2 = RND * 4 + 1

DO
Current1 = Current1 + C1: Current2 = Current2 + C2
IF Current1 >= 200 THEN C1 = -C1
IF Current1 <= 0 THEN C1 = RND * 4 + 1: Current1 = 0
IF Current2 >= 200 THEN C2 = -C2
IF Current2 <= 0 THEN C2 = RND * 4 + 1: Current2 = 0

 Memory = 1
 FOR y = 0 TO 42
   x = 0
  FOR tx = 0 TO 131
    x = x + 2
    C = ABS((Sine(x + Current1) + Cosine(y + Current2 \ 2) + Cosine(x \ 2) + Sine(y * 2)) \ 2) \ 2
    IF C <= 0 THEN C = 1
    POKE Memory, C: Memory = Memory + 2
  NEXT
 NEXT

 WAIT &H3DA, 8: WAIT &H3DA, 8, 1

 K$ = INKEY$
 IF K$ = CHR$(13) OR K$ = " " GOTO NewPattern

LOOP UNTIL LEN(K$)

ResetScreen

SUB Center (Row, Text$, ForeColour, BackColour)
pPrint Row, (ScreenWid \ 2) - (LEN(Text$) \ 2), Text$, ForeColour, BackColour
END SUB

SUB ClearScreen
DEF SEG = ScreenSeg
FOR I = 0 TO ScreenHei * ScreenWid * 2
 POKE I, 0
NEXT
END SUB

SUB GetScr (Row1, Col1, Wid, Hei, Buffer%(), Scrnum)
DEF SEG = ScreenSeg
Buffer%(Scrnum, 0) = 256 * Wid + Hei
FOR R = Row1 TO Row1 + Hei - 1
FOR C = Col1 TO Col1 + Wid - 1
  Chrcode = PEEK(((R - 1) * ScreenWid + C - 1) * 2)
  ColrCode = PEEK(((R - 1) * ScreenWid + C - 1) * 2 + 1)
  Counter = Counter + 1
  Buffer%(Scrnum, Counter) = -32768 + 256& * ColrCode + Chrcode
NEXT
NEXT
END SUB

SUB pPrint (Row, col, S$, ForeColour, BackColour)
IF Row > ScreenHei OR Row < 1 OR col > ScreenWid OR col < 1 THEN EXIT SUB
DEF SEG = ScreenSeg: Memloc = ScreenWid * (Row - 1) + (col - 1): Memloc = Memloc + Memloc
FOR T = 0 TO LEN(S$) - 1
 IF col + T > ScreenWid THEN EXIT FOR
 POKE Memloc, ASC(MID$(S$, T + 1, 1))
 POKE Memloc + 1, BackColour * 16 + ForeColour
 Memloc = Memloc + 2
NEXT T
DEF SEG
END SUB

SUB PutScr (Row, col, Buffer%(), Scrnum)
Wid = Buffer%(Scrnum, 0) \ 256: Hei = Buffer%(Scrnum, 0) MOD 128
DEF SEG = ScreenSeg
FOR R = Row TO Row + Hei - 1
FOR C = col TO col + Wid - 1
  Counter = Counter + 1
  IF C <= ScreenWid AND C >= 1 THEN
   Chrcode = Buffer(Scrnum, Counter) MOD 256
   ColrCode = (Buffer(Scrnum, Counter) + 32768) \ 256
   POKE (((R - 1) * ScreenWid + C - 1) * 2), Chrcode
   POKE (((R - 1) * ScreenWid + C - 1) * 2) + 1, ColrCode
  END IF
NEXT
NEXT
END SUB

SUB ResetScreen
asm$ = CHR$(&HB8) + CHR$(3) + CHR$(0)
asm$ = asm$ + CHR$(&HCD) + CHR$(&H10) + CHR$(&HCB)
DEF SEG = VARSEG(asm$): CALL absolute(SADD(asm$))
END SUB

SUB Set132 (Rows)
IF Rows = 43 THEN Vidmode = &H54
IF Rows = 25 THEN Vidmode = &H55
IF Vidmode = 0 THEN EXIT SUB
asm$ = asm$ + CHR$(&HB8) + CHR$(Vidmode) + CHR$(0)
asm$ = asm$ + CHR$(&HCD) + CHR$(&H10) + CHR$(&HCB)
DEF SEG = VARSEG(asm$): CALL absolute(SADD(asm$))
END SUB

SUB TxtPalSet (C, R, G, B)
IF C >= 8 AND C <= 15 THEN C = C + 48 ELSE IF C = 6 THEN C = 20
OUT &H3C8, C: OUT &H3C9, R: OUT &H3C9, G: OUT &H3C9, B
END SUB
