home *** CD-ROM | disk | FTP | other *** search
- 10 ' * * * BASIC - FORTH * * *
- 20 ' BIRKEMEYER & PASCAL International
- 30 '
- 40 GOSUB 1980 : ' Initialisieren
- 50 '
- 60 M=0 : N=0
- 70 K=1 : VIEW=0 : FORGET=0
- 80 '
- 90 PRINT : INPUT F$ : F$ = F$+" "
- 100 L1=0
- 110 L(K)=L1 : LO(K)=LEN(F$) : L1=LO(K)
- 120 IF N<0 THEN PRINT "EMPTY - STACK " : GOTO 60
- 130 L(K) = L(K)+1
- 140 IF L(K) > LO(K) THEN GOTO 240
- 150 B$ = MID$(F$,L(K),1)
- 160 IF L(K) > LO(K) THEN GOTO 240
- 170 IF B$=" " THEN GOTO 130
- 180 A$ = B$
- 190 L(K) = L(K)+1
- 200 B$ = MID$(F$,L(K),1)
- 210 IF B$=" " THEN GOTO 310
- 220 A$ = A$+B$ : GOTO 190
- 230 GOTO 380
- 240 IF K<2 THEN GOTO 70
- 250 K=K-1
- 260 F$=MID$(F$,1,LO(K)) : L1=LO(K) : GOTO 130
- 270 '
- 280 PRINT "EMPTY - STACK " : GOTO 60
- 290 '
- 300 ' COLON-DEFINITION, KONSTANTEN & VARIABLEN
- 310 FOR Z=C TO KERNEL+1 STEP -1
- 320 IF A$<>WORT$(Z) THEN GOTO 360
- 330 IF VIEW THEN PRINT WORT$(Z),DEF$(Z) : VIEW=0 : GOTO 120
- 340 IF FORGET THEN C=Z-1 : FORGET=0 : GOTO 120
- 350 F$=F$+DEF$(Z) : K=K+1 : GOTO 110
- 360 NEXT Z
- 370 '
- 380 FOR Z=1 TO KERNEL ' FORTH-DEFINITIONEN ( KERNEL )
- 390 IF A$<>WORT$(Z) THEN GOTO 420
- 400 IF VIEW THEN PRINT "PROTECTED " : VIEW=0 : GOTO 120
- 410 IF FORGET THEN PRINT "PROTECTED " : FORGET=0 : GOTO 120 ELSE GOTO 440
- 420 NEXT Z
- 430 '
- 440 ON Z GOTO 610,620,630,640,650,660,670,680,700,710,730,740,750,770
- 450 ON Z-14 GOTO 790,800,820,840,860,880,900,920,940,960,970
- 460 ON Z-25 GOTO 980,990,1000,1010,1020,1030,1040,1060,1070,1080,1090
- 470 ON Z-36 GOTO 1100,1110,1130,1140,1170,1210,1220,1230,1240,1270,1280
- 480 ON Z-47 GOTO 1290,1300,1310,1320,1380,1390,1400,1590,1600,1610,1620
- 490 ON Z-58 GOTO 1630,1640,1650,1660,1680,1690,1700,1720,1740,1750,1800
- 500 ON Z-69 GOTO 1840,1860,1910,1930,1940,1950
- 510 '
- 520 NUM=1
- 530 FOR I=1 TO LEN(A$)
- 540 IF MID$(A$,I,1) < "0" OR MID$(A$,I,1) > "9" THEN NUM=0
- 550 IF I=1 AND MID$(A$,1,1) = "-" THEN NUM=1
- 560 NEXT I
- 570 IF NUM=0 THEN PRINT A$, "NICHT DEFINIERT" : GOTO 60
- 580 N=N+1 : S(N)=VAL(A$) : GOTO 120
- 590 '
- 600 ' D I C T I O N A R Y
- 610 FOR Z=C TO 1 STEP -1 : PRINT WORT$(Z), :NEXT Z:GOTO 120 ' WORDS
- 620 VIEW=1 : GOTO 120 ' VIEW
- 630 N=N-1 : S(N)=S(N)+S(N+1) : GOTO 120 ' +
- 640 N=N-1 : S(N)=S(N)-S(N+1) : GOTO 120 ' -
- 650 N=N-1 : S(N)=S(N)*S(N+1) : GOTO 120 ' *
- 660 N=N-1 : S(N)=INT(S(N)/S(N+1)) : GOTO 120 ' /
- 670 N=N-1 : S(N)=S(N)-(S(N+1)*INT(S(N)/S(N+1))) : GOTO 120 ' MOD
- 680 A=S(N-1):S(N-1)=A-(S(N)*INT(A/S(N)))
- 690 S(N)=INT(A/S(N)):GOTO 120 ' /MOD
- 700 N=N-2 : S(N)=INT(S(N)*S(N+1)/S(N+2)) : GOTO 120 ' */
- 710 S(N-2)=S(N-2)*S(N-1) : S(N-1)=S(N): N=N-1 : A=S(N-1) ' */MOD
- 720 S(N-1)=A-(S(N)*INT(A/S(N))):S(N)=INT(A/S(N)):GOTO 120
- 730 S(N)=ABS(S(N)) : GOTO 120 ' ABS
- 740 S(N)=S(N)*-1 : GOTO 120 ' MINUS
- 750 IF N<1 THEN GOTO 280 ' .S
- 760 FOR I=1 TO N : PRINT S(N-I+1) : NEXT I : GOTO 120
- 770 IF N<1 THEN GOTO 280 ' .
- 780 PRINT S(N); : N=N-1 : GOTO 120
- 790 N=0 : GOTO 120 ' CLS
- 800 IF S(N)<S(N-1) THEN S(N-1)=S(N) ' MIN
- 810 N=N-1 : GOTO 120
- 820 IF S(N)>S(N-1) THEN S(N-1)=S(N) ' MAX
- 830 N=N-1 : GOTO 120
- 840 N=N-1 : IF S(N)=S(N+1) THEN S(N)=1 ELSE S(N)=0 ' =
- 850 GOTO 120
- 860 N=N-1 : IF S(N)>S(N+1) THEN S(N)=1 ELSE S(N)=0 ' >
- 870 GOTO 120
- 880 N=N-1 : IF S(N)<S(N+1) THEN S(N)=1 ELSE S(N)=0 ' <
- 890 GOTO 120
- 900 N=N-1 : IF S(N)<>S(N+1) THEN S(N)=1 ELSE S(N)=0 ' <>
- 910 GOTO 120
- 920 N=N-1 : IF S(N)<=S(N+1) THEN S(N)=1 ELSE S(N)=0 ' <=
- 930 GOTO 120
- 940 N=N-1 : IF S(N)>=S(N+1) THEN S(N)=1 ELSE S(N)=0 ' >=
- 950 GOTO 120
- 960 S(N-1)=S(N) AND S(N-1) : N=N-1 : GOTO 120 ' AND
- 970 S(N-1)=S(N) OR S(N-1) : N=N-1 : GOTO 120 ' OR
- 980 S(N-1)=S(N) NOT S(N-1) : N=N-1 : GOTO 120 ' NOT
- 990 N=N+1 : S(N)=S(N-1) : GOTO 120 ' DUP
- 1000 IF S(N)<>0 THEN S(N+1)=S(N) : N=N+1 : GOTO 120 ' -DUP
- 1010 N=N-1 : GOTO 120 ' DROP
- 1020 S(N+1)=S(N-1) : S(N-1)=S(N) : S(N)=S(N+1) : GOTO 120 ' SWAP
- 1030 N=N+1 : S(N)=S(N-2) : GOTO 120 ' OVER
- 1040 A=S(N) : S(N)=S(N-2) : S(N-2)=S(N-1)
- 1050 S(N-1)=A : GOTO 120 ' ROT
- 1060 S(N)=S(N-S(N)) : GOTO 120 ' PICK
- 1070 N=N+1 : S(N)=R(M) : GOTO 120 ' R
- 1080 M=M+1 : R(M)=S(N) : N=N-1 : GOTO 120 ' >R
- 1090 N=N+1 : S(N)=R(M) : M=M-1 : GOTO 120 ' R>
- 1100 N=N+1 : S(N)=R(M) : GOTO 120 ' I
- 1110 M=M+1 : R(M)=L(K) : M=M+1 : R(M)=S(N-1) : M=M+1 ' DO
- 1120 R(M)=S(N) : N=N-2 : GOTO 120
- 1130 N=N+1 : S(N)=1 ' LOOP
- 1140 R(M)=R(M)+S(N) : N=N-1 ' +LOOP
- 1150 IF R(M-1) > R(M) THEN L(K)=R(M-2) ELSE M=M-3
- 1160 GOTO 120
- 1170 N=N-1 : IF S(N+1) THEN GOTO 120 ' IF
- 1180 FOR I=L(K) TO LO(K) : B$=MID$(F$,I,4)
- 1190 IF B$="ELSE" OR B$="THEN" THEN L(K)=I+4 : GOTO 120
- 1200 NEXT I : PRINT " IF ? " : GOTO 60
- 1210 GOTO 1180 ' ELSE
- 1220 GOTO 120 ' THEN
- 1230 M=M+1 : R(M)=L(K) : GOTO 120 ' BEGIN
- 1240 N=N-1 ' UNTIL
- 1250 IF S(N+1) THEN M=M-1 : GOTO 120
- 1260 L(K)=R(M) : GOTO 120
- 1270 END ' END
- 1280 PRINT : GOTO 120 ' CR
- 1290 PRINT CHR$(32); : N=N-1 : GOTO 120 ' SPACE
- 1300 PRINT SPC(S(N)); : N=N-1 : GOTO 120 ' SPACES
- 1310 PRINT CHR$(S(N)); : N=N-1 : GOTO 120 ' EMIT
- 1320 I=0
- 1330 GOTO 1360 : ' WHILE ." &
- 1340 I=I+1
- 1350 PRINT CHR$(ASC(MID$(F$,L(K)+I,1)));
- 1360 IF ASC(MID$(F$,L(K)+I+1,1))<>34 GOTO 1340 : ' WEND
- 1370 L(K)=L(K)+I+1 : GOTO 120
- 1380 CON=1 : GOTO 1400 ' CONSTANT
- 1390 VAR=1 ' VARIABLE
- 1400 C=C+1 : WORT$(C)="" : DEF$(C)="" ' : & ;
- 1410 I=0
- 1420 GOTO 1440 : ' WHILE
- 1430 I=I+1 : WORT$(C)=WORT$(C)+MID$(F$,L(K)+I,1)
- 1440 IF ASC(MID$(F$,L(K)+I+1,1))<>32 GOTO 1430 : ' WEND
- 1450 L(K)=L(K)+I+1
- 1460 IF CON THEN DEF$(C)=STR$(S(N))+" ":CON=0:N=N-1:GOTO 1540
- 1470 IF VAR THEN DEF$(C)=STR$(RAM)+" " : POKE RAM,S(N)
- 1480 IF VAR THEN RAM=RAM+2 : N=N-1 : VAR=0 : GOTO 1540
- 1490 I=0
- 1500 GOTO 1520 : ' WHILE
- 1510 I=I+1 : DEF$(C)=DEF$(C)+MID$(F$,L(K)+I,1)
- 1520 IF ASC(MID$(F$,L(K)+I+1,1))<>59 GOTO 1510 : ' WEND
- 1530 L(K)=L(K)+I+1
- 1540 FOR Z=1 TO C-1
- 1550 IF WORT$(C)=WORT$(Z) THEN PRINT WORT$(C),"ISN'T UNIQUE"
- 1560 NEXT Z
- 1570 IF LEFT$(DEF$(C),7)<>"<BUILDS" THEN GOTO 120 ' <BUILDS
- 1580 F$=F$+RIGHT$(DEF$(C),(LEN(DEF$(C))-7)) : K=K+1 : GOTO 110
- 1590 DEF$(C)=RIGHT$(DEF$(C),LO(K)-L(K)) : GOTO 70 ' DOES>
- 1600 FORGET=1 : GOTO 120 ' FORGET
- 1610 C=KERNEL : GOTO 120 ' NEW
- 1620 S(N)=PEEK(S(N)) : GOTO 120 ' @
- 1630 PRINT PEEK(S(N)) : N=N-1 : GOTO 120 ' ?
- 1640 POKE S(N),S(N-1) : N=N-2 : GOTO 120 ' !
- 1650 POKE S(N),(PEEK(S(N))+S(N-1)) : N=N-2 : GOTO 120 ' +!
- 1660 FOR Z=0 TO S(N)-1 ' MOVE
- 1670 POKE S(N-1)+2*Z,PEEK(S(N-2)+2*Z) : NEXT Z : N=N-3 : GOTO 120
- 1680 X=S(N) : N=N-1 : GOTO 1700 ' FILL
- 1690 X=0 ' ERASE
- 1700 FOR Z=S(N-1) TO S(N-1)+2*S(N)-2 STEP 2 ' BLANKS
- 1710 POKE Z,X : NEXT Z : N=N-2 : X=32 : GOTO 120
- 1720 FOR Z=S(N-1) TO S(N-1)+2*S(N)-2 STEP 2 ' DUMP
- 1730 PRINT PEEK(Z); " " ; :NEXT Z : N=N-2 : GOTO 120
- 1740 X$=INPUT$(1) : N=N+1 : S(N)=ASC(X$) : GOTO 120 ' KEY
- 1750 X$=" " : TIB$="" : X=0 ' QUERY
- 1760 GOTO 1780 : ' WHILE
- 1770 X=X+1 : X$=INPUT$(1) : POKE TIB+2*X,ASC(X$)
- 1780 IF ASC(X$)<>13 GOTO 1770 : ' WEND
- 1790 POKE TIB,X : SPAN=X-1 : GOTO 120
- 1800 X$=" " : FOR Z=1 TO S(N) : X$=INPUT$(1) ' EXPECT
- 1810 IF ASC(X$)=13 THEN GOTO 1830
- 1820 POKE S(N-1)+(2*Z-2),ASC(X$) : NEXT Z
- 1830 N=N-2 : SPAN=Z-1 : GOTO 120
- 1840 FOR Z=S(N-1) TO S(N-1)+2*S(N)-2 STEP 2 ' TYPE
- 1850 PRINT CHR$(PEEK(Z)); : NEXT Z : N=N-2 : GOTO 120
- 1860 I=0 :
- 1870 GOTO 1890 : ' WHILE WORD
- 1880 I=I+1 : POKE TIB+2*I,ASC(MID$(F$,L(K-1)+I,1))
- 1890 IF ASC(MID$(F$,L(K-1)+I+1,1)) <> S(N) GOTO 1880 : ' WEND
- 1900 SPAN=I : POKE TIB,I : N=N-1 : L(K-1)=L(K-1)+I+1 : GOTO 120
- 1910 N$="" : FOR Z=1 TO PEEK(S(N)) ' NUMBER
- 1920 N$=N$+CHR$(PEEK(S(N)+2*Z)) : NEXT Z : S(N)=VAL(N$) : GOTO 120
- 1930 N=N+1 : S(N)=TIB : GOTO 120 ' TIB
- 1940 N=N+1 : S(N)=SPAN : GOTO 120 ' SPAN
- 1950 N=N+1 : S(N)=32 : GOTO 120 ' BL
- 1960 '
- 1970 ' I N I T I A L I S I E R U N G
- 1980 CLEAR
- 1990 DIM S(100),R(100),L(100),LO(100),WORT$(100),DEF$(100)
- 2000 PRINT : PRINT "BASIC - FORTH"
- 2010 OPTION BASE 0
- 2020 KERNEL=75 : C=KERNEL : FORGET=0 : X=32 : RAM=300000 : TIB=350000
- 2030 FOR Z=1 TO KERNEL : READ WORT$(Z) : NEXT Z
- 2040 '
- 2050 DATA WORDS,VIEW,+,-,*,/,MOD,/MOD,*/,*/MOD,ABS,MINUS,.S,.
- 2060 DATA CLS,MIN,MAX,=,>,<,<>,<=,>=,AND,OR,NOT,DUP,-DUP,DROP
- 2070 DATA SWAP,OVER,ROT,PICK,R,>R,R>,I,DO,LOOP,+LOOP,IF,ELSE,THEN
- 2080 DATA BEGIN,UNTIL,END,CR,SPACE,SPACES,EMIT,.",CONSTANT,VARIABLE
- 2090 DATA :,DOES>,FORGET,NEW,@,?,!,+!,MOVE,FILL,ERASE,BLANKS,DUMP
- 2100 DATA KEY,QUERY,EXPECT,TYPE,WORD,NUMBER,TIB,SPAN,BL
- 2110 ' !!! ALLE BEFEHLE IN GROSSBUCHSTABEN !!!
- 2120 RETURN