; ===============================================================
; ===============================================================
.186
name LOGO
; ===============================================================
; === Начало программы: ===
CSEG segment use16
assume cs:cseg, ds:cseg, ss:cseg, es:cseg
org 100h ; COM файл
; ===============================================================
Start:
mov ax, 3D00h ; открываем файл только для чтения
lea dx, file ; указатель на строку с именем файла
int 21h
jnc File_Exist
lea dx, No_File ; Ошибка открытия файла
mov ah, 09h ;
int 21h ;
int 20h ; выходим из программы
File_Exist:
mov handle, ax
; === Готовим основную память ===
lea bx, Finish
shr bx,4
inc bx
mov ah,4Ah
int 21h ; Ужимаем размер отведенной памяти до метки Finish
mov ah, 48h ; выделим блок памяти под буфер
mov bx, 4096 ; 4096 * 16 = 65536 байт = 1 сегмент
int 21h
jnc Memory_OK
; ---
mov ah, 3eh ; закрываем файл
mov bx, handle
int 21h
lea dx, Memory_Error
mov ah, 09h ; выводим сообщение об ошибке
int 21h ;
int 20h ; выходим из программы
Memory_OK:
mov Buffer,ax ; сегмент в основной памяти выделенного блока
; === Установка цветовой палитры ===
mov ax,4F02h ; переключаем видео режим
mov bx,101h
int 10h
; ---
mov ax, 4200h ; сместить указатель файла от начала
mov bx, handle
xor cx, cx
mov dx, 54 ; на 54 байта - заголовок файла
int 21h
push Buffer ; переведем регистр сегмента даты на выделенный блок памяти
pop ds
mov ah, 3fh ; чтение из файла
; mov bx, handle ;
mov cx, 1024 ; читаем 1024 байт
xor dx, dx ; в начало буфера
int 21h ;
jnc Pallete_OK ; ошибка чтения файла
; ---
push cs ; перведем регистр сегмента даты на сегмент программы
pop ds
mov es,Buffer ; освободим блок выделенной памяти под буфер
mov ah, 49h ; в es параграф блока
int 21h
mov ah, 3eh ; закрываем файл
; mov bx, handle
int 21h
mov ax,3h ; возвращаемся в текстовый видео режим
int 10h
lea dx, Read_Error
mov ah, 09h ; выводим сообщение об ошибке
int 21h ;
int 20h ; выходим из программы
Pallete_OK:
xor ax, ax
mov si, 1024
mov cx, 100h
Next_Color:
mov dx,3c8h
mov al, cl ; прим. когда cx равно 100h в al помещается 0
dec ax ; но при отнимании 1 в al все равно получается FF
out dx,al
mov dx,3c9h
dec si ; пропускаем зарезирвированный байт в палитре BMP
dec si ; RED
mov al, byte ptr[si] ; в BMP палитре цвета расположены наоборот
shr ax, 2
out dx,al
dec si ; GREEN
mov al, byte ptr[si]
shr ax, 2
out dx,al
dec si ; BLUE
mov al, byte ptr[si]
shr ax, 2
out dx,al
loop Next_Color
push 0A000h ; в es сегмент даты видео буфера
pop es
mov word ptr ds:[8002h], 0 ; счетчик видео страниц
; === Вывод изображения ===
Next_Page:
push bx ; bx всю дорогу будет содержать хендл файла
mov ax, 4F05h
xor bx, bx
mov dx, word ptr ds:[8002h]
int 10h
pop bx
mov ah, 3fh ; чтение из файла
; mov bx, handle ;
mov cx, 8000h ; читаем 32768 байт
xor dx, dx ; в начало буфера
int 21h ;
xor si, si
xor di, di
mov cx, 8000h
Rep movsb ; DS:SI и ES:DI
mov ah, 3fh ; чтение из файла
; mov bx, handle ;
mov cx, 8000h ; читаем 32768 байт
xor dx, dx ; в начало буфера
int 21h ;
xor si, si
mov di, 8000h
mov cx, ax
Rep movsb ; DS:SI и ES:DI
inc word ptr ds:[8002h]
cmp word ptr ds:[8002h], 5
jb Next_Page
; === Завершаем программу ===
push ds
pop es
push cs
pop ds
; mov es,Buffer ;освободим блок выделенной памяти под буфер
mov ah, 49h ;в es параграф блока
int 21h
mov ah, 3eh ; закрываем файл
; mov bx, handle
int 21h
mov ah, 0
int 16h ; ожидаем нажатия любой клавиши
mov ax,3h ; возвращаемся в текстовый видео режим
int 10h
int 20h ; выходим из программы
; === Блок данных ===
Buffer dw ? ; сегмент выделенной памяти
handle dw ? ; хендл файла
file db 'LOGO.BMP',0 ; имя файла
No_File db 'ЋиЁЎЄ ®вЄалвЁп д ©« ', 0Dh,0Ah, 24h ; Ошибка открытия файла
Read_Error db 'ЋиЁЎЄ з⥨п д ©« ', 0Dh,0Ah, 24h ; Ошибка чтения файла
Memory_Error db 'ЋиЁЎЄ Ї ¬пвЁ', 0Dh, 0Ah, 24h ; Ошибка выделения памяти для буфера
; ---
Finish: ;метка усечения памяти программы
CSEG ends
end Start