'RASDISP - program to display SOLRAS data

DECLARE SUB Selectfile (ext$, filnam$)
DIM lr%(256), lg%(256), lb%(256), mst(8)

GOSUB Setups
DO
  CLOSE #1
  SCREEN 2
  SCREEN 0, 0, 0
  GOSUB OpenFile
  GOSUB InitDisplay
  IF NOT EOF(1) THEN                    'get initial time record
    rec$ = INPUT$(164, #1)
    GOSUB GetTimeSpec
    minrange% = minr%
    GOSUB TimeAxisLabel
    LOCATE 25, 32
    PRINT hr%;
    GOSUB DisplayRecord
  END IF
  DO
    DO WHILE NOT EOF(1)
      rec$ = INPUT$(164, #1)
      IF rec$ <> "" THEN
        GOSUB GetTimeSpec
        IF minr% <> minrange% THEN EXIT DO
        GOSUB DisplayRecord
      END IF
    LOOP
    DO
      a$ = INKEY$
      IF a$ = esc$ THEN EXIT DO
    LOOP WHILE a$ <> cr$
    IF a$ = esc$ THEN EXIT DO
    minrange% = minr%
    GOSUB TimeAxisLabel
    LOCATE 25, 32
    PRINT hr%;
  LOOP
LOOP
END


Setups: 
 cr$ = CHR$(13)
 esc$ = CHR$(27)
 site$ = "LEARMONTH"
RETURN


GetTimeSpec:
 tms% = CVI(LEFT$(rec$, 2))
 hr% = tms% \ 600
 IF tms% MOD 600 > 299 THEN minr% = 1 ELSE minr% = 0
 min10% = tms% MOD 300
RETURN


TimeAxisLabel:
 IF minrange% = 0 THEN
   COLOR 64
   LOCATE 24, 3
   PRINT "0           10          20          30";
 ELSE
   COLOR 64
   LOCATE 24, 3
   PRINT "30          40          50          60";
 END IF
 COLOR 66
RETURN
     

Palet:
SCREEN 13
GOSUB SRSLUT
'set up palette
RED = 1
GRN = 256
BLU = 65536
YEL = RED + GRN
WHT = RED + GRN + BLU
FOR i% = 0 TO 255
  PALETTE i%, (RED * lr%(i%) + GRN * lg%(i%) + BLU * lb%(i%))
NEXT i%
RETURN


InitDisplay:
GOSUB Palet
LINE (18, 10)-(319, 93), 255, B
LINE (18, 95)-(319, 177), 255, B
th = 0                                  'time ref / determines which 30 mins
FOR i = 19 TO 319 STEP 10               'minute markers
  LINE (i, 178)-(i, 179), 255
NEXT i
FOR i = 19 TO 319 STEP 100               '10 minute markers
  LINE (i, 180)-(i, 183), 255
NEXT i
COLOR 255
LOCATE 7, 1
PRINT "HI";
LOCATE 17, 1
PRINT "LO";
COLOR 50
LOCATE 22, 1
PRINT "50";
LOCATE 13, 1
PRINT "100";
LOCATE 12, 1
PRINT "120";
LOCATE 2, 1
PRINT "220";
LOCATE 1, 2
COLOR 200
PRINT " SOLRAS DISPLAY "; TAB(32); LEFT$(filnam$, 8);
LOCATE 25, 7
COLOR 255
PRINT "Time/Minutes        Hour=    LT";
RETURN


OpenFile:
 CALL Selectfile("SSS", filnam$)
 IF filnam$ = "" THEN END
 OPEN filnam$ FOR BINARY AS #1
RETURN


DisplayRecord:
  it% = min10% + 19
  FOR i% = 3 TO 83
    clr% = ASC(MID$(rec$, i%, 1))
    PSET (it%, 179 - i%), clr%
  NEXT i%
  FOR i% = 84 TO 164
    clr% = ASC(MID$(rec$, i%, 1))
    PSET (it%, 176 - i%), clr%
  NEXT i%
RETURN




SRSLUT:
msl = 255 / ((256 - 4) / 4)
mst(0) = (256 - 4) / 8
mst(1) = (256 - 4) / 8 + (256 - 4) / 16
FOR k = 2 TO 8
  mst(k) = (256 - 4) * k / 8
NEXT k
FOR n = 0 TO 255
    IF n < mst(0) THEN
      lr%(n) = n * msl
      lg%(n) = n * msl
      lb%(n) = n * msl
    END IF
    IF n >= mst(0) AND n < mst(1) THEN
      lr%(n) = 127 - (n - mst(0)) * msl
      lg%(n) = 127 - (n - mst(0)) * msl
      lb%(n) = 127 + (n - mst(0)) * msl
    END IF
    IF n >= mst(1) AND n < mst(2) THEN
      lr%(n) = 64 + (n - mst(1)) * msl
      lg%(n) = 64 + (n - mst(1)) * msl
      lb%(n) = 191 + (n - mst(1)) * msl
    END IF
    IF n >= mst(2) AND n < mst(3) THEN
      lr%(n) = 127 + (n - mst(2)) * msl
      lg%(n) = 127 + (n - mst(2)) * msl
      lb%(n) = 255 - (n - mst(2)) * msl
    END IF
    IF n >= mst(3) AND n < mst(4) THEN
      lr%(n) = 255
      lg%(n) = 255 - (n - mst(3)) * msl
      lb%(n) = 127
    END IF
    IF n >= mst(4) AND n < mst(5) THEN
      lr%(n) = 255 - (n - mst(4)) * msl
      lg%(n) = 127 + (n - mst(4)) * msl
      lb%(n) = 127
    END IF
    IF n >= mst(5) AND n < mst(6) THEN
      lr%(n) = 127 + (n - mst(5)) * msl
      lg%(n) = 255 - (n - mst(5)) * msl
      lb%(n) = 127 + (n - mst(5)) * msl
    END IF
    IF n >= mst(6) AND n < mst(7) THEN
      lr%(n) = 255 - (n - mst(6)) * msl
      lg%(n) = 127 + (n - mst(6)) * msl
      lb%(n) = 255
    END IF
    IF n >= mst(7) AND n < mst(8) THEN
      lr%(n) = 127 + (n - mst(7)) * msl
      lg%(n) = 255
      lb%(n) = 255
    END IF
    IF n >= mst(8) THEN
      lr%(n) = 255
      lg%(n) = 255
      lb%(n) = 255
    END IF
    lr%(n) = lr%(n) \ 4
    lg%(n) = lg%(n) \ 4
    lb%(n) = lb%(n) \ 4
NEXT n

RETURN

SUB Selectfile (ext$, filnam$)
'this routine displays all files in current directory/path with the extension
'ext$.  It then allows selection of one of these files and returns to the
'calling with this filename (including extension) in filnam$. If no files are
'present or if the escape key is pressed then filnam$ is empty
DIM nam$(176)
FOR it = 1 TO 176
  nam$ = ""
NEXT it
filnam$ = ""
cr$ = CHR$(13)
nul$ = ""
esc$ = CHR$(27)
up$ = CHR$(0) + CHR$(72)
dn$ = CHR$(0) + CHR$(80)
lf$ = CHR$(0) + CHR$(75)
rt$ = CHR$(0) + CHR$(77)
nfiles = 0                                      'no. of files found
ovf = 0                                         'less than 176 files found
SCREEN 0, 0, 0
COLOR 1, 7
CLS
LOCATE 3, 1
SHELL "DIR *." + ext$ + " > DIREC.TMP"          'use DIREC.TMP as temp file
OPEN "DIREC.TMP" FOR INPUT AS #4
DO WHILE NOT EOF(4)
  LINE INPUT #4, l$
  IF MID$(l$, 10, 3) = ext$ THEN
    nfiles = nfiles + 1
    IF nfiles > 176 THEN nfiles = 1: ovf = 1
    nam$(nfiles) = " " + LEFT$(l$, 8) + " "
    PRINT nam$(nfiles);
  END IF
LOOP
CLOSE #4
LOCATE 1, 1
PRINT "Solar Radio Spectrograph files available are:"
i = nfiles                              'i is the linear coordinate index
IF nfiles = 0 THEN
  SLEEP 2
  filnam$ = ""
  GOTO SUBEND
END IF
GOSUB Getcoords                         'return x,y coordinates & row r, col c
GOSUB Highlight                         'highlights entry at coords x,y
LOCATE 25, 1
COLOR 14, 1
PRINT "   Use arrows to highlight choice,  <CR> to select,  <ESC> to exit"; TAB(80); " ";
COLOR 1, 7
IF ovf = 1 THEN nfiles = 176
GOSUB Getcoords
xmax = x
ymax = y
DO
  GOSUB Move
  IF mov$ = esc$ THEN filnam$ = nul$: GOTO SUBEND
  IF mov$ = cr$ THEN EXIT DO
  IF mov$ <> nul$ THEN
    GOSUB UnHighlight
    i = newi
    GOSUB Getcoords
    GOSUB Highlight
  END IF
LOOP
filnam$ = nam$(i)
GOTO SUBEND


Move:
  mov$ = INKEY$
  SELECT CASE mov$
    CASE up$
      IF y > 1 THEN y = y - 1 ELSE y = ymax
    CASE dn$
      IF y < ymax THEN y = y + 1 ELSE y = 1
    CASE lf$
      IF x > 1 THEN x = x - 1 ELSE x = 8
    CASE rt$
      IF x < 8 THEN x = x + 1 ELSE x = 1
    CASE nul$, cr$, esc$
      RETURN
    CASE ELSE
      BEEP
  END SELECT
  newi = 8 * y - 8 + x
RETURN



Getcoords:
y = 1
x = i
DO UNTIL x < 9
  x = x - 8
  y = y + 1
LOOP
R = y + 2
c = 10 * x - 9
LOCATE 24, 1
RETURN

Highlight:
COLOR 14, 1
LOCATE R, c
pp$ = nam$(i)
IF pp$ = nul$ THEN PRINT "          ";  ELSE PRINT pp$;
COLOR 1, 7
RETURN

UnHighlight:
COLOR 1, 7
LOCATE R, c
pp$ = nam$(i)
IF pp$ = nul$ THEN PRINT "          ";  ELSE PRINT pp$;
RETURN

SUBEND:
IF filnam$ <> nul$ THEN
  filnam$ = MID$(filnam$, 2, 8) + ".SSS"
END IF
KILL "DIREC.TMP"                        'purge temporary file
END SUB

