змір заголовків + розмір
; палітри = $-BMP_file_header +256 * 4 +320 * 200; розмір заголовків +
; розмір палітри + розмір даннихdb 3 * 256-1 dup (0); для палітриdb 0; указ. на кінець рядка палітри полученой ф-й біос255 dup (0) db 0; указ. на кінець сформованої палітри для запису у файл
info_mes db 'Copy text screen if press F5 in file "copy"', '$'; рядок про програму
. codenew PROCdsax
mov ax, @ data; встановити в DS сегмент даних программиds, axal, 60h; отримати сан-код натиснутої клавішіal, F5_key; натиснута клавіша F5copy_file; якщо так, то почати запис екранаint09old; викликати перехоплений обробник Int 09h
pop axds_file:
pushfint09old; викликати перехоплений обробник Int 09hdin, 1; перевірити прапор записи в файлdo_file; почати записувати файл
pop axds_file:
push bx; зберегти ісп. регістриcx
push dxsidi
push esdin, 1ax, 40h; встановити ES на сег. оточення DOS (сег. з параметрами ОС) es, axah, byte ptr es: [49h]; номер поточного режиму
; перевіряємо номер режиму працювати тільки в графічному 13h
cmp ah, 13hgr_mode_good; = якщо режим 13hexit_mode_good:
mov ax, 3c00h +00100010 b; 3ch створити файл
xor cx, cxdx, BMPFile
int 21hferr; якщо сталася помилка при роботі з файломbx, ax; дескриптор файлаax, 4000h; записати у файл заголовок
mov cx, BMP_header_lengthdx, BMP_file_header
int 21hferr; якщо сталася помилка при роботі з файлом
push bxdses
movax, 1017h; Функція 1017h - читання палітри VGA, 0; починаючи з регістра палітри 0,, 256; всі 256 регістрів, offset Palette; початок палітри в BMPh; відеосервіс BIOS
; перевести палітру з формату, в якому її показує функція 1017h
; (три байти на колір, в кожному байті 6 значущих бітів)
; у формат, використовуваний в BMP-файлах
; (4 байти на колір, в кожному байті 8 значущих бітів); рух від кінця до початку, offset ePalette3; SI - кінець 3-байтной палітри, offset ePalette4; DI - кінець 4-байтной палітри
movcx, 256; CX - число цветов_pal: moval, 0cx
mov cx, 2; записати четвертий байт (0); прочитати третій байт, cl; масштабувати до 8 бітів; прочитати другий байт, cl; масштабувати до 8 бітів; прочитати третій байт, cl; масштабувати до 8 бітів; і записати ці три байти; в зворотному порядку
popaxcx_pal
pop bx; дискриптор файлу відновити з стекаax, 4000h; записати у файл заголовок
mov cx,...