home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib31a.dsk / APRIL.1987 / TAPE.LIBRARY.bas < prev   
BASIC Source File  |  2023-02-26  |  30KB  |  604 lines

  1. 10  REM  **********************
  2. 20  REM  *    TAPE.LIBRARY    *
  3. 30  REM  *  BY MARK DEVANEY   *
  4. 40  REM  * COPYRIGHT (C) 1987 *
  5. 50  REM  * BY MICROSPARC, INC *
  6. 60  REM  * CONCORD, MA  01742 *
  7. 70  REM  **********************
  8. 80  REM 
  9. 90  GOTO 1230: REM  SETUP & MAIN PGM
  10. 100  REM 
  11. 110  REM  *** SUBROUTINE TO GET STRINGS ***
  12. 120  REM 
  13. 130  REM  C MUST = NUMBER OF CHAR TO GET
  14. 140  REM  IF A = 1 INPUT MUST BE ALPHANUMERIC, IF A = 0 THEN INPUT MUST BE #'S, IF A = 2 INPUT MUST BE 'BLANK' OR 'X'
  15. 150  REM  IF ESCAPE THEN ROUTINE WILL CANCEL ITSELF AND CALLING ROUTINE
  16. 160  REM  ALL ANSWERS RETURNED WILL BE IN AG$
  17. 170 AG$ = ""
  18. 180 EG = 0: REM  FLAG, 1= ESCAPE KEY HIT
  19. 190  IF OD$ = U1$  THEN OD$ = "": REM  CLEAR DELETE CODE FROM OLD DATA
  20. 200  FOR L = 1 TO C +1
  21. 210  GOSUB 5980: GET G$
  22. 220  IF L <C +1  AND G$ > CHR$(31)  THEN 360
  23. 230  IF L < >1  THEN 300
  24. 240  IF G$ =  CHR$(27)  THEN EG = 1:L = C +1: GOTO 400: REM  ESCAPE
  25. 250  IF G$ =  CHR$(14)  THEN L = C +1:EG = 2:PN = PN +1: IF PN >12  THEN PN = 1: REM  CTRL 'N' = NEXT
  26. 260  IF G$ =  CHR$(14)  THEN 400
  27. 270  IF G$ =  CHR$(16)  THEN L = C +1:EG = 2:PN = PN -1: IF PN <1  THEN PN = 12: REM  CTRL 'P' = PREVIOUS
  28. 280  IF G$ =  CHR$(16)  THEN 400
  29. 290  IF G$ =  CHR$(9)  THEN L = C +1:AG$ =  CHR$(9): GOTO 400: REM  <CTRL>'I'=MOVE UP A LINE
  30. 300  IF G$ =  CHR$(27)  THEN AG$ = U1$:L = C +1: GOTO 400: REM  ESCAPE ERASE LINE
  31. 310  IF G$ =  CHR$(13)  THEN L = C +1: GOTO 400: REM  <RET>
  32. 320  IF G$ =  CHR$(8)  AND  LEN(AG$) = 1  THEN  CALL  -1008: PRINT U1$;: CALL  -1008:AG$ = "":L = 1: GOTO 210: REM  BACKSPACE AND ERASE IF AT BEGINNING OF INPUT
  33. 330  IF G$ =  CHR$(8)  AND  LEN(AG$) >1  THEN  CALL  -1008: PRINT U1$;: CALL  -1008:AG$ =  LEFT$(AG$,( LEN(AG$) -1)):L = L -1: GOTO 210: REM  BACKSPACE AND ERASE IF NOT AT BEGINNING OF INPUT
  34. 340  IF L = C +1  AND G$ < > CHR$(13)  THEN  PRINT  CHR$(7);: GOTO 210
  35. 350  IF G$ =  CHR$(21)  THEN  IF  MID$ (OD$,L,1) < >""  THEN G$ =  MID$ (OD$,L,1): GOTO 390: REM  RIGHT ARROW
  36. 360  IF A = 2  AND G$ < >" "  AND G$ < >"X"  AND G$ < > CHR$(120)  THEN 210: REM  BLANK & 'X' ONLY
  37. 370  IF A = 1  AND (G$ <" "  OR G$ > CHR$(126))  THEN 210: REM  ANY VISIBLE CHAR
  38. 380  IF A = 0  AND (G$ <"0"  OR G$ >"9")  AND G$ < >"."  THEN 210: REM  NUMBERS ONLY
  39. 390 AG$ = AG$ +G$: PRINT G$;
  40. 400  NEXT 
  41. 410  IF EG = 2  THEN  POP : GOTO 2290
  42. 420  IF EG = 1  THEN  GOSUB 5170: POP : RETURN : REM  ESC KEY, FIND LAST PGM & SET NP(TN)
  43. 430  RETURN 
  44. 440  REM 
  45. 450  REM  *** CHANGE PAGE ONLY ROUTINE ***
  46. 460  REM 
  47. 470  REM  IF ESCAPE THEN ROUTINE WILL CANCEL ITSELF AND CALLING ROUTINE
  48. 480  GET G$
  49. 490  IF G$ =  CHR$(27)  THEN  POP : RETURN : REM  ESCAPE
  50. 500  IF G$ =  CHR$(14)  THEN PN = PN +1: GOTO 530
  51. 510  IF G$ =  CHR$(16)  THEN PN = PN -1: GOTO 530
  52. 520  GOTO 480
  53. 530  IF PN >12  THEN PN = 1
  54. 540  IF PN <1  THEN PN = 12
  55. 550  RETURN : REM  LOOP TO DISPLAY ONLY FORM
  56. 560  REM 
  57. 570  REM  *** LOAD FROM FILE ROUTINE
  58. 580  REM 
  59. 590  IF FM$ = ""  THEN FM$ = "TAPE.LIB.DATA": REM  SET DEFAULT FILE NAME
  60. 600  IF DN$ = ""  OR DN$ =  CHR$(13)  THEN DN$ = "1": REM  DEFAULT DRIVE NUMBER
  61. 610  PRINT D$;"UNLOCK";FM$;",D";DN$
  62. 620  PRINT D$;"OPEN";FM$;",D";DN$
  63. 630  PRINT D$;"READ";FM$
  64. 640  INPUT TA
  65. 650  FOR I = 1 TO TA
  66. 660  INPUT HR$(I): INPUT NP(I): INPUT ET$(I)
  67. 670  INPUT TP$(I,0,1)
  68. 680  VTAB 23: HTAB 22: CALL  -868: PRINT TP$(I,0,1)
  69. 690  FOR K = 1 TO NP(I)
  70. 700  INPUT TP$(I,1,K)
  71. 710 B$ = ""
  72. 720  GET NT$: IF NT$ =  CHR$(13)  THEN 735
  73. 730 B$ = B$ +NT$: GOTO 720
  74. 735 TP$(I,2,K) = B$:B$ = ""
  75. 740  GET NT$: IF NT$ =  CHR$(13)  THEN 750
  76. 745 B$ = B$ +NT$: GOTO 740
  77. 750 TP$(I,3,K) = B$
  78. 760  NEXT K,I
  79. 770  PRINT 
  80. 780  PRINT D$;"CLOSE"
  81. 790  RETURN 
  82. 800  REM 
  83. 810  REM  *** WRITE TO FILE ROUTINE ***
  84. 820  REM 
  85. 830  REM  FM$= FILE NAME
  86. 840  PRINT 
  87. 850  PRINT D$;"OPEN";FM$;",D";DN$
  88. 860  PRINT D$;"CLOSE";FM$
  89. 870  PRINT D$;"DELETE";FM$: REM  REMOVE OLD FILE SO WON'T HAVE PARTS OF IT IN THIS COPY
  90. 880  PRINT D$;"OPEN";FM$
  91. 890  PRINT D$;"WRITE";FM$
  92. 900  PRINT TA
  93. 910  FOR I = 1 TO TA
  94. 920  PRINT HR$(SR(I)): PRINT NP(SR(I)): PRINT ET$(SR(I))
  95. 930  PRINT TP$(SR(I),0,1): REM  TAPE NAME
  96. 940  FOR K = 1 TO NP(SR(I))
  97. 950  FOR J = 1 TO 3
  98. 960  PRINT TP$(SR(I),J,K)
  99. 970  NEXT J,K,I
  100. 980  PRINT D$;"CLOSE"
  101. 990  RETURN 
  102. 1000  REM 
  103. 1010  REM  *** INPUT TAPE ID SUBROUTINE ***
  104. 1020  REM 
  105. 1030  PRINT : PRINT 
  106. 1040  PRINT "TAPE ID LABEL -> ";U3$
  107. 1050 ST =  PEEK(37): VTAB 22: HTAB 1: PRINT "ENTER NUMBERS AND CAPITAL LETTERS ONLY"
  108. 1060  VTAB ST: HTAB 18: REM  PUT CURSOR ON ENTRY LINE
  109. 1070 TN$ = "":EG = 0: REM  FLAG, 1= ESCAPE KEY HIT
  110. 1080  FOR I = 1 TO 4
  111. 1090  GET T$
  112. 1100  IF T$ =  CHR$(13)  AND TN$ < >""  THEN I = 4: GOTO 1170: REM  END IF <RETURN>
  113. 1110  IF T$ =  CHR$(27)  THEN EG = 1:I = 4: GOTO 1170: REM  ESCAPE
  114. 1120  IF T$ =  CHR$(8)  AND  LEN(TN$) = 1  THEN  CALL  -1008: PRINT U1$;: CALL  -1008:TN$ = "":I = 1: GOTO 1090: REM  BACKSPACE AND ERASE IF AT BEGINNING OF INPUT
  115. 1130  IF T$ =  CHR$(8)  AND  LEN(TN$) >1  THEN  CALL  -1008: PRINT U1$;: CALL  -1008:TN$ =  LEFT$(TN$,( LEN(TN$) -1)):I = I -1: GOTO 1090: REM  BACKSPACE AND ERASE IF NOT AT BEGINNING OF INPUT
  116. 1140  IF I = 4  AND T$ < > CHR$(13)  THEN  PRINT  CHR$(7);: GOTO 1090: REM  MUST BE RETURN AFTER 3 CHAR
  117. 1150  IF (T$ <"0"  OR T$ >"9")  AND (T$ <"A"  OR T$ >"Z")  THEN 1090: REM  CHAR. ONLY
  118. 1160  PRINT T$;:TN$ = TN$ +T$
  119. 1170  NEXT I
  120. 1180  IF EG = 1  THEN  POP : RETURN : REM  ESCAPE
  121. 1190  RETURN 
  122. 1200  REM 
  123. 1210  REM  *** SETUP ROUTINE ***
  124. 1220  REM 
  125. 1230 D$ =  CHR$(4)
  126. 1240 UL$ = "":BL$ = "": FOR I = 1 TO 51:UL$ = UL$ + CHR$(95):BL$ = BL$ +" ": NEXT : REM  UNDERLINE CHAR
  127. 1250 U1$ =  CHR$(95):U3$ =  LEFT$(UL$,3):U4$ =  LEFT$(UL$,4): REM  UNDERLINES
  128. 1260 TT = 30: REM  TOTAL POSSIBLE NUMBER OF TAPES
  129. 1270  DIM TP$(TT +1,3,12): REM  NUMBER,TAPE NUMBER/START CNT/TITLE/SAVE?,PGM#
  130. 1280  REM  IF 'SAVE?',1 = "L" THEN TAPE IS LOCKED
  131. 1290  REM  CHARACTER TAPE NUMBER STORED AT TP$(TT,0,1)
  132. 1300 TP$(0,0,1) = "-1": REM  SET FOR END CHECK
  133. 1310  DIM ET$(TT +1): REM  END COUNT FOR EACH TAPE
  134. 1320  DIM HR$(TT +1): REM  HRS LEFT ON EACH TAPE
  135. 1330  DIM NP(TT +1): REM  # OF PGMS ON EACH TAPE
  136. 1340 SA$ = "MDBSL": REM  INITIALS FOR SAVE? COLUMNS (MUST BE 5)
  137. 1350  DIM SR(TT): REM  SORT ARRAY
  138. 1360  PRINT  CHR$(12); CHR$(21): REM  80 COLUMN CARD OFF
  139. 1370  GOSUB 5930: REM  TITLE PAGE
  140. 1380  GOSUB 4690: REM  GET RETURN KEY
  141. 1390  GOSUB 5600: REM  GET FILE NAME & RESTART ENTRY POINT
  142. 1400  VTAB 15: HTAB 10: PRINT "CLEARING DATA ARRAYS": FOR I = O TO TT:SR(I) = I: NEXT : REM INITSORTARRAY
  143. 1410  FOR I = 0 TO TA +1:ET$(I) = "":HR$(I) = "":NP(I) = 0: FOR J = 0 TO 3: FOR K = 0 TO 12:TP$(I,J,K) = "": NEXT K,J,I:TP$(0,0,1) = "-1": REM  NULLS AND ZEROS IN ARRAYS
  144. 1420 TA = 0: REM  ACTUAL NUMBER OF TAPES
  145. 1430  VTAB 19
  146. 1440  PRINT  SPC( 11);: INVERSE : PRINT "LOADING DATA FILE": NORMAL 
  147. 1450  VTAB 23: HTAB 16: PRINT "TAPE: "
  148. 1460  ONERR  GOTO 5310: REM  CHECK FOR NO FILE
  149. 1470  GOSUB 590: REM  LOAD DATA FROM DISK
  150. 1480  POKE 216,0: REM  SET NORMAL ERROR HANDLER
  151. 1490  REM 
  152. 1500  REM  *** MAIN MENU ***
  153. 1510  REM 
  154. 1520  POKE 34,0: POKE 35,24: REM  RESET WINDOWS
  155. 1530  TEXT : HOME :TL$ = "MAIN MENU         ": REM  9 SPACES
  156. 1540  REM 
  157. 1550  INVERSE : HTAB 15: PRINT "MAIN MENU": NORMAL 
  158. 1560  VTAB 6
  159. 1570  PRINT "--> 1) EDIT/ADD INFO"
  160. 1580  PRINT 
  161. 1590  PRINT "    2) SEARCH BY TITLE": REM  4 SPACES HERE & BELOW
  162. 1600  PRINT 
  163. 1610  PRINT "    3) LOCK/UNLOCK A TAPE"
  164. 1620  PRINT 
  165. 1630  PRINT "    4) PRINT LIBRARY LIST"
  166. 1640  PRINT 
  167. 1650  PRINT "    5) ADD/DELETE TAPE ID LABEL"
  168. 1660  PRINT 
  169. 1670  PRINT "    6) SAVE TO DISK & QUIT"
  170. 1680  PRINT 
  171. 1690  PRINT "    7) QUIT WITHOUT SAVING"
  172. 1700 SL = 1: IF TA = 0  THEN  FOR I = 1 TO 4: GOSUB 1850: NEXT : REM  SET MENU POINTER AND SELECT #
  173. 1710  VTAB 24: PRINT "   SELECT BY NUMBER OR USE ARROW KEYS";
  174. 1720  VTAB 22: HTAB 7
  175. 1730  PRINT "SELECT >";
  176. 1740  GET AN$: PRINT AN$
  177. 1750  IF AN$ =  CHR$(21)  OR AN$ =  CHR$(10)  THEN  GOSUB 1850: GOTO 1800: REM  DOWN ARROW
  178. 1760  IF AN$ =  CHR$(8)  OR AN$ =  CHR$(11)  THEN  GOSUB 1870: GOTO 1800: REM  UP ARROW
  179. 1770  IF AN$ =  CHR$(13)  THEN AN$ =  STR$(SL): REM  SELECT
  180. 1780  IF TA = 0  AND AN$ = "7"  THEN  GOSUB 4390: REM  NO DATA TO STORE
  181. 1790  IF TA = 0  AND AN$ < >"5"  THEN  HOME : VTAB 5: HTAB 7: PRINT "THERE ARE NO TAPES ON FILE": GOSUB 4690: GOTO 1520
  182. 1800  IF AN$ <"1"  OR AN$ >"7"  THEN  VTAB 22: HTAB 15: CALL  -868: GOTO 1740
  183. 1810  ON  VAL(AN$) GOSUB 1920,2860,3080,3250,3740,4360,5960
  184. 1820  GOTO 1520: REM  END OF MAIN PGM
  185. 1830  REM 
  186. 1840  REM  MOVE ARROW ROUTINE
  187. 1850  VTAB (4 +2 *SL): PRINT "   ":SL = SL +1: IF SL >7  THEN SL = 1
  188. 1860  GOTO 1880
  189. 1870  VTAB (4 +2 *SL): PRINT "   ":SL = SL -1: IF SL <1  THEN SL = 7
  190. 1880  VTAB (4 +2 *SL): PRINT "-->": RETURN 
  191. 1890  REM 
  192. 1900  REM  *** EDIT/ADD INFO ROUTINE ***
  193. 1910  REM 
  194. 1920 LC$ = "": REM  PAST LOCK/UNLOCK DATA
  195. 1930  POKE 34,0: POKE 35,24: REM  RESET WINDOWS
  196. 1940  HOME : HTAB 15: PRINT "ESCAPE FOR MAIN MENU": INVERSE : VTAB 3: HTAB 9: PRINT "EDIT/ADD INFO  ": NORMAL 
  197. 1950  REM 
  198. 1960  GOSUB 4530: REM  PRINT TAPES AVAILABLE
  199. 1970 ST =  PEEK(37): IF LC$ < >""  THEN  VTAB (ST +6): CALL  -868: PRINT LC$:LC$ = "": POKE 37,ST: REM PUTLASTDATA ON SCREEN
  200. 1980  GOSUB 1030: REM  INPUT
  201. 1990  GOSUB 4450: REM  SEE IF THIS IS VALID # AND SET 'TN'
  202. 2000  IF FLAG = 1  THEN LC$ = "NOT IN LIBRARY LISTING": GOTO 1930
  203. 2010 PN = 1: REM  PROGRAM # POINTER
  204. 2020  HOME : VTAB 3: PRINT 
  205. 2030 TL$ = "EDIT/ADD INFO     ": IF TP$(SR(TN),3,1) = "L"  THEN 2080: REM  TAPE IS LOCKED/ 5 SPACES
  206. 2040  GOSUB 2130: REM  CHANGE INSTRUCTIONS
  207. 2050  GOSUB 2290: REM  FILL IN FORM
  208. 2060  GOTO 2100: REM  5 SPACES
  209. 2070  REM  LOCKED FILE DISPLAY
  210. 2080  GOSUB 2210: REM  LOCKED INSTRUCTIONS
  211. 2090  GOSUB 2790: REM  DISPLAY ONLY DATA /5 SPACES
  212. 2100 TL$ = "MAIN MENU         ": GOSUB 5990: GOTO 1930: REM  END OF EDIT/ADD ROUTINE (EXIT IS ESCAPE-> POP /9 SPACES
  213. 2110  REM 
  214. 2120  REM  CHANGE INSTRUCTIONS
  215. 2130  VTAB 22
  216. 2140  PRINT "CONTROL-I = MOVE UP ONE FIELD."
  217. 2150  PRINT "CONTROL-N = NEXT PROGRAM";: HTAB 26: PRINT "<-- = DELETE"
  218. 2160  PRINT "CONTROL-P = PREV PROGRAM";: HTAB 26: PRINT "--> = COPY CHAR";
  219. 2170  VTAB 3: HTAB 1: POKE 34,2: POKE 35,18: REM  SET WINDOWS
  220. 2180  RETURN 
  221. 2190  REM 
  222. 2200  REM  LOCKED INSTRUCTIONS
  223. 2210  VTAB 1: HTAB 15: PRINT "ESCAPE FOR "TL$;: VTAB 20: HTAB 11: INVERSE : PRINT "TAPE ";TP$(SR(TN),0,1);" IS LOCKED": NORMAL : PRINT 
  224. 2220  PRINT "CONTROL-N = NEXT PROGRAM"
  225. 2230  PRINT "CONTROL-P = PREV PROGRAM"
  226. 2240  VTAB 3: HTAB 1: POKE 34,2: POKE 35,18: REM  SET WINDOWS
  227. 2250  RETURN 
  228. 2260  REM 
  229. 2270  REM  *** FILL IN FORM ROUTINE ***
  230. 2280  REM 
  231. 2290  HOME : GOSUB 4200: REM  DISPLAY FORM
  232. 2300  GOSUB 4970: REM  FILL FORM
  233. 2310  REM 
  234. 2320  REM  GET START CNT
  235. 2330 OD$ = TP$(SR(TN),1,PN): REM  SET OLD DATA
  236. 2340 C = 4:A = 0: GOSUB 170
  237. 2350  IF AG$ = ""  THEN 2420: REM  IF <RET> THEN LEAVE 'AS IS'
  238. 2360  IF AG$ =  CHR$(9)  THEN PN = PN -1: IF PN <1  THEN PN = 12: REM  <CTRL>I
  239. 2370  IF AG$ =  CHR$(9)  THEN  HOME : GOSUB 4200: GOSUB 4970: GOTO 2330
  240. 2380 TP$(SR(TN),1,PN) = AG$: HOME : GOSUB 4200: GOSUB 4970: REM  STORE DATA AND REPRINT SCREEN
  241. 2390  IF AG$ = U1$  THEN  HTAB 14: GOTO 2330: REM  LINE ERASED START OVER
  242. 2400  IF  VAL(TP$(SR(TN),1,PN)) =  > VAL(ET$(SR(TN)))  THEN ET$(SR(TN)) = "":HR$(SR(TN)) = "": REM  DROP LAST CNT & HRS. LEFT IF NEW START CNT IS HIGHER THEN END CNT
  243. 2410  REM 
  244. 2420  REM  GET SHOW TITLE
  245. 2430 OD$ = TP$(SR(TN),2,PN): REM  SET OLD DATA
  246. 2440 C = 51:A = 1: VTAB 9: HTAB 17: GOSUB 170
  247. 2450  IF AG$ = ""  THEN 2500
  248. 2460  IF AG$ =  CHR$(9)  THEN  VTAB 7: HTAB 14: GOTO 2330: REM  UP A LINE
  249. 2470 TP$(SR(TN),2,PN) = AG$: HOME : GOSUB 4200: GOSUB 4970
  250. 2480  IF AG$ = U1$  THEN 2430: REM  LINE ERASED START OVER
  251. 2490  REM 
  252. 2500  REM  GET SAVE?
  253. 2510 OD$ = TP$(SR(TN),3,PN): REM  SET OLD DATA
  254. 2520 C = 5:A = 2: VTAB 12: HTAB 10: GOSUB 170
  255. 2530  IF AG$ = ""  THEN 2580
  256. 2540  IF AG$ =  CHR$(9)  THEN 2430: REM  UP A LINE
  257. 2550 TP$(SR(TN),3,PN) = AG$: HOME : GOSUB 4200: GOSUB 4970
  258. 2560  IF AG$ = U1$  THEN 2510: REM  LINE ERASED START OVER
  259. 2570  REM 
  260. 2580  REM  GET HOURS LEFT
  261. 2590 OD$ = HR$(SR(TN)): REM  SET OLD DATA
  262. 2600 C = 3:A = 0: VTAB 14: HTAB 15: GOSUB 170
  263. 2610  IF AG$ = ""  THEN 2660
  264. 2620  IF AG$ =  CHR$(9)  THEN 2510: REM  UP A LINE
  265. 2630 HR$(SR(TN)) = AG$: HOME : GOSUB 4200: GOSUB 4970
  266. 2640  IF AG$ = U1$  THEN 2590: REM  LINE ERASED START OVER
  267. 2650  REM 
  268. 2660  REM  GET END COUNT
  269. 2670 OD$ = ET$(SR(TN)): REM  SET OLD DATA
  270. 2680 C = 4:A = 0: VTAB 16: HTAB 14: GOSUB 170
  271. 2690  IF AG$ = ""  THEN 2740
  272. 2700  IF AG$ =  CHR$(9)  THEN 2590: REM  UP A LINE
  273. 2710  IF  VAL(AG$) >1  THEN  IF  VAL(AG$) < VAL(TP$(SR(TN),1,PN))  THEN AG$ = U1$: PRINT  CHR$(7): REM  END COUNT MUST BE LARGER THEN START CNT
  274. 2720 ET$(SR(TN)) = AG$
  275. 2730  IF AG$ = U1$  THEN  HOME : GOSUB 4200: GOSUB 4970: GOTO 2670: REM  LINE ERASED START OVER
  276. 2740 PN = PN +1: IF PN >12  THEN PN = 1
  277. 2750  GOTO 2290: REM  END OF FILL FORM ROUTINE EXIT IS ESCAPE -> POP
  278. 2760  REM 
  279. 2770  REM  *** DISPLAY ONLY ROUTINE ***
  280. 2780  REM 
  281. 2790  HOME : GOSUB 4200: REM  DISPLAY FORM
  282. 2800  GOSUB 4970: REM  FILL FORM
  283. 2810  VTAB 23: HTAB 26: GOSUB 480: REM  GET CHANGE PAGE INPUT
  284. 2820  GOTO 2790: REM  EXIT IS ESCAPE
  285. 2830  REM 
  286. 2840  REM  *** SEARCH BY TITLE ROUTINE ***
  287. 2850  REM 
  288. 2860 LC$ = "": REM  ERROR MSGS
  289. 2870  HOME : INVERSE : VTAB 3: HTAB 12: PRINT "SEARCH BY TITLE";: NORMAL 
  290. 2880  PRINT : VTAB 5: PRINT "SEARCH FOR TITLE:": PRINT : PRINT UL$: VTAB 20: HTAB 13: PRINT "ENTER A TITLE": PRINT : HTAB 19: PRINT "OR": PRINT : HTAB 7: PRINT "THE FIRST PART OF A TITLE";: VTAB 7: HTAB 1
  291. 2890 ST =  PEEK(37): IF LC$ < >""  THEN  VTAB ST +6: CALL  -868: PRINT LC$: VTAB ST +8: PRINT "PRESS RETURN TO CONTINUE";: GET Z$: PRINT : VTAB ST +8: PRINT BL$: VTAB ST +6: PRINT  LEFT$(BL$, LEN(LC$)):LC$ = "": VTAB ST +1: REM  DISPLAY ERR MSG
  292. 2900 TN = 0:OD$ = "":C = 51:A = 1:TL$ = "MAIN MENU         ": GOSUB 170: REM  9 SPACES
  293. 2910  IF AG$ = ""  OR AG$ = U1$  THEN LC$ = "INVALID CHARACTER": GOTO 2880
  294. 2920  FOR I = 1 TO TA
  295. 2930  FOR J = 1 TO NP(SR(I))
  296. 2940  IF AG$ =  LEFT$(TP$(SR(I),2,J), LEN(AG$))  THEN TN = I:PN = J:TN$ = TP$(SR(I),0,1):I = TA:J = 12
  297. 2950  NEXT J: NEXT I: HOME 
  298. 2960  IF TN = 0  THEN LC$ = "NO MATCH TO " + CHR$(34) +AG$ + CHR$(34): GOTO 2880
  299. 2970 TL$ = "SEARCH BY TITLE   ": IF TP$(SR(TN),3,1) = "L"  THEN 3020: REM  TAPE IS LOCKED/ 3 SPACES
  300. 2980  GOSUB 2130: REM  INSTRUCTIONS
  301. 2990  GOSUB 2290: REM  CHANGE FORM?
  302. 3000  GOTO 3040
  303. 3010  REM  LOCKED FILE DISPLAY
  304. 3020  GOSUB 2190: REM  LOCKED INSTRUCTIONS
  305. 3030  GOSUB 2790: REM  DISPLAY ONLY DATA
  306. 3040  POKE 35,24: HOME : GOSUB 5990: GOTO 2880: REM  GET NEXT,END OF SEARCH ROUTINE (EXIT IS ESCAPE->POP
  307. 3050  REM 
  308. 3060  REM  *** LOCK/UNLOCK ROUTINE ***
  309. 3070  REM 
  310. 3080 LC$ = "": REM  PAST LOCK/UNLOCK DATA
  311. 3090  HOME : HTAB 15: PRINT "ESCAPE FOR MAIN MENU     ": INVERSE : VTAB 3: HTAB 12: PRINT "LOCK/UNLOCK TAPE";: NORMAL 
  312. 3100  PRINT : GOSUB 4530: REM  DISPLAY TAPE NUMBERS
  313. 3110 ST =  PEEK(37): IF LC$ < >""  THEN  VTAB (ST +6): CALL  -868: PRINT LC$:LC$ = "": POKE 37,ST: REM  PUT LAST DATA ON SCREEN
  314. 3120  GOSUB 1030: REM  GET INPUT
  315. 3130  GOSUB 4450: REM  SEE IF THIS IS VALID # AND SET 'TN'
  316. 3140  IF FLAG = 1  THEN LC$ = "NOT IN LIBRARY LISTING": GOTO 3090
  317. 3150  IF TP$(SR(TN),3,1) = "L"  THEN TP$(SR(TN),3,1) = "":LC$ = "TAPE NUMBER " +TP$(SR(TN),0,1) +" IS UNLOCKED": GOTO 3090
  318. 3160 TP$(SR(TN),3,1) = "L": REM  LOCK TAPE
  319. 3170  FOR I = 2 TO 12
  320. 3180 TP$(SR(TN),3,I) = "": REM  CLEAR REMAINING SAVE INDICATORS
  321. 3190  NEXT 
  322. 3200 LC$ = "TAPE NUMBER " +TP$(SR(TN),0,1) +" IS LOCKED": GOTO 3090
  323. 3210  REM 
  324. 3220  REM  *** PRINTER SUBROUTINE ***
  325. 3230  REM 
  326. 3240  REM  PRINTER SETUP CODES ARE FOR OKIDATA 92/93 PRINTER
  327. 3250  POKE  -16368,0:PF = 0: REM  CLEAR KEYBOARD STROBE & PRINTER STOP FLAG
  328. 3260  HOME : VTAB 5: HTAB 12: INVERSE : PRINT "TURN PRINTER ON": NORMAL 
  329. 3270  PRINT D$;"PR#1": REM  CHECK IF PRINTER IS ON
  330. 3280  PRINT  CHR$(24): REM  RESET PRINTER TO DEFAULT STATE
  331. 3290  PRINT D$;"PR#0"
  332. 3300  HOME : VTAB 10: HTAB 7: PRINT "BE SURE PRINTER IS ON-LINE": VTAB 12: HTAB 4: PRINT "RETURN TO PRINT, ESCAPE TO CANCEL";: GET Z$: PRINT : ON Z$ =  CHR$(27) GOTO 3700: HOME : VTAB 5: CALL  -868: HTAB 13: INVERSE : PRINT "PRINTING DATA": NORMAL 
  333. 3310  VTAB 8: HTAB 6: PRINT "PRESS ESCAPE TO STOP PRINTING"
  334. 3320  PRINT D$;"PR#1"
  335. 3330  PRINT  CHR$(9);"80N": REM  SET PRINTER INTERFACE TO NOT PRINT TO SCREEN
  336. 3340  PRINT  CHR$(27) +"B": REM  SET PRINTER TO 8 LINES PER INCH
  337. 3350 LP = 76: REM  SET LINES PRINTED ON FIRST PAGE
  338. 3360  GOSUB 4770: REM  PRINT HEADER ON PAGE
  339. 3370  FOR I = 1 TO TA
  340. 3380  REM 
  341. 3390  REM  FIGURE BLANK LINES NEEDED
  342. 3400 LI = 1: REM  SET MINIMUM VALUE
  343. 3410  IF NP(SR(I)) <4  THEN LI = 5 -NP(SR(I))
  344. 3420  IF TP$(SR(I),3,1) = "L"  THEN LI = 1: REM  FILE IS LOCKED
  345. 3430  REM 
  346. 3440  REM  FIGURE LINES NEEDED
  347. 3450 LN = (LI +1 +NP(SR(I))) *2: REM  TOTAL LINES PRINTED
  348. 3460  IF LN >LP  THEN  FOR L = 1 TO LP +6: PRINT : NEXT L:LP = 82: GOSUB 4770: REM  LINE FEED TO BOTTOM OF PAGE AND PRINT HEADERS ON NEXT
  349. 3470 LP = LP -LN: REM  REDUCE LINE COUNT
  350. 3480  REM 
  351. 3490  REM  PRINT PAGE
  352. 3500  FOR J = 1 TO NP(SR(I))
  353. 3510  IF J = 1  THEN  PRINT " ";TP$(SR(I),0,1);: REM  TAPE #
  354. 3520  HTAB 5: PRINT "!";TP$(SR(I),1,J);: REM  START CNT
  355. 3530  HTAB 11: PRINT "! ";:PT$ = TP$(SR(I),2,J) +"                                                    ": PRINT  LEFT$(PT$,51);: REM  SHOW TITLE + 51 BLANKS
  356. 3540  IF J = 1  AND TP$(SR(I),3,1) = "L"  THEN  PRINT " !   L!O!C!K!E!D": GOTO 3600
  357. 3550  PRINT " ! ";: IF J = NP(SR(I))  THEN  IF HR$(SR(I)) < >""  THEN PT$ = HR$(SR(I)) +"   ": PRINT  LEFT$(PT$,3);: GOTO 3580
  358. 3560  PRINT "   ";: REM  HRS.LEFT
  359. 3570  IF TP$(SR(I),3,1) = "L"  THEN  PRINT "! ! ! ! !": GOTO 3600
  360. 3580 PT$ = TP$(SR(I),3,J) +"     ": REM  5 SPACES
  361. 3590  FOR K = 1 TO 5: PRINT "!"; MID$ (PT$,K,1);: NEXT K: PRINT : REM  SAVE?
  362. 3600  GOSUB 4880: REM  ADD SEPARATOR LINE
  363. 3610  IF  PEEK( -16384) = 155  THEN J = NP(SR(I)):I = TA:PF = 1: REM  ESCAPE HIT, STOP PRINTING
  364. 3620  NEXT J
  365. 3630  IF PF = 1  THEN 3660: REM  ESCAPE HIT, STOP
  366. 3635  IF NP(SR(I)) = 0  THEN LI = LI -1
  367. 3640  FOR K = 1 TO LI: GOSUB 4860: NEXT K: REM  ADD BLANK LINES
  368. 3650  GOSUB 4910: REM  LAST LINE ROUTINE
  369. 3660  NEXT I
  370. 3670  IF PF = 1  THEN 3690
  371. 3680  PRINT  CHR$(12): REM  FORM FEED
  372. 3690  PRINT D$;"PR#0": REM  PRINTER OFF
  373. 3700  RETURN 
  374. 3710  REM 
  375. 3720  REM  *** ADD/DELETE TAPE IN LIBRARY ***
  376. 3730  REM 
  377. 3740 LC$ = "": REM  PAST DATA
  378. 3750  HOME : HTAB 15: PRINT "ESCAPE FOR MAIN MENU": INVERSE : VTAB 3: HTAB 12: PRINT "ADD/DELETE TAPE";: NORMAL 
  379. 3760  PRINT 
  380. 3770  GOSUB 4530: REM  DISPLAY EXISTING TAPES
  381. 3780 ST =  PEEK(37): IF LC$ < >""  THEN  VTAB (ST +5): CALL  -868: PRINT LC$:LC$ = "": POKE 37,ST: REM  PUT LAST DATA ON SCREEN
  382. 3790  GOSUB 1030: REM  GET INPUT
  383. 3800  GOSUB 4450: REM  SEE IF THIS IS ALREADY USED
  384. 3810  IF FLAG = 0  THEN 4040: REM  IF NAME MATCHES LIST, MUST BE DELETED
  385. 3820  IF TA = TT  THEN LC$ = "LIBRARY FULL, CAN ONLY DELETE TAPE" + CHR$(7): GOTO 3750
  386. 3830  REM 
  387. 3840  REM  FIND WHERE GOES IN ARRAY
  388. 3850  FOR I = TA TO 0  STEP  -1
  389. 3860  IF  VAL(TN$) = 0  THEN  IF TP$(SR(I),0,1) >TN$  THEN 4000
  390. 3870  IF  VAL(TN$) >0  AND  VAL(TP$(SR(I),0,1)) = 0  THEN 4000
  391. 3880  IF  VAL(TN$) >0  AND  VAL(TP$(SR(I),0,1)) > VAL(TN$)  THEN 4000
  392. 3890  IF  VAL(TN$) >0  AND  VAL(TP$(SR(I),0,1)) =  VAL(TN$)  THEN  IF TP$(SR(I),0,1) >TN$  THEN 4000
  393. 3900  IF TA = I  THEN TA = TA +1:TP$(SR(TA),0,1) = TN$:I = 0: GOTO 4000: REM  RAISE COUNT AND PUT NAME IN ARRAY IF > END OF LIST
  394. 3910  REM 
  395. 3920  REM  MAKE SPACE IN ARRAY
  396. 3930 ST = SR(TA +1): REM  STORE BOTTOM POINTER
  397. 3940  FOR J = TA TO I +1  STEP  -1
  398. 3950 SR(J +1) = SR(J)
  399. 3960  NEXT J
  400. 3970  REM 
  401. 3980  REM  SET UP NEW TAPE IN ARRAY
  402. 3990 TA = TA +1:SR(I +1) = ST:TP$(SR(I +1),0,1) = TN$:I = 0
  403. 4000  NEXT I
  404. 4010  GOTO 3740: REM  ANY MORE ADD TAPE ID'S
  405. 4020  REM 
  406. 4030  REM  DELETE TAPE
  407. 4040  PRINT : PRINT : CALL  -868: PRINT "DELETE THIS TAPE? (Y/N) ";: GET AN$: PRINT AN$
  408. 4050  IF AN$ < >"Y"  AND AN$ < > CHR$(121)  THEN 3720
  409. 4060  HOME : VTAB 4: PRINT "ALL DATA WILL BE LOST FOR TAPE ";TN$
  410. 4070  PRINT : PRINT "CONFIRM "; CHR$(34);"DELETE TAPE"; CHR$(34);" (Y/N) ";: GET AN$: PRINT AN$
  411. 4080  IF AN$ < >"Y"  AND AN$ < > CHR$(121)  THEN 3720
  412. 4090  VTAB 15: HTAB 11: INVERSE : PRINT "DELETING TAPE ";TN$: NORMAL 
  413. 4100  FOR K = 0 TO 3: FOR L = 1 TO 12:TP$(SR(TN),K,L) = "": NEXT L,K
  414. 4110 ET$(SR(TN)) = "":HR$(SR(TN)) = "":NP(SR(TN)) = 0
  415. 4120  FOR I = 1 TO TA -1
  416. 4130  IF TP$(SR(I),0,1) = ""  THEN ST = SR(I):SR(I) = SR(I +1):SR(I +1) = ST: REM  PUSH NULL TO BOTTOM OF LIST
  417. 4140  NEXT I
  418. 4150 TA = TA -1: REM  DECREASE TAPE COUNT
  419. 4160  GOTO 3740: REM  SEE IF ANOTHER TAPE
  420. 4170  REM 
  421. 4180  REM  *** DISPLAY INFO LINES ***
  422. 4190  REM 
  423. 4200  PRINT "   TAPE ID ": PRINT 
  424. 4210  PRINT "   PROGRAM # ": PRINT 
  425. 4220  PRINT "   START CNT ";U4$
  426. 4230  PRINT 
  427. 4240  PRINT "   SHOW TITLE:  ";UL$
  428. 4250  PRINT 
  429. 4260  PRINT "   SAVE? ";SA$;"   (X=SAVE <SPACE>=NOSAVE)";
  430. 4270  PRINT 
  431. 4280  PRINT "   HOURS LEFT ";U3$;"      (EX 1.5)": REM  3 SPACES, 6 SPACES
  432. 4290  PRINT 
  433. 4300  PRINT "   END COUNT ";U4$;
  434. 4310  VTAB ( PEEK(37) -12): HTAB 12: REM  PUT CURSOR ON TAPE # AREA
  435. 4320  RETURN 
  436. 4330  REM 
  437. 4340  REM  *** SAVE & END ROUTINE ***
  438. 4350  REM 
  439. 4360  HOME : VTAB 10: HTAB 14: INVERSE : PRINT "SAVING DATA": NORMAL 
  440. 4370  ONERR  GOTO 5440
  441. 4380  GOSUB 830: REM  WRITE TO DISK ROUTINE
  442. 4390  POKE 216,0: HOME : VTAB 5: HTAB 5: PRINT "USE ANOTHER DATA FILE? (Y/N) ";
  443. 4400  GET AN$: PRINT AN$: IF AN$ < >"Y"  AND AN$ < > CHR$(121)  THEN  POP : END 
  444. 4410  POP : HOME : GOTO 1390: REM  START NEW FILE
  445. 4420  REM 
  446. 4430  REM  *** CHECK INPUT AGAINST ACTUAL LIST ***
  447. 4440  REM 
  448. 4450 FLAG = 1: REM  ERROR FLAG, 0 = OK
  449. 4460  FOR I = 1 TO TA
  450. 4470  IF TN$ = TP$(SR(I),0,1)  THEN FLAG = 0:TN = I:I = TA
  451. 4480  NEXT 
  452. 4490  RETURN 
  453. 4500  REM 
  454. 4510  REM  *** DISPLAY EXISTING TAPE #'S IN 3 COLUMNS ***
  455. 4520  REM 
  456. 4530  IF TA = 0  THEN  PRINT : PRINT "NO EXISTING TAPES": RETURN 
  457. 4540 IV =  INT((TA +2)/3): REM  #'S PER COLUMN
  458. 4550  PRINT : FOR I = 1 TO IV
  459. 4560  PRINT TP$(SR(I),0,1);
  460. 4570  IF TP$(SR(I),3,1) = "L"  THEN  PRINT " -LOCKED";
  461. 4580  IF I +IV >TT  THEN  PRINT : NEXT 
  462. 4590  HTAB 15: PRINT TP$(SR(I +IV),0,1);
  463. 4600  IF TP$(SR(I +IV),3,1) = "L"  THEN  PRINT " -LOCKED";
  464. 4610  IF I +IV +IV >TT  THEN  PRINT : GOTO 4650
  465. 4620  HTAB 29: PRINT TP$(SR(I +IV +IV),0,1);
  466. 4630  IF TP$(SR(I +IV +IV),3,1) = "L"  THEN  PRINT " -LOCKED";
  467. 4640  PRINT 
  468. 4650  NEXT : RETURN 
  469. 4660  REM 
  470. 4670  REM  *** ANY KEY TO CONTINUE ROUTINE ***
  471. 4680  REM 
  472. 4690 ST =  PEEK(37): REM  STORE CURSOR POSITION
  473. 4700  VTAB 24: HTAB 9: PRINT "PRESS RETURN TO CONTINUE";
  474. 4710  WAIT  -16384,128: POKE 49168,0: REM  WAIT FOR KEY THEN CLEAR RDY BIT
  475. 4720  HTAB 1: CALL  -868: POKE 37,ST: REM  CLEAR MESSAGE AND RESET CURSOR
  476. 4730  RETURN 
  477. 4740  REM 
  478. 4750  REM  *** PAGE HEADER ROUTINE ***
  479. 4760  REM 
  480. 4770  PRINT "TAPE!START!";: HTAB 32: PRINT "SHOW TITLE                       !HRS.! SAVE?": REM 23BLANKS
  481. 4780  PRINT "  # ! CNT !                                                     !LEFT";: REM  53 BLANKS
  482. 4790  FOR J = 1 TO 5: PRINT "!"; MID$ (SA$,J,1);: NEXT J: PRINT 
  483. 4800  PRINT "====!=====!=====================================================!====!=!=!=!=!=": REM  4!5!53!4 ='S
  484. 4810 LP = LP -3: REM  REDUCE LINE COUNT REMAINING
  485. 4820  RETURN 
  486. 4830  REM 
  487. 4840  REM  *** PRINT SPACE OR SEPARATOR LINE ROUTINE ***
  488. 4850  REM 
  489. 4860  IF K = 1  AND ET$(SR(I)) < >""  THEN ET$(0) = ET$(SR(I)) +"    ": PRINT "    !"; LEFT$(ET$(0),4);" !                                                     !    ! ! ! ! !": GOTO 4880: REM  "4":"4!":"1!53!4!1!1!1!1! SPACES
  490. 4870  PRINT "    !     !                                                     !    ! ! ! ! !": REM  4!5!53!4!1!1!1!1! SPACES
  491. 4880  PRINT "    !-----!-----------------------------------------------------!    !-!-!-!-!-": REM  4 SPACES THEN !5!53! -'S THEN 4 SPACES
  492. 4890  RETURN 
  493. 4900  REM  *** PRINT LAST LINE ROUTINE ***
  494. 4910  PRINT "    !     !                                                     !    ! ! ! ! !": REM  4!5!53!4!1!1!1!1! SPACES
  495. 4920  PRINT "====!=====!=====================================================!====!=!=!=!=!=": REM  4!5!53!4!1!1!1!1!1 ='S
  496. 4930  RETURN 
  497. 4940  REM 
  498. 4950  REM  *** SUBROUTINE TO FILL IN FORM ***
  499. 4960  REM 
  500. 4970  PRINT TN$: REM  TAPE #
  501. 4980  VTAB  PEEK(37) +2: HTAB 14: PRINT PN: REM  PGM #
  502. 4990  VTAB  PEEK(37) +2: HTAB 14: PRINT TP$(SR(TN),1,PN)
  503. 5000  VTAB  PEEK(37) +2: HTAB 17: PRINT TP$(SR(TN),2,PN): REM  SHOW TITLE
  504. 5010  IF  LEN(TP$(SR(TN),2,PN)) >24  THEN  VTAB  PEEK(37): REM  FIX POSITION DUE TO SECOND LINE
  505. 5020  IF TP$(SR(TN),3,1) = "L"  THEN  VTAB  PEEK(37) +3: HTAB 10: PRINT "LOCKED": GOTO 5090: REM SAVE?IFLOCKED
  506. 5030 ST$ = "": REM  TEMP STORE FOR SAVE?
  507. 5040  FOR I = 1 TO 5
  508. 5050  IF  MID$ (TP$(SR(TN),3,PN),I,1) = "X"  OR  MID$ (TP$(SR(TN),3,PN),I,1) =  CHR$(120)  THEN ST$ = ST$ +"X": GOTO 5070
  509. 5060 ST$ = ST$ + MID$ (SA$,I,1)
  510. 5070  NEXT I
  511. 5080  VTAB  PEEK(37) +3: HTAB 10: PRINT ST$: REM  GET SAVE?
  512. 5090  VTAB  PEEK(37) +2: HTAB 15: IF HR$(SR(TN)) = ""  THEN  PRINT : GOTO 5110
  513. 5100  PRINT HR$(SR(TN)): REM  HRS LEFT
  514. 5110  VTAB  PEEK(37) +2: HTAB 14: PRINT ET$(SR(TN)): REM  END COUNT
  515. 5120  VTAB ( PEEK(37) -9): HTAB 14: REM  PUT CURSOR ON START CNT AREA
  516. 5130  RETURN 
  517. 5140  REM 
  518. 5150  REM  *** SUBROUTINE TO FIND LAST PGM ON TAPE AND SET NP(TN) ***
  519. 5160  REM 
  520. 5170  FOR N = 12 TO 1  STEP  -1
  521. 5180  IF TP$(SR(TN),2,N) = ""  THEN 5250
  522. 5190  IF TP$(SR(TN),2,N) = U1$  THEN TP$(SR(TN),2,N) = "": GOTO 5250
  523. 5200 NF = 0: REM  BLANK FLAG 1=NOT BLANK
  524. 5210  FOR T = 1 TO  LEN(TP$(SR(TN),2,N))
  525. 5230  NEXT T
  526. 5240  IF NF = 1  THEN NP(SR(TN)) = N:N = 1: GOTO 5260
  527. 5250  FOR T = 1 TO 3:TP$(SR(TN),T,N) = "": NEXT T
  528. 5260  NEXT N
  529. 5270  RETURN 
  530. 5280  REM 
  531. 5290  REM  *** ERROR HANDLER READ ***
  532. 5300  REM 
  533. 5310  POKE 216,0: REM  SET NORMAL ERROR HANDLER
  534. 5320  PRINT D$;"CLOSE"
  535. 5330 EC =  PEEK(222): REM  GET ERROR CODE
  536. 5340  IF EC < >6  AND (EC < >5  OR TA < >0)  THEN 5390
  537. 5350  HOME : VTAB 5: HTAB 10: INVERSE : PRINT  CHR$(7);"NO DATA FILE ON DISK"; CHR$(7): NORMAL 
  538. 5360  PRINT : PRINT "DO YOU WISH TO OPEN A NEW FILE USING": PRINT : PRINT "FILENAME: ";FM$;"  (Y/N) ";
  539. 5370  GET AN$: PRINT AN$: IF AN$ = "Y"  OR AN$ =  CHR$(121)  THEN  CALL  -3288: RETURN : REM  IF 'Y' CLEAR ERROR ON STACK AND CONTINUE
  540. 5380  GOTO 5400: REM  IF 'N' RESTART
  541. 5390  HOME : VTAB 15: HTAB 10: INVERSE : PRINT  CHR$(7);"ERROR READING DISK"; CHR$(7): NORMAL : PRINT : HTAB 16: PRINT "FIX DISK": PRINT : HTAB 20: PRINT "&": GOSUB 4690
  542. 5400  CALL  -10621: GOTO 1390: REM  CLEAR STACK AND RESTART
  543. 5410  REM 
  544. 5420  REM  *** ERROR HANDLER WRITE ***
  545. 5430  REM 
  546. 5440  POKE 216,0: REM  SET NORMAL ERROR HANDLER
  547. 5450  PRINT D$;"CLOSE"
  548. 5460 EC =  PEEK(222): REM  GET ERROR CODE
  549. 5470  IF EC = 4  OR EC = 8  OR EC = 9  OR EC = 10  THEN  HOME : VTAB 15: INVERSE : PRINT  CHR$(7);: GOSUB 5520: PRINT  CHR$(7): NORMAL : PRINT : HTAB 15: PRINT "FIX DISK &": GOSUB 4690: CALL  -3288: POP : POP : GOTO 1520: REM  RESTART
  550. 5480  RESUME : REM  GIVE PROBLEM TO REGULAR ERROR HANDLER
  551. 5490  REM 
  552. 5500  REM  *** ERROR PRINT ROUTINE ***
  553. 5510  REM 
  554. 5520  IF EC = 4  THEN  HTAB 10: PRINT "DISK WRITE PROTECTED";: GOTO 5560
  555. 5530  IF EC = 8  THEN  HTAB 15: PRINT "I/O ERROR";: GOTO 5560
  556. 5540  IF EC = 9  THEN  HTAB 15: PRINT "DISK FULL";: GOTO 5560
  557. 5550  IF EC = 10  THEN  HTAB 14: PRINT "FILE LOCKED";: GOTO 5560
  558. 5560  RETURN 
  559. 5570  REM 
  560. 5580  REM  *** ENTER FILE NAME ROUTINE ***
  561. 5590  REM 
  562. 5600  HOME :LC$ = "": REM  ERROR LINE
  563. 5610  VTAB 5: PRINT "ENTER DRIVE # FOR DATA FILE (1/2) >";: INVERSE : PRINT "1";: NORMAL : HTAB 36: GET DN$: PRINT DN$:DN =  VAL(DN$): IF DN$ =  CHR$(13)  THEN DN = 1
  564. 5620  IF DN <1  OR DN >2  THEN  VTAB ( PEEK(37)): CALL  -868: GOTO 5610
  565. 5630  VTAB 10: HTAB 1: CALL  -958: REM  CLEAR SCREEN CURSOR TO BOTTOM
  566. 5640  PRINT "ENTER DATA FILE NAME: "; LEFT$(UL$,15)
  567. 5650  VTAB 18: CALL  -868: INVERSE : PRINT LC$: NORMAL 
  568. 5660  VTAB 20: PRINT "TYPE ? TO SEE CATALOG": PRINT 
  569. 5670  PRINT "<RETURN> FOR DEFAULT 'TAPE.LIB.DATA'"
  570. 5680  VTAB 10: HTAB 23: REM  PUT CURSOR ON BEGINNING OF LINE
  571. 5690 FM$ = "": REM  CLEAR FILE NAME
  572. 5700  FOR I = 1 TO 16
  573. 5710  GET T$
  574. 5720  IF T$ = "?"  THEN  PRINT T$:I = 16: GOTO 5810
  575. 5730  IF T$ =  CHR$(13)  THEN I = 16: GOTO 5810: REM  END IF <RETURN>
  576. 5740  IF T$ =  CHR$(8)  AND  LEN(FM$) = 1  THEN  CALL  -1008: PRINT U1$;: CALL  -1008:FM$ = "":I = 1: GOTO 5710: REM  BACKSPACE AND ERASE IF AT BEGINNING OF INPUT
  577. 5750  IF T$ =  CHR$(8)  AND  LEN(FM$) >1  THEN  CALL  -1008: PRINT U1$;: CALL  -1008:FM$ =  LEFT$(FM$,( LEN(FM$) -1)):I = I -1: GOTO 5710: REM  BACKSPACE AND ERASE IF NOT AT BEGINNING OF INPUT
  578. 5760  IF I = 16  AND T$ < > CHR$(13)  THEN  PRINT  CHR$(7);: GOTO 5710: REM  MUST BE RETURN AFTER 15 CHAT.
  579. 5770  IF I = 1  AND (T$ <"A"  OR T$ >"Z")  THEN 5710: REM  FIRST CHAR MUST BE ALPHA.
  580. 5780  IF T$ = ","  THEN 5710: REM  CAN NOT HAVE COMMA
  581. 5790  IF T$ <"!"  OR T$ >"^"  THEN 5710: REM  CHAR. ONLY
  582. 5800  PRINT T$;:FM$ = FM$ +T$
  583. 5810  NEXT I
  584. 5820  IF T$ = "?"  THEN 5860
  585. 5830  IF FM$ = ""  THEN  VTAB 10: HTAB 23: PRINT "TAPE.LIB.DATA"
  586. 5840  VTAB 12: HTAB 1: CALL  -958: REM  CLEAR SCREEN CURSOR TO BOTTOM
  587. 5850  RETURN 
  588. 5860  ONERR  GOTO 5310: REM  SET ERROR HANDLER
  589. 5870  HOME : PRINT  CHR$(4); LEFT$("CATALOG",7 -4 *( PEEK(48896) = 76));",D";DN: GOSUB 4690
  590. 5880  POKE 216,0: REM  RESET TO NORMAL ERROR HANDLER
  591. 5890  HOME : GOTO 5600
  592. 5900  REM 
  593. 5910  REM  *** TITLE PAGE ***
  594. 5920  REM 
  595. 5930  TEXT : HOME : NORMAL 
  596. 5940  VTAB 10: HTAB 6: PRINT "TAPE LIBRARY BY MARK DEVANEY": PRINT : HTAB 3: PRINT "COPYRIGHT 1987 BY MICROSPARC, INC"
  597. 5950  RETURN 
  598. 5960  HOME : VTAB 10: PRINT "QUIT WITHOUT SAVING": VTAB 12: INPUT "ARE YOU SURE? ";YN$: IF YN$ < >"Y"  AND YN$ < > CHR$(121)  THEN  RETURN 
  599. 5970  GOTO 4390
  600. 5980  IF L = LX GOTO 6020
  601. 5990 ST =  PEEK(37):SH =  PEEK(36): IF L = 1  THEN  VTAB 1: HTAB 15: PRINT "ESCAPE FOR "TL$;: GOTO 6010
  602. 6000  VTAB 1: HTAB 15: PRINT "ESCAPE TO CLEAR FIELD       ";: REM  7 SPACES
  603. 6010 LX = L: VTAB ST +1: HTAB SH +1
  604. 6020  RETURN