home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib37a.dsk / JULY.1989 / MENUPRO.bas < prev    next >
BASIC Source File  |  2023-02-26  |  23KB  |  460 lines

  1. 10  REM  ***************************
  2. 20  REM  *        MenuPro          *
  3. 30  REM  *     By Juan S. Lach     *
  4. 40  REM  *    Copyright(c)  1989   *
  5. 50  REM  *   MindCraft Publ. Corp. *
  6. 60  REM  *    Concord, Ma 01742    *
  7. 70  REM  *************************** 
  8. 80  ONERR  GOTO 4530
  9. 90  REM 
  10. 100  REM   All flags:
  11. 110  REM 
  12. 120 TXT = 0:BAS = 1:BIN = 1:SYS = 1:VAR = 0:DIR = 1: REM 0=RUN,1=DON'T 
  13. 130 PIC = 1: REM  0= DON'T DISPLAY PIC, 1=DISPLAY PIC, 2= DISPLAY ASKING
  14. 140 TF = 0: REM   0 = Normal clock, 1=24 hour clock
  15. 150 CRE = 0: REM   0= Show modification date, 1= Show creation date
  16. 160  REM 
  17. 170  REM   Main program:
  18. 180  REM 
  19. 190 D$ =  CHR$(4): TEXT : PRINT D$;"PR#3": PRINT  CHR$(18)
  20. 200  HOME : POKE 1403,33: PRINT "MenuPro"
  21. 210  POKE 1403,30: PRINT "By Juan S. Lach"
  22. 220  POKE 1403,29: PRINT "Copyright(c) 1989"
  23. 230  POKE 1403,28: PRINT "MindCraft Publ. Corp."
  24. 240  POKE 1403,29: PRINT "Concord, MA 01742"
  25. 250  VTAB 12: POKE 1403,30: PRINT "Reading catalog ";
  26. 260  ONERR  GOTO 280
  27. 270  PRINT D$;"DELETE PRGM.EXEC": GOTO 290
  28. 280  POKE 216,0
  29. 290  ONERR  GOTO 4530
  30. 300  GOSUB 2240: REM   Configure Printer & Interface
  31. 310  POKE 34,2: IF SE = 1  THEN SE = 0: RESTORE :CP = 0:PG = 0:INF = 0:B1 = 0: GOSUB 3620: GOTO 330
  32. 320  DIM M$(80),TY$(80),L$(80),SB$(80),TM$(80),T1$(18): GOSUB 3620
  33. 330 CP = 1:V = 6:OA = 49249:Z =  PEEK(64448): IF Z = 224  THEN Z = 0
  34. 340  POKE 1403,30: VTAB 22: PRINT "Press Return to continue";: GET A$: HOME 
  35. 350  GOSUB 2570: REM   Get Time
  36. 360  IF SE < >1  THEN 390
  37. 370  ONERR  GOTO 4530
  38. 380  GOTO 420
  39. 390  IF Z < >0  THEN 410
  40. 400  VTAB 5: POKE 1403,0: PRINT  CHR$(27); CHR$(15);: FOR J = 1 TO 80: PRINT "S";: NEXT : PRINT  CHR$(14); CHR$(24);: GOTO 420
  41. 410  VTAB 5: POKE 1403,0: FOR J = 1 TO 80: PRINT "=";: NEXT 
  42. 420  VTAB 4: POKE 1403,1: PRINT "Name of file";: POKE 1403,19: PRINT "Type of file";: POKE 1403,41: PRINT "Time";: POKE 1403,56: PRINT "SIZE:  (Bytes) (Blocks)"
  43. 430  IF SE = 1  THEN SE = 0: GOTO 460
  44. 440  GOSUB 3820: REM   Get types & convert them
  45. 450  POKE 34,0: VTAB 1: POKE 1403,0: CALL  -868
  46. 460  VTAB 6: CALL  -958
  47. 470  POKE 34,5: HOME : IF B <15  THEN 510
  48. 480  FOR T = 1 TO 14: GOSUB 4110: NEXT : REM  Print first 14 filenames
  49. 490 PG = B/14: IF PG < > INT(PG)  THEN PG =  INT(PG):PG = PG +1
  50. 500  GOTO 520
  51. 510  FOR T = 1 TO B: GOSUB 4110: NEXT : REM  Print all filenames (if < 15)
  52. 520  GOSUB 4280: PRINT "Prefix: ";PF$
  53. 530  IF Z = 0  THEN  PRINT  CHR$(27);
  54. 540  PRINT  CHR$(15);"A"; CHR$(14);"-? for Help.";
  55. 550  IF Z = 0  THEN  PRINT  CHR$(24);
  56. 560  POKE 1403,18: PRINT "Total files: ";B;"  Total blocks: ";TB$;: POKE 1403,56: PRINT "Blocks remaining: ";BR$
  57. 570  GOSUB 2680: REM   PRINT DATE AND TIME
  58. 580  IF UT = 1  THEN 3010
  59. 590  VTAB 23: PRINT "Commands: L)oad  N)ormal  P)refix  U)tilities         Q)uit  [<RETURN> = R)un]"
  60. 600  IF PG = 0  THEN PG = 1:SE = 2: REM  PG = 1 for printing page numbers.
  61. 610  POKE 34,0: VTAB 1: POKE 1403,67: PRINT "Page ";CP;" of ";PG;".": POKE 34,5
  62. 620  IF SE = 2  THEN SE = 0:PG = 0: REM  Restore original PG value
  63. 630  IF INF = 1  THEN 650: REM   Device info is already on the screen
  64. 640  GOSUB 2340: REM  Get device information.
  65. 650  INVERSE : VTAB V
  66. 660  PRINT M$((V -5) +B1): REM  Print cursor bar
  67. 670 P =  PEEK( -16384): IF P <128  THEN 670: REM  Get keystroke
  68. 680  POKE  -16368,0: NORMAL : VTAB V: REM  Delete cursor bar
  69. 690  PRINT M$((V -5) +B1): IF P >225  THEN P = P -32
  70. 700  IF P = 141  THEN P = 255: REM   Parse <Return> as a code = 255
  71. 710  IF P = 155  THEN P = 254: REM  Parse <Escape> as code = 254
  72. 720  IF P >192  THEN 820: REM  Codes greater than 192 parse in line 840
  73. 730  IF CP = PG  THEN  IF P = 138  THEN V = V +1: IF V >(B3 +5)  THEN V = 6: GOTO 990: REM  Down arrow pressed; last page is being used
  74. 740  IF CP = PG  THEN 760
  75. 750  IF PG >1  THEN  IF P = 138  THEN V = V +1: IF V >19  THEN V = 6: GOTO 990: REM  Down arrow, move down or advance 1 page; page > 1 is being viewed
  76. 760  IF P = 139  THEN V = V -1: IF V = 5  THEN V = 6: GOTO 1120: REM  Up arrow
  77. 770  IF PG >1  THEN 790
  78. 780  IF P = 138  THEN V = V +1: IF V >B +5  THEN V = 6: REM  Down arrow
  79. 790  IF (P = 191  OR P = 175)  AND  PEEK(OA) >127  THEN 4320: REM  Apple-?
  80. 800  IF (P >176  AND P <186)  AND  PEEK(OA) >127  THEN 4160: REM  Apple-num
  81. 810  GOTO 650: REM  Loop back to display cursor
  82. 820  IF P = 196  AND  PEEK(OA) >127  THEN 2800: REM  Apple-D (Dump)
  83. 830  IF P = 194  AND  PEEK(OA) >127  THEN V = 6: GOTO 650: REM  Apple-B
  84. 840  IF P = 197  AND  PEEK(OA) >127  THEN  IF CP = PG  THEN V = B3 +5: GOTO 650: REM  Apple-E
  85. 850  IF P = 197  AND  PEEK(OA) >127  THEN  IF PG = 0  THEN V = B +5: GOTO 650: REM  Also Apple-E
  86. 860  IF P = 197  AND  PEEK(OA) >127  THEN V = 19: GOTO 650
  87. 870  IF P = 254  THEN 4430
  88. 880  IF UT = 1  THEN 3040: REM  If utilities, parse other commands
  89. 890  IF P = 255  OR P = 210  THEN 1420: REM  Run
  90. 900  IF P = 208  THEN 1270: REM  Prefix
  91. 910  IF P = 204  THEN 1630: REM  Load
  92. 920  IF P = 206  THEN 2000: REM  Normal catalog
  93. 930  IF P = 209  THEN 2110: REM  Quit
  94. 940  IF P = 213  THEN  GOTO 3000: REM  Set up Utilities menu
  95. 950  GOTO 650
  96. 960  REM 
  97. 970  REM  Display next page
  98. 980  REM 
  99. 990  IF PG <2  THEN  GOTO 650
  100. 1000  POKE 35,20: HOME : VTAB 6: POKE 1403,0
  101. 1010 CP = CP +1: IF CP >PG  THEN CP = 1
  102. 1020  IF CP >2  THEN B1 = B1 +14
  103. 1030  IF CP = 2  THEN B1 = 14
  104. 1040  IF CP = 1  THEN B1 = 0
  105. 1050 V = 6:B2 = B1 +14: IF B2 >B  THEN B2 = B:B3 = B -B1
  106. 1060  IF B2 -B1 = 14  THEN B3 = 14
  107. 1070  FOR T = B1 +1 TO B2: GOSUB 4110: NEXT 
  108. 1080  POKE 35,24: GOTO 600
  109. 1090  REM 
  110. 1100  REM  Display previous page
  111. 1110  REM 
  112. 1120  IF PG <2  THEN V = B +5: GOTO 650
  113. 1130  POKE 35,20: HOME : VTAB 6: POKE 1403,0
  114. 1140 CP = CP -1: IF CP <1  THEN CP = PG
  115. 1150  IF CP >1  THEN B1 = 14 *(CP -1)
  116. 1160  IF PG >1  THEN V = 19: GOTO 1180
  117. 1170 V = B +5
  118. 1180  IF CP = 1  THEN B1 = 0
  119. 1190 B2 = B1 +14: IF B2 >B  THEN B2 = B:B3 = B -B1
  120. 1200  IF B2 -B1 = 14  THEN B3 = 14
  121. 1210  IF CP = PG  THEN V = B3 +5
  122. 1220  FOR T = B1 +1 TO B2: GOSUB 4110: NEXT 
  123. 1230  POKE 35,24: GOTO 600
  124. 1240  REM 
  125. 1250  REM  Set new prefix
  126. 1260  REM 
  127. 1270  GOSUB 4280: PRINT "Current prefix: ";PF$
  128. 1280  PRINT "Enter new prefix [<Return> to quit]: ";
  129. 1290  GOSUB 4210: REM   GET INPUT
  130. 1300  IF SE = 1  AND X$ = ""  THEN  PRINT  CHR$(21): HOME : END 
  131. 1310  IF X$ = ""  THEN 520
  132. 1320  ONERR  GOTO 1350
  133. 1330  PRINT D$;"PREFIX ";X$: POKE 216,0:SE = 1: ONERR  GOTO 4530
  134. 1340  GOTO 190
  135. 1350  IF  PEEK(222) = 6  THEN  GOSUB 4280: PRINT "Incorrect prefix": GOSUB 4250: POKE 216,0: GOTO 1270
  136. 1360  IF  PEEK(222) = 3  THEN  GOSUB 4280: PRINT "The requested device is not found": GOSUB 4250: POKE 216,0: GOTO 1270
  137. 1370  IF  PEEK(222) = 7  THEN  GOSUB 4280: PRINT "Volume mismatch": GOSUB 4250: POKE 216,0: GOTO 1270
  138. 1380  GOSUB 4280: PRINT "Error number "; PEEK(222): GOSUB 4250: POKE 216,0: GOTO 1270
  139. 1390  REM 
  140. 1400  REM  Run
  141. 1410  REM 
  142. 1420  GOSUB 4130
  143. 1430  IF R1$ = T1$(15)  OR R1$ = T1$(16)  THEN 520
  144. 1440  PRINT D$;"VERIFY ";R$
  145. 1450  IF R1$ = T1$(3)  THEN 1500: REM  Basic File
  146. 1460  IF PIC = 0  THEN 1470
  147. 1470  IF R1$ = T1$(5)  OR R1$ = T1$(8)  OR R1$ = T1$(2)  THEN 1520: REM   SYS,BIN or TXT
  148. 1480  IF R1$ = T1$(1)  THEN 1590: REM  Directory
  149. 1490  GOSUB 4280: PRINT "Not a runable file.": GOSUB 4250: GOTO 520
  150. 1500  IF BAS = 0  THEN 1680
  151. 1510  PRINT  CHR$(21): TEXT : HOME : POKE 103,1: POKE 104,8: PRINT D$;"RUN";R$
  152. 1520  IF R1$ = T1$(5)  AND BIN = 0  THEN 1680
  153. 1530  IF R1$ = T1$(8)  AND SYS = 0  THEN 1680
  154. 1540  IF R1$ = T1$(2)  AND TXT = 0  THEN 1680
  155. 1550  PRINT D$;"OPEN PRGM.EXEC": PRINT D$;"WRITE PRGM.EXEC"
  156. 1560  PRINT "POKE 103,1:POKE104,8:NEW": PRINT "-";R$: PRINT D$;"CLOSE PRGM.EXEC
  157. 1570  PRINT  CHR$(21): TEXT : HOME 
  158. 1580  PRINT D$;"EXEC PRGM.EXEC": END 
  159. 1590  IF DIR = 0  THEN 1680
  160. 1600  PRINT D$;"PREFIX";PF$;R$
  161. 1610 SE = 1: GOTO 190: REM  READ CATALOG AGAIN
  162. 1620  REM   Load
  163. 1630  GOSUB 4130
  164. 1640  IF R1$ = T1$(1)  THEN  GOSUB 4280: PRINT "Directories can't be loaded.": GOSUB 4250
  165. 1650  IF R1$ = T1$(2)  THEN  GOSUB 4280: PRINT "Text files can't be loaded.": GOSUB 4250
  166. 1660  IF R1$ = T1$(1)  OR R1$ = T1$(2)  OR R1$ = T1$(16)  OR R1$ = T1$(15)  THEN 520
  167. 1670  PRINT D$;"VERIFY ";R$
  168. 1680  IF R1$ = T1$(3)  THEN 1720: REM   BAS file
  169. 1690  IF R1$ = T1$(4)  THEN 1750: REM   VAR file
  170. 1700  IF R1$ = T1$(5)  OR R1$ = T1$(8)  THEN 1800: REM   BIN OR SYS FILE
  171. 1710  GOSUB 4280: PRINT "Not able to load this file.": GOSUB 4250: GOTO 520
  172. 1720  IF BAS = 0  THEN 1680
  173. 1730  PRINT  CHR$(21): TEXT : HOME : POKE 103,1: POKE 104,8: PRINT D$;"LOAD "R$
  174. 1740  REM 
  175. 1750  IF VAR = 0  THEN 1680
  176. 1760  PRINT D$;"OPEN PRGM.EXEC": PRINT D$;"WRITE PRGM.EXEC"
  177. 1770  PRINT "NEW": PRINT "RESTORE";R$
  178. 1780  PRINT D$;"CLOSE PRGM.EXEC": PRINT  CHR$(21)
  179. 1790  TEXT : HOME : PRINT D$;"-PRGM.EXEC"
  180. 1800  GOSUB 4280: PRINT "Load address [0=Default address, RETURN to quit]: ";: GOSUB 4210
  181. 1810  IF X$ = ""  THEN 520
  182. 1820 X =  VAL(X$): IF X = 0  AND R1$ = T1$(8)  THEN X = 8192: GOTO 1870
  183. 1830  IF X = 0  THEN 1870
  184. 1840  IF (X <2048  OR X >36864)  OR (X <768  OR X >975)  THEN 1800
  185. 1850  IF X >2047  AND X + VAL(L$) >36864  THEN 1940
  186. 1860  IF X >767  AND X + VAL(L$) >975  THEN 1940
  187. 1870  IF R1$ = T1$(5)  THEN HT$ = "BIN": GOTO 1890
  188. 1880 HT$ = "SYS"
  189. 1890  GOSUB 4280: IF X >767  AND X <2048  THEN  PRINT D$;"BLOAD";R$;",A";X: END 
  190. 1900  PRINT D$;"OPEN PRGM.EXEC": PRINT D$;"WRITE PRGM.EXEC"
  191. 1910  PRINT "NEW": IF X = 0  THEN  PRINT "BLOAD";R$: GOTO 1930
  192. 1920  PRINT "BLOAD";R$;",A";X
  193. 1930  PRINT D$;"CLOSE PRGM.EXEC": TEXT : HOME : GOTO 4600
  194. 1940  IF 2048 + VAL(L$) >36864  THEN  GOSUB 4280: PRINT "File too large to be loaded.": GOTO 1960
  195. 1950  GOSUB 4280: PRINT "File too large, try loading it at another location."
  196. 1960  GOSUB 4250: GOTO 520
  197. 1970  REM 
  198. 1980  REM   Normal catalog
  199. 1990  REM 
  200. 2000  POKE 34,2: HOME 
  201. 2010  IF Z = 0  THEN  PRINT  CHR$(27); CHR$(15);: VTAB 5: POKE 1403,0: FOR T = 1 TO 80: PRINT "S";: NEXT : PRINT  CHR$(14); CHR$(24);: GOTO 2030
  202. 2020  VTAB 5: POKE 1403,0: FOR T = 1 TO 80: PRINT "=";: NEXT 
  203. 2030  POKE 34,5: VTAB 22: CALL  -868: PRINT "Press Control-S to pause, Control-C to stop."
  204. 2040  POKE 35,21: VTAB 6: POKE 1403,0: ONERR  GOTO 2060
  205. 2050  PRINT D$;"CATALOG"
  206. 2060  POKE 216,0: ONERR  GOTO 4530
  207. 2070 SE = 1: POKE 35,24: VTAB 23: POKE 1403,0: GOSUB 4250:CP = 1: GOTO 350
  208. 2080  REM 
  209. 2090  REM  Quit
  210. 2100  REM 
  211. 2110  GOSUB 4280: PRINT "Are you sure (Y/N)?";: GET A$: IF A$ < >"Y"  AND A$ < >"y"  THEN 520
  212. 2120  GOSUB 4280: PRINT "Return to BASIC (Y/N)?";: GET A$: IF A$ < >"Y"  AND A$ < >"y"  THEN 2140
  213. 2130  PRINT  CHR$(21): TEXT : HOME : END 
  214. 2140  PRINT D$;"PREFIX/"
  215. 2150  IF  PEEK(49149) >0  THEN  PRINT D$;"BYE"
  216. 2160  FOR T = 768 TO 778: READ A: POKE T,A: NEXT : CALL 768
  217. 2170  REM 
  218. 2180  REM  Configure printer port (Change it to your own configuration)
  219. 2190  REM 
  220. 2200  REM  This program contains the configuration for an Apple IIc
  221. 2210  REM  printer port 1: 7 Data bits, 1 stop bit, 4800 baud, no parity
  222. 2220  REM   no echo, LF after CR & 80 columns.
  223. 2230  REM 
  224. 2240  POKE 49153,0
  225. 2250  POKE 1144,60: REM  7 D. bits, 1 stop; 4800 baud
  226. 2260  POKE 1145,107: REM  even parity
  227. 2270  POKE 1146,64: REM  no echo, LF after CR
  228. 2280  POKE 1147,80: REM  80 characters before CR
  229. 2290  REM 
  230. 2300  RETURN 
  231. 2310  REM 
  232. 2320  REM  Get what type of drive & computer we're using
  233. 2330  REM 
  234. 2340  POKE 34,1: VTAB 2: POKE 1403,0:D = 1
  235. 2350  GOSUB 2380
  236. 2360  PRINT "Device used: ";DS$;" at slot ";SL;", drive ";D;" in an ";A$
  237. 2370  POKE 34,5:INF = 1: RETURN 
  238. 2380 I =  PEEK(48944): IF I >127  THEN D = 2:I = I -128
  239. 2390 SL = I/16
  240. 2400  POKE 768,165: POKE 769,6: POKE 770,41: POKE 771,240: POKE 772,133: POKE 773,6: POKE 774,165: POKE 775,7: POKE 776,41: POKE 777,15: POKE 778,133: POKE 779,7: POKE 780,96
  241. 2410  POKE 789,169: POKE 790,00: POKE 791,141: POKE 792,39: POKE 793,3: POKE 794,56: POKE 795,32: POKE 796,31: POKE 797,254: POKE 798,144: POKE 799,1: POKE 800,96: POKE 801,169: POKE 802,1: POKE 803,141: POKE 804,39: POKE 805,3: POKE 806,96
  242. 2420 C =  PEEK(48945): FOR T = 1 TO (C -1) *2
  243. 2430 DX =  PEEK(48945 +T): POKE 6,DX: POKE 7,DX: CALL 768
  244. 2440 DX =  PEEK(6): IF DX = I  THEN T = C *2
  245. 2450  NEXT 
  246. 2460 DX =  PEEK(7): IF DX = 0  THEN DS$ = "Disk ][": GOTO 2530
  247. 2470  IF DX = 4  THEN DS$ = "Profile": GOTO 2530
  248. 2480  IF DX = 15  THEN DS$ = "Ramdisk": GOTO 2530
  249. 2490  IF DX = 11  THEN DS$ = "3.5 Disk": GOTO 2530
  250. 2500  IF DX = 13  THEN DS$ = "3.5 Disk": GOTO 2530
  251. 2510  IF DX = 5  THEN DS$ = "Hard Drive": GOTO 2530
  252. 2520 DS$ = "Unknown"
  253. 2530  CALL 789: IF  PEEK(807) = 1  THEN A$ = "APPLE IIGS": RETURN 
  254. 2540  IF  PEEK(807) = 0  THEN QZ =  PEEK(64435) + PEEK(64448):A$ = "APPLE II" + MID$ ("C    E-ENHE-OLDPLUS ",1 +5 *((QZ >229) +(QZ >239) +(QZ >240)),5): REM  4 SPACES AFTER C:RETURN
  255. 2550  REM 
  256. 2560  REM  This routine reads the time into MM$,YY,DD,HH & MI:
  257. 2570 MN$ = "---JanFebMarAprMayJunJulAugSepOctNovDec"
  258. 2580 DD =  PEEK(49040) - INT( PEEK(49040)/32) *32
  259. 2590 YY =  INT( PEEK(49041)/2):MM = ( PEEK(49041) -YY *2) *8 + INT( PEEK(49040)/32)
  260. 2600 MM$ =  MID$ (MN$,MM *3 +1,3)
  261. 2610 MI =  PEEK(49042):HH =  PEEK(49043)
  262. 2620  IF TF = 1  THEN  RETURN 
  263. 2630  IF HH >11  THEN PM = 1
  264. 2640  IF HH >12  THEN HH = HH -12
  265. 2650  IF HH = 0  THEN HH = 12
  266. 2660  RETURN 
  267. 2670  REM  This routine prints the date and time on the screen
  268. 2680  POKE 34,0: VTAB 1: POKE 1403,0: PRINT "Date: ";
  269. 2690  IF DD = 0  THEN  PRINT "<No Date>": POKE 34,5: RETURN 
  270. 2700  PRINT DD;"/";MM$;"/";: IF YY <10  THEN  PRINT "0";
  271. 2710  PRINT YY;"  ";: IF HH <10  THEN  PRINT "0";
  272. 2720  PRINT HH;":";: IF MI <10  THEN  PRINT "0";
  273. 2730  PRINT MI;: IF TF = 1  THEN 2760
  274. 2740  IF PM = 1  THEN  PRINT " PM": GOTO 2760
  275. 2750  PRINT " AM"
  276. 2760  POKE 34,5: RETURN 
  277. 2770  REM 
  278. 2780  REM  Dump the catalog to a printer
  279. 2790  REM 
  280. 2800  GOSUB 4280: PRINT "Press space bar to print; Escape to exit.";: GET A$: IF A$ =  CHR$(27)  THEN 520
  281. 2810  IF A$ < > CHR$(32)  THEN 2800
  282. 2820  PRINT D$;"PR#1": REM  Change it to your printer's slot
  283. 2830  PRINT  CHR$(9)"80N": REM  CHANGE TO YOUR PRINTER'S 80 COLUMN COMMAND
  284. 2840  PRINT "Prefix: ";PF$
  285. 2850 SE = 1: GOSUB 2690
  286. 2860  IF  PEEK( -16384) = 155  THEN  POKE  -16368,0: GOTO 2910
  287. 2870  PRINT : PRINT " Name of file";: HTAB 20: PRINT "Type of file";: POKE 36,41: PRINT "Time";: POKE 36,56: PRINT "SIZE:  (Bytes)  (Blocks)"
  288. 2880  FOR T = 1 TO 80: PRINT "_";: NEXT : PRINT 
  289. 2890  GOSUB 2930
  290. 2900  PRINT : PRINT : PRINT : PRINT B" files listed    Blocks remaining: ";BR$;"   Total blocks: ";TB$
  291. 2910  PRINT D$;"PR#0": PRINT D$;"PR#A$C307"
  292. 2920  GOTO 520
  293. 2930  FOR T = 1 TO B: PRINT M$(T); SPC( 2);TY$(T);: POKE 36,40: PRINT TM$(T);: POKE 36,62: PRINT L$(T);: POKE 36,74: PRINT SB$(T)
  294. 2940  IF  PEEK( -16384) = 155  THEN  POKE  -16368,0: POP : GOTO 2910
  295. 2950  NEXT : RETURN 
  296. 2960  REM 
  297. 2970  REM  Utilities:
  298. 2980  REM 
  299. 2990  REM  This is the utilities entry routine
  300. 3000 UT = 1: REM  Set utility flag
  301. 3010  VTAB 23: CALL  -868: PRINT "Utilities: D)elete  L)ock  U)nlock  R)ename         [<Return> = Q)uit]"
  302. 3020  GOTO 600
  303. 3030  REM  This is the utilities parser:
  304. 3040  IF P = 255  OR P = 209  THEN UT = 0: VTAB 23: GOTO 580
  305. 3050  IF P = 204  OR P = 213  THEN 3100: REM  Lock/Unlock
  306. 3060  IF P = 210  THEN 3210: REM  Rename
  307. 3070  IF P = 196  THEN 3370: REM  Delete
  308. 3080  GOTO 650
  309. 3090  REM  Lock/Unlock
  310. 3100  GOSUB 4130
  311. 3110  IF R1$ = T1$(16)  OR R1$ = T1$(15)  THEN 3530
  312. 3120  IF P = 204  THEN 3160
  313. 3130  PRINT D$;"UNLOCK";R$
  314. 3140 A$ = " "
  315. 3150  GOTO 3180
  316. 3160  PRINT D$"LOCK";R$
  317. 3170 A$ = "*"
  318. 3180 X$ = A$ + RIGHT$(R$, LEN(R$)):X$ = X$ +" "
  319. 3190 M$((V -5) +B1) = X$:SE = 1: GOTO 3530
  320. 3200  REM  Rename
  321. 3210  VTAB V: INVERSE : PRINT M$((V -5) +B1): NORMAL : GOSUB 4280: GOSUB 4130:C$ = M$((V -5) +B1)
  322. 3220  IF R1$ = T1$(15)  OR R1$ = T1$(16)  THEN 3530
  323. 3230  PRINT "Current name of this file: ";R$
  324. 3240  PRINT "Enter a new name for this file [<Return> to exit]: ";: GOSUB 4210
  325. 3250  IF X$ = ""  THEN 520
  326. 3260  ONERR  GOTO 3300
  327. 3270  PRINT D$;"RENAME";R$;",";X$
  328. 3280  POKE 216,0: ONERR  GOTO 4530
  329. 3290  GOTO 3350
  330. 3300  POKE 216,0: ONERR  GOTO 4530
  331. 3310  IF  PEEK(222) = 16  THEN  GOSUB 4280: PRINT "Illegal filename.": GOSUB 4250: GOTO 3530
  332. 3320  IF  PEEK(222) = 19  THEN  GOSUB 4280: PRINT "Another file already exists with the same name.": GOSUB 4250: GOTO 3530
  333. 3330  IF  PEEK(222) = 10  THEN  GOSUB 4280: PRINT "The file is locked. It can't be renamed.": GOSUB 4250: GOTO 3530
  334. 3340  GOSUB 4280: PRINT "Error number "; PEEK(222): GOSUB 4250: GOTO 3530
  335. 3350 C$ = " " +X$: FOR T = 1 TO 17 - LEN(C$):C$ = C$ +" ": NEXT :M$((V -5) +B1) = C$: GOTO 3530
  336. 3360  REM  Delete
  337. 3370  IF R1$ = T1$(15)  OR R1$ = T1$(16)  THEN 3530
  338. 3380  INVERSE : VTAB V: PRINT M$((V -5) +B1): NORMAL : GOSUB 4280: PRINT "This file is to be permanently destroyed.": PRINT "Do you want to destroy it (Y/N)?";: GET A$
  339. 3390  IF A$ < >"Y"  THEN 520
  340. 3400  ONERR  GOTO 3490
  341. 3410  GOSUB 4130: PRINT D$;"DELETE ";R$
  342. 3420 TE = PG: FOR T = (V -5) +B1 TO B:M$(T) = M$(T +1):TY$(T) = TY$(T +1):L$(T) = L$(T +1):SB$(T) = SB$(T +1):TM$(T) = TM$(T +1): NEXT 
  343. 3430 B = B -1:B3 = B3 -1 *(CP = PG): IF CP = 1  THEN 3450
  344. 3440 PG = B/14: IF PG < > INT(PG)  THEN PG =  INT(PG):PG = PG +1
  345. 3450  IF PG <TE  AND CP = PG  THEN V = 6:B2 = B2 +1:B1 = B1 -1
  346. 3460  IF (V +5) >(B2 -B1)  THEN V = V -1
  347. 3470  POKE 216,0: ONERR  GOTO 4530
  348. 3480  GOTO 3530
  349. 3490  POKE 216,0: ONERR  GOTO 4530
  350. 3500  IF  PEEK(222) = 10  THEN  GOSUB 4280: PRINT "The file is locked, it can't be deleted.": GOSUB 4250: GOTO 3530
  351. 3510  IF  PEEK(222) = 4  THEN  GOSUB 4280: PRINT "The disk is write protected, the file cannot be deleted.": GOSUB 4250: GOTO 3530
  352. 3520  REM  This routine restores the screen after Del,Rem,Lock & Unlock
  353. 3530  POKE 35,20: VTAB 6: CALL  -958: POKE 1403,0
  354. 3540  IF CP = 1  AND PG = 0  THEN  FOR T = 1 TO B: GOSUB 4110: NEXT : GOTO 3570
  355. 3550  IF CP = 1  THEN  FOR T = 1 TO 14: GOSUB 4110: NEXT : GOTO 3570
  356. 3560  FOR T = B1 +1 TO B2: GOSUB 4110: NEXT 
  357. 3570  POKE 35,24: IF SE = 1  THEN SE = 0: GOTO 650
  358. 3580  GOTO 520
  359. 3590  REM 
  360. 3600  REM  Get the catalog into the array M$ (The heart of the program)
  361. 3610  REM 
  362. 3620  VTAB 22: PRINT D$"PREFIX": INPUT PF$
  363. 3630 B = 1: VTAB 12: POKE 1403,46
  364. 3640  PRINT D$;"OPEN";PF$;",TDIR"
  365. 3650  PRINT D$;"READ ";PF$
  366. 3660  INPUT VOL$
  367. 3670  INPUT A$: INPUT A$:A$ = ""
  368. 3680  INPUT M$(B):TY$(B) =  MID$ (M$(B),18,3)
  369. 3690 L$(B) =  MID$ (M$(B),64,8):SB$(B) =  MID$ (M$(B),26,3)
  370. 3700  IF CRE = 0  THEN TM$(B) =  MID$ (M$(B),31,15): GOTO 3720
  371. 3710 TM$(B) =  MID$ (M$(B),48,15)
  372. 3720 M$(B) =  MID$ (M$(B),1,17): IF M$(B) = ""  THEN 3740
  373. 3730 B = B +1: PRINT ".";: INVERSE : PRINT " ";: NORMAL : PRINT  CHR$(8);: GOTO 3680
  374. 3740  INPUT BR$:TB$ =  MID$ (BR$,58,5):BR$ =  MID$ (BR$,14,5)
  375. 3750  PRINT D$;"CLOSE";PF$
  376. 3760 B = B -1: IF M$(1) = ""  THEN  TEXT : HOME : PRINT "DIRECTORY EMPTY, try another prefix"; CHR$(7): GOSUB 4250
  377. 3770  IF M$(1) = ""  THEN  HOME :SE = 1: GOTO 1270
  378. 3780  RETURN 
  379. 3790  REM 
  380. 3800  REM  Convert the BASIC.SYSTEM type mnemonics to a friendlier format
  381. 3810  REM 
  382. 3820  FOR T = 1 TO 18: READ T1$(T): NEXT 
  383. 3830  DATA  Directory,Text,Applesoft Program,Applesoft Variables,Binary,Relocatable Code,ProDOS added command,System,Word Processor,Database,Spreadsheet
  384. 3840  DATA  Int BASIC program,Int BASIC Variables,Pascal,Bad Block,Typeless,User defined,Other
  385. 3850  FOR T = 1 TO B
  386. 3860  IF TY$(T) = "DIR"  THEN TY$(T) = T1$(1): GOTO 4040
  387. 3870  IF TY$(T) = "TXT"  THEN TY$(T) = T1$(2): GOTO 4040
  388. 3880  IF TY$(T) = "BAS"  THEN TY$(T) = T1$(3): GOTO 4040
  389. 3890  IF TY$(T) = "BIN"  THEN TY$(T) = T1$(5): GOTO 4040
  390. 3900  IF TY$(T) = "SYS"  THEN TY$(T) = T1$(8): GOTO 4040
  391. 3910  IF TY$(T) = "AWP"  THEN TY$(T) = T1$(9): GOTO 4040
  392. 3920  IF TY$(T) = "ADB"  THEN TY$(T) = T1$(10): GOTO 4040
  393. 3930  IF TY$(T) = "ASP"  THEN TY$(T) = T1$(11): GOTO 4040
  394. 3940  IF TY$(T) = "VAR"  THEN TY$(T) = T1$(4): GOTO 4040
  395. 3950  IF TY$(T) = "CMD"  THEN TY$(T) = T1$(7): GOTO 4040
  396. 3960  IF TY$(T) = "REL"  THEN TY$(T) = T1$(6): GOTO 4040
  397. 3970  IF TY$(T) = "INT"  THEN TY$(T) = T1$(12): GOTO 4040
  398. 3980  IF TY$(T) = "IVR"  THEN TY$(T) = T1$(13): GOTO 4040
  399. 3990  IF TY$(T) = "PAS"  THEN TY$(T) = T1$(14): GOTO 4040
  400. 4000  IF TY$(T) = "$01"  THEN TY$(T) = T1$(15): GOTO 4040
  401. 4010  IF TY$(T) = "$00"  THEN TY$(T) = T1$(16): GOTO 4040
  402. 4020  IF  LEFT$(TY$(T),2) = "$F"  THEN TY$(T) = T1$(17): GOTO 4040
  403. 4030 Q1$ = " ( ":Q2$ = " ) ":TY$(T) = T1$(18) +Q1$ +TY$(T) +Q2$
  404. 4040  NEXT 
  405. 4050  PRINT D$;"FRE": REM  Clean up all garbage accumulated
  406. 4060  RETURN 
  407. 4070  REM 
  408. 4080  REM  Miscellaneous subroutines:
  409. 4090  REM 
  410. 4100  REM  Print one line of the catalog
  411. 4110  PRINT M$(T); SPC( 2);TY$(T);: POKE 1403,40: PRINT TM$(T);: POKE 1403,62: PRINT L$(T);: POKE 1403,74: PRINT SB$(T): RETURN 
  412. 4120  REM  Isolate the name and type of the file into R$ & R1$
  413. 4130 R$ =  RIGHT$( LEFT$(M$((V -5) +B1),16),15)
  414. 4140 R1$ = TY$((V -5) +B1): RETURN 
  415. 4150  REM  Apple-1 thru Apple-9 (Go to pages 1 thru 9)
  416. 4160 P = P -176: IF P >PG  THEN  PRINT  CHR$(7);: GOTO 650
  417. 4170  IF P = CP  THEN 650
  418. 4180  POKE 35,20: HOME : VTAB 6: POKE 1403,0
  419. 4190 CP = P:B1 = 14 *(CP -1): GOTO 1050
  420. 4200  REM  Input anything: (CALL -657 and scan input buffer)
  421. 4210 X$ = "": CALL  -657
  422. 4220  FOR T = 512 TO 767: IF  PEEK(T) < >141  THEN X$ = X$ + CHR$( PEEK(T) -128): NEXT 
  423. 4230  RETURN 
  424. 4240  REM  Ask user to press any key to continue
  425. 4250  PRINT "Press any key to continue.";: GET A$
  426. 4260  RETURN 
  427. 4270  REM  Clean screen from line 21 to line 24
  428. 4280  VTAB 21: POKE 1403,0: CALL  -958: RETURN 
  429. 4290  REM  Data for the ProDOS quit command
  430. 4300  DATA  32,0,191,101,6,3,4,0,0,0,0
  431. 4310  REM  Help
  432. 4320  GOSUB 4280
  433. 4330  IF Z < >0  THEN  PRINT "Arrows move cursor bar, ";: GOTO 4360
  434. 4340  PRINT  CHR$(27);
  435. 4350  PRINT  CHR$(15);"K"; CHR$(14);" and "; CHR$(15);"J"; CHR$(14);" move cursor bar, ";
  436. 4360  PRINT  CHR$(15);"A"; CHR$(14);"-1 thru "; CHR$(15);"A"; CHR$(14);"-9 move cursor to pages 1 thru 9."
  437. 4370  PRINT  CHR$(15);"A"; CHR$(14);"-B moves cursor to beginning of page,"; CHR$(15);"A"; CHR$(14);"-E moves cursor to end of page.";: PRINT  CHR$(15);"A"; CHR$(14);"-D dumps": PRINT "catalog to a printer.";
  438. 4380  PRINT " Esc backs up 1 directory level."
  439. 4390  POKE 1403,20: GOSUB 4250: GOTO 520
  440. 4400  REM 
  441. 4410  REM  Escape pressed, back up 1 directory level.
  442. 4420  REM 
  443. 4430  IF  RIGHT$(PF$,1) = "/"  THEN PF$ =  LEFT$(PF$, LEN(PF$) -1)
  444. 4440 DL = 1: FOR T = 2 TO  LEN(PF$)
  445. 4450  IF  MID$ (PF$,T,1) = "/"  THEN DL = 0:DP = T
  446. 4460  NEXT 
  447. 4470  IF DL >0  THEN PF$ = PF$ +"/": GOTO 650
  448. 4480 NP$ =  LEFT$(PF$,DP -1): PRINT D$;"PREFIX";NP$
  449. 4490 SE = 1: GOTO 190
  450. 4500  REM 
  451. 4510  REM  Error trapper:
  452. 4520  REM 
  453. 4530  IF  PEEK(222) = 255  THEN  RESUME 
  454. 4540  IF  PEEK(222) < >6  THEN 4580
  455. 4550  GOSUB 4280: PRINT "Path not on this disk. Be sure"VOL$" is inserted.": PRINT "Press space bar to continue, Escape to quit.";: GET A$: IF A$ =  CHR$(32)  THEN  RESUME 
  456. 4560  IF A$ =  CHR$(27)  THEN SE = 1: GOTO 1270
  457. 4570  GOTO 4550
  458. 4580  IF  PEEK(222) = 4  THEN  GOSUB 4280: PRINT "The disk is write-protected, the operation is canceled.": GOSUB 4240: GOTO 520
  459. 4590  GOSUB 4280: PRINT "Error number "; PEEK(222)" in line " PEEK(218) +256 * PEEK(219): GOSUB 4250: POKE 216,0:SE = 1: GOTO 350
  460. 4600  PRINT D$"-PRGM.EXEC"