Here's my question - CBLOCK defines a block of constants starting at a
given address. Problem is, 0CH isn't a valid address - or is it? If it
is, why does it have a '0' in the lead position? 0xCH isn't valid as H
is one too many for hex? I expect I'm being dumb but, can someone
please point me to my mistake?

The zero ("0") is put before the hex character (in your example "C") because
it indicates to the assembler that it is a constant value.

Without the zero, the assembler would encounter the string "Ch", which it
would assume is a label.

When I'm doing PC assembly language, this one always bites me on the bum -
It's easy to write "10h" (which will be correctly interpreted as 16 decimal)
and then follow with "AAh" which is going to be initially interpreted as a
label.