First post, by Peter Swinkels
Hi,
I converted a Quick Basic program to work in GWBasic. At an emulated speed of 66 Mhz my program runs at an acceptable speed in Quick Basic, in GWBasic however it runs very slugglishly. It having been long a while ago I ever played with GWBasic can't figure out where exactly the problem might be. Yes, the interpreter is probably a bit slower, but that doesn't tell me what exactly is causing the massive slow down.
10 DEFINT A-Z: GOSUB 900: END20 FULLROW = 030 FOR PITY = 0 TO 1540 FULLROW = -150 FOR PITX = 0 TO 960 IF MID$(PIT$, ((10 * PITY) + PITX) + 1, 1) = "0" THEN FULLROW = 0: GOTO 8070 NEXT PITX80 IF FULLROW THEN REMOVEDROW = PITY: GOSUB 110090 NEXT PITY100 RETURN110 DROPRATE! = 1120 SHAPE = INT(RND * 6)130 SHAPEANGLE = INT(RND * 4)140 NEWANGLE = SHAPEANGLE150 GOSUB 510160 SHAPEMAP$ = ROTATEDMAP$170 GOSUB 450180 SHAPEX = RANDOMSHAPEX190 SHAPEY = -4200 RETURN210 COLOR 4: LOCATE 3, 2220 IF GAMEOVER THEN PRINT "Game over.": LOCATE , 2: PRINT "Press Enter to play a new game."; ELSE PRINT ; "Score:" + STR$(SCORE);230 RETURN240 LINE (116, 32)-STEP(92, 145), 15, B250 LINE (116, 32)-STEP(92, 0), 0260 FOR PITY = 0 TO 15270 FOR PITX = 0 TO 9280 IF GAMEOVER THEN BLOCKCOLOR$ = "4" ELSE BLOCKCOLOR$ = MID$(PIT$, ((10 * PITY) + PITX) + 1, 1)290 DRAWX = PITX: DRAWY = PITY: GOSUB 320300 NEXT PITX: NEXT PITY310 RETURN320 DRAWX = DRAWX * 9: DRAWY = DRAWY * 9330 LINE (DRAWX + 117, DRAWY + 32)-STEP(9, 9), VAL("&H" + BLOCKCOLOR$), BF340 LINE (DRAWX + 118, DRAWY + 33)-STEP(6, 6), 0, B350 RETURN360 FOR BLOCKX = 0 TO 3370 FOR BLOCKY = 0 TO 3380 PITX = SHAPEX + BLOCKX: PITY = SHAPEY + BLOCKY390 IF PITX >= 0 AND PITX < 10 AND PITY >= 0 AND PITY < 16 THEN GOSUB 420400 NEXT BLOCKY: NEXT BLOCKX410 RETURN420 IF ERASESHAPE THEN BLOCKCOLOR$ = MID$(PIT$, ((10 * PITY) + PITX) + 1, 1) ELSE BLOCKCOLOR$ = MID$(SHAPEMAP$, ((4 * BLOCKY) + BLOCKX) + 1, 1): IF BLOCKCOLOR$ = "0" THEN BLOCKCOLOR$ = MID$(PIT$, ((10 * PITY) + PITX) + 1, 1)430 DRAWX = PITX: DRAWY = PITY: GOSUB 320440 RETURN450 INTENDEDSHAPEX = INT((RND * 10) - 1): RANDOMSHAPEX = 0460 FOR XMOVE = 0 TO INTENDEDSHAPEX470 MOVEDMAP$ = SHAPEMAP$: XDIRECTION = 1: YDIRECTION = 0: GOSUB 620480 IF CANMOVE THEN RANDOMSHAPEX = RANDOMSHAPEX + 1 ELSE RETURN490 NEXT XMOVE500 RETURN510 GOSUB 720520 IF NEWANGLE = 0 THEN ROTATEDMAP$ = MAP$: RETURN530 ROTATEDMAP$ = STRING$(4 * 4, "0")540 FOR BLOCKX = 0 TO 3550 FOR BLOCKY = 0 TO 3560 IF NEWANGLE = 1 THEN NEWBLOCKX = 3 - BLOCKY: NEWBLOCKY = BLOCKX570 IF NEWANGLE = 2 THEN NEWBLOCKX = 3 - BLOCKX: NEWBLOCKY = 3 - BLOCKY580 IF NEWANGLE = 3 THEN NEWBLOCKX = BLOCKY: NEWBLOCKY = 3 - BLOCKX590 MID$(ROTATEDMAP$, ((4 * NEWBLOCKY) + NEWBLOCKX) + 1, 1) = MID$(MAP$, ((4 * BLOCKY) + BLOCKX) + 1, 1)600 NEXT BLOCKY: NEXT BLOCKX
610 RETURN620 CANMOVE = -1630 FOR BLOCKY = 0 TO 3640 FOR BLOCKX = 0 TO 3650 IF NOT MID$(MOVEDMAP$, ((4 * BLOCKY) + BLOCKX) + 1, 1) = "0" THEN GOSUB 680660 NEXT BLOCKX: NEXT BLOCKY670 RETURN680 PITX = (SHAPEX + BLOCKX) + XDIRECTION: PITY = (SHAPEY + BLOCKY) + YDIRECTION690 IF PITX >= 0 AND PITX < 10 AND PITY >= 0 AND PITY < 16 THEN IF NOT MID$(PIT$, (((10 * PITY) + PITX) + 1), 1) = "0" THEN CANMOVE = 0: RETURN700 IF PITX < 0 OR PITX >= 10 OR PITY >= 16 THEN CANMOVE = 0: RETURN710 RETURN720 MAP$ = ""730 IF SHAPE = 0 THEN MAP$ = "0000333300000000"740 IF SHAPE = 1 THEN MAP$ = "0000111000100000"750 IF SHAPE = 2 THEN MAP$ = "0000666060000000"760 IF SHAPE = 3 THEN MAP$ = "00000EE00EE00000"770 IF SHAPE = 4 THEN MAP$ = "0000022022000000"780 IF SHAPE = 5 THEN MAP$ = "0000555005000000"790 IF SHAPE = 7 THEN MAP$ = "0000440004400000"800 RETURN810 RANDOMIZE TIMER: KEY OFF: PLAY "ML L64": SCREEN 7: CLS : COLOR 9820 LOCATE 1, 1: PRINT "GWBlocks v1.00": PRINT "By: Peter Swinkels, ***2021***";830 GOSUB 110840 GAMEOVER = 0850 PIT$ = STRING$(10 * 16, "0")860 SCORE = 0870 GOSUB 240880 GOSUB 210890 RETURN900 GOSUB 810910 STARTTIME! = TIMER920 WHILE NOT KEYV$ = CHR$(27)930 KEYV$ = ""940 WHILE KEYV$ = ""950 IF (NOT GAMEOVER) AND (TIMER >= STARTTIME! + DROPRATE! OR STARTTIME! > TIMER) THEN GOSUB 1290: STARTTIME! = TIMER960 KEYV$ = INKEY$970 WEND980 ERASESHAPE = -1: GOSUB 360990 IF KEYV$ = CHR$(27) THEN SCREEN 0: END1000 IF GAMEOVER AND KEYV$ = CHR$(13) THEN GOSUB 8101010 IF (NOT GAMEOVER) AND (KEYV$ = "A" OR KEYV$ = "a") THEN GOSUB 11701020 IF (NOT GAMEOVER) AND (KEYV$ = CHR$(0) + "K") THEN MOVEDMAP$ = SHAPEMAP$: XDIRECTION = -1: YDIRECTION = 0: GOSUB 6201030 IF (NOT GAMEOVER) AND (KEYV$ = CHR$(0) + "M") THEN MOVEDMAP$ = SHAPEMAP$: XDIRECTION = 1: YDIRECTION = 0: GOSUB 6201040 IF (NOT GAMEOVER) AND (KEYV$ = CHR$(0) + "K" AND CANMOVE) THEN SHAPEX = SHAPEX - 11050 IF (NOT GAMEOVER) AND (KEYV$ = CHR$(0) + "M" AND CANMOVE) THEN SHAPEX = SHAPEX + 11060 IF (NOT GAMEOVER) AND (KEYV$ = " ") THEN DROPRATE! = 01070 ERASESHAPE = 0: GOSUB 3601080 WEND1090 RETURN1100 FOR PITROWY = REMOVEDROW TO 0 STEP -11110 FOR PITX = 0 TO 10 - 11120 IF PITROWY = 0 THEN BLOCKCOLOR$ = "0" ELSE BLOCKCOLOR$ = MID$(PIT$, ((10 * (PITROWY - 1)) + PITX) + 1, 1)1130 MID$(PIT$, ((10 * PITROWY) + PITX) + 1, 1) = BLOCKCOLOR$1140 NEXT PITX: NEXT PITROWY1150 SCORE = SCORE + 11160 RETURN1170 IF SHAPEANGLE = 3 THEN NEWANGLE = 0 ELSE NEWANGLE = SHAPEANGLE + 11180 GOSUB 5101190 MOVEDMAP$ = ROTATEDMAP$: XDIRECTION = 0: YDIRECTION = 0: GOSUB 6201200 IF CANMOVE THEN SHAPEANGLE = NEWANGLE: SHAPEMAP$ = ROTATEDMAP$1210 RETURN1220 PLAY "N21"1230 FOR BLOCKY = 0 TO 31240 FOR BLOCKX = 0 TO 31250 PITX = SHAPEX + BLOCKX: PITY = SHAPEY + BLOCKY1260 IF (PITX >= 0 AND PITX < 10 AND PITY >= 0 AND PITY < 16) AND (NOT MID$(SHAPEMAP$, ((4 * BLOCKY) + BLOCKX) + 1, 1) = "0") THEN MID$(PIT$, ((10 * PITY) + PITX) + 1, 1) = MID$(SHAPEMAP$, ((4 * BLOCKY) + BLOCKX) + 1, 1)1270 NEXT BLOCKX: NEXT BLOCKY1280 RETURN1290 MOVEDMAP$ = SHAPEMAP$: XDIRECTION = 0: YDIRECTION = 1: GOSUB 6201300 IF CANMOVE THEN GOSUB 1320 ELSE GOSUB 13601310 RETURN1320 ERASESHAPE = -1: GOSUB 3601330 IF DROPRATE! > 0 THEN SOUND 37, .31340 SHAPEY = SHAPEY + 1: ERASESHAPE = 0: GOSUB 3601350 RETURN1360 GOSUB 12201370 GAMEOVER = (SHAPEY < 0)1380 GOSUB 201390 GOSUB 2401400 GOSUB 2101410 IF NOT GAMEOVER THEN GOSUB 110: ERASESHAPE = 0: GOSUB 3601420 RETURN
I am using Quick Basic 4.5 as an editor and am trying to get to run the above smoothly in GWBasic 2.23. Does anyone have any idea here?
My GitHub:
https://github.com/peterswinkels