; ===============================================================
; ===============================================================
.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