Пример кода для тех, кто не хочет мучиться с подбором констант инициализации ВГ75 и ВТ57, при построении экрана с нестандартными параметрами (правда пока без использования спецкоманд F0..F3).
Программа заполняет невидимую экранную область нулями, а видимую символами. Изменяя константы (в исходнике), можно менять параметры экрана.
Часть отвечающую за заполнение экрана символами можно выкинуть и использовать только процедуры инициализации. Она добавлена для наглядного отображения на ТВ и проверки на срывы синхронизации.
Курсор в данном примере переносится за границы экрана и поэтому не отображается. Кому он нужен, может удалить этот кусок кода.
Работа проверялась на Апогее, а так же в эмуляторах. Для написания кода использовался Прекрасный ассемблер
Код:
screen_addr equ 0x1000 ; адрес экранной области (можно переназначить в другое место)
; параметры горизонтальной строки (в символах)
h_back equ 8 ; отступ слева
h_act equ 64 ; видимых символов в строке
h_front equ 6 ; отступ справа
h_sync equ 8 ; строчный синхроимпульс (2..32)
h_total equ h_back + h_act + h_front ; общее количество символов в строке без учёта синхроимпульса (1..80)
; параметры кадра (в строках)
v_back equ 3 ; отступ сверху
v_act equ 25 ; видимых строк в кадре
v_front equ 2 ; отступ снизу
v_sync equ 1 ; кадровый синхроимпульс (1..4)
v_total equ v_back + v_act + v_front ; общее количество строк в кадре без учёта синхроимпульса (1..64)
line_per_row equ 10 ; линий в строке (1..16)
under_line equ 10 ; позиция линии подчёркивания в строке (1..16) если этот параметр больше 8, то верхняя и нижняя линии в строке гасятся
spaced_row equ 0 ; пропущенные строки (0..1) если 1, то каждая вторая строка гасится (соответственно и строк в кадре надо указывать в два раза меньше, и память под экран занимает в два раза меньше)
offset_line equ 1 ; смещение для первой линии в строке символов (0..1) если 1, то первая линия строки будет отображаться второй (для псевдографики нужно ставить 0)
no_trans_attr equ 0 ; отображаемые атрибуты (0..1) если 1, то атрибут отображается как пустой символ и занимает место в видеопамяти (на Радио-86РК стоит по умолчанию 0, поэтому если кинуть атрибутом в экран он начинает уплывать)
cursor_type equ 1 ; тип курсора (1..4)
; команды и параметры для инициализации контроллера дисплея
disp_ctrl_addr equ 0xC000 ; адрес контроллера дисплея
disp_reset_com equ 0 ; команда Сброс
disp_param_1 equ spaced_row*128 + h_total - 1
disp_param_2 equ (v_sync - 1)*64 + v_total - 1
disp_param_3 equ (under_line - 1)*16 + line_per_row - 1
disp_param_4 equ offset_line*128 + no_trans_attr*64 + cursor_type*16 + h_sync/2 - 1
disp_cursor_com equ 0x80 ; команда Установка курсора
disp_start_com equ 0x27 ; команда Начать отображение
disp_ir_flag equ 0x20 ; константа для проверки флага Запрос прерывания
; команды и параметры для инициализации контроллера ПДП
dma_ctrl_addr equ 0xE000 ; адрес контроллера ПДП
dma_reset_com equ 0x80 ; команда Сброс
dma_param_1 equ screen_addr & 0x00FF
dma_param_2 equ screen_addr >> 8
dma_param_3 equ (0x4000 + h_total*v_total - 1) & 0x00FF
dma_param_4 equ (0x4000 + h_total*v_total - 1) >> 8
dma_start_com equ 0xA4 ; команда Запуск ПДП
; подпрограммы Монитора для выхода из программы
wait_any_key equ 0xF803 ; ожидание нажатия клавиши
re_init_ctrl equ 0xFACE ; инициализация экранной области Монитора
jump_to_cli equ 0xF86C ; возврат управления в командную строку
.org 0x0000
StartProgram:
lxi h, screen_addr
lxi d, 0x2020
lxi b, 0
FillScreen:
mvi m, 0
mov a, b
cpi v_back
jc IncAddr
cpi v_back + v_act
jnc IncAddr
mov a, c
cpi h_back
jc IncAddr
cpi h_back + h_act
jnc IncAddr
mov m, e
inr e
IncAddr:
inx h
inr c
mov a, c
cpi h_total
jc FillScreen
inr d
mov e, d
mvi c, 0
inr b
mov a, b
cpi v_total
jc FillScreen
InitDisplay:
lxi h, disp_ctrl_addr + 1
mvi m, disp_reset_com
dcr l
mvi m, disp_param_1
mvi m, disp_param_2
mvi m, disp_param_3
mvi m, disp_param_4
inr l
mvi m, disp_cursor_com
dcr l
mvi m, 0xFF
mvi m, 0xFF
inr l
mvi m, disp_start_com
mov a, m
WaitFlag:
mov a, m
ani disp_ir_flag
jz WaitFlag
InitDma:
lxi h, dma_ctrl_addr + 8
mvi m, dma_reset_com
mvi l, 4
mvi m, dma_param_1
mvi m, dma_param_2
inr l
mvi m, dma_param_3
mvi m, dma_param_4
mvi l, 8
mvi m, dma_start_com
EndProgram:
call wait_any_key
call re_init_ctrl
jmp jump_to_cli