Custom fonts on the Spectrum require loading a font file (768 bytes of 8x8 bit data - 96 characters from 0x20 to 0x80) but it's reasonably straight forward:

LOAD "font.bin" CODE 64000
POKE 23607,249

But this works on the "regular" ULA layer - to make this work on layer 1 or layer 2, you need some magic:


Note that the semi-colon at the end of the statement ensures that there's no extra carriage returns printed to the screen.

Explained here by Gary Lancaster, author of NextBASIC:

You can replace the standard font for LAYER 0 by loading a standard 768-byte character set into memory and using: DPOKE 23606,address-256

This can then be used to replace the standard 8-bit font for all other layers with:


And, if desired, you can generate the other sizes (3- to 7-bit) from this with:


(You must be in LAYER 1 or LAYER 2 for these two commands to take effect).

The 256 offset is because the first character in the font is a space, set at ascii 32, and the glyphs are 8 bytes, so 32*8 = 256 offset.

There's a better explanation of the 256 offset here and setting the 16bit address.