Hopefully, this is a *pretty* comprehensive list:

- String handling
- No `FAST` and `SLOW`
- `UNPLOT`/`PLOT OVER`
- Additional (faster) method for storing integers
- Maths
- Multi-statement lines
- Scrolling
- ASCII
- Text display: `INVERSE`, `BRIGHT`, `FLASH`
- String input: `LINE`
- Pixel graphics: `LINE`, `CIRCLE` and `DRAW`, `POINT`. Also `PLOT`
- Colour: `BORDER`, `PAPER`, `INK`, `ATTR`
- Sound: `BEEP`
- Typographical
- Files and channels
- Fixed video RAM
- Input/Output: `IN`, `OUT`
- `SCREEN$`
- Binary: `BIN`
- Tape files: `VERIFY` and `MERGE`

This list omits the enhancements when plugging in *Interface 1*.

Looking at each in a little more detail...

#### String handling

ZX80 offered no string manipulation, whereas the ZX81 introduced `n TO m` - to simplify (and reduce memory). The Spectrum continued the use of `TO`, *possibly* with no further enhancements to the ZX81 functionality (I can't remember).

#### No `FAST` and `SLOW`

The ZX81 had `FAST` and `SLOW` keywords, for the two modes of operation. The Spectrum did away with these modes, and hence the keywords.

#### `UNPLOT`/`PLOT OVER`

The ZX81 has a third command the Spectrum doesn't have: `UNPLOT`. On the Spectrum, the same effect can be achieved by using `PLOT OVER` with the same x- and y-coordinates.

#### Additional (faster) method for storing integers

The ZX80 stored all numbers as floating point. The ZX81 added an "integer only" storage method, for numbers between -65535 to 65535, that was faster. It is unclear whether the Spectrum also had the integer storage method.

#### Maths

> Vickers further improved the math pacakge

... for the Spectrum, over the ZX81. How is was improved is unclear.

#### Multi-statement lines

The ZX81 only allowed one statement per line number. The Spectrum allowed multi-statement lines

#### Scrolling

The ZX81 doesn't scroll the screen automatically like the Spectrum does, you have to use a specific command, `SCROLL`.

#### ASCII

The ZX81 only has a limited character set with only upper case using non-ASCII values, whereas the Spectrum supports ASCII and lower case characters.

#### Text display: `INVERSE`, `BRIGHT`, `FLASH`

The Spectrum allowed effects to be added to text characters. The ZX80/ZX81 did not.

#### String input: `LINE`

The Spectrum offered an string input that suppressed the double quotes being printed:
```none
10 INPUT LINE A$ 
```
#### Pixel graphics: `LINE`, `CIRCLE` and `DRAW`, `POINT`. Also `PLOT`

The Spectrum gains all the pixel-manipulation commands: `LINE`, `CIRCLE` and `DRAW`.

`PLOT` now means a single pixel, whereas, IIRC, on the ZX81 a "pixel" was in fact a 4x4 pixel block .

`POINT` returns 1 if the pixel at (x,y) is ink colour. 0 if it is paper colour. Error B unless 0<=x<=255 and 0<=y<= 175.


#### Colour: `BORDER`, `PAPER`, `INK`, `ATTR`

For colour manipulation the Spectrum gains the `INK` and `PAPER` commands, and `BORDER`. `ATTR` would give the display attributes of a character location on screen,

#### Sound: `BEEP`

The ZX80 and ZX81 had no sound capability (unless some funky screen blanking code was used to create a buzz in order to approximate a noise but this was a side-effect, not a *feature*). 

The command `BEEP` provided sound on the Spectrum (plus `PLAY` on the 128k).

#### Typographical

There are minor typographical changes (ZX81 -> Spectrum): 

- `GOTO` -> `GO TO`
- `GOSUB` -> `GO SUB` 
- `RAND` -> `RANDOMIZE` ([the ZX80 used `RANDOMISE`][1])
- `CONT` -> `CONTINUE`
- etc. 

#### Files and channels

- The Spectrum offers more with files, and introduces streams: `MERGE`, `VERIFY`, `SCREEN$`, and `OPEN`/`CLOSE` `#`.

Additionally, for the Spectrum:

> because the hardware design was incomplete, [Vickers] created a hardware abstraction layer of channels and streams. 

This functionality was later "fleshed out" with the use of *Interface 1* (not covered here).

#### Fixed video RAM

The unexpanded base model of the ZX81 used an "elastic" (and rather annoying) memory map, starting at `D_FILE`, that expanded (and contracted?) as the screen was filled (or emptied) (IIRC, this was due to ZX81 having to accommodate for the very limited 1&nbsp;kB RAM available). It also moved around as the BASIC program residing beneath it grew or shrank.

[![Partial ZX81 memory map, showing the display map][2]][2]

 However, if a 16 kB RAM pack was used and detected, then the video memory *may have* automatically maxed out its size. It is better explained on page chapter 27 of the ZX81 BASIC manual:

> When the total amount of memory (according to the system variable `RAMTOP`) is less than 3 1/4 K, then a clear screen - as set up at the start or by `CLS` - consists of just twenty five `NEWLINE`s. When the memory is bigger than a clear screen is padded out with 24*32 spaces & on the whole it stays at its full size; `SCROLL`, however, & certain conditions where the lower part of the screen expands to more than two lines, can upset this by introducing short lines at the bottom.

The Spectrum had a fixed memory map for the RAM, split into two sections:

- 6144 bytes worth of bitmap data, starting at memory address &4000
- 768 byte colour attribute data, immediately after the bitmap data at address &5800

#### Input/Output: `IN`, `OUT`

I am not sure what these two commands did. According to [Appendix C of the Spectrum manual][3]:

> `IN` - The result of inputting at processor level from port x (0<=x<=FFFFh) (loads the bc register pair with x and does the assembly language instruction in a(c))

#### `SCREEN$`

> The character that appears, either normally or inverted, on the television at line x, column y. Gives the empty string, if the character is not recognised. Error B unless 0<=x<=23 and 0<=y<=31.

Also used, in conjunction with the `LOAD` and `SAVE` commands, to save and load a bitmap of the screen.

#### Binary: `BIN`

> An alternative notation for numbers: `BIN` followed by a sequence of 0s and 1s is the number with such a representation in binary

#### Tape files: `VERIFY` and `MERGE`

`VERIFY` and `MERGE` was introduced with the Spectrum, for enhanced tape based file storage, allowing you to verify a saved file, and to merge a saved file.

----

#### References

- [zx spectrum and zx81 BASIC differences?][4]
- [Reusing code, reverse engineering and collaboration][5]
- [Screen Memory Layout][6]
- [Peeking into the ZX81s Screen Maze][7]
- [Appendix C of the Spectrum manual][3]


 [1]: https://retrocomputing.stackexchange.com/q/26117/202
 [2]: https://i.sstatic.net/WW1QD.png "Partial ZX81 memory map, showing the display map"
 [3]: https://worldofspectrum.org/ZXBasicManual/zxmanappc.html
 [4]: https://www.reddit.com/r/zxspectrum/comments/o2poeo/zx_spectrum_and_zx81_basic_differences/
 [5]: https://andrewowen.net/blog/reusing-code-reverse-engineering-and-collaboration/
 [6]: http://www.breakintoprogram.co.uk/hardware/computers/zx-spectrum/screen-memory-layout
 [7]: https://www.zx81keyboardadventure.com/2017/03/peeking-into-zx81s-screen-maze.html