Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 25.10.2011
Репутация: нет Всего: нет
|
Код | .8086 ; разрешить привилегированные инструкции i286 .model small ; выбор модели памяти .stack ;сегмент стека .data ;сегмент данных name_file db '1.bmp',0 ;задаём имя файла 0 необходим для функции 3dh ;тут всякие переменные для хранения размеров и прочие вспомогательные x dw ? x2 dw ? ;x/2 y dw ? y2 dw ? ;y/2 cur_x dw 320 ;текущие координаты. Пока что центр экрана cur_y dw 240 handle dw ? ;для файлового номера _size dw ? ;для размера файла buffer db 28 dup (?) ;первый буффер. всё связанное с данными о файле buffer1 db 0ffffh-1100 dup (0)
.code ;сегмент кода
; процедура вычисления размера файла, размера по вертикали и по горизонтали read_size proc mov ax,3d00h ;3dh- функция для открытия файла lea dx,name_file ; в dx начало name_file int 21h mov bx,ax ; в bx 16-битный номер файла lea dx,buffer ; dx на начало буфер mov ah,3Fh ;читаем mov cx,26 ;прочитаем 26 байт. Пока нам больше и не надо int 21h mov ax,word ptr [buffer+2] mov _size,ax ;размер mov ax,word ptr [buffer+18] mov x,ax ; по горизонтали mov ax,word ptr [buffer+22] mov y,ax ;по вертикали ret read_size endp
; процедура открытия файла ;думаю тут комментировать нечего open_file proc mov ax,3d00h ;загрузили функцию lea dx,name_file int 21h or handle,ax ret open_file endp
; процедура чтения файла в буфер read_x proc mov bx,handle ; в handle 16 битный номер файла lea dx,buffer1 ; dx mov ah,3Fh mov cx, _size int 21h ret read_x endp
;собственно главная процедура - конвертирует 24-разрядный формат в палитру. Результат сохраняется в регистре al. Ниче сложного тут нет. В 24-разрядном изображении для каждого цвета (RGB) используется байт, в 16 цветном бит. Алгоритм основан на сдвигах.
convert proc near xor al,al mov ah,byte ptr [buffer1+si] ;B ; читаем сколько у нас синего shr ah,7; сдвигаем вправо на 7 разрядов and ah,00000001b ;первый бит цвета отвечает за синий остальные нам не нужны or al,ah ;выставляем синий inc si ;прибавляем счетчик (в BMP рисунке цвета располагаяся в порядке BGR ;поэтому сначала читаем синий потом зеленый и наконец красный) ;все тоже самое для зеленого, только со сдвигом на 1 разряд левее mov ah,byte ptr [buffer1+si] ;G shr ah,6 and ah,00000010b ;второй бит - зеленый or al,ah ;выставляем зеленый inc si ; и наконец красный. Все тоже самое что и выше только на разряд левее mov ah,byte ptr [buffer1+si] ;R shr ah,5 and ah,00000100b ;третий бит - красный or al,ah ;выставляем красный inc si or al,00001000b ;четвертый бит яркости. ;Вообще он будет выставляться процедурой bit_i но пока на вский случай включим его. Да будет свет! ret convert endp
; все. Процедуры кончились начинается сам код. .startup
mov ax,18 int 10h ; устанавливаем EGA 640x480x16
;вычисляем размеры call read_size call open_file call read_x
;вычисляем половины размеров по вертикали и горизонтали. Изображение выводится начиная с левого нижнего угла(именно так оно записано в BMP)
mov ax,x shr ax,1 mov x2,ax ;x2=x/2
mov ax,y shr ax,1 mov y2,ax ;y2=y/2
mov si,54 ;устанавливаем указатель на 54-й байт(само изображение начинается с 54-го байта. ; До этого всякая служебная информация) ; текущие координаты установлены на центр. установим их на левый нижний угол изображения mov cx,cur_x sub cx,x2 mov dx,cur_y add dx,y2
;============== ================= ;цикл вывода изображения на экран @l: call convert ;вначале конвертируем в палитру ;call cnv mov ah,0ch ;функция вывода на экран точки. ; Очень медленная, но можно вместо нее использовать процедуру pixel которая приведена ниже. ;Записывает прямо в видеобуфер. Получается намного быстрее int 10h ;call pixel inc cx push bx mov bx,320 add bx,x2 cmp cx,bx ;дошли до конца линии? pop bx jb @l ;если нет переходим к следующей точке ;=============== ================== ;все строчка кончилась двигаемся на точку вверх и все по новой dec dx sub cx,x push bx mov bx,240 sub bx,y2 cmp dx,bx ;240-y2 смотрим не дошли еще до верха? pop bx ja @l ; если не дошли продолжаем цикл
mov ah,0 int 16h ;ждем пока кто нибудь нажмет на клавишу mov ax,3 ;возвращаем текстовый режим int 10h mov ax,4c00h ;ФСЕ. Валим отсюдова. int 21h end
|
вот вывод 24х битного бмп файла на экран пробовал инвертнуть с помощью дополнительного буфера не фига не хватает указателей,подскажите как можно это сделать пожалуйста.
|