home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
CP/M
/
CPM_CDROM.iso
/
mbug
/
mbug016.arc
/
XREFMWB.DOC
< prev
Wrap
Text File
|
1979-12-31
|
8KB
|
180 lines
..Andrew,
..
..The MBASIC listing is 80 characters wide, the same as appears on the VDU.
..The text is 75 characters wide, but centred on the MBASIC listing, ie.
..^OL 3 ^OR 2.
.. Regards, Mark
..
.PO 0
áá ááXREFMWB.BA╙ Marδ Bisho≡ 20.12.84
áá -----------
áá
áá Thi≤á disδ utilit∙ wil∞ compilσ ß cros≤ referencσ tablσ oµá ßá Microbeσ ì
ááprograφá writteεá iε MicroworlΣ Basiπ (M╫ BASIC)«á I⌠ i≤ ver∙á usefu∞á wheε ì
áátryinτ t∩ understanΣ thσ logiπ oµ someonσ else≤ prograφ (o≥ you≥ owε !!!⌐ o≥ ì
ááiµ yo⌡ wan⌠ t∩ makσ somσ changes« Typica∞ prograφ outpu⌠ woulΣ be:-
ááCROS╙ REFERENC┼ LISTIN╟ FO╥ PROGRA═ FILE║ B:DUMMY.MWB
ááREF« LINEú REFERENCE─ I╬ LINE#
ááO╥ VARIABLE
áá 12░ 680
áá 17░ 130
áá 18░ 23░ 27░ 280
áá 30░ 15░ 19░ 22░ 250
áá┴ 10░ 15░ 20░ 21░ 260
ááA1ñ 12░ 12░ 140
ááB▒ 100
ááB1$(SUB⌐ 11░ 17░ 190
ááetc.
áá Iεá thi≤á fictitiou≤á examplσ ß subroutinσ a⌠ linσ 30░ i≤á calleΣá froφ ì
ááline≤ 150,190,22░ ª 250«á Linσ 18░ i≤ thσ targe⌠ oµ GOTO'≤ iε line≤ 230,27░ ì
á᪠280«á Arra∙ variablσ B▒ i≤ DIMensioneΣ iε 100¼ anΣ useΣ a≤ ß strinτ arra∙ ì
ááiεá 110,17░ ª 190«á Intege≥ variablσ ┴ i≤ useΣ iε line≤á 100,150,200,210,anΣ ì
áá260« Strinτ variablσ A1ñ i≤ useΣ twicσ iε linσ 120.
áá XREFMWB.BA╙á i≤á aεá adaptioε oµ ßá Microsof⌠á Basiπá (MBASIC⌐á prograφ ì
ááCROSSREF.BA╙á whicΦ ╔ founΣ oε ß Bulletiε Board¼á anΣ wa≤ originall∙ ßá BYT┼ ì
ááarticlσ iε Augus⌠ 1983«á CROSSREF.BA╙ doe≤ ß cros≤ ref« oε MBASI├ programs«
áá XREFMWB.BA╙á i≤á writteε iε MBASI├ anΣ wa≤ no⌠ re-writteε iεá M╫á BASI├ ì
áábecausσ M╫ BASI├ doe≤ no⌠ suppor⌠ Randoφ Acces≤ files¼ wherea≤ MBASI├ does.
ááB∙ usinτ R┴ file≤ onl∙ 12╕ byte≤ oµ thσ prograφ t∩ bσ referenceΣ need≤ bσ iε ì
áámemor∙ a⌠ ß time¼á allowinτ morσ rooφ fo≥ thσ strinτ array≤ whicΦ storσá thσ ì
áácros≤á reference«á ie«á ß large≥ prograφ caε bσ cros≤á referenced«á Becausσ ì
ááXREFMWB.BA╙á i≤ writteε iε MBASI├ anΣ no⌠ machine-codσ i⌠ i≤ fairl∙ slo≈ t∩ ì
áárun« Thσ M╫ BASI├ gamσ 'Concentrationº (12K¼ 25╖ lines⌐ take≤ ┤ minute≤ t∩ ì
ááproces≤á anΣá ßá furthe≥á ╕á minute≤ t∩ sor⌠á thσá strinτá array≤á prio≥á t∩ ì
ááLPRINTing« But ╔ thinδ yo⌡ wil∞ finΣ thσ result≤ wortΦ thσ wait.
áá Iµ yo⌡ don'⌠ havσ ß printer¼á changσ al∞ LPRIN╘ statement≤ t∩ PRINT¼ anΣ ì
áápu⌠á ßá 'wai⌠ fo≥ ke∙ entryº routinσ prio≥ t∩ them«á BotΦá XREFMWB.BA╙á anΣ ì
ááCROSSREF.BA╙ arσ oε thσ MBU╟ Australiß RBBS«á ╔ havσ pu⌠ XREFMWB.BA╙ iε thσ ì
áápubliπá domaiε fo≥ non-commercia∞ useagσ provideΣ thσ credit≤ iε thσ firs⌠ │ ì
áálines are left intact.
10 REM 'XREFMWB.BAS' A MICROBEE UTILITY WRITTEN IN MICROSOFT BASIC, TO LPRINT
20 REM A MICROWORLD BASIC CROSS REF.TABLE - BYTE 8/83 - (MOD. WD 2/84)
30 REM Input file changed Microsoft to Microworld Basic by M.Bishop 20/12/85
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
60 PRINT: PRINT"Enter the file name to be Cross Referenced - eg B:SCREEN.MWB"
70 PRINT
80 DIM LABEL$(2500),LINE.REF%(2500),C$(128)
90 LABEL.NUMBER=0 :FALSE=0 :TRUE=NOT FALSE :POINTER=129
100 TOKEN=FALSE
110 INPUT "ENTER FILE NAME";FILENAME$: PRINT
120 OPEN "R",#1,FILENAME$
130 FOR I=1 TO 128
140 FIELD #1,(I-1) AS X$,1 AS C$(I)
150 NEXT I
160 FOR I=1 TO 64: GOSUB 1040: NEXT I: REM SKIP MICROBEE BASIC SCRATCH PAD
170 GOSUB 1040: LOW.BYTE=C: GOSUB 1040: HIGH.BYTE=C
180 WHILE (LOW.BYTE <> 255) AND (HIGH.BYTE <> 255): REM NOT END OF PROGRAM
190 LINE.NO%=LOW.BYTE*256+HIGH.BYTE
200 PRINT "PROCESSING LINE N0. ";LINE.NO%
210 GOSUB 1040: REM SKIP RELATIVE JUMP BYTE
220 GOSUB 1040: REM GET ASCII NEXT CHR IN C
230 WHILE C<>13: REM NOT END OF LINE
240 IF C<128 THEN 290: REM NOT A TOKEN CODE
250 IF C=161 OR C=148 THEN WHILE C<>13 :GOSUB 1040 :WEND :GOTO 350:
REM SKIP REM OR DATA STATEMENTS
260 IF C=160 THEN GOSUB 1040: WHILE C<>35 :GOSUB 1040: WEND: REM SKIP OUT(L)#
270 IF C=136 OR C=137 OR C=139 OR C=141 OR C=146 OR C=152 THEN TOKEN=TRUE:
GOTO 340: REM LINE NUMBERS ONLY FOR ELSE,THEN,NEXT,GOTO,GOSUB,RESTORE
280 IF C=129 OR C=138 OR C=177 OR C=219 THEN TOKEN=FALSE: GOTO 340:
REM NO LINE NUMBERS AFTER LET,FOR,CURS,PLAY
290 IF C=58 THEN TOKEN=FALSE: GOTO 340: REM ':' MARKS END OF STATEMENT
300 IF (C>64 AND C<91) THEN GOSUB 840 :GOTO 350: REM A - Z SO IS A VARIABLE
310 IF C=34 THEN GOSUB 1040 :WHILE C><34 AND C<>13 :GOSUB 1040 :WEND :
IF C=13 GOTO 350 :GOTO 340: REM IGNORE CHRS BETWEEN QUOTES
320 IF (TOKEN=TRUE AND C>47 AND C<58) THEN GOSUB 970: GOTO 350: REM LINE
330 IF C=91 THEN GOSUB 1040: WHILE C<>93 :GOSUB 1040: WEND: REM SKIP ALL [ ]
340 GOSUB 1040
350 WEND
360 IF C=13 THEN TOKEN=FALSE
370 GOSUB 800
380 WEND
390 REM SORTING OF LABELS & LINE NUMBERS
400 PRINT: PRINT "PROCESSING COMPLETE . . .": PRINT
410 PASS=0
420 G%=LABEL.NUMBER
430 PASSES=INT(LOG(G%)/LOG(2))+1
440 WHILE G%>1
450 PASS=PASS+1
460 PRINT "SORTING :PASS ";PASS;" OF ";PASSES;" PASSES
470 SORTED=FALSE
480 G%=G%/2
490 WHILE NOT SORTED
500 SORTED=TRUE
510 FOR I%=1 TO LABEL.NUMBER-G%
520 IG%=G%+I%
530 IF LABEL$(I%)<LABEL$(IG%) GOTO 620
540 IF LABEL$(I%)=LABEL$(IG%) GOTO 590è550 SWAP LABEL$(I%),LABEL$(IG%)
560 SWAP LINE.REF%(I%),LINE.REF%(IG%)
570 SORTED=FALSE
580 GOTO 620
590 IF LINE.REF%(I%) =<LINE.REF%(IG%) GOTO 620
600 SWAP LINE.REF%(I%),LINE.REF%(IG%)
610 SORTED=FALSE
620 NEXT I%
630 WEND
640 WEND
650 PRINT:PRINT "SORT COMPLETE . . .WRITING FILE" :PRINT :WIDTH LPRINT 80
660 LPRINT "CROSS REFERENCE LISTING FOR PROGRAM FILE: ";FILENAME$
670 REM PRINTOUT OF CROSS REFERENCE TABLE
680 I=1 :LPRINT :LPRINT "REF. LINE# REFERENCED IN LINE#"
690 LPRINT "OR VARIABLE"
700 WHILE I=<LABEL.NUMBER
710 LPRINT LABEL$(I);TAB(18);
720 CURRENT.LABEL$=LABEL$(I) :N=1
730 WHILE LABEL$(I)=CURRENT.LABEL$
740 LPRINT USING "##### ";LINE.REF%(I);
750 I=I+1 :N=N+1 :IF N>9 THEN LPRINT ,TAB(18); :N=1
760 WEND
770 LPRINT
780 WEND
790 PRINT "END" :END
800 REM SUB TO OBTAIN BASICS OFFSET ADRESS FOR LINE
810 GOSUB 1040 :LOW.BYTE=C
820 GOSUB 1040 :HIGH.BYTE=C
830 RETURN
840 REM SUB TO GET VARIABLE NAME
850 LABEL.NUMBER=LABEL.NUMBER+1
860 LABEL$(LABEL.NUMBER)=CHR$(C)
870 GOSUB 1040
880 WHILE (C>47 AND C<58) OR (C>64 AND C<91) OR C=46
890 LABEL$(LABEL.NUMBER)=LABEL$(LABEL.NUMBER)+CHR$(C)
900 GOSUB 1040
910 WEND
920 IF (C>34 AND C<38) OR C=33 THEN LABEL$(LABEL.NUMBER)=LABEL$(LABEL.NUMBER)
+CHR$(C) :GOSUB 1040
930 WHILE C=32 :GOSUB 1040 :WEND
940 IF C=40 THEN LABEL$(LABEL.NUMBER)=LABEL$(LABEL.NUMBER)+"(SUB)" :GOSUB 1040
950 LINE.REF%(LABEL.NUMBER)=LINE.NO%
960 RETURN
970 REM SUB TO GET LINE NUMBER
980 LABEL.NUMBER=LABEL.NUMBER+1
990 LINE.REF%(LABEL.NUMBER)=LINE.NO%: LINENUMBER$=""
1000 WHILE C>47 AND C<58: LINENUMBER$=LINENUMBER$+CHR$(C): GOSUB 1040: WEND
1010 LABEL$(LABEL.NUMBER)=SPACE$(5)
1020 RSET LABEL$(LABEL.NUMBER)=LINENUMBER$
1030 RETURN
è1040 REM SUB TO GET ASCII VALUE FOR NEXT CHARACTER (C) IN FILE
1050 IF POINTER<128 GOTO 1080
1060 GET #1
1070 POINTER=0
1080 POINTER=POINTER+1
1090 C=ASC(C$(POINTER))
1100 RETURN
1110 END OF PROGRAM LISTING