	REMARK	*****************************************\
		*  CRTFM.BAS  CRT MASK FILE MAINTENANCE *\
		*    7/31/79                 1:20 PM    *\
		*****************************************


%INCLUDE CURSOR

	REMARK  **  SPECIAL CHARACTERS FOR CRT POSITIONING DEFINED HERE ** \
		  THE CODES BELOW ARE NOT CURSOR CONTROL CHARACTERS.  THEY \
		  ARE EQUATE STATEMENTS FOR KEYBOARD ENTRIES, WHICH IN TURN\
		  TRIGGER CURSOR MOVEMENT(CONTROLLED BY CURSOR.BAS).       


		   UP.CRSR%=15H	REMARK  CONTROL-U
		 DOWN.CRSR%=04H	REMARK  CONTROL-D
		 HOME.CRSR%=14H	REMARK  CONTROL-T
		 LEFT.CRSR%=08H	REMARK  CONTROL-H
		RIGHT.CRSR%=12H	REMARK  CONTROL-R
	            CTRL.I%=09H	REMARK  CONTROL-I
		    ESCAPE%=1BH	REMARK  ESCAPE KEY


	REMARK  CRT DIMENSIONS AND MASK RECORD LENGTH DEFINED HERE

		VERTICAL.LINES%=16
		     CRT.WIDTH%=64
		   MASK.LENGTH%=1100
	DIM CRTMASK$(VERTICAL.LINES%),SCRATCH$(VERTICAL.LINES%)


	REMARK	***************************************************\
		*  IN ORDER TO CHANGE THIS PROGRAM FOR A CRT WITH *\
		*  OTHER X-Y DIMENSIONS, YOU MUST ALSO CHANGE THE *\
		*  MASK FILE ACCESS ROUTINES IN 1000 AND 1200.ADD *\
		*  OR DECREASE THE NUMBER OF CRT MASK LINES TO BE *\
		*  READ FROM OR WRITTEN TO THE FILE AS NEEDED.    *\
		***************************************************

	BLANK$=CHR$(20H)
	FOR I%=1 TO 7:BLANK$=BLANK$+BLANK$:NEXT I%
	REMARK  SET UP BLANK FILLER SPACE (128 SPACES HERE)

	GOTO 6000
%INCLUDE SUBS1

1000	REMARK  **********  READ CRT MASK FILE RECORD  **********

	READ #1,MASK%; CRTMASK$(1),CRTMASK$(2),CRTMASK$(3),CRTMASK$(4),\
	CRTMASK$(5),CRTMASK$(6),CRTMASK$(7),CRTMASK$(8),CRTMASK$(9),\
	CRTMASK$(10),CRTMASK$(11),CRTMASK$(12),CRTMASK$(13),CRTMASK$(14),\
	CRTMASK$(15),CRTMASK$(16)

		FOR I%=1 TO VERTICAL.LINES%
		SCRATCH$(I%)=CRTMASK$(I%)
	REMARK  SAVE CRT MASK ELEMENTS IN SCRATCH ARRAY

		NEXT I%
		RETURN

1200	REMARK	**********  SAVE CRT MASK FILE RECORD  **********

	PRINT #1,MASK%; CRTMASK$(1),CRTMASK$(2),CRTMASK$(3),CRTMASK$(4),\
	CRTMASK$(5),CRTMASK$(6),CRTMASK$(7),CRTMASK$(8),CRTMASK$(9),\
	CRTMASK$(10),CRTMASK$(11),CRTMASK$(12),CRTMASK$(13),CRTMASK$(14),\
	CRTMASK$(15),CRTMASK$(16)
	
	IF NEW.RECORD%=YES% THEN NEW.RECORD%=0:\
	CLOSE 1:OPEN FILENAME$ RECL MASK.LENGTH% AS 1

	RETURN

2100 REMARK +++++++++++++++++CURSOR POSITIONING SUBROUTINE++++++++++++++++++
	CONSOLE

	LINEFEEDS%= INT(X1/CRT.WIDTH%)+96	REMARK  CALCULATE ROW
	HORIZONTAL%=X1- (LINEFEEDS% * CRT.WIDTH%) REMARK  CALCULATE COLUMN

	IF HORIZONTAL% < 31 THEN HORIZONTAL%=HORIZONTAL%+96
	REMARK  ADD SPECIAL OFFSET WHERE 0<= X <= 31

	CHAR%=LEAD.IN%:GOSUB 801
	REMARK  SEND LEAD-IN CODE

	CHAR%=CURS.ADDR%:GOSUB 801
	REMARK  SEND CURSOR ADDRESS CODE

	CHAR%=HORIZONTAL%:GOSUB 801
	REMARK  SEND X-COORDINATE

	CHAR%=LINEFEEDS%:GOSUB 801
	REMARK  SEND Y-COORDINATE

	RETURN

6000	PRINT CLEAR.SCREEN$
	X2$="ENTER NAME OF FILE":X2=13:X3=0:X4=0
	GOSUB 665	REMARK  ENTER CRT MASK FILENAME
	IF END #1 THEN 6000	REMARK  REJECT INVALID FILENAME
	FILENAME$=X0$
	OPEN FILENAME$ RECL MASK.LENGTH% AS 1	REMARK  OPEN CRT MASK FILE
	PRINT "WORKING...DO NOT INTERRUPT"


	RECS%=0
	IF END #1 THEN 6007

	FOR F%=10 TO 1 STEP -1
	READ #1,(2^F%)+RECS%; X$
	RECS%=RECS% + 2^F%
6007	NEXT F%


	EXTENT%=RECS%
	
6010	PRINT CLEAR.SCREEN$;"CRT MASK FILE MAINTENANCE"	
	REMARK  PRINT PRORAM ID

	PRINT
	PRINT
	PRINT
	PRINT "(0) END"
	PRINT "(1) INQUIRE"
	PRINT "(2) CHANGE-ADD-REPLACE"
	PRINT "(3) PRINT"

	X2=1:X3=0:X4=3:X2$="ENTER OPERATION CODE":GOSUB 665
	REMARK  ENTER OPERATION CODE

	IF X0=0 THEN\
	PRINT CLEAR.SCREEN$;"CRTFM EXITING":STOP
	REMARK  RETURN TO O/S IF OPERATION IS ZERO

	F%=X0

	WHILE F%=1	REMARK  CRT MASK FILE INQUIRY ROUTINE
6021		PRINT CLEAR.SCREEN$;"MASK FILE INQUIRY"
		X2=3:X3=0:X4=999:X2$="ENTER FIRST MASK NUMBER"
		GOSUB 665	REMARK  ENTER FIRST MASK NUMBER TO DISPLAY
		IF X0=0 THEN F%=0:GOTO 6050
	REMARK  IF ZERO, EXIT TO OPERATION CODE PROMPT

		IF X0>EXTENT% THEN GOTO 6021
		MASK%=X0
6030		GOSUB 1000	REMARK  READ CRT MASK FROM DISK

		PRINT CLEAR.SCREEN$;
		FOR I%=1 TO VERTICAL.LINES%
		PRINT CRTMASK$(I%)	REMARK  DISPLAY CRT MASK
		NEXT I%

6035		IF CONSTAT%=0 THEN GOTO 6035 ELSE A%=CONCHAR%
	REMARK  WAIT FOR OPERATOR ENTRY

		IF A%=ASC("E") THEN F%=0:GOTO 6050
	REMARK  IF "E" WAS ENTERED, TERMINATE ROUTINE

		IF A% <> 0DH THEN GOTO 6035
	REMARK  WAIT FOR <RETURN> BEFORE CONTINUING

		MASK%=MASK% + 1
		IF MASK% > EXTENT% THEN F%=0:GOTO 6050
		GOTO 6030
	REMARK  GET NEXT CRT MASK

6050	WEND	REMARK  END OF INQUIRY ROUTINE


	WHILE F%=2
	REMARK  ROUTINE TO CHANGE, ADD OR REPLACE CRT MASK ON FILE 

		PRINT CLEAR.SCREEN$;"CRT MASK FILE CHANGE-ADD-REPLACE"
	REMARK  IDENTIFY ROUTINE ON CRT

		ROW%=0:COL%=0
		X2$="ENTER MASK NUMBER TO CHANGE (OR 'NEW')"
		X2=3:X3=0:X4=0:GOSUB 665
	REMARK  ENTER MASK NUMBER

		IF X0$="NEW"\
		THEN EXTENT%=EXTENT%+1:\
		MASK%=EXTENT%:\
		NEW.RECORD%=YES%:\
		FOR I%=1 TO VERTICAL.LINES%:\
		CRTMASK$(I%)=LEFT$(BLANK$,CRT.WIDTH%):\
		NEXT I%:\
		PRINT CLEAR.SCREEN$:GOTO 6130


		IF  MATCH("!",X0$,1) > 0 THEN GOTO 6150
	REMARK  RE-PROMPT IF INCORRECT ENTRY

		MASK%=VAL(X0$)
	REMARK  CONVERT ALPHA ENTRY TO MASK NUMBER

		IF MASK%=0 THEN F%=0:GOTO 6150
	REMARK  IF ZERO WAS ENTERED, GET OUT OF ROUTINE

		IF MASK% > EXTENT% THEN GOTO 6150

		PRINT CLEAR.SCREEN$
		X2$="LINE OR COMPOUND POSITION TO START CHANGES"
		X2=4
		X3=0:X4=(CRT.WIDTH%*VERTICAL.LINES%)-1
		GOSUB 665
	REMARK  ENTER SCREEN POSITION

		ADDR%=X0

	REMARK  IF ADDRESS WAS ENTERED, SET SCREEN LOCATION
		IF ADDR% > 15 THEN ROW%=(ADDR% / CRT.WIDTH%):\
		COL%=ADDR% - (ROW% * CRT.WIDTH%):\
		X1=ADDR% \
		ELSE\
		ROW%=ADDR%:\
		X2=2:X3=0:X4=CRT.WIDTH%-1:\
		X2$="COLUMN TO START CHANGES":\
		GOSUB 665:\		REMARK  ENTER X-COORD FOR CHANGES
		COL%=X0:\
		X1=(ROW% * CRT.WIDTH%) + COL%

6125		GOSUB 1000	REMARK  READ CRT MASK FROM FILE
		PRINT CLEAR.SCREEN$;
		FOR I%=1 TO VERTICAL.LINES%
		PRINT CRTMASK$(I%)	REMARK  DISPLAY THE MASK BEING CHANGED
		NEXT I%
		GOSUB 2100	REMARK  POSITION THE CURSOR TO CHANGE POINT
6130		IF CONSTAT%=0 THEN GOTO 6130 
		A%=CONCHAR%	REMARK  ACCEPT CHARACTER FROM KEYBOARD

		IF A% >= 20H AND A% <= 7EH THEN GOTO 6140
	REMARK  IF ENTRY WAS VALID ASCII, THEN PROCESS IT

		IF A%=UP.CRSR%  AND ROW% > 0\
		THEN CHAR%=LEAD.IN%:GOSUB 801:\	REMARK  MOVE CURSOR UP IF CONTROL-U PRESSED
		CHAR%=UP.CURSOR%:GOSUB 801:\
		ROW%=ROW%-1:GOTO 6130

		IF A%=DOWN.CRSR% AND ROW% < VERTICAL.LINES%-1\
		THEN\
		CHAR%=LEAD.IN%:GOSUB 801:\
		CHAR%=DOWN.CURSOR%:GOSUB 801:\				REMARK  PRINT DOWN-CURSOR IF CTRL-D
		ROW%=ROW%+1:\
		GOTO 6130

		IF A%=LEFT.CRSR% AND COL% > 0 THEN\
		CHAR%=BACKSPACE%:\					REMARK  MOVE CURSOR LEFT IF BACKSPACE WAS DEPRESSED
		GOSUB 801:\
		COL%=COL% - 1:\
		GOTO 6130

		IF A% = RIGHT.CRSR% AND COL% < CRT.WIDTH%-1\		REMARK  IF CTRL-R WAS DEPRESSED, MOVE CURSOR RIGHT
		THEN\		
		CHAR%=RIGHT.CURSOR%:GOSUB 801:\
		COL%=COL%+1:\
		GOTO 6130

		IF A% = 0DH AND ROW% >= VERTICAL.LINES% -1 THEN\	REMARK  SAVE THE MASK IF DONE WITH CHANGES
		GOSUB 1200:F%=0:GOTO 6150				REMARK  THEN PROMPT FOR OPERATION CODE
		IF A% = 0DH THEN\
		ROW%=ROW% + 1:\
		CHAR%=0DH:GOSUB 801:CHAR%=0AH:GOSUB 801:\		REMARK  IF CARRIAGE RETURN, MOVE CURSOR TO NEW LINE
		COL%=0:\
		GOTO 6130

		IF A% = HOME.CRSR% THEN CHAR%=LEAD.IN%:\		REMARK  SEND CURSOR HOME AND RESET X-Y COORDINATES
		GOSUB 801:\
		CHAR%=CURSOR.HOME%:GOSUB 801:\
		ROW%=0:\
		COL%=0:\
		GOTO 6130

		IF A% = CTRL.I% THEN \					REMARK  IF TAB CHARACTER WAS HIT, IGNORE CHANGES AND
		PRINT CLEAR.SCREEN$;:\					REMARK  RE-DISPLAY MASK FOR ANOTHER CHANGE ATTEMPT
		FOR I%=1 TO 16:\
		CRTMASK$(I%)=SCRATCH$(I%):\
		PRINT CRTMASK$(I%):\
		NEXT I%:\
		ROW%=0:COL%=0:\
		X1=0:GOSUB 2100
		GOTO 6130


6140		IF A% < 20H OR A% > 7AH THEN GOTO 6130
		IF COL% > CRT.WIDTH%-1 THEN\				REMARK  ACCEPT VALID ASCII CHARACTER ENTRY
		CHAR%=BACKSPACE%:GOSUB 801:\
		CHAR%=20H:GOSUB 801:\					REMARK  REJECT ENTRIES PAST X-AXIS BOUNDARY
		CHAR%=BACKSPACE%:GOSUB 801:\
		GOTO 6130
		D%=COL%+2
		IF COL% < 1 THEN\
		CRTMASK$(ROW%+1)=CHR$(A%)+MID$(CRTMASK$(ROW%+1),2,CRT.WIDTH%)\
		ELSE\
		CRTMASK$(ROW%+1)=LEFT$(CRTMASK$(ROW%+1),COL%)\
		+CHR$(A%)+MID$(CRTMASK$(ROW%+1),D%,CRT.WIDTH%)
		COL%=COL%+1
		GOTO 6130
6150	WEND

	WHILE F%=3
		CONSOLE
		PRINT CLEAR.SCREEN$;"CRT MASK FILE PRINT"
		X2$="ENTER FIRST MASK NUMBER (0 IF NONE)"
		X2=3:X3=0:X4=999:GOSUB 665				REMARK  ENTER FIRST MASK TO PRINT
		IF X0=0 THEN F%=0:GOTO 6200				REMARK  EXIT ROUTINE IF ZERO WAS ENTERED
		FIRST%=X0
		X3=FIRST%
		X2$="ENTER LAST MASK NUMBER"
		GOSUB 665						REMARK  ENTER LAST MASK TO PRINT
		LAST%=X0
		IF LAST% > EXTENT% THEN LAST% = EXTENT%
		IF FIRST% > EXTENT% THEN GOTO 6200
		LPRINTER
		MASK%=FIRST%

		WHILE MASK% <= LAST%
			IF CONSTAT% <> 0 THEN\
			MASK%=LAST%+1:GOTO 6180
			GOSUB 1000						REMARK  READ MASK FROM FILE
			PRINT CHR$(0CH)						REMARK  PRINT FORM FEED
			FOR I%=1 TO VERTICAL.LINES%
			PRINT CRTMASK$(I%)					REMARK  PRINT CRT MASK ON PRINTER
			NEXT I%
			MASK%=MASK%+1
6180		WEND

6200	WEND
		GOTO 6010
