Напрямую запись в видеопамять - Assembler
Формулировка задачи:
Привет всем, столкнулся с такой проблемой, что не выводится точка на экран, как следует, в 12 видеорежиме. Проблема в том, что точка выводится со смещением от левого края экрана, вправо на 3-4 пикселя,и выводится белого цвета, вне зависимости от указанного цвета. Подскажите пожалуйста, в чем может быть проблема? И читал, что в 12 видеорежиме цвет записывается в биты, а не в байты, как в 13 режиме. И если это так, то пожалуйста подскажите, как это можно осуществить. Заранее спасибо
code segment assume cs:code,ds:code,ss:code start:mov ax,code mov ds,ax mov ax,0fh int 10h push ax mov ax,12h int 10h push 0A000h pop es ; настраиваем регистр ес на память видеобуфера mov es:[di],byte ptr 4 ;записываем по адресу цвет mov ah,0 int 16h pop ax mov ah,0 int 10h code ends end start
Решение задачи: «Напрямую запись в видеопамять»
textual
Листинг программы
; masm dos com # .286 .model tiny .code org 100h SCREEN_WIDTH_IN_BYTES equ 80 ;число байтов в строке в режиме 12h GC_INDEX equ 3CEh;порт графического контроллера (GC) SET_RESET_INDEX equ 0 ;индекс регистра установки/сброса в GC SET_RESET_ENABLE_INDEX equ 1 ;индекс регистра разрешения установки/сброса в GC BIT_MASK_INDEX equ 8 ;регистр битовой маски GC_MODE_INDEX equ 5 ;индекс регистра графического режима в GC COLOR_DONT_CARE equ 7 ;индекс регистра безразличия цвета в GC BIT_MASK_INDEX equ 8 ;регистр битовой маски Color equ 0Ch ;ярко-красный X equ 5 ;координата X/8 Y equ 230 ;координата Y start: mov ax,12h int 10h mov ax,0A000h mov es,ax ;установим цвет с помощью установки/сброса mov dx,GC_INDEX mov ax,0F00h or SET_RESET_ENABLE_INDEX ;AH=значение для регистра разрешения установки/сброса (все битовые плоскости разрешены) ;AL=номер регистра установки/сброса out dx,ax ;outpw(GC_INDEX,(0xF << 8) | SET_RESET_ENABLE_INDEX) ;разрешим установку/сброс для всех плоскостей mov ah,Color ;AH=значение пиксела mov al,SET_RESET_INDEX ;AL=номер регистра установки/сброса в GC out dx,ax ;outpw(GC_INDEX, (Color << 8) | SET_RESET_INDEX) ; установим цвет установки/сброса mov al,GC_MODE_INDEX out dx,al ;outp(GC_INDEX,GC_MODE_INDEX) inc dx in al,dx ;OriginalGCMode = inp(GC_INDEX+1) or al,0Bh ;OriginalGCMode or 0Bh out dx,al ;outp(GC_INDEX+1,OriginalGCMode | 0xB) dec dx mov ax,COLOR_DONT_CARE out dx,ax mov ax,0FF00h or BIT_MASK_INDEX out dx,ax mov di,Y*80+X mov ax,0FFFFh mov cx,20 rep stosw mov ah,0 int 16h mov ax,3 int 10h ret end start
Объяснение кода листинга программы
Код выполняет следующие действия:
- Устанавливает режим графического контроллера (GC) на 12h.
- Устанавливает начальный адрес видеопамяти в регистре ES.
- Устанавливает цвет пикселя для установки/сброса.
- Разрешает установку/сброс для всех плоскостей.
- Устанавливает индекс регистра установки/сброса в GC.
- Получает текущий режим графического контроллера и устанавливает его обратно с битом 0Bh.
- Устанавливает индекс регистра безразличия цвета в GC.
- Перемещает начальный адрес видеопамяти в регистр DI.
- Заполняет видеопамять (20 байт) значениями 0FFh.
- Возвращает каретку в начало строки и переходит к следующему символу.
- Выводит символ
3
и возвращает каретку в начало строки. - Завершает работу программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д