!!! Starburst in ACTION!

{{{
MODULE 

; Starburst 1.0 By Dan Rhea
   
; Modified from my Micrsoft Basic
; version 7/85

DEFINE YES="1",  ; Define logical flags
       NO ="0"

CARD tc01,       ; Scratch Card 1

     console=[53279], ; Console Keys
     option =[3],     ; OPTION
     select =[5],     ; SELECT
     start  =[6],     ; START
     lmargin=[82],    ; left margin
     cursor =[752],   ; cursor control
     attract=[77]     ; attract mode

INT  ARRAY x(8), ; 8 possible x coordinates
           y(8)  ; 8 possible y coordinates

CARD xaxis       ; X axis for ploting
BYTE yaxis       ; Y axis for ploting

BYTE xmax=[48],  ; Maximum x coordinate
     ymax=[48],  ; Maximum y coordinate
     xtot=[95],  ; Reflected maximum for xmax
     ytot=[95],  ; Reflected maximum for ymax
     bias=[32],  ; X coordinate offset from 0 (centers output)
     lcol=[0],   ; last color selected
     mseg=[50],  ; Maximum segment length (75 with 50 default)
     adjx,       ; X coordinate adjustment
     adjy,       ; Y coordinate adjustment
     dirc,       ; Direction of plot travel (1 to 8)
     colr,       ; Color of segment (1 to 3)
     segl,       ; Length of segment (1 to mseg)
     move,       ; movement counter
     spot,       ; plot counter/pointer
     wrap=[YES], ; Wraparound flag
     glue=[YES], ; Connected segments flag
     tb01,       ; Scratch byte 1
     voic,       ; Voice
     pitc,       ; Pitch
     dist,       ; Distortion
     volu,       ; Volume
     ckey        ; Console key

CHAR ansr        ; Prompt answer

PROC Intro ()
                           
; Introduction to Starburst

   PrintE ("}")
   Graphics (18)

   Position (0,1) 
   PrintDE (6," OoOoOoOoOoOoOoOoO")
   PrintDE (6," o               o")
   PrintDE (6," O StArBuRsT 1.0 O")
   PrintDE (6," o               o")
   PrintDE (6," O  BY DAN rhea  O")
   PrintDE (6," o               o")
   PrintDE (6," OoOoOoOoOoOoOoOoO")
   Position (0,10) 
   PrintDE (6,"   PRESS [start]")

   DO
      FOR tc01=0 TO 3 ; Register select
      DO
         tb01=tc01
         colr=Rand(16) 
         SetColor(tb01,colr,6)
      OD
      ckey=Peek(console)
      IF ckey <> start THEN
         FOR tc01=0 TO 10000 ; Delay
         DO
            ; Tarry a bit
         OD
      FI
   UNTIL ckey = start
   OD

RETURN

PROC Setup ()

; Set up drawing parameters

   Graphics (0)
   SndRst ()
   Poke (lmargin,1)
   PrintE ("-") 
   PrintE ("--------------------------------------")
   PrintE ("|                                    |")
   PrintE ("| Starburst 1.0 By Dan Rhea 07/15/85 |")
   PrintE ("|                                    |")
   PrintE ("--------------------------------------")
   PrintE ("--------------------------------------")
   PrintE ("|This program will produce geometric |")
   PrintE ("|patterns in Graphics Mode 7 using an|")
   PrintE ("|8 way reflection algorithm. You can |")
   PrintE ("|modify the type of patterns that are|")
   PrintE ("|generated by altering the following:|")
   PrintE ("|                                    |")
   PrintE ("| 1. Wraparound (line wrap or not)   |")
   PrintE ("| 2. Connected Lines (does the next  |")
   PrintE ("|    line start where the last one   |")
   PrintE ("|    completed)                      |")
   PrintE ("| 3. Extent (Maximum line length in a|")
   PrintE ("|    random direction)               |")
   PrintE ("--------------------------------------")

   Poke (cursor,1) ; Cursor off

; Determine if wraparound is wanted

   DO
      Position (1,20)
      PrintE ("--------------------------------------")
      PrintE ("|Wraparound Enable? (Y/N) :          |")
      PrintE ("--------------------------------------")
      Position (28,21)
      ansr=GetD(7)      
      IF ansr = 'Y OR ansr = 'y THEN
         wrap = YES 
         tb01 = YES
      ELSEIF ansr = 'N OR ansr = 'n THEN
         wrap = NO
         tb01 = YES
      ELSE
         tb01 = NO
      FI
   UNTIL tb01 = YES
   OD

; Determine if connected lines are wanted

   DO
      Position (1,20)
      PrintE ("--------------------------------------")
      PrintE ("|Connected lines required? (Y/N) :   |")
      PrintE ("--------------------------------------")
      Position (35,21)
      ansr=GetD(7)      
      IF ansr = 'Y OR ansr = 'y THEN
         glue = YES 
         tb01 = YES
      ELSEIF ansr = 'N OR ansr = 'n THEN
         glue = NO
         tb01 = YES
      ELSE
         tb01 = NO
      FI
   UNTIL tb01 = YES
   OD

; Determine maximum line segment extent

   DO
      Position (1,20)
      PrintE ("--------------------------------------")
      PrintE ("|Maximum segment length (1-75) :     |")
      PrintE ("--------------------------------------")
      Position (33,21)
      mseg=InputB()     
      IF mseg < 1 THEN
         tb01 = NO
      ELSEIF mseg > 75 THEN
         tb01 = NO
      ELSE
         tb01 = YES
      FI
   UNTIL tb01 = YES
   OD

; Give the user operating instructions during the draw mode

   Position (1,20)
   PrintE ("")
   PrintE ("|START:Draw OPTION:Menu SELECT:Freeze|")
   PrintE ("")
   DO               
      ckey=Peek(console)
   UNTIL ckey = start
   OD            
   DO
      ckey=Peek(console)
   UNTIL ckey <> start
   OD

   Poke (cursor,0) ; Restore cursor

RETURN                         

PROC Getxy ()
 
; Set random X Y starting coordinates

   x(1)=Rand(xmax) ; 0 to xmax-1
   y(1)=Rand(ymax) ; 0 to ymax-1

RETURN

PROC Docld ()

; Set Color, Length and Direction

   dirc=Rand(8)      ; 0 to 7 
   DO
      colr=Rand(4)   ; 0 to 3
   UNTIL colr <> lcol
   OD
   lcol=colr
   segl=Rand(mseg)+1 ; 1 to mseg

RETURN

PROC Clamp ()

; Clamp the line or wrap it around as needed

   IF wrap = YES THEN
      IF x(1) < 0 THEN
         adjx = xmax-1
      ELSEIF x(1) >= xmax THEN
         adjx = 0
      ELSE
         adjx = x(1)
      FI
      x(1) = adjx
      IF y(1) < 0 THEN
         adjy = ymax-1
      ELSEIF y(1) >= ymax THEN
         adjy = 0
      ELSE
         adjy = y(1)
      FI
      y(1) = adjy
   ELSE
      IF x(1) < 0 THEN
         adjx = 0      
      ELSEIF x(1) >= xmax THEN
         adjx = xmax-1
      ELSE
         adjx = x(1)
      FI
      x(1) = adjx
      IF y(1) < 0 THEN
         adjy = 0
      ELSEIF y(1) >= ymax THEN
         adjy = ymax-1
      ELSE
         adjy = y(1)
      FI
      y(1) = adjy
   FI

RETURN

PROC Flect ()

; DO 8 way reflection

   x(2) = xtot-x(1)
   x(3) = x(2)
   x(4) = x(1)
   x(5) = y(1)
   x(6) = xtot-x(5)
   x(7) = x(6)
   x(8) = x(5)
   y(2) = y(1)
   y(3) = ytot-y(1)
   y(4) = y(3)
   y(5) = x(1)
   y(6) = y(5)
   y(7) = ytot-y(6)
   y(8) = y(7)

RETURN 

PROC Paint ()

; Draw the sucker

   FOR spot = 1 TO 8
   DO
      xaxis=x(spot)+bias
      yaxis=y(spot)
      Plot (xaxis,yaxis)
   OD
 
RETURN

PROC Slide ()

; Move the guy in cell 1 in the desired direction

   IF dirc = 0 THEN
      x(1)==+1
   ELSEIF dirc = 1 THEN
      x(1)==+1
      y(1)==+1
   ELSEIF dirc = 2 THEN
      y(1)==+1
   ELSEIF dirc = 3 THEN
      x(1)==-1
      y(1)==+1
   ELSEIF dirc = 4 THEN
      x(1)==-1
   ELSEIF dirc = 5 THEN
      x(1)==-1
      y(1)==-1
   ELSEIF dirc = 6 THEN
      y(1)==-1
   ELSEIF dirc = 7 THEN
      x(1)==+1
      y(1)==-1
   ELSE
      ; Do Nothin Meng'
   FI

RETURN

PROC Noise ()
 
; Use screen data for sound

   BYTE base=[63]

   voic = colr
   pitc = x(1)+(colr*base)
   volu = y(1)/4
   dist = 10

   Sound(voic,pitc,dist,volu)

RETURN

PROC Main ()

   Intro ()

   DO
      Setup ()
      Getxy ()
      Graphics (23)
      DO
         Poke(attract,0)
         Docld ()
         color=colr  
         FOR move = 1 TO segl
         DO
            Clamp () ; Wrap/Nowrap
            Flect () ; Reflect   
            Paint () ; Plot all 8
            Noise () ; Make some
            Slide () ; Move # 1
         OD
         IF glue = NO THEN
            Getxy ()
         FI
         ckey = Peek(console)
         IF ckey = select THEN
            DO 
               ckey = Peek(console)
            UNTIL ckey <> select
            OD
         FI
         IF ckey = start THEN
            DO
               ckey = Peek(console)
            UNTIL ckey <> start
            OD
            Graphics(23)
         FI
      UNTIL ckey = option
      OD
   OD

RETURN

}}}