1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/*!
# Conversions and Compatibility

64K BASIC aims for compatibility with a time when BASIC usually came on ROM.
There was an attempt to standardize BASIC in 1978 but it wouldn't succeed
until ten years later. The lack of an accepted standard and the challenge
of upgrading created many dialects of BASIC.

There's a lot of programs which will run without modification because
64K BASIC has all the quirks of the most popular ROM BASICs. This appendix
covers the most common problems you may come across when running an old
program. Mostly, there were multiple ways to do the same things. 64 BASIC
always implements the method that uses the least keywords.

## RANDOMIZE X
Old computers often didn't have useful entropy, not even a real-time clock.
Many implementations would reset the random number generator to the same state
on ever run, but almost all would reset to the same state every boot.
`RANDOMIZE` was used to get around this by asking the user for a seed.
64K BASIC reseeds the random number generator with good entropy on every run,
so in most cases you simply delete the unneeded code.

`RANDOMIZE` without an X will prompt the user for a seed value.
This allowed someone to replay the same game if they wanted.
To emulate this behavior, here's a replacement.

```text
INPUT "Random Number Seed";A:RND=RND(-ABS(A))
```

Probably the most common way to seed the random number generator is to time
how long it takes the user to respond to a prompt. This is not necessary
in 64K BASIC so if you see something similar to the following, you can
delete it.

```text
PRINT "Press any key to continue":WHILE INKEY$="":RND=RND():WEND
```

## GET A$

To get a single keypress and store it in A$, 64K BASIC uses the newer style:
```text
A$ = INKEY$
```

## Integer BASIC
Some versions of BASIC didn't support floating point types. Use `DEFINT`
to change the default variable type to integer. The RND function needed
to work without floats so we'll `DEF FN` a new one. Replace every `RND`
with `FNRND`.
```text
10 DEFINT A-Z:DEF FNRND(X)=INT(RND()*X+1)
```

## LOCATE ROW,COL

This is probably a GW-BASIC program so it might use graphics and sound.
However, in many cases it is simply used to center text on the screen.
Use `STRING$` to get a bunch of newlines and `SPC(X)` to move to the column.
```text
REM CLS:LOCATE 5,20:PRINT "TITLE"
CLS:PRINT STRING$(5,10)SPC(20)"TITLE"
```

## KEY OFF/ON

This controls display of the status line in GW-BASIC. Usually a program turns
it off at the start and back on at the end. You can delete these.

## SOUND and BEEP

64K BASIC does not support sound. Your terminal might beep with:
```text
PRINT CHR$(7)
```

## OPTION BASE

This selects if arrays start at 0 or 1. This isn't needed since memory isn't scarce.
Also, 64K BASIC arrays are sparse so by simply not using 0 it won't be allocated.

*/