!STUVUE.bas- Student VUE
!Author James A. Jarboe IV
!	Educational Filmstrips
!	1401 19th Street
!	Huntsville, TX 77340
!	409-295-5767
!	GR/AM
! Copyright 1986
! for use for AMUS members at no cost
! inspired by a Teacher in NM that has dumb students bright enough to
! yank the bright boy's program into his own program
!
! a program that allows the user to vue a sequential file without
! being able to yank another students programs in 
!
! limitations
! 1. 120 lines of text only ( could be increased if you want to)
! 2. No TAB key to tab over (IE TAB key don't work)
! 3. No Centering of Text
! 4. Cursor down or Cursor up always puts cursor at first column
! 5. No Search 
! 6. No Move
! 7. No Copy
! 8. Not much of anything but text editing 
! 9. only 79 columns of text
!10. ^Z does delete a line but does not squash lines together this is
!    done when the program finishes out (ie. it don't output blank lines)
! advantages
! 1. Will compil program on G
! 2. Will finish program on F
! 3. Will Quit program on Q
! 4. Will give nasty message on Y
! 5. most control chars work like VUE 
!    All proper respect and homage is now given to VUE, it's
!    authors, publishers, dealers, and users
!
! The program starts here:

MAP1 LINES(120),S,79			! 120 lines of text
MAP1 ST'LINES(120),S,79			! storage for a ^B move
MAP1 CRT				! all the fancy stuff for STUVUE.SBR
 	MAP2 ROW,S,2			! row we are on
	MAP2 FIL1,S,1," "		! filler
	MAP2 COL,S,2			! column ( always 1)
	MAP2 FIL2,S,1," "		! 
	MAP2 TYPE,S,1,"*"		! string data as per STUVUE.SBR
	MAP2 FIL3,S,1," "		! 
	MAP2 MINS,S,2,"00"		! minimum length
	MAP2 FIL4,S,1," "		! 
	MAP2 MAXS,S,2,"79"		! Maximum length
	MAP2 FIL5,S,1," "
	MAP2 FLAG,S,2,"AT"		! Auto field and trap ^C
	MAP2 FIL6,S,1," "		! 
MAP1 PLINE,S,79				! DATA string
MAP1 KEY,B,2				! key to what ^ char was hit
MAP1 EXT,S,4,".BAS"			! BASIC file extension
MAP1 MAXO,F,6,120			! number of lines of text

VUE:					! 
	INPUT "",FILE$			! get infor from STUVUE.DO
	DOT=INSTR(1,FILE$,".")		! look for dot on extension
	IF DOT>0 THEN GOTO GOTEXT	! we got dot
	FILE$=FILE$+EXT			! no dot then give ext
	
GOTEXT:
	LOOKUP FILE$,ANSWER		! look see if file is there
	IF ANSWER<0 THEN GOTO MISMAT	! random file is a nono
	IF ANSWER=0 THEN CALL MAKEIT	! no sequential file ..make it
OPENIT:
	R=1				! row =1
	OPEN #1,FILE$,INPUT		! open the file as input
	FOR I=1 TO MAXO			! 1 to number of lines
	PLINE=""			! nothing
	INPUT LINE #1,PLINE		! get the line	
	IF EOF(1)=1 THEN LST'LINE=I :I = MAXO:GOTO NOMO  ! end of file
	IF INSTR(1,PLINE,CHR$(9)) THEN CALL CLEAN  ! clear TABS	
	LINES(I)=PLINE			! data to memory storage
NOMO:
	NEXT I				! do it again
	CLOSE #1			! close the file
BEGIN:
	? TAB(-1,0);			! clear screen
	ROW="01"			! row=1
	COL="01"			! column = 1
	SCR=0				! first screen (1st 24 lines)
	FOR I=1 TO 24
	? TAB(I,1);LINES(I);		! print em
	NEXT I

TOP:
 	IF R<1 THEN CALL OLD'SCR	! previous screen
 	IF R>24 THEN CALL NEW'SCR	! next screen
	ROW=R USING "#Z"		! make right row a string
	PLINE=LINES(R+SCR)		! give STUVUE.sbr the string 
	XCALL STUVUE,""+CRT+" ",PLINE,KEY	
	IF KEY=1 THEN GOTO ESCAPE	! escape key hit
	LINES(R+SCR)=PLINE		! data back to memory
	IF R+SCR>LST'LINE THEN LST'LINE=R+SCR ! number of last line
	IF KEY=2 THEN R=R-1		! up arrow
	IF KEY=3 THEN R=R+1		! down arrow
	IF KEY=0 THEN R=R+1		! carriage return
	IF KEY=6 THEN R=1:CALL OLD'SCR	! previous page
	IF KEY=5 THEN R=1:CALL NEW'SCR	! next page
	IF KEY=7 THEN CALL NEWLIN	! control B
	IF KEY=8 THEN CALL END'OF	! control E
	IF KEY=9 THEN GOTO BEGIN	! control ^^ or home key
	GOTO TOP			! lets do it again

ESCAPE:					! escape key module
	? TAB(-1,0);
	? TAB(1,1);"StudentVUE 1.0A Status: NoYank"
	? TAB(3,1);"Editing "FILE$
	? TAB(5,1);">"
	ROW="05"
	COL="02"
	PLINE=""	
	XCALL STUVUE,""+CRT+" ",PLINE,KEY
	IF UCS(PLINE)[1,1]="F" THEN GOTO FINISH
	IF UCS(PLINE)[1,1]="Q" THEN GOTO QUIT
	IF UCS(PLINE)[1,1]="G" THEN GOTO FINISH
	IF KEY=1 THEN GOTO BEGIN
	IF PLINE[1,1]="Y" THEN CALL NO'YANK
	GOTO ESCAPE
FINISH:
	KILL FILE$			! erase the file
	OPEN #1,FILE$,OUTPUT		! make a new one same name
	FOR I=1 TO MAXO			! 
	IF LINES(I)="" THEN GOTO NXI	! dont print nothing to the file
	? ".";				! make user think we doing something
	? #1,LINES(I)			! print data to file
NXI:
	NEXT I				! do it again
	CLOSE #1			! close it
	IF UCS(PLINE[1,1])="F" GOTO QUIT! is this a finish or a Go
	OPEN #1,"STUVUE.CMD",OUTPUT	! Its a Go !!
	? #1,":R"			! command file revive
	? #1,":<"			! 
	? #1,">"			! 
	? #1,"COMPIL "FILE$		! compil it
	? #1,":S"			! Silence Shhhh!
	? #1,"ERASE STUVUE.CMD"		! erase the command file
	? #1,":R"			! back to AMOS
	CLOSE #1			! close the command file
	CHAIN "STUVUE.CMD"		! do it
QUIT:
	?				! print a line
	END				! ththththat's all FOLKS !

NEW'SCR:
        R=1:SCR=SCR+24			! Screen gets add 24 lines
	IF SCR>MAXO-24 THEN SCR=SCR-24	! no more than Maximum lines	
	? TAB(-1,0);			! clear
	FOR I=1 TO 24			! 
	? TAB(I,1);LINES(I+SCR);	! print new lines
	NEXT I				! 
	RETURN				! go back to where we wus

OLD'SCR:
	? TAB(-1,0);			! clear
	R=1:SCR=SCR-24			! previous 24 lines
	IF SCR<0 THEN SCR=0		! make sure no less thatn 1st 24 
	FOR I=1 TO 24
	? TAB(I,1);LINES(I+SCR);	! print em
	NEXT I				! 
	RETURN				! go back..go back

MAKEIT:
	? FILE$;" does not exist. Do you wish to create it? ";
	INPUT "",YN			! well !
	IF UCS(YN)="N" THEN GOTO QUIT	! ok then quit
	PLINE="***"			! make file look like MODEM
	OPEN #1,FILE$,OUTPUT		! open it
!	FOR I=1 TO MAXO			! 1 to maximum lines
	? #1,PLINE			! print stars
!	NEXT I				! 
	CLOSE #1			! close me
	RETURN				! to whence we came
MISMAT:
	? FILE$;" is a random file" 	! dummy
	END
CLEAN:
	TB=INSTR(1,PLINE,CHR$(9))	! oh boy a tab
	IF TB=0 RETURN			! oh better .. no tab
	IF TB=1 AND LEN(PLINE)<2 THEN PLINE=" ":RETURN
	IF TB=1 THEN PLINE="        "+PLINE[TB+1,LEN(PLINE)]:GOTO CLEAN	
	PLINE=PLINE[1,TB-1]+"        "+PLINE[TB+1,LEN(PLINE)]
	GOTO CLEAN			! look for another
	RETURN				! get back jack

NO'YANK:
	ON ERROR GOTO BACK		! in case the little devil tries
	?				! a control C
	? "     AMOS Rule #1"
	? "     Thou Shalt not Yank Another's Program"
	? "     And Claim it As Your Own Work        "
	FOR I=1 TO 1000
	FOR A=1 TO 50	
	NEXT A
	? CHR$(7);			! yell it baby
	NEXT I
	RETURN
BACK:
	RESUME BA			! 
BA:
	RETURN	
NEWLIN:
	FOR NL=R+SCR TO MAXO-1		! fancy switch for ^B
	ST'LINES(NL)=LINES(NL)		! storage gets current
	NEXT NL	
	LINES(R+SCR)=""			! ^B line is blank
	FOR NL=R+SCR TO MAXO-1
	LINES(NL+1)=ST'LINES(NL)	! line ahead gets storage behind
	NEXT NL
	? TAB(R,1);SPACE$(79);		! print the newline
	FOR NL=R TO 24
	LONG=LEN(LINES(NL+SCR+1))-LEN(LINES(NL+SCR))	
	IF LONG<0 THEN LONG=1
	? TAB(NL,1);LINES(NL+SCR);SPACE$(LONG);
	NEXT NL
	RETURN
END'OF:
	SCR=0				! screen = 1st one
	FOR I=1 TO 5			! add 24 to 24 until greater
	IF LST'LINE>SCR+24 THEN SCR=SCR+24 ! than last line of file
	NEXT I				! 
	? TAB(-1,0);			! clear screen
	FOR R=1 TO 24			! print last screen
	? TAB(R,1);LINES(R+SCR);
	NEXT R
	R=LST'LINE-SCR			! cursor at last line
	RETURN