Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 12.04.2021
Сообщений: 5

Вывести изображение из массива 320×200 прямой записью в видеопамять видеорежима 4 (CGA)

20.04.2021, 12:26. Показов 1937. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Прошу помощи. Нужно вывести массив 320х200 в видеопамять в CGA адаптер. Есть пример кода где выводится этот массив в VGAрежиме. В массиве каждый бит содержит 00 или 01 для отображения точки. пример для простоты вывода в видеопамять сделан для VGA режима 13 где каждая точка соответствует одному биту массива. А мне для оценки скорости работы ХТ машины с адаптером CGA нужно переделать этот вывод в видеорежим 4. Вся загвоздка в том что в этом режиме каждая точка представляется всего 2 битами и плюс ещё четные и нечетные строки разнесены. Чётные выводятся с адреса В800:0000, а нечетные В800:2000.
Вот код для VGA режима

Assembler
1
2
3
4
5
6
7
push OAOOOh ;Сегментный адрес видеопамяти
pop es ;в ES.
mov ex,320*200 ;Максимальный номер точки
mov di.cx ;в видеопамяти - 320x200,
mov si, ex ;а в массиве -
inc si ;320x200 + 1.
rep raovsb ;Выполнить копирование в видеопамять
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.04.2021, 12:26
Ответы с готовыми решениями:

Вывод на экран прямой записью в видеопамять
мне надо вывести на экран символ строки используя прямую запись в видеопамять vivod macro str mov ah,09h lea dx,str int 21h ...

Вывод последовательности символов прямой записью в видеопамять
Нужна очень ваша помошь, мне завтра нужно показать, а я сама в этом не бум-бум) Зарание спасибо Написать программу вывода...

Видеопамять имеет объем, в котором может храниться 4-цветное изображение размером 300 х 200. Какого размера изображение можно хранить в том же объеме
Видеопамять имеет объем, в котором может храниться 4-цветное изображение размером 300 х 200. Какого размера изображение можно хранить в том...

7
0 / 0 / 0
Регистрация: 12.04.2021
Сообщений: 5
21.04.2021, 11:11  [ТС]
Извиняюсь в тексте допустил ошибку, а править нельзя. В VGA режиме каждой точке соответствует один байт массива , а не бит(((. В CGA режиме два бита на точку. И с адреса В800:0000 выводятся нечётные строки, а чётные с В800:2000.
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
21.04.2021, 13:17
Вы хотите взять 256 цветный bmp файл и преобразовать его в CGA 4 цвета ?
Или черно-белый файл ? Или 4 цветный файл вывести в CGA ?
0
0 / 0 / 0
Регистрация: 12.04.2021
Сообщений: 5
21.04.2021, 15:53  [ТС]
Я хочу что бы программа LIFE из книги Зубкова, могла выводить изображение в CGA режиме, для работы на машине XT.
Выводятся всего два цвета, 00 черный ячейка пустая и 01 это в зависимости от режима синий или светло синий, ячейка заполнена. Как это сделать средствами Биос я знаю, но это очень медленно работает. А вот как сделать прямое копирование в видеопамять не знаю.
Я думаю нужно массив преобразовывать в промежуточный для вывода. Для этого брать байт основного массива сдвигать на 6 влево и оставшееся записывать в новый массив. И новый получившийся массив выводить на экран. Но тут затык как из 4 байт основного массива получить один в промежуточный.
0
Модератор
1245 / 676 / 292
Регистрация: 10.11.2019
Сообщений: 1,406
21.04.2021, 17:47
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
; Заполнение экрана CGA mode 4 (320*200*4) по точкам
 
    .model tiny
    .code
    org 100h
start:  jmp beg
;
; Name:     PixelAddr04
;
; Function: Determine buffer address of pixel in 320x200 4-color mode
;
; Caller:   AX = y-coordinate (0-199)
;       BX = x-coordinate (0-319)
;
; Returns:  AH = bit mask
;       BX = byte offset in buffer
;       CL = number of bits to shift left
;       ES = video buffer segment
;
 
 
OriginOffset    EQU 0       ; byte offset of (0,0)
; Здесь можно поставить сегмент RAM а не видеопамяти
; После изменения изображения можно быстро копировать его в видео память
; с помощью rep movsw
VideoBufferSeg  EQU 0B800h
dotcolor    db 0
 
PixelAddr04:
 
        mov cl,bl       ; CL := low-order byte of x
 
        xchg    ah,al       ; AX := 100h * y
        shr ax,1        ; AL := 80h * (y&1)
        add bh,al       ; BX := x + 8000h*(y&1)
        xor al,al       ; AX := 100h*(y/2)
        add bx,ax       ; BX := x + 8000h*(y&1) + 100h*(y/2)
        shr ax,1
        shr ax,1        ; AX := 40h*(y/2)
        add bx,ax       ; BX := x + 8000h*(y&1) + 140h*(y/2)
        shr bx,1
        shr bx,1        ; BX := x/4 + 2000h*(y&1) + 50h*(y/2)
        add bx,OriginOffset ; BX := byte offset in video buffer
 
        mov ax,VideoBufferSeg
        mov es,ax       ; ES:BX := byte address of pixel
 
        mov ah,3        ; AH := unshifted bit mask
        and cl,ah       ; CL := x & 3
        xor cl,ah       ; CL := 3 - (x & 3)
        shl cl,1        ; CL := # bits to shift left
 
        ret
; вывод точки на cga 320*200*4 cx - x, dx - y,al - цвет (0-3)
pset04: push ax
    push bx
    push cx
    push dx
    push es
    cmp  cx,320
    jnc  ps1
    cmp  dx,200
    jnc  ps1
    mov  dotcolor,al
    mov  ax,dx ; y
    mov  bx,cx ; x
    call pixeladdr04
    mov al,ah ; ставим в позицию точки цвет 0
    shl al,cl
    xor al,255
    and es:[bx],al
    mov al,dotcolor ; ставим в позицию точки цвет color
    shl al,cl
    or  es:[bx],al
ps1:    pop es
    pop dx
    pop cx
    pop bx
    pop ax
    ret
 
; основная программа Весь экран заполняется по точкам
; Это всё равно довольно медленно на слабых компьютерах.
beg:    push cs
    pop  ds
    push cs
    pop  es
    mov ax,4
    int 10h
    mov dx,0
m0: mov cx,319
m1: mov al,1
    call pset04
    loop m1
    inc dx
    cmp dx,200
    jc  m0
    mov ah,0
    int 16h
    mov ax,3
    int 10h
    mov ax,4C00h
    int 21h
    end start
0
0 / 0 / 0
Регистрация: 12.04.2021
Сообщений: 5
22.04.2021, 09:49  [ТС]
Спасибо, буду дерзать).
0
25.04.2021, 08:34

Не по теме:

Цитата Сообщение от bipmaster Посмотреть сообщение
А мне для оценки скорости работы ХТ машины с адаптером CGA нужно переделать этот вывод в видеорежим 4.
У Вас есть работоспособная XT ?

0
0 / 0 / 0
Регистрация: 12.04.2021
Сообщений: 5
26.04.2021, 16:41  [ТС]
И не одна)) Ещё есть 286, 386 и 486 и первопень.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
26.04.2021, 16:41
Помогаю со студенческими работами здесь

Написать программу вывода строки на экран: прямой записью в видеопамять / функциями BIOS
Задание: Написать программу вывода строки на экран: - прямой записью в видеопамять; -с использованием функции BIOS Цветность...

Создание динамических эффектов: реализовать любой динамический видеоэффект с прямой записью в видеопамять
Помогите написать код пожалуйста: Любой динамический видеоэффект(желательно с прямой записью в видеопамять)

Видеопамять. Вывести изображение
Пока выводятся две строчки, и я не могу понять как задать цикл в E10DISPLAY proc . что не так? .model small .stack 100h .186 .data ...

видеопамять имеет объем в котором может храниться 16-ти цветное изображение размером 640х480,Какого размера изображение можно хранить в том же объеме
видеопамять имеет объем в котором может храниться 16-ти цветное изображение размером 640х480,Какого размера изображение можно хранить в том...

Квадрат в видеорежиме 320*200
Есть вот такая программка, которая рисует квадрат: Что здесь изменить, чтобы квадрат отображался в левом нижнем углу? Как я понимаю, дело...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru