Что такое vga int

Обновлено: 02.07.2024

У меня есть переменная, называемая средним значением, и в моем DATASEG она меняется каждый раз, потому что пользователь каждый раз вводит разные данные. Что я хочу сделать, так это перейти в графический режим (VGA), а затем распечатать там Ваше среднее значение: а затем среднее значение, которое я знаю, как перейти в графический режим следующим образом:

После печати среднего я хочу напечатать ниже, если средний показатель выше 75. Вы хорошо учитесь, продолжайте в том же духе, а если нет. Не волнуйтесь, вы поправитесь! Заранее спасибо.

Да, это возможно. Будет ли это легко? Наверное, уже нет. Скорее всего, современные системы могут даже не позволить вам войти в режим VGA. Вам нужно посмотреть в Интернете и немного покопаться, чтобы увидеть, что там для этого. К вашему сведению, переходя к режиму 13, я не думаю, что у вас есть доступный шрифт, и вам нужно будет написать свой собственный. Или просто используйте стандартный вывод в текстовом режиме, и это будет намного проще.

Так какой у вас вопрос? Неужели "можно"? Угадайте, проверьте тысячи существующих исполняемых файлов, я почти уверен, что некоторые из них делают очень похожие вещи или намного сложнее, так почему вы вообще спрашиваете. Если «DOOM» был возможен в 1993 году, то насколько сложнее было показать «ты хороший ученик». Вам нужна платформа, которая поддерживает режим 13h, если вы настаиваете на этом (это очень простой режим, его легко освоить, но 320x200 — очень низкое разрешение, и тексты в нем особенно уродливы, подумайте о том, чтобы использовать какой-нибудь режим SVGA, например 1024x768 (но после того, как вы учись обращаться 13ч)). Emu8086 поддерживает 13-часовую графику

Спасибо, ребята. Я не возражаю, если текст будет некрасивым, это для проекта, и я просто хочу попробовать использовать графический режим в первый раз.

что именно вы не умеете делать . в режиме 1. VGA 320x200x256? 2. печатать в нем символ/текст? 3. вывести числовое значение (в регистре или памяти) ? Шрифт можно получить из EGA/VGA BIOS или использовать этот Преобразование чисел с плавающей запятой в десятичные цифры в GLSL?

1 Ответ 1

Я предполагаю: ПК, VGA x86, платформа MS DOS

На самом деле не имеет значения, настоящий он или эмулированный, если только вам не нужен доступ к низкоуровневому вводу-выводу, который может не работать должным образом в эмуляции, такой как DOSBOX.

Видео/текстовые режимы

Поэтому для переключения между видео и текстовым режимами необходимо использовать VGA BIOS:

Здесь много видеорежимов, два очень важных:

В видеорежиме 19 вы печатаете/просматриваете пиксель, обращаясь к памяти в сегменте A000h, где смещение вычисляется следующим образом:

Режим 320x200 полностью умещается в сегменте размером 64 КБ, поэтому вам не нужно переключать страницы. Это делает его идеальным для простых программ asm gfx.

Режим 3 — это текстовый режим, в котором каждый символ имеет 2 байта: один — цвет, а другой — расширенный код ASCII. Снова печать/просмотр выполняется путем доступа к слову в сегменте B800h, где смещение:

Не уверен, в каком порядке находятся два байта, это было давным-давно, но вы можете легко проверить, будет ли запись A в 0B800:0000 отображать A в верхнем левом углу или 0B800:0001 вместо этого. Цвета IIRC в текстовых режимах - это только первые 16 цветов из палитры, а байт цвета кодирует яркость и мерцание чернильной бумаги. Этот текстовый режим также является режимом по умолчанию, в котором работает ваша оболочка MS-DOS, поэтому вы должны установить его обратно перед выходом из программы.

Итак, ваша программа должна выглядеть так:

Печать строк

это простая игра, в которой меню находятся в текстовом режиме (где печать выполняется легко и достаточно скопировать строку во VRAM), а игра со спрайтовой графикой находится в видеорежиме 320x200x256c.

Если вы хотите печатать в режиме gfx, вам сначала нужно иметь какой-нибудь шрифт в памяти. Если вы посмотрите документацию EGA/VGA BIOS, вы можете получить шрифт, расположенный в EGA/VGA ROM, и использовать его напрямую. Я также создал этот образ (IIRC с использованием VGA-шрифта Trident 9000 256/512 КБ), который я использую в качестве моноширинного шрифта для OpenGL и других вещей (где доступ к VGA BIOS невозможен или нежелателен).

font

Вот пример использования GLSL для печати. ​​Вы можете портировать его на CPU/VGA/asm, но печать на CPU намного проще, нет необходимости в таких ужасных вещах, как во фрагменте GLSL.

Поэтому вам просто нужно вычислить положение изображения из кода ASCII и скопировать его пиксели в VRAM. Конечно, иметь растровое изображение в asm непросто, и гораздо проще иметь его непосредственно в двоичной форме (как набор db ), поэтому вы можете написать простой скрипт на C++ (или что-то еще), который загружает изображение и преобразует его в исходный код asm.

Вот древняя библиотека для печати с разрешением 320 x 200 x 256 цветов, которую я написал в NASM много лет назад (с непосредственным использованием шрифта EGA/VGA):

Поэтому для использования программа должна быть такой:

Печать используется путем установки ds,si таким образом, чтобы он указывал на вашу строку с завершающим нулем. Как видите, printl в этом не нуждается, так как он использует строку, расположенную сразу после вызова printl, и программа продолжает работу после него. Таким образом, вам не нужны ни инструкции по настройке указателя, ни какие-либо дополнительные лабиринты. Цвета указаны в cl,ch, один - чернила, а другой - бумага.Если cl==ch, то бумага не будет отображаться, только пиксели чернил, что полезно, если у вас есть изображение или фон gfx за текстом. Значения цветов могут быть не видны. Я взял цвета из одной из моих игр, которая устанавливает свою собственную палитру, поэтому, если ничего не видно, попробуйте установить другие cl,ch, например mov cx,0305h. Взгляните на это:

Печать чисел

Печать неотрицательного целого числа – это деление числа по основанию (10) и вывод остатка + '0' в обратном порядке в виде символов .

В шестнадцатеричном формате это еще проще, поскольку каждая цифра соответствует полубайту, поэтому для 16-битного числа вы берете старшие 4 бита, преобразуя их в char либо с помощью таблицы xlat, либо путем добавления «0» или «A» в зависимости от того, меньше ли значение 10 . так что никаких делений, просто битовый сдвиг/маска. напечатайте символ и сдвиньте значение влево на 4 бита, чтобы обработать следующую цифру.

Кстати, в режимах gfx часто гораздо приятнее и удобнее вместо того, чтобы печатать значение в виде числа, вместо этого отображать индикатор выполнения, что намного проще. сворачивается в одну петлю, отображающую линию H или V. лайк РЭП СТОСБ :) .

VESA

Для видеорежимов Super VGA выше 320x200x8bpp нам необходимо добавить пересечения страниц данных, поскольку VRAM больше не соответствует 64-килобайтному сегменту. Я настоятельно рекомендую использовать для этого API VESA (VBE). Идея состоит в том, чтобы сегмент A000:0000 был сопоставлен с определенным сегментом VRAM, который мы можем изменить в любое время. Подробнее о том, как это увидеть:

Если ваша карта gfx не имеет стандарта VESA/VBE для большинства карт, его можно добавить с помощью утилиты UniVBE 5.3 или более новой версии под MS-DOS.

Стандартный режим VGA 13h — это самый простой и быстрый способ программирования цветной графики. Он использует одно длинное линейное растровое изображение, в котором каждый байт управляет одним пикселем. Если бы у меня было растровое изображение размером 320x200 с 256 цветами, в котором каждый пиксель представлен одним байтом, я мог бы быстро вывести это растровое изображение на экран, скопировав его в ячейку памяти 0A000:0000h. Это обеспечивает чрезвычайно быстрое обновление экрана и анимацию без мерцания. Кроме того, если у меня есть небольшое растровое изображение 25x25, которое я хочу прокрутить по экрану, все, что мне нужно сделать, это поставить фон с помощью тех. выше, а затем скопируйте пространство фона 25x25 во временную позицию памяти, скопируйте мое растровое изображение 25x25 в это место, подождите, скопируйте сохраненное растровое изображение фона 25x25 обратно на его место и перейдите в следующую позицию. Таким образом, я даже не касаюсь остального фона и делаю анимацию еще быстрее и лучше. Я мог бы даже улучшить анимацию, вращая 3 или более растровых изображения 25x25 человека, идущего при перемещении по экрану, чтобы лучше представить анимацию.

Mode X — это недокументированный режим VGA. Он очень близок к режиму 13h (320x200x256), за исключением того, что у него больше пикселей по вертикали (320x240x256), и мы должны отправлять наши данные в регистры VGA, а не просто помещать их в 0A000:0000h

Вы также можете запрограммировать VGA на разрешение 320x400 с 256 цветами. Этот режим по-прежнему 13h, но теперь мы используем 4 битовых плоскости. Стандартный режим VGA 13h — это действительно разрешение 320x400. режим, за исключением того, что дизайнеры хотели использовать только 64 КБ, поэтому они сделали каждую строку отображаемой дважды, отсюда и режим разрешения 320x200. Если мы используем 4 растровых изображения, теперь мы можем управлять этой второй напечатанной строкой.

В это обсуждение я включу исходный код небольшой демонстрации анимации для стандартного режима VGA 13h. Вы можете получить его копию здесь или ниже и разархивировать (см. мою страницу ссылок для PKUNZIP) в каталог по вашему выбору, а затем просмотреть ANI.TXT для получения дополнительной информации о запуске демо и просмотреть исходный код (MASM 5.1 ).

Что касается остальных графических режимов, описанных на этой странице, я предлагаю вам приобрести копию следующей книги. Это очень хорошая, наполненная исходниками документация по всем графическим режимам CGA, EGA, VGA, MGA, MCGA и многим другим. Он включает компакт-диск со всем кодом и полный текст его книги Zen of Assembly Language.

Дзен ГРАФИЧЕСКОГО ПРОГРАММИРОВАНИЯ Майкла Абраша
2-е издание, 1996 г.
The Coriolis Group
ISBN 1-883577-89-6:
830+ страниц подробной документации по программированию графики
br />См. здесь другие книги, подобные этой.

ANI.ZIP (31k)
Чтобы просмотреть демонстрацию, введите ANI в командной строке DOS.

Вот пример видеографики MODE 12h с 4 равнинами с использованием режима записи 2 .
Просто рисует цветную линию от (0,0) до (479,479) на экране 640 x 480 x 16.


Вот "оптический трюк", который вы можете проделать на стандартном VGA в режиме 13h, с 256 цветами.
Приносим извинения тем, чьи браузеры не отображают форматы файлов .BMP. Это был единственный формат, в котором я мог показать это изображение с таким высоким разрешением.



Средняя полоса на самом деле одного цвета. Поднесите два листа бумаги к экрану так, чтобы была видна только средняя полоса.

Этот "трюк" был найден в:
More Tricks of the Game Programming Gurus, 1995, Sams Publishing
Дополнительные книги, подобные этой, см. здесь.

размещено procolix

С помощью прерывания BIOS 13 AH = 00 мы можем изменить текущее разрешение экрана (см. ниже).

< /tr>
Al (hex) режим видео

0
1
2
3
4
5
6
7
.
F
10
11
12

текст 40 x 25 16 серый
текст 40 x 25 16 цвет
текст 80 x 25 16 серый
текст 80 x 25 16 цвет
график (CGA) 320 x 200 цвет
график (CGA) 320 x 200 черно-белый
график (CGA) 640 x 200 черно-белый
текст 80 x 25 черно-белый (MDA, Hercules)
.
график (EGA,VGA) 640x350 серый
график (EGA,VGA) 640x350 16 цветов
график (VGA) 2 цвета
график (VGA) 16 цветов

В следующих абзацах мы подробно обсудим стандартное разрешение VGA (12h). В настоящее время большинство VGA-плат имеют разрешение «Super VGA». В следующей таблице вы найдете информацию о том, как изменить разрешение на «VESA Super VGA». "

INT 10h AX = 4F02h
BX = mode
BX режим видео

100 ч
101 ч
102 ч
103 ч
104 ч
105h
106h
107h
108h
109h
10Ah
10Bh
10Ch

график 640x400 256 цветов
график 640x480 256 цветов
график 800x600 16 цветов
график 800x600 256 цветов
график 1024x768 16 цветов
график 1024x768 256 цвета
график 1280x1024 16 цветов
график 1280x1024 256 цветов
текст 80x60
текст 132x25
текст 132x43
текст 132x50
текст 132x60

Если ваш VGA BIOS поддерживает эту функцию, AH станет равным 00h, иначе AH вернет 01h. Вопросы, описанные в следующем абзаце, также можно использовать в разрешении VESA 800 x 600, 16 цветов.

Стандартная карта IBM VGA имеет 16 цветов, поэтому каждому пикселю требуется 4 бита (2^4 = 16). Графическая карта VGA использует битовые плоскости, каждый основной цвет имеет свою область памяти в видеопамяти. Поскольку адрес памяти одинаков для всех основных цветов (отображается память A000:0000h), мы должны запрограммировать секвенсор для выбора правильного банка памяти.

зарегистрировать выбор с портом 03C4h.

зарегистрироваться имя

00
01
02
03
04

сбросить
Режим синхронизации
Маска карты
Карта символов Выбрать
Режим памяти

С помощью регистра Map Mask мы можем выбрать, в какой цветовой плоскости мы будем писать.

[gfx vga_fig1.jpg]

Когда мы установим бит 0, мы будем записывать в синюю битовую плоскость, если мы установим биты 0 и 1 (3), мы будем записывать в синюю битовую плоскость. Следующий пример прояснит изложенную выше теорию.

С помощью mov ax,0F02h, out dx,ax мы выбираем все битовые плоскости, в результате чего получается белый цвет. Если мы изменим mov ax,0F02h на mov ax,0102h, мы получим синий экран ;-).

Еще одним преимуществом VGA является возможность изменять цвета, что позволяет придать изображениям более "реальный" вид.
Есть два способа изменить программу видеопалитры непосредственно на видеооборудование или использовать прерывание программного обеспечения видео (INT 10h). Ниже вы найдете, как изменить палитру на INT 10h.

С помощью INT 10h AX = 1010h мы можем изменить палитру одного цвета, BX содержит регистр цвета, CH значение зеленого, CL значение синего и DH значение красного. Существует разница между «регистром цвета» и «номером цвета», мы можем решить это, сначала запросив «регистр цвета» «номера цвета». Мы можем сделать это с помощью INT 10 AX = 1007h, BL содержит номер цвета, регистр цвета будет возвращен в BH. Следующий пример докажет, что практика менее сложна, чем теория.

Чтение видеопамяти более или менее похоже на запись в нее. Мы должны изменить графический элемент управления на режим чтения. Это возможно с адресом порта 03CEh и 03CFh.
В следующей таблице представлен обзор возможных функций.

Регулировка режима по порту 03CEh.

зарегистрироваться Название

1
2
3
4
5
6
7
8

Установить/Сбросить
Включить Установить/Сбросить
Поворот данных/Выбор функции
Выбор чтения карты
Графический режим
Разное
Цвет не имеет значения
Битовая маска

Когда мы устанавливаем порт 03CEh на 3, мы устанавливаем карту VGA в режим чтения с портом 03CFh, мы можем указать цветовую битовую плоскость для чтения. В следующей таблице приведены цвета с эквивалентными значениями.

выбор битовой плоскости по порту 03CFh

3
2
1
0
синий
зеленый
красный
интенсивность

Следующая процедура продемонстрирует изложенную выше теорию. Он считывает один байт в 4-цветных битовых плоскостях (BGRI), с помощью SI мы указываем адрес байта.

Предусмотрено 4 разных режима записи; заменяем, AND, OR и XOR, изменяем режим записи регистром «Поворот данных/Выбор функции» (см. таблицу в пункте 2). Поставив 3 в регистре выбора 03CEh, мы выбираем «Поворот данных/Выбор функции».

Как видно из названия, у нас также есть возможность поворота даты, но она используется нечасто, так как с помощью обычного процессора быстрее поворачивать дату.

С регистром данных по адресу порта 03CFh мы можем указать, как данные записываются на экран.

выбор режима записи по порту 03CFh

< /tbody>
bit 4 bit3 функция

0 0
0 1
1 0
1 1

заменить
И
ИЛИ
Исключающее ИЛИ

mov ax,1803h
mov dx,03CEh
out dx,ax

Установит для карты VGA режим записи XOR.

Нарисовать линию в ассемблере не так просто. и очень важно не использовать сложные функции (cos, sin . ), так как это слишком сложно программировать и (что более важно) замедлит работу функции.
Наиболее широко используемой функцией для рисования линии является так называемый алгоритм Брезенхема, опубликованный в IBM System Journal в 1965 году.

Уравнение линии: y = (dy/dx).x

[gfx vga_fig2.jpg]

Когда линия ближе к точке A, мы должны нарисовать точку A. Когда линия ближе к точке B, нам нужно нарисовать точку B.

Нам нужно рассчитать di с информацией о последней точке рисования:

Для шага в направлении x (xi - xi-1) мы выбираем 1.

Значение (yi - yi-1) зависит от того, где мы должны нарисовать точку, (yi - yi-1) равно 1, когда нам нужно нарисовать точку A (yi-1 +1), и будет равно 0 если нам нужно нарисовать точку B (yi = yi-1).

Когда нам нужно нарисовать точку A : (di - di-1) = 2.(dy - dx)
Когда нам нужно нарисовать точку B : (di - di-1) = 2.dy< /p>

Ниже вы найдете программу на Turbo Pascal, использующую алгоритм Брезенхэма.

Эта статья написана как учебник. Измените его, чтобы вместо примера кода и пошаговых инструкций было больше информации и документации.

Итак, вы знаете, как отображать символы в текстовом режиме, и теперь хотите сделать это в графическом режиме. Это не сложно, но определенно сложнее, чем запись кода ASCII по определенному смещению в памяти. Вам придется делать это попиксельно.

Но откуда вы знаете, что рисовать? Он хранится в матрице данных, называемой растровыми шрифтами.

Содержание

Декодирование растровых шрифтов

Как символ хранится в памяти? Это довольно просто, 0 кодирует фон, 1 кодирует цвет переднего плана. Шрифты VGA всегда имеют ширину 8 бит, поэтому каждый байт содержит ровно одну строку. Для буквы «А» в типичном шрифте 8x16 это будет (в двоичном формате):

Полное растровое изображение содержит растровые изображения для каждого символа, таким образом, оно имеет размер 256*16 байтов и длину 4096 байтов. Если вы хотите получить растровое изображение для определенного символа, вам нужно умножить код ASCII на 16 (количество строк в символе), добавить смещение вашего растрового изображения, и вы готовы к работе.

Очень простой формат файла для их хранения — шрифт экрана ПК, используемый консолью Linux. Он хранит шрифты, как описано выше, с небольшим заголовком. Другим решением является формат Scalable Screen Font, который поставляется с очень маленькой бесплатной библиотекой ANSI C для визуализации.

Как получить шрифты?

Есть несколько способов. Вы можете иметь его в файле в вашей файловой системе. Вы можете жестко закодировать его в массиве.Но иногда 4k так много, что вы не можете себе позволить, и чтение файла не вариант (как в загрузчике), и в этом случае вам придется читать тот, который используется картой (для отображения символов текстового режима) из ОЗУ VGA.

Сохранить в массиве

Самый простой способ, но увеличивает ваш код на 4k. Есть несколько источников, которые предоставляют весь шрифт в двоичном или исходном формате, поэтому вам не нужно записывать его вручную.

Сохранить в файле

Самый модульный способ. Вы можете использовать разные шрифты, если хотите. Недостатком вам понадобится работающая реализация файловой системы. Что касается формата файла, я бы предложил вышеупомянутый экранный шрифт ПК (.psfu) или масштабируемый экранный шрифт (.sfn).

Получить копию, сохраненную в VGA BIOS

Это стандартный вызов BIOS (не нужно проверять его постоянство). Если вы все еще находитесь в реальном режиме, им довольно легко пользоваться.

Получить напрямую из VGA RAM

Возможно, вы уже находитесь в защищенном режиме и не можете получить доступ к функциям BIOS. В этом случае вы все еще можете получить растровое изображение, запрограммировав регистры VGA. Учтите, что VGA всегда резервирует место для шрифтов 8x32, поэтому вам нужно будет обрезать нижние 16 байтов каждого символа во время копирования:

Стоит отметить, что это необходимо сделать до того, как вы переключитесь в графический режим VBE, потому что после этого регистры VGA обычно недоступны. Это означает, что вы не сможете сопоставить память шрифтов VGA-карты с памятью экрана и будете читать только мусор.

Установить шрифты VGA

Если вы все еще находитесь в текстовом режиме и хотите, чтобы VGA-карта рисовала другие глифы, вы можете установить шрифт VGA. В графическом режиме это бесполезно (потому что символы там отображаются вашим кодом, а не картой), я написал этот раздел только для полноты картины. Изменить растровые изображения шрифтов в VGA RAM несложно, если внимательно прочитать написанное до сих пор. Я оставлю это вам в качестве домашнего задания.

Установка шрифтов через BIOS

Подсказка: проверьте список прерываний Ральфа Брауна Int 10/AX=1110h.

Установить шрифты напрямую

Совет: используйте тот же код, что и выше, но поменяйте местами источник и место назначения на "movsd".

Отображение персонажа

И, наконец, мы подошли к моменту, когда можем отображать персонажа. Я предполагаю, что у вас есть готовая процедура putpixel. Нам нужно нарисовать 8x16 пикселей, по одному на каждый бит растрового изображения.

Аргументы просты. Вы можете задаться вопросом, зачем вычитать 12 из y. Это для базовой линии: вы указываете координату y как нижнюю часть символа, не считая «хвоста» в глифе, который идет вниз (например, «p», «g», «q» и т. д.). Другими словами, это самая нижняя строка буквы «А», в которой установлен бит.

Хотя стирание экрана под глифом в большинстве случаев полезно, в некоторых случаях это может быть вредно (например, когда вы пишете на блестящей градиентной кнопке). Вот слегка измененная версия с прозрачным фоном.

Как видите, на этот раз у нас есть только цвет переднего плана, а вызов putpixel имеет условие: вызывается только в том случае, если установлен соответствующий бит в растровом изображении.

В этом случае адрес в памяти дисплея вычисляется только один раз (а не до 128 раз), и 8 пикселей выполняются параллельно (что полностью устраняет внутренний цикл).

В реальном режиме (или виртуальном 8086), когда я переключаюсь в графический режим vga (00DH, 00EH, 012H) и использую функцию BIOS для отображения символа (int 00AH, int 00EH), ничего нельзя прочитать из 0xA0000 кроме кучи нулей. Символ действительно отображается на экране, но он не виден из памяти. Хотя в текстовом режиме (1H, 3H, . ) все работает нормально.


В графическом режиме буфер кадров содержит пиксели, а не символы. Поэтому, когда вы читаете из видеопамяти, вы, конечно, читаете пиксели, из которых состоит символ на экране, а не код ASCII. См. этот сайт для объяснения расположения видеопамяти в режиме 12h.

Да, я знаю, что нет значения кода ascii. Но даже значения пикселя нет. В моем примере hlt никогда не выполняется

Да, я знаю, но rep и repz — это один и тот же код операции 0F3H. Обычно хороший ассемблер не имеет значения, какой вы используете.

Это может быть правдой, но это не является веской причиной для использования rep в неправильном контексте. Удобочитаемость — вот причина, по которой вместо этого следует использовать repe.

2 ответа 2

Я попытался прочитать видеопамять в графическом режиме 13h (320*200px) с помощью TurboDebugger в DOSBox на 64-битной Windows, и это сработало, как и ожидалось: REPE SCASB остановился с DI=0143h и значением, загруженным
MOV AL,[ ES:DI-1] было 2.
Первая строка пикселей в ES:0 (140h байт) полностью равна 0 (черный), вторая строка начинается с ES:0140h с двумя черными пикселями (0 байт), за которыми следует на байт со значением AL=2 (синий), который является кончиком глифа заглавной буквы A.

Тем не менее, видеопамять не может быть проверена с помощью Alt-F5 для переключения между пользовательским экраном TurboDebugger и окном процессора из-за несовершенства отладчика и эмуляции DOSBox.Еще сложнее обстоит дело с планарными графическими режимами 0Dh, 0Eh, 12h. VGA отображает все четыре плоскости памяти (страницы) по одному и тому же линейному адресу A0000h, и вам придется сначала выбрать страницу путем прямого вывода на порты CRT (см. ссылку в первом комментарии @fuz). Вы можете загрузить ненулевой байт из видеорамы и распечатать его с помощью INT 10h вместо hlt, просто чтобы убедиться, что он есть.

Я помню, как лет 30 назад я отлаживал свою графическую программу на двух DOS-компьютерах, соединенных последовательными портами, используя Borland TD.EXE и TDREMOTE.EXE. Я смог выполнять инструкции, которые записывались в регистры EGA/VGA CRT, и наблюдать за эффектами, не переключаясь между окном отладчика и экраном пользователя.

Я не уверен, чего вы хотите добиться, но в неэмулированной DOS с графическим режимом 13h у вас может получиться.

Читайте также: