Really cool. I knew you could put non-line numbered statements into BASIC since I've seen boot files that did that. But never thought of doing a status bar. Curious why it's not more common in long BASIC listings.
Code: Select all
10 REMark MINESWEEPER
20 REMark (C)1999 BODO WENZEL
30 REMark SPEED UP AND I/O BY MIKE JONAS
40 REMark CONVERTED FROM ZX81 TO QL BASIC BY MIKE JONAS
100 REMark START, GET KEY, AND MOVE
110 GO SUB 3000
120 AT 0,26: PRINT T
130 LET T=T+1
140 AT Y,X-1: PRINT "_"
150 LET KEY=CODE (INKEY$)
AT #0,0,0:PRINT #0,"Loading ";
160 AT Y,X-1: PRINT F$(F(21*(X-1)+Y)+1);
170 IF KEY=0 THEN GO TO 140
180 IF KEY=LEFT AND X>1 THEN LET X=X-1
190 IF KEY=RIGHT AND X<32 THEN LET X=X+1
200 IF KEY=DOWN AND Y<21 THEN LET Y=Y+1
210 IF KEY=UP AND Y>1 THEN LET Y=Y-1
220 IF KEY=CHECK THEN GO SUB 1000
230 IF KEY=MARK THEN GO SUB 2000
240 IF N<>0 THEN GO TO 120
250 GO SUB 4000
AT #0,0,8:PRINT #0,"|"
260 GO TO 120
1000 REMark OPEN FIELD
1010 IF X<1 THEN RETurn
1020 IF X>32 THEN RETurn
1030 IF Y<1 THEN RETurn
1040 IF Y>21 THEN RETurn
1050 LET E=21*(X-1)+Y
1060 IF F(E)=19 THEN GO TO 5000
1070 IF F(E)<10 THEN RETurn
1080 IF F(E)>19 THEN RETurn
AT #0,0,8:PRINT #0,"/"
1090 LET F(E)=F(E)-10
1100 AT Y,X-1: PRINT F$(F(E)+1);
1110 IF F(E)<>0 THEN RETurn
1120 LET X=X-1
1130 LET Y=Y-1
1140 GO SUB 1000
1150 LET Y=Y+1
1160 GO SUB 1000
1170 LET Y=Y+1
1180 GO SUB 1000
AT #0,0,8:PRINT #0,"-"
1190 LET X=X+1
1200 GO SUB 1000
1210 LET Y=Y-1
1220 GO SUB 1000
1230 LET Y=Y-1
1240 GO SUB 1000
1250 LET X=X+1
1260 GO SUB 1000
1270 LET Y=Y+1
1280 GO SUB 1000
1290 LET Y=Y+1
AT #0,0,8:PRINT #0,"\"
1300 GO SUB 1000
1310 LET X=X-1
1320 LET Y=Y-1
1330 RETurn
2000 REMark MARK FIELD
2010 LET E=21*(X-1)+Y
2020 LET C=F(E)
2030 IF C<10 THEN RETurn
2040 IF C>=30 THEN GO TO 2100
2050 LET N=N+1
AT #0,0,8:PRINT #0,"|"
2060 IF C<20 THEN LET N=N-2
2070 LET F(E)=C+10
2080 AT 0,0: PRINT N;" "
2090 RETurn
2100 LET F(E)=C-20
2110 RETurn
3000 REMark SETUP
3010 DIM F(672)
3020 MODE 8: WINDOW #1,388,222,62,0: PAPER #1,7: INK #1,0: CLS #1
3030 AT 0,10: PRINT "MINESWEEPER"
AT #0,0,8:PRINT #0,"/"
3040 AT 5,5: PRINT "5..8 CURSOR"
3050 AT 7,5: PRINT "O OPEN"
3060 AT 9,5: PRINT "M MARK"
3070 GO SUB 3500
3080 AT 21,5: PRINT "PLEASE WAIT...";
3090 LET F$=" 12345678*##########@@@@@@@@@@???????????"
3095 FOR I=11 TO 20: F$(I)=CHR$(255)
3100 REMark PREPARE FIELD, SET BOMBS
3110 DIM B(70)
3120 AT 11,5: PRINT "PCT BOMBS SET: "
AT #0,0,8:PRINT #0,"-"
3130 FOR N=1 TO 70
3140 AT 11,20: PRINT INT (N*10/7);
3150 LET X=INT (RND*32)
3160 LET Y=INT (RND*21)
3170 IF F(21*X+Y+1)=9 THEN GO TO 3150
3180 FOR I=X TO X+2
3190 FOR J=Y TO Y+2
3200 IF I<1 THEN GO TO 3280
3210 IF I>32 THEN GO TO 3280
3220 IF J<1 THEN GO TO 3270
AT #0,0,8:PRINT #0,"\"
3230 IF J>21 THEN GO TO 3270
3240 LET E=21*(I-1)+J
3250 IF F(E)=9 THEN GO TO 3270
3260 LET F(E)=F(E)+1
3270 NEXT J
3280 NEXT I
3290 LET E=21*X+Y+1
3300 LET B(N)=E
3310 LET F(E)=9
3320 NEXT N
AT #0,0,8:PRINT #0,"|"
3330 REMark QL FOR LOOP DIFFERENT FROM ZX, SO IGNORE: LET N=N-1
3340 AT 1,0
3350 FOR Y=1 TO 21
3360 FOR X=1 TO 32
3370 LET E=21*(X-1)+Y
3380 LET F(E)=F(E)+10
3390 PRINT CHR$(255);
3400 NEXT X
3410 PRINT
3420 NEXT Y
AT #0,0,8:PRINT #0,"/"
3430 REMark INITIALIZE
3440 LET X=1
3450 LET Y=1
3460 LET T=0
3470 AT 0,0: PRINT N
3480 RETurn
3500 REMark CONFIG: BY MIKE JONAS FOR ZXSIMULATOR
3510 LET LEFT=CODE ("5")
3520 LET RIGHT=CODE ("8")
3530 LET DOWN=CODE ("6")
AT #0,0,8:PRINT #0,"-"
3540 LET UP=CODE ("7")
3550 LET CHECK=CODE ("o")
3560 LET MARK=CODE ("m")
3570 AT 11,5: PRINT "S:TART C:HANGE"
3580 GO SUB 3800
3590 AT 11,5: PRINT " "
3600 IF KEY=CODE ("s") THEN RETurn
3610 AT 11,5: PRINT "KEY FOR:"
3620 AT 11,14: PRINT "LEFT?"
3630 GO SUB 3800
AT #0,0,8:PRINT #0,"\"
3640 LET LEFT=KEY
3650 AT 11,14: PRINT "RIGHT?"
3660 GO SUB 3800
3670 LET RIGHT=KEY
3680 AT 11,14: PRINT "DOWN? "
3690 GO SUB 3800
3700 LET DOWN=KEY
3710 AT 11,14: PRINT "UP? "
3720 GO SUB 3800
3730 LET UP=KEY
3740 AT 11,14: PRINT "OPEN? "
AT #0,0,8:PRINT #0,"|"
3750 GO SUB 3800
3760 LET CHECK=KEY
3770 AT 11,5: PRINT " "
3780 RETurn
3800 REMark GET KEY
3810 LET KEY=CODE (INKEY$)
3820 IF KEY<>0 THEN RETurn
3830 GO TO 3810
4000 REMark CHECK END
4010 FOR I=1 TO 32
AT #0,0,8:PRINT #0,"/"
4020 FOR J=1 TO 21
4030 LET E=21*(I-1)+J
4040 LET K= F(E)
4050 IF K>=10 AND K<=19 THEN RETurn
4060 IF K>=30 THEN RETurn
4070 NEXT J
4080 NEXT I
4100 REMark WINNER
4120 LET K$="READY "
4130 GO TO 5500
AT #0,0,8:PRINT #0,"-"
5000 REMark HIT BOMB
5010 FOR N=1 TO 70
5020 LET E=B(N)
5030 LET X=INT ((E-1)/21)
5040 LET Y=E-(X*21)
5050 AT Y,X: PRINT "*"
5060 NEXT N
5070 LET K$=" BOOM "
5080 PAUSE 50
5500 REMark END MESSAGE
AT #0,0,8:PRINT #0,"\"
5510 AT 10,11: PRINT ":''''''''':"
5520 AT 11,11: PRINT ": ";K$;" :"
5530 AT 12,11: PRINT ":.........:"
5540 PAUSE 100
9000 CLS
9010 CLEAR
9020 AT 0,0: PRINT " MINESWEEPER BY BODO WENZEL"
9030 PRINT "TRANSLATED AND MCODER BY PETER"
9040 PRINT " HTTP://WWW.ZX81.DE"
9050 PRINT "ZXSIMULATOR KEY MAP: MIKE JONAS"
AT #0,0,8:PRINT #0,"|"
9060 PRINT
9070 PRINT "CHOOSE R:ESTART OR Q:UIT"
9080 INPUT I$
9090 IF LEN (I$)<>1 THEN GO TO 9080
9100 IF I$="r" THEN RUN
9110 STOP
AT #0,0,0:PRINT #0,"Complete."