home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / sigmv010.ark / JOURNAL.BAS < prev    next >
BASIC Source File  |  1984-04-29  |  17KB  |  752 lines

  1. REM    JOURNAL.BAS FIRST APPEARED IN THE FEBRUARY 1979 ISSUE
  2. REM    OF KILOBAUD MAGAZINE...REQUIRES BASIC-E, CBASIC, OR CBASIC-2 FOR
  3. REM    USE.  SEE THAT ISSUE OF KILOBAUD FOR INSTRUCTIONS.
  4. REM
  5. REM    COMPUTER JOURNAL RESOURCE LIBRARY
  6. REM
  7. REM        MAIN PROGRAM
  8. REM
  9. REM         WRITTEN IN BASIC-E
  10. REM
  11. REM
  12. REM
  13. REM        NOV 26,1979
  14. REM
  15.  
  16.     PRINT.LINE=1        :REM SAY PRNTR ON FIRST LINE
  17.     LINES.PER.PAGE=66    :REM NAME SAYS IT ALL
  18.     CLEAR.SCREEN=12        :REM DEF SCRN CLR CHAR.
  19.     KEYBOARD.STAT.PORT=94    :REM DEFINE KBD STATUS PORT
  20.     KBDMASK=128        :REM KEYBOARD BIT MASK
  21.     KBD.TRUE=0        :REM ACTIVE LO
  22.     KEYBOARD.DATA.PORT=92    :REM DEFINE KBD DATA PORT
  23.     MAX.ENTRY=500        :REM DEFINE MAX LIB SIZE
  24.     MAX.KEYS=8        :REM DEFINE MAX # KEYS/ENTRY
  25.     EOF$=CHR$(26)        :REM DEFINE END OF FIL CHAR
  26.  
  27.     DIM INDEX$(MAX.ENTRY),MONTH$(12),KEY$(185),JOURNAL$(10)
  28.     DIM CODE$(7),K$(MAX.KEYS),SPOOL(MAX.ENTRY)
  29.  
  30.  
  31.     GOSUB 800    :REM SIGN-ON MESSAGE
  32.     PRINT TAB(24);"Please Stand By . . . .":PRINT:PRINT
  33.  
  34. REM    READ NECESSARY INFORMATION FROM DATA STATEMENTS
  35.  
  36.     FOR I=1 TO 100
  37.         READ JOURNAL$(I)
  38.         IF JOURNAL$(I)="0" THEN 10
  39.     NEXT I
  40. 10    NM=I-1
  41.  
  42.     FOR I=1 TO 12
  43.         READ MONTH$(I)
  44.     NEXT I
  45.  
  46.     FOR I=1 TO 400
  47.         READ KEY$(I)
  48.         IF KEY$(I)="0" THEN 20
  49.     NEXT I
  50. 20    NK=I-1
  51.  
  52. REM        DEFINE FIRST LETTERS OF VALID COMMANDS
  53.  
  54.     CODE$(1)="A"
  55.     CODE$(2)="C"
  56.     CODE$(3)="D"
  57.     CODE$(4)="F"
  58.     CODE$(5)="Q"
  59.     CODE$(6)="S"
  60.     CODE$(7)="L"
  61.  
  62.  
  63.     DATALIB$="CMAGDATA.LIB"    :INDXLIB$="CMAGINDX.LIB"
  64.     FILE DATALIB$(128),INDXLIB$(2*MAX.KEYS+4)
  65.  
  66. REM        READ INDEX FILE FROM DISK
  67.  
  68.     IF END #2 THEN 30
  69.     FOR I=1 TO MAX.ENTRY
  70.         READ #2,I;INDEX$(I)
  71.         IF INDEX$(I)="0" THEN NULL=NULL+1
  72.     NEXT I
  73. 30    EXTENT=I-1
  74.     INDEX$(I)="0"
  75.     IF EXTENT>0 THEN 35
  76.  
  77. REM        ARRIVE HERE IF EMPTY INDEX FILE ON DISK
  78.  
  79.     INPUT "Can't find Index File - is this new library?";A$
  80.     IF LEFT$(A$,1)="Y" THEN 35
  81.  
  82. REM        FORM NEW INDEX FILE
  83. 31    GOSUB 32
  84.     GOTO 35
  85.  
  86. 32    PRINT TAB(21);"Forming a new Index"
  87.     PRINT:PRINT:PRINT:PRINT
  88.  
  89.     NULL=0
  90.     IF END #1 THEN 33
  91.     FOR I=1 TO MAX.ENTRY-1
  92.         READ #1,I;DUM$,DUM$,DUM$,DUM$,DUM$,INDEX$(I)
  93.         IF INDEX$(I)="0" THEN NULL=NULL+1
  94.     NEXT I
  95. 33    EXTENT=I-1
  96.     INDEX$(I)="0"
  97.     GOSUB 410
  98.     RETURN
  99.  
  100. REM        COMMAND MODE ENTRY POINT
  101.  
  102. 35    GOSUB 800    :REM SIGN-ON MESSAGE
  103.     PRINT TAB(11);"Size of Library is currently ";\
  104.     EXTENT-NULL;" entries": PRINT:PRINT
  105.  
  106. 40    FOR J=1 TO 1 STEP 0
  107.     PRINT
  108.     INPUT "Command: ";COM$
  109.     FOR I=1 TO 7
  110.         IF LEFT$(COM$,1)=CODE$(I) THEN \
  111.         ON I GOTO 100,200,300,31,400,500,600
  112.     NEXT I
  113.  
  114. REM    ARRIVE HERE IF INVALID COMMAND WAS ENTERED
  115.  
  116.     PRINT CHR$(CLEAR.SCREEN)
  117.     PRINT "Commands:"
  118.     PRINT "---------"
  119.     PRINT "A dd an entry"
  120.     PRINT "C hange an entry"
  121.     PRINT "D elete an entry"
  122.     PRINT "F orm a new Index"
  123.     PRINT "L ist Keys or Journals"
  124.     PRINT "Q uit the Library"
  125.     PRINT "S earch the Library"
  126.     NEXT J
  127.     STOP
  128.  
  129. REM        ADD AN ENTRY TO LIBRARY
  130.  
  131.     FOR I=1 TO 1 STEP 0
  132.  
  133. 100    PRINT CHR$(CLEAR.SCREEN)
  134.     PRINT TAB(18); "(Room for approximately ";
  135.     PRINT INT ((FRE-300)/150)*10;" entries remains)"
  136.     PRINT:PRINT
  137. 101    INPUT "Journal: ";MG$
  138.     IF LEFT$(MG$,1)="0" THEN GOTO 35
  139.     EM=0    :GOSUB 120
  140.     IF EM=1 THEN 101
  141. 102    INPUT "Date: ";DATE$
  142.     IF DATE$="0" THEN 35
  143.     ED=0    :GOSUB 130
  144.     IF ED=1 THEN 102
  145.     INPUT "Page number: ";PAGE$
  146. 108    INPUT "Title:";TITLE$
  147.     IF TITLE$="0" THEN 35
  148.     INPUT "Author:";AUTHOR$
  149.     IF AUTHOR$="0" THEN 35
  150.     FLAG=0    :GOSUB 160    :REM CHECK RCD LENGTH
  151.     IF FLAG=1 THEN 108
  152.     GOSUB 750        :REM INSRT "," WHERE NEC.
  153.     FOR J=1 TO MAX.KEYS:K$(J)="":NEXT J
  154.     FOR J=1 TO MAX.KEYS
  155. 103        INPUT "Key:";K$(J)
  156.         IF K$(J)="0" THEN K$(J)="":GOTO 105
  157.         EK=0    :GOSUB 140
  158.         IF EK=1 THEN 103
  159.     NEXT J
  160.     PRINT:PRINT
  161.     PRINT TAB(18);"That is all the Keys allowed"
  162.     PRINT:PRINT
  163.  
  164. 105    GOSUB 110    :REM CONSTRUCT KEY VECTOR
  165.  
  166. REM        FIND FIRST EMPTY SLOT IN FILE
  167.  
  168.     FOR J=1 TO MAX.ENTRY-1
  169.         IF INDEX$(J)="0" THEN 107
  170.     NEXT J
  171.     PRINT:PRINT"    No more room in Library":PRINT:\
  172.       GOTO 35
  173.  
  174. REM        WRITE NEW ENTRY TO FILE
  175.  
  176. 107    INDEX$(J)=KY$    :REM UPDATE KEY IN INDEX
  177.     GOSUB 900
  178.  
  179. REM        IF FILE EXTENT EXPANDS, WRITE NEW EOF
  180.  
  181.     IF J>EXTENT THEN :\
  182.       EXTENT=J:\
  183.       PRINT #1,(EXTENT+1);EOF$:\
  184.       INDEX$(J+1)="0":\
  185.       GOTO 109
  186.     NULL=NULL-1
  187. 109    NEXT I
  188.  
  189. REM        CONSTRUCT SEARCH VECTOR
  190.  
  191. 110    KY$=""
  192.     FOR II=1 TO MAX.KEYS
  193.         KY$=KY$+K$(II)
  194.     NEXT II
  195.     RETURN
  196.  
  197. REM        ENCODE JOURNAL
  198.  
  199. 120    FOR II=1 TO NM
  200.         IF LEFT$(MG$,3)=LEFT$(JOURNAL$(II),3) THEN 121
  201.     NEXT II
  202.     PRINT:PRINT"    Invalid Journal":PRINT:\
  203.       EM=1:RETURN
  204. 121    IF II<10 THEN 123
  205.     MG$=LEFT$(STR$(II),2):RETURN
  206. 123    MG$="0"+LEFT$(STR$(II),1):RETURN
  207.  
  208. REM        ENCODE MONTH
  209.  
  210. 130    IF LEN(DATE$)<5 THEN 130.5
  211.     A$=LEFT$(DATE$,3)
  212.     A1$=LEFT$(DATE$,1)
  213.     A2=ASC(MID$(A$,2,1))
  214.     A3=ASC(MID$(A$,3,1))
  215.     A2=A2 OR 32    :A3=A3 OR 32
  216.     A$=A1$+CHR$(A2)+CHR$(A3)
  217.     FOR II=1 TO 12
  218.         MNTH$=LEFT$(MONTH$(II),3)
  219.         IF MNTH$=A$ THEN 131
  220.     NEXT II
  221. 130.5    PRINT:PRINT"    Invalid date":PRINT
  222.     PRINT    :ED=1    :RETURN
  223.  
  224. 131    IF II<10 THEN 134
  225.     B$=LEFT$(STR$(II),2)    :GOTO 136
  226. 134    B$="0"+LEFT$(STR$(II),1)
  227. 136    DATE$=RIGHT$(DATE$,2)+B$    :RETURN
  228.  
  229. REM        ENCODE KEY
  230.  
  231. 140    FOR II=1 TO NK
  232.         IF K$(J)=KEY$(II) THEN 150
  233.     NEXT II
  234.     PRINT:PRINT"    Invalid key":PRINT:\
  235.       EK=1    :RETURN
  236. 150    KK=0
  237.     FOR JJJ=1 TO 26
  238.         IF II<26 THEN 155
  239.         II=II-26:KK=KK+1
  240.     NEXT JJJ
  241. 155    IF KK=0 THEN S1$="0":GOTO 157
  242.     S1$=CHR$(64+KK)
  243. 157    IF II=0 THEN K$(J)=S1$+"0"    :RETURN
  244.     K$(J)=S1$+CHR$(64+II)
  245.     RETURN
  246.  
  247. REM        CHECK LENGTH OF RECORD
  248.  
  249. 160    RECORD.LENGTH=23+2*MAX.KEYS+LEN(TITLE$)+LEN(PAGE$)+\
  250.       LEN(AUTHOR$)
  251.     IF RECORD.LENGTH < 127 THEN FLAG=0    :RETURN
  252.     PRINT
  253.     PRINT "Input is too long -Shorten title & author by ";\
  254.       RECORD.LENGTH-126;" characters.":FLAG=1    :RETURN
  255.  
  256. REM    CHANGE AN ENTRY
  257.  
  258. 200    A$="Changed"    :IS=0
  259.     GOSUB 310    :REM FIND DESIRED ENTRY
  260.     IF IS=1 THEN 40
  261.     TEMP.POINTER=J    :REM SAVE POINTER TO RANDOM FILE
  262.     TEMP.INDEX.STORE$=INDEX$(TEMP.POINTER)
  263.  
  264.     PRINT "Here are the Keys for this entry:"
  265.     PRINT    :GOSUB 220    :REM PRINT KEYS
  266.     PRINT
  267.  
  268. 204    INPUT "What item to be changed? ";A$
  269.     A$=LEFT$(A$,1)
  270.     IF A$<>"0" THEN 205
  271.     FLAG=0    :GOSUB 160
  272.     IF FLAG=1 THEN 204
  273.     IF COMMA.FLAG=1 THEN COMMA.FLAG=0:GOSUB 750
  274.       :REM REPLACE "/"'S WITH ","'S
  275.     PRINT "Here is the updated entry":PRINT
  276.     GOSUB 541
  277.     PRINT:PRINT"Here are the keywords:":PRINT
  278.     GOSUB 220    :REM PRINT KEYS
  279.     PRINT
  280.     PRINT "Do you want to: A bort the edit, C hange";
  281.     INPUT " another item, or are you D one: ";A$
  282.     A$=LEFT$(A$,1)
  283.     IF A$="D" THEN J=TEMP.POINTER:GOSUB 900:\
  284.       GOTO 35    :REM SAVE IT
  285.     IF A$="C" THEN 204
  286.     INDEX$(TEMP.POINTER)=TEMP.INDEX.STORE$
  287.     GOTO 35
  288. 205    IF A$="K" THEN 213
  289.     INPUT "What should this item be:";B$
  290.     IF B$="0" THEN 204
  291.     EM=0
  292.     IF A$<>"J" THEN 209
  293.     TEMP$=MG$    :MG$=B$    :GOSUB 120
  294.     IF EM=1 THEN MG$=TEMP$
  295.     GOTO 204
  296. 209    IF A$="T" THEN TITLE$=B$:COMMA.FLAG=1:GOTO 204
  297.     IF A$="P" THEN PAGE$=B$    :GOTO 204
  298.     ED=0
  299.     IF A$<>"D" THEN 210
  300.     TEMP$=DATE$    :DATE$=B$    :GOSUB 130
  301.     IF ED=1 THEN DATE$=TEMP$
  302.     GOTO 204
  303. 210    IF A$="A" THEN AUTHOR$=B$:COMMA.FLAG=1:GOTO 204
  304.     IF A$<>"K" THEN 218
  305. 213    INPUT "Add, Change, or Delete a key: ";A$
  306.     A$=LEFT$(A$,1)
  307.     IF A$="C" THEN 214
  308.     IF A$="D" THEN 231
  309.     IF A$<>"A" THEN 218
  310.  
  311. REM        ADD A NEW KEY
  312.  
  313. 212    J=1: INPUT "What is the key: ";K$(J)
  314.     IF K$(J)="0" THEN 204
  315.     EK=0:GOSUB 140
  316.     IF EK=1 THEN 212
  317.     IF LEN(KY$)=2*MAX.KEYS THEN \
  318.       PRINT "No more keywords allowed for this entry":\
  319.       PRINT:GOTO 204
  320.  
  321. REM        INSERT NEW KEYWORD
  322.  
  323.     KY$=KY$+K$(J)
  324.     INDEX$(TEMP.POINTER)=KY$    :REM UPDATE INDEX LIST
  325.     GOTO 204
  326.  
  327. 214    J=1    :INPUT "Old key: ";K$(J)
  328.     IF K$(J)="0" THEN 204
  329.     EK=0    :GOSUB 140
  330.     IF EK=1 THEN 213
  331.  
  332. REM        FIND THIS KEY IN KEYWORD
  333.  
  334.     FOR I=1 TO (LEN(KY$)/2)
  335.         IF K$(J)=MID$(KY$,2*I-1,2) THEN 215
  336.     NEXT I
  337.     PRINT "This keyword not applicable to this entry":\
  338.       GOTO 204
  339. 215    INPUT "New key: ";K$(J)
  340.     IF K$(J)="0" THEN 204
  341.     EK=0    :GOSUB 140
  342.     IF EK=1 THEN 215
  343.  
  344. REM        MAKE CHANGE IN KEY
  345.  
  346.     IF 2*I=LEN(KY$) THEN K2$="":GOTO 216
  347.     K2$=RIGHT$(KY$,LEN(KY$)-2*I)
  348. 216    IF I=1 THEN K1$="":GOTO 217
  349.     K1$=LEFT$(KY$,(I-1)*2)
  350. 217    KY$=K1$+K$(J)+K2$    :REM FORM NEW KEY
  351.  
  352.     INDEX$(TEMP.POINTER)=KY$    :REM UPDATE INDEX LISTG
  353.     GOTO 204
  354.  
  355. REM        DELETE AN EXISTING KEYWORD
  356.  
  357. 231    J=1:INPUT "What is the keyword to be deleted: ";K$(J)
  358.     IF K$(J)="0" THEN 204
  359.     EK=0:GOSUB 140
  360.     IF EK=1 THEN 204
  361.  
  362. REM        FIND KEYWORD IN KEY
  363.  
  364.     FOR I=1 TO (LEN(KY$)/2)
  365.         IF MID$(KY$,2*I-1,2)=K$(J) THEN 237
  366.     NEXT I
  367. 235    PRINT
  368.     PRINT "This key not applicable to this entry."
  369.     GOTO 204
  370.  
  371. REM        DELETE THE KEYWORD
  372.  
  373. 237    IF 2*I=LEN(KY$) THEN K2$="":GOTO 238
  374.     K2$=RIGHT$(KY$,LEN(KY$)-2*I)
  375. 238    IF I=1 THEN K1$="":GOTO 238.5
  376.     K1$=LEFT$(KY$,2*I-1)
  377. 238.5    KY$=K1$+K2$
  378.     INDEX$(JJ)=KY$
  379.     GOTO 204
  380.  
  381. 218    PRINT "Invalid input."
  382.     GOTO 204
  383.  
  384. REM        PRINT AN ENTRY'S KEYWORDS
  385.  
  386. 220    FOR II=1 TO (LEN(KY$)/2)
  387.         PRINT TAB((((II-INT((II-1)/3)*3)-1)*20)+1);:\
  388.           GOSUB 700    :REMARK DECODE KEY
  389.         PRINT KEY$(STRING.NO);
  390.     IF INT(II/3)=II/3 THEN PRINT
  391.     NEXT II
  392.     IF INT(I/3)<>I/3 THEN PRINT
  393. 221    PRINT    :RETURN
  394.  
  395. REM        DELETE AN ENTRY
  396.  
  397. 300    IS=0    :A$="Deleted."
  398.     GOSUB 310    :REM FIND AN ENTRY
  399.     IF IS=1 THEN GOTO 35    :REM FOUND WRONG ENTRY
  400.  
  401. REM        DELETE KEY FROM INDEX
  402.  
  403.     INDEX$(J)="0"
  404.     NULL=NULL+1
  405.  
  406. REM        CLEAR ENTRY FROM FILE
  407.  
  408.     KY$="0"    :GOSUB 900
  409.  
  410.     PRINT CHR$(CLEAR.SCREEN)
  411.     PRINT "    Entry deleted from Library.":PRINT
  412.     PRINT:PRINT:GOTO 35
  413.  
  414. 310    PRINT CHR$(CLEAR.SCREEN)
  415.     PRINT "What is the number of the entry to be ";A$
  416.     INPUT "    (Obtained from the most recent Search)    ";I
  417.     IF I=0 THEN 40
  418.     IF I>NUMBER.SPOOL THEN PRINT:PRINT:\
  419.       PRINT "    Invalid entry number.":\
  420.       GOTO 312
  421.     J=SPOOL(I)
  422.     IF J>EXTENT THEN 312
  423.     PRINT:PRINT"Is this the correct entry: ":PRINT:PRINT
  424.     M=I:GOSUB 540    :REM PRINT THE ENTRY
  425.     KY$=DUM$
  426.     INPUT N$:N$=LEFT$(N$,1)
  427.     IF N$="Y" THEN RETURN
  428.  
  429. 312    PRINT:PRINT "Conduct another Search and repeat."
  430.     PRINT:IS=1:RETURN
  431.  
  432. REM        QUIT THE LIBRARY
  433.  
  434. 400    PRINT CHR$(CLEAR.SCREEN)
  435.     PRINT TAB(17);"This session is terminated...Bye!"\
  436.       :PRINT:PRINT:PRINT:PRINT:PRINT
  437.     STOP
  438.  
  439. 410    PRINT TAB(18);"Saving updated index file.":PRINT:PRINT
  440.     PRINT:PRINT
  441.     FOR I=1 TO EXTENT
  442.         PRINT #2,I;INDEX$(I)
  443.     NEXT I
  444.     PRINT #2,I;EOF$
  445.     RETURN
  446.  
  447. REM        SEARCH THE LIBRARY
  448.  
  449. 500    PRINT CHR$(CLEAR.SCREEN)
  450.     FOR J=1 TO MAX.KEYS
  451.         K$(J)=""
  452.     NEXT J
  453.     FOR J=1 TO MAX.KEYS
  454. 501        INPUT "Key: ";K$(J)
  455.         IF LEFT$(K$(J),1)="0" THEN K$(J)="":GOTO 503
  456.         EK=0:GOSUB 140
  457.         IF EK=1 THEN 501
  458.     NEXT J
  459.  
  460. 503    GOSUB 110    :REM CONSTRUCT SEARCH VECTOR
  461.  
  462.     PRINT "If you want hardcopy, type 'YES' "
  463.     INPUT "Otherwise type 'NO'";PRINTER.FLAG$
  464.     PRINTER.FLAG$=LEFT$(PRINTER.FLAG$,1)
  465.     IF PRINTER.FLAG$="Y" THEN\
  466.       LPRINTER:\
  467.       GOSUB 920:\
  468.       GOTO 503.5
  469.     PRINT CHR$(CLEAR.SCREEN)
  470. 503.5    GOSUB 509    :REM PRINT A LINE OF -----'S
  471.     PRINT:GOSUB 910
  472.     IF KY$<>"" THEN 504
  473.     PRINT TAB(13);"Complete Listing of all Entries"
  474.     GOSUB 910:GOTO 505
  475. 504    PRINT"    Library Search for Articles Related to:"
  476.     PRINT:GOSUB 910:GOSUB 910
  477.     FOR II=1 TO (LEN(KY$)/2)
  478.         PRINT TAB(16);"-";
  479.         PRINT TAB(18);
  480.         GOSUB 700    :REM DECODE KEY
  481.         PRINT KEY$(STRING.NO):GOSUB 910
  482.     NEXT II
  483. 505    PRINT:GOSUB 910
  484.     GOSUB 510 :REM SRCH INDX FIL & PRNT SELECTED ENTRIES
  485.     IF NUMBER.SPOOL=0 THEN PRINT TAB(20);\
  486.       "No such articles in Library.":GOSUB 910
  487.     PRINT    :GOSUB 910:GOSUB 509
  488.     REM PRINT A LINE OF ----'S
  489.     PRINT    :PRINT:GOSUB 910:GOSUB 910
  490. 506    IF PRINTER.FLAG$<>"Y" THEN 40
  491.     PRINT:GOSUB 910
  492. 507    CONSOLE
  493.     GOTO 35
  494.  
  495. REM        PRINT A LINE OF -----'S
  496.  
  497. 509    DASHES=64
  498.     IF PRINTER.FLAG$="Y" THEN DASHES=72
  499.     FOR I=1 TO DASHES
  500.         PRINT "-";
  501.     NEXT I
  502.     PRINT:GOSUB 910
  503.     RETURN
  504.  
  505. REM        SEARCH INDEX FILE
  506.  
  507. 510    M=1
  508.     GOSUB 530    :REM CLEAR SPOOL MATRIX
  509. 511    NUMBER.SEARCH.KEYS=(LEN(KY$)/2)
  510.     FOR J=1 TO EXTENT
  511.         IF LINES.PER.PAGE-PRINT.LINE<8 THEN GOSUB 920
  512.         IF INDEX$(J)="0" THEN 519
  513.         IF NUMBER.SEARCH.KEYS=0 THEN 516
  514. 513        NUMBER.INDEX.KEYS=(LEN(INDEX$(J))/2)
  515.         FOR I=1 TO NUMBER.SEARCH.KEYS
  516.             FOR K=1 TO NUMBER.INDEX.KEYS
  517.                 IF MID$(KY$,2*I-1,2)=\
  518.                   MID$(INDEX$(J),2*K-1,2)\
  519.                   THEN 515
  520.             NEXT K
  521.             GOTO 519
  522. 515        NEXT I
  523. 516        SPOOL(M)=J
  524.         GOSUB 540    :REM PRINT ENTRY
  525.         M=M+1
  526. 519        ABORT.FLAG=0
  527.         GOSUB 550    :REM POLL KEYBOARD
  528.         IF ABORT.FLAG=1 THEN 520
  529.     NEXT J
  530. 520    NUMBER.SPOOL=M-1
  531.     RETURN
  532.  
  533. REM        CLEAR SPOOL MATRIX
  534.  
  535. 530    FOR I=1 TO EXTENT
  536.         SPOOL(I)=0
  537.     NEXT I
  538.     RETURN
  539.  
  540. REM        PRINT AN ENTRY
  541.  
  542. 540    READ #1,J;MG$,DATE$,PAGE$,TITLE$,AUTHOR$,DUM$
  543. 541    PRINT M;".";
  544.     PRINT TAB(7);JOURNAL$(VAL(MG$));
  545.     PRINT TAB(25);
  546.     IF LEN(TITLE$)<DASHES-26 THEN PRINT TITLE$:\
  547.       GOSUB 910:GOTO 545
  548.  
  549. REM        BREAK TITLE INTO MULTIPLE LINES
  550.  
  551.     TEMP.TITLE$=TITLE$
  552. 542    FOR JJ=DASHES-26 TO 1 STEP -1
  553.         IF MID$(TEMP.TITLE$,JJ,1)=" " THEN 543
  554.     NEXT JJ
  555. 543    TITLE1$=LEFT$(TEMP.TITLE$,JJ-1)
  556.     TITLE2$=RIGHT$(TEMP.TITLE$,LEN(TEMP.TITLE$)-JJ)
  557.     PRINT TITLE1$:GOSUB 910:PRINT TAB(25);
  558.     IF LEN(TITLE2$)<DASHES-26 THEN PRINT TITLE2$:\
  559.       GOSUB 910:GOTO 545
  560.     TEMP.TITLE$=TITLE2$    :GOTO 542
  561.  
  562. 545    PRINT TAB(7);MONTH$(VAL(RIGHT$(DATE$,2)));" 19";
  563.     PRINT LEFT$(DATE$,2);
  564.     PRINT TAB(25);"by ";AUTHOR$:GOSUB 910
  565.     PRINT TAB(7);"Page ";PAGE$:GOSUB 910
  566.     PRINT:GOSUB 910
  567.     RETURN
  568.  
  569. REM        KEYBOARD POLL ROUTINE TO BREAK LISTING
  570. REM            (TYPE "0" TO ABORT)
  571.  
  572. 550    IF INP(KEYBOARD.STAT.PORT) AND KBDMASK <> KBD.TRUE\
  573.       THEN RETURN
  574.     IF (INP(KEYBOARD.DATA.PORT)AND 127) <> 48 THEN RETURN
  575.     GOSUB 509    :REM PRINT LINE OF DASHES
  576.     IF PRINTER.FLAG$ = "Y" THEN 507
  577.     ABORT.FLAG=1    :RETURN
  578.  
  579. REM        LIST KEYS AND/OR JOURNALS IN LIBRARY
  580.  
  581. 600    PRINT CHR$(CLEAR.SCREEN)
  582.     INPUT "Do you want a list of keys or journals";A$
  583.     PRINT CHR$(CLEAR.SCREEN)
  584.     A$=LEFT$(A$,1)
  585.     IF A$="J" THEN 620
  586.     IF A$<>"K" THEN 35
  587.  
  588. REM        LIST KEYS
  589.  
  590.     FOR I=1 TO NK
  591.         PRINT TAB((((I-INT((I-1)/3)*3)-1)*20)+1);\
  592.           KEY$(I);
  593.         IF INT(I/3)=I/3 THEN PRINT
  594.         IF INT(I/42)=I/42 THEN GOSUB 650
  595.         IF A$="0" THEN GOTO 35
  596.     NEXT I
  597.     IF INT(I/3)=I/3 THEN PRINT
  598.     PRINT    :GOSUB 650    :GOTO 35
  599.  
  600. REM        LIST JOURNALS
  601.  
  602. 620    FOR I=1 TO NM
  603.         PRINT TAB((((I-INT((I-1)/3)*3)-1)*20)+1);\
  604.           JOURNAL$(I);
  605.         IF INT (I/3)= I/3 THEN PRINT
  606.         IF INT(I/42)=I/42 THEN GOSUB 650
  607.     NEXT I
  608.     IF INT(I/3)<>I/3 THEN PRINT
  609.     PRINT    :GOSUB 650    :GOTO 35
  610.  
  611. REM        PAUSE ROUTINE
  612.  
  613. 650    INPUT "Type 'C' to continue";A$
  614.     RETURN
  615.  
  616. REM        DECODE A KEY
  617.  
  618. 700    S1$=MID$(KY$,2*II-1,1):S2$=MID$(KY$,2*II,1)
  619.     IF S1$="0" THEN S1=0:GOTO 720
  620.     S1=(ASC(S1$)-64)*26
  621. 720    IF S2$="0" THEN S2=0    :GOTO 740
  622.     S2=ASC(S2$)-64
  623. 740    STRING.NO=S1+S2
  624.     RETURN
  625.  
  626. REM        SUBSTITUTE "," FOR "/" IN TITLE AND AUTHOR
  627.  
  628. 750    FOR L=1 TO LEN(TITLE$)
  629.         IF MID$(TITLE$,L,1)<>"/" THEN 760
  630.         TIT.LEFT$=LEFT$(TITLE$,L-1)
  631.         TIT.RIGHT$=RIGHT$(TITLE$,(LEN(TITLE$)-L))
  632.         TITLE$=TIT.LEFT$+","+TIT.RIGHT$
  633. 760    NEXT L
  634.     FOR L=1 TO LEN(AUTHOR$)
  635.         IF MID$(AUTHOR$,L,1)<>"/" THEN 770
  636.         AUT.LEFT$=LEFT$(AUTHOR$,L-1)
  637.         AUT.RIGHT$=RIGHT$(AUTHOR$,(LEN(AUTHOR$)-L))
  638.         AUTHOR$=AUT.LEFT$+","+AUT.RIGHT$
  639. 770    NEXT L
  640.     RETURN
  641.  
  642. REM        DISPLAY SIGN-ON MESSAGE
  643.  
  644. 800    PRINT CHR$(CLEAR.SCREEN)
  645.     PRINT "         -------------------------------------"
  646.     PRINT "         | COMPUTER JOURNAL RETRIEVAL SYSTEM |"
  647.     PRINT "         -------------------------------------"
  648.     PRINT    :PRINT    :PRINT
  649.     RETURN
  650.  
  651. REM        WRITE AN ENTRY TO DATA FILE
  652.  
  653. 900    PRINT #1,J;MG$,DATE$,PAGE$,TITLE$,AUTHOR$,KY$
  654.     PRINT #2,J;INDEX$(J)
  655.     RETURN
  656.  
  657.     REM PRINTER LINE INCREMENT
  658.  
  659. 910    IF PRINTER.FLAG$<>"Y" THEN RETURN
  660.     PRINT.LINE=PRINT.LINE+1
  661.     IF PRINT.LINE>66 THEN PRINT.LINE=1
  662.     RETURN
  663.  
  664.     REM FORMFEED
  665.  
  666. 920    IF PRINT.LINE=3 THEN RETURN
  667.     PRINT:GOSUB 910:GOTO 920
  668.  
  669.  
  670. REM            *** DATA SECTION ***
  671.  
  672. REM        JOURNAL LIST
  673.  
  674.     DATA    BYTE,KB,CC,DDJ,PC,IA,0
  675.  
  676. REM        MONTH LIST
  677.  
  678.     DATA    January,February,March,April,May,June
  679.     DATA    July,August,September,October,November
  680.     DATA    December
  681.  
  682. REM        KEY WORD LIST
  683.  
  684.     DATA    8080,6800,6502,1802,68000,8085,8086
  685.  
  686.     DATA    ART,AUTOS,APPLIANCES,ARTIFICIAL INTELLIGENCE
  687.     DATA    APPLE,ATARI,APL,ASSEMBLER,AUDIO,ANIMATION
  688.     DATA    ALGOL,ASCII,ALGORITHM,APPLICATIONS
  689.  
  690.     DATA    BASIC,BALLY,BUSINESS,BENCHMARK,BUS,BOARD
  691.  
  692.     DATA    C,CPU,CLOCK,CROMEMCO,CONSTRUCTION,COBOL
  693.     DATA    CBASIC,CALCULATOR,CASSETTE,COMPILER
  694.     DATA    CRYPTOGRAPHICS,COMPONENTS,CHIPS
  695.  
  696.     DATA    DEBUG,DISASSEMBLER,DISK,DATA,DBMS,DRIVER
  697.     DATA    DOCUMENTATION,DISCUSSION,DESIGN,DIAGNOSTIC
  698.  
  699.     DATA    EDUCATION,EXIDY,EDITING,ELECTRONIC GAMES
  700.     DATA    EXPANSION
  701.  
  702.     DATA    FICTION,FORTRAN,FRONT PANEL,FLEX
  703.     DATA    FILES,FINANCE,FAIRS,FLOWCHARTING
  704.  
  705.     DATA    GRAPHICS,GENEALOGY,GAME,GODBOUT
  706.  
  707.     DATA    HARDWARE,HANDICAPPED,HEATH,HOME,HISTORY
  708.     DATA    HUMOR
  709.  
  710.     DATA    IMSAI,INTERRUPT,ITHICA,I/O,INPUT
  711.     DATA    INTELASM,INTERPRETER,INTERVIEW,INTERFACE
  712.  
  713.     DATA    KEYBOARD,KIM
  714.  
  715.     DATA    LINGUISTICS,LANGUAGE,LARGE,LAW,LEDGER,LISP
  716.  
  717.     DATA    MUSIC,MONITER,MICROPROGRAMMING,MICROPOLIS
  718.     DATA    MAINFRAME,MINICOMPUTER,MBASIC,MACASM
  719.     DATA    MATH,MEMORY,MATRIX,MULTI-TASKING,MISCELLANEOUS
  720.     DATA    MODIFICATION
  721.  
  722.     DATA    NORTHSTAR
  723.  
  724.     DATA    OPERATING SYSTEM,OBJECT,OUTPUT
  725.  
  726.     DATA    PROGRAM,PASCAL,PILOT,PET,PRINTER,PROM,PENCIL
  727.     DATA    PAYROLL,PROCESSING,PROGRAMMING,PACE,PROTECTION
  728.  
  729.     DATA    RS232,RANDOM,ROUTINES,REVIEW,ROBOTICS
  730.     DATA    REAL-WORLD
  731.  
  732.     DATA    SOFTWARE,SYS8,SOL,SWTP,SSM,SD SALES,STRUCTURE
  733.     DATA    STRUCTURED,STACK,S100,SS50,SORT,SORTING,SOURCE
  734.     DATA    SYSTEM,STANDARDS,SECURITY,SOLDERING,SMALL
  735.  
  736.     DATA    TEXT,TEXT EDITOR,TRS80,TARBELL,TERMINAL
  737.     DATA    TELEPHONE,TECHNIQUE,TDLASM,THEORY,TIMESHARING
  738.     DATA    TUTORIAL,TROUBLESHOOTING
  739.  
  740.     DATA    UTILITIES
  741.  
  742.     DATA    VIDEO
  743.  
  744.     DATA    WORD,WORD PROCESSING,WIRE WRAP
  745.  
  746.     DATA    Z80,Z8000
  747.     DATA    A/D,PAPER TAPE,PUZZLE,8008,ARCHETECTURE
  748.     DATA    MICROPROCESSOR,MASS STORAGE,POWER SUPPLY
  749.     DATA    MEDICINE,WEATHER,SIMULATION
  750.  
  751.     DATA    0
  752.