Напрямую запись в видеопамять - 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

Объяснение кода листинга программы

Код выполняет следующие действия:

  1. Устанавливает режим графического контроллера (GC) на 12h.
  2. Устанавливает начальный адрес видеопамяти в регистре ES.
  3. Устанавливает цвет пикселя для установки/сброса.
  4. Разрешает установку/сброс для всех плоскостей.
  5. Устанавливает индекс регистра установки/сброса в GC.
  6. Получает текущий режим графического контроллера и устанавливает его обратно с битом 0Bh.
  7. Устанавливает индекс регистра безразличия цвета в GC.
  8. Перемещает начальный адрес видеопамяти в регистр DI.
  9. Заполняет видеопамять (20 байт) значениями 0FFh.
  10. Возвращает каретку в начало строки и переходит к следующему символу.
  11. Выводит символ 3 и возвращает каретку в начало строки.
  12. Завершает работу программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5
Похожие ответы