After reading elsewhere that DJNZ decrements the b register and jumps if b>0 then would this have the effect that I was after initially (filling the screen with a single character '@') ? If this is incorrect and it should be 'c' then swap b and c over in the below.
I'm not sure I understand the ldir command, what happens when the screen is full ? what stops the loop ?
djnz operates on c - hence the "c" being thought of as the "counter" register. This is carried through to the 8086 where cx is called "counter" (ax,bx,cx,dx = Accumulator, Base, Counter, Data).
As you noted in your later post, ldir stops when bc = 0, and it decrements bc after each copy. It's best to think of it as "copies bc bytes from hl to de, going up in memory" compare with lddr which copies bc bytes from hl to de, but does so going down, i.e. the first copy is from hl + (bc -1) to de + (bc -1).
Your code won't fill the screen with characters, only attributes. The Spectrum memory map has two parts:
1) The bitmap display at 16384, consisting of 24 rows of 32 columns with 8 pixel columns and 8 pixel rows per character. A 1 bit indicates the pixel is INK, a 0 bit indicates paper.
2) The attribute map at 22528. This holds one byte for each 8 pixel by 8 pixel character cell. The rightmost 3 bits are the INK colour (0-7), the next 3 bits (to the left) are the PAPER colour (0-7), then the next bit is the BRIGHT attribute, and the leftmost bit is the FLASH attribute.
So all your code will do is make the screen brighter
For reference, the screen address works as follows 16-bit address, add 16384 to result:
Bits 0-4: Text column, or leftmost 3 bits of graphics x coordinate
Bits 5-7: rightmost 3 bits of text row, or rightmost 3 bits of graphics y-coordinate
Bits 8-10: remaining 3 bits of text row, or next 3 bits of graphics y co-ordinate
Bits 11-12: remaining 2 bits of graphics y-coordinate (11 is not valid).
So you'll need to fill this with data to put characters on screen.