home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib25b.dsk / SUBROUTINE.STORE.bas < prev    next >
BASIC Source File  |  2023-02-26  |  14KB  |  284 lines

  1. 10  REM **********************
  2. 20  REM * SUBROUTINE.STORE   *
  3. 30  REM * BY RON SJOLANDER   *
  4. 40  REM * COPYRIGHT (C) 1985 *
  5. 50  REM * BY MICROSPARC, INC *
  6. 60  REM * CONCORD, MA  01742 *
  7. 70  REM **********************
  8. 80 HM =  PEEK(115) + PEEK(116) *256:MEM = HM: IF  PEEK(782) < >255 -( PEEK(781) + PEEK(780) -256 *( PEEK(780) + PEEK(781) >255))  THEN MEM = HM -25 *256
  9. 90  POKE 780, PEEK(115): POKE 781, PEEK(116): POKE 782,255 -( PEEK(780) + PEEK(781) -256 *( PEEK(780) + PEEK(781) >255)): REM  STORE HIMEM
  10. 100  HIMEM: MEM
  11. 110 HM = MEM +24 *256
  12. 120  DIM SB(52):LI = 10:LS = 10
  13. 130  GOTO 15000
  14. 140  REM  CHECK FOR LINE NO./ADDRESS
  15. 150 ADR =  PEEK(103) + PEEK(104) *256:FD = 0
  16. 160  GOSUB 170:ADR = NXADR: GOTO 160
  17. 170 NXADR =  PEEK(ADR) + PEEK(ADR +1) *256
  18. 180 LN =  PEEK(ADR +2) + PEEK(ADR +3) *256
  19. 190  IF LN <CN  THEN  RETURN 
  20. 200  IF LN >CN  OR NXADR = 0  THEN  POP : RETURN 
  21. 210 FD = 1: POP : RETURN 
  22. 220  REM  BAR TO CONTINUE ROUTINE
  23. 230  VTAB 23: PRINT "PRESS THE ";: INVERSE : PRINT "  SPACE BAR  ";: NORMAL : PRINT " TO CONTINUE. ";: GET X$
  24. 240  HOME : RETURN 
  25. 250  REM  COMPUTE HI/LO BYTE FOR NUMBERS
  26. 260 HB =  INT(NUM/256):LB = NUM -HB *256: RETURN 
  27. 270  REM  GET LINE NUMBERS FOR SUBROUTINES
  28. 280 CN = 5000: GOSUB 140:CN = 4900
  29. 290  FOR II = 1 TO 50
  30. 300 FD = 0:CN = CN +100: GOSUB 160
  31. 310  IF FD = 0  THEN  RETURN 
  32. 320  IF  PEEK(ADR +4) < >178  THEN 300: REM  CHECK FOR REM TOKEN (178)
  33. 330 SB(II) = CN: NEXT II
  34. 340  RETURN 
  35. 350  REM  CHANGEABLE LIST ROUTINE ONE
  36. 360 CN = 400: GOSUB 140
  37. 370 PN$ =  STR$(PN): IF  LEN(PN$) <5  THEN PN$ = PN$ + LEFT$("    ",5 - LEN(PN$))
  38. 380  FOR II = 1 TO  LEN(PN$): POKE ADR +4 +II, ASC( MID$ (PN$,II,1))
  39. 390  NEXT 
  40. 400  LIST 5000:: RETURN : REM  SELF-MODIFYING LINE
  41. 410  REM  MOVE MEMORY ROUTINE
  42. 420  POKE 71,0: POKE 66,D1: POKE 67,D2: POKE 60,S1: POKE 61,S2: POKE 62,E1: POKE 63,E2
  43. 430  POKE 58,44: POKE 59,254: CALL 65209: RETURN 
  44. 440  REM  CHANGEABLE LIST ROUTINE TWO
  45. 450 CN = 500: GOSUB 140
  46. 460 PN$ =  STR$(S1) +"," + STR$(S2): IF  LEN(PN$) <11  THEN PN$ = PN$ + LEFT$("    ",11 - LEN(PN$))
  47. 470  FOR II = 1 TO  LEN(PN$): POKE ADR +4 +II, ASC( MID$ (PN$,II,1)): NEXT 
  48. 480  VTAB 23: PRINT "CTRL S / ANY KEY STOPS/STARTS LIST": VTAB 1
  49. 490  POKE 35,21: SPEED= 125
  50. 500  LIST 5000,5099::: REM SELF-MODIFYING LINE
  51. 510  POKE 35,24: SPEED= 255: RETURN 
  52. 520  REM  CHECK FOR SUBROUTINE 
  53. 530  FOR II = 1 TO 50
  54. 540  IF SB = SB(II)  THEN  RETURN 
  55. 550  NEXT : HOME 
  56. 560  PRINT "YOU HAVE ENTERED A LINE NUMBER THAT": PRINT "DOES NOT START A SUBROUTINE. TRY AGAIN.": GOSUB 220
  57. 570  POP : TEXT : HOME : GOTO 870
  58. 580  REM  GET CHOICE
  59. 590  POKE 34,18: HOME : PRINT "PLEASE ENTER THE ";: INVERSE : PRINT "LINE NUMBER";: NORMAL : PRINT " OF YOUR": PRINT 
  60. 600  PRINT "CHOICE,  PRESS ";: INVERSE : PRINT "RETURN";: NORMAL : PRINT " TO CONTINUE,": PRINT 
  61. 610  PRINT "OR ";: INVERSE : PRINT "S";: NORMAL : INPUT " <RETURN> TO STOP LOOKING. ";X$: IF X$ = "S"  THEN 1500
  62. 620 SB =  VAL(X$): IF SB = 0  THEN  RETURN 
  63. 630  GOSUB 520: HOME : INVERSE : PRINT "ENTER:";: NORMAL : PRINT "  M - MERGE WITH EXISTING APPLE-"
  64. 640  HTAB 13: PRINT "SOFT PROGRAM.": HTAB 9: PRINT "L - TO LIST SUBROUTINE SELECTED.": PRINT 
  65. 650  PRINT "PRESS ANY OTHER KEY TO CONTINUE. ";: GET X$: IF X$ = "L"  THEN  POP : GOTO 750
  66. 660  IF X$ = "M"  THEN  POP : GOTO 970
  67. 670  RETURN 
  68. 680  REM  CLEAR MEMORY
  69. 690  FOR I = MEM TO MEM +256: POKE I,0: NEXT 
  70. 700 NUM = MEM: GOSUB 250:S1 = LB:S2 = HB
  71. 710 NUM = MEM +256: GOSUB 250:E1 = LB:E2 = HB
  72. 720 D1 = S1: FOR II = S2 +1 TO S2 +23
  73. 730 D2 = II: GOSUB 410: NEXT 
  74. 740  RETURN 
  75. 750  REM  LIST A SUBROUTINE
  76. 760  TEXT : HOME : FOR I = 1 TO 50
  77. 770  IF SB(I) = SB  THEN 790
  78. 780  NEXT 
  79. 790 S1 = SB(I): IF SB(I +1) >0  THEN S2 = SB(I +1) -1
  80. 800  IF SB(I +1) = 0  THEN S2 = 14990
  81. 810  GOSUB 440: GOSUB 220: GOTO 870
  82. 820  HOME : IF SB(1) >0  THEN 860
  83. 830  HOME : VTAB 10: HTAB 13: INVERSE : PRINT "PLEASE STAND BY": NORMAL : PRINT 
  84. 840  GOSUB 680: REM  CLEAR MEMORY
  85. 850  HTAB 10: PRINT "FINDING SUBROUTINES.": GOSUB 270
  86. 860 J = 1:JJ = 3
  87. 870  HOME : FOR Q = J TO JJ
  88. 880  IF SB(J) < >0  THEN 940
  89. 890  TEXT : HOME : VTAB 8: PRINT "THAT'S ALL OF THE SUBROUTINES.  IF YOU": PRINT 
  90. 900  PRINT "HAVE PICKED ALL YOU WANT TO MERGE OR": PRINT : PRINT "ARE THROUGH REVIEWING THEM, PRESS ANY": PRINT 
  91. 910  PRINT "KEY EXCEPT 'A'.  PRESSING 'A' WILL": PRINT 
  92. 920  PRINT "LIST THE SUBROUTINES AGAIN. ": GET X$: IF X$ = "A"  THEN 860
  93. 930  GOTO 1500
  94. 940  IF SB(Q) = 0  THEN  GOSUB 580: GOTO 960
  95. 950 PN = SB(Q): GOSUB 350: NEXT : GOSUB 580: REM  LIST SUBROUTINES AND GET CHOICES
  96. 960 J = J +3:JJ = JJ +3: TEXT : GOTO 870
  97. 970  IF PK >0  THEN 1030
  98. 980  HOME : PRINT "DO YOU WANT TO ENTER A SEPARATE LINE": PRINT : PRINT "NUMBER FOR EACH SUBROUTINE AS YOU": PRINT : PRINT "SELECT IT? ";: GET X$
  99. 990  IF X$ = "Y"  THEN  HOME :NB = 1: GOTO 1030
  100. 1000  IF X$ = "N"  THEN  HOME :NB = 0: GOTO 1020
  101. 1010  GOTO 980
  102. 1020  PRINT "PLEASE ENTER THE STARTING LINE NUMBER": PRINT : INPUT "FOR THE SUBROUTINE(S). ";NN
  103. 1030  IF NB = 1  THEN  HOME : PRINT "PLEASE ENTER THE STARTING LINE NUMBER": PRINT : INPUT "FOR THIS SUBROUTINE. ";NN
  104. 1040  POKE 820,NB
  105. 1050  HOME : INVERSE : PRINT "STAND BY";: NORMAL : PRINT "  - RENUMBERING AND MOVING": PRINT 
  106. 1060  PRINT "SUBROUTINE AT LINE ";SB;"."
  107. 1070  IF PK = 0  THEN 1170
  108. 1080  FOR I = 1 TO 50: IF SB = SB(I)  THEN 1100
  109. 1090  NEXT I
  110. 1100  IF SB(I +1) < >0  THEN 1150
  111. 1110 CN = SB: GOSUB 140:X = ADR:ADR = NXADR
  112. 1120  GOSUB 1130:ADR = NXADR: GOTO 1120
  113. 1130 NXADR =  PEEK(ADR) + PEEK(ADR +1) *256:LN =  PEEK(ADR +2) + PEEK(ADR +3) *256: IF LN = 15000  THEN  POP :Y = ADR -1: GOTO 1160
  114. 1140  RETURN 
  115. 1150 CN = SB: GOSUB 140:X = ADR:CN = SB(I +1): GOSUB 140:Y = ADR
  116. 1160  IF (D1 +D2 *256) +(Y -X) >HM -5  THEN 1430
  117. 1170  IF NB = 0  AND PK = 0  THEN NUM = NN: GOSUB 250: POKE 824,LB: POKE 825,HB
  118. 1180  IF NB = 1  THEN NUM = NN: GOSUB 250: POKE 820 +(PK +1) *4,LB: POKE 821 +(PK +1) *4,HB
  119. 1190  IF PK >0  THEN 1210
  120. 1200 NUM = MEM +1: GOSUB 250:D1 = LB:D2 = HB
  121. 1210 CN = SB: GOSUB 140
  122. 1220  FOR I = 1 TO 50: IF SB = SB(I)  THEN 1240
  123. 1230  NEXT I
  124. 1240  IF SB(I +1) >0  THEN NSB = SB(I +1) -1
  125. 1250  IF SB(I +1) = 0  THEN NSB = SB +200
  126. 1260  FOR I = SB TO NSB
  127. 1270  GOSUB 1280:ADR = NXADR: GOTO 1270
  128. 1280 NXADR =  PEEK(ADR) + PEEK(ADR +1) *256
  129. 1290 LN =  PEEK(ADR +2) + PEEK(ADR +3) *256
  130. 1300  IF LN < >I  THEN  POP : NEXT I: GOTO 1390
  131. 1310 NUM = ADR: GOSUB 250:S1 = LB:S2 = HB
  132. 1320 NUM = NXADR -1: GOSUB 250:E1 = LB:E2 = HB
  133. 1330  GOSUB 410: REM  MOVE MEMORY
  134. 1340 X = D1 +D2 *256:Y = NXADR -ADR
  135. 1350 NUM = X +Y: GOSUB 250: POKE X,LB: POKE X +1,HB
  136. 1360 D1 = LB:D2 = HB
  137. 1370 NUM = NN: GOSUB 250: POKE X +2,LB: POKE X +3,HB
  138. 1380 NN = NN +LI: RETURN 
  139. 1390 PK = PK +1: IF NB = 0  THEN NUM = NN -LI: GOSUB 250: POKE 826,LB: POKE 827,HB
  140. 1400  IF NB = 1  THEN NUM = NN -LI: GOSUB 250: POKE 820,PK: POKE 822 +PK *4,LB: POKE 823 +PK *4,HB
  141. 1410  IF NB = 0  THEN NN =  INT(NN/LS) *LS +LS
  142. 1420  TEXT : HOME : GOTO 870
  143. 1430  TEXT : HOME : VTAB 4: PRINT "SORRY - YOU'VE PICKED ONE MORE SUB-": PRINT 
  144. 1440  PRINT "ROUTINE THAN WILL FIT IN MEMORY.": PRINT : PRINT 
  145. 1450  PRINT "WHEN YOU CONTINUE, ALL SUBROUTINES UP": PRINT 
  146. 1460  PRINT "TO ";SB;" WILL BE ADDED TO THE PROGRAM": PRINT : PRINT "YOU CHOOSE.": PRINT 
  147. 1470  PRINT : PRINT "YOU'LL HAVE TO RUN SUBROUTINE STORE": PRINT 
  148. 1480  PRINT "AGAIN TO ADD THIS ONE (AND OTHERS).": GOSUB 220: GOTO 15270
  149. 1490  REM  CHECK FOR SUBROUTINE TO SAVE
  150. 1500  IF  PEEK(MEM +1) + PEEK(MEM +2) = 0  THEN  TEXT : HOME : GOTO 15050
  151. 1510  GOTO 15270
  152. 1520  TEXT : HOME : POKE 115, PEEK(780): POKE 116, PEEK(781): POKE 782,0: END 
  153. 5000  REM  ANY KEY TO CONTINUE ROUTINE
  154. 5010  VTAB 23: PRINT "PRESS ANY KEY TO CONTINUE. ";: GET X$
  155. 5020  RETURN 
  156. 15000  TEXT : HOME : HTAB 11: INVERSE : PRINT "SUBROUTINE STORAGE": PRINT : PRINT 
  157. 15010  NORMAL : PRINT "THIS PROGRAM PROVIDES A PLACE TO STORE": PRINT : PRINT "SUBROUTINES TO MERGE LATER WITH AN": PRINT 
  158. 15020  PRINT "APPLESOFT PROGRAM YOU'RE DEVELOPING.": PRINT : PRINT : PRINT "THE SUBROUTINES BEGIN AT LINE 5000 AND": PRINT 
  159. 15030  PRINT "AT EVEN INCREMENTS OF 100 AFTER THAT.": PRINT : PRINT 
  160. 15040  PRINT "THIS PROGRAM SHOULD BE ON THE SAME DISK": PRINT : PRINT "WITH YOUR APPLESOFT PROGRAM.": PRINT : PRINT "* COPYRIGHT 1985 MICROSPARC, INC. *": GOSUB 220
  161. 15050  INVERSE : HTAB 11: PRINT "SUBROUTINE STORAGE": NORMAL : PRINT : PRINT 
  162. 15060  PRINT "PLEASE ENTER THE NUMBER OF YOUR CHOICE:": PRINT : PRINT 
  163. 15070  PRINT "   1 - REVIEW EXISTING SUBROUTINES AND": PRINT 
  164. 15080  PRINT "       PICK ONE OR MORE TO MERGE WITH": PRINT 
  165. 15090  PRINT "       AN EXISTING APPLESOFT PROGRAM.": PRINT : PRINT 
  166. 15100  PRINT "   2 - ADD A NEW SUBROUTINE(S).": PRINT : PRINT "   3 - QUIT.": PRINT 
  167. 15110  GET X$:X =  VAL(X$): IF X <1  OR X >3  THEN  HOME : GOTO 15050
  168. 15120  ON X GOTO 820,15130,1520
  169. 15130  HOME : VTAB 12: HTAB 13: INVERSE : PRINT "PLEASE STAND BY": NORMAL : GOSUB 270: REM  FIND SUBROUTINE LINE NUMBERS
  170. 15140  IF SB(1) = 0  THEN  HOME : VTAB 8: PRINT "SINCE THIS PROGRAM CONTAINS NO": PRINT : PRINT "SUBROUTINE AT LINE 5000, BEGIN": PRINT : PRINT "THE FIRST ONE AT LINE 5000."
  171. 15150  POKE 115, PEEK(780): POKE 116, PEEK(781): POKE 782,0: REM  CHANGE HIMEM BACK
  172. 15160  IF SB(1) = 0  THEN  END 
  173. 15170  FOR I = 1 TO 50: IF SB(I) = 0  THEN 15190
  174. 15180  NEXT 
  175. 15190  HOME : VTAB 4: PRINT "THE LAST SUBROUTINE STORED IN THIS": PRINT 
  176. 15200  PRINT "PROGRAM ENDS BEFORE ";CN: PRINT 
  177. 15210  PRINT "BEGIN THE NEXT ONE AT ";CN
  178. 15220  PRINT : PRINT 
  179. 15230  PRINT "YOU HAVE ";I -1;" SUBROUTINES STORED IN": PRINT 
  180. 15240  PRINT "THIS PROGRAM AND ROOM FOR ";51 -I;" MORE."
  181. 15250  POKE 115, PEEK(780): POKE 116, PEEK(781): POKE 782,0: REM  CHANGE HIMEM BACK
  182. 15260  END 
  183. 15270 D$ =  CHR$(13) + CHR$(4): REM  RETURN + CONTROL D
  184. 15280  TEXT : HOME 
  185. 15290  PRINT D$;"MON C,I,O"
  186. 15300  TEXT : HOME : VTAB 4: PRINT "PLEASE ENTER THE NAME OF THE APPLESOFT": PRINT 
  187. 15310  PRINT "PROGRAM TO ADD SUBROUTINE(S) TO:": PRINT : INPUT F$: PRINT 
  188. 15320  ONERR  GOTO 15650
  189. 15330  PRINT D$"RENAME"F$","F$
  190. 15340  POKE 216,0
  191. 15350  PRINT "AFTER THE SUBROUTINE(S) ARE ADDED, DO": PRINT 
  192. 15360  PRINT "YOU WANT TO CALL THE PROGRAM: ": PRINT : PRINT F$: PRINT 
  193. 15370  PRINT "ENTER Y FOR YES, N FOR NO.": PRINT 
  194. 15380  GET X$: IF X$ = "Y"  THEN S$ = F$: HOME : GOTO 15430
  195. 15390  IF X$ < >"N"  THEN  HOME : VTAB 6: GOTO 15350
  196. 15400  HOME : VTAB 6: PRINT "PLEASE ENTER THE NEW NAME YOU'D LIKE:": PRINT 
  197. 15410  INPUT S$
  198. 15420  HOME 
  199. 15430  PRINT D$;"OPEN TEMP.TEMP": PRINT D$;"DELETE TEMP.TEMP": PRINT D$;"OPEN TEMP.TEMP": PRINT D$;"WRITE TEMP.TEMP"
  200. 15440  POKE 33,30:NUM = MEM +1: GOSUB 250: POKE 103,LB: POKE 104,HB: LIST 
  201. 15450  TEXT : POKE 103,1: POKE 104,8
  202. 15460  PRINT "POKE 103,1:POKE 104,8"
  203. 15470  PRINT "DELETE SUB.TEMP"
  204. 15480  PRINT "SAVE ";S$
  205. 15490  PRINT "NOMON C,I,O"
  206. 15500  PRINT "POKE 115,PEEK(780):POKE 116,PEEK(781)"
  207. 15510  PRINT "TEXT:HOME"
  208. 15520  PRINT "DELETE TEMP.TEMP"
  209. 15530  PRINT D$;"CLOSE TEMP.TEMP"
  210. 15540  PRINT : HTAB 5: INVERSE : PRINT "YES - SOMETHING IS HAPPENING!": NORMAL 
  211. 15550  GOSUB 15720: REM  CREATE TEMP PROGRAM
  212. 15560  PRINT D$;"OPEN EXEC.TEMP": PRINT D$;"DELETE EXEC.TEMP": PRINT D$;"OPEN EXEC.TEMP": PRINT D$;"WRITE EXEC.TEMP"
  213. 15570  PRINT "LOAD ";F$
  214. 15580  PRINT "POKE 770,PEEK(175):POKE 771,PEEK(176)"
  215. 15590  PRINT "POKE 103,PEEK(175):POKE 104,PEEK(176)+1"
  216. 15600  PRINT "P=PEEK(103)+PEEK(104)*256:POKE P-1,0"
  217. 15610  PRINT "RUN SUB.TEMP"
  218. 15620  PRINT D$;"CLOSE EXEC.TEMP"
  219. 15630  PRINT D$;"EXEC EXEC.TEMP"
  220. 15640  END 
  221. 15650 E =  PEEK(222): POKE 216,0: HOME : VTAB 12
  222. 15660  IF E = 10  THEN  PRINT "FILE LOCKED."
  223. 15670  IF E = 6  THEN  PRINT "FILE NOT FOUND."
  224. 15680  IF E = 8  THEN  PRINT "I/O ERROR."
  225. 15690  IF E = 4  THEN  PRINT "DISK WRITE PROTECTED."
  226. 15700  IF E < >4  AND E < >8  AND E < >6  AND E < >10  THEN  PRINT "ERROR NUMBER "E"."
  227. 15710  PRINT : PRINT "PRESS ANY KEY TO CONTINUE.": GET Z$: PRINT : GOTO 15300
  228. 15720  REM  CREATE A TEMPORARY PROGRAM TO CHECK LINE NUMBERS
  229. 15730 CN = 15790: GOSUB 140: REM   GET ADDRESS
  230. 15740 NUM = ADR: GOSUB 250: REM  GET LO/HI BYTE
  231. 15750  POKE 103,LB: POKE 104,HB: REM  RESET START OF PROGRAM POINTERS TEMPORARILY
  232. 15760  PRINT D$;"SAVE SUB.TEMP"
  233. 15770  POKE 103,1: POKE 104,8
  234. 15780  RETURN 
  235. 15790  REM  TEMPORARY PROGRAM
  236. 15800 D$ =  CHR$(13) + CHR$(4): PRINT D$;"DELETE EXEC.TEMP"
  237. 15810  HOME : VTAB 12: PRINT "PLEASE STAND BY - MAKING SOME CHECKS."
  238. 15820  GOSUB 16110: REM  CHECK FOR PROPER LOAD
  239. 15830 II =  PEEK(820): IF II <2  THEN II = 1
  240. 15840  FOR I = 1 TO II
  241. 15850 X =  PEEK(820 +I *4) + PEEK(821 +I *4) *256
  242. 15860 Y =  PEEK(822 +I *4) + PEEK(823 +I *4) *256
  243. 15870 ADR = 2049
  244. 15880  GOSUB 15890:ADR = NXADR: GOTO 15880
  245. 15890 NXADR =  PEEK(ADR) + PEEK(ADR +1) *256
  246. 15900 LN =  PEEK(ADR +2) + PEEK(ADR +3) *256
  247. 15910  IF NXADR = 0  THEN  POP : GOTO 15960
  248. 15920  IF LN <X  THEN  RETURN 
  249. 15930  IF LN = X  OR LN = Y  THEN 15970
  250. 15940  IF LN >X  AND LN <Y  THEN  POP : GOTO 15970
  251. 15950  IF LN >Y  THEN  POP 
  252. 15960  NEXT I: GOTO 16070
  253. 15970  HOME : VTAB 8: PRINT "SORRY - THERE IS A LINE NUMBER CONFLICT": PRINT 
  254. 15980  PRINT "BETWEEN THE APPLESOFT PROGRAM AND THE": PRINT 
  255. 15990  PRINT "LINE NUMBERS YOU PICKED FOR AT LEAST": PRINT 
  256. 16000  PRINT "ONE SUBROUTINE AT ";LN;"."
  257. 16010  FOR I = 1 TO 3000: NEXT I
  258. 16020 D$ =  CHR$(13) + CHR$(4)
  259. 16030  PRINT D$;"DELETE TEMP.TEMP"
  260. 16040  PRINT D$;"DELETE SUB.TEMP"
  261. 16050  POKE 103,1: POKE 104,8
  262. 16060  PRINT D$;"RUN SUBROUTINE.STORE"
  263. 16070  HOME 
  264. 16080  POKE 103,1: POKE 104,8: POKE 175, PEEK(770): POKE 176, PEEK(771)
  265. 16090  PRINT D$;"EXEC TEMP.TEMP"
  266. 16100  END 
  267. 16110  REM  THIS ROUTINE CHECKS TO BE SURE A PROGRAM WAS LOADED TO ADD SUBROUTINES TO.
  268. 16120 X = 0:T$ = ""
  269. 16130 ADR = 2049
  270. 16140  GOSUB 16150:ADR = NXADR: GOTO 16140
  271. 16150 NXADR =  PEEK(ADR) + PEEK(ADR +1) *256
  272. 16160  IF NXADR = 0  THEN  POP : GOTO 16180
  273. 16170  RETURN 
  274. 16180  FOR I = 2 TO 6
  275. 16190 X = X + PEEK(ADR -I)
  276. 16200  NEXT I
  277. 16210  IF X < >337  THEN  RETURN 
  278. 16220  POP : HOME 
  279. 16230  VTAB 8: PRINT "SORRY - THE PROGRAM NAME YOU ENTERED": PRINT 
  280. 16240  PRINT "MUST NOT BE ON THIS DISK.": PRINT : PRINT 
  281. 16250  PRINT "PLEASE TRY AGAIN."
  282. 16260  GOTO 16010
  283. 16270  REM    THE FOLLOWING LINE MUST BE THE LAST LINE OF THIS PROGRAM FOR THE ROUTINE AT 16010 TO WORK.
  284. 16280  REM  *+*