11111111112222222222333333333344444444445555555555666666666677777777778 12345678901234567890123456789012345678901234567890123456789012345678901234567890 There were a small number of changes made to the programs in order to make them runnable. These are apparently due to differences between original Microsoft Basic and later versions (GW-BASIC, QBASIC). In all cases, the problem was that the program was taking advantage of a quirk of original Microsoft basic, which didn't work with later versions. So the GW-Basic/QBasic Modified sources are simply cleaner version of the originals, and should be usable for other Basic dialects as well. <------------------------- THINGS THAT WERE FIXED -----------------------------> 1. In "Sinewave" the statement: 40 REMARKABLE .... Uses a trick that worked with many Basic interpreters that recognize keywords wherever they appear, even in the middle of other words. This does not work in GWBasic/QBasic. MYSTRING$ Are allowed, you would go crazy trying to chase down imbedded keywords. It worked in neither GW-BASIC nor QBASIC. 2. (various files) Spacing. As in example (1), it is not possible to have the statement: 10IFC$="BARK"THENGOTO20 The keywords must not be run together with other keywords and variable names (which was sometimes done to save memory space on early machines): 10 IF C$="BARK" THEN GOTO 20 3. (varius files) Special characters. Occasionally, a special character (control character) appears in the programs. These were REMed out. Special characters in ASCII are characters less than 32 in value (space). 8. In the program "hexapawn", the function fns appears before its definition, which causes a problem with Qbasic. The lines 20 and 25 were swapped. 9. In the program "hexapawn", line 511 uses an unterminated REM statement. Space added. 10. "Hexapawn" has an interesting board output routine that executes tab(10) (line 1030) multiple times. On the original MS Basic (and other basics) tabbing to a position that is behind or at the current position is a no-op. GW-Basic and Qbasic actually throw another line and tabs to the position. This was fixed by replacing: 1030 PRINT TAB(10);MID$(P$,S((I-1)*3+J)+2,1); With: 1015 PRINT TAB(10); 1020 FOR J=1 TO 3 1030 PRINT MID$(P$,S((I-1)*3+J)+2,1); I.e., move the tab to print position to the outter loop, since it only need be executed once. 11. "hilo" makes the unwarranted assumption in line 180 that 100*rnd(1) will be a number from 1 to 100. Actually, the number will be between 0 and 99, since exact 0 and exact 1 will never be the result of rnd, and the fraction is removed. Fixed by changing line 180 to: 180 Y=INT(100*RND(1)+1) 12. In "horserace", there is a really bazzare bit of code in lines 570 to 780 where the value of N is used after a for n=..next loop, and apparently it expects the value to be 8. In both IP Basic and Qbasic it isn't, but is instead 9, and this results in access to the uninitialized variable d(i) and a zero divide. Fixed this by adding the line: 721 n = 8 13. In "salvo", line 1270, DEF FNA is executed twice, because the code loops back to that point. On several basics this is not a nice trick, although the original Microsoft Basic probably tolerated it. The solution was to move the defines upwards toward the top. 15. "bowling" does not format correctly on GW-Basic and QBasic. This is because of the tab issue (see "hexapawn" above). The answer is to replace three existing lines with the following ones: 3780 PRINT: PRINT TAB(I+1); 4140 PRINT "+ "; 4320 PRINT "O "; 16. In "awari", GW-Basic and QBasic don't apprecate the odd order of the "for" statement at 230. This occurs because the Basic implementation is doing more complete analysis of the Basic source while reading it, and it will get confused if there aren't matching "next" statements for each "for" statement in the statements following. The fix was to change the statement at 235 to: 235 NEXT I Because all the line did was branch to a "NEXT I" statement. 17. "checkers" has the "for" issue problem at 1340. The code was changed by moving the "NEXT A" to each of the for loops on previous lines, based on the fact that S(X,Y) is invariant in the included code. 1340 X=R(3):Y=R(4):IF S(X,Y)=-1 THEN B=-2:FOR A=-2 TO 2 STEP 4:GOSUB 1370: NEXT A 1350 IF S(X,Y)=-2 THEN FOR A=-2 TO 2 STEP 4:FOR B=-2 TO 2 STEP 4:GOSUB 1370:NEXT B: NEXT A 1360 IF R(0)<>-99 THEN PRINT"TO"R(3);R(4);:R(0)=-99:GOTO 1240 18. In "qubic" (3d tic tac toe), the line 1560 attempts to run non-existant program "menu" (and crashes/hangs GW-Basic/QBasic). Change this line to: 1560 STOP 19. In "qubic", the "lprint" statement is used to print out the playing board. This is not useful unless you have a printer connected for DOS use, which is not common with Windows users. These statements were changed to "print". 20. "life", the program spills out endless printout, since neither GW-Basic nor QBASIC appear to respond to control-C unless the program performs input. To fix this, the following statement was added: 637 INPUT "PRESS RETURN TO CONTINUE";A12 21. In "banner", the banner text is printed to the screen, then 75 lines of blanks are printed to the screen. Unless your screen is more than 75 lines tall, the program will just result in a blank screen, without apparent action. Banner was designed for continous print forms, like teletypes or old form feed printers. The best use of it now would be to save the output to a file, which I have left up to the users. 22. In "animal", there were two "for-next" issues, lines 415 and 640. The solution was to move the next statement to the next line. 23. "bullfght", the lines 1390 and 1395 were swapped to remove definition order issue. 24. "poetry" loops forever, which locks up GW-Basic/QBasic. I added the following line: 237 INPUT "PRESS RETURN TO CONTINUE"; A12 You are free to change this to output a whole page before stopping, etc. 25. "splat" has and error in referencing a non-existant line 540. Its wrong in the original listing from the book, take a look. It does not appear to affect the program run, which is probally why it exists. QBasic does not appreciate gotos that go nowhere, so the line was replaced by: 610 STOP: REM GOTO 540 26. In "stock", QBasic didn't like the lack of ";" between print items. This was added. 658 PRINT "YOU HAVE USED $";-C5;" MORE THAN YOU HAVE." <------------------------ THINGS THAT WEREN'T FIXED ---------------------------> 1. "checkers" was seen making impossible moves, jumping a opposing player, but leaving the original position still there (duplicated piece). 2. "diamond" does not work quite correctly, I suspect because of the tab issue. 3. "life2" does not match the printout in the book, which frankly does not make much sense. It looks like the original relied on overprinting on a teletype. 4. Animal does not work, giving incorrect printout. 5. "life" works under GW-Basic, but not QBasic.