home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib24b.dsk / SOURCE.EDITOR.bas < prev    next >
BASIC Source File  |  2023-02-26  |  9KB  |  211 lines

  1. 10  REM   **********************
  2. 20  REM   *    SOURCE.EDITOR   *
  3. 30  REM   *   BY JOHN WHITNEY  *
  4. 40  REM   * COPYRIGHT (C) 1984 *
  5. 50  REM   * BY MICROSPARC, INC *
  6. 60  REM   * LINCOLN, MA. 01773 *
  7. 65  REM   *    SOURCE.EDITOR   *
  8. 67  REM   *  MODIFICATIONS BY  *
  9. 68  REM   *    ALBERT BAKER    *
  10. 70  REM   **********************
  11. 80  REM   ******************************
  12. 90  REM   *  THIS PROGRAM WILL CREATE  *
  13. 100  REM  *  AND EDIT ASSEMBLER SOURCE *
  14. 110  REM  *  PROGRAMS TO BE ASSEMBLED  *
  15. 120  REM  *  BY THE ASSEMBLER PROGRAM  *
  16. 130  REM  *                            *
  17. 140  REM  ******************************
  18. 150  REM  *** SET UP ***
  19. 155 S = 0: REM  SAVE FLAG
  20. 160 D$ =  CHR$(4)
  21. 165  PRINT D$"PR#3": PRINT : REM  SET BLOCK CURSOR
  22. 170 MXLINES = 500: DIM A$(MXLINES),A(MXLINES)
  23. 175  GOSUB 2050: REM  HOME
  24. 180  HOME : VTAB 22: PRINT "** COPYRIGHT 1984 BY MICROSPARC, INC. **"
  25. 190  VTAB 2: INVERSE : PRINT "SOURCE EDITOR": NORMAL 
  26. 200  GOSUB 1440: ONERR  GOTO 1600
  27. 210  VTAB 6: CALL  -958: INPUT "ENTER FILE NAME: ";PR$: IF  LEN(PR$) = 0  OR  LEN(PR$) >15  OR  VAL(PR$) >0  THEN 210
  28. 220 V = 8:H = 1: GOSUB 2000: CALL  -958
  29. 230 H = 1:V = 8: GOSUB 2000: PRINT "IS THIS A NEW FILE (Y/N) ";: GET NP$: PRINT " "NP$
  30. 240  IF NP$ = "N"  THEN  GOSUB 1090: GOTO 280
  31. 250  IF NP$ = "Y"  OR NP$ = ""  THEN  PRINT : GOTO 300
  32. 260 V = 8:H = 1: GOSUB 2000: CALL  -958: GOTO 230
  33. 270  REM  *** EDIT PROGRAM ***
  34. 280  PRINT :H = 1:V = 22: GOSUB 2000: PRINT "EDIT"
  35. 290  GOSUB 870
  36. 300  IF L$ = ""  THEN L$ = "I 99999": GOSUB 390: GOTO 280
  37. 310  IF  VAL(L$) < >0  THEN  GOSUB 510: GOTO 280
  38. 320  IF  LEFT$(L$,2) = "D "  THEN  GOSUB 590: GOTO 280
  39. 330  IF  LEFT$(L$,1) = "L"  THEN  GOSUB 710: GOTO 280
  40. 340  IF  LEFT$(L$,1) = "P"  THEN  PRINT : PRINT D$"PR#1": GOSUB 710: PRINT D$"PR#3": PRINT : GOTO 280
  41. 350  IF  LEFT$(L$,1) = "?"  THEN  GOSUB 1350: GOTO 280
  42. 360  IF  LEFT$(L$,2) = "I "  THEN  GOSUB 390: GOTO 280
  43. 370  IF  LEFT$(L$,4) = "SAVE"  THEN 1200
  44. 380  PRINT : PRINT "INVALID COMMAND": PRINT : PRINT : GOTO 280
  45. 390  REM  *** INPUT ***
  46. 395  PRINT :H = 1:V = 23: GOSUB 2000
  47. 400  PRINT "INPUT"
  48. 410 N = 0:NL = 1
  49. 420  IF A(N) < >0  AND NL < VAL( MID$ (L$,3)) +1  THEN N = A(N):NL = NL +1: GOTO 420
  50. 430  PRINT NL":": PRINT 
  51. 440  GOSUB 870
  52. 450  IF L$ = ""  THEN  PRINT : RETURN 
  53. 460 J = 1
  54. 470  IF A$(J) < >""  THEN J = J +1: GOTO 470
  55. 480 A$(J) = L$
  56. 490 A(J) = A(N):A(N) = J:N = J:NL = NL +1
  57. 495  PRINT 
  58. 500  GOTO 430
  59. 510  REM *** RE ENTER LINE ***
  60. 515  PRINT : PRINT 
  61. 520 N = 0
  62. 530  FOR J = 1 TO  VAL(L$)
  63. 540  IF A(N) = 0  THEN  PRINT "LINE NOT FOUND": PRINT : PRINT : RETURN 
  64. 550 N = A(N)
  65. 560  NEXT 
  66. 565 H = 1:V = 22: GOSUB 2000
  67. 570  PRINT  VAL(L$);":": PRINT A$(N);:L$ = A$(N) + LEFT$("                                                                                ",80 - LEN(A$(N))): PRINT : GOSUB 900: IF L$ = ""  THEN  RETURN : REM  80 SPACES BETWEEN QUOTES
  68. 575  PRINT : PRINT 
  69. 580 A$(N) = L$: RETURN 
  70. 590  REM  *** DELETE LINE ***
  71. 600 LN =  VAL( MID$ (L$,2)) -1
  72. 605  PRINT : PRINT 
  73. 610  IF LN <0  THEN  PRINT "LINE NOT FOUND": PRINT : PRINT : RETURN 
  74. 620 N = 0
  75. 630  IF LN = 0  THEN 680
  76. 640  FOR J = 1 TO LN
  77. 650  IF A(N) = 0  THEN  PRINT "LINE NOT FOUND": PRINT : PRINT : RETURN 
  78. 660 N = A(N)
  79. 670  NEXT 
  80. 680 A$(A(N)) = ""
  81. 690 A(N) = A(A(N))
  82. 695  PRINT 
  83. 700  RETURN 
  84. 710  REM  *** LIST ***
  85. 715  PRINT : PRINT 
  86. 720  IF  LEN(L$) <3  THEN LS = 0:LE = 0: GOTO 790
  87. 730 LS =  VAL( MID$ (L$,3))
  88. 740  IF  LEN(L$) <4  THEN 780
  89. 750  FOR K = 4 TO  LEN(L$)
  90. 760  IF  MID$ (L$,K,1) = ","  OR  MID$ (L$,K,1) = " "  THEN LE =  VAL( MID$ (L$,K +1)): GOTO 790
  91. 770  NEXT 
  92. 780 LE = LS
  93. 790  IF LE = 0  THEN LE = 99999
  94. 800 N = 0
  95. 810  FOR J = 1 TO LE
  96. 820 N = A(N)
  97. 830  IF N = 0  THEN 860
  98. 840  IF J > = LS  THEN  PRINT  SPC( 3 - LEN( STR$(J)));J;":";A$(N)
  99. 850  NEXT 
  100. 860  PRINT : PRINT : PRINT : RETURN 
  101. 869 :
  102. 870  REM  *** GET LINE ***
  103. 871 :
  104. 880 L$ = "                                                                                "
  105. 890  REM  L$=80 SPACES
  106. 900 CC = 1
  107. 905 H = 1:V = 23: GOSUB 2000
  108. 910  IF CC <1  THEN CC = 1
  109. 920  IF CC >78  THEN CC = 78
  110. 930 :H = CC: GOSUB 2000: GET KB$
  111. 935 KB =  ASC(KB$)
  112. 940  IF  ASC(KB$) = 8  THEN CC = CC -1: GOTO 910
  113. 950  IF  ASC(KB$) = 21  THEN CC = CC +1: GOTO 920
  114. 960  IF  ASC(KB$) = 13  THEN 1040
  115. 970  IF  ASC(KB$) = 24  THEN  PRINT  CHR$(92): GOTO 880
  116. 980  IF  ASC(KB$) = 27  THEN CC = (CC > = 10) *30 +(CC <10) *10: GOTO 930: REM  ESCAPE
  117. 985  IF  ASC(KB$) = 9  THEN CC = (CC > = 10) *30 +(CC <10) *10: GOTO 930: REM  TAB KEY
  118. 987  IF  ASC(KB$) = 34  THEN KB$ = "'": REM  FORCE SINGLE QUOTE
  119. 990  ON  ASC(KB$) <32 GOTO 930: PRINT KB$;
  120. 1000  IF CC = 1  THEN L$ = KB$ + MID$ (L$,2):CC = CC +1: GOTO 930
  121. 1010  IF CC = 79  THEN L$ =  LEFT$(L$,78):H = CC: GOSUB 2000: PRINT " ";: GOTO 930
  122. 1020 L$ =  LEFT$(L$,CC -1) +KB$ + MID$ (L$,CC +1)
  123. 1030 CC = CC +1: GOTO 930
  124. 1040  IF CC = 1  THEN L$ = "": GOTO 1060
  125. 1050 L$ =  LEFT$(L$,CC -1)
  126. 1060  PRINT :H = 1: GOSUB 2000: PRINT L$; SPC( 80 -CC)
  127. 1070  REM  DELETE THIS LINE
  128. 1080  RETURN 
  129. 1090  REM  *** READ FILE ***
  130. 1100 A(0) = 1: ONERR  GOTO 1600
  131. 1105  PRINT D$"VERIFY"PR$
  132. 1110  PRINT D$"OPEN "PR$
  133. 1120  PRINT D$"READ "PR$
  134. 1130 N = N +1
  135. 1140  INPUT A$(N)
  136. 1150  IF  MID$ (A$(N),10,3) = "EOF"  THEN A$(N) = "":N = N -1:A(N) = 0: GOTO 1180
  137. 1160 A(N) = N +1
  138. 1170  GOTO 1130
  139. 1180  PRINT D$"CLOSE "PR$: POKE 216,0
  140. 1190  RETURN 
  141. 1200  REM  *** SAVE ***
  142. 1205 S = 1: REM  SAVE FLAG
  143. 1210  ONERR  GOTO 1600
  144. 1220  PRINT : PRINT D$"OPEN "PR$: PRINT D$"CLOSE": PRINT D$"DELETE "PR$
  145. 1230  PRINT D$"OPEN "PR$
  146. 1240  PRINT D$"WRITE "PR$
  147. 1250 N = 0
  148. 1260  PRINT  CHR$(34)A$(A(N)) CHR$(34)
  149. 1270 LN = N
  150. 1280 N = A(N)
  151. 1290  IF A(N) < >0  THEN 1260
  152. 1300  IF  MID$ (A$(LN),10,3) < >"EOF"  THEN  PRINT  CHR$(34)"         EOF" CHR$(34)
  153. 1310  PRINT D$"CLOSE "PR$
  154. 1315  ONERR  GOTO 1800
  155. 1320  PRINT "DO YOU WISH TO ASSEMBLE YOUR FILE? (Y/N) ";: GET K$: PRINT K$: IF K$ = "Y"  THEN  PRINT  CHR$(17): PRINT D$"PR#0": PRINT D$"IN#0": HOME : PRINT D$"RUN BASIC.ASSEMBLER"
  156. 1330  GOSUB 2050: POKE 216,0: END 
  157. 1340  REM  HELP SCREEN
  158. 1350  GOSUB 2050: INVERSE : PRINT "COMMANDS:                                                                       ": NORMAL 
  159. 1355  REM  71 SPACES BETWEEN ":" AND FINAL QUOTE
  160. 1360  PRINT "L         LIST ENTIRE PROGRAM"
  161. 1370  REM  DELETES THE ORIGINAL LINE 1370
  162. 1380  PRINT : PRINT "L N(,M)   LIST LINES N(THROUGH M)"
  163. 1390  PRINT : PRINT "D N       DELETE LINE N"
  164. 1400  PRINT : PRINT "I N       INPUT LINES AFTER N"
  165. 1410  PRINT : PRINT "P (N(,M)) PRINT LISTING"
  166. 1420  PRINT : PRINT "SAVE      SAVE THE PROGRAM TO DISK"
  167. 1430  PRINT : PRINT "N         EDIT LINE N"
  168. 1434  PRINT : PRINT "<ESC>     TAB (ONLY IN EDIT OR INPUT)"
  169. 1435  PRINT : PRINT "<TAB>     TAB (ONLY IN EDIT OR INPUT)"
  170. 1436  PRINT : PRINT "?         THIS HELP SCREEN": RETURN 
  171. 1440  DIM PN(15)
  172. 1450 PN(1) = 66:PN(2) = 89:PN(3) = 32
  173. 1460 PN(4) = 74:PN(5) = 79:PN(6) = 72
  174. 1470 PN(7) = 78:PN(8) = 32:PN(9) = 87
  175. 1480 PN(10) = 72:PN(11) = 73:PN(12) = 84
  176. 1490 PN(13) = 78:PN(14) = 69:PN(15) = 89
  177. 1500  FOR VN = 1 TO 15
  178. 1510  VTAB 4
  179. 1520  FOR VO = VN TO 1  STEP  -1
  180. 1530  PRINT  CHR$(PN(16 -VO));
  181. 1540  NEXT VO
  182. 1550  PRINT 
  183. 1560  NEXT VN
  184. 1570  PRINT 
  185. 1580  RETURN 
  186. 1590  REM  ERROR TRAP FOR SAVE & LOAD
  187. 1591 :
  188. 1600  POKE 216,0: PRINT : PRINT D$"CLOSE"
  189. 1605 E =  PEEK(222)
  190. 1610  IF E = 6  THEN  PRINT  CHR$(7)"FILE NOT ON THIS DISK": PRINT "PRESS ANY KEY =>";: GET A$: PRINT : GOTO 210
  191. 1620  IF E = 4  THEN  PRINT  CHR$(7)"DISK IS WRITE PROTECTED.": PRINT "PRESS ANY KEY =>";: GET A$: PRINT : GOTO 1220
  192. 1630  IF E = 9  THEN  PRINT  CHR$(7)"DISK IS FILL.  INSERT ONE THAT IS NOT FULL. ": PRINT "PRESS ANY KEY =>";: GET A$: PRINT : GOTO 1220
  193. 1640  IF E = 10  THEN  PRINT  CHR$(7)"FILE IS LOCKED.  GIVE ANOTHER FILE NAME: ";: INPUT PR$: GOTO 1220
  194. 1650  IF E = 8  THEN  PRINT  CHR$(7)"I/O ERROR ON DISK.  INSERT ANOTHER DISK. ": PRINT "PRESS ANY KEY =>";: GET A$: PRINT : ON (S = 1) *1 +(S < >1) *2 GOTO 1200,1090
  195. 1660  IF E = 5  THEN  PRINT  CHR$(7)"DID NOT FIND 'EOF' LINE IN FILE.": PRINT "PRESS ANY KEY TO CONTINUE ==>";: GET A$:A$(N) = "":N = N -1:A(N) = 0: GOTO 1180
  196. 1700  PRINT  CHR$(7)"ERROR #"; PEEK(222);" IN LINE "; PEEK(218) + PEEK(219) *256: END 
  197. 1715  PRINT : PRINT 
  198. 1797 :
  199. 1798  REM  ERROR ROUTINE FOR RUNNINGF BASIC ASSEMBLER
  200. 1799 :
  201. 1800  IF  PEEK(222) = 6  THEN  PRINT "PUT IN DISK WITH BASIC.ASSEMBLER": PRINT "AND PRESS ANY KEY =>";: GET A$: PRINT : GOTO 1320
  202. 1810  GOTO 1700
  203. 1997 :
  204. 1998  REM  GOTOHV ROUTINE: H - HORIZ 1-80; V - VERTICAL 1-24
  205. 1999 :
  206. 2000  HTAB V: POKE 36,H -1: RETURN 
  207. 2010  REM  ALTERNATE 80-COL CARDS MAY NEED DIFFERENT CURSOR POSITIONING
  208. 2020 :
  209. 2030  REM  ALTERNATE 80-COL CARDS MAY NEED DIFFERENT HOME ROUTINE
  210. 2040 :
  211. 2050  HOME : RETURN