мда, посмеялса... так нужны шашечки или ехать?
раз написал про знакоместа - это и были познакоместные копировщики. (hl=#4020 de=#4000)
сразу видно - по 8 линий в знакоместе за внутренний цикл процедурка перекидывает (inc h / inc d), с последующим переходом к нижним знакоместам.
а то - "ой-ой", "не работает"...
короче, если нужно по-пиксельно, то - элементарно - во внутреннем цикле должна быть стандартная последовательность DOWN_HL / DOWN_DE.
структура процедурки - еще проще получается.

ld hl,#4100 : ld de,#4000 : ld bc,#c020 : call Copy3

Код:
Copy3

; hl = from_scraddr
; de = to_scraddr
; c = xr_znm
; b = yr_pix+1

	ld	a,0-(ch_djnz-ldi_end+2)
	sub	c
	sub	c
	ld	(ch_djnz+1),a

	jr	go_loop


 dup 32 : ldi : edup

ldi_end
	pop	hl
	pop	de

	inc	h
	ld	a,h
	and	#07
	jr	nz,$+12
	ld	a,l
	add	a,#20
	ld	l,a
	jr	c,$+6
	ld	a,h
	sub	#08
	ld	h,a

	inc	d
	ld	a,d
	and	#07
	jr	nz,$+12
	ld	a,e
	add	a,#20
	ld	e,a
	jr	c,$+6
	ld	a,d
	sub	#08
	ld	d,a

go_loop
	ld	c,d	; C > #20
	push	de
	push	hl

ch_djnz	djnz	$

	pop	hl
	pop	de

	ret
p.s. если используется как скроллер, где hl и de - на соседних линиях, - то вместо DOWN_DE - можно ld d,h : ld e,l (перед inc h) и push de / pop de - убрать