Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2023, 12:54   #1
ChestIotVaga
Пользователь
 
Регистрация: 21.11.2022
Сообщений: 84
Восклицание как сделать изображение в монохроме

у меня есть программа которая делает в монохроме pcx но с попробовал сделать картинку грузовика приложу скрин но выдаёт только так как это исправить
Код:
; Чтение картинки размера xsiz, ysiz черно-белой из pcx файла
    .model small
    .code
 
finame db "603.pcx",0 ; название файла
fi  dw 0 ; дескриптор файла
maxsize=8000h ; макс размер (файл должен быть короче этого числа)
EOT=0
 
; xsiz, ysiz должны соответствовать файлу картинки
xsiz=46  ; ширина картинки в байтах
ysiz=480 ; высота картинки в пикселах
 
scrwidth=80 ; ширина экрана в байтах
 
; печать строки txt
print   macro txt
    local m1,m2
    jmp m2
m1  db txt,13,10,"$"
m2: push ax
    push dx
    mov dx,offset m1
    mov ah,9
    int 21h
    pop dx
    pop ax
    endm
 
start:  mov ax,cs
    mov ds,ax
    mov es,ax
    call readfile
    mov ax,0A000h ; es=видео сегмент
    mov es,ax
    mov ax,12h ; граф режим 640*480*16 цветов
    int 10h
    cld
    mov si,(offset picture)+128 ; данные графики начинаются в файле с поз 128
    mov di,0
    mov cx,ysiz
nextline:push cx ; цикл по линиям картинки
    push di
    mov bx,0
nextbyte:mov cx,1 ; цикл по байтам картинки
    lodsb
    cmp al,192 ; если al<192 то это байт данных...
    jc copy
    sub al,192 ; иначе это счетчик повторов, а след байт - байт данных
    mov cl,al
    lodsb
copy:   add bx,cx ; копируем cx байт и считаем в dx длину линии
    rep stosb
    cmp bx,xsiz ; линия достигла конца ?
    jc nextbyte ; нет - продолжим рисовать линию
    pop di
    pop cx
    add di,scrwidth ; адрес след линии видеопамяти
    loop nextline   ; конец цикла по линиям
    mov ah,0        ; ожидаем нажатия на клавишу
    int 16h
    mov ax,3        ; возвращаем текстовый режим
    int 10h
    mov ax,4C00h    ; выход в Дос
    int 21h
 
er1:    print "Error opening input file"
    mov ax,4C01h ; выход в Дос
    int 21h
 
; чтение данных из файла
readfile:
    mov dx,offset finame
    mov ax,3D00h ; open for read
    int 21h
    jc er1       ; если файл не найден, то ошибка
    mov fi,ax    ; fi=дескриптор файла
    mov bx,fi
    mov dx,offset picture ; затереть область памяти нулями
    mov di,dx
    mov al,EOT
    mov cx,maxsize+1
    rep stosb
    mov cx,maxsize ; считать файл (предполагается, что файл короче maxsize)
    mov ah,3Fh ; read file
    int 21h
    jc er1     ; переход если ошибка чтения
    mov bx,fi  ; закрыть файл каталога
    mov ah,3Eh ; close file
    int 21h
    mov fi,0
    ret
 
picture label byte
 
 
 
    end start
картинка https://programmersforum.ru/attachme...1&d=1681120372
окно программыhttps://programmersforum.ru/attachme...1&d=1681120427 как решить ?
Изображения
Тип файла: png 1.PNG (28.3 Кб, 12 просмотров)
Тип файла: png Снимок.PNG (7.4 Кб, 12 просмотров)
ChestIotVaga вне форума Ответить с цитированием
Старый 10.04.2023, 14:01   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Тут дело в том, что для режима 18 (640*480@16) придётся формировать 4 цветовые плоскости и записывать отдельно каждую плоскость.

Просто посчитаем 640 * 480 / 2 = 153600 байт, а это превышает 65536 (длина одного сегмена в реальном режиме и блока адресов отведённого для видеопамяти). И вот тут идёт разбиение каждого отдельного цвета:
Код:
для режима по умолчанию
  0    1    2    3    4    5    6    7 - пиксели в исходном изображении
/  \ /  \ /  \ /  \ /  \ /  \ /  \ /  \
ABCD ABCD ABCD ABCD ABCD ABCD ABCD ABCD <- биты пикселей в исходном изображении (4 бита = 16 цветов)
|||| |||| |||| |||| |||| |||| |||| ||||    * плоскость
|||| |||| |||| |||| |||| |||| |||| ||||    v
*+++-*+++-*+++-*+++-*+++-*+++-*+++-*+++--> A: 01234567 - 1 байт в видео памяти, 8 пикселей подряд на экране
 *++--*++--*++--*++--*++--*++--*++--*++--> B: 01234567 - 1 байт в видео памяти, 8 пикселей подряд на экране
  *+---*+---*+---*+---*+---*+---*+---*+--> C: 01234567 - 1 байт в видео памяти, 8 пикселей подряд на экране
   *----*----*----*----*----*----*----*--> D: 01234567 - 1 байт в видео памяти, 8 пикселей подряд на экране
По такой схеме для разрешения экрана 640*480@16 для каждой отдельной битовой плоскости нужно всего лишь 38400 байт. Что позволяет работать с одной страницей видеопамяти через 4 различных битовых плоскости.
Подробнее читайте про работу VGA

Последний раз редактировалось macomics; 10.04.2023 в 14:04.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как сделать такой слайдер? (изображение внутри) Михаил_dev JavaScript, Ajax 1 10.12.2017 18:33
как сделать изображение-карту? незнайка_на_земле HTML и CSS 6 18.11.2011 21:34
Как сделать чтбо изображение уменьшалось? seo-romka HTML и CSS 4 21.02.2011 21:01
как сделать изображение рядом с TITLE subbota HTML и CSS 1 14.07.2010 14:08
Как сделать изображение резиновым Diman2008 HTML и CSS 4 16.10.2008 23:46