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$) 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