Код:
; Вывод символа на экран
; HL - адрес символа в знакогенераторе (символ шириной 6 пикселей в младших битах)
; E - младший байт адреса символа на экране (позиция строки)
; A - позиция символа в строке
; Принцип отображения для 40 символов в строке:
; 0 символ - сдвиг 2, символ в старших битах байта
; 1 символ - сдвиг 4, 2 бита в этом столбце, 4 - в следующем
; 2 символ - сдвиг 6, 4 бита в этом столбце, 2 - в следующем
; 3 символ - сдвиг 0, символ в младших битах байта
; Дальше всё повторяется
DrawSymb:
di
push hl
ld b,a
and 3ch
rrca
ld c,a
rrca
add a,c
add a,0e0h ; Выводить будем в верхнюю плоскость
ld d,a ; Получаем горизонтальный полуадрес левого байта из 3 байтов, где могут быть 4 символа
ld a,b
and 3 ; Выделяем биты, определяющие сдвиг символа
ld bc,0300h ; Маска для 0 символа
ld l,2 ; На сколько нужно сдвинуть влево байт символа при выводе на экран
jr z,DrawSymb1
dec a
ld bc,0fc0fh ; Маска для 1 символа
ld l,4
jr z,DrawSymb1
inc d
dec a
ld bc,0f03fh ; Маска для 2 символа
ld l,6
jr z,DrawSymb1
inc d ; в D получается полуадрес левого байта, где будет часть или весь символ
ld bc,0c000h ; Маска для 3 символа
ld l,0
DrawSymb1:
ld a,l
pop hl ; Восстанавливаем указатель на символ в знакогенераторе
or a,0c0h ; Добавляем 3 бита системных параметров
out (45H),a ; Включаем циклический сдвиг
ld a,с
ex af,af' ; Сохраняем маску для второго байта
ld a,b
out (46H),a ; Включаем маску для первого байта
ld bc,8 ; Высота символа
ldir ; Выводим левую часть символа
ex af,af' ; Восстанавливаем маску для второго байта
and a
jr z,DrawSymb2 ; Весь символ в одном байте
out (46H),a ; Включаем маску для второго байта
dec hl
dec e
ld bc,8
lddr ; Выводим правую часть символа
DrawSymb2:
xor a
out (46H),a ;
ld a,0e0h
out (45H),a ;
ei
ret