REM	JOURNAL.BAS FIRST APPEARED IN THE FEBRUARY 1979 ISSUE
REM	OF KILOBAUD MAGAZINE...REQUIRES BASIC-E, CBASIC, OR CBASIC-2 FOR
REM	USE.  SEE THAT ISSUE OF KILOBAUD FOR INSTRUCTIONS.
REM
REM	COMPUTER JOURNAL RESOURCE LIBRARY
REM
REM		MAIN PROGRAM
REM
REM	     WRITTEN IN BASIC-E
REM
REM
REM
REM		NOV 26,1979
REM

	PRINT.LINE=1		:REM SAY PRNTR ON FIRST LINE
	LINES.PER.PAGE=66	:REM NAME SAYS IT ALL
	CLEAR.SCREEN=12		:REM DEF SCRN CLR CHAR.
	KEYBOARD.STAT.PORT=94	:REM DEFINE KBD STATUS PORT
	KBDMASK=128		:REM KEYBOARD BIT MASK
	KBD.TRUE=0		:REM ACTIVE LO
	KEYBOARD.DATA.PORT=92	:REM DEFINE KBD DATA PORT
	MAX.ENTRY=500		:REM DEFINE MAX LIB SIZE
	MAX.KEYS=8		:REM DEFINE MAX # KEYS/ENTRY
	EOF$=CHR$(26)		:REM DEFINE END OF FIL CHAR

	DIM INDEX$(MAX.ENTRY),MONTH$(12),KEY$(185),JOURNAL$(10)
	DIM CODE$(7),K$(MAX.KEYS),SPOOL(MAX.ENTRY)


	GOSUB 800	:REM SIGN-ON MESSAGE
	PRINT TAB(24);"Please Stand By . . . .":PRINT:PRINT

REM	READ NECESSARY INFORMATION FROM DATA STATEMENTS

	FOR I=1 TO 100
		READ JOURNAL$(I)
		IF JOURNAL$(I)="0" THEN 10
	NEXT I
10	NM=I-1

	FOR I=1 TO 12
		READ MONTH$(I)
	NEXT I

	FOR I=1 TO 400
		READ KEY$(I)
		IF KEY$(I)="0" THEN 20
	NEXT I
20	NK=I-1

REM		DEFINE FIRST LETTERS OF VALID COMMANDS

	CODE$(1)="A"
	CODE$(2)="C"
	CODE$(3)="D"
	CODE$(4)="F"
	CODE$(5)="Q"
	CODE$(6)="S"
	CODE$(7)="L"


	DATALIB$="CMAGDATA.LIB"	:INDXLIB$="CMAGINDX.LIB"
	FILE DATALIB$(128),INDXLIB$(2*MAX.KEYS+4)

REM		READ INDEX FILE FROM DISK

	IF END #2 THEN 30
	FOR I=1 TO MAX.ENTRY
		READ #2,I;INDEX$(I)
		IF INDEX$(I)="0" THEN NULL=NULL+1
	NEXT I
30	EXTENT=I-1
	INDEX$(I)="0"
	IF EXTENT>0 THEN 35

REM		ARRIVE HERE IF EMPTY INDEX FILE ON DISK

	INPUT "Can't find Index File - is this new library?";A$
	IF LEFT$(A$,1)="Y" THEN 35

REM		FORM NEW INDEX FILE
31	GOSUB 32
	GOTO 35

32	PRINT TAB(21);"Forming a new Index"
	PRINT:PRINT:PRINT:PRINT

	NULL=0
	IF END #1 THEN 33
	FOR I=1 TO MAX.ENTRY-1
		READ #1,I;DUM$,DUM$,DUM$,DUM$,DUM$,INDEX$(I)
		IF INDEX$(I)="0" THEN NULL=NULL+1
	NEXT I
33	EXTENT=I-1
	INDEX$(I)="0"
	GOSUB 410
	RETURN

REM		COMMAND MODE ENTRY POINT

35	GOSUB 800	:REM SIGN-ON MESSAGE
	PRINT TAB(11);"Size of Library is currently ";\
	EXTENT-NULL;" entries": PRINT:PRINT

40	FOR J=1 TO 1 STEP 0
	PRINT
	INPUT "Command: ";COM$
	FOR I=1 TO 7
		IF LEFT$(COM$,1)=CODE$(I) THEN \
		ON I GOTO 100,200,300,31,400,500,600
	NEXT I

REM	ARRIVE HERE IF INVALID COMMAND WAS ENTERED

	PRINT CHR$(CLEAR.SCREEN)
	PRINT "Commands:"
	PRINT "---------"
	PRINT "A dd an entry"
	PRINT "C hange an entry"
	PRINT "D elete an entry"
	PRINT "F orm a new Index"
	PRINT "L ist Keys or Journals"
	PRINT "Q uit the Library"
	PRINT "S earch the Library"
	NEXT J
	STOP

REM		ADD AN ENTRY TO LIBRARY

	FOR I=1 TO 1 STEP 0

100	PRINT CHR$(CLEAR.SCREEN)
	PRINT TAB(18); "(Room for approximately ";
	PRINT INT ((FRE-300)/150)*10;" entries remains)"
	PRINT:PRINT
101	INPUT "Journal: ";MG$
	IF LEFT$(MG$,1)="0" THEN GOTO 35
	EM=0	:GOSUB 120
	IF EM=1 THEN 101
102	INPUT "Date: ";DATE$
	IF DATE$="0" THEN 35
	ED=0	:GOSUB 130
	IF ED=1 THEN 102
	INPUT "Page number: ";PAGE$
108	INPUT "Title:";TITLE$
	IF TITLE$="0" THEN 35
	INPUT "Author:";AUTHOR$
	IF AUTHOR$="0" THEN 35
	FLAG=0	:GOSUB 160	:REM CHECK RCD LENGTH
	IF FLAG=1 THEN 108
	GOSUB 750		:REM INSRT "," WHERE NEC.
	FOR J=1 TO MAX.KEYS:K$(J)="":NEXT J
	FOR J=1 TO MAX.KEYS
103		INPUT "Key:";K$(J)
		IF K$(J)="0" THEN K$(J)="":GOTO 105
		EK=0	:GOSUB 140
		IF EK=1 THEN 103
	NEXT J
	PRINT:PRINT
	PRINT TAB(18);"That is all the Keys allowed"
	PRINT:PRINT

105	GOSUB 110	:REM CONSTRUCT KEY VECTOR

REM		FIND FIRST EMPTY SLOT IN FILE

	FOR J=1 TO MAX.ENTRY-1
		IF INDEX$(J)="0" THEN 107
	NEXT J
	PRINT:PRINT"	No more room in Library":PRINT:\
	  GOTO 35

REM		WRITE NEW ENTRY TO FILE

107	INDEX$(J)=KY$	:REM UPDATE KEY IN INDEX
	GOSUB 900

REM		IF FILE EXTENT EXPANDS, WRITE NEW EOF

	IF J>EXTENT THEN :\
	  EXTENT=J:\
	  PRINT #1,(EXTENT+1);EOF$:\
	  INDEX$(J+1)="0":\
	  GOTO 109
	NULL=NULL-1
109	NEXT I

REM		CONSTRUCT SEARCH VECTOR

110	KY$=""
	FOR II=1 TO MAX.KEYS
		KY$=KY$+K$(II)
	NEXT II
	RETURN

REM		ENCODE JOURNAL

120	FOR II=1 TO NM
		IF LEFT$(MG$,3)=LEFT$(JOURNAL$(II),3) THEN 121
	NEXT II
	PRINT:PRINT"	Invalid Journal":PRINT:\
	  EM=1:RETURN
121	IF II<10 THEN 123
	MG$=LEFT$(STR$(II),2):RETURN
123	MG$="0"+LEFT$(STR$(II),1):RETURN

REM		ENCODE MONTH

130	IF LEN(DATE$)<5 THEN 130.5
	A$=LEFT$(DATE$,3)
	A1$=LEFT$(DATE$,1)
	A2=ASC(MID$(A$,2,1))
	A3=ASC(MID$(A$,3,1))
	A2=A2 OR 32	:A3=A3 OR 32
	A$=A1$+CHR$(A2)+CHR$(A3)
	FOR II=1 TO 12
		MNTH$=LEFT$(MONTH$(II),3)
		IF MNTH$=A$ THEN 131
	NEXT II
130.5	PRINT:PRINT"	Invalid date":PRINT
	PRINT	:ED=1	:RETURN

131	IF II<10 THEN 134
	B$=LEFT$(STR$(II),2)	:GOTO 136
134	B$="0"+LEFT$(STR$(II),1)
136	DATE$=RIGHT$(DATE$,2)+B$	:RETURN

REM		ENCODE KEY

140	FOR II=1 TO NK
		IF K$(J)=KEY$(II) THEN 150
	NEXT II
	PRINT:PRINT"	Invalid key":PRINT:\
	  EK=1	:RETURN
150	KK=0
	FOR JJJ=1 TO 26
		IF II<26 THEN 155
		II=II-26:KK=KK+1
	NEXT JJJ
155	IF KK=0 THEN S1$="0":GOTO 157
	S1$=CHR$(64+KK)
157	IF II=0 THEN K$(J)=S1$+"0"	:RETURN
	K$(J)=S1$+CHR$(64+II)
	RETURN

REM		CHECK LENGTH OF RECORD

160	RECORD.LENGTH=23+2*MAX.KEYS+LEN(TITLE$)+LEN(PAGE$)+\
	  LEN(AUTHOR$)
	IF RECORD.LENGTH < 127 THEN FLAG=0	:RETURN
	PRINT
	PRINT "Input is too long -Shorten title & author by ";\
	  RECORD.LENGTH-126;" characters.":FLAG=1	:RETURN

REM	CHANGE AN ENTRY

200	A$="Changed"	:IS=0
	GOSUB 310	:REM FIND DESIRED ENTRY
	IF IS=1 THEN 40
	TEMP.POINTER=J	:REM SAVE POINTER TO RANDOM FILE
	TEMP.INDEX.STORE$=INDEX$(TEMP.POINTER)

	PRINT "Here are the Keys for this entry:"
	PRINT	:GOSUB 220	:REM PRINT KEYS
	PRINT

204	INPUT "What item to be changed? ";A$
	A$=LEFT$(A$,1)
	IF A$<>"0" THEN 205
	FLAG=0	:GOSUB 160
	IF FLAG=1 THEN 204
	IF COMMA.FLAG=1 THEN COMMA.FLAG=0:GOSUB 750
	  :REM REPLACE "/"'S WITH ","'S
	PRINT "Here is the updated entry":PRINT
	GOSUB 541
	PRINT:PRINT"Here are the keywords:":PRINT
	GOSUB 220	:REM PRINT KEYS
	PRINT
	PRINT "Do you want to: A bort the edit, C hange";
	INPUT " another item, or are you D one: ";A$
	A$=LEFT$(A$,1)
	IF A$="D" THEN J=TEMP.POINTER:GOSUB 900:\
	  GOTO 35	:REM SAVE IT
	IF A$="C" THEN 204
	INDEX$(TEMP.POINTER)=TEMP.INDEX.STORE$
	GOTO 35
205	IF A$="K" THEN 213
	INPUT "What should this item be:";B$
	IF B$="0" THEN 204
	EM=0
	IF A$<>"J" THEN 209
	TEMP$=MG$	:MG$=B$	:GOSUB 120
	IF EM=1 THEN MG$=TEMP$
	GOTO 204
209	IF A$="T" THEN TITLE$=B$:COMMA.FLAG=1:GOTO 204
	IF A$="P" THEN PAGE$=B$	:GOTO 204
	ED=0
	IF A$<>"D" THEN 210
	TEMP$=DATE$	:DATE$=B$	:GOSUB 130
	IF ED=1 THEN DATE$=TEMP$
	GOTO 204
210	IF A$="A" THEN AUTHOR$=B$:COMMA.FLAG=1:GOTO 204
	IF A$<>"K" THEN 218
213	INPUT "Add, Change, or Delete a key: ";A$
	A$=LEFT$(A$,1)
	IF A$="C" THEN 214
	IF A$="D" THEN 231
	IF A$<>"A" THEN 218

REM		ADD A NEW KEY

212	J=1: INPUT "What is the key: ";K$(J)
	IF K$(J)="0" THEN 204
	EK=0:GOSUB 140
	IF EK=1 THEN 212
	IF LEN(KY$)=2*MAX.KEYS THEN \
	  PRINT "No more keywords allowed for this entry":\
	  PRINT:GOTO 204

REM		INSERT NEW KEYWORD

	KY$=KY$+K$(J)
	INDEX$(TEMP.POINTER)=KY$	:REM UPDATE INDEX LIST
	GOTO 204

214	J=1	:INPUT "Old key: ";K$(J)
	IF K$(J)="0" THEN 204
	EK=0	:GOSUB 140
	IF EK=1 THEN 213

REM		FIND THIS KEY IN KEYWORD

	FOR I=1 TO (LEN(KY$)/2)
		IF K$(J)=MID$(KY$,2*I-1,2) THEN 215
	NEXT I
	PRINT "This keyword not applicable to this entry":\
	  GOTO 204
215	INPUT "New key: ";K$(J)
	IF K$(J)="0" THEN 204
	EK=0	:GOSUB 140
	IF EK=1 THEN 215

REM		MAKE CHANGE IN KEY

	IF 2*I=LEN(KY$) THEN K2$="":GOTO 216
	K2$=RIGHT$(KY$,LEN(KY$)-2*I)
216	IF I=1 THEN K1$="":GOTO 217
	K1$=LEFT$(KY$,(I-1)*2)
217	KY$=K1$+K$(J)+K2$	:REM FORM NEW KEY

	INDEX$(TEMP.POINTER)=KY$	:REM UPDATE INDEX LISTG
	GOTO 204

REM		DELETE AN EXISTING KEYWORD

231	J=1:INPUT "What is the keyword to be deleted: ";K$(J)
	IF K$(J)="0" THEN 204
	EK=0:GOSUB 140
	IF EK=1 THEN 204

REM		FIND KEYWORD IN KEY

	FOR I=1 TO (LEN(KY$)/2)
		IF MID$(KY$,2*I-1,2)=K$(J) THEN 237
	NEXT I
235	PRINT
	PRINT "This key not applicable to this entry."
	GOTO 204

REM		DELETE THE KEYWORD

237	IF 2*I=LEN(KY$) THEN K2$="":GOTO 238
	K2$=RIGHT$(KY$,LEN(KY$)-2*I)
238	IF I=1 THEN K1$="":GOTO 238.5
	K1$=LEFT$(KY$,2*I-1)
238.5	KY$=K1$+K2$
	INDEX$(JJ)=KY$
	GOTO 204

218	PRINT "Invalid input."
	GOTO 204

REM		PRINT AN ENTRY'S KEYWORDS

220	FOR II=1 TO (LEN(KY$)/2)
		PRINT TAB((((II-INT((II-1)/3)*3)-1)*20)+1);:\
		  GOSUB 700	:REMARK DECODE KEY
		PRINT KEY$(STRING.NO);
	IF INT(II/3)=II/3 THEN PRINT
	NEXT II
	IF INT(I/3)<>I/3 THEN PRINT
221	PRINT	:RETURN

REM		DELETE AN ENTRY

300	IS=0	:A$="Deleted."
	GOSUB 310	:REM FIND AN ENTRY
	IF IS=1 THEN GOTO 35	:REM FOUND WRONG ENTRY

REM		DELETE KEY FROM INDEX

	INDEX$(J)="0"
	NULL=NULL+1

REM		CLEAR ENTRY FROM FILE

	KY$="0"	:GOSUB 900

	PRINT CHR$(CLEAR.SCREEN)
	PRINT "	Entry deleted from Library.":PRINT
	PRINT:PRINT:GOTO 35

310	PRINT CHR$(CLEAR.SCREEN)
	PRINT "What is the number of the entry to be ";A$
	INPUT "	(Obtained from the most recent Search)	";I
	IF I=0 THEN 40
	IF I>NUMBER.SPOOL THEN PRINT:PRINT:\
	  PRINT "	Invalid entry number.":\
	  GOTO 312
	J=SPOOL(I)
	IF J>EXTENT THEN 312
	PRINT:PRINT"Is this the correct entry: ":PRINT:PRINT
	M=I:GOSUB 540	:REM PRINT THE ENTRY
	KY$=DUM$
	INPUT N$:N$=LEFT$(N$,1)
	IF N$="Y" THEN RETURN

312	PRINT:PRINT "Conduct another Search and repeat."
	PRINT:IS=1:RETURN

REM		QUIT THE LIBRARY

400	PRINT CHR$(CLEAR.SCREEN)
	PRINT TAB(17);"This session is terminated...Bye!"\
	  :PRINT:PRINT:PRINT:PRINT:PRINT
	STOP

410	PRINT TAB(18);"Saving updated index file.":PRINT:PRINT
	PRINT:PRINT
	FOR I=1 TO EXTENT
		PRINT #2,I;INDEX$(I)
	NEXT I
	PRINT #2,I;EOF$
	RETURN

REM		SEARCH THE LIBRARY

500	PRINT CHR$(CLEAR.SCREEN)
	FOR J=1 TO MAX.KEYS
		K$(J)=""
	NEXT J
	FOR J=1 TO MAX.KEYS
501		INPUT "Key: ";K$(J)
		IF LEFT$(K$(J),1)="0" THEN K$(J)="":GOTO 503
		EK=0:GOSUB 140
		IF EK=1 THEN 501
	NEXT J

503	GOSUB 110	:REM CONSTRUCT SEARCH VECTOR

	PRINT "If you want hardcopy, type 'YES' "
	INPUT "Otherwise type 'NO'";PRINTER.FLAG$
	PRINTER.FLAG$=LEFT$(PRINTER.FLAG$,1)
	IF PRINTER.FLAG$="Y" THEN\
	  LPRINTER:\
	  GOSUB 920:\
	  GOTO 503.5
	PRINT CHR$(CLEAR.SCREEN)
503.5	GOSUB 509	:REM PRINT A LINE OF -----'S
	PRINT:GOSUB 910
	IF KY$<>"" THEN 504
	PRINT TAB(13);"Complete Listing of all Entries"
	GOSUB 910:GOTO 505
504	PRINT"	Library Search for Articles Related to:"
	PRINT:GOSUB 910:GOSUB 910
	FOR II=1 TO (LEN(KY$)/2)
		PRINT TAB(16);"-";
		PRINT TAB(18);
		GOSUB 700	:REM DECODE KEY
		PRINT KEY$(STRING.NO):GOSUB 910
	NEXT II
505	PRINT:GOSUB 910
	GOSUB 510 :REM SRCH INDX FIL & PRNT SELECTED ENTRIES
	IF NUMBER.SPOOL=0 THEN PRINT TAB(20);\
	  "No such articles in Library.":GOSUB 910
	PRINT	:GOSUB 910:GOSUB 509
	REM PRINT A LINE OF ----'S
	PRINT	:PRINT:GOSUB 910:GOSUB 910
506	IF PRINTER.FLAG$<>"Y" THEN 40
	PRINT:GOSUB 910
507	CONSOLE
	GOTO 35

REM		PRINT A LINE OF -----'S

509	DASHES=64
	IF PRINTER.FLAG$="Y" THEN DASHES=72
	FOR I=1 TO DASHES
		PRINT "-";
	NEXT I
	PRINT:GOSUB 910
	RETURN

REM		SEARCH INDEX FILE

510	M=1
	GOSUB 530	:REM CLEAR SPOOL MATRIX
511	NUMBER.SEARCH.KEYS=(LEN(KY$)/2)
	FOR J=1 TO EXTENT
		IF LINES.PER.PAGE-PRINT.LINE<8 THEN GOSUB 920
		IF INDEX$(J)="0" THEN 519
		IF NUMBER.SEARCH.KEYS=0 THEN 516
513		NUMBER.INDEX.KEYS=(LEN(INDEX$(J))/2)
		FOR I=1 TO NUMBER.SEARCH.KEYS
			FOR K=1 TO NUMBER.INDEX.KEYS
				IF MID$(KY$,2*I-1,2)=\
				  MID$(INDEX$(J),2*K-1,2)\
				  THEN 515
			NEXT K
			GOTO 519
515		NEXT I
516		SPOOL(M)=J
		GOSUB 540	:REM PRINT ENTRY
		M=M+1
519		ABORT.FLAG=0
		GOSUB 550	:REM POLL KEYBOARD
		IF ABORT.FLAG=1 THEN 520
	NEXT J
520	NUMBER.SPOOL=M-1
	RETURN

REM		CLEAR SPOOL MATRIX

530	FOR I=1 TO EXTENT
		SPOOL(I)=0
	NEXT I
	RETURN

REM		PRINT AN ENTRY

540	READ #1,J;MG$,DATE$,PAGE$,TITLE$,AUTHOR$,DUM$
541	PRINT M;".";
	PRINT TAB(7);JOURNAL$(VAL(MG$));
	PRINT TAB(25);
	IF LEN(TITLE$)<DASHES-26 THEN PRINT TITLE$:\
	  GOSUB 910:GOTO 545

REM		BREAK TITLE INTO MULTIPLE LINES

	TEMP.TITLE$=TITLE$
542	FOR JJ=DASHES-26 TO 1 STEP -1
		IF MID$(TEMP.TITLE$,JJ,1)=" " THEN 543
	NEXT JJ
543	TITLE1$=LEFT$(TEMP.TITLE$,JJ-1)
	TITLE2$=RIGHT$(TEMP.TITLE$,LEN(TEMP.TITLE$)-JJ)
	PRINT TITLE1$:GOSUB 910:PRINT TAB(25);
	IF LEN(TITLE2$)<DASHES-26 THEN PRINT TITLE2$:\
	  GOSUB 910:GOTO 545
	TEMP.TITLE$=TITLE2$	:GOTO 542

545	PRINT TAB(7);MONTH$(VAL(RIGHT$(DATE$,2)));" 19";
	PRINT LEFT$(DATE$,2);
	PRINT TAB(25);"by ";AUTHOR$:GOSUB 910
	PRINT TAB(7);"Page ";PAGE$:GOSUB 910
	PRINT:GOSUB 910
	RETURN

REM		KEYBOARD POLL ROUTINE TO BREAK LISTING
REM			(TYPE "0" TO ABORT)

550	IF INP(KEYBOARD.STAT.PORT) AND KBDMASK <> KBD.TRUE\
	  THEN RETURN
	IF (INP(KEYBOARD.DATA.PORT)AND 127) <> 48 THEN RETURN
	GOSUB 509	:REM PRINT LINE OF DASHES
	IF PRINTER.FLAG$ = "Y" THEN 507
	ABORT.FLAG=1	:RETURN

REM		LIST KEYS AND/OR JOURNALS IN LIBRARY

600	PRINT CHR$(CLEAR.SCREEN)
	INPUT "Do you want a list of keys or journals";A$
	PRINT CHR$(CLEAR.SCREEN)
	A$=LEFT$(A$,1)
	IF A$="J" THEN 620
	IF A$<>"K" THEN 35

REM		LIST KEYS

	FOR I=1 TO NK
		PRINT TAB((((I-INT((I-1)/3)*3)-1)*20)+1);\
		  KEY$(I);
		IF INT(I/3)=I/3 THEN PRINT
		IF INT(I/42)=I/42 THEN GOSUB 650
		IF A$="0" THEN GOTO 35
	NEXT I
	IF INT(I/3)=I/3 THEN PRINT
	PRINT	:GOSUB 650	:GOTO 35

REM		LIST JOURNALS

620	FOR I=1 TO NM
		PRINT TAB((((I-INT((I-1)/3)*3)-1)*20)+1);\
		  JOURNAL$(I);
		IF INT (I/3)= I/3 THEN PRINT
		IF INT(I/42)=I/42 THEN GOSUB 650
	NEXT I
	IF INT(I/3)<>I/3 THEN PRINT
	PRINT	:GOSUB 650	:GOTO 35

REM		PAUSE ROUTINE

650	INPUT "Type 'C' to continue";A$
	RETURN

REM		DECODE A KEY

700	S1$=MID$(KY$,2*II-1,1):S2$=MID$(KY$,2*II,1)
	IF S1$="0" THEN S1=0:GOTO 720
	S1=(ASC(S1$)-64)*26
720	IF S2$="0" THEN S2=0	:GOTO 740
	S2=ASC(S2$)-64
740	STRING.NO=S1+S2
	RETURN

REM		SUBSTITUTE "," FOR "/" IN TITLE AND AUTHOR

750	FOR L=1 TO LEN(TITLE$)
		IF MID$(TITLE$,L,1)<>"/" THEN 760
		TIT.LEFT$=LEFT$(TITLE$,L-1)
		TIT.RIGHT$=RIGHT$(TITLE$,(LEN(TITLE$)-L))
		TITLE$=TIT.LEFT$+","+TIT.RIGHT$
760	NEXT L
	FOR L=1 TO LEN(AUTHOR$)
		IF MID$(AUTHOR$,L,1)<>"/" THEN 770
		AUT.LEFT$=LEFT$(AUTHOR$,L-1)
		AUT.RIGHT$=RIGHT$(AUTHOR$,(LEN(AUTHOR$)-L))
		AUTHOR$=AUT.LEFT$+","+AUT.RIGHT$
770	NEXT L
	RETURN

REM		DISPLAY SIGN-ON MESSAGE

800	PRINT CHR$(CLEAR.SCREEN)
	PRINT "         -------------------------------------"
	PRINT "         | COMPUTER JOURNAL RETRIEVAL SYSTEM |"
	PRINT "         -------------------------------------"
	PRINT	:PRINT	:PRINT
	RETURN

REM		WRITE AN ENTRY TO DATA FILE

900	PRINT #1,J;MG$,DATE$,PAGE$,TITLE$,AUTHOR$,KY$
	PRINT #2,J;INDEX$(J)
	RETURN

	REM PRINTER LINE INCREMENT

910	IF PRINTER.FLAG$<>"Y" THEN RETURN
	PRINT.LINE=PRINT.LINE+1
	IF PRINT.LINE>66 THEN PRINT.LINE=1
	RETURN

	REM FORMFEED

920	IF PRINT.LINE=3 THEN RETURN
	PRINT:GOSUB 910:GOTO 920


REM			*** DATA SECTION ***

REM		JOURNAL LIST

	DATA	BYTE,KB,CC,DDJ,PC,IA,0

REM		MONTH LIST

	DATA	January,February,March,April,May,June
	DATA	July,August,September,October,November
	DATA	December

REM		KEY WORD LIST

	DATA	8080,6800,6502,1802,68000,8085,8086

	DATA	ART,AUTOS,APPLIANCES,ARTIFICIAL INTELLIGENCE
	DATA	APPLE,ATARI,APL,ASSEMBLER,AUDIO,ANIMATION
	DATA	ALGOL,ASCII,ALGORITHM,APPLICATIONS

	DATA	BASIC,BALLY,BUSINESS,BENCHMARK,BUS,BOARD

	DATA	C,CPU,CLOCK,CROMEMCO,CONSTRUCTION,COBOL
	DATA	CBASIC,CALCULATOR,CASSETTE,COMPILER
	DATA	CRYPTOGRAPHICS,COMPONENTS,CHIPS

	DATA	DEBUG,DISASSEMBLER,DISK,DATA,DBMS,DRIVER
	DATA	DOCUMENTATION,DISCUSSION,DESIGN,DIAGNOSTIC

	DATA	EDUCATION,EXIDY,EDITING,ELECTRONIC GAMES
	DATA	EXPANSION

	DATA	FICTION,FORTRAN,FRONT PANEL,FLEX
	DATA	FILES,FINANCE,FAIRS,FLOWCHARTING

	DATA	GRAPHICS,GENEALOGY,GAME,GODBOUT

	DATA	HARDWARE,HANDICAPPED,HEATH,HOME,HISTORY
	DATA	HUMOR

	DATA	IMSAI,INTERRUPT,ITHICA,I/O,INPUT
	DATA	INTELASM,INTERPRETER,INTERVIEW,INTERFACE

	DATA	KEYBOARD,KIM

	DATA	LINGUISTICS,LANGUAGE,LARGE,LAW,LEDGER,LISP

	DATA	MUSIC,MONITER,MICROPROGRAMMING,MICROPOLIS
	DATA	MAINFRAME,MINICOMPUTER,MBASIC,MACASM
	DATA	MATH,MEMORY,MATRIX,MULTI-TASKING,MISCELLANEOUS
	DATA	MODIFICATION

	DATA	NORTHSTAR

	DATA	OPERATING SYSTEM,OBJECT,OUTPUT

	DATA	PROGRAM,PASCAL,PILOT,PET,PRINTER,PROM,PENCIL
	DATA	PAYROLL,PROCESSING,PROGRAMMING,PACE,PROTECTION

	DATA	RS232,RANDOM,ROUTINES,REVIEW,ROBOTICS
	DATA	REAL-WORLD

	DATA	SOFTWARE,SYS8,SOL,SWTP,SSM,SD SALES,STRUCTURE
	DATA	STRUCTURED,STACK,S100,SS50,SORT,SORTING,SOURCE
	DATA	SYSTEM,STANDARDS,SECURITY,SOLDERING,SMALL

	DATA	TEXT,TEXT EDITOR,TRS80,TARBELL,TERMINAL
	DATA	TELEPHONE,TECHNIQUE,TDLASM,THEORY,TIMESHARING
	DATA	TUTORIAL,TROUBLESHOOTING

	DATA	UTILITIES

	DATA	VIDEO

	DATA	WORD,WORD PROCESSING,WIRE WRAP

	DATA	Z80,Z8000
	DATA	A/D,PAPER TAPE,PUZZLE,8008,ARCHETECTURE
	DATA	MICROPROCESSOR,MASS STORAGE,POWER SUPPLY
	DATA	MEDICINE,WEATHER,SIMULATION

	DATA	0
