#assembly #dos #bios #vga
#сборка #dos #bios #vga
Вопрос:
При переходе в графический видеорежим 16 (INT 10H / AX = 0010) текстовый курсор отсутствует.
Пробовал это как на физическом старом IBMPC со встроенным VGA / AMIBIOS (1.16) под управлением DOS, так и в DOSBOX.
Я пытался возиться с ними безрезультатно, поскольку они, похоже, работают только в «текстовом режиме» (не в графическом):
- «форма курсора» (
INT 10H/AH=01/CX=0D0EH
) - «эмуляция курсора» (
INT 10H/AH=12H/AL=0/BL=34H
)
Кажется, что курсор должен легко включаться и выключаться, есть ли другая функция BIOS для этого, чтобы включить его?
Ответ №1:
Режим 10h — это 16-цветной графический режим (640×350). В графических режимах курсор не отображается, хотя BIOS отслеживает его положение, но не более того.
Положение, которое BIOS поддерживает для этого невидимого курсора, будет соответствовать расположению ячеек символов (8×14), даже если на экране можно адресовать все пиксели.
Если вам нужен курсор, вам придется нарисовать его самостоятельно графически (короткая строка) или вы можете альтернативно отобразить текстовый символ и пробел, чтобы создать эффект мигающего символа.
Комментарии:
1. Похоже, мне придется создать TSR для управления этим, чтобы он работал в DOS и т.д. Мое приложение для DOS рисует графики, но также может запрашивать у пользователя новые значения данных и отправлять команды в DOS, пока график отображается на экране. Думаю, мне пришлось бы перехватывать печать видео, чтобы удерживать курсор в нужном месте, разворачивая его при перемещении и перерисовывая его в новом месте в обратном порядке. Тьфу, может быть, где-то есть драйвер.. Я буду обнюхивать.
2. Если ваш TSR просто инвертирует все пиксели в прямоугольнике 8×14, на которые указывает cursorposition, и продолжает делать это на временной основе, вы настроены. Конечно, после изменения положения вам нужно восстановить предыдущий прямоугольник.
3. Спасибо, я мог видеть, как мигающий курсор отключается от прерывания таймера, скажем, вводит XOR в нижнюю строку сканирования, но это может оставить мусор, например, если экран прокручивается / очищается. Возможно, придется перехватить INT 10 и обязательно выключить курсор перед выполнением реального вызова, а затем снова включить его после.
Ответ №2:
Видеорежим EGA / VGA № 10h является графическим (640 * 350), см. Список прерываний, а службы BIOS, с которыми вы пытались возиться, предназначены только для текстовых режимов. Боюсь, вам придется рисовать курсор самостоятельно.
С другой стороны, вы можете нарисовать курсор в произвольной форме и расположить его на экране с пиксельной детализацией в графических режимах.
Комментарии:
1. Спасибо, я этого боялся. Я собираюсь просмотреть исходный код BIOS в руководстве IBM tech ref, просто чтобы перепроверить, есть ли какие-либо положения для этого, поскольку в противном случае это будет сложно сделать.. похоже, это должен быть драйвер устройства TSR.
Ответ №3:
В Dosbox вы можете использовать вызов прерывания dos (int 0x33) для управления мышью. Я написал простой пример, вы можете собрать это с помощью fasm:
org 0x100
;; Init Data Segment
xor ax, ax
mov ds, ax
;; Init screen
mov ah, 0x00 ; Set video mode
mov al, 0x10 ; 640x350 graphics
int 0x10
mov ah, 0x0b ; Set color palette
mov bh, 0x00 ; Set current
mov bl, 0x03 ; Color: Cyan
int 0x10
mov ax, 0x0000 ; Reset mouse cursor
int 0x33
mov ax, 01 ; Show mouse cursor
int 0x33
hang:
hlt
jmp hang
;; Magic number
times 510-($-$$) db 0
dw 0xaa55
Комментарии:
1. Спасибо, хотя на самом деле это курсор /text/ Я пытаюсь включить графический режим, а не мышь.