Hi rune,
The main way to print a character on the zx81, is to feed the D_file (video memory), using the LD (address) function (POKE).
The RST10 (Call $0010) pass the A register to the ROM display routine.

The LDIR function is a Z80 integrated subroutine to loop and copy to a target memory.
The LDIR will loop $100 time.(The target memory will be feed at any loop!)
You can use this routine to slow down the CPU:
LD HL,$4100
LD DE,$4100
LD BC,$FFFF
LDIR

I understand how the LDIR call works. Your examples show this to good effect.

When I said that Panthers second example wasn't working, it was because the HL and DE registers had never been initialised. Therefore they would have been moving data anywhere, but it wasn't to the screen.

Also, in addition to displayable memory locations the display file contains the N/L character. If these are moved - as they would be when BC > 32 - the display file is likely to crash.

Earlier you mentioned that DEC BC affected the flags Z register. According to my book (Zaks) the DEC rr call doesn't affect any registers. Hence the reason why it has to be tested using the accumulator. You use a similar thing here...

LD A,$00
DEC HL
CP H

and here

DEC BC
LD A,B
OR C

But DEC B or DEC C would set the zero flag. The length of the display file is 704 (or 727 with N/L) so would be 02C0 (or 027D) ie testing B=0 doesnt mean C will also = 0.
Dave

...It's a miscellaneous stuff to detect a null BC
In this routine, you get the B value : 00001000
and the C value : 00000001
00001000
OR
00000001
= (00001000+00000001)=00001001(>0)Result : Z flag set to 0 (false).

If B=0 AND C=0:
(00000000+00000000)=0Result : Z flag set to 1 (true).

On a pair register, you add to use the "ADD HL,RP" and "SBC HL,RP" functions.