home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug016.arc / XREFMWB.DOC < prev   
Text File  |  1979-12-31  |  8KB  |  180 lines

  1. ..Andrew,
  2. ..
  3. ..The MBASIC listing is 80 characters wide, the same as appears on the VDU.
  4. ..The text is 75 characters wide, but centred on the MBASIC listing, ie.
  5. ..^OL 3   ^OR 2. 
  6. ..                           Regards, Mark
  7. ..
  8. .PO 0
  9. áá           ááXREFMWB.BA╙                    Marδ Bisho≡  20.12.84
  10. áá             -----------
  11. áá 
  12. áá     Thi≤á disδ utilit∙ wil∞ compilσ ß cros≤ referencσ tablσ oµá ßá Microbeσ ì
  13. ááprograφá writteεá iε MicroworlΣ Basiπ (M╫ BASIC)«á  I⌠ i≤ ver∙á usefu∞á wheε ì
  14. áátryinτ t∩ understanΣ thσ logiπ oµ someonσ else≤ prograφ (o≥ you≥ owε !!!⌐ o≥ ì
  15. ááiµ yo⌡ wan⌠ t∩ makσ somσ changes«   Typica∞ prograφ outpu⌠ woulΣ be:-
  16.  
  17. ááCROS╙ REFERENC┼ LISTIN╟ FO╥ PROGRA═ FILE║     B:DUMMY.MWB
  18.  
  19. ááREF« LINEú         REFERENCE─ I╬ LINE#
  20. ááO╥ VARIABLE
  21. áá  12░              680
  22. áá  17░              130
  23. áá  18░              23░    27░    280
  24. áá  30░              15░    19░    22░   250
  25. áá┴                  10░    15░    20░   21░    260
  26. ááA1ñ                12░    12░    140
  27. ááB▒                 100
  28. ááB1$(SUB⌐           11░    17░    190
  29.  
  30. ááetc.
  31.  
  32. áá     Iεá thi≤á fictitiou≤á examplσ ß subroutinσ a⌠ linσ 30░ i≤á calleΣá froφ ì
  33. ááline≤ 150,190,22░ ª 250«á  Linσ 18░ i≤ thσ targe⌠ oµ GOTO'≤ iε line≤ 230,27░ ì
  34. á᪠280«á  Arra∙ variablσ B▒ i≤ DIMensioneΣ iε 100¼ anΣ useΣ a≤ ß strinτ arra∙ ì
  35. ááiεá 110,17░ ª 190«á Intege≥ variablσ ┴ i≤ useΣ iε line≤á 100,150,200,210,anΣ ì
  36. áá260«  Strinτ variablσ A1ñ i≤ useΣ twicσ iε linσ 120.
  37.  
  38. áá     XREFMWB.BA╙á i≤á aεá adaptioε oµ ßá Microsof⌠á Basiπá (MBASIC⌐á prograφ ì
  39. ááCROSSREF.BA╙á whicΦ ╔ founΣ oε ß Bulletiε Board¼á anΣ wa≤ originall∙ ßá BYT┼ ì
  40. ááarticlσ iε Augus⌠ 1983«á  CROSSREF.BA╙ doe≤ ß cros≤ ref« oε MBASI├ programs«  
  41.  
  42. áá    XREFMWB.BA╙á i≤á writteε iε MBASI├ anΣ  wa≤ no⌠ re-writteε iεá M╫á BASI├ ì
  43. áábecausσ M╫ BASI├ doe≤ no⌠ suppor⌠ Randoφ Acces≤ files¼ wherea≤ MBASI├ does.
  44. ááB∙ usinτ R┴ file≤ onl∙ 12╕ byte≤ oµ thσ prograφ t∩ bσ referenceΣ need≤ bσ iε ì
  45. áámemor∙ a⌠ ß time¼á allowinτ morσ rooφ fo≥ thσ strinτ array≤ whicΦ storσá thσ ì
  46. áácros≤á reference«á ie«á ß large≥ prograφ caε bσ cros≤á referenced«á  Becausσ ì
  47. ááXREFMWB.BA╙á i≤ writteε iε MBASI├ anΣ no⌠ machine-codσ  i⌠ i≤ fairl∙ slo≈ t∩ ì
  48. áárun«  Thσ  M╫ BASI├ gamσ 'Concentrationº (12K¼ 25╖ lines⌐ take≤ ┤ minute≤ t∩ ì
  49. ááproces≤á anΣá ßá furthe≥á ╕á minute≤ t∩ sor⌠á thσá strinτá array≤á prio≥á t∩ ì
  50. ááLPRINTing«   But ╔ thinδ yo⌡ wil∞ finΣ thσ result≤ wortΦ thσ wait.
  51.  
  52. áá    Iµ yo⌡ don'⌠ havσ ß printer¼á changσ al∞ LPRIN╘ statement≤ t∩ PRINT¼ anΣ ì
  53. áápu⌠á ßá 'wai⌠ fo≥ ke∙ entryº routinσ prio≥ t∩ them«á  BotΦá XREFMWB.BA╙á anΣ ì
  54. ááCROSSREF.BA╙ arσ oε thσ MBU╟ Australiß RBBS«á  ╔ havσ pu⌠ XREFMWB.BA╙ iε thσ ì
  55. áápubliπá domaiε fo≥ non-commercia∞ useagσ provideΣ thσ credit≤ iε thσ firs⌠ │ ì
  56. áálines are left intact. 
  57.  
  58.  
  59. 10 REM 'XREFMWB.BAS'  A MICROBEE UTILITY WRITTEN IN MICROSOFT BASIC, TO LPRINT
  60. 20 REM    A MICROWORLD BASIC CROSS REF.TABLE - BYTE 8/83 - (MOD. WD 2/84)
  61. 30 REM Input file changed Microsoft to Microworld Basic by  M.Bishop  20/12/85
  62.  
  63. 40 PRINT CHR$(26): PRINT "MICROBEE BASIC CROSS REFERENCE": PRINT: PRINTè50 PRINT "Note that the program is slow to run, but it is worthwhile.":PRINT
  64. 60 PRINT: PRINT"Enter the file name to be Cross Referenced - eg B:SCREEN.MWB"
  65. 70 PRINT
  66. 80 DIM LABEL$(2500),LINE.REF%(2500),C$(128)
  67. 90 LABEL.NUMBER=0 :FALSE=0 :TRUE=NOT FALSE :POINTER=129
  68. 100 TOKEN=FALSE
  69. 110 INPUT "ENTER FILE NAME";FILENAME$: PRINT
  70. 120 OPEN "R",#1,FILENAME$
  71. 130 FOR I=1 TO 128
  72. 140  FIELD #1,(I-1) AS X$,1 AS C$(I)
  73. 150 NEXT I
  74. 160 FOR I=1 TO 64: GOSUB 1040: NEXT I: REM SKIP MICROBEE BASIC SCRATCH PAD
  75. 170 GOSUB 1040: LOW.BYTE=C: GOSUB 1040: HIGH.BYTE=C
  76. 180 WHILE (LOW.BYTE <> 255) AND (HIGH.BYTE <> 255): REM NOT END OF PROGRAM
  77. 190  LINE.NO%=LOW.BYTE*256+HIGH.BYTE
  78. 200  PRINT "PROCESSING LINE N0. ";LINE.NO%
  79. 210  GOSUB 1040: REM SKIP RELATIVE JUMP BYTE
  80. 220  GOSUB 1040: REM GET ASCII NEXT CHR IN C
  81. 230  WHILE C<>13: REM NOT END OF LINE 
  82. 240   IF C<128 THEN 290: REM NOT A TOKEN CODE
  83. 250   IF C=161 OR C=148 THEN WHILE C<>13 :GOSUB 1040 :WEND :GOTO 350:
  84.       REM SKIP REM OR DATA STATEMENTS
  85. 260   IF C=160 THEN GOSUB 1040: WHILE C<>35 :GOSUB 1040: WEND: REM SKIP OUT(L)#
  86. 270   IF C=136 OR C=137 OR C=139 OR C=141 OR C=146 OR C=152 THEN TOKEN=TRUE:
  87.       GOTO 340: REM LINE NUMBERS ONLY FOR ELSE,THEN,NEXT,GOTO,GOSUB,RESTORE
  88. 280   IF C=129 OR C=138 OR C=177 OR C=219 THEN TOKEN=FALSE: GOTO 340:
  89.       REM NO LINE NUMBERS AFTER LET,FOR,CURS,PLAY
  90. 290   IF C=58 THEN TOKEN=FALSE: GOTO 340: REM ':' MARKS END OF STATEMENT
  91. 300   IF (C>64 AND C<91) THEN GOSUB 840 :GOTO 350: REM A - Z SO IS A VARIABLE
  92. 310   IF C=34 THEN GOSUB 1040 :WHILE C><34 AND C<>13 :GOSUB 1040 :WEND :
  93.       IF C=13 GOTO 350 :GOTO 340: REM IGNORE CHRS BETWEEN QUOTES
  94. 320   IF (TOKEN=TRUE AND C>47 AND C<58) THEN GOSUB 970: GOTO 350: REM LINE
  95. 330   IF C=91 THEN GOSUB 1040: WHILE C<>93 :GOSUB 1040: WEND: REM SKIP ALL [ ]
  96. 340   GOSUB 1040
  97. 350  WEND
  98. 360  IF C=13 THEN TOKEN=FALSE
  99. 370  GOSUB 800
  100. 380 WEND
  101.  
  102. 390 REM  SORTING OF LABELS & LINE NUMBERS
  103. 400 PRINT: PRINT "PROCESSING COMPLETE . . .": PRINT
  104. 410 PASS=0
  105. 420 G%=LABEL.NUMBER
  106. 430 PASSES=INT(LOG(G%)/LOG(2))+1
  107. 440 WHILE G%>1
  108. 450  PASS=PASS+1
  109. 460  PRINT "SORTING :PASS ";PASS;" OF ";PASSES;" PASSES
  110. 470  SORTED=FALSE
  111. 480  G%=G%/2
  112. 490  WHILE NOT SORTED
  113. 500   SORTED=TRUE
  114. 510   FOR I%=1 TO LABEL.NUMBER-G%
  115. 520   IG%=G%+I%
  116. 530   IF LABEL$(I%)<LABEL$(IG%) GOTO 620
  117. 540   IF LABEL$(I%)=LABEL$(IG%) GOTO 590è550   SWAP LABEL$(I%),LABEL$(IG%)
  118. 560   SWAP LINE.REF%(I%),LINE.REF%(IG%)
  119. 570   SORTED=FALSE
  120. 580   GOTO 620
  121. 590   IF LINE.REF%(I%) =<LINE.REF%(IG%) GOTO 620
  122. 600   SWAP LINE.REF%(I%),LINE.REF%(IG%)
  123. 610   SORTED=FALSE
  124. 620   NEXT I%
  125. 630  WEND
  126. 640 WEND
  127. 650 PRINT:PRINT "SORT COMPLETE . . .WRITING FILE" :PRINT :WIDTH LPRINT 80
  128. 660 LPRINT "CROSS REFERENCE LISTING FOR PROGRAM FILE:   ";FILENAME$
  129.  
  130. 670 REM  PRINTOUT OF CROSS REFERENCE TABLE
  131. 680 I=1 :LPRINT :LPRINT "REF. LINE#         REFERENCED IN LINE#"
  132. 690 LPRINT "OR VARIABLE"
  133. 700 WHILE I=<LABEL.NUMBER
  134. 710  LPRINT LABEL$(I);TAB(18);
  135. 720  CURRENT.LABEL$=LABEL$(I) :N=1
  136. 730  WHILE LABEL$(I)=CURRENT.LABEL$
  137. 740   LPRINT USING "#####  ";LINE.REF%(I);
  138. 750   I=I+1 :N=N+1 :IF N>9 THEN LPRINT ,TAB(18); :N=1
  139. 760  WEND
  140. 770  LPRINT
  141. 780 WEND
  142. 790 PRINT "END" :END
  143.  
  144. 800 REM SUB TO OBTAIN BASICS OFFSET ADRESS FOR LINE
  145. 810 GOSUB 1040 :LOW.BYTE=C
  146. 820 GOSUB 1040 :HIGH.BYTE=C
  147. 830 RETURN
  148.  
  149. 840 REM SUB TO GET VARIABLE NAME
  150. 850 LABEL.NUMBER=LABEL.NUMBER+1
  151. 860 LABEL$(LABEL.NUMBER)=CHR$(C)
  152. 870 GOSUB 1040
  153. 880 WHILE (C>47 AND C<58) OR (C>64 AND C<91) OR C=46
  154. 890  LABEL$(LABEL.NUMBER)=LABEL$(LABEL.NUMBER)+CHR$(C)
  155. 900  GOSUB 1040
  156. 910 WEND
  157. 920 IF (C>34 AND C<38) OR C=33 THEN LABEL$(LABEL.NUMBER)=LABEL$(LABEL.NUMBER)
  158.     +CHR$(C) :GOSUB 1040
  159. 930 WHILE C=32 :GOSUB 1040 :WEND
  160. 940 IF C=40 THEN LABEL$(LABEL.NUMBER)=LABEL$(LABEL.NUMBER)+"(SUB)" :GOSUB 1040
  161. 950 LINE.REF%(LABEL.NUMBER)=LINE.NO%
  162. 960 RETURN
  163.  
  164. 970 REM SUB TO GET LINE NUMBER
  165. 980 LABEL.NUMBER=LABEL.NUMBER+1
  166. 990 LINE.REF%(LABEL.NUMBER)=LINE.NO%: LINENUMBER$=""
  167. 1000 WHILE C>47 AND C<58: LINENUMBER$=LINENUMBER$+CHR$(C): GOSUB 1040: WEND
  168. 1010 LABEL$(LABEL.NUMBER)=SPACE$(5)
  169. 1020 RSET LABEL$(LABEL.NUMBER)=LINENUMBER$
  170. 1030 RETURN
  171. è1040 REM SUB TO GET ASCII VALUE FOR NEXT CHARACTER (C) IN FILE
  172. 1050 IF POINTER<128 GOTO 1080
  173. 1060 GET #1
  174. 1070 POINTER=0
  175. 1080 POINTER=POINTER+1
  176. 1090 C=ASC(C$(POINTER))
  177. 1100 RETURN
  178. 1110 END OF PROGRAM LISTING
  179.  
  180.