Посмотрел внимательно алгоритм от Алоне - очень хитрый алгоритм, но скорее компактный, чем "быстрый":
Code: Select all
; DE - address
; A - character
; C - offset 7,5,3,1
PUSH DE
LD L,A
LD B,C
LD A,2
RRCA
DJNZ $-1
LD (PRN+1),A
LD H,'FONT
LD B,8
PRGO PUSH HL
LD L,(HL)
PRN LD H,1
PR1 ADD HL,HL
ADD HL,HL
JR NC,PR1
LD A,(DE)
OR H
LD (DE),A
INC E
LD A,L
LD (DE),A
DEC E
INC D
POP HL
INC H
DJNZ PRGO
POP DE
Он придумал вращать символ сразу в 16-битном пространстве через ADD HL,HL !!!
Выводимый символ складывается с тем, что было на экране по OR (а второй байт просто копируется в следующее знакоместо, даже если символ полностью умещается в одном),
т.е. подразумевается, что экран был заранее очищен перед выводом (значит о выводе символа в произвольное место экрана речи не идёт).
Ну и кто-то снаружи должен вычислить закодированное смещение символа, записав его в регистр C перед каждым выводом очередной буквы.
И в одном месте программа даже модифицирует саму себя в зависимости от этого смещения
Менять значение C на входе предлагается так:
Code: Select all
LD A,C
SUB 6
JR NC,$+5
INC E
AND 7
LD C,A
т.е. 7 превращается в 1 потом в 3 (с инкрементом E), потом в 5 (тоже с инкрементом E) ну и потом снова в 7 (опять же с инкрементом E)
Ну и ещё надо со стороны притянуть код, превращающий экранные координаты в адрес видеопамяти (Алоне печатает в адрес, а не в координаты), например вот такой:
Code: Select all
;=========координаты -> scr adr========
;in: D - Y координата, E - X координата
;out:DE - screen adress
LD A,D
AND 7
RRCA
RRCA
RRCA
OR E
LD E,A
LD A,D
AND 24
OR 64
LD D,A
Можно попробовать поработать с этим для получения чуть более расширенного компактного варианта, который пишет в произвольное место экрана со стиранием того, что там было...