Ich entwickle einen BASIC Parser/Compiler, den ich mit einem möglichst umfangreichen Programm testen wollte. Da war Mafia ein idealer Kandidat.
Nun ist mir bei der Syntaxanalyse etwas aufgefallen. Es handelt sich um Mafia 1.20 (HtW), soweit ich mich erinnere:
Code
14006 PRINT"{CLEAR}{DOWN}der verkaeufer zeigt dir eine auswahl"
14007 PRINT"{DOWN}der modelle. zum kauf die entsprechende"
14008 PRINT"{DOWN}nummerntaste (0=ende) druecken!":GOSUB1100:PRINT"{CLEAR}";
14010 X=2:IFLN=2THENX=X+1
14011 FORI=0TOX:Y=X-1
14012 FORI=0TOX:PRINT:FORJ=1TO5:PRINT" {LIGHT GRAY}{REVERSE ON}{SPACE*8}{BLACK}":NEXTJ
14013 POKEPO+I,20+I:POKEV+2*I,38:POKEV+1+2*I,60+48*I:POKEV+39+I,0
14014 PRINTTAB(10)"{UP*5}"CHR$(49+I)" "TM$(I+1):PRINTTAB(11);3000+1000*I"${DOWN*3}"
14015 NEXT:Y=2^(X+1)-1:POKEV+23,Y:POKEV+29,Y:POKEV+21,Y:NEXT
14020 GETX$:IFX$=""GOTO14020
Das ist ziemlich unübersichtlich, deshalb hier die formatierte Ausgabe (überflüssige Labels wegoptimiert):
Code
14006:
PRINT "{CLEAR}{DOWN}der verkaeufer zeigt dir eine auswahl"
PRINT "{DOWN}der modelle. zum kauf die entsprechende"
PRINT "{DOWN}nummerntaste (0=ende) druecken!"
GOSUB 1100
PRINT "{CLEAR}" ;
X = 2
IF LN = 2 THEN X = X + 1
FOR I=0 TO X
Y = X - 1
FOR I=0 TO X
PRINT
FOR J=1 TO 5
PRINT " {LIGHT GRAY}{REVERSE ON}{SPACE*8}{BLACK}"
NEXT J
POKE PO + I,20 + I
POKE V + 2 * I,38
POKE V + 1 + 2 * I,60 + 48 * I
POKE V + 39 + I,0
PRINT TAB(10) "{UP*5}" CHR$(49 + I) " " TM$(I + 1)
PRINT TAB(11) ; 3000 + 1000 * I "${DOWN*3}"
NEXT
Y = 2 ^ (X + 1) - 1
POKE V + 23,Y
POKE V + 29,Y
POKE V + 21,Y
14020:
GET X$
IF X$ = "" GOTO 14020
Alles anzeigen
Die erste FOR-Schleife wird nie mit NEXT abgeschlossen. Mir ist das aufgefallen weil sich die Einrückung bis zum Ende durchzieht.
Die zweite Schleife verwendet ebenfalls I als Zähler.
Jetzt ist die Frage, ob dadurch irgendwann der Stack überläuft, oder ist das ein spezieller Commodore-Trick?
Ich würde ja sagen, die erste FOR-Schleife gehört da nicht hin. Oder vor Zeile 14020 ein NEXT? ![]()