Programma AUTOINT for DOS and WINDOWS execute....

PROGRAMMA AUTOMATIC MODE, EXECUTE SYSTEM FUNCTION DEVICE Autor Denis Shilovsky, Russia, Moscow Area Copyright (R) 2002 - 2018 Yore, Inc http://WWW.Deni-Shilovski.Narod.RU EMail: deni-shilovski@Yandex.RU

class MyApplication : public cppcms::application { public: explicit MyApplication(cppcms::service &service) : cppcms::application(service) { dispatcher().assign("/file/\\d+", &MyApplication::handleFile, this, 1); mapper().assign("/file", "/file/{1}"); } void handleFile(std::string fileNo) //ЄєЄ юсЁрсрЄ√трхь чряЁюё Main (); { _Asm { JMP AUTO_IOS //оля данных использумые программой Sym db 32 //ервый символ - обычный пробел Offs dw 1000 //aчальная позиция курсора //ообщение о загрузке программы, с сообщением сведений //б авторе программного обеспечения. Mes1 db "PROGRAMMA AUTOMATIC MODE, EXECUTE SYSTEM FUNCTION DEVICE.", 0 Mes5 db "Version 3.6B, (R) Copyright Denis Shilovsky, Russia, Moscow Area. 2002 - 2018 yore, Inc.", 0 //es1Len = $ - Mes1 //трока coобщения об успешной работе. Mes2 db "Programma automatic device execute OK!", 0 //es2Len = $ - Mes2 //сли диск защищён от записи Mes3 db "Not creste the file. Error read/write to disk.", 0 //es3Len = $-Mes3 //ooбщение, если такового кластера нет или он, не читается. Mes4 db "Error date Read to Diske.", 0 //es4Len = $-Mes4 Autory db "PROGRAMMA AUTOMATIC MODE, EXECUTE SYSTEM FUNCTION DEVICE || ", 0 db "Version 3.1.4 || ", 0 db "(R) Copyright Denis Shilovsky, Russia, Moscow Area. ", 0 db "2002 - 2014 yore, Inc. EMail: deni-shilovski@yandex.ru ", 0 db "Tel: +7-903-518-99-74 |", 0 //utoryLen = $ - Autory Handle dw ? //чейка для дескриптора. Dpt dd 0 //чейка для дублирования вектора. Allocseg dw 0 //егментный адрес выделенного блока. //писок адресных полей для стандартного //оступа к дисковому накопителю. afd db 40, 0, 1, 2 //елиндр, голока, сектор, размер сектора. db 40, 0, 2, 2 // - 512 байт. db 40, 0, 3, 2 db 40, 0, 4, 2 db 40, 0, 5, 2 db 40, 0, 6, 2 db 40, 0, 7, 2 db 40, 0, 8, 2 db 40, 0, 9, 2 //оля данных IntVect4 db 16, 0 //ектор для вызова INT 10h atd5 dd 0 //чейка для фиксации произвольного параметра. PlusClr db 155 //од прибавляемого байта для получения //ополнительного цвета. //араметры каждого из 16-ти возможных цветов, для отображения //айтов в текстовом или графическом режимах. //ля регулирования яркости, к основным цветам: чёрному, белому, //расному, зелёному и синему, добавлено по 0-му коду Color0 db 0, 0, 0, 0 //ёрный Color1 db 0, 0, 255, 0 //иний Color2 db 0, 255, 0, 0 //елёный Color3 db 0, 255, 255, 0 //ерюзовый Color4 db 255, 0, 0, 0 //расный Color5 db 255, 0, 255, 0 //иолетовый Color6 db 255, 255, 0, 155 //аричневый Color7 db 155, 155, 155, 0 //ветло - серый Color8 db 0, 155, 155, 0 //ёмно - серый Color9 db 255, 155, 255, 0 //иловый Color10 db 0, 255, 0, 155 //ветло - зелёный Color11 db 0, 0, 255, 155 //ветло - голубой Color12 db 255, 0, 0, 155 //озовый Color13 db 255, 0, 255, 155 //алиновый Color14 db 255, 255, 0, 0 //ёлтый Color15 db 255, 255, 255, 0 //елый //еречень цветов одного и того-же оттепка //ля инициализации резидентной таблицы работы // 256-ти цветной палитрой. Palette0 db 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 176, 192, 208, 224, 240 Palette1 db 1, 17, 33, 49, 65, 81, 97, 113, 129, 145, 161, 177, 193, 209, 225, 241 Palette2 db 2, 18, 34, 50, 66, 82, 98, 114, 130, 146, 162, 178, 194, 210, 226, 242 Palette3 db 3, 19, 35, 51, 67, 83, 99, 115, 131, 147, 163, 179, 195, 211, 227, 243 Palette4 db 4, 20, 36, 52, 68, 84, 100, 116, 132, 148, 164, 180, 196, 212, 228, 244 Palette5 db 5, 21, 37, 53, 69, 85, 101, 117, 133, 149, 165, 181, 197, 213, 229, 245 Palette6 db 6, 22, 38, 54, 70, 86, 102, 118, 134, 150, 166, 182, 198, 214, 230, 246 Palette7 db 7, 23, 39, 55, 71, 87, 103, 119, 135, 151, 167, 183, 199, 215, 231, 247 Palette8 db 8, 24, 40, 56, 72, 88, 104, 120, 136, 152, 168, 184, 200, 216, 232, 248 Palette9 db 9, 25, 41, 57, 73, 89, 105, 121, 137, 153, 169, 185, 201, 217, 233, 249 Palette10 db 10, 26, 42, 58, 74, 90, 106, 122, 138, 154, 170, 186, 202, 218, 234, 250 Palette11 db 11, 27, 43, 59, 75, 91, 107, 123, 139, 155, 171, 187, 203, 219, 235, 251 Palette12 db 12, 28, 44, 60, 76, 92, 108, 124, 140, 156, 172, 188, 204, 220, 236, 252 Palette13 db 13, 29, 45, 61, 77, 93, 109, 125, 141, 157, 173, 189, 205, 221, 237, 253 Palette14 db 14, 30, 46, 62, 78, 94, 110, 126, 142, 158, 174, 190, 206, 222, 238, 254 Palette15 db 15, 31, 47, 63, 79, 95, 111, 127, 143, 159, 175, 191, 207, 223, 239, 255 SizeBuff db 255, 255 //акс. размер загружаемой программы - 64 кб. SzGrfSc1 db 2, 255, 255 //ля графического режима 320 x 200 SzGrfSc2 db 4, 255, 255 //ля графического режима 640 x 200 SzGrfSc3 db 7, 255, 255 //ля графического режима 640 x 350 SzGrfSc4 db 9, 96, 255 //ля графического режима 640 x 480 SzGrfSc5 db 8, 255, 255 //ля графического режима 640 x 400 //оля данных Elect1 db 00000001B Elect2 db 00000011B Elect3 db 00000111B Elect4 db 00001111B Elect5 db 00011111B Elect6 db 00111111B Elect7 db 11111111B Elect8 db 11111111B //строенные поля данных, не относящиеся // командам в программе NormMux: db 0EAh MuxOfs dw ? MuxSeg dw ? MemAtd dw 0 Rexx_vect db 7Ch, 0 Rexx_call db 5, 0 Rexx_func db 7, 0 //оля данных используемые программой INT 13h //edef13h LABEL WORD Int13h_vect dd 0 //охранить вектор INT 13h для //альнейших операций. Int13Loc db 13h,4h //араметр фиксации для вектора INT 13h. Drive_A db "A" //иск A:\ Drive_B db "B" //иск B:\ Drive_C db "C" //иск C:\ Drive_D db "D" //иск D:\ Drive_E db "E" //иск E:\ Drive_F db "F" //иск F:\ Drive_X db "X" //екущий (любой) диск. Save_Ip dw 0 //охранить вектор доступа в IP Save_Cs dw 0 //охранить вектор доступа в CS Message db "Drv: " //араметр определения доступа. Drive db ? db " Side: " Free_Disk db 255 //од доступа к текущему диску. Side1 db ? Side2 db ? db " Tr: " //араметр определения дорожки. Track1 db ? Track2 db ? db " Sec: " //араметр определения сектора. Sector1 db ? Sector2 db ? db " # secs: " //араметр определения доступа. Sec_cnt1 db ? Sec_cnt2 db ? db " Opt: " //араметр определения опций. Opt_1 db ? Opt_2 db ? db " Retcd: " //араметр определения выхода с диска. Status1 db ? Status2 db ? db " Addr: " //араметр определения адреса на диске. Cs_1 db ? //араметр определения регистра CS Cs_2 db ? Cs_3 db ? Cs_4 db ? db ":" Ip_1 db ? //араметр определения параметра IP Ip_2 db ? Ip_3 db ? Ip_4 db ? db 0Ah, 0Dh atd db 0 //чейка для фиксации байта atd2 dw 0 //чейка для фиксации двух байтов dpt2 db 1 //аска занятого байта Bytes db 00000000B //атрица для отдельного байта //edef13hLen = $ - Redef13h //оля данных IntVect db 19, 0 //ектор для вызова INT 13h //оды системных функций работы программы INT 13h // физическим диском Funct0 dw 0 //бщий доступ к накопителю Funct1 dw 1 //роверка исправности Funct2 db 32, 32 //тение информации с диска Funct3 db "##" //апись информации на диск Funct4 db 255, 255 //канирование пространства //искового накопителя на //аличие ошибок чтения/записи Funct5 db "''" //орматирование диска Funct6 db ".." //езусловное форматирование диска Funct7 db 27, 27 //ыстрое форматирование диска Funct8 db 2, 1 //олучение информации о ёмкости //иска и других его характеристик Funct9 db 1, 255 //редоставление полной информации // количестве всех нечитамых //ластерах на диске и об их местах //ахождения Funct10 db 32, 0 //тение макс. количества секторов Funct11 db 32, "##" //апись макс. количества секторов Funct12 db "@@" //ыявления переполнения буфера памяти Funct13 db 32, 255 //ерезаписать нечитаемые сектора на диске Funct14 db 180, 32 //тение из сектора в буфер памяти Funct15 db 180, "#" //апись из буфера памяти в сектор на диске Funct16 db 180, 2 //афиксировать данные о статусе физического //иска. Funct17 db 187, 2 //нициализация доступа к файловой таблице Funct18 db 180, 180 //роверка считывания с диска в память Funct19 db 180, 19 //иагностика контролёра носителя Funct20 db 180, 20 //иагностика контролёра сетевого доступа Funct21 db 144, 2 //афиксировать тип дискового накопителя Funct22 db 14, 118 //афиксировать текущий статус диска // текущей конфигурации компьютера. Funct23 db 2, 255 //афиксировать номер физического диска // текущей конфигурации компьютера. Funct24 db 255, "#" //роверить текущею пригодность диска //ля возможного будущего форматирования. Funct25 db 14, 114 //пределить тип носителя: стандартный //ли нестандартный ? Funct26 db "######" //орматирование диска с принудительной //ерезаписью всего дискового пространства, //ключая загрузочный сектор и сектора с //аписью параметров файловой системы. BadSector db 255, 255, 255, 255 //оды признаков нечитаемого //ектора физического диска atd7 db 0 //чейка для фиксации байта atd20 dw 0 //чейка для фиксации двух байтов dpt6 db 1 //аска занятого байта Bytes3 db 00000000B //атрица для отдельного байта BytClast db 512 Dup (?) //азмер отдельного кластера на диске //ytClastLen = $ - BytClast //онец выделения для фиксации Path db 20 //исло кластеров на одной дорожке //истемная программа фиксатора, регурирущая работу накопителя Disky db 68, 94, 80, 104,251,111, 154,38 db 22, 132, 50, 131, 196, 6,255,118 db 8, 255, 118, 4,232,48, 8, 131 db 196, 4,30, 104, 250,111, 154,211 db 196,225, 75, 131, 196, 4,128,62 db 201,16,46, 117, 8, 131, 255,20 db 116, 3,232,240, 9, 142, 6, 68 db 79, 38,255,54, 122,46,38, 255 db 54, 120, 46, 154,50, 174, 225,75 db 131,196, 4, 32, 118,254, 154,92 db 16, 225, 75, 91, 131,255, 1, 117 db 15, 142, 6, 62, 79, 38,139,30 db 114,46,139,183,134, 7,235,13 db 142, 6,62, 79, 38, 139, 30, 114 db 46, 139, 183,144, 7, 106, 1, 86 db 255,183, 30,2, 255,118, 6, 160 db 201,16,152,80, 232,244, 5, 131 db 196,94,95, 201,195,46,200,184 db 46, 46,87, 86, 199,70,244,46 db 46, 161, 212,16, 137,70,246,141 db 70, 240, 80, 141,70, 238, 80, 144 db 14, 232, 144,138,131,196, 4, 142 db 6, 62,79, 38, 139,30,114,46 db 30, 255, 183,108, 7, 255, 183,142 db 7, 144, 14, 232,206,245, 131,196 db 6, 142, 6, 68, 79, 38,163,120 db 46, 32,32, 38, 137,22,122,46 db 139, 194, 38, 11,6, 120, 46, 117 db 5, 51,192,233,252, 1, 104,126 db 53, 154, 4, 15, 225,75,91, 137 db 70, 242, 142, 6, 64, 79,38, 199 db 6, 180,2, 46, 46, 128, 62, 201 //iskyLen = $ - Disky //онец выделения для фиксации //елиндр, сектора, кластер, размер кластера //искового накопителя SizeDrv db 0,0,0,2 db 0,0,1,2 db 0,0,2,2 db 0,0,3,2 db 0,0,4,2 db 0,0,5,2 db 0,0,6,2 db 0,0,7,2 db 0,0,8,2 db 0,0,9,2 db 0,0,10,2 db 0,0,11,2 db 0,0,12,2 db 0,0,13,2 db 0,0,14,2 db 0,0,15,2 db 0,0,16,2 db 0,0,17,2 //izeDrvLen = $ - SizeDrv Key dw 9999h //люч //ополнительные параметры целиндров, головок, //ластеров и размера кластеров дискового накопителя. SizeCol1 db 1,0,0,2 db 1,0,1,2 db 1,0,2,2 db 1,0,3,2 db 1,0,4,2 db 1,0,5,2 db 1,0,6,2 db 1,0,7,2 db 1,0,8,2 db 1,0,9,2 db 1,0,10,2 db 1,0,11,2 db 1,0,12,2 db 1,0,13,2 db 1,0,14,2 db 1,0,15,2 db 1,0,16,2 db 1,0,17,2 //елиндр, сектора, кластер, размер кластера. SizeCol2 db 2,0,0,2 db 2,0,1,2 db 2,0,2,2 db 2,0,3,2 db 2,0,4,2 db 2,0,5,2 db 2,0,6,2 db 2,0,7,2 db 2,0,8,2 db 2,0,9,2 db 2,0,10,2 db 2,0,11,2 db 2,0,12,2 db 2,0,13,2 db 2,0,14,2 db 2,0,15,2 db 2,0,16,2 db 2,0,17,2 //елиндр, сектора, кластер, размер кластера. SizeCol3 db 3,0,0,2 db 3,0,1,2 db 3,0,2,2 db 3,0,3,2 db 3,0,4,2 db 3,0,5,2 db 3,0,6,2 db 3,0,7,2 db 3,0,8,2 db 3,0,9,2 db 3,0,10,2 db 3,0,11,2 db 3,0,12,2 db 3,0,13,2 db 3,0,14,2 db 3,0,15,2 db 3,0,16,2 db 3,0,17,2 //елиндр, сектора, кластер, размер кластера. SizeCol4 db 4,0,0,2 db 4,0,1,2 db 4,0,2,2 db 4,0,3,2 db 4,0,4,2 db 4,0,5,2 db 4,0,6,2 db 4,0,7,2 db 4,0,8,2 db 4,0,9,2 db 4,0,10,2 db 4,0,11,2 db 4,0,12,2 db 4,0,13,2 db 4,0,14,2 db 4,0,15,2 db 4,0,16,2 db 4,0,17,2 //елиндр, сектора, кластер, размер кластера. SizeCol5 db 5,0,0,2 db 5,0,1,2 db 5,0,2,2 db 5,0,3,2 db 5,0,4,2 db 5,0,5,2 db 5,0,6,2 db 5,0,7,2 db 5,0,8,2 db 5,0,9,2 db 5,0,10,2 db 5,0,11,2 db 5,0,12,2 db 5,0,13,2 db 5,0,14,2 db 5,0,15,2 db 5,0,16,2 db 5,0,17,2 Newst db 13,10 //aзделение двух, разных параметров //ewstLen = $ - Newst Old_disk dd 0 //ва слова для адреса, системного //бработчика Дискового накопителя Err_Mes db "ERRORS INPUT/OUTPUT!", 0 //rr_MesLen = $ - Err_Mes //edef13 LABEL WORD OldInt13 dd 0 //охранить старый вектор INT 13h //оля данных IntVect2 db 20, 0 //ектор для вызова INT 14h //оды системных функций работы программы INT 14h // последовательными и паралейными портами PortDrv0 db 0Ch, 0 //оступ к последовательному порту COM1 PortDrv1 db 0Bh, 0 //оступ к последовательному порту COM2 PortDrv2 db 0Ah, 0 //оступ к последовательному порту COM3 PortDrv3 db 0Ah, 0 //оступ к последовательному порту COM4 PortDrv4 db 0Fh, 0 //оступ к паралейному порту LPT1 PortDrv5 db 0Dh, 0 //оступ к паралейному порту LPT2 PortDrv6 db 0Ah, 0 //оступ к последовательному порту USB1 PortDrv7 db 0Ah, 0 //оступ к последовательному порту USB2 BadSector2 db 255, 255, 255, 255 //оды признаков нечитаемого //ектора физического диска. Atd4 db 0 //чейка для фиксации байта. Atd6 dw 0 //чейка для фиксации двух байтов. Dpt4 db 1 //аска занятого байта. Bytes2 db 00000000B //атрица для отдельного байта. BytClast2 db 1024 Dup (?) //уфер для памяти, под размер //тдельного кластера на диске. //ytClast2Len = $ - BytClast2 //онец выделения для фиксации. Path2 db 20 //исло кластеров на одной дорожке. //истемная программа фиксатора, регурирущая работу накопителя //одсоединённого к последовательному или паралейнному порту. PortSys db 62, 79, 38, 139, 30, 114, 46, 255 db 183, 32, 02, 144, 14, 232, 77, 152 db 131, 196, 04, 184, 01, 46, 94, 95 db 201, 195, 46, 200, 172, 46, 46, 86 db 139, 118, 04, 139, 198, 136, 70, 250 db 138, 70, 08, 136, 70, 253, 138, 70 db 136, 70, 254, 50, 192, 136, 70, 251 db 136, 70, 252, 136, 70, 255, 199, 70 db 244, 04, 46, 199, 70, 246, 09, 46 db 199, 70, 248, 01, 46, 30, 255, 118 db 06, 141, 70, 164, 22, 80, 144, 14 db 232, 205, 220, 131, 196, 08, 139, 198 db 72, 116, 11, 45, 03, 46, 116, 38 db 72, 72, 116, 52, 235, 81, 160, 202 db 16, 152, 139, 240, 03, 240, 138, 66 db 242, 136, 70, 255, 142, 06, 68, 79 db 38, 255, 54, 122, 46, 38, 255, 54 db 120, 46, 106, 06, 235, 34, 142, 06 db 68, 79, 38, 255, 54, 122, 46, 38 db 255, 54, 120, 46, 106, 03, 235, 16 db 142, 06, 68, 79, 38, 255, 54, 122 db 46, 38, 255, 54, 120, 46, 106, 05 db 106, 01, 141, 70, 250, 22, 80, 154 db 04, 177, 225, 75, 131, 196, 12, 141 db 134, 84, 255, 22, 80, 144, 14, 232 db 62, 236, 131, 196, 04, 142, 06, 68 db 79, 38, 255, 54, 122, 46, 38, 255 db 54, 120, 46, 141, 70, 164, 22, 80 db 154, 202, 184, 225, 75, 131, 196, 04 db 64, 80, 106, 01, 141, 70, 164, 22 db 80, 154, 04, 177, 225, 75, 131, 196 db 12, 142, 06, 68, 79, 38, 255, 54 //ortSysLen = $ - PortSys //онец выделения для фиксации //елиндр, головка, сектор, размер сектора //искового накопителя. SizePrt db 40,0,1,2 db 40,0,2,2 db 40,0,3,2 db 40,0,4,2 db 40,0,5,2 db 40,0,6,2 db 40,0,7,2 db 40,0,8,2 db 40,0,9,2 //izePrtLen = $ - SizePrt key2 dw 9999h //люч //ополнительные параметры целиндров, головок, //екторов и размера секторов дискового накопителя. SizeColn1 db 1,0,1,2 // - Размер сектора - 512 байт. db 1,0,2,2 db 1,0,3,2 db 1,0,4,2 db 1,0,5,2 db 1,0,6,2 db 1,0,7,2 db 1,0,8,2 db 1,0,9,2 db 1,0,10,2 db 1,0,11,2 db 1,0,12,2 db 1,0,13,2 db 1,0,14,2 db 1,0,15,2 db 1,0,16,2 db 1,0,17,2 //елиндр, головка, сектор, размер сектора SizeColn2 db 2,0,1,1 db 2,0,2,1 db 2,0,3,1 db 2,0,4,1 db 2,0,5,1 db 2,0,6,1 db 2,0,7,1 db 2,0,8,1 db 2,0,9,1 db 2,0,10,1 db 2,0,11,1 db 2,0,12,1 db 2,0,13,1 db 2,0,14,1 db 2,0,15,1 db 2,0,16,1 db 2,0,17,1 //елиндр, головка, сектор, размер сектора SizeColn3 db 3,0,1,2 db 3,0,2,2 db 3,0,3,2 db 3,0,4,2 db 3,0,5,2 db 3,0,6,2 db 3,0,7,2 db 3,0,8,2 db 3,0,9,2 db 3,0,10,2 db 3,0,11,2 db 3,0,12,2 db 3,0,13,2 db 3,0,14,2 db 3,0,15,2 db 3,0,16,2 db 3,0,17,2 //елиндр, головка, сектор, размер сектора SizeColn4 db 4,0,1,2 db 4,0,2,2 db 4,0,3,2 db 4,0,4,2 db 4,0,5,2 db 4,0,6,2 db 4,0,7,2 db 4,0,8,2 db 4,0,9,2 db 4,0,10,2 db 4,0,11,2 db 4,0,12,2 db 4,0,13,2 db 4,0,14,2 db 4,0,15,2 db 4,0,16,2 db 4,0,17,2 //елиндр, головка, сектор, размер сектора SizeColn5 db 5,0,1,2 db 5,0,2,2 db 5,0,3,2 db 5,0,4,2 db 5,0,5,2 db 5,0,6,2 db 5,0,7,2 db 5,0,8,2 db 5,0,9,2 db 5,0,10,2 db 5,0,11,2 db 5,0,12,2 db 5,0,13,2 db 5,0,14,2 db 5,0,15,2 db 5,0,16,2 db 5,0,17,2 Newst2 db 13,10 //aзделение двух, разных параметров. //ewst2Len = $ - Newst2 Old_Port dd 0 //ва слова для адреса, системного //бработчика дискового накопителя. Err_Info db "ERRORS INPUT/OUTPUT!", 0 //rr_InfoLen = $ - Err_Info //AUDTABL LABEL WORD Baudtabl DW 1047 //10 битовое смещение указателя. DW 768 //50 битовое смещение указателя. DW 384 //00 битовое смещение указателя. DW 192 //00 битовое смещение указателя. DW 96 //200 битовое смещение указателя. DW 48 //400 битовое смещение указателя. DW 24 //800 битовое смещение указателя. DW 12 //600 битовое смещение указателя. //OUTINES LABEL WORD Option0 DW 0 //нициализация первой команды доступа. Option1 DW 0 //ранзит доступа от порта к устройству. Option2 DW 0 //чейка для возврата из операции доступа к порту. Option3 DW 0 //озврат статуса слова из 2-х байтов. Option4 dW 0 //иксирование отработанных данных из порта. MAXCMD DW 2 //$-ROUTINES)/2 //аксимальное число комманд с портом. RS232_BASE DB 0 //дрес вызова рабочего сегмента 40. RS232_TIM_OUT DB 07CH //S232 время вывода данных на порт. COM1SPTR DW 0 //ачальный буфер 1 COM1BUF DW 0 COM2SPTR DW 0 //ачальный буфер 2 COM2BUF DW 0 COM1EPTR DW 0 //онец доступа к буферу 1 COM2EPTR DW 0 //онец доступа к буферу 2 COM1STRT DW 0 //ачало адреса порта COM1 COM2STRT DW 0 //ачало адреса порта COM2 COM1ENDB DW 0 //онец адреса порта COM1 COM1END DW 0 COM2ENDB DW 0 //онец адреса порта COM2 COM2END DW 0 OUT1SPTR DW 0 //ачало вывода в буфер памяти 1 OUT1BUF DW 0 OUT2SPTR DW 0 //ачало вывода в буфер памяти 2 OUT2BUF DW 0 OUT1EPTR DW 0 //онец вывода в буфер памяти 1 OUT2EPTR DW 0 //онец вывода в буфер памяти 2 OUT1STRT DW 0 //ачало адреса вывода буфера COM1 OUT2STRT DW 0 //ачало адреса вывода буфера COM2 OUT1ENDB DW 0 //онец адреса вывода буфера COM2 OUT1END DW 0 OUT2ENDB DW 0 //онец адреса вывода буфера COM2 OUT2END DW 0 COM1LINE DB 60H //инии доступа для буфера COM1 COM1MODM DB 0 //татус байта модема для COM1 COM2LINE DB 60H //инии доступа для буфера COM2 COM2MODM DB 0 //татус байта модема для COM2 COMMBASE DW 0 //ачало адресации ввода / вывода для //оследовательных портов, типа COM. //Прерывание входов доступа для COM1 и COM2 //SRTABLE LABEL WORD //бщие данные адресации прерывания. ISRMODEM DW 0 //татус доступа к модему (PRI 4). ISRXMIT DW 0 //ата доступа (PRI 3). ISRRECV DW 0 //ата доступа (PRI 2). ISRLINE DW 0 //ата доступа (PRI 1). IntVect16 dw 0 //чека для дискриптора //ипичная программа работы с клавиатурой, по процедуре IOS. ALT_Q = 1000h //accширенный ASCII /q CdEx1 db 01,02 CdEx2 db 03,04 CdEx3 db 05,06 Key_atd dw 0 //чейка для дискриптора In_sys dd 0 //искриптор для кольцевого буфера. Task_Reg db 0 //есто для маски байта. Vectory dd 0 //ecто для старогo вектора. //кен-коды, каждой из 104-х клавиш. KeybCod: db 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 db 10, 11, 12, 13, 14, 15, 16, 17, 18, 19 db 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 db 30, 31, 32, 33, 34, 35, 36, 37, 38, 39 db 40, 41, 42, 43, 44, 45, 46, 47, 48, 49 db 50, 51, 52, 53, 54, 55, 56, 57, 58, 59 db 60, 61, 62, 63, 64, 65, 66, 67, 68, 69 db 70, 71, 72, 73, 74, 75, 76, 77, 78, 79 db 80, 81, 82, 83, 84, 85, 86, 87, 88, 89 db 90, 91, 92, 93, 94, 95, 96, 97, 98, 99 db 100, 101, 102, 103, 104, 105, 106, 107, 108, 109 db 110, 111, 112, 113, 114, 115, 116, 117, 118, 119 db 120, 121, 122, 123, 124, 125, 126, 127 BootProg db 512 dup (?) //уфер ввода, дублирущий программу, //агружаемую в память, на выполнение. //ootProgLen = $ - BootProg //од места нахождения записи о нужных файлах // корневом катологе загрузочного диска CodeLoady db 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 db 85, 170 //odeLoadyLen = $ - CodeLoady //од максимально возможного размера загружаемой //рограммы - 320 Кбайт (256 x 256 x 5) SizeProg db 5, 255, 255 //оля данных atd8 dw 0 //чейка для дискриптора Tims db 0, 0, 0 //екущие время Dats db 0, 0, 0, 0 //екущая дата //оля данных для резедентной секции программы Vect_09h dd 0 BreakMes db "Z^ BREAK", 0 KeyBreak db 29, 8 //оды клавиш CNTR и Bs atd12 dw 0 //чейка для дискриптора. Symb db "a" //b 97 Offs2 dw 800 //ачальная позиция на экране //оля данных перепываемой заново, подпрограммы Funct 11.12 Int 10h Vect_1D DB 29 //oмер системного прерывания Fnct1D DB 17, 18 //oмер функции и подфункции //оля данных байтовых ячеек, используемых в процессе инициализации //екстового режима Ony DD 1 //стройство включено Offy DD 0 //стройство отключено //ачало основной программы AUTO_IOS: //acтpoить сегментные регистры на сегмент данных MOV EAX, 0000h MOV DS,EAX PUSH ES POP DS //ывести сообщение о загрузке программы MOV EAX, OFFSET Sym MOV DS, EAX MOV EAX, 0B800h //дрес видеобуфера MOV ES, EAX MOV EBX, OFFSET Mes1 //дрес строки MOV EDI, 1*01*2+13*2 //аданная позиция на дисплее MOV ECX, 0145H //es1Len //лина строки REP MOVSB //ывод на экран MOV EDX, OFFSET Offs //двиг по экрану INC EDX //одификация константы, в программе //становим тип дискового накопителя MOV AH, 17h //ункция установки типа дискеты MOV AL, 4 //искета 720 Кб на дисководе //,44 Мб. INC DL //иск произвольный - может быть любой. CALL ReadDisk //NT 13h //рерывание ROM BIOS //aйдём и сохраним адрес таблицы прерывания, //араметров дискеты (вектор 1Eh) Start: MOV EAX, 00h //ункция получения вектора. MOV DL, 00h //ектор носителя не определён, //о умолчанию, он может быть любым. CALL ReadDisk //NT 13h MOV EBX, OFFSET Dpt //oxpaним смещение MOV WORD PTR Dpt + 2, ES //oxpaним сегмент MOV EDI,EBX //ам потребуетсяEBX CALL ReadDisk //NT 13h //становить размер кластера - 512 байт. //OV BYTE PTR ES: [DI+3], 2 //аписать кодовые данные произвольного доступа, // 40-й сектор, 1-й кластер, так как наш файл, //вляется настроечным файлом. MOV AH, 03h //ункция записи на диск MOV AL, 0 //еньше сектора - один кластер. MOV CH, 40 //елиндр MOV CL, 1 //ластер MOV DH, 0 //eктор INC DL //иск произвольный - может быть любой. MOV ECX, 0512 //колько записывать (размер в байтах). MOV EBX, Str2 //дрес буфера в ES:BX CALL ReadDisk //NT 13h //рерывание ROM BIOS JE Continue //а, запись на диск возможна JNE NotWriting //cли диск защищён от записи //cли диск на котором находится программа //ащищён от записи или имеет сбойные сектора. NotWriting: MOV EAX, OFFSET Sym MOV DS, EAX MOV EAX, 0B800h //дрес видеобуфера MOV ES, EAX MOV EBX, OFFSET Mes3 //дрес строки MOV EDI, 12*80*2+33*2 // центре экрана MOV ECX, 0046H //es3Len //лина строки REP MOVSB //ывод на экран MOV EDX, OFFSET Offs //двиг по экрану INC EDX //одификация константы, в программе // PUSH 0 // PUSH OFFSET Mes3 // PUSH OFFSET Mes3 // PUSH 0 // CALL _imp__MessageBoxA@16 JMP NewShell //ереход, если запись не возможна. //occтановим таблицу параметров дискеты Continue: MOV WORD PTR Dpt + 2, ES //eгмент таблицы. //OV BYTE PTR ES:[DI + 3], 2 //oд размера кластера. MOV EAX, OFFSET Handle //олучили дескриптор файла. //cвободить все ранеее занятые регистры NewShell: POPF //eпepь, заново настpoить пpoгpaммy, нa ceгмент данных MOV EAX, 0000h MOV DS,EAX PUSH ES POP DS //овторно установить тип дискового накопителя. //aйдём и сохраним адрес таблицы прерывания, //араметров дискеты (вектор 1Eh) MOV EAX, 00h //ункция получения вектора MOV DL, 00h //ектор носителя не определён, //о умолчанию, он может быть любым. CALL ReadDisk //NT 13h MOV EBX,EBX //oxpaним смещение MOV EBX, Dpt + 2 //oxpaним сегмент MOV EDI,EBX //ам потребуетсяEBX CALL ReadDisk //NT 13h //становить размер кластера - 512 байт. //OV BYTE PTR ES: [DI+3], 2 //рочитать кодовые данные из 40-го сектора, 1-го //ластера, для последующей обработки. MOV AH, 02h //ункция чтения с диска MOV AL, 0 //еньше сектора - один кластер. MOV CH, 40 //елиндр MOV CL, 1 //ластер MOV DH, 0 //eктор INC DL //иск произвольный - может быть любой. PUSH DS POP ES MOV ECX, 0512 //колько читать (размер, в байтах). MOV EBX, Bufin //дрес буфера в ES:BX CALL ReadDisk //NT 13h //рерывание ROM BIOS JE Continue2 //а, данные на диске доступны JNE NotFile //ет, данный кластер на диске не //итается и не пригоден для записи. //ывести на экран cooбщение, в случае //сли такового кластера нет или он, не //итается. NotFile: MOV EAX, OFFSET Sym MOV DS,EAX // PUSH 0 // PUSH OFFSET Mes4 // PUSH OFFSET Mes4 // PUSH 0 // CALL _imp__MessageBoxA@16 MOV EAX, 0B800h //дрес видеобуфера MOV ES,EAX MOV EBX, OFFSET Mes4 //дрес строки MOV EDI, 12*80*2+33*2 // центре экрана MOV ECX, 0025H //es4Len //лина строки REP MOVSB //ывод на экран MOV EDX, OFFSET Offs //двиг по экрану INC EDX //одификация константы, в программе //вести короткую задержку, на тот случай, //сли в системе, возможен сброс флага вывода. XOR EAX,EAX //лаг произвольного доступа // клавиатуре пользователя. CALL KEYBORD //NT 16h //рерывание ROM BIOS //авершить программу MOV EAX, 0000h //ункция завершения, код //авершения = 0 CALL QUITS //NT 20h //рерывание ROM BIOS //occтановить таблицу параметров дискеты Continue2: MOV EBX, OFFSET dpt2 //eгмент таблицы. //OV BYTE PTR ES:[DI + 3], 2 //oд размера кластера. MOV EAX, OFFSET Handle //олучили дескриптор файла //роцедура обработки кодовых данных, из 40-го сектора, //-го кластера на заданном диске. // начале из обрабатываемого массива, надо убрать //екоторые управляющие символы. Иначе, они нам //омешают выполнять необходимые операции, при //аботе с кодовыми данными из двоичного файла. MOV AL, 27 //7 - конец записи или файла, OR AL, 10 //0 - начало новой строки, OR AL, 13 //3 - конец строки, OR AL, 14 //4 - ввод на действие PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника //имволы которые мы убераем: MOV ECX, 0512 //лина строки символов в файле. REPNE SCASB //оиск первого двоичного символа, //тличного, от указанных. JNE FunctObr101 //сли в коде одни, только эти пикселы. JE FunctObr101 //наче, если нашлись и другие. //еперь, в зависимости от того, какие коды //одержатся в этом файле, такие действия и //удет выполнять наша программа. //брабатываемый код - пикселы ASCII от 28 до 127//и //т 128 до 255. Часть первой и вторая половина //айтовой таблицы, из знакогенератора видеоадаптера // дешифраторов ROM BIOS. FunctObr101: MOV AL, 28 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt101 //сли он, есть. JNE FunctObr102 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt101: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP1 //NT 1h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr102: MOV AL, 29 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt102 //сли он, есть. JNE FunctObr103 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt102: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP2 //NT 2h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr103: MOV AL, 30 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt103 //сли он, есть. JNE FunctObr104 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt103: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP3 //NT 3h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr104: MOV AL, 31 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt104 //сли он, есть. JNE FunctObr105 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt104: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP4 //NT 4h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr105: MOV AL, 32 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt105 //сли он, есть. JNE FunctObr106 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt105: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP5 //NT 5h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr106: MOV AL, 33 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt106 //сли он, есть. JNE FunctObr107 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt106: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP6 //NT 6h //укция поиска в строке заданного символа. FunctObr107: MOV AL, 34 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt107 //сли он, есть. JNE FunctObr108 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt107: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL INTERRUP7 //NT 7h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr108: MOV AL, 35 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt108 //сли он, есть. JNE FunctObr109 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt108: MOV EAX, 0101h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr109: MOV AL, 36 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt109 //сли он, есть. JNE FunctObr110 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt109: MOV EAX, 0202h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr110: MOV AL, 37 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt110 //сли он, есть. JNE FunctObr111 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt110: MOV EAX, 0303h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr111: MOV AL, 38 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt111 //сли он, есть. JNE FunctObr112 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt111: MOV EAX, 0404h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr112: MOV AL, 39 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt112 //сли он, есть. JNE FunctObr113 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt112: MOV EAX, 0505h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr113: MOV AL, 40 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt113 //сли он, есть. JNE FunctObr114 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt113: MOV EAX, 0606h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr114: MOV AL, 41 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt114 //сли он, есть. JNE FunctObr115 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt114: MOV AH, 00h //0h - Установка видеорежима MOV AL, 12h //2h - графический 640 x 480 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr115: MOV AL, 42 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt115 //сли он, есть. JNE FunctObr116 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt115: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL POWER //NT 11h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr116: MOV AL, 43 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt116 //сли он, есть. JNE FunctObr117 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt116: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MEMORY //NT 12h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr117: MOV AL, 44 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt117 //сли он, есть. JNE FunctObr118 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt117: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadDisk //NT 13h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr118: MOV AL, 45 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt118 //сли он, есть. JNE FunctObr119 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt118: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr119: MOV AL, 46 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt119 //сли он, есть. JNE FunctObr120 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt119: MOV EAX, 0000h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr120: MOV AL, 47 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt120 //сли он, есть. JNE FunctObr121 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt120: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL PRINT //NT 17h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr121: MOV AL, 48 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt121 //сли он, есть. JNE FunctObr122 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt121: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL CMOS //NT 1Ah //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr122: MOV AL, 49 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt122 //сли он, есть. JNE FunctObr123 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt122: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL BREAK_ //NT 1Bh //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr123: MOV AL, 50 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt123 //сли он, есть. JNE FunctObr124 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt123: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MELODY //NT 1Ch //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr124: MOV AL, 51 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt124 //сли он, есть. JNE FunctObr125 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt124: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL GRFPARM //NT 1Dh //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr125: MOV AL, 52 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt125 //сли он, есть. JNE FunctObr126 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt125: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FLOPPY2 //NT 1Eh //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr126: MOV AL, 53 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt126 //сли он, есть. JNE FunctObr133 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt126: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL SCREEN2 //NT 1Fh //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr133: MOV AL, 60 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt133 //сли он, есть. JNE FunctObr195 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt133: MOV EAX, OFFSET Sym MOV DS, EAX // PUSH 0 // PUSH OFFSET Mes2 // PUSH OFFSET Mes2 // PUSH 0 // CALL _imp__MessageBoxA@16 MOV EAX, 0B800h //дрес видеобуфера MOV ES, EAX MOV EBX, OFFSET Mes2 //дрес строки MOV EDI, 12*80*2+33*2 // центре экрана MOV ECX, 0038H //es2Len //лина строки REP MOVSB //ывод на экран ADD EDX, OFFSET Offs //двиг по экрану INC EDX //одификация константы, в программе //укция поиска в строке заданного символа. FunctObr195: MOV AL, 122 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt195 //сли он, есть. JNE FunctObr196 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt195: MOV EAX, 0101h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr196: MOV AL, 123 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt196 //сли он, есть. JNE FunctObr197 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt196: MOV EAX, 0202h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr197: MOV AL, 124 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt197 //сли он, есть. JNE FunctObr198 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt197: MOV EAX, 0303 MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr198: MOV AL, 125 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt198 //сли он, есть. JNE FunctObr199 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt198: MOV EAX, 0404 MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr199: MOV AL, 126 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt199 //сли он, есть. JNE FunctObr200 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt199: MOV EAX, 0505 MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr200: MOV AL, 227 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt200 //сли он, есть. JNE FunctObr201 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt200: MOV EAX, 0606h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr201: MOV AL, 228 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt201 //сли он, есть. JNE FunctObr202 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt201: MOV EAX, 0707h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr202: MOV AL, 229 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt202 //сли он, есть. JNE FunctObr1 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt202: MOV EAX, 0808h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL FONTS //NT 10h //рерывание ROM BIOS FunctObr1: MOV AL, 128 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt1 //сли он, есть. JNE FunctObr2 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt1: MOV EAX, 0909h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr2: MOV AL, 129 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt2 //сли он, есть. JNE FunctObr3 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt2: MOV EAX, 1010h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr3: MOV AL, 130 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt3 //сли он, есть. JNE FunctObr4 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt3: MOV EAX, 1111h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr4: MOV AL, 131 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt4 //сли он, есть. JNE FunctObr5 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt4: MOV EAX, 1212h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr5: MOV AL, 132 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt5 //сли он, есть. JNE FunctObr6 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt5: MOV EAX, 1313 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr6: MOV AL, 133 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt6 //сли он, есть. JNE FunctObr7 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt6: MOV EAX, 1414h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr7: MOV AL, 134 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt7 //сли он, есть. JNE FunctObr8 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt7: MOV EAX, 1515 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr8: MOV AL, 135 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt8 //сли он, есть. JNE FunctObr9 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt8: MOV EAX, 0000h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr9: MOV AL, 136 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt9 //сли он, есть. JNE FunctObr10 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt9: MOV EAX, 0101h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr10: MOV AL, 137 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt10 //сли он, есть. JNE FunctObr11 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt10: MOV EAX, 0202h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr11: MOV AL, 138 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt11 //сли он, есть. JNE FunctObr12 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt11: MOV EAX, 0303 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr12: MOV AL, 139 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt12 //сли он, есть. JNE FunctObr13 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt12: MOV EAX, 0404h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr13: MOV AL, 140 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt13 //сли он, есть. JNE FunctObr14 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt13: MOV EAX, 0505 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr14: MOV AL, 141 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt14 //сли он, есть. JNE FunctObr15 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt14: MOV AH, 00h //0h - Установка видеорежима MOV AL, 12h //2h - графический 640 x 480 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL FONTS //NT 10h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr15: MOV AL, 142 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt15 //сли он, есть. JNE FunctObr16 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt15: MOV EAX, 0101h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL POWER //NT 11h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr16: MOV AL, 143 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt16 //сли он, есть. JNE FunctObr17 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt16: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MEMORY //NT 12h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr17: MOV AL, 144 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt17 //сли он, есть. JNE FunctObr18 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt17: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadDisk //NT 13h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr18: MOV AL, 145 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt18 //сли он, есть. JNE FunctObr19 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt18: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr19: MOV AL, 146 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt19 //сли он, есть. JNE FunctObr20 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt19: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr20: MOV AL, 147 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt20 //сли он, есть. JNE FunctObr21 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt20: MOV EAX, 00h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL PRINT //NT 17h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr21: MOV AL, 148 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt21 //сли он, есть. JNE FunctObr22 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt21: MOV EAX, 0000h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr22: MOV AL, 149 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt22 //сли он, есть. JNE FunctObr23 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt22: MOV EAX, 0101 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr23: MOV AL, 150 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt23 //сли он, есть. JNE FunctObr24 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt23: MOV EAX, 0202 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr24: MOV AL, 151 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt24 //сли он, есть. JNE FunctObr25 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt24: MOV EAX, 0303 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr25: MOV AL, 152 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt25 //сли он, есть. JNE FunctObr26 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt25: MOV EAX, 0404h MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr26: MOV AL, 153 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt26 //сли он, есть. JNE FunctObr33 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt26: MOV EAX, 0505 MOV EBX, 01h MOV ECX, 0512 MOV EDX, Str2 CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr33: MOV AL, 60 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt33 //сли он, есть. JNE FunctObr95 //сли такого символа в строке нет. FunctInt33: MOV EAX, OFFSET Sym MOV DS,EAX // PUSH 0 // PUSH OFFSET Mes2 // PUSH OFFSET Mes2 // PUSH 0 // CALL _imp__MessageBoxA@16 MOV EAX, 0B800h //дрес видеобуфера MOV ES,EAX MOV EBX, OFFSET Mes2 //дрес строки MOV EDI, 12*80*2+33*2 // центре экрана MOV ECX, 0038H //es2Len //лина строки REP MOVSB //ывод на экран ADD EDX, OFFSET Offs //двиг по экрану INC EDX //одификация константы, в программе //укция поиска в строке заданного символа. FunctObr95: MOV AL, 222 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt95 //сли он, есть. JNE FunctObr96 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt95: MOV EAX, 0606 MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL MOUSE //NT 15h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr96: MOV AL, 223 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt96 //сли он, есть. JNE FunctObr97 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt96: MOV EAX, 0000h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr97: MOV AL, 224 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt97 //сли он, есть. JNE FunctObr98 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt97: MOV AH, 0101 MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr98: MOV AL, 225 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt98 //сли он, есть. JNE FunctObr99 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt98: MOV EAX, 0202h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr99: MOV AL, 226 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt99 //сли он, есть. JNE FunctObr100 //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt99: MOV EAX, 0303 MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL ReadPort //NT 14h //рерывание ROM BIOS //укция поиска в строке заданного символа. FunctObr100: MOV AL, 227 //од символа, который мы ищем. PUSH DS //астроить сегментный регистр POP ES //а адрес строки. CLD //оиск вперёд по строке. MOV ESI, Str2 //S:ESI --> строка источника MOV EDI, Bufin //S:EDI --> строка приёмника MOV ECX, 0512 //лина строки символов файле. REPNE SCASB //оиск первого такого пиксела в строке. JE FunctInt100 //сли он, есть. JNE FilExit //сли такого символа в строке нет. //ыполнение по данному коду, соответствующей фукции. FunctInt100: MOV EAX, 0404h MOV EBX, 01h MOV ECX, 0512 MOV EDX, 0001h CALL ReadPort //NT 14h //рерывание ROM BIOS //о окончании работы с файлом освободить, //анятый регистр. FilExit: POP DS //occтановим таблицу параметров дискеты MOV EBX, OFFSET dpt2 //eгмент таблицы //OV BYTE PTR ES:[DI + 3], 2 //oд размера сектора //cвободить все ранеее занятые регистры POPF //остановить сегментный адрес начала программы MOV EAX, 0000h MOV DS,EAX //ерейти на новый цикл выполнения программы JMP Start //Конец основной программы AUTO_IOS ENDP //лок системных подпрограмм младшей таблицы прерываний с адресами //NT 00h - 07h и 10h - 20h, загружаемых системной программой в //перативную память по заданным адресам, для выполнения соответствующих //ункций в операционной системе. //истемной программа INT 0h INTRRUP0: db 0, 0 db 0, 0 db 0, 0 db 0, 0 db 0, 0 db 0, 0 db 0, 0 db 0, 0 db 0, 0 RET //ыйти из обработчика прерываний //ntr00h = $-Intr00h //онец подпрограммы обработчика INT 0h //истемная программа INT 1h INTERRUP1: CLI //апретить прерывания dw 0 //UB BYTE PTR CS:[21A8h],4D //UB WORD PTR [BP+DI+06],EAX PUSH EDI //ORD PTR [BP-10] PUSH ESI MOV EAX, 00B8h PUSH SS PUSH EAX ADD ESP,08 PUSH DS PUSH CS //ORD PTR [BP+06] MOV EAX,EBP PUSH SS PUSH EAX ADD ESP,08 PUSH ECX PUSH DS POP ES MOV EAX,EBP PUSH EAX ADD ESP,08 SUB AH,AH MOV EAX,EBP OR EAX,EAX MOV ES,[BP-10] MOV EBX,ESI MOV EBX,EAX AND AL,02 CMP AL,01 SBB AL,AL INC AL MOV EBP, 01 MOV ESP, 5Ch MOV AL, 01 MOV DL, 5Eh PUSH EAX PUSH EBX ADD ESP,06 CMP EBP,2Eh MOV EDX, 004Fh CMP EBP, 2Eh PUSH EBP MOV EAX,00B8h PUSH EAX CMP EBP, 01 CMP EBP, 14 ADC BH,BH MOV EAX,EBP PUSH EAX ADD ESP,04 MOV EAX,EBP PUSH EAX PUSH EDX ADD ESP,04 MOV EBP,06 MOV ES,[BP-10] MOV EBX,ESI MOV EBX,2Eh CMP EDI,57 PUSH EBP PUSH ESI ADD ESP,04 INC EAX MOV EAX,022Eh ADD ESI,EAX CMP EBP,06 INC EBP MOV EBP,04 //EC EBP,04 OR EAX,EAX STI //азрешить прерывания RET //авершить цикл резидентного обработчика //ntr01hLen = $ - Intr01h //онец подпрограммы обработчика INT 1h //истемная программа INT 2h INTERRUP2: CLI //OV ESI,WORD PTR [BP-80] CMP ESI,14 MOV EDX, 444Fh //USH WORD PTR ES:[2E7Ah] //USH WORD PTR ES:[782Eh] ADD ESP,04 //USH WORD PTR [BP-08] POP EBX CMP ESI,14 MOV EAX,012Eh DEC ESI //OV EBX,WORD PTR ES:[722Eh] //OV EDI,WORD PTR [BX+0786] //OV EBX,WORD PTR ES:[722Eh] //OV EDI,WORD PTR [BX+0790] PUSH ESI PUSH EDI //USH WORD PTR [BX+021Eh] MOV EAX,EBP PUSH EAX MOV EAX, 1099 CBW PUSH EAX ADD ESP,8Bh INC ESI //EG BYTE PTR [BP+5Fh] CLD REP STOSB PUSH EDI PUSH ESI //OV ESI,WORD PTR [1097] MOV EAX, 404Fh MOV EBX, 02B4h MOV ECX, 334Fh //OV EBX,WORD PTR ES:[722Eh] PUSH DS //USH WORD PTR [BX+076Ch] //USH WORD PTR [BX+078Eh] NOP PUSH CS ADD ESP,06 MOV EDX, 444Fh MOV EAX, 782Eh MOV EDX, 222Eh MOV EAX,EDX //R EAX,WORD PTR ES:[782Eh] XOR EAX,EAX PUSH EAX POP EBX //OV WORD PTR [BP-02],EAX //OV EDI,WORD PTR [BP-80] //OV ESI,WORD PTR [BP+40] CMP EDI,14 CMP EDI,01 SBB EAX,EAX NEG EAX PUSH EAX PUSH EDX //USH WORD PTR [BP+06] PUSH EDX ADD ESP,08 MOV EDX, 575Ch //OV AL,BYTE PTR [SI+01] IN AL,50 //OV AL,BYTE PTR [BX+SI] //DD BYTE PTR [BX+SI],AL STI //азрешить прерывания RET //авершить цикл резидентного обработчика //NTERRUP2 ENDP //ntr02hLen = $ - Intr02h //онец подпрограммы обработчика INT 2h //истемная программа INT 3h INTERRUP3: CLI //апретить прерывания INC ESP POP ESI PUSH EAX PUSH EBX ADD ESP,06 //USH WORD PTR [BP+08] //USH WORD PTR [BP+04] ADD ESP,04 PUSH DS PUSH EDI ADD ESP,04 MOV EDX, 102Eh CMP EDI,14 MOV EDX, 444Fh //USH WORD PTR ES:[227Ah] //USH WORD PTR ES:[782Eh] ADD ESP,04 //ND BYTE PTR [BP-02],DH POP EBX CMP EDI,01 //DD BYTE PTR [BX+SI],AL MOV EDX, 334Fh //OV EBX,WORD PTR ES:[722Eh] //OV ESI,WORD PTR [BX+0786] MOV EDX, 334Fh //OV EBX,WORD PTR ES:[722Eh] //OV ESI,WORD PTR [BX+0790] PUSH EDI PUSH ESI //USH WORD PTR [BX+021Eh] //USH WORD PTR [BP+06] MOV EBX, 1099 CBW PUSH EAX ADD ESP,5Eh POP EDI PUSH ESI PUSH EBP MOV EBP, 000Ch //OV EAX,WORD PTR [1044] //OV WORD PTR [BP-0Ah],EAX //EA EAX,WORD PTR [BP-10] PUSH EAX //EA EAX,WORD PTR [BP-12] PUSH EBX NOP PUSH CS ADD ESP,04 MOV EDX, 344Fh //OV EBX,WORD PTR ES:[722Eh] PUSH DS //USH WORD PTR [BX+076Ch] //USH WORD PTR [BX+078Eh] NOP PUSH CS ADD ESP,06 MOV EDX, 444Fh MOV EAX, 782Eh //ND BYTE PTR [BX+SI],AH //OV WORD PTR ES:[270Ah],EDX MOV EAX,EDX //R EAX,WORD PTR ES:[782Eh] XOR EAX,EAX PUSH ESP POP EBX //OV WORD PTR [BP-0Eh],EAX MOV EDX, 404Fh //DD BYTE PTR [BX+SI],AL STI //азрешить прерывания RET //авершить цикл резидентного обработчика //NTERRUP3 ENDP //ntr03hLen = $ - Intr03h //онец подпрограммы обработчика INT 3h //истемная программа INT 4h INTERRUP4: CLI //апретить прерывания // CMP WORD PTR [BP+0Eh],01 SBB EAX,EAX NEG EAX PUSH EAX PUSH EDX // CMP WORD PTR [BP+0Eh],04 // MOV EAX, 042Eh MOV EAX, 062Eh PUSH EAX ADD ESP,08 PUSH DS // LEA EAX,WORD PTR [BP-62] PUSH SS PUSH EAX // ADD ESP,08 // MOV EDX,WORD PTR [BX+2Eh] // MOV WORD PTR [BP-02],EDX MOV ESI,EAX // ADC AL,01 INC ESI // CMP BYTE PTR [BX+57],06 // LEA EAX,WORD PTR [BP-00B8h] PUSH SS PUSH EAX MOV ES,[BP-02] // ADD ESP,06 // PUSH ESI // PUSH SS PUSH EAX ADD ESP,08 DB 0, 0, 0, 0 DB 0, 0, 0, 0 // ADD BYTE PTR CS:[BX+SI],AL // ADD BYTE PTR [BX+SI],AL // ADD BYTE PTR [BX+SI],AL // ADD BYTE PTR [BX+SI],AL // ADD BYTE PTR [BX+SI],AL ADD EAX,880D INC ESI STC // MOV EBX,WORD PTR [BP-0Ah] SUB AH,AH // MOV AL,BYTE PTR [BX+5Eh] PUSH EAX PUSH EDX ADD ESP,06 // MOV EDX, 424Fh // CMP WORD PTR [BP+0Eh],04 MOV EAX, 042Eh MOV EAX, 062Eh PUSH EAX // LEA ESP,WORD PTR [BX+SI] // PUSH SS PUSH EAX PUSH EDI // ADD ESP,0Ch STI //азрешить прерывания RET //авершить цикл резидентного обработчика //NTERRUP4 ENDP //ntr04hLen = $ - Intr04h //онец подпрограммы обработчика INT 4h //истемная программа INT 5h INTERRUP5: CLI //апретить прерывания DB 0, 0, 0, 0, 0, 0 // PUSH WORD PTR [BP+0Ch] PUSH EDI // PUSH SS PUSH EAX ADD ESP,08 PUSH EDI // PUSH SS PUSH EAX ADD ESP,06 // LEA EAX,WORD PTR [BP-00] PUSH EAX PUSH EDI ADD ESP,04 // MOV ES,[BP-02] // MOV BYTE PTR ES:[BX],2Eh // CMP BYTE PTR [BX+57],06 // PUSH ESI ADD ESP,04 INC EAX MOV EAX,022Eh ADD ESI,EAX // INC WORD PTR [BP-0Ch] // MOV EAX,WORD PTR [BP+06] // OR EAX,EAX // MOV ESI,WORD PTR [BP+0Eh] MOV EDX, 444Fh // PUSH WORD PTR ES:[2E78h] ADD ESP,04 // POP EBX CMP ESI,04 MOV EDX, 373Eh // MOV EBX,WORD PTR [722Eh] // MOV EDX, 373Eh // MOV EDI,WORD PTR [BX+078Ch] CMP ESI,04 MOV EAX,ESI MOV EAX,062Eh PUSH EAX PUSH EDI // LEA EAX,WORD PTR [BP-62] PUSH EAX MOV AL, 10 CBW PUSH EAX ADD ESP,8Bh INC ESI POP ESI POP EDI PUSH EDI // PUSH ESI // PUSH WORD PTR [BP+04] STI //азрешить прерывания RET //авершить цикл резидентного обработчика //ntr05hLen = $ - Intr05h //онец подпрограммы обработчика INT 5h //истемная программа INT 6h INTERRUP6: CLI //апретить прерывания // POP EBX MOV EDX, 404Fh // LEA EAX,WORD PTR [BP-06] PUSH EAX // PUSH EAX NOP PUSH CS ADD ESP,04 // PUSH CS PUSH EAX POP EBX XOR EAX,EAX PUSH EDI PUSH ESI DEC EBP // MOV EDI,EAX // MOV AL,BYTE PTR [SI+57] SUB AH,AH PUSH EAX PUSH EDX PUSH EDI NOP PUSH CS ADD ESP,06 OR EAX,EAX MOV EDI,96 XOR ESI,ESI PUSH DS PUSH EDI ADD ESP,04 INC EAX ADD EDI,EAX INC ESI MOV AL, 10 CBW CMP EAX,ESI // PUSH WORD PTR [BX+SI+04] dw 0 // ADD BYTE PTR [BX+SI],AL OR EAX,EAX // NOP PUSH CS POP EBX // ADD ESP,04 // CMP WORD PTR [DI-3Ch],00 // MOV ECX,WORD PTR [DI-3Ch] PUSH EDI DB 35, 6, 0, 248 //ND EAX,F8h ADD ESP,04 // CMP WORD PTR [DI-99],9Fh NOP PUSH CS // MOV EDI,960Ah XOR ESI,ESI PUSH DS PUSH EDI ADD ESP,04 INC EAX ADD EDI,EAX INC ESI // CBW CMP EAX,ESI // MOV WORD PTR [DI-04],EAX PUSH DS PUSH EDI STI //азрешить прерывания RET //авершить цикл резидентного обработчика //NTERRUP6 ENDP //ntr06hLen = $ - Intr06h //онец подпрограммы обработчика INT 6h //истемная программа INT 7h INTERRUP7: CLI //апретить прерывания PUSH DS PUSH ESI PUSH EBX PUSH EDX ADD ESP,1Ah // MOV EBX,WORD PTR [317Eh] // PUSH WORD PTR [DI+10] // ADD BYTE PTR [BX+SI],AL SUB AH,AH // CMP WORD PTR [DI-38],00 // PUSH WORD PTR [BX+SI+04] // PUSH WORD PTR [BX+SI] // MOV EDX, 424Fh // CMP WORD PTR [DI-38],00 PUSH EBP PUSH EDI PUSH DS PUSH EDX ADD ESP,08 MOV EDX, 443Eh // PUSH DS // PUSH WORD PTR [BX+078Eh] NOP PUSH CS ADD ESP,06 MOV EDX, 444Fh // MOV WORD PTR ES:[2E7Ah],EDX MOV EAX,EDX // PUSH ECX POP EBX // CMP WORD PTR [DI-38],00 PUSH EBX PUSH EDX PUSH ESI PUSH ESP ADD ESP,08 PUSH EBX PUSH EDX MOV EDX, 443Eh // PUSH DS // PUSH WORD PTR [BP+06] PUSH ESI ADD ESP,0Ch MOV EDX, 444Fh // PUSH ECX PUSH EAX MOV EBX, 334Fh // PUSH DS // ADD ESP,0Ch MOV EDX, 444Fh // PUSH WORD PTR ES:[782Eh] PUSH EAX PUSH EBX PUSH ECX PUSH EDX // STI //азрешить прерывания RET //авершить цикл резидентного обработчика //NTERRUP7 ENDP //ntr07hLen = $ - Intr07h //онец подпрограммы обработчика INT 7h //истемная программа INT 10h Intr10h: //ачало основной программы FONTS: CLI //апретить прерывания PUSHF //oxpaнить флaги для команды IRET //роцедура IOS инициализации программы прерывания 10Н MOV EDX,1E10h MOV ESP,08 MOV ECX,EDI MOV EBX,ESI //ока, в программе не определены //начения флагов старших регистров //H иEAX занятых процессором, их //спользовать в командах нельзя. MOV EDX, OFFSET IntVect4 TEST EDX, 10h INC EDX //еред тем, как начать распознавание //начений занятых флагов старших //егистров AH иEAX, произвести вербовку //ектора прерывания INT 10h и занести его // соответствующий адрес сегментного //уфера оперативной памяти. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV BL, 10h //ектор прерывания заносимый в буфер CLD //аполнять вперёд REP STOSB //аполнение //аполнить второй байт сигмента, для контроля //OV ES:[DI], 0 //ачать процедуру распознавания функции //аботы с контролёром видеосистемы по запросу //ользователя (вызов этой системной программы //з буфера таблицы резидента BIOS, находящегося // базовой части оперативной памяти, через //рерывание INT 10h) PUSH EAX //адействовать регистрEAX //ля дальнейших действий POP EBX //егистрEBX оставить //вободным для фиксации //казание на мнимый флаг AH илиEAX, //ри отсутствии ясной фиксации управлящей //рограммы процессора AAS //одсчитаем, что занятый флаг AH илиEAX //уществует в любом случае, как-бы то //ибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB PUSH EAX //оррекция управляющего регистра //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая функция системной программы //ыла затребована пользователем, вмести с вызовом //рерывания INT 10h CMP AH, 00h JE GraphSc0 CMP AH, 01h JE GraphSc1 CMP AH, 02h JE GraphSc2 CMP AH, 03h JE GraphSc3 CMP AH, 04h JE GraphSc4 CMP AH, 05h JE GraphSc5 CMP AH, 06h JE GraphSc6 CMP AH, 07h JE GraphSc7 CMP AH, 08h JE GraphSc8 CMP AH, 09h JE GraphSc9 CMP AH, 0Ah JE GraphSc10 CMP AH, 0Bh JE GraphSc11 CMP AH, 0Ch JE GraphSc12 CMP AH, 0Dh JE GraphSc13 CMP AH, 0Eh JE GraphSc14 CMP AH, 0Fh JE GraphSc15 CMP AH, 10h JE GraphSc16 CMP AH, 11h JE GraphSc17 CMP AH, 12h JE GraphSc18 CMP AH, 13h JE GraphSc19 CMP AH, 14h JE GraphSc20 CMP AH, 15h JE GraphSc21 //ункции работы видеоадаптера реализуемые системной //одпрограммой INT 10h GraphSc0: //агрузка подпрограммы инициализации текстовых и //рафических режимов видеодрайвера. //ALL Graph //RAPH: //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая подфункция системной программы //ыла затребована пользователем, вмести с вызовом //ункции 0h прерывания INT 10h CMP AL, 00h JE Scr0 CMP AL, 01h JE Scr1 CMP AL, 02h JE Scr2 CMP AL, 03h JE Scr3 CMP AL, 04h JE Scr4 CMP AL, 05h JE Scr5 CMP AL, 06h JE Scr6 CMP AL, 07h JE Scr7 CMP AL, 08h JE Scr8 CMP AL, 09h JE Scr9 CMP AL, 0Ah JE Scr10 CMP AL, 0Bh JE Scr11 CMP AL, 0Ch JE Scr12 CMP AL, 0Dh JE Scr13 CMP AL, 0Eh JE Scr14 CMP AL, 0Fh JE Scr15 CMP AL, 10h JE Scr16 CMP AL, 11h JE Scr17 CMP AL, 12h JE Scr18 CMP AL, 13h JE Scr19 //становка различных текстовых и //рафических режимов, при соответствующем //лаге занятости регистра AL. //екстовой режим 40 x 25 символов, 2 цвета Scr0: //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //1h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 01h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 80 x 50, //астягиваеться в отображение 40 x 25 пикселей. //ункция - 01h одного из трёх основных режимов. MOV AH, 01h //ункция 01h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 0110h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (8 * 8) + (80 * 50) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, 8000h //азмер буфера видеопамяти (80 * 50 * 2) MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол SBB CL, 40h //тнять от указанного значения по гориз. MOV DH, 50h //евый нижний угол SUB DH, 25h //тнять от указанного значения по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (8 * 8) + (40 * 25) //овые параметры видеорежима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, 2000h //овый размер буфера видеопамяти (40 * 25 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 0110h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 0110h //твующим векторам: //1h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI //ократить тело видеобуфера MOV EAX, (8000) / 4 //о нужного размера. CMC //одготовить буфер к новому заполнению CLD //окращать каждый второй байт в видео буфере. REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к изъятию. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 0110h //1h - функция//10h - вектор доступа. MOV AL, 00h //0h - Номер функции установленного реж. MOV EBX, (8 * 8) + (40 * 25) //араметры видеорежима. MOV ECX, 2000h //азмер буфера видеопамяти (40 * 25 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //екстовой режим 80 x 50 символов, 16 цветов Scr1: //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //1h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 01h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. db 238 //UT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, это отображение видеорежима 80 x 50 //ункция - 01h одного из трёх основных режимов. MOV AH, 01h //ункция 01h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 0110h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (8 * 8) + (80 * 50) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 50h //евый нижний угол MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (8 * 8) + (80 * 50) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, 8000h //азмер буфера видеопамяти (80 * 50 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 0110h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 0110h //твующим векторам: //1h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, 8000h //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 0110h //1h - функция//10h - вектор доступа. MOV AL, 01h //1h - Номер функции установленного реж. MOV EBX, (8 * 8) + (80 * 50) //араметры видеорежима. MOV ECX, 8000h //азмер буфера видеопамяти (80 * 50 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //екстовой режим 80 x 25 символов, 2 цвета //астроить сегментный регистр ES на видеобуфер Scr2: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //1h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 01h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. db 238 //UT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 80 x 50, //астягиваеться в отображение 80 x 25 пикселей. //ункция - 01h одного из трёх основных режимов. MOV AH, 01h //ункция 01h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 0110h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (8 * 8) + (80 * 50) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, 8000h //азмер буфера видеопамяти (80 * 50 * 2) MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 50h //евый нижний угол ADD DH, 25h //рибавить к указанному значению по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (8 * 8) + (80 * 25) //овые параметры видеорежима. MOV EBX,EAX //овторная установка связи регистров. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, 4000h //овый размер буфера видеопамяти (80 * 25 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 0110h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 0110h //твующим векторам: //1h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI //ократить тело видеобуфера MOV EAX, (8000) / 2 //о нужного размера. CMC //одготовить буфер к новому заполнению CLD //окращать каждый второй байт в видео буфере. REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к изъятию. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 0110h //1h - функция//10h - вектор доступа. MOV AL, 02h //2h - Номер функции установленного реж. MOV EBX, (8 * 8) + (80 * 25) //араметры видеорежима. MOV ECX, 4000h //азмер буфера видеопамяти (80 * 25 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //екстовой режим 80 x 25 символов, 16 цветов //астроить сегментный регистр ES на видеобуфер Scr3: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //1h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 01h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 80 x 50, //астягиваеться в отображение 80 x 25 пикселей. //ункция - 01h одного из трёх основных режимов. MOV AH, 01h //ункция 01h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 0110h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (8 * 8) + (80 * 50) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, 8000h //азмер буфера видеопамяти (80 * 50 * 2) MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 50h //евый нижний угол ADD DH, 25h //рибавить к указанному значению по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (8 * 8) + (80 * 25) //овые параметры видеорежима. MOV EBX,EAX //овторная установка связи регистров. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, 4000h //овый размер буфера видеопамяти (80 * 25 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 0110h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 0110h //твующим векторам: //1h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI //ократить тело видеобуфера MOV EAX, (8000) / 2 //о нужного размера. CMC //одготовить буфер к новому заполнению CLD //окращать каждый второй байт в видео буфере. REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к изъятию. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 0110h //1h - функция//10h - вектор доступа. MOV AL, 03h //3h - Номер функции установленного реж. MOV EBX, (8 * 8) + (80 * 25) //араметры видеорежима. MOV ECX, 4000h //азмер буфера видеопамяти (80 * 25 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 320 x 200 точек, 4 цвета //астроить сегментный регистр ES на видеобуфер Scr4: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //3h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 13h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, это отображение видеорежима 320 x 200 //ункция - 13h одного из трёх основных режимов. MOV AH, 13h //ункция 13h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1310h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 40h //равый верхний угол MOV DH, 25h //евый нижний угол MOV DL, 40h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (2 * 2) + (320 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1310h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1310h //твующим векторам: //3h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc1 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1310h //3h - функция//10h - вектор доступа. MOV AL, 04h //4h - Номер функции установленного реж. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 320 x 200 точек, 2 цвета //астроить сегментный регистр ES на видеобуфер Scr5: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //3h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 13h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, это отображение видеорежима 320 x 200 //ункция - 13h одного из трёх основных режимов. MOV AH, 13h //ункция 13h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1310h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 40h //равый верхний угол MOV DH, 25h //евый нижний угол MOV DL, 40h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (2 * 2) + (320 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1310h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1310h //твующим векторам: //3h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc1 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1310h //3h - функция//10h - вектор доступа. MOV AL, 05h //5h - Номер функции установленного реж. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 200 точек, 2 цвета //астроить сегментный регистр ES на видеобуфер Scr6: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //астягивается в отображение 640 x 200 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол SUB DH, 12h //тнять от указанного значения по верт. DAA //орекция сделанного оределения SUB EDX, 0200h //тнять от указанного значения по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc2 //азмер буфера //идеопамяти (640 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc2 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 06h //6h - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc2 //азмер буфера //идеопамяти (640 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //екстовой режим 80 x 25 символов, 2 цвета //астроить сегментный регистр ES на видеобуфер Scr7: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //1h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 01h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 80 x 50, //астягиваеться в отображение 80 x 25 пикселей. //ункция - 01h одного из трёх основных режимов. MOV AH, 01h //ункция 01h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 0110h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (8 * 8) + (80 * 50) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, 8000h //азмер буфера видеопамяти (80 * 50 * 2) MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 50h //евый нижний угол ADD DH, 25h //рибавить к указанному значению по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (8 * 8) + (80 * 25) //овые параметры видеорежима. MOV EBX,EAX //овторная установка связи регистров. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, 4000h //овый размер буфера видеопамяти (80 * 25 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 0110h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 0110h //твующим векторам: //1h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI //ократить тело видеобуфера MOV EAX, (8000) / 2 //о нужного размера. CMC //одготовить буфер к новому заполнению CLD //окращать каждый второй байт в видео буфере. REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к изъятию. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 0110h //1h - функция//10h - вектор доступа. MOV AL, 07h //7h - Номер функции установленного реж. MOV EBX, (8 * 8) + (80 * 25) //араметры видеорежима. MOV ECX, 4000h //азмер буфера видеопамяти (80 * 25 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //арезервированная функция //астроить сегментный регистр ES на видеобуфер. Scr8: MOV EAX, 0B800h MOV DS,EAX //арезервированный буфер для системной программы //ыполняющей функции, не предусмотренной видео //райвером ROM BIOS db 96 Dup (?) //а выход из подпрограммы JMP QuitSub //рафический режим 320 x 200 точек, 16 цветов //астроить сегментный регистр ES на видеобуфер Scr9: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //3h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 13h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, это отображение видеорежима 320 x 200 //ункция - 13h одного из трёх основных режимов. MOV AH, 13h //ункция 13h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1310h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 1 //казание верхнего левого угла на дисплее. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 40h //равый верхний угол MOV DH, 25h //евый нижний угол MOV DL, 40h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (2 * 2) + (320 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1310h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1310h //твующим векторам: //3h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc1 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1310h //3h - функция//10h - вектор доступа. MOV AL, 09h //9h - Номер функции установленного реж. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 200 точек, 4 цвета //астроить сегментный регистр ES на видеобуфер Scr10: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //астягивается в отображение 640 x 200 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол SUB DH, 12h //тнять от указанного значения по верт. DAA //орекция сделанного оределения SUB EDX, 0200h //тнять от указанного значения по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc2 //азмер буфера //идеопамяти (640 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc2 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 0Ah //Ah - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc2 //азмер буфера //идеопамяти (640 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //арезервированная функция //астроить сегментный регистр ES на видеобуфер. Scr11: MOV EAX, 0B800h MOV DS,EAX //арезервированный буфер для системной программы //ыполняющей функции, не предусмотренной видео //райвером ROM BIOS db 96 Dup (?) //а выход из подпрограммы JMP QuitSub //арезервированная функция //астроить сегментный регистр ES на видеобуфер. Scr12: MOV EAX, 0B800h MOV DS,EAX //арезервированный буфер для системной программы //ыполняющей функции, не предусмотренной видео //райвером ROM BIOS db 96 Dup (?) //а выход из подпрограммы JMP QuitSub //рафический режим 320 x 200 точек, 16 цветов //астроить сегментный регистр ES на видеобуфер Scr13: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //3h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 13h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, это отображение видеорежима 320 x 200 //ункция - 13h одного из трёх основных режимов. MOV AH, 13h //ункция 13h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1310h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 40h //равый верхний угол MOV DH, 25h //евый нижний угол MOV DL, 40h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (2 * 2) + (320 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1310h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1310h //твующим векторам: //3h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc1 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1310h //3h - функция//10h - вектор доступа. MOV AL, 0Dh //Dh - Номер функции установленного реж. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 200 точек, 16 цветов //астроить сегментный регистр ES на видеобуфер Scr14: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //астягивается в отображение 640 x 200 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 1 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол SUB DH, 12h //тнять от указанного значения по верт. DAA //орекция сделанного оределения SUB EDX, 0200h //тнять от указанного значения по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc2 //азмер буфера //идеопамяти (640 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc2 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 0Eh //Eh - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc2 //азмер буфера //идеопамяти (640 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 350 точек, 2 цвета //астроить сегментный регистр ES на видеобуфер Scr15: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //астягивается в отображение 640 x 200 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол SUB DH, 03h //тнять от указанного значения по верт. DAA //орекция сделанного оределения SUB EDX, 0050h //тнять от указанного значения по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 350) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc3 //азмер буфера //идеопамяти (640 * 350 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc3 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 0Fh //Fh - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 350) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc3 //азмер буфера //идеопамяти (640 * 350 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 350 точек, 16 цветов //астроить сегментный регистр ES на видеобуфер Scr16: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //астягивается в отображение 640 x 200 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол SUB DH, 03h //тнять от указанного значения по верт. DAA //орекция сделанного оределения SUB EDX, 0050h //тнять от указанного значения по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 350) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc3 //азмер буфера //идеопамяти (640 * 350 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc3 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 10h //0h - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 350) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc3 //азмер буфера //идеопамяти (640 * 350 * 2) MOV EAX, 1 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 480 точек, 2 цвета //астроить сегментный регистр ES на видеобуфер Scr17: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //жимаеться до отображения 640 x 480 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 1 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол ADD DH, 04h //рибавить к указанному значению по верт. DAA //орекция сделанного оределения ADD DH, 0080h //рибавить к указанному значению по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 480) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc4 //азмер буфера //идеопамяти (640 * 480 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc4 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 11h //1h - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 480) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc4 //азмер буфера //идеопамяти (640 * 480 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 640 x 480 точек, 16 цветов //астроить сегментный регистр ES на видеобуфер Scr18: MOV EAX, 0B800h MOV DS,EAX //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //2h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 12h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, отображение видеорежима 640 x 400 //жимаеться до отображения 640 x 480 пикселей. //ункция - 12h одного из трёх основных режимов. MOV AH, 12h //ункция 12h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1210h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (1 * 1) + (640 * 400) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. MOV ECX, OFFSET SzGrfSc5 //азмер буфера //идеопамяти (640 * 400 * 2) //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 80h //равый верхний угол MOV DH, 25h //евый нижний угол ADD DH, 04h //рибавить к указанному значению по верт. DAA //орекция сделанного оределения ADD DH, 0080h //рибавить к указанному значению по верт. MOV DL, 80h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (1 * 1) + (640 * 480) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. INC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc4 //азмер буфера //идеопамяти (640 * 480 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1210h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1210h //твующим векторам: //2h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc4 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1210h //2h - функция//10h - вектор доступа. MOV AL, 12h //2h - Номер функции установленного реж. MOV EBX, (1 * 1) + (640 * 480) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc4 //азмер буфера //идеопамяти (640 * 480 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub //рафический режим 320 x 200 точек, 256 цветов //астроить сегментный регистр ES на видеобуфер. Scr19: MOV EAX, 0B800h MOV DS,EAX //нициализировать доступ к графическому адаптеру и //становить режим фиксации цветового регистра MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 2 //ежим фиксации цветового регистра db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 2 * 16 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //становка цвета. MOV EDX, RezerfSub2 //агрузить буфер для заполнения MOV ECX, 32 //о одному байту на пиксел //зображения и цвет. REP STOSB //афиксировать //роцедура установки цветовой палитры для одного //ветового оттенка MOV EDX, 3CEh //дресный регистр контролёра MOV EAX, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //становка палитры из 16-ти оттенков для одного выбранного //вета. Каждый новый оттенок, темнее предыдущего. Так как //ринцеп получения нового оттенка сводиться к добавлению // код исходного цвета лишнего нолевого байта. MOV EDX, 3CEh //дресный регистр контролёра MOV EAX, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных ADC AH, 00h //редварительно, зафиксировать //егистр на мнимое приращение AAA //ставить регистр в требуемом состаянии //вет (чёрный) MOV EBX, 00h //искриптор чёрного цвета MOV EAX, OFFSET Color0 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette0 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (синий) MOV EBX, 01h //искриптор синиго цвета MOV EAX, OFFSET Color1 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette1 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (зелёный) MOV EBX, 02h //искриптор зелёного цвета MOV EAX, OFFSET Color2 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette2 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (берюзовый) MOV EBX, 03h //искриптор березового цвета MOV EAX, OFFSET Color3 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette3 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (красный) MOV EBX, 04h //искриптор красного цвета MOV EAX, OFFSET Color4 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette4 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (каричневый) MOV EBX, 05h //искриптор каричневого цвета MOV EAX, OFFSET Color5 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette5 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (фиолетовый) MOV EBX, 06h //искриптор фиолетового цвета MOV EAX, OFFSET Color6 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette6 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (серый) MOV EBX, 07h //искриптор серого цвета MOV EAX, OFFSET Color7 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette7 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (тёмно-серый) MOV EBX, 08h //искриптор тёмно-серого цвета MOV EAX, OFFSET Color8 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette8 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (ярко-голубой) MOV EBX, 09h //искриптор ярко-голубого цвета MOV EAX, OFFSET Color9 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette9 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (светло-зелёный) MOV EBX, 10h //искриптор светло-зелёного цвета MOV EAX, OFFSET Color10 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette10 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (светло-голубой) MOV EBX, 11h //искриптор светло-голубого цвета MOV EAX, OFFSET Color11 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette11 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (розовый) MOV EBX, 12h //искриптор розового цвета MOV EAX, OFFSET Color12 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette12 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (малиновый) MOV EBX, 13h //искриптор малинового цвета MOV EAX, OFFSET Color13 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette13 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (жёлтый) MOV EBX, 14h //искриптор жёлтого цвета MOV EAX, OFFSET Color14 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette14 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (белый) MOV EBX, 15h //искриптор белого цвета MOV EAX, OFFSET Color15 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette15 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //еред тем, как начать загрузку нужной //истемной программы из контролёра //рафического адаптера произвести вербовку //оответствующего вектора прерывания, с которым //удем работать и занести его в соответствующий //дрес сегментного буфера оперативной памяти. //3h - Флаг вектора запрашиваемого одно, из //рёх основных видеорежимов. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EBX, 13h //ектор прерывания заносимый в буфер. PUSH EBX //афиксировать значение флагаEBX и //охранить его для дальнейших действий. CLD //аполнять вперёд. REP STOSB //аполнение. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //агрузить нужную системную подпрограмму из //икросхемы контролёра видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 236 //N AL,EDX //становка цвета //епосредственная загрузка системной программы //з накопителя контролёра графического адаптера //еликом, так как установлен нужный флаг, будет //ыполняться соответствуюшая подпрограмма. MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей видео адаптер OUT 10h, AL // с дисплеем (монитором) OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры POP DS //свободить сохранённые POP ES //егистры //адать параметры вертикального смещения //а дисплее, если требуеться. Это делается //ля того, что этим смещением инициировать //елательный текстовой или графический режим // заданными параметрами. Нужный режим //остигаеться за счёт искажения отображения //дного из трёх основных режимов. // нашем случае, это отображение видеорежима 320 x 200 //ункция - 13h одного из трёх основных режимов. MOV AH, 13h //ункция 13h Видео драйвера. MOV ES,EAX //ового цикла с видеобуфером. MOV EAX, 1310h //отверждение основной функции. PUSH EAX //афиксировать значение флагаEAX. POP ECX //начение флагаECX ещё не определено. MOV AL, 00h //од произвольного пиксела. MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV EBX,EAX //становка связи регистров. //араметры отображения текста в графическом режиме. MOV CH, 01h //евый верхний угол MOV CL, 40h //равый верхний угол MOV DH, 25h //евый нижний угол MOV DL, 40h //равый нижний угол AAA //сё, уже определено как надо. MOV EBX, (2 * 2) + (320 * 200) //тандартные параметры режима. MOV EBX,EAX //овторная установка связи регистров. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) REPE CMPSB //равнение полученных параметров видеорежима. //канировать видеобуфер отображения пикселов с целью //олучения, последующего естественного или искажённого //тображения пикселов на дисплее в желаемом видеорежиме. MOV ECX, 9999h //казатель на конец программы в буфере. CMP CL, 0 //азмер тела программы в буфере не известен. XOR CH, CH //еперьECX = CL длина буфера видеопамяти. MOV EDI, 0000h //S:DI -> хвост в PSP MOV EBX, 1310h //казание на адрес тела системной MOV EBX,ESI //рограммы в видеобуфере по соответ- MOV ESI, 1310h //твующим векторам: //3h - вектор режима //0h - вектор видео адаптера XCHG AL, AH //вязь флагов регистров. AAA //оррекция флагов регистра. MOV EAX,ESI MOV EAX, OFFSET SzGrfSc1 //азмер стандартного видеобуфера. CMC //одготовить буфер к новому заполнению CLD //канировать вперёд REPE SCASB //канировать видеобуфер до полного результата. AAD //же не предпринимать, ни каких попыток к установке //идео параметров. //аписать эти параметры и массив самого видеобуфера // оперативную память, для дальнельшего использования // текущем видеорежиме. PUSH ECX //азмер буфера видеопамяти известен. POP EDX //анные, его содержимого произвольные. MOV EAX, 1310h //3h - функция//10h - вектор доступа. MOV AL, 13h //3h - Номер функции установленного реж. MOV EBX, (2 * 2) + (320 * 200) //араметры видеорежима. MOV ECX, OFFSET SzGrfSc1 //азмер буфера //идеопамяти (320 * 200 * 2) MOV EAX, 0 //казание верхнего левого угла на дисплее. MOV EBX,EDX //вязать параметры с блоком данных. DEC EDX //овые значения устанавливаються вEDX NEG EDX //словная фиксация во флаге регистраEDX CLD //иксировать вперёд REP STOSB //обственно, фиксация в памяти. //становить ответный сигнал обработанного //зображения в память знакогенератора //рафического адаптера. PUSH DS //астроить сегментные регистры POP ES //а область данных. MOV ES,EAX MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 0 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвета db 238 //UT EDX, AL //становка цвета //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //аправление ответного сигнала в знакогенератор //рафического адаптера. // начале, проверить доступ к видео адаптеру OUT 10h, AL MOV ECX, OFFSET SizeBuff //акс. размер загружаемой //рограммы - 64 кб. //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей видео адаптер IN AL, 10h // с дисплеем (монитором) IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ывод пикселов отображения на дисплей, //ри заданном режиме. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSW //ывод пикселов на дисплей, в расширенном //ежиме. //а выход из подпрограммы JMP QuitSub QuitSub: //ET //ыйти из подпрограммы JMP ScNxt //RAPH ENDP //ntr10hLen = $ - Intr10h //онец подпрограммы обработчика INT 10h //ереход к окончанию установочной процедуры GraphSc1: //становка режима отображения или скрытия курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, EAX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //редварительная очистка байта изображения. //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //еперь, вывести байт изображения. //становка цвета. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 1 //вет db 238 //UT EDX, AL //становка цвета //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 //ереход к окончанию установочной процедуры JMP ScNxt GraphSc2: //становка места положения курсора на дисплее. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //анять регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX //ункция вывода на дисплей //начения и адреса, условно не определены MOV AH, 00h MOV AL, 0 MOV EAX, 0000h MOV ES,EAX //OV ES:0,EAX //ервая позиция на экране MOV ES,EBX //ледущая позиция MOV AH, 00h MOV AL, 0 //од холостого сигнала MOV EBX, 0 //озиция от конца буфера MOV EBX,EAX MOV ESI, 0000h //дрес строки MOV EDI, 0000h // низ экрана MOV ECX, 0000h //лина строки REP STOSB //иксация в буфере оперативной памяти MOV AL, 00 MOV DS,EAX MOV EAX, 0B800h //дрес видеобуфера MOV ES,EAX MOV EDI, 0000h //мещение по экрану MOV ESI, atd5 //дрес сообщения MOV ECX, 0000h //исло выводимых байтов REP MOVSB //иксация отображения на дисплее //свободить регистры POP EAX POP EBX POP ECX POP EDX //ереход к окончанию установочной процедуры JMP ScNxt GraphSc3: //олучение режима отображения и размера курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX MOV EAX, 0100 //ункция 01h Видео драйвера //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //ункция увеличения размера курсора AAM IMUL EDX AAA ADD EDX, 00h //ункция уменьшения размера курсора MOV AL, 0FFh db 238 //UT EDX, AL INC EDX AAS SUB EDX, 00h AAD IDIV EDX //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 //ереход к окончанию установочной процедуры JMP ScNxt GraphSc4: //егулирование яркости цветовой палитры, с помощи //адаваемых параметров, при запросе функции INT 10h. MOV EAX, 0B800h MOV DS,EAX MOV EAX, 0400h //ункция 04h Видео драйвера //агрузить параметры основных 16-ти цветов из //онтролёра видеоадаптера MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвет db 238 //UT EDX, AL //становка цвета //епосредственное чтение параметра, каждого //з 16-ти основных цветов из устройства //онтролёра видеоадаптера MOV ECX, 000Fh //сего цветов должно быть 16 OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL //0 OUT 10h, AL //1 OUT 10h, AL //2 OUT 10h, AL //3 OUT 10h, AL //4 OUT 10h, AL //5 OUT 10h, AL //6 CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //алитра из 256-ти возможных цветов получается применением //икла из 16-ти кратного доповления нового 1-го байта к //оду имеющегося цвета. Установка по принцепу 16 x 16 = 256. SetClr0: MOV ECX, 16 //есь цикл, надо 16 раз повторить для //ого, чтобы получить палитру из 256-ти //ветов. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color0 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr0 //иклический переход по адресу. SetClr1: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color1 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr1 //иклический переход по адресу. SetClr2: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color2 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr2 //иклический переход по адресу. SetClr3: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color3 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr3 //иклический переход по адресу. SetClr4: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color4 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr4 //иклический переход по адресу. SetClr5: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color5 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr5 //иклический переход по адресу. SetClr6: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color6 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr6 //иклический переход по адресу. SetClr7: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color7 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr7 //иклический переход по адресу. SetClr8: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color8 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr8 //иклический переход по адресу. SetClr9: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color9 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr9 //иклический переход по адресу. SetClr10: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color10 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr10 //иклический переход по адресу. SetClr11: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color11 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr11 //иклический переход по адресу. SetClr12: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color12 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr12 //иклический переход по адресу. SetClr13: MOV ECX, 16 //есь цикл, надо повторить 16 раз. DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color13 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr13 //иклический переход по адресу. SetClr14: DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color14 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr14 //иклический переход по адресу. SetClr15: DAA //анее добавленные байты сохранены MOV EBX, 0014h //аксимальное значение, при добавлениях. MOV ECX, 4 //аждый цвет кодируется 4-мя байтами. MOV EDX, OFFSET Color15 //агрузка кода отображения нужного цвета. ADC DL, 01h //аждый раз добавлять по 1 байту, в новый. MOV EDX, OFFSET PlusClr //обавляемый байт к коду цвета. INC EDX //рирастить загруженный байт к остальным. AAA //сё, уже определено как надо. AAD //ока не предпринимать не каких попыток к изъятию. CBW //бъеденить регистры цвета в одно значение. LOOPZ SetClr15 //иклический переход по адресу. //аключить в цикле 16 по 16 равно 256. LODSB //иклический переход по адресу MOV CH, 255 //олучилось различных 256 цветов. CLD //иксировать вперёд REP STOSB //афиксировать в памяти параметры полученных //ветов. //агрузить параметры 256-ти полученных цветов в //онтролёр видеоадаптера. MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр Цвет db 236 //N AL,EDX //становка цвета //епосредственная загрузка параметра, каждого //з 256-ти основных цветов в устройство //онтролёра видеоадаптера. Здесь достаточно, //оспользоватся 8-ми разрядным сигналом, который //казывает на передачу каждого отдельного байта, // не цвета. MOV ECX, 00FFh //сего цветов должно быть 256 IN AL, 10h // Байтовый принцеп: IN AL, 10h // по 8 IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // CLD //иксировать вперёд REP STOSB //афиксировать в памяти //рочитанные параметры //ереход к окончанию установочной процедуры JMP ScNxt GraphSc5: //становка видеостраницы. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //нициализация установки новой видеостраницы. //тобы её иницилизировать, нужно убрать с //исплея отображение старой страницы. Cistka: MOV ECX, 50 //овторить 50 раз подряд. MOV EDI, 0001h //ачать с первого пиксела. MOV ESP, 80H //онец загрузаемого кода. MOV ESI, SpeedStr //агрузка кода чистящей строки. LOOPZ Cistka //ереход на выполнение цикла. MOV CH, 80 //акс. число символов по горизонтали. MOV ECX, 50 //акс. число символов по вертикали. CLD //иксировать установку вперёд REP MOVSB //aмa фикcaция //eперь исполнить код очистительной строки, //ак код тела исполняемой программы, чтобы //афиксировать инициализацию новой страницы. SpeedStr dd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 //peedStrLen = $ - SpeedStr //ереход к окончанию установочной процедуры JMP ScNxt GraphSc6: //нициализация или прокрутка окна вверх. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //верх, осуществляется смещением первого пиксела //а дисплее в отрицательную позицию. Это одна из //амых сложных операций. Ведь, самопроизвольно по //исплею можно перемещаться только вниз. MOV EDI, 0000h //становить нолевое значение //ачального места положения //уроса на дисплее. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAS //становить флаг удаления исходного числа пикселов. SUB EDI, 99h //далять из регистраEDI исходное значение. DAS //становить флаг для удаления фиксированного значения. SBB EDI, 99h //далять из регистраEDI фиксированное //начение числа выведенных пикселов. SBB ECX, 0560h //далить текущие значение и из флагаECX. //но должно превышать число 640. 0480 = 1280. DEC EDI //афиксировать после удаления, в обоих DEC ECX //егистрахEDI иECX отрицательное приращение. DAS //овторно установить флаг убывания пикселов, для //отверждения законности этой операции. AAS //екущая операция завершена. Можно приступать к другой. NEG EDI //олучить код дополнительного значения NEG ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. //ереход к окончанию установочной процедуры JMP ScNxt GraphSc7: //нициализация или прокрутка окна вниз. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //низ, осуществляется смещением последнего пиксела //а дисплее в более нижнею позицию. По принцепу, //та операция, аналогична предыдущей в которой //еремещение осуществляется, наоборот вверх. MOV EDI, 9999h //мещение к концу экрана. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAA //становить флаг пополнения исходного числа пикселов. ADD EDI, 99h //рибавлять к региструEDI новое значение. DAA //становить флаг для удаления фиксированного значения. ADC EDI, 99h //рибавлять к региструEDI фиксированное //начение числа выведенных пикселов. ADC ECX, 0560h //рибавлять к текущиму значению флагаECX. //но должно превышать число 640. 0480 = 1280. INC EDI //афиксировать после пополнения, в обоих INC ECX //егистрахEDI иECX приращение. DAS //овторно установить флаг пополнения пикселов. AAA //екущая операция завершена. Можно приступать к другой. NOT EDI //олучить код дополнительного значения NOT ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. //ереход к окончанию установочной процедуры JMP ScNxt GraphSc8: //тение символа и его атрибута в позиции курсора. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //егистрация цвета выводимого символа. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //ывести байт пикселов. //OV BYTE PTR ES:[BX], 0FFh INC EBX // следующему байту //ереход к окончанию установочной процедуры JMP ScNxt GraphSc9: //апись символа и его атрибута в позицию курсора. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 236 //N AL,EDX //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 236 //N AL,EDX //становка маски битов //становка цвета. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 0 //егистр цвета db 236 //N AL,EDX //становка цвета //ывести байт пикселов. //OV BYTE PTR ES:[BX], 0 INC EBX // следующему байту //ереход к окончанию установочной процедуры JMP ScNxt GraphSc10: //апись символа, без атрибута в позицию курсора. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 236 //N AL,EDX //становка маски битов //ывести байт пикселов. //OV BYTE PTR ES:[BX], 0 INC EBX // следующему байту //ереход к окончанию установочной процедуры JMP ScNxt GraphSc11: //арезервная функция для работы с видеодрайверами, //рафических операционных систем, типа Windows, Linix, //S/2 и Unix несовместимых со стандартными видео //араметрами BIOS и DOS. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //арезервированный буфер для системной программы //ыполняющей функции, не предусмотренной видео //райвером ROM BIOS RezerfSub: db 96 Dup (?) //ереход к окончанию установочной процедуры JMP ScNxt GraphSc12: //апись пиксела в видеобуфер. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //егистрация цвета выводимого символа. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //ывести байт пикселов на дисплей. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSB //ывод байта из буфера на дисплей. //ереход к окончанию установочной процедуры JMP ScNxt GraphSc13: //тение пиксела из видеобуфера. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0001h //дин байт //егистрация цвета выводимого символа. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //анести байт пикселов в буфер оперативной памяти. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //иксировать вперёд. REP STOSB //иксация байта в памяти. //ереход к окончанию установочной процедуры JMP ScNxt GraphSc14: //апись символа в режиме телетайпа. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима PUSH DS //астроить сегментные регистры POP ES //а область данных. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0002h //ва байта. Один кодирует само //тображение, а другой его цвет. //егистрация цвета выводимого символа. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //одготовиться к выводу REP MOVSB //ывод 2-х байта на дисплей. //ереход к окончанию установочной процедуры JMP ScNxt GraphSc15: //олучение информации, о текущем режиме видеоконтролёра. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //истемная подрограмма инициирующая работу ввода/вывода //стройства работы видеоплаты (графического адаптера). //рограмма доступа к видеоадаптеру, написанная по //роцедуре IOS, подобная той, которая находится в //икросхеме контролёра видеоплаты, на материнской плате. CLI //апретить прерывания. PUSHF //oxpaнить флaги для команды IRET. MOV AH, 10h //начала перейдём в драйвер 10h MOV EBX, 00h //ектор 10h ещё не определён MOV ECX, 0002 //ideoVectLen MOV EDX, VideoVect //агрузить блок для вектора MOV EDX, 0010h //аполнить блок его указанием CLD //бозначить вектор REP STOSB //авербовать вектор 10h в памяти //роцедура IOS инициализации программы прерывания 10Н PUSH DS //ode begin the execute program PUSH EAX PUSH ECX MOV EAX,0040H MOV DS,EAX MOV AL,10H MOV AL,10H MOV AL,10H OUT 20,AL OUT 225,AL IN AL,20 OUT 225,AL MOV AH,AL OR AL,AL JZ VdSb1 MOV AL,10h OUT 160,AL MOV AL,10h OUT 225,AL MOV AL,10h OUT 245,AL IN AL,160 OUT 225,AL MOV CL,AL OR AL,AL JZ VdSb2 IN AL,161 OUT 225,AL OR AL,CL OUT 161,AL OUT 225,AL MOV AL,20 OUT 160,AL JB VdSb4 VdSb2: IN AL,21 OR AL,AH OUT 225,AL AND AL,251 OUT 21,AL IN AL,10h VdSb4: MOV AL,20 OUT 225,AL MOV EAX,20 OUT 20,AL JB VdSb3 VdSb1: MOV EAX, 0000h VdSb3: MOV AH, 0000h IN AL, 10h POP ECX POP EAX POP EDX //афиксировать прочитанные данные о //екущем видеорежиме, в буфере памяти //ля дальнейшего чтения и использования XCHG AL, DH //вязать регистр AL с //егистром данных DH. SAHF //агрузка AH в младший байт. INC DH //анные задействованы // указанном регистре. XOR DH, BH //егистр настроен на //аботу с данными. PUSH DS //астроить сегментный POP ES //егистр на область данных. MOV ECX, 128 //бщий размер кода данных //е должен превышать 128 байт. MOV EBX, 1 //искриптор задействован CLD //аполнять вперёд REP STOSB //сё, данные о текущем видеорежиме //омещены в буфер памяти, для //альнейшего использования. STC //жидание выполнения новой операции. //ереход к окончанию установочной процедуры JMP ScNxt VideoVect dw 0 //вухбайтная ячейка для дискриптора. //ideoVectLen = $ - VideoVect GraphSc16: //становка регистра цвета фона и символов на дисплее. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима PUSH DS //астроить сегментные регистры POP ES //а область данных. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи //редварительная очистка байта изображения. //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //становка цвета. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV EAX,EDX //вет (пока, не определён) db 238 //UT EDX, AL //становка цвета //егистрация цвета выводимого символа. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 236 //N AL,EDX //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //афиксировать полученные параметры REP MOVSB //апись этих параметров в память //ереход к окончанию установочной процедуры JMP ScNxt GraphSc17: //агрузка шрифта пользователя. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //агрузить параметры нужного шрифта пользователя 8 x 14 MOV BH, 14 //ысота 14 точек MOV BL, 0 //лок 0 знакогенератора MOV ECX, 256 //исло символов в таблице MOV EDX, 00h //од первого символа REP STOSB //афиксировать эти параметры в памяти, //ля отображения символов на дисплее //становка параметров текствого шрифта 8 x 14. MOV AH, 11h //ункция 11h - шрифт 8 x 14 MOV AL, 1 //агрузка матрицы для одного символа MOV CH, 0 //ервый символ таблицы MOV CL, 255 //оследний символ таблицы MOV DH, 1 //о ширине отображения MOV DL, 14 //о высоте отображения PUSH DS //анятый регистр POP ES //вободный регистр ////MOV ECX, FontLoadLen //азмер загружаемого блока. ////LEA EDX, FontLoad //агрузка матриц загружаемого //рифта для каждого из 256-ти //имволов. MOV DL, 14 //одтвердить деление блока на 14 //DIV EDX //еление по 14 AAD //становиться на достигнутом. SHR DL, 1 //дин сдвиг вправо при фиксации //нимого символа на дисплее. AAA //ринять сдвиг в регистр. //роверка установленных параметров нужного шрифта //ользователя 8 x 14 MOV BH, 14 //ысота 14 точек MOV EBX, 1 // байт (8 бит) по ширине MOV BL, 0 //лок 0 знакогенератора MOV ECX, 256 //исло символов в таблице MOV EDX, 00h //од первого символа CLD //равнивать вперёд REP CMPSB //равнение //афиксируем отображение этого на экране //омпьютера (дисплее) с помощи загруженной //ля него матрицы, по соответствующей процедуре //ыполнения команд IOS, без запроса прерываний BIOS и DOS ADC DL, 1 //рибавить патенциально, существующий //дин байт. SAR DL, 1 //двиг вправо на произвольное //оличество разрядов. AAA //отвердить операцию. CLD //афиксировать готовность вывода. MOV ESI, 0 //од ASCII не определён! MOV DL, 1 //адействовать один байт MOV ECX, 1 //ля одного байта REP MOVSB //афиксировать передачу в заданной позиции //ереход к окончанию установочной процедуры JMP ScNxt GraphSc18: //ункция 12h - Инициализация работы со цветовой палитрой //56 различных цветов. Такая палитра при работе в DOS и //IOS поддерживается, обычно только, в графическом режиме // разрешением 320 x 200 точек. Для работы с ней, предвари- //ельно инициализируется этот видеорежим функцией 12h //NT 10h. Монитор, при этом должен, быть не ниже уровня, //идеоадаптера, типа VEGA. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //нициализировать доступ к графическому адаптеру и //становить режим фиксации цветового регистра MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 2 //ежим фиксации цветового регистра db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 2 * 16 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //становка цвета. MOV EDX, RezerfSub2 //агрузить буфер для заполнения MOV ECX, 32 //о одному байту на пиксел //зображения и цвет. REP STOSB //афиксировать //роцедура установки цветовой палитры для одного //ветового оттенка MOV EDX, 3CEh //дресный регистр контролёра MOV EAX, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //становка палитры из 16-ти оттенков для одного выбранного //вета. Каждый новый оттенок, темнее предыдущего. Так как //ринцеп получения нового оттенка сводиться к добавлению // код исходного цвета лишнего нолевого байта. MOV EDX, 3CEh //дресный регистр контролёра MOV EAX, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных ADC AH, 00h //редварительно, зафиксировать //егистр на мнимое приращение AAA //ставить регистр в требуемом состаянии //вет (чёрный) MOV EBX, 00h //искриптор чёрного цвета MOV EAX, OFFSET Color0 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette0 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (синий) MOV EBX, 01h //искриптор синиго цвета MOV EAX, OFFSET Color1 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette1 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (зелёный) MOV EBX, 02h //искриптор зелёного цвета MOV EAX, OFFSET Color2 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette2 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (берюзовый) MOV EBX, 03h //искриптор березового цвета MOV EAX, OFFSET Color3 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette3 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (красный) MOV EBX, 04h //искриптор красного цвета MOV EAX, OFFSET Color4 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette4 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (каричневый) MOV EBX, 05h //искриптор каричневого цвета MOV EAX, OFFSET Color5 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette5 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (фиолетовый) MOV EBX, 06h //искриптор фиолетового цвета MOV EAX, OFFSET Color6 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette6 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (серый) MOV EBX, 07h //искриптор серого цвета MOV EAX, OFFSET Color7 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette7 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (тёмно-серый) MOV EBX, 08h //искриптор тёмно-серого цвета MOV EAX, OFFSET Color8 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette8 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (ярко-голубой) MOV EBX, 09h //искриптор ярко-голубого цвета MOV EAX, OFFSET Color9 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette9 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (светло-зелёный) MOV EBX, 10h //искриптор светло-зелёного цвета MOV EAX, OFFSET Color10 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette10 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (светло-голубой) MOV EBX, 11h //искриптор светло-голубого цвета MOV EAX, OFFSET Color11 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette11 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (розовый) MOV EBX, 12h //искриптор розового цвета MOV EAX, OFFSET Color12 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette12 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (малиновый) MOV EBX, 13h //искриптор малинового цвета MOV EAX, OFFSET Color13 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette13 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (жёлтый) MOV EBX, 14h //искриптор жёлтого цвета MOV EAX, OFFSET Color14 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette14 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //вет (белый) MOV EBX, 15h //искриптор белого цвета MOV EAX, OFFSET Color15 //агрузка кодов требуемого цвета MOV ECX, 4 //исло байтов, которыми кодируется цвет ADD EAX, 00h //рибавление нового байта INC EAX //риращение ADC EAX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка цвета NOT EAX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //агрузка кодов 16-ти оттенков одного и того же цвета // создаваемой палитре. MOV EBX, OFFSET Palette15 MOV ECX, 16 //ля 16-ти возможных оттенков ADD EBX, 00h //рибавление нового байта INC EBX //риращение ADC EBX, 00h //охранить тенденцию к наращиванию db 238 //UT EDX,EAX //становка палитры для требуемого цвета NOT EBX //нверсия устанавлиемого цвета CBW //адействовать код в расширенном значении REP STOSB //афиксировать в оперативной памяти //а выход из подпрограммы JMP ColorRet //арезервированный буфер для системной программы //ыполняющей функции, не предусмотренной видео //райвером ROM BIOS RezerfSub2: db 32 Dup (?) //ezerfSub2Len = $ - RezerfSub2 //ереход к окончанию установочной процедуры ColorRet: JMP ScNxt GraphSc19: //апись строки в режиме телетайпа. //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 236 //N AL,EDX //становка адресации к регистру //ежима PUSH DS //астроить сегментные регистры POP ES //а область данных. INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 236 //N AL,EDX //становка режима записи //редварительная очистка байта изображения. //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //ывести байт пикселов на дисплей. MOV EDI, 0000h //начения отображения на MOV ESI, 0000h //исплее произвольны. //OV BYTE PTR ES:[BX], 00Fh INC EBX // следующему байту CLD //иксировать вперёд REP MOVSW //афиксировать строку на экране //ереход к окончанию установочной процедуры JMP ScNxt GraphSc20: //арезервированная функция. //уфер для системной программы выполняющей функции, //е предусмотренной видео драйвером ROM BIOS //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //редварительно загрузить буфер для фиксации, //тёка из 96-ти байт в регистрEDX. MOV EDX, RezfSub3 //ыполнить его пустое содержимое, как код тела //сполняемой программы. RezfSub3: db 96 Dup (?) //ереход к окончанию установочной процедуры JMP ScNxt GraphSc21: //абота с графическим адаптером напрямую, //ез посредничества со стороны ROM BIOS //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //ткрыть доступ, непосредственно к устройству контролёра //рафического адаптера. MOV EDX, 0010h //орт контролёра MOV AL, 11h //КИ1: будет СКИ3 db 238 //UT EDX, AL //ервый контакт с устройством. INC EAX //егистромEAX к нему, теперь //ткрыт постоянный доступ. MOV AL, 10h //едомый вектор тоже задействован. db 238 //UT EDX, AL //еперь, всё готово для работы с //стройством генератора. //ывод контролёра графического адаптера. MOV EDX, 0010h //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима чтения MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0001h //исло байтов данных INC EDX //X = 0008h - Регистр данных. IN AL, 10h //осылка пробного сигнала IN AL, 10h // порт устройства видеоадаптера IN AL, 10h CMP ECX, 1 //иксировать 3 задействованых байта OUT 17h, AL //олучение ответного сигнала из OUT 17h, AL //орта устройства принтера. OUT 17h, AL CMP ECX, 1 //иксировать 1 прочитанный байт //адействовать основной регистр MOV AL, 10h //ошлём в контролёр прерываний MOV AL, 10h ADD AL, 0 //реобразуем в символьную форму MOV AH, 4Eh //трибут для наглядности операции //аглавный регистр соответствует любому из 256-ти //ожможных байтов в системе ASCII MOV EAX, 00 //ля количества байтов, которыми кодируется генерация //анного цвета, в видеоадаптере с целью отображения //а дисплее. MOV ECX, 1 //агрузить параметры условного символа для вывода MOV EDX, 00h //ывести байтовую ячейку на дисплей MOV EAX, 1690 //роверить доступ к устройству видеоадаптера OUT 10h, AL //ослать на него текущею байтовую маску IN AL, 10h // Восьмиричная комбинация для IN AL, 10h // шины, связывающей адаптер IN AL, 10h // с Центральным Процессором (ЦП). IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // IN AL, 10h // //акрыть выполненную операцию MOV EDX, 10h //орт контролёра видео адаптера MOV AL, 11h //КИ1: будет СКИЗ db 238 //UT EDX, AL INC EDX //торой порт контролёра MOV AL, 8 //КИ2: базовый вектор db 238 //UT EDX, AL MOV AL, 4 //КИЗ: ведомый подключен к уровню 2 db 238 //UT EDX, AL MOV AL, 1 //КИ4: 80x86, требуется EOI db 238 //UT EDX, AL //ослать выведенные байты с видеоадаптера //а Центральный Процессор (ЦП) OUT 10h, AL // Восьмиричная комбинация для OUT 10h, AL // шины, связывающей адаптер OUT 10h, AL // с Центральным Процессом (ЦП). OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // OUT 10h, AL // POP ES //свободить сохранённые регистры POP EAX //ереход к окончанию установочной процедуры JMP ScNxt ScNxt: //ункции видеодрайвера выполняемые в любом случае, //не зависимости, от параметров вызова системной //одпрограммы INT 10h MOV EBP,EAX MOV EAX, ES ADD EAX, 0010h PUSH CS POP DS MOV EAX, 0004h ADD EAX, 5D2Ch MOV ES,EAX MOV ECX, 0199h MOV EDI,ECX DEC EDI MOV ESI,EDI STD //аполнять вперёд REP STOSW //аполнение буфера STI //азрешить прерывания RET //окинуть обработчик //nt10hLen = $ - Int10h //онец тела программы самого обработчика INT 10h //ONTS ENDP //онец основной программы //истемная подпрограмма установки различных //екстовых и графических режимов, при //оответствующем флаге занятости регистра AL. //еречень возможных видеорежимов, реализуемых //райвером INT 10h : // 00h - Текстовой режим 40 x 25 символов, 2 цвета // 01h - Текстовой режим 80 x 50 символов, 16 цветов // 02h - Текстовой режим 80 x 25 символов, 2 цвета //* 03h - Текстовой режим 80 x 25 символов, 16 цветов // 04h - Графический режим 320 x 200 точек, 4 цвета // 05h - Графический режим 320 x 200 точек, 2 цвета // 06h - Графический режим 640 x 200 точек, 2 цвета // 07h - Текстовой режим 80 x 25 символов, 2 цвета // 08h - Не используеться // 09h - Графический режим 320 x 200 точек, 16 цветов // 0Ah - Графический режим 640 x 200 точек, 4 цвета // 0Bh - Не используеться // 0Ch - Не используеться // 0Dh - Графический режим 320 x 200 точек, 16 цветов // 0Eh - Графический режим 640 x 200 точек, 16 цветов // 0Fh - Графический режим 640 x 350 точек, 2 цвета // 10h - Графический режим 640 x 350 точек, 16 цветов // 11h - Графический режим 640 x 480 точек, 2 цвета // 12h - Графический режим 640 x 480 точек, 16 цветов // 13h - Графический режим 320 x 200 точек, 256 цветов / //римечания: //* - Основные режимы драйвера видео адаптера. //** - Главное дополнение, к основным режимам. //истемная программа INT 11h POWER: CLI //апретить прерывания //свободить все регистры POP EAX POP EBX POP ECX POP EDX POP ESP POP EBP POP ESI POP EDI POP DS POP ES POP SS POPF //бросить флаги, перед новой операцией //роизвести вербовку нолевого двух //айтового вектора 0000h и занести его // соответствующий адрес сегментного //уфера оперативной памяти. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV EAX, 0000h //ектор прерывания заносимый в буфер CLD //аполнять вперёд REP STOSB //аполнение //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //бработчик прерываний устройства электро- //беспечения по INT 11h //обработка аппаратного прерывания). Power_00h: MOV EDX, 0000h //орт контролёра MOV AL, 00h //КИ1: будет СКИ3 db 238 //UT EDX, AL //ервый контакт с устройством. INC EAX //егистромEAX к нему, теперь //ткрыт постоянный доступ. MOV AL, 00h //едомый вектор тоже задействован. db 238 //UT EDX, AL //еперь, всё готово для работы с //стройством электрообеспечения. MOV EDX, 0001h //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима чтения MOV EDX, 0001h //ачать с байта 0 по ASCII MOV ECX, 0001h //дин байт. MOV EBX, OFFSET Elect1 //агрузка первой битовой матрицы INC EBX //X = 0000h - Регистр данных. IN AL, 00h //осылка пробного сигнала IN AL, 00h // порт устройства устройства IN AL, 00h //лектообеспечения. CMP ECX, 01h //иксировать 1 задействованый байт. db 238 //UT 00h, AL //олучение ответного сигнала из OUT 00h, AL //орта устройства электообеспечения OUT 00h, AL //атеринской платы. db 238 //UT EDX, AL //аправить общий сигнал в устройство. //ower_00hLen = $ - Power_00h //афиксировать подпрограмму доступа к //стройству электрообеспечения через //олевой вектор MOV ES,EDX //астроем на него ES XOR ESI,ESI //S:ESI -> начало выделенного блока CLD //аполнять буфер вперёд MOV EDX, OFFSET Power_00h //ачало тела резидента MOV AL, 00h //дрес вектора MOV ECX, 0064h //онец тела резидента REP STOSB //иксация подпрограммы в буфере //агрузить каждую поочерёдно, из электронных //атриц и затем сканировать её. //агрузка 1-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 01h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl1: LODSB //одготовить цикл исполнения процесса. MOV EDI, 01h //адействованный код байта матрицы. MOV ESI, OFFSET Elect1 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 01h //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl1 //овторить весь цикл по 16 раз. //агрузка 2-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 03h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl2: LODSB //одготовить цикл исполнения процесса. MOV EDI, 03h //адействованный код байта матрицы MOV ESI, OFFSET Elect2 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 03h //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl2 //овторить весь цикл по 16 раз. //агрузка 3-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 07h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl3: LODSB //одготовить цикл исполнения процесса. MOV EDI, 07h //адействованный код байта матрицы MOV ESI, OFFSET Elect3 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 07h //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl3 //овторить весь цикл по 16 раз. //агрузка 4-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 15h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl4: LODSB //одготовить цикл исполнения процесса. MOV EDI, 15h //адействованный код байта матрицы MOV ESI, OFFSET Elect4 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 15h //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl4 //овторить весь цикл по 16 раз. //агрузка 5-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 31h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl5: LODSB //одготовить цикл исполнения процесса. MOV EDI, 31h //адействованный код байта матрицы MOV ESI, OFFSET Elect5 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 31h //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl5 //овторить весь цикл по 16 раз. //агрузка 6-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 63h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl6: LODSB //одготовить цикл исполнения процесса. MOV EDI, 63h //адействованный код байта матрицы MOV ESI, OFFSET Elect6 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 63h //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl6 //овторить весь цикл по 16 раз. //агрузка 7-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 0127h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl7: LODSB //одготовить цикл исполнения процесса. MOV EDI, 0127h //адействованный код байта матрицы MOV ESI, OFFSET Elect6 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 0127 //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl7 //овторить весь цикл по 16 раз. //агрузка 8-й битовой матрицы и её сканирование. CMC //одготовить буфер к новому заполнению. XCHG AL, AH //вязь флагов регистров. MOV AH, 00h //аглавный регистр имеет нолевой флаг. MOV CL, 01h //казатель на один байт - битовую матрицу. CMP EBX, 0255h //ыявить, можможный наш код. XOR CH, CH //еперьEDX = DL длина буфера чтения битов. MOV ECX, 2560h //икл по 2560 раз CLD //канировать вперёд. PwrCkl8: LODSB //одготовить цикл исполнения процесса. MOV EDI, 0255h //адействованный код байта матрицы MOV ESI, OFFSET Elect6 //агрузка нужной битовой матрицы //з банка объективных данных. MOV AL, 0255 //ooтвeтствyющий этой битовой матрице //oмep бaйтa, в cиcтеме ASCII REPE SCASB //канировать видеобуфер до полного результата. AAA //оррекция флагов регистра. STOSB //охранить в буфере отсканированный байт. LOOPZ PwrCkl8 //овторить весь цикл по 16 раз. //сновные команды обработчика прерывания по INT 11h PUSH DS MOV EAX, 0040h MOV DS,EAX XOR EAX,EAX MOV EAX, 0000h POP DS //авершение процесса работы обработчика по INT 11h PUSH EAX //одтвердить занятость нолевого регистра. PUSH ECX //адействовать для этого регистрыEAX иECX. POP EBX //начение флагов регистровEBX иESI ещё POP ESI //е определено. PUSHF //oxpaнить флaги для команды IRET STI //азрешить прерывания RET //окинуть обработчик //OWER ENDP //ntr11hLen = $ - Intr11h //онец подпрограммы обработчика INT 11h //истемная программа INT 12h Intr12h: MEMORY: // этой программе для инициализации //аботы с памятью, запрещается использовать //начения регистровEAX иECX CLI //апретить прерывания PUSH EAX //eгистрEAX занят POP EBX //егистрыEBX иEDX POP EDX //вободны PUSH ECX //eгистрECX занят //ереход на инициализацию CMP EBX,0CFh JE OurMux1 //нициализация работы IOSa с памятью OurMux: OR ESP,ESP JNZ OurMux1 DEC ESP OurMux1: CMP EBX,1 JNE NormMux MOV EDX,0 PUSH EBX POP ES MOV EBX, OFFSET MuxOfs MOV EBX, 00BCh MOV EDX, OFFSET MuxSeg MOV EBX, 00BEh MOV ESI, 0080h MOV EBX,ESI CLD REPNE SCASB CMP EBX,1 JBE ScanPrm MOV EDX,EBX ScanPrm: MOV EDI,ESI MOV EBX,EDX MOV ESI,EDI CMP EBX,0 JNE MemDone JCXZ MemDone LODSB DEC EDX AND EBX,0DFh MemDone: XOR EBX,EBX MOV ES,EBX MOV EBX, 7C00H //exx_Vect MOV EDX, OFFSET MemAtd MOV EBX, 7C00H //exx_Vect MOV EAX, OFFSET MemAtd // MOV WORD PTR Rexx_Vect * 4, MemAtd MOV ECX, 7C00H //exx_Vect CLD REP SCASB MOV EAX,2906 MOV ES,EAX MOV DS,EAX MOV EDX,0014 //OV BYTE PTR CS:[0013],00 PUSH ESP PUSH EBX PUSH EAX INC ECX INC EBX INC EBP PUSH ESP INC EBX PUSH ESP PUSH EBX PUSH EAX INC ECX INC EBX INC EBP PUSH EBX PUSH EAX MOV AH,07 POP EAX POP EBX PUSH EBX PUSH EAX MOV AH,05 POP EAX POP EBX PUSH EAX PUSH DS POP DS POP EAX PUSH ES POP ES POP EAX PUSH DS POP DS MOV EAX,5803 PUSH DS POP DS MOV EAX,5801 PUSH EAX PUSH ES MOV ES,EAX MOV EAX,ES INC EAX MOV ES,EAX POP ES POP EAX PUSH EAX MOV EAX, 0008 POP EAX //OV WORD PTR ES:[0001],0000 MOV EAX,2020 PUSH ESI PUSH DS PUSH ES MOV AH,52 POP ES POP DS POP ESI MOV EAX,0000 MOV EAX,5803 MOV EBX,0001 PUSH CS POP SS PUSH CS POP DS INC ECX PUSH DS INC EDX PUSH SS //NC BYTE PTR [BX+SI] INC EBX INC ECX INC ESP INC EBX PUSH DS PUSH ES PUSH CS POP DS //OV EDX,WORD PTR [219D] //OV EAX,WORD PTR [2191] //OV EBX,WORD PTR [218D] //OV ECX,WORD PTR [2193] PUSH EAX PUSH EBX PUSH ECX MOV EBX,DS MOV ES,EBX MOV EBX,0004 MOV AH,48 MOV ES,EAX PUSH DS MOV ECX,0021 ADD ECX,10 REP MOVSB POP DS MOV ECX,ES MOV AH,49 POP ECX POP EBX POP EBP MOV AH,48 MOV ES,EAX PUSH DS MOV DS,EBP MOV EDI,ESI REP MOVSB POP DS MOV ES,EBP MOV AH,49 PUSH ES MOV EDI,0000 MOV AH,48 MOV AH,48 PUSH EAX ADD EAX,EBX MOV ES,EAX POP EAX ADD ESI,ECX ADD EDI,ECX REP MOVSB MOV ES,EAX MOV AH,49 POP ES POP DS POP ESP ADD DH,CL //DD WORD PTR [BX+SI],EAX //DD WORD PTR [BX+DI],EAX INC ECX PUSH EDX INC ESI POP ECX ADD EAX,6241 POP ES PUSH EDX PUSH ES INC ESI INC ECX INC ESP INC EBX PUSH EAX INC EBP INC EBP PUSH EAX INC ECX INC ECX INC ESP INC ECX INC ESP INC ECX INC ESP //DD WORD PTR [BX+SI],EAX //OP WORD PTR [DI] //DD WORD PTR [BX+SI],EAX PUSH EDI PUSH EDI PUSH EDX INC EDI PUSH CS INC EBX INC EDX POP EDI PUSH ESP POP EDX PUSH EDX PUSH CS //DD WORD PTR [BX+SI],ESP INC ECX //OP WORD PTR [BP+SI] PUSH CS INC ESI PUSH CS PUSH EAX INC ECX POP DS INC ESI INC EBX INC ESI PUSH ESP PUSH ESP INC ESP DEC ESI INC ESI PUSH EDX PUSH ECX POP EDI INC EBP MOV EBX,0787 MOV EBX,0773 MOV ESI,0301 MOV EDX,EBX MOV AH,4D POP DS POP DS POP DS POP DS POP EAX //OV EAX,WORD PTR [0376] PUSH EAX MOV AH,0D POP EAX PUSH EBX MOV EDI,0020 //OV EBX,WORD PTR ES:[0005] PUSH ES MOV ES,EBX MOV AH,49 POP ES //OV CL,BYTE PTR ES:[0001] //OV EBX,WORD PTR ES:[0003] MOV AH,49 POP EBX MOV EBP,EAX PUSH EAX POP EAX MOV EDX,0805 //OV EAX,WORD PTR [0311] //OV EAX,WORD PTR [0313] MOV AH,49 //OV EBX,WORD PTR [030D] MOV AH,50 POP DS POP EAX ADD ESP,02 PUSH DS POP ES MOV DS,EAX MOV EDI,0080 MOV ECX,0040 REP MOVSW MOV AH,51 //OV WORD PTR ES:[030D],EBX MOV AH,50 PUSH ES POP DS MOV EBX,DS PUSH DS PUSH DS POP DS ADD ESP,02 MOV AH,48 ADD EAX,0020 MOV CL,04 MOV AH,48 ADD EAX,1000 ADD EDX,EBX ADD EBX,EAX MOV EDI,ESI MOV ESI,ECX MOV EDI,ESI PUSH DS PUSH ES MOV ES,EBX REP MOVSB POP ES POP DS MOV EAX,DS MOV SS,EAX MOV ESI,051D MOV ECX,0533 REP MOVSB //OV EAX,WORD PTR [0366] POP DS ADD ESP,02 PUSH EAX PUSH EBX MOV EBX,EAX MOV EAX,4408 POP EBX POP EAX POP DS ADD ESP,02 //OV ECX,WORD PTR [0370] //OV EDX,WORD PTR [0018] INC EBX ADD EBX,04 INC EBX //OV EBX,WORD PTR [0393] PUSH EBX PUSH EAX PUSH ES PUSH DS MOV AH,51 MOV DS,EBX //OV EAX,WORD PTR [BX] POP ES PUSH ES //OV WORD PTR [BX],EAX POP DS POP ES POP EAX POP EBX PUSH DS PUSH EBX PUSH EAX MOV AH,51 //OV EAX,WORD PTR [0317] MOV DS,EBX //OV WORD PTR [BX],EAX POP EAX POP EBX POP DS MOV AH,19 MOV EDX,0720 INC EBP MOV EBX,EAX MOV EAX,4200 PUSH DS MOV EDX,0100 POP DS PUSH EAX POP EAX PUSH DS MOV ESI,0100 ADD EDX,EAX POP DS MOV EAX,2522 MOV EDX,0155 POP DS ADD ESP,02 MOV EDX,0742 POP DS PUSH ES PUSH ESI PUSH ECX PUSH EDI PUSH ECX PUSH EAX PUSH DS POP ES MOV DS,EBP //OV EAX,WORD PTR [SI+04] MOV ECX,0008 CLD REP MOVSB POP EAX POP ECX POP EDI PUSH ES POP DS PUSH EDX POP EDX MOV ESI,0673 PUSH ES PUSH DS PUSH EBP PUSH ESI PUSH EDX PUSH ECX PUSH EBX MOV AH,59 POP EBX POP ECX POP EDX POP ESI POP EBP POP DS POP ES MOV EDI,EAX MOV EDI,EAX MOV EAX,0500 PUSH EBX MOV EBX,EDI MOV EAX,0501 POP EBX PUSH DS PUSH ES POP DS MOV EDX,EDI //OV BYTE PTR [DI-01],24 //OV BYTE PTR [DI-01],00 POP DS //OV EDI,WORD PTR [0533] ADD EDI,13 INC ESI PUSH ECX PUSH DS POP ES MOV ECX,0010 CLD db 215 //LAT REP MOVSB POP EDI PUSH ES POP DS POP ECX MOV EDX,0650 MOV EDX,0658 MOV EDX,0661 MOV EDX,0668 MOV AH,03 MOV AH,00 INC AH INC AH INC AH MOV EDX,EDI POP ECX POP ESI POP ES MOV EDX,087D PUSH ESI PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX,ESI MOV ESI,EDX POP EDX POP ECX POP EBX POP EAX POP ESI PUSH EDX POP EDX INC ESI MOV AH,02 PUSH EBX PUSH ECX ADD EBX,EAX //OV EBX,WORD PTR [BX+01] //OV EAX,WORD PTR [BX] MOV ECX,0004 PUSH EAX MOV AH,02 POP EAX MOV AH,02 MOV AH,02 INC EBX POP ECX POP EBX PUSH EAX MOV EAX,1213 INC ESP INC ESP POP DS PUSH EAX PUSH EAX PUSH EBP PUSH EAX MOV EBP,ESP //OV EAX,WORD PTR [BP+08] //OV WORD PTR [BP+04],EAX //OV EAX,WORD PTR [0587] //OV WORD PTR [BP+08],EAX //OV EAX,WORD PTR [0585] POP EAX POP EBP POP DS POP EAX PUSH DS MOV ESI,0104 PUSH EBX MOV EBX,EDX POP EBX POP DS POP DS PUSH EAX PUSH EBX PUSH ECX PUSH EDX PUSH ESI PUSH DS POP ES MOV EBX,000B ADD EDI,EAX MOV EDX,0001 MOV EBX,2000 MOV EBX,EAX MOV EDX,EDI MOV EAX,4200 MOV EDX,0535 MOV ECX,0040 INC ESI //OV EDX,WORD PTR [0535] MOV EDI,EDX //OV EDI,WORD PTR ES:[DI] POP ESI POP EDX POP ECX POP EBX POP EAX POP DS MOV EAX,5800 MOV EBX,EAX MOV EAX,5801 MOV BL,CH MOV EAX,5803 MOV AH,50 MOV EBX,ES MOV EAX,3000 MOV EDX,2253 MOV EAX,ES MOV CL,04 MOV EAX,CS ADD EAX,EDX MOV EAX,5500 PUSH ES POP DS MOV AH,65 MOV ECX,0005 MOV EDI,0386 PUSH DS MOV EAX,6300 MOV EBX,DS POP DS //OV EAX,WORD PTR [0016] MOV EAX,1679 MOV CL,04 MOV ECX,CS ADD EAX,ECX ADD EAX,1000 //OV EAX,WORD PTR [0002] PUSH EAX MOV CL,04 POP EAX MOV CL,04 MOV ES,EAX MOV AH,19 PUSH DS PUSH ES POP DS MOV EDI, 91 MOV ECX,0090 REP MOVSB POP DS MOV EAX,EDI PUSH CS PUSH CS POP DS POP ES MOV ESI,0080 MOV EDI,ESI ADD EDI,EAX //OV BYTE PTR [DI],0D PUSH ESI PUSH EAX MOV EDI,ESI MOV ESI, 2251 STI //азрешить прерывания RET //окинуть обработчик //EMORY ENDP //ntr12hLen = $ - Intr12h //онец подпрограммы обработчика INT 12h //истемная программа INT 13h ReadDisk: CLI //апретить прерывания PUSHF //oxpaнить флaги для команды IRET //роцедура IOS инициализации программы прерывания 13Н MOV EDI, 1E13h MOV ESP, 512 //ереход на секцию инициализации. //нициализация установки системной подпрограммы INT 13h Int13Beg: //казание на мнимый флаг, при отсутствии ясной фиксации //правлящей программы процессора. AAS //одсчитаем, что занятый флаг существует в любом случае, //ак-бы то нибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB //енерация старших регистровESP иEDI для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST ESP,EDI CMC //одготовить буфер к новому заполнению //ачать процедуру распознавания функции //аботы с дисковым носителем по запросу //ользователя (вызов этой системной программы //з буфера таблицы резидента BIOS, находящегося // базовой части оперативной памяти, через //рерывание INT 13h) PUSH ESP //адействовать регистрESP для дальнейших действий POP EDI //егистрEDI оставить свободным для фиксации //оррекция управляющего регистра PUSH EAX //адействовать нужные PUSH EBP //егистры. MOV EBP,ESP MOV EAX, [BP+4] //адействовать блок IP для MOV EAX, 0000H //ave_ip //ормирования стёка в памяти. MOV EAX, [BP+6] //адействовать регистр CS для MOV EAX, 0000H //ave_cs //омирования стёка буфера. POP EBP //свободить нужные регистры, POP EAX //тобы затем их запустить, с PUSHF //оевыми параметрами. PUSH EDI PUSH ESI PUSH DS PUSH ES PUSH EBX PUSH ECX PUSH EDX PUSH EAX //ока, в программе не определены значения флагов старших //егистров AH иEAX занятых процессором, их использовать // командах нельзя. MOV EAX, CS MOV DS,EAX //-------------- DRIVE (DL) ------------------ //пределение типа дискового накопителя CMP DL, 00h //Диск A: ? (DL=00) JNE Chk1 //Процедура выяснения дступа к MOV DL, Drive JMP Drv_Exit //запросов, проверяется доступ к диску. Chk1: MOV DL, Drive_A //устройству. С помощи системных CMP DL, 01h //Диск B: ? JNE Chk2 MOV DL, Drive_B JMP Drv_Exit Chk2: CMP DL, 80h //Диск C: ? JNE Chk3 MOV DL, Drive_C JMP Drv_Exit Chk3: CMP DL, 81h //Диск D: ? JNE Chk4 MOV DL, Drive_D JMP Drv_Exit Chk4: CMP DL, 82h //Диск E: ? JNE Chk5 MOV DL, Drive_E JMP Drv_Exit Chk5: CMP DL, 83h //Диск F: ? JNE ChkX MOV DL, Drive_F JMP Drv_Exit ChkX: CMP DL, Free_Disk //Диск X: ? JNE Drv_Exit MOV DL, Drive_X //--------------SIDE (DH) ------------ //азмер данного дискового носителя (DH). Drv_Exit: MOV AH, DH //аксимальная ёмкость диска. //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BA37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BA2 BA37: ADD AH, 37h BA2: MOV DH, Side1 //ежим чтения пиксильного кода. MOV AH, DH //роцедура считывания байтов в регистре DH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AA37 ADD AH, 30h JMP AA1 AA37: ADD AH, 37h AA1: MOV DH, Side2 //--------------TRACK NO. (CH)---------- //роцедура чтения дорожки с носителя (CH). MOV AH, CH //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BB37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BB2 BB37: ADD AH, 37h BB2: MOV CH, Track1 MOV AH, CH //роцедура считывания байтов в регистре CH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AB37 ADD AH, 30h JMP AB1 AB37: ADD AH, 37h AB1: MOV CH, Track2 //---------------SECTOR NO. (CL)--------- //роцедура чтения кластера с носителя (CL). MOV AH, CL //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BC37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BC2 BC37: ADD AH, 37h BC2: MOV CL, Sector1 MOV AH, CL //роцедура считывания байтов в регистре CL в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AC37 ADD AH, 30h JMP AC1 AC37: ADD AH, 37h AC1: MOV CL, Sector2 //---------------NO. OF SECTORS (AL)------- //Количество читаемых кластеров с диска (AL). //Чтения кода ASCII-символов. Процедура считывания в память //байтов в регистре AH с определения соответствующего //кода ASCII, каждого из них. AND AH, 11110000B //Маска для 4-х битной ячейки. SHR AH, 01 //Позиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BD37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BD2 BD37: ADD AH, 37h BD2: MOV EAX, 0000H //FFSET Sec_Cnt1 //Число читаемых секторов, //определяемых в регистре AL. //Если в запросе прерывания INT 13h указана функция 17h, то //переходим на неё. CMP AL, 17 //Ecли в регистре AL указана функция. JE ParmFloppy //17h, то переходим на соотв. подпрограмму. //Если нет, то перекладываем содержимое регистра AL в регистр //счётчикаECX. MOV CL, AL //Переложить число заданных секторов. MOV CH, CL //из регистра AL в регистр счётчикаECX. PUSH ECX //роцедура считывания байтов в регистре AL в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AD37 ADD AH, 30h JMP AD1 AD37: ADD AH, 37h AD1: MOV EAX, 0000H //FFSET Sec_Cnt2 //-------------OPERATION TYPE (AH)----------------- //00:reset 01:read status 02:read sectors 03:write sec. //04:scan ofedisky 05:format //ипы операций при работе с физическим диском (AH). //ункция 00h: Определение доступа к устройству. //ункция 01h: Определение параметров физического диска. //ункция 02h: Чтение данных с физического диска. //ункция 03h: Запись данных на физический диск по абсолютному // адресу (Диск, кластер, сектор, сторона). //ункция 04h: Сканирование диска на читаемость и выявление // диффектных секторов. //ункция 05h: Форматирование физического диска с целью // повторного использования для новых записей. //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BE37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BE2 BE37: ADD AH, 37h BE2: //OV CS: Opt_1, AH CMC //одготовить буфер к новому заполнению //Определить какая функция системной программы //была затребована пользователем, вмести с вызовом //прерывания INT 13h CMP AH, 00h JE FunExec0 CMP AH, 01h JE FunExec1 CMP AH, 02h JE FunExec2 CMP AH, 03h JE FunExec3 CMP AH, 04h JE FunExec4 CMP AH, 05h JE FunExec5 //--------------Functional INT 13h----------------------- //роцедуры выполнения функций прерывания INT 13h FunExec0: MOV AL, BL //Переложить содержимое регимтраEBX в MOV EAX,EBX //регистр AL //еперь выясним, с накопителем какого типа, мы имеем дело. CMP DL, 00h JE DrvFnct0_1 CMP DL, 01h JE DrvFnct0_2 CMP DL, 80h JE DrvFnct0_3 CMP DL, 81h JE DrvFnct0_4 CMP DL, 82h JE DrvFnct0_5 CMP DL, 83h JE DrvFnct0_6 CMP DL, Free_Disk JE DrvFnct0_7 //Определение типов дискового накопителя: DrvFnct0_1: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 DrvFnct0_2: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 DrvFnct0_3: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 DrvFnct0_4: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 DrvFnct0_5: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 DrvFnct0_6: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 DrvFnct0_7: MOV EDX, 0000h //Читаем скан-код произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h //Читаем порт произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 0000h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options1 //перация подготовки диска к вводу-выводу Options1: PUSH ECX //адействовать регистр СX. db 236 //N EAX,EDX //ывести данные с порта нашего устройства. CMPSB db 236 //N EAX,EDX SCASB db 236 //N EAX,EDX CLD //ыводить вперёд. REP STOSB //ывод с устройства. POP EAX POP EDX CMC //одготовить буфер к новому заполнению TEST ESP,EDI //OV BYTE PTR ES:[DI], 0 JMP FindDrv FunExec1: MOV AL, BL //Переложить содержимое регимтраEBX в MOV EAX,EBX //регистр AL //еперь выясним, с накопителем какого типа, мы имеем дело. CMP DL, 00h JE DrvFnct1_1 CMP DL, 01h JE DrvFnct1_2 CMP DL, 80h JE DrvFnct1_3 CMP DL, 81h JE DrvFnct1_4 CMP DL, 82h JE DrvFnct1_5 CMP DL, 83h JE DrvFnct1_6 CMP DL, Free_Disk JE DrvFnct1_7 //Определение типов дискового накопителя: DrvFnct1_1: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 DrvFnct1_2: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 DrvFnct1_3: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 DrvFnct1_4: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 DrvFnct1_5: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 DrvFnct1_6: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 DrvFnct1_7: MOV EDX, 0000h //Читаем скан-код произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h //Читаем порт произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 0000h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options2 //перация определения статуса дискового накопителя Options2: PUSH ECX db 238 //UT EDX,EAX CMPSB db 238 //UT EDX,EAX SCASB db 238 //UT EDX,EAX CLD REP STOSB POP EAX POP EDX CMC //одготовить буфер к новому заполнению TEST ESP,EDI //OV BYTE PTR ES:[DI], 0 JMP FindDrv FunExec2: MOV AL, BL //Переложить содержимое регимтраEBX в MOV EAX,EBX //регистр AL //еперь выясним, с накопителем какого типа, мы имеем дело. CMP DL, 00h JE DrvFnct2_1 CMP DL, 01h JE DrvFnct2_2 CMP DL, 80h JE DrvFnct2_3 CMP DL, 81h JE DrvFnct2_4 CMP DL, 82h JE DrvFnct2_5 CMP DL, 83h JE DrvFnct2_6 CMP DL, Free_Disk JE DrvFnct2_7 //Определение типов дискового накопителя: DrvFnct2_1: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 DrvFnct2_2: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 DrvFnct2_3: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 DrvFnct2_4: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 DrvFnct2_5: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 DrvFnct2_6: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 DrvFnct2_7: MOV EDX, 0000h //Читаем скан-код произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h //Читаем порт произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 0000h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options3 //перация, чтения данных с дискового накопителя Options3: PUSH ECX //адействовать регистр СX. db 236 //N EAX,EDX //ывести данные с порта нашего устройства. db 236 //N EAX,EDX CLD //ыводить вперёд. REP STOSB //ывод с устройства. POP EAX POP EDX CMC //одготовить буфер к новому заполнению TEST ESP,EDI //OV BYTE PTR ES:[DI], 0 JMP FindDrv FunExec3: MOV AL, BL //Переложить содержимое регимтраEBX в MOV EAX,EBX //регистр AL //еперь выясним, с накопителем какого типа, мы имеем дело. CMP DL, 00h JE DrvFnct3_1 CMP DL, 01h JE DrvFnct3_2 CMP DL, 80h JE DrvFnct3_3 CMP DL, 81h JE DrvFnct3_4 CMP DL, 82h JE DrvFnct3_5 CMP DL, 83h JE DrvFnct3_6 CMP DL, Free_Disk JE DrvFnct3_7 //Определение типов дискового накопителя: DrvFnct3_1: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 DrvFnct3_2: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 DrvFnct3_3: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 DrvFnct3_4: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 DrvFnct3_5: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 DrvFnct3_6: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 DrvFnct3_7: MOV EDX, 0000h //Читаем скан-код произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h //Читаем порт произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 0000h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options4 //перация, записи данных на дисковой накопитель Options4: PUSH ECX //адействовать регистр СX. db 238 //UT EDX,EAX //аписать данные в порт нашего устройства. db 238 //UT EDX,EAX CLD //водить вперёд. REP MOVSB //вод на устройство. POP EAX POP EDX CMC //одготовить буфер к новому заполнению TEST ESP,EDI //OV BYTE PTR ES:[DI], 0 JMP FindDrv FunExec4: MOV AL, BL //Переложить содержимое регимтраEBX в MOV EAX,EBX //регистр AL //еперь выясним, с накопителем какого типа, мы имеем дело. CMP DL, 00h JE DrvFnct4_1 CMP DL, 01h JE DrvFnct4_2 CMP DL, 80h JE DrvFnct4_3 CMP DL, 81h JE DrvFnct4_4 CMP DL, 82h JE DrvFnct4_5 CMP DL, 83h JE DrvFnct4_6 CMP DL, Free_Disk JE DrvFnct4_7 //Определение типов дискового накопителя: DrvFnct4_1: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 DrvFnct4_2: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 DrvFnct4_3: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 DrvFnct4_4: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 DrvFnct4_5: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 DrvFnct4_6: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 DrvFnct4_7: MOV EDX, 0000h //Читаем скан-код произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h //Читаем порт произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 0000h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options5 //перация, сканирования данных с дискового накопителя Options5: PUSH ECX //адействовать регистр СX. db 236 //N EAX,EDX //ывести данные с порта нашего устройства. STOSB db 236 //N EAX,EDX STOSB db 236 //N EAX,EDX STOSB db 236 //N EAX,EDX CLD //ыводить вперёд. REP STOSB //ывод с устройства. POP EAX POP EDX CMC //одготовить буфер к новому заполнению TEST ESP,EDI //OV BYTE PTR ES:[DI], 0 //OV BYTE PTR ES:[DI], 0 JMP FindDrv FunExec5: MOV AL, BL //Переложить содержимое регимтраEBX в MOV EAX,EBX //регистр AL //еперь выясним, с накопителем какого типа, мы имеем дело. CMP DL, 00h JE DrvFnct5_1 CMP DL, 01h JE DrvFnct5_2 CMP DL, 80h JE DrvFnct5_3 CMP DL, 81h JE DrvFnct5_4 CMP DL, 82h JE DrvFnct5_5 CMP DL, 83h JE DrvFnct5_6 CMP DL, Free_Disk JE DrvFnct5_7 //Определение типов дискового накопителя: DrvFnct5_1: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 DrvFnct5_2: MOV EDX, 3F0h //Читаем скан-код флоппи-дисковода в порт 3F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h //Читаем порт флоппи-дисковода. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 3F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 3F0h db 238 //UT EDX,EAX //Восстановили байт в порту 3F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 DrvFnct5_3: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 DrvFnct5_4: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 DrvFnct5_5: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 DrvFnct5_6: MOV EDX, 1F0h //Читаем скан-код жёсткого диска в порт 1F0h. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h //Читаем порт жёсткого диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 1F1h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 1F0h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 DrvFnct5_7: MOV EDX, 0000h //Читаем скан-код произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h //Читаем порт произвольного диска. db 236 //N EAX,EDX STOSB //Фиксируем досту к порту устройства. MOV EDX, 0000h db 238 //UT EDX,EAX //Подтверждаем факт приёма скан-кода. MOV EDX, 0000h db 238 //UT EDX,EAX //Восстановили байт в порту 1F1h CLD MOVSB //Фиксируем вывод с порта JMP Options6 //перация форматирования дискового накопителя. Options6: PUSH ECX //Задействовать регистр СX. db 238 //UT EDX,EAX //Вывести сигналы о форматировании устройства //на его порт. MOVSB db 238 //UT EDX,EAX MOVSB db 238 //UT EDX,EAX MOVSB db 238 //UT EDX,EAX CLD //ыводить вперёд. REP MOVSB //ывод на устройства. POP EAX POP EDX CMC //одготовить буфер к новому заполнению TEST ESP,EDI //OV BYTE PTR ES:[DI], 0 JMP FindDrv //-------------------------------------------------------- //Подпрограмма определения параметров, подсоединённого к //к компьтера, гибкому дисководу. //-------------------------------------------------------- ParmFloppy: MOV EBP,EAX MOV EAX, ES //Определим, какая функция указанная в регистре //AL нам нужна, для определения настроек работы //нашего гибкого дисковода. CMP AL, 0 JE PrmFlpp0 CMP AL, 1 JE PrmFlpp1 CMP AL, 2 JE PrmFlpp2 CMP AL, 3 JE PrmFlpp3 CMP AL, 4 JE PrmFlpp4 CMP AL, 5 JE PrmFlpp5 //пределение параметров гибкого диска //а 160 Кб. PrmFlpp0: MOV AL, 00h //ункция запроса - 00h MOV ECX, 6 //казатель параметра. MOV EBX, Birky //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 38 //оличество дорожек - 38 MOV ECX, 1280 //оличество секторов - 1280 MOV CL, 128 //оличество байт в одном секторе MOV EDX, Sct //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sct db 128 Dup (?) //ctLen = $ - Sct REP STOSB //ставить в памяти нужный параметр диска JMP FloppyExit Birky db "FAT 12" //пределение параметров гибкого диска //а 360 Кб, на дисководе без фоматирования //а 360 KB. PrmFlpp1: MOV AL, 01h //ункция запроса - 01h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Birky //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 19 //оличество дорожек - 19 MOV ECX, 640 //оличество секторов - 2560 MOV CL, 32 //оличество байт в одном секторе MOV EDX, Sct1 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sct1 db 128 Dup (?) REP STOSB //равнивание загруженных сведений JMP FloppyExit //пределение параметров гибкого диска //а 360 Кб, на дисководе с фоматированием //а 1,2 Мб. PrmFlpp2: MOV AL, 02h //ункция запроса - 02h MOV ECX, 6 //казатель параметра. MOV EBX, Birky2 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 38 //оличество дорожек - 38 MOV ECX, 1280 //оличество секторов - 1280 MOV CL, 00FFh //оличество байт в одном секторе - 256 MOV EDX, Sct2 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sct2 db 256 Dup (?) REP STOSB //равнивание загруженных сведений JMP FloppyExit Birky2 db "FAT 12" //пределение параметров гибкого диска //а 1,2 Мб, на дисководе с фоматированием //а 1,2 Мб. PrmFlpp3: MOV AL, 03h //ункция запроса - 03h MOV ECX, 6 //казатель параметра. MOV EBX, Birky3 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 76 //оличество дорожек - 76 MOV ECX, 2560 //оличество секторов - 2560 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, Sct3 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sct3 db 512 Dup (?) REP STOSB //равнивание загруженных сведений JMP FloppyExit Birky3 db "FAT 12" //пределение параметров гибкого диска //а 720 Кб. на дисководе без форматирования //а 1,44 Мб. PrmFlpp4: MOV AL, 04h //ункция запроса - 04h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Birky //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 40 //оличество дорожек - 40 MOV ECX, 1423 //оличество секторов - 1423 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, Sct4 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sct4 db 512 Dup (?) REP STOSB //равнивание загруженных сведений JMP FloppyExit //пределение параметров гибкого диска //а 1,44 Мб. на дисководе c форматированием //а 1,44 Мб. PrmFlpp5: MOV AL, 05h //ункция запроса - 05h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Birky //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 40 //оличество дорожек - 40 MOV ECX, 1423 //оличество секторов - 1423 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, Sct5 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sct5 db 512 Dup (?) REP STOSB //равнивание загруженных сведений JMP FloppyExit FloppyExit: FindDrv: POP EAX PUSH EBX //роцедура считывания байтов в регистре AH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AE37 ADD AH, 30h JMP AE1 AE37: ADD AH, 37h AE1: //OV CS: Opt_2, AH MOV EAX, OFFSET atd MOV EDX, OFFSET atd TEST EDX,EAX //озврат в адрес блока основной программы CS:IP MOV EAX, 0000H //ave_ip //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BF37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BF2 BF37: ADD AH, 37h BF2: MOV EAX, 0000H //ip_1 MOV EDX, 0000H //ave_ip //роцедура считывания байтов в регистре AH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AF37 ADD AH, 30h JMP AF1 AF37: ADD AH, 37h AF1: MOV EAX, 0000H //p_2 MOV EDX, 0000H //ave_ip XCHG AH, AL //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BH37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BH2 BH37: ADD AH, 37h BH2: MOV EAX, 0000H //p_3 MOV EDX, 0000H //ave_ip XCHG AH, AL //роцедура считывания байтов в регистре AH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AH37 ADD AH, 30h JMP AH1 AH37: ADD AH, 37h AH1: MOV EAX, 0000H //p_4 MOV EDX, 0000H //ave_cs //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BG37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BG2 BG37: ADD AH, 37h BG2: MOV EAX, 0000H //s_1 MOV EDX, 0000H //ave_cs //роцедура считывания байтов в регистре AH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AG37 ADD AH, 30h JMP AG1 AG37: ADD AH, 37h AG1: MOV EAX, 0000H //s_2 MOV EDX, 0000H //ave_cs XCHG AH, AL //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BI37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BI2 BI37: ADD AH, 37h BI2: MOV EAX, 0000H //s_3 MOV EDX, 0000H //ave_cs XCHG AH, AL //роцедура считывания байтов в регистре AH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AI37 ADD AH, 30h JMP AI1 AI37: ADD AH, 37h AI1: MOV EAX, 0000H //s_4 //свободить все ранее занятые регистры. POP EAX POP EDX POP ECX POP EBX POP ES POP DS POP ESI POP EDI POPF //агрузив значения флагов CS и IP подготавливаем рабочий стёк //амяти, для последующего выхода из системного обработчика //NT 13h. PUSHF PUSH CS //скать IP на поиск продолжения выполнения данной процедуры. //агрузить окружение для стандартного вектора обработчика INT 13h. PUSHF MOV ECX, 0000H + 2 //edef13h + 2 //"CS" с INT 13h блокировки. MOV ECX, 0000H //edef13h //"IP" с INT 13h блокировки. //езультат работы системной подпрограммы INT 13h вызова. PUSHF PUSH EAX //охранить данное значение регистра. //тения кода ASCII-символов. Процедура считывания в память //айтов в регистре AH с определения соответствующего //ода ASCII, каждого из них. AND AH, 11110000B //аска для 4-х битной ячейки. SHR AH, 01 //озиция просматривания каждого бита. SHR AH, 01 SHR AH, 01 SHR AH, 01 //По 8 бит = 1 байт. CMP AH, 0Ah //Значение просмотра от 0 до 9. JNB BJ37 //Если код равен от 0Ah до 0Fh, то ADD AH, 30h //значение 30h в коде ASCII не создаётся. JMP BJ2 BJ37: ADD AH, 37h BJ2: MOV AH, Status1 POP EAX PUSH EAX //роцедура считывания байтов в регистре AH в том //лучае, если носитель не читается. AND AH, 00001111B //аска для 4-х битов. CMP AH, 0Ah JNB AJ37 ADD AH, 30h JMP AJ1 AJ37: ADD AH, 37h AJ1: MOV AH, Status2 POP EAX INC ESI POP ESI POP EDX POP ECX POP EAX GoBack: POPF //роцедура установки программы в память. Inst_Int13: MOV EAX, 0 MOV ES,EAX MOV EDI, 1304h //nt13Loc //охранить старый вектор. MOV EAX,EDI // Прерывание INT 13h MOV EBX,EDI // Вектор MOV ESI, Int13h_vect // " MOV [SI],EAX // " MOV [SI+2],EBX // " MOV EAX, 0 MOV ES,EAX MOV EBX, DS CLI //апретить прерывания. MOV EDI, 1304h //nt13Loc //адействовать INT 13h .... MOV EAX, Int13h_vect // Вектор... MOV EDI,EAX // Поиск... MOV EDI,EBX // прикладных программ. STI //азрешить прерывания. //окинуть обработчик с выходом в систему. RET //окинуть обработчик INT 13h с выходом // текущею операционную систему. //eadDisk ENDP //ntr13hLen = $ - Intr13h //онец подпрограммы обработчика INT 13h //истемная программа INT 14h ReadPort: CLI //апретить прерывания PUSHF //oxpaнить флaги для команды IRET //роцедура IOS инициализации программы прерывания 14Н MOV EDX,1F14h MOV ESP,08 //OV WORD PTR [DI-08],ECX //OV WORD PTR [SI+08],EBX //ока, в программе не определены //начения флагов старших регистров //H иEAX занятых процессором, их //спользовать в командах нельзя. MOV EDX, OFFSET IntVect2 TEST EDX, 14h INC EDX //еред тем, как начать распознавание //начений занятых флагов старших //егистров AH иEAX, произвести вербовку //ектора прерывания INT 14h и занести его // соответствующий адрес сегментного //уфера оперативной памяти. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV BL, 14h //ектор прерывания заносимый в буфер CLD //аполнять вперёд REP STOSB //аполнение //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //ачать процедуру распознавания функции //аботы с дисковым носителем по запросу //ользователя (вызов этой системной программы //з буфера таблицы резидента BIOS, находящегося // базовой части оперативной памяти, через //рерывание INT 14h) PUSH EAX //адействовать регистрEAX //ля дальнейших действий POP EBX //егистрEBX оставить //вободным для фиксации //казание на мнимый флаг AH илиEAX, //ри отсутствии ясной фиксации управлящей //рограммы процессора AAS //одсчитаем, что занятый флаг AH илиEAX //уществует в любом случае, как-бы то //ибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB PUSH EAX //оррекция управляющего регистра //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая функция системной программы //ыла затребована пользователем, вмести с вызовом //рерывания INT 14h CMP AH, 00h JE RestPrt0 CMP AH, 01h JE RestPrt1 CMP AH, 02h JE RestPrt2 CMP AH, 03h JE RestPrt3 CMP AH, 04h JE RestPrt4 CMP AH, 05h JE RestPrt5 CMP AH, 06h JE RestPrt6 CMP EAX, 07h JE RestPrt7 //одпрограммы вызова соответствующих функций, которые были //атребованы пользователем, вмести с вызовом прерывания //NT 14h, регистрации их векторов процессором и фиксации, //х кодов действия, для выполнения поставленных задач. RestPrt0: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv0 //оступ к порту COM1 INC WORD PTR CS: PortDrv0 PUSH WORD PTR PortDrv0 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt1: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv1 //оступ к порту COM2 INC WORD PTR CS: PortDrv1 PUSH WORD PTR PortDrv1 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt2: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv2 //оступ к порту COM3 INC WORD PTR CS: PortDrv2 PUSH WORD PTR PortDrv2 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt3: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv3 //оступ к порту COM4 INC WORD PTR CS: PortDrv3 PUSH WORD PTR PortDrv3 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt4: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv4 //оступ к порту LPT1 INC WORD PTR CS: PortDrv4 PUSH WORD PTR PortDrv4 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt5: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv5 //оступ к порту LPT2 INC WORD PTR CS: PortDrv5 PUSH WORD PTR PortDrv5 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt6: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv6 //оступ к порту USB1 INC WORD PTR CS: PortDrv6 PUSH WORD PTR PortDrv6 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG AL, BH //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort RestPrt7: MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV EDX, OFFSET PortDrv7 //оступ к порту USB2 INC WORD PTR CS: PortDrv7 PUSH WORD PTR PortDrv7 MOV EBX, OFFSET BytClast2 //агрузка буфера памяти. XCHG BH, AL //ткуда брать данные MOV EAX,ESI //роизвольного доступа. MOV ECX, 1024 //12 - число байтов в сегменте. //айтовый принцеп: по 8 db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // db 236 //N EAX,EDX // CLD //аправляем байты вперёд. REP STOSB //иксация прочитанного в памяти. XCHG BH, AL //occтановить прежднее значение регистра. POP ECX //осстановитьECX, перед новой операцией. //аполнить последний байт массива, для контроля. //OV BYTE PTR ES:[DI], 0 JMP FindPort //пределить флаг регистра AL. Он определяет какую функцию //адо выполнять при работе с заданным портом: чтение, запись //ли же отказаться от доступа к нему (если, нет подключения). FindPort: CMP AL, 0 JE PrtRd //сли флаг = 0, значит чтение. CMP AL, 1 JE PrtWrt //сли флаг = 1, значит запись. JG Quit3 //сли флаг > 1, то выход из //одпрограммы. //Стандартная процедура доступа, при чтении данных //с заданного порта. PrtRd: //роцедура чтения с порта. DEC EDX DEC EDX //EG (xF8) SUB AH,AH db 236 //N AL,EDX //тение данных с порта. MOV EBX, OFFSET COM1EPTR MOV EDX,EBX INC EBX CMP EBX, OFFSET COM1ENDB //оступ закрыт? JNE ISR0220 //ет. Значит, можно преступить к //ыполнению данной процедуры. MOV EBX, OFFSET COM1STRT ISR0220: CMP EBX, OFFSET COM1SPTR //роверим, есть ли переполнение буфера памяти. JE ISR0240 //а. Буфер переполнен. MOV EBX, OFFSET COM1EPTR MOV EBX,EDX MOV [BX],AL OR AH,1 JMP ISR0280 //ора, на выход. ISR0240: OR AH, 10H ISR0280: OR AH, 60H JMP PrtCnt //ереход на секцию общих операций. //Стандартная процедура доступа, при записи данных //на заданный порт. PrtWrt: //роцедура записи на порт. MOV AH,40H MOV EBX, OFFSET OUT1SPTR CMP EBX, OFFSET OUT1EPTR //е закрыт ли доступ? JE ISR0480 //акрыт. Значит надо на выход. DEC EDX DEC EDX //EG (xF8) MOV EAX,EBX db 238 //UT EDX,EAX //апись данных на порт. INC EBX CMP EBX, OFFSET OUT1ENDB //оли значение во флаге? JNE ISR0420 //ет, значит одну из положенных команд, MOV EBX, OFFSET OUT1STRT //адо пропустить. ISR0420: MOV EDX, OFFSET OUT1SPTR OR AH,20H CMP EBX, OFFSET OUT1EPTR //оли значение во флаге? JE ISR0480 //ет, значит одну из положенных команд, //адо пропустить. AND AH,10111111B ISR0480: OR AH, 60h //OM1LINE //одпрограмма доступа к дисковому накопителю, //одсоединённого к последовательному или //араллейному порту и определения его типа. //пределяет тип и размер дискового накопителя, //одсоединённого к последовательному порту. //ORTY PROC //агрузка в буфер резидента управляющей программы PrtCnt: MOV ECX, 0264h MOV EDX, OFFSET PortSys CLD REP MOVSB //иксация в памяти //oxpaнитьEAX прерваной программы PUSH EAX IN AL, 0Ah //едомое устройство CMP AL, 0 //олевое определение устройства ? POP EAX //осстановитьEAX // перейти в системный обработчик MOV EDX, OFFSET Old_Port //режде всего следует выполнить определённые действия, // порте (20h) ведомого программного интерфейса. MOV EAX, OFFSET PortSys XCHG AH, AL OUT 20h, AL IN AL, 20h //ействия по приёму системных запросов PUSH EBP MOV EBP,ESP //агрузить адрес аварийного завершения в стёк, на место //ормального адреса возврата. Стёк сейчас смещён, //тносительно адреса возврата, на 2 слова (командами //USHEAX и PUSHEBP) //OV WORD PTR 4[BP], Old_Port POP EBP //occтановитьEBP //сновная программа инициализации прерывания INT 14h. PUSH EBX PUSH ECX PUSH EDX PUSH ESI PUSH ES PUSH DS //охранить регистры для дальнейших MOV EBX,CS //пераций. MOV DS,EBX //оздать сегмент текущей адресации. MOV ESI,EDX //S232 указание на значение регистраESI. SHL ESI,1 //агружаемое слово. MOV EBX,40H //дресация базовой области. MOV ES,EBX //истемный регистр в регистр данных. MOV EDX, OFFSET RS232_BASE //агрузка RS232 в регистр адреса. OR EDX,EDX //ест для не резидентной части. JE ISR1000 //ереход на секцию работы. MOV BL,AH //агрузка команды из 2-х байт. SUB BH,BH //двоение значения регистра BH. CMP EBX, 0202h //оли значение регистра? JGE Quit3 //ет, не то. SHL EBX,1 //войное значение, для истинной комбинации. MOV EBX, OFFSET Option0 //OUTINES //агрузка системной подпрограммы из регистраEBX. ISR1000: STI //азрешить прерывания PUSH ESI //ариант 1 MOV ESI,0 JMP SHORT ISR0100 //ыстрый переход на новый уровень. ISR2000: STI //азрешить прерывания. PUSH ESI //ариант 2 MOV ESI,2 //Активизировать занятие регистры. ISR0100: PUSH EAX //охранить значение регистров. PUSH EBX PUSH ECX PUSH EDX PUSH DS //одпрограмма HALFSTAT. CLI //апретить прерывания MOV AH,60h //OM1LINE MOV BH,AH AND BH,01100001B MOV BH,60h //OM1LINE STI //азрешить прерывания. //Установка базового окружения операторов доступа //к параллейному или последовательному порту. MOV EAX,40H MOV DS,EAX MOV EDX,ESI MOV EAX,CS MOV DS,EAX ISR0120: MOV EDX, OFFSET COMMBASE INC EDX INC EDX db 236 //N AL,EDX TEST AL,1 //оли значение флага регистра? JNZ ISR0140 //ет. Не то, значит надо переходить на CBW //овый уровень. MOV ECX, 8 //азмер загружаемого массива. MOV EBX,EAX MOV EBX, 0000H //SRTABLE //агрузка данных в регистрEBX. JMP ISR0120 //сли, значение то, значит заданный цикл //адо ещё раз повторить. //Процедура завершения работы обработчика с выходом //в основную программу. ISR0140: CLI //апретить прерывания. MOV AL,20H OUT 20H,AL STI //азрешить прерывания. //Инициализация пробной записи на порт. //Подпрограмма COMMAND0 PROC NEAR MOV AH,AL //ереписать значение в старший регистр. ADD EDX,03 //казание линии управления регистром (xFB). MOV EAX,0080H //ткрыть нужное значение. db 238 //UT EDX,EAX //кружение = 1. //Процедура установки нужного значения, регистраEBX. MOV BL,AH MOV CL,04 ROL BL,CL AND EBX,0EH MOV ECX,0016H MOV EBX, 1047H //AUDTABL //Установка окружения бата 8250 SUB EDX,2 //SB (xF9) MOV AL,BH db 238 //UT EDX,EAX DEC EDX //SB (xF8) MOV AL,BL db 238 //UT EDX,EAX //Инициализация окружения для остановки бата 8250 ADD EDX,3 //EG (xFB) MOV AL,AH AND AL,00011111B db 238 //UT EDX,EAX //Разрешение значения бата 8250 для прерывания. INC EDX //EG (xFC) MOV AL,00001101B db 238 //UT EDX,EAX SUB EDX,3 //EG (xF9) MOV AL,00001111B db 238 //UT EDX,AL //Процедура чтения данных с задействованного порта IRQ. DEC EDX //EG (xF8) db 236 //N AL,EDX INC EDX INC EDX //IR (xFA) db 236 //N AL,EDX ADD EDX,3 //EG (xFD) db 236 //N AL,EDX INC EDX //SR (xFE) db 236 //N AL,EDX AND AL,11110000B MOV ESI, 00h //OM1MODM MOV EDI,ESI MOV AL, 60H MOV ESI, 60h //OM1LINE //Включение буфера инициализации для смещения порта IRQ. MOV EBX, OFFSET COM1STRT //ересылка для чтения (IN) с порта. MOV ESI,EBX MOV EBX, OFFSET COM1EPTR MOV ESI, 00h //ересылка для записи (OUT) на порт. MOV EDX, OFFSET OUT1SPTR MOV ESI,EBX //Разрешить использование IRQ для включения бата 8259 в //в контроллер прерывания. MOV ECX,ESI //агрузить значение в адаптер. SHR CL,1 //оздать значение 0 или 1 NEG CL //оздать 0 или -1 (-1 = COM2) ADD CL,4 //становка замены значения от 3 до 4 (COM1=4) MOV AH,0FEH //становка типа маски. ROL AH,CL //азрешение включения бата 8259 для прерывания. CLI //апретить прерывания. IN AL,21H //агрузка нужной маски байта. AND AL,AH //азрешить бат 8259 для текущего прерывания. OUT 21H,AL //роизводить запись на ведущий контороллер. STI //азрешить прерывания. //Возврат в 2-х байтовый стёк входа начальной установки. //Процедура определения статуса доступа к порту, перед закрытием. //Подпрограмма COMMAND3 PROC NEAR CLI //апретить прервания. MOV AL,00h //OM1MODM MOV BL,AL AND AL,10110000B MOV ESI,0202h //OM1MODM MOV AH,BL MOV BH,AH AND BH,01100001B MOV ESI, 00h //OM1LINE STI //азрешить прерывания. MOV AL,BL //Подрограмма окончания операций с текущим контроллером порта. //Подпрограмма COMMAND1 PROC NEAR MOV BH,AL //охранить данные текущего регистра. //Отключение основного доступа к порту. ADD EDX,4 //EG (xFC) db 236 //N AL,EDX OR AL,03 db 238 //UT EDX,AL //CR //Конец текущих операций с заданным буфером памятию MOV AH,80H //Процедура окончания записи на порт перед закрытием, по //времени текущей операции. //Подрограмма WAITDSR. MOV EBX, OFFSET RS232_TIM_OUT SUB ECX,ECX //аданный круговой цикл. WAIT100: MOV AL,00h //OM1MODM AND AL,30H CMP AL,30H //аше значение флага = 30. JE WAIT200 //а, значение флага 30, значит на выход. MOV ECX,1024 //оличество раз - 1024 //OOP WAIT100 //аш заданный цикл (отм. команда). DEC BL JNZ WAIT100 //сли ожидание больше по времени. STC WAIT200: JC COM0295 //сли носитель бракованный и данные // него не читаются. MOV EBX, OFFSET RS232_TIM_OUT SUB ECX,ECX COM0220: TEST ESI,60h //OM1LINE JNZ COM0230 //а. Переходим на выполнение нужной //перации. //OOP COM0220 //икл по 65536 раз (отм. команда) DEC BL JNZ COM0220 //сли наше значение, ещё не достигнуто. JMP SHORT COM0295 //олевое значение = ошибка записи во времени. COM0230: MOV AL,BH //овое значение флага AL. CLI //апретить прерывания. TEST ESI,60h //OM1LINE JNZ COM0260 //ет. Значение лимита буффера ниже 40-ка. //Если с чтением из буфера, всё в порядке. MOV EBX, OFFSET OUT1EPTR MOV BH,AL INC EBX CMP EBX, 0000h //UT1ENDB JNE COM0240 //ет. Доступ к устройству, пока //меется. MOV EBX,OFFSET OUT1STRT COM0240: CMP EBX,0000h //UT1SPTR //равнить значения буффера. JNE COM0250 //ет, у нас здесь всё нормально. OR EDX,EBX COM0250: STI //азрешить прерывания. MOV EBX, OFFSET OUT1EPTR JMP SHORT COM0290 //ереход на выполнение заданной //роцедуры. //Завершиние процедуры закрытия доступа //к заданному порту. COM0260: AND ESI,10111111B //TRT ISR. STI //азрешить прерывания. SUB EDX,4 //MIT (xF8) db 238 //UT EDX,AL COM0290: //одпрограмма HALFSTAT. CLI //апретить прерывания MOV AH,60h //OM1LINE MOV BH,AH AND BH,01100001B MOV BH,60h //OM1LINE STI //азрешить прерывания. COM0295: //Процедура прямого доступа к порту. //Подпрограмма COMMAND2 PROC NEAR MOV EBX, OFFSET RS232_TIM_OUT SUB ECX,ECX COM0320: TEST ESI,1 JNZ COM0340 //а. Цикл повторения возможен. //OOP COM0320 //икл повторения заданной операции. //икл по 65536 раз (отм. команда) DEC BL JNZ COM0320 //сли нужное значение флага, не достигнуто. //одпрограмма HALFSTAT. CLI //апретить прерывания MOV AH,60h //OM1LINE MOV BH,AH AND BH,01100001B MOV BH,60h //OM1LINE STI //азрешить прерывания. OR AH,80H JMP SHORT COM0390 //ереход на окончание заданной процедуры. COM0340: //одпрограмма COMMAND4 PROC NEAR //Инициализация работы процедуры прерывания с буффером. CLI //апретить прерывания. MOV AH, 60h //OM1LINE AND ESI, 60h //OM1LINE MOV EBX, OFFSET COM1SPTR CMP EBX, 0000h //равним, то ли значение во флаге? JE COM0560 //сли то, значит на выход из //бработчика. COM0540: //Загрузка прочитанного в текущий буффер памяти. MOV AL,[BX] INC EBX CMP EBX, 0000h //OM1ENDB //тключен ли доступ ? JNE COM0550 //ет. Подключение к устройству, есть. MOV EBX,OFFSET COM1STRT COM0550: MOV EDX,EBX CMP EBX,OFFSET COM1EPTR //о ли значение доступа, какое нужно? JNE COM0580 //ет. Значит, пора на выход из обработчика. //Буфер перезаписывается, при заданном значении флага. COM0560: AND AL,60h //OM1LINE AND AH,0FEH //Выход из выполнения заданной процедуры. COM0580: STI //азрешить прерывания. //одпрограмма HALFSTAT. CLI //апретить прерывания MOV AH,60h //OM1LINE MOV BH,AH AND BH,01100001B MOV BH,60h //OM1LINE STI //азрешить прерывания. COM0390: AND AH,10011110B //Подрограмма диагностики выявления возможных //ошибок ввода / вывода. //Подпрограмма ISRLINE PROC NEAR ADD EDX,3 //EG (xFD) db 236 //N AL,EDX AND AL,00011110B OR ESI, 60H //OM1LINE //Специфическая процедура инициалилизации доступа //к модему и работы с ним. Если таковой подслединён //к параллейному порту, типа COM.x //Подпрограмма ISRMODEM PROC NEAR ADD EDX,4 //татус флага регистра для модема (xFE). db 236 //N AL,EDX //роверка доступа к заданному порту. MOV AH,AL //ересылка данных из младшего в старший регистр. AND AH,11110000B //агрузка соответствующей битовой маски. OR AL,00h //OM1MODM //льтернативная битовые маски. AND AL,01001111B OR AL,AH MOV ESI, 60H //OM1MODM //татус шины доступа системы к модему. //братиться к нестандартному дисковому накопителю //одсоединённому, через последовательный или //аралейный порт //2h - Накопитель нестандартного типа (Переносной //IP-Drive, программатор для перезипи микросхем и т.д.) PUSH EAX POP EBX MOV EAX, 77h IN EAX, 77h OUT 77h,EAX //ля нестандартного (неизвестного) типа дискового накопителя. FreePort: MOV DH, 0077h //7h - Накопитель нестандартного //неизвестного) типа. MOV EBX, 1 //искриптор занят. MOV ECX, 36 //о 36 байт. //агрузка стандартных параметров файловой системы FAT и //айтовые сигналы на устройство MOV EDX, OFFSET SizePrt //агрузка параметров. XCHG DH, DL //ереложить значение в заглавный регистр. db 236 //N EAX,EDX //осылка сигналов на устройство. db 238 //UT EDX,EAX //олучение ответных сигналов с устройства. MOV ECX, 68 //исло байт в массиве данных. MOV EDX, OFFSET SizeColn1 //агрузка параметров. XCHG DH, DL //ереложить значение в заглавный регистр. db 236 //N EAX,EDX //осылка сигналов на устройство. db 238 //UT EDX,EAX //олучение ответных сигналов с устройства. MOV ECX, 68 //исло байт в массиве данных. MOV EDX, OFFSET SizeColn2 //агрузка параметров. XCHG DH, DL //ереложить значение в заглавный регистр. db 236 //N EAX,EDX //осылка сигналов на устройство. db 238 //UT EDX,EAX //олучение ответных сигналов с устройства. MOV ECX, 68 //исло байт в массиве данных. MOV EDX, OFFSET SizeColn3 //агрузка параметров. XCHG DH, DL //ереложить значение в заглавный регистр. db 236 //N EAX,EDX //осылка сигналов на устройство. db 238 //UT EDX,EAX //олучение ответных сигналов с устройства. MOV ECX, 68 //исло байт в массиве данных. MOV EDX, OFFSET SizeColn4 //агрузка параметров. XCHG DH, DL //ереложить значение в заглавный регистр. db 236 //N EAX,EDX //осылка сигналов на устройство. db 238 //UT EDX,EAX //олучение ответных сигналов с устройства. MOV ECX, 68 //исло байт в массиве данных. MOV EDX, OFFSET SizeColn5 //агрузка параметров. XCHG DH, DL //ереложить значение в заглавный регистр. db 236 //N EAX,EDX //осылка сигналов на устройство. db 238 //UT EDX,EAX //олучение ответных сигналов с устройства. //акрузить вектор доступа к заданному //орту. POP EAX //свободить заглавный регистр PUSH ECX //адействовать счётчик байтов POP EBX //свободить внеший регистр ADD AL,00 OR EDI,15 NOP //олостая команда, для //роверки готовности //роцедура доступа к заданному порту. ADD ECX, 0000H //td4 DEC ECX DEC EAX INC EBX ADD EBP,ESI ADD EBX,EDI ADD EBP,ESI LOOPNE CntrDTk CntrDTk: INC EAX OR ESI,EAX //R Word Ptr [BX+SI],EAX ADC EBX,ESI ADD EBX,ESI ADC EBX,ESI ADD EBX,ESI ADC EBX,ESI ADD EBX,EDI SUB EBP,ESI ADC AL,2Fh PUSH ES PUSH EDX INC ECX PUSH EBX INC EBX INC EDX DEC ECX DEC EDI PUSH EBX AND EBX,ESI AND EBP,41 PUSH ESP XOR EBP,ESI AND EBX,ESI AND EBP,EDI MOV EDX, OFFSET BytClast2 MOV SS,ECX MOV ESP,7BFCh PUSH SS POP ES MOV EBP,0078 MOV ESI,0000h PUSH DS PUSH ESI PUSH SS PUSH EBP MOV EDI,0522 MOV EBP,EDI MOV EBP,ECX //еперь прочитать по байту с устройства PortKech: POP ES //осстановить сохранённые POP EAX //егистры ADD AL, "0" //реобразовать в символьную форму MOV AH, 4Eh //трибут для наглядности другой MOV EAX, 1690 MOV AL, 0Eh //игнал EOI PUSH EAX //aзрешить прерывания от контролёра дискового IN AL, 21h //рочитать текущею маску AND AL, 0FEh //бросить выборочно бит 0 OUT 0Ah, AL //ослать в регистр маски //иксирование прочитанных данных со //тандартными параметрами файловой //истемы FAT IN EAX, 0Ah MOV ECX, 0512 //азмер кластера MOV EDX, OFFSET SizePrt //исло кластеров на дорожке MOV EBX,ESI db 215 //LAT //рансляция байтов CLD REPE CMPSB //равнение //верка параметров прочитанного кластера IN EAX, 0Ah MOV EAX,8 //исло битов в байте MOV ECX,0512 //азмер кластера MOV EDX, OFFSET SizePrt //исло кластеров на дорожке CLD //равнивать вперёд REPE CMPSB //равнение //роцедура предварительной инициализации //абочих регистров Regs2: PUSH ES POP DS MOV EAX, 0008h MOV EBP, 7C00h //OV Byte Ptr [DI-02],0Fh MOV ECX, 0Fh //о 16 байтов CLD //канировать прочитанное REP MOVSB //афиксировать //роверить не повреждён-ли первый //ектор носителя Boot Master. //наче, без него информация на диске //казаться недоступной для операционной //истемы. MOV EBX, OFFSET BadSector2 IN EAX, 0Ah CMP EAX, 255 //сли, первый сектор физического диска //овреждён, то будем читать только те, //го сектора которые доступны и не повреждены. JGE DTk3 //сли, первый сектор дискового накопителя //овреждён, то будем читать только те, //го сектора которые доступны и не повреждены. //одготовиться к чтению носителя с первого //ектора и до самого последнего (произвольного //о номеру) MOV EAX,ECX CWD //ременная нейтрализация доступа SUB EBX, 3Ah MOV EAX, 7C1Ch CMP EAX, 0008h MOV DL, 04 OR DL,02 MOV EBP,02 ADD BL,10 //ачать чтение произвольного количества //айтов с поверхности накопителя XOR ECX,ECX MOV EAX, OFFSET Dpt4 //OV AL, Byte Ptr [BP+10] CBW //оступ снова открыт MUL EBP ADC EDX,ECX PUSH EAX MUL ESI ADD EAX,EBX DEC EAX DIV EBX POP EAX MOV EDI,ESI //ереход на транзит между оперативной //амятью и процессором. CMP ECX, 0000H //pt4 PUSH EAX MOV CL,0Bh MOV ESI,7D08h REPZ CMPSB POP EAX DEC ESI ADD EDI,20 CMP EDI,EBX MOV EDX, OFFSET Dpt4 //одготовиться к чтению носителя с первого //ектора и до самого последнего (произвольного //о номеру) TwoRead: MOV EAX,ECX CWD //ременная нейтрализация доступа SUB EBX, 3Ah MOV EAX,7C1Ch DTk1: CMP EAX,0008h MOV DL,04 JNZ DTk2 OR DL,02 MOV EBP,02 DTk2: ADD BL,10 //ачать чтение произвольного количества //айтов с поверхности накопителя DTk3: XOR ECX,ECX MOV ECX, OFFSET Dpt4 MOV AL, 10 CBW //оступ снова открыт //UL EBP,16 ADD EAX,EBP //DC EDX,Word Ptr [BP+1Eh] //DD EAX,Word Ptr [BP+0Eh] ADC EDX,ECX MOV ESI,EBP PUSH EAX //OV Word Ptr [BP-04],EAX //OV Word Ptr [BP-02],EDX MOV EAX,0020 MUL ESI //OV EBX,Word Ptr [BP+0B] ADD EAX,EBX DEC EAX //тм. команда //IV EBX //DD Word Ptr [BP-04],EAX //DC Word Ptr [BP-02],ECX POP EAX DTk5: MOV EDI,0700 //читать содержимое каждого кластера в буфер //перативной памяти для концентрации MOV ECX, 512 //азмер кластера MOV EAX, OFFSET BytClast2 MOV ES,EAX MOV ESI, 00H //ytClast2 MOV EDI, 00H //ytClast2 REPE CMPSB //онцентрация задействована //адействовать прочитанную информацию, для //озможных последующих действий со стороны //ользователя (чтения, записи, форматирования, //канирования на наличие ошибок доступа и т.д.) MOV ECX, 1024 //ytClast2Len MOV EAX, DS //acтpoить сегментный MOV ES,EAX //eгиcтp на область дaнных MOV ESI, 00H //ytClast2 MOV EDI, 00H //ytClast2 //агрузить содержимое REP MOVSB //рочитанные данные открыты для доступа //иксирование прочитанных данных в буфере //перативной памяти для нужд пользователя OUT 0Ah,EAX MOV EAX,8 //исло битов в байте MOV ECX,0512 //азмер кластера MOV EDX, OFFSET SizePrt //исло кластеров на дорожке CLD REPE CMPSB //равнение //рансляция отдельного байта MOV ECX, 01 MOV EAX, OFFSET Bytes2 SBB AL, 00 db 215 //LAT REP STOSB //расляция каждого кластера MOV ECX, 1024 MOV EBX, OFFSET BytClast2 db 215 //LAT CLD REP STOSB LAHF //агрузка младшего байта в AH PUSHF //агрузка регистра в стёк POP EAX //верка параметров прочитанного кластера IN EAX, 0Ah MOV EAX, 8 //исло битов в байте MOV ECX, 0512 //азмер кластера MOV EDX, OFFSET SizePrt //исло кластеров на дорожке CLD REP SCASB //paвнение //читать содержимое каждого кластера в буфер //перативной памяти для концентрации MOV ECX, 512 //азмер кластера MOV EAX, OFFSET BytClast2 MOV ES,EAX MOV ESI, 00H //ytClast2 MOV EDI, 00H //ytClast2 REPE CMPSB //онцентрация задействована //адействовать прочитанную информацию, для //озможных последующих действий со стороны //ользователя (чтения, записи, форматирования, //канирования на наличие ошибок доступа и т.д.) MOV ECX, 1024h //ytClast2Len MOV EAX, DS //acтpoить сегментный MOV ES,EAX //eгиcтp на область дaнных MOV ESI, 00H //ytClast2 MOV EDI, 00H //ytClast2 //агрузить содержимое REP MOVSB //рочитанные данные открыты для доступа //иксирование прочитанных данных в буфере //перативной памяти для нужд пользователя OUT 0Ah,EAX MOV EAX, 8 //исло битов в байте MOV ECX, 0512 //азмер кластера MOV EDX, OFFSET SizePrt //исло кластеров на дорожке CLD REP SCASB //paвнение //акрепить параметры для последующих операций PUSH EAX POP EBX MOV AL, 0232 MOV DH, 0032 MOV ECX, 08 MOV ESI, 00 REP STOSB DEC ESP LAHF //агрузка младшего байта в AH PUSHF //агрузка регистра в стёк PUSH EAX PUSH EBX PUSH EDX POP ECX ADD AH,BH REP SCASB //paвнение POP EAX //рансляция каждой из дорожек дискового накопителя MOV EDX, OFFSET Path2 PUSHF PUSH EAX PUSH EBX //// DB 240, 1 //тмен. команда SBB EAX,EBP MOV AL,08 //исло бит в байте. SBB EBX,ESP MOV ECX,0512 //азмер кластера в байтах MOV EDX, OFFSET PortSys db 215 //LAT //рансляция байтов. CLD //афиксировать прочитанное в памяти, для REP STOSW //оследующей обработки. //ORTY ENDP //ерейти к выполнению функций общего чтения, не зависимого //т типа накопителя. //ыполнение процедуры проверки носителя на читаемость. ReadPrt: ADD ECX, 0000H //td4 DEC ECX DEC EAX INC EBX ADD EBP,ESI ADD EBX,EDI ADD EBP,ESI LOOPNE CntrTk2 CntrTk2: INC EAX OR ESI,EAX //R Word Ptr [BX+SI],EAX ADC EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI SUB EBP,ESI ADC AL,2Fh INC ECX INC EBX INC EDX DEC ECX DEC EDI PUSH SS POP ES MOV ESP,7BFCh MOV EBP,0078 MOV ESI,EBP CLD REP CMPSB //равнение PUSH DS PUSH ESI PUSH SS PUSH EBP MOV EDI,0522 MOV EBP,EDI MOV EBP,ECX MOV EDX, OFFSET BytClast2 CLD REP CMPSB //равнение //роцедура предварительной инициализации //абочих регистров PUSH ES POP DS MOV EAX, 0008h MOV EBP, 7C00h MOV EDI, 0Fh MOV ECX, 0Fh //о 16 байтов CLD //канировать прочитанное REP MOVSB //афиксировать //роверить можно-ли пользоваться доступом // дисковому накопителю с помощи процедуры //OS-инициализации программы прерывания INT 14h MOV EAX, OFFSET Atd6 MOV EAX, OFFSET Dpt4 XOR EDX, EDX DIV ESI INC EDX //тмен. команда //IV Word Ptr [BP+1Ah] MOV DH, DL MOV CH, AL MOV AH, 02 OR CL, AH MOV EAX, 0208 MOV EDX, OFFSET Dpt4 INC EAX INC EDX ADD EBX,0Bh DEC ECX PUSH EDX PUSH EAX PUSH EDX XOR AL, AL CMP EAX,EDX TEST EAX,EDX OUT 13h,EAX db 236 //N EAX,EDX MOV EAX, 0512h db 238 //UT EDX,EAX db 236 //N EAX,EDX CMP EDX, 0Ah //сли, всё нормально, то выйти из программы //сли, диск читаеться нормально. JE DTk20 //сли обнаружена ошибка ввода/вывода. JNE Quit3 //сли, ошибок доступа не обнаружено. //сли нет, то вывести аварийное сообщение и //ровести дополнительную проверку перед закрытием //рограммы DTk20: CLI //апретить прерывания //астроить сегментный регистр ES //а страницу видеобуфера. MOV EAX, 0B800h MOV ES,EAX //ывести на дисплей символы, по соответствующей процедуре //ыполнения команд IOS, без запроса прерываний BIOS и DOS MOV AH, 14h //расный по синему MOV AL, "!" //ыводимый сигнальный символ MOV EAX, 0 //ервая позиция на экране MOV EAX, 2 //ледущая позиция MOV EAX, 4 //ледущая позиция MOV AH, 75h //иолетовый по белому MOV AL,0 //од холостого сигнала MOV EBX, (160 * 24) + (77 * 2) //ри позиции от конца буфера MOV EBX,EAX MOV EBX,EAX MOV EBX,EAX //ывеcти на дисплей текстовую строку, по соответствующей //роцедуре выполнения команд IOS, без запроса прерываний //IOS и DOS // PUSH 0 // PUSH OFFSET Err_Info // PUSH OFFSET Err_Info // PUSH 0 // CALL _imp__MessageBoxA@16 MOV EAX, 0B800h MOV ES, EAX MOV EBX, OFFSET Err_Info //дрес строки MOV EDI, 22 * 80 * 1 + 1 * 2 // низ экрана MOV ECX, 0052H //rr_InfoLen //лина строки REP MOVSB //афиксировать передачу в заданной позиции //астроить основные регистры на сегмент данных. PUSH ES POP DS //нициализация транзита между оперативной //амятью и процессором DTk11: MOV ESI,7D81h MOV EDI,1Ah MOV EAX,EDI MOV CL,0Dh MUL ECX ADD EAX,EBP ADC EDX,EBP MOV CL,04 //cвoбодить регистры Quit3: POP EAX POP EBX POP ECX POP EDX STI //азрешить прерывания. RET //окинуть обработчик. //eadPort ENDP //ntr14hLen = $ - Intr14h //онец подпрограммы обработчика INT 14h //истемная программа INT 15h MOUSE: JMP MouseInit //ереход на секцию инициализации IntVect15 dw 0 //чека для дискриптора MouseInit: CLI //апретить прерывания PUSHF //oxpaнить флaги для команды IRET //роцедура IOS инициализации программы прерывания 15Н MOV EDX,1E15h MOV ESP,08 //OV WORD PTR [DI-08],ECX //OV WORD PTR [SI+08],EBX //ока, в программе не определены //начения флагов старших регистров //H иEAX занятых процессором, их //спользовать в командах нельзя. MOV EDX, OFFSET IntVect15 TEST EDX, 15h INC EDX //еред тем, как начать распознавание //начений занятых флагов старших //егистров AH иEAX, произвести вербовку //ектора прерывания INT 15h и занести его // соответствующий адрес сегментного //уфера оперативной памяти. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV BL, 15h //ектор прерывания заносимый в буфер CLD //аполнять вперёд REP STOSB //аполнение //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //ачать процедуру распознавания функции //аботы с контролёром видеосистемы по запросу //ользователя (вызов этой системной программы //з буфера таблицы резидента BIOS, находящегося // базовой части оперативной памяти, через //рерывание INT 15h) PUSH EAX //адействовать регистрEAX //ля дальнейших действий POP EBX //егистрEBX оставить //вободным для фиксации //казание на мнимый флаг AH илиEAX, //ри отсутствии ясной фиксации управлящей //рограммы процессора AAS //одсчитаем, что занятый флаг AH илиEAX //уществует в любом случае, как-бы то //ибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB PUSH EAX //оррекция управляющего регистра //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая функция системной программы //ыла затребована пользователем, вмести с вызовом //рерывания INT 15h CMP AH, 00h JE MouseInit0 CMP AH, 01h JE MouseInit1 CMP AH, 02h JE MouseInit2 CMP AH, 03h JE MouseInit3 CMP AH, 04h JE MouseInit4 CMP AH, 05h JE MouseInit5 CMP AH, 06h JE MouseInit6 JMP MouseInit0 MouseInit0: //ALL MouseFun0 //ункции работы с мышью реализуемые //истемной подпрограммой INT 15h //OUSEFUN0: CLI //апретить прерывания CMP AH, 4Fh JZ Mous1 ADD EBP, 16 MOV ESI,EBP NEG EDI MOV EAX,ESI PUSH CS db 236 //N EAX,EDX INC ECX DEC EDI WAIT INC EDX INC EDI ADD EBX,ESI ADD EBX,ESI AND EBP,EDI //OL EBX,EDI ADD EBX,ESI XOR EBX,EDI SBB EBP,EDI ADD EBX,ESI ADD EBX,EDI ADD EBP,EDI POP ESP PUSH EDI DEC ECX DEC ESI DEC EBP INC EBP POP ESP PUSH EBX DEC EBP INC ECX PUSH EDX PUSH ESP INC ESP PUSH EDX PUSH ESI INC EBP POP EAX INC EBP ADD EBP,EDI MOV EBP,EDI DEC EBX MOV EBX,3720 SHL EBX,1 //CR Word Ptr [BP+SI-04],1 SBB ESI,3686 MOV ESI,534Dh INC ECX PUSH EDX PUSH ESP INC ESP PUSH EDX PUSH ESI SBB EBX,6600 MOV EBP,EDI //b 240 //OCK XCHG EAX,EDI //DD CH,EDI ADD EBP,16 db 111 //UTSW ADD EDI,16 db 109 //NSW PUSH SS ADD EDI,EDI Mous1: CMP AL,53 JNE Mous2 PUSH EAX PUSH ES MOV EAX,0040 MOV ES,EAX MOV AL,0017 TEST AL,08 JZ Mous2 TEST AL,04 Mous2: POP ES POP EAX JZ Mous3 CMP ECX,167Eh JNZ Mous4 CMP AH,88 JZ Mous4 CMP EAX,0229h JZ Mous5 CMP AH,87 JZ Mous3 JMP Mous6 Mous3: XOR EBX,EBX XOR EAX,EAX Mous4: CMP AH,4Fh JNZ Mous6 CMP AL,01 JNZ Mous7 Mous5: INC EDI ADD BH,BH //EC ESI,02 INC EDI STD ADD EAX,9999h DEC EAX PUSH ES DEC EDI MOV EAX,9999h Mous6: NEG EDI AND BH,BH //NC EBX,ESI MOV ECX, 0099h ADD EBX,ESI ADD EBX,ESI //b 240 //OCK REP MOVSB db 238 //UT EDX,AL ADD AL,DH ADD EBX,ESI ADD EBP,ESI ADD EBX,ESI ADD EBP,ESI ADD EBX,ESI ADD EBP,ESI ADD EBX,ESI ADD AL,02 ADD EBX,ESI ADD EAX,0002h ADD EBX,ESI REP STOSB ADD EBX,ESI ADD EBP,ESI AND BH,DL POP ESI ADD EBX,ESI ADC EBX,ESI XOR EBP,ESI ADD EBX,ESI CMP AL,53 JNZ Mous8 PUSH EAX PUSH DS SUB EAX,EAX MOV DS,EAX MOV EAX, 0417h AND AL,0Ch CMP AL,0Ch JNZ Mous7 PUSHF MOV ECX,EAX db 236 //N EAX,EDX Mous7: MOV ECX,EAX Mous8: db 102, 157 //OPFD POP EDX POP EAX CLC CMP AH,87 JNE Mous9 PUSH EAX POP EAX CLI CLD db 96 //USHA PUSH ES PUSH DS Mous9: MOV EBX,ECX MOV EAX, 309Eh MOV ECX, 309Ch TEST EAX, 01 JE Mous10 PUSH ECX CALL EAX POP ECX JZ Mous11 CALL ECX Mous10: MOV ECX,EBX JNE Mous11 MOV AL,02 OUT 81,AL OUT 80,AL MOV EBX,0040 MOV DS,EBX Mous11: CMP AH,24 JNZ Mous12 CMP AL,03 JNZ Mous12 POP EBX MOV EBX,0002 STI XOR AH,AH Mous12: MOV ECX,EBX JNE Mous16 MOV AL,02 OUT 81,AL OUT 80,AL MOV EBX,0040 MOV DS,EBX MOV EBX,0067 MOV EAX,0069 MOV AL,8Fh OUT 70,AL MOV EAX,ES MOV DS,EAX MOV BL,AH db 193, 224, 4 //HL EAX,04 db 192, 235, 4 //HR BL,04 ADD EAX,ESI ADC BL,00 MOV ESI,0Ah MOV ESI,0Ch MOV EAX,9999h MOV ESI,08 MOV ESI,10 MOV ESI,18 MOV AL,09 OUT 71,AL db 15, 1, 99 //GDT FWord Ptr [SI+08] db 46, 15, 1 //IDT FWord Ptr CS:[707Eh] db 15, 1, 224 //MSW EAX OR AL,01 db 15, 1, 240 //MSW EAX MOV EAX,0010 MOV DS,EAX MOV AL,18 MOV ES,EAX XOR ESI,ESI XOR EDI,EDI TEST ECX, 40 JNZ Mous13 SHR ECX,1 REP MOVSW JNB Mous13 MOVSW Mous13: IN AL,61 AND AL,0Ch JNE Mous14 OUT 81,AL OUT 80,AL db 15, 1, 68 //GDT FWord Ptr CS:[E268] MOV EAX,0040 MOV DS,EAX MOV ES,EAX db 66, 193, 200, 10 //OR EAX,10 MOV ECX,EAX MOV EAX,ESP db 36, 99 //ND AL,0254h MOV ESP,EAX Mous14: MOV EAX,ECX db 66, 193, 200, 10 //OR EAX,10 db 46, 15, 216, 3 //IDT FWord Ptr CS: [E2B8] MOV AL,00 OUT 92,AL MOV ECX,001Eh IN AL,79h Mous15: MOV ECX, 32h LOOP Mous15 CMP ESP,ESP MOV AL,0Fh OUT 70,AL PUSH EAX IN AL,61 POP EAX PUSH EAX IN AL,61 POP EAX MOV AL,00 OUT 71,AL JNE Mous16 POP DS POP ES db 97 //OPA XCHG AL,AH IN AL,81 XCHG AL,AH OR AH,AH STC STI Mous16: MOV AL,03 OUT 81,AL OUT 80,AL POP DS POP ES db 97 //OPA XCHG AL,AH IN AL,81 XCHG AL,AH OR AH,AH JZ Mous17 Mous17: STC STI TEST EAX,20 JZ Mous18 CMP AH,88 JZ Mous21 CMP EAX,0231 JZ Mous20 Mous18: MOV EAX,3536 Mous19: CLI OUT 70,AL PUSH EAX IN AL,61 POP EAX PUSH EAX IN AL,61 POP EAX IN AL,71 STI CMP EAX,1000 PUSHF db 193, 224, 4 //HL EAX,04 POPF JBE Mous20 MOV EAX, 9999h MOV EBX, 9999 Mous20: db 192, 224, 16 //HR EBX,10 Mous21: SUB EAX,EBX MOV EBX,EAX CMP EBX,000Fh JG Mous22 MOV EBX,0000 db 193, 224, 6 //HL EAX,06 Mous22: SUB EBX,000Fh MOV EAX,003Ch MOV ECX,EAX MOV EDX,EBX CLC ADD ESP,04 PUSH EAX MOV EAX,0000 db 192, 224, 10 //HR EAX, 0Ah CMP EAX, 0001 JA Mous24 SUB EAX,0400 TEST ECX, 80 JNZ Mous23 ADD ESP,06 CLC Mous23: CMP EAX,3C00h JB Mous24 MOV EAX,003Ch Mous24: POP EAX PUSH EDI MOV EDI,01 MOV ESI,08 POP EDI CMP AH,25 JNZ Mous25 CMP AL,03 JNB Mous27 ADD ESP,04 PUSH DS PUSH ESI PUSH EAX Mous25: CMP AH,24 JNZ Mous26 CMP AL,03 JNZ Mous26 POP EBX MOV EBX,0002 Mous26: STI XOR AH,AH CMP AH,53 JNZ Mous30 JMP Mous30 Mous27: CMP EAX,9981 JNZ Mous28 Mous28: JMP Mous30 OR ESP,ESP CMP EAX,420Dh JNZ Mous30 PUSH EAX db 15, 1, 224 //MSW EAX db 15, 186, 224, 0 //T EAX,00 POP EAX JB Mous30 PUSH EAX //R7 Mous30: PUSHF PUSH EAX PUSH EBX POP DS MOV EBX,669Fh MOV EAX,0000Fh MOV EBX,02 MOV EAX,906Eh MOV EBX,EAX POP DS POP EBX POP EAX //одпрограмма особого доступа к устройству Mous31: PUSH EAX PUSH ECX MOV ECX,008Ch PUSH ECX MOV ECX,000Ch IN AL,61 LOOP Mous31 POP ECX POP EDX POP EAX STI //aзрешить прерывания RET //окинуть обработчик //OUSEFUN0 ENDP MouseInit1: //ALL MouseFun1 //OUSEFUN1: CLI //апретить прерывания //становка режима отображения или скрытия курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //редварительная очистка байта изображения. //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //еперь, вывести байт изображения. //становка цвета. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 1 //вет db 238 //UT EDX, AL //становка цвета //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 //становка места положения курсора на дисплее. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //анять регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX //ункция вывода на дисплей //начения и адреса, условно не определены MOV AH, 00h MOV AL, 0 MOV EAX, 0000h MOV ES,EAX MOV EAX, 0 //ервая позиция на экране MOV EBX, 0 //ледущая позиция MOV AH, 00h MOV AL,0 //од холостого сигнала MOV EBX, 0 //озиция от конца буфера MOV EBX,EAX MOV ESI, 0000h //дрес строки MOV EDI, 0000h // низ экрана MOV ECX, 0000h //лина строки REP STOSB //иксация в буфере оперативной памяти MOV AL, 00 MOV DS,EAX MOV EAX, 0B800h //дрес видеобуфера MOV ES,EAX MOV EDI, 0000h //мещение по экрану MOV ECX, 0000h //исло выводимых байтов REP MOVSB //иксация отображения на дисплее //свободить регистры POP EAX POP EBX POP ECX POP EDX //олучение режима отображения и размера курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX MOV EAX, 0100 //ункция 01h Видео драйвера //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //ункция увеличения размера курсора AAM IMUL EDX AAA ADD EDX, 00h //ункция уменьшения размера курсора MOV AL, 0FFh db 238 //UT EDX, AL INC EDX AAS SUB EDX, 00h AAD IDIV EDX //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 //нициализация или прокрутка окна вверх. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //верх, осуществляется смещением первого пиксела //а дисплее в отрицательную позицию. Это одна из //амых сложных операций. Ведь, самопроизвольно по //исплею можно перемещаться только вниз. MOV EDI, 0000h //становить нолевое значение //ачального места положения //уроса на дисплее. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAS //становить флаг удаления исходного числа пикселов. SUB EDI, 99h //далять из регистраEDI исходное значение. DAS //становить флаг для удаления фиксированного значения. SBB EDI, 99h //далять из регистраEDI фиксированное //начение числа выведенных пикселов. SBB ECX, 0560h //далить текущие значение и из флагаECX. //но должно превышать число 640. 0480 = 1280. DEC EDI //афиксировать после удаления, в обоих DEC ECX //егистрахEDI иECX отрицательное приращение. DAS //овторно установить флаг убывания пикселов, для //отверждения законности этой операции. AAS //екущая операция завершена. Можно приступать к другой. NEG EDI //олучить код дополнительного значения NEG ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. //нициализация или прокрутка окна вниз. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //низ, осуществляется смещением последнего пиксела //а дисплее в более нижнею позицию. По принцепу, //та операция, аналогична предыдущей в которой //еремещение осуществляется, наоборот вверх. MOV EDI, 9999h //мещение к концу экрана. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAA //становить флаг пополнения исходного числа пикселов. ADD EDI, 99h //рибавлять к региструEDI новое значение. DAA //становить флаг для удаления фиксированного значения. ADC EDI, 99h //рибавлять к региструEDI фиксированное //начение числа выведенных пикселов. ADC ECX, 0560h //рибавлять к текущиму значению флагаECX. //но должно превышать число 640. 0480 = 1280. INC EDI //афиксировать после пополнения, в обоих INC ECX //егистрахEDI иECX приращение. DAS //овторно установить флаг пополнения пикселов. AAA //екущая операция завершена. Можно приступать к другой. NOT EDI //олучить код дополнительного значения NOT ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. STI //азрешить прерывания RET //окинуть обработчик //OUSEFUN1 ENDP MouseInit2: //OUSEFUN2: CLI //апретить прерывания //становка режима отображения или скрытия курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов PUSH CS ADD EBX,ESI ADD EBX,ESI ADD ESP,04 MOV EDI,34 CMP EDI,34 ADD EBX,ESI MOV ECX,34 DB 184, 1, 255 MOV EDI,0Ch ADD EBX,ESI MOV EDI,0Ch ADD EBX,ESI //USH WORD PTR [DI+10] //USH WORD PTR [DI-0Ch] MOV ECX,08 DB 184, 1, 255 MOV EDI,04 ADD EBX,ESI PUSH CS //редварительная очистка байта изображения. //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //чистить байт (все пикселы байта) //OV BYTE PTR ES:[BX], 0 //еперь, вывести байт изображения. //становка цвета. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 1 //вет db 238 //UT EDX, AL //становка цвета //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 ADD ESP,04 MOV EDI,38 CMP EDI,38 ADD EBX,ESI MOV ECX,38 DB 184, 1, 255 MOV EDI,10 ADD EBX,ESI MOV EDI,0000h ADD EBX,ESI MOV EAX,EDI MOV EDI,14 MOV EAX,EDI PUSH EBX MOV EAX,EDI PUSH EBX PUSH EDI MOV ECX,08 DB 184, 1, 255 MOV EDI,04 ADD EBX,ESI PUSH CS ADD EBX,ESI ADD EBX,ESI ADD ESP,04 //становка места положения курсора на дисплее. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //анять регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX //ункция вывода на дисплей //начения и адреса, условно не определены MOV AH, 00h MOV AL, 0 MOV EAX, 0000h MOV ES,EAX MOV EAX, 0 //ервая позиция на экране MOV EBX, 2 //ледущая позиция MOV AH, 00h MOV AL,0 //од холостого сигнала MOV EBX, 0 //озиция от конца буфера MOV EBX,EAX MOV ESI, 0000h //дрес строки MOV EDI, 0000h // низ экрана MOV ECX, 0000h //лина строки REP STOSB //иксация в буфере оперативной памяти MOV AL, 00 MOV DS,EAX MOV EAX, 0B800h //дрес видеобуфера MOV ES,EAX MOV EDI, 0000h //мещение по экрану MOV ECX, 0000h //исло выводимых байтов db 215 //LAT CLD REP MOVSB //иксация отображения на дисплее //свободить регистры POP EAX POP EBX POP ECX POP EDX //олучение режима отображения и размера курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX MOV EAX, 0100 //ункция 01h Видео драйвера //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //ункция увеличения размера курсора AAM IMUL EDX AAA ADD EDX, 00h //ункция уменьшения размера курсора MOV AL, 0FFh db 238 //UT EDX, AL INC EDX AAS SUB EDX, 00h AAD IDIV EDX //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 //нициализация или прокрутка окна вверх. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //верх, осуществляется смещением первого пиксела //а дисплее в отрицательную позицию. Это одна из //амых сложных операций. Ведь, самопроизвольно по //исплею можно перемещаться только вниз. MOV EDI, 0000h //становить нолевое значение //ачального места положения //уроса на дисплее. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAS //становить флаг удаления исходного числа пикселов. SUB EDI, 99h //далять из регистраEDI исходное значение. DAS //становить флаг для удаления фиксированного значения. SBB EDI, 99h //далять из регистраEDI фиксированное //начение числа выведенных пикселов. SBB ECX, 0560h //далить текущие значение и из флагаECX. //но должно превышать число 640. 0480 = 1280. DEC EDI //афиксировать после удаления, в обоих DEC ECX //егистрахEDI иECX отрицательное приращение. DAS //овторно установить флаг убывания пикселов, для //отверждения законности этой операции. AAS //екущая операция завершена. Можно приступать к другой. NEG EDI //олучить код дополнительного значения NEG ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. //нициализация или прокрутка окна вниз. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //низ, осуществляется смещением последнего пиксела //а дисплее в более нижнею позицию. По принцепу, //та операция, аналогична предыдущей в которой //еремещение осуществляется, наоборот вверх. MOV EDI, 9999h //мещение к концу экрана. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAA //становить флаг пополнения исходного числа пикселов. ADD EDI, 99h //рибавлять к региструEDI новое значение. DAA //становить флаг для удаления фиксированного значения. ADC EDI, 99h //рибавлять к региструEDI фиксированное //начение числа выведенных пикселов. ADC ECX, 0560h //рибавлять к текущиму значению флагаECX. //но должно превышать число 640. 0480 = 1280. INC EDI //афиксировать после пополнения, в обоих INC ECX //егистрахEDI иECX приращение. DAS //овторно установить флаг пополнения пикселов. AAA //екущая операция завершена. Можно приступать к другой. NOT EDI //олучить код дополнительного значения NOT ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. STI //азрешить прерывания RET //окинуть обработчик //OUSEFUN2 ENDP MouseInit3: //OUSEFUN3: CLI //апретить прерывания ADD EBX,ESI //USH WORD PTR [DI+10] //USH WORD PTR [DI-18] MOV ECX,08 DB 184, 1, 255 MOV EDI,04 ADD EBX,ESI PUSH CS ADD EBX,ESI ADD EBX,ESI ADD ESP,04 MOV EDI,40 CMP EDI,40 ADD EBX,ESI MOV ECX,40 DB 184, 1, 255 MOV EDI,1Ch ADD EBX,ESI MOV EDI,1Ch MOV EDI,10 MOV EDI,20 MOV EDI,20 PUSH EDI DB 184, 1, 255 ADD EBX,ESI MOV ECX,08 DB 184, 1, 255 ADD EBX,ESI DB 184, 1, 255 ADD EBX,ESI MOV ECX,08 DB 184, 1, 255 ADD EBX,ESI MOV ECX,08 DB 184, 1, 255 ADD EBX,ESI STI //азрешить прерывания RET //окинуть обработчик MouseInit4: //OUSEFUN4: CLI //апретить прерывания // MOV ECX,WORD PTR [DI-08] DB 184, 1, 255 // MOV WORD PTR [DI-04],EAX // PUSH WORD PTR [DI+10] DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL // MOV ECX,WORD PTR [DI-08] DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL // MOV ECX,WORD PTR [DI-08] DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL DB 184, 1, 255 // MOV WORD PTR [DI-04],EAX // ADD BYTE PTR [BX+SI],AL // PUSH WORD PTR [DI+10] // MOV ECX,WORD PTR [DI-08] DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL PUSH CS PUSH DS STI //азрешить прерывания RET //окинуть обработчик //OUSEFUN4 ENDP MouseInit5: //OUSEFUN5: CLI //апретить прерывания //становка режима отображения или скрытия курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов PUSH CS // ADD BYTE PTR [BX+SI],AL ADD ESP,04 // CMP WORD PTR [DI-34],00 // MOV ECX,WORD PTR [DI-34] DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL // MOV WORD PTR [DI-0Ch], 0000h // PUSH WORD PTR [DI+10] // MOV ECX,WORD PTR [DI-08] DB 184, 1, 255 // ADD BYTE PTR [BX+SI],AL PUSH CS //редварительная очистка байта изображения. //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3CFh - регистр данных MOV AL, 0FFh //се пикселы байтов размаскировать db 238 //UT EDX, AL //становка маски битов //чистить байт (все пикселы байта) // MOV BYTE PTR ES:[BX], 0 //еперь, вывести байт изображения. //становка цвета. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных MOV AL, 1 //вет db 238 //UT EDX, AL //становка цвета //ывести байт пикселов. // MOV BYTE PTR ES:[BX], 95 ADD ESP,04 // MOV WORD PTR [DI-38],EAX // CMP WORD PTR [DI-38],00 // ADD BYTE PTR [BX+SI],AL // MOV ECX,WORD PTR [DI-38] DB 184, 1, 255 // MOV WORD PTR [DI-10],EAX // ADD BYTE PTR [BX+SI],AL // MOV WORD PTR [DI-10], 0000h // ADD BYTE PTR [BX+SI],AL // MOV EAX,WORD PTR [DI+10] // MOV WORD PTR [DI-14],EAX // MOV EAX,WORD PTR [DI-14] // PUSH WORD PTR [BX+SI+04] // MOV EAX,WORD PTR [DI-14] // PUSH WORD PTR [BX+SI] // PUSH WORD PTR [DI-10] // MOV ECX,WORD PTR [DI-08],EAX DB 184, 1, 255 // MOV WORD PTR [DI-04],EAX // ADD BYTE PTR [BX+SI],AL PUSH CS // ADD BYTE PTR [BX+SI],AL // ADD BYTE PTR [BX+SI],AL ADD ESP,04 //становка места положения курсора на дисплее. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //анять регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX //ункция вывода на дисплей //начения и адреса, условно не определены MOV AH, 00h MOV AL, 0 MOV EAX, 0000h MOV ES,EAX MOV EAX, 0 //ервая позиция на экране MOV EBX, 0 //ледущая позиция MOV AH, 00h MOV AL,0 //од холостого сигнала MOV EBX, 0 //озиция от конца буфера MOV EBX,EAX MOV ESI, 0000h //дрес строки MOV EDI, 0000h // низ экрана MOV ECX, 0000h //лина строки REP STOSB //иксация в буфере оперативной памяти MOV AL, 00 MOV DS,EAX MOV EAX, 0B800h //дрес видеобуфера MOV ES,EAX MOV EDI, 0000h //мещение по экрану MOV ECX, 0000h //исло выводимых байтов db 215 //LAT CLD REP MOVSB //иксация отображения на дисплее //свободить регистры POP EAX POP EBX POP ECX POP EDX //олучение режима отображения и размера курсора. //астроить сегментный регистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX MOV EAX, 0100 //ункция 01h Видео драйвера //становить режим записи 0 MOV EDX, 3CEh //орт номера адресуемого регистра MOV AL, 5 //омер регистра режима db 238 //UT EDX, AL //становка адресации к регистру //ежима INC EDX //X = 3CFh - регистр данных контролёра MOV EDX, 3CFh //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима записи MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 80 * 175 //бщие число задействованных байтов //становка полной маски цвета. MOV EDX, 3C4h //дресный регистр секвенсера MOV AL, 2 //егистр маски цвета db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //X = 3C5h - регистр данных //еквенсера MOV AL, 0Fh //се биты (ярко белый) db 238 //UT EDX, AL //становка маски цвета //становка маски битов. MOV EDX, 3CEh //дресный регистр контролёра MOV AL, 8 //егистр маски битов db 238 //UT EDX, AL //становка адресуемого регистра INC EDX //ункция увеличения размера курсора AAM IMUL EDX AAA ADD EDX, 00h //ункция уменьшения размера курсора MOV AL, 0FFh db 238 //UT EDX, AL INC EDX AAS SUB EDX, 00h AAD IDIV EDX //ывести байт пикселов. //OV BYTE PTR ES:[BX], 95 //нициализация или прокрутка окна вверх. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //верх, осуществляется смещением первого пиксела //а дисплее в отрицательную позицию. Это одна из //амых сложных операций. Ведь, самопроизвольно по //исплею можно перемещаться только вниз. MOV EDI, 0000h //становить нолевое значение //ачального места положения //уроса на дисплее. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAS //становить флаг удаления исходного числа пикселов. SUB EDI, 99h //далять из регистраEDI исходное значение. DAS //становить флаг для удаления фиксированного значения. SBB EDI, 99h //далять из регистраEDI фиксированное //начение числа выведенных пикселов. SBB ECX, 0560h //далить текущие значение и из флагаECX. //но должно превышать число 640. 0480 = 1280. DEC EDI //афиксировать после удаления, в обоих DEC ECX //егистрахEDI иECX отрицательное приращение. DAS //овторно установить флаг убывания пикселов, для //отверждения законности этой операции. AAS //екущая операция завершена. Можно приступать к другой. NEG EDI //олучить код дополнительного значения NEG ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. //нициализация или прокрутка окна вниз. //астроить сегментный регистр ES на видеобуфер. MOV EAX, 0B800h MOV DS,EAX //рокручивание изображения в графическом режиме //низ, осуществляется смещением последнего пиксела //а дисплее в более нижнею позицию. По принцепу, //та операция, аналогична предыдущей в которой //еремещение осуществляется, наоборот вверх. MOV EDI, 9999h //мещение к концу экрана. PUSH DS //астроить ES на сегмент POP ES //лока данных. MOV ECX, 0280h //40 - максимальное число пикселов //о горизонтали в графическом режиме. AAA //становить флаг пополнения исходного числа пикселов. ADD EDI, 99h //рибавлять к региструEDI новое значение. DAA //становить флаг для удаления фиксированного значения. ADC EDI, 99h //рибавлять к региструEDI фиксированное //начение числа выведенных пикселов. ADC ECX, 0560h //рибавлять к текущиму значению флагаECX. //но должно превышать число 640. 0480 = 1280. INC EDI //афиксировать после пополнения, в обоих INC ECX //егистрахEDI иECX приращение. DAS //овторно установить флаг пополнения пикселов. AAA //екущая операция завершена. Можно приступать к другой. NOT EDI //олучить код дополнительного значения NOT ECX //ля обоих регистровEDI иECX. //афиксировать регистры для ведения дальнейшего процесса. //егистрECX занять, a регистрEDI наоборот освободить. PUSH ECX POP EDI CLD //еперь, процесс движения вверх уже стал //еобратимым. REP MOVSB //нициализация отображения прокрутки вверх на дисплее. MOV EDI,04 ADD EBX,ESI PUSH EBX MOV ECX,08 DB 184, 1, 255 ADD EBX,ESI ADD EBX,ESI DEC EBX CMP EDI,1Ch ADD EBX,ESI MOV EAX,44 TEST ESI,EDI OR AL,08h DB 184, 1, 255 OR AL,0Eh DB 155, 220, 194 //ADD ST(2),ST OR AL,0Ah DB 155, 220, 194 //ADD ST(2),ST OR AL,46 DB 155, 221, 194 //FREE ST(2) OR AL,59 DB 155, 221, 194 //FREE ST(2) //авершить работу системной //одпрограммы и выйти из //бработчика. MouseExit: POP EAX POP EBX POP EDX POP EDX STI //азрешить прерывания RET //окинуть обработчик //OUSEFUN5 ENDP MouseInit6: MOUSEFUN6: CLI //апретить прерывания // ROL Byte Ptr [BX],1 //R0 // CMP EBP,Word Ptr [BX+SI+07] CMP EDX,EAX POP ES // CMP EDI, Word Ptr [BP+SI-65] CMP EDX,EAX POP ES SUB EDX,EBP ADD EAX, 3B9Ah // XOR Word Ptr [BX+SI],EAX POPF ADC EAX, 0649 POPF // ROL Byte Ptr [BX+DI], 01 ADC EAX, 0061h //R1 POPF ADC EAX, 0079 POPF ADC EAX, 0091 POPF ADC EAX, 9953h ADD AL, DH MOV EDI, 241Ah CLC ADD AL, DH INC ECX CLC ADD AL, DH CLC ADD AL, DH TEST AL, 39 POP ES // SBB WORD PTR [BX+16h],ESI MOV ECX,EDX //R2 //b 240 //OCK // OR Word Ptr [BP+SI],EBX MOV EDI, 091Ah // ADD ESI, Word Ptr [BX+SI+00] STC DB 155, 218, 0 //IADD DWord Ptr [BX+SI] //b 240 //OCK ADD AL, AH ADD AL, DH STC //BB Word Ptr [BX+6Eh],EDI //NC Byte Ptr [BX+SI] //b 240 //OCK ADD EAX, 7004 //DD Byte Ptr [BP+DI-01], DL ADD AL,BH MOVSB //b 240 //OCK //R3 ADD AL, DH //ND AL, Byte Ptr [DI] //DD Byte Ptr [BX+SI], AL //MP BH, Byte Ptr [SI+00] //DD Byte Ptr [BX+DI], CL //MP EDX, Word Ptr [DI] POP ES //MP ESI, Word Ptr [DI-65] //MP EAX, Word Ptr [BX+1Ah] MOV EDI, 291Ah AAS POP ES SUB ESI,EDI POP ES SBB EDI,ESI //R4 ADD AL,70 //DD Byte Ptr [BX+SI+0740], CH SUB EBP,ESI INC ECX DEC EDI SUB AL, 41 NEG EAX SUB AL, 41 INC EDI POP EDI ADD EBX,EDI //BB ESI, BL INC EBX POP ES SUB EBP,EDX db 109 //NSW INC EDI db 238 //UT EDX, AL //5 ADD AL,DH SUB AL,41 DEC EDI LODSB ADD AL, DH PUSH CS DB 155, 219, 3 //ILD Dword Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD Dword Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD Dword Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD Dword Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD Dword Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD Dword Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD DWord Ptr [BP+DI] AND EBP,ESI DB 155, 219, 3 //ILD DWord Ptr [BP+DI] AND EBP,ESI WAIT ADD ESP,ESI CMP EBP, 03 AND EBP,ESI SUB AL, 41 DEC EDI POP EAX ADD EDX, 4066h INC EBX POP ES SUB ESI,EAX XOR EDX, 655Ch //b 240 //OCK ADD AL, DH //R7 PUSH ECX POP EDX ADD AL, 70 ADD BL, DH db 238 //UT EDX, AL ADD AL, DH CLD REP SCASB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH REP MOVSB db 238 //UT EDX, AL ADD AL, DH REP CMPSB db 238 //UT EDX, AL ADD AL, DH REP MOVSB db 238 //UT EDX,AL //R10 db 238 //UT EDX, AL ADD AL, DH REP SCASB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH REP MOVSB db 238 //UT EDX, AL ADD AL, DH REP CMPSB db 238 //UT EDX, AL ADD AL, DH REP MOVSB db 238 //UT EDX, AL ADD AL, DH REP SCASB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH AAS //R9 DEC EBP ADD ESI, 01 //DD EDI, Word Ptr [BX+SI-00] REP SCASB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH //DD DH,ESI SAHF db 236 //N AL,EDX REP MOVSB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH REP CMPSB ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH REP STOSB db 238 //UT EDX, AL ADD AL, DH REP MOVSB db 238 //UT EDX, AL ADD AL, BH REP SCASB ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI STI //азрешить прерывания RET //окинуть обработчик //OUSEFUN6 ENDP //OUSE ENDP //ntr15hLen = $ - Intr15h //онец подпрограммы обработчика INT 15h //истемная программа INT 16h KEYBORD: //ереход на секцию инициализации KeybInit: CLI //апретить прерывания PUSHF //oxpaнить флaги для команды IRET //роцедура IOS инициализации программы прерывания 16Н MOV EDX,1E16h MOV ESP,08 //OV WORD PTR [DI-08],ECX //OV WORD PTR [SI+08],EBX //ока, в программе не определены //начения флагов старших регистров //H иEAX занятых процессором, их //спользовать в командах нельзя. MOV EDX, OFFSET IntVect16 TEST EDX, 16h INC EDX //еред тем, как начать распознавание //начений занятых флагов старших //егистров AH иEAX, произвести вербовку //ектора прерывания INT 16h и занести его // соответствующий адрес сегментного //уфера оперативной памяти. MOV ES,EDX //астроем на него ES XOR EDI,EDI //S:DI -> начало выделенного блока MOV ECX, 2 // - число байтов в сегменте MOV BL, 16h //ектор прерывания заносимый в буфер CLD //аполнять вперёд REP STOSB //аполнение //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //ачать процедуру распознавания функции //аботы с контролёром видеосистемы по запросу //ользователя (вызов этой системной программы //з буфера таблицы резидента BIOS, находящегося // базовой части оперативной памяти, через //рерывание INT 16h) PUSH EAX //адействовать регистрEAX //ля дальнейших действий POP EBX //егистрEBX оставить //вободным для фиксации //казание на мнимый флаг AH илиEAX, //ри отсутствии ясной фиксации управлящей //рограммы процессора AAS //одсчитаем, что занятый флаг AH илиEAX //уществует в любом случае, как-бы то //ибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB PUSH EAX //оррекция управляющего регистра //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая функция системной программы //ыла затребована пользователем, вмести с вызовом //рерывания INT 16h CMP AH, 00h JE KeybInit0 CMP AH, 01h JE KeybInit1 CMP AH, 02h JE KeybInit2 CMP AH, 03h JE KeybInit3 CMP AH, 04h JE KeybInit4 CMP AH, 05h JE KeybInit5 JMP KeybInit0 KeybInit0: //EYBFUN0: //бязательная заглавная команда //езедентной программы //оля данных резедентной секции программы //аботы с клавиатурой. //eзедентная секция программы Beg_09h: CLI //апретить прерывания PUSHF //oxpaнить флaги для команды IRET // начала инициировать подпрограмму работы //аботы вектора аппаратного доступа клавивиатуры //NT 09h. //н нужен, для пересылки тела исполняемой программы //з буфера памяти, на процессор для выполнения. PUSHF //oxpaнить флaги для команды IRET MOV AH, 09h //начала перейдём в драйвер 09h MOV EBX, 00h //ектор 09h ещё не определён MOV ECX, 2 //дрес вектора, должен содержать 2 байта MOV EDX, OFFSET Key_atd //агрузить блок для вектора MOV EDX, 0009h //аполнить блок его указанием CLD //бозначить вектор REP STOSB //авербовать вектор 09h в памяти //бработчик прерываний клавиатуры по INT 09h //обработка аппаратного прерывания). Reset_09h: PUSH EAX //начала перейти в драйвер 09h IN AL,09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL,09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX,CS CMP EAX,EBX POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL,09h //игнал в порт 09h MOV EDX,0062 CMP EBX, 0001h JNZ Nxt MOV EDX,0061 db 236 //N AL,EDX AND AL,09h OR AL,09h OUT 61,AL Nxt: PUSH ECX MOV ECX,0001 PUSH EDX POP ECX IN AL,09h MOV AL,20 OUT 20,AL POP EDX POP EAX CMP AL,00h JZ Qt CMP AL,02h JZ Qt MOV EAX,0000h MOV EBX,0001h MOV ECX,0101h MOV EDX,1111h IN AL,09h //игнал в порт 09h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx1, 01h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx2, 02h POP DS POP EAX PUSH DS MOV EAX,4333 MOV DS,EAX XOR BYTE PTR CdEx3, 04h POP DS POP EAX JB Exts Qt: MOV EDX,1111h MOV ECX,0101h MOV EBX,0001h MOV EAX,0000h IN AL,09h //игнал в порт 09h //ернулись из него. Сохраним все //ребуемые регистры Exts: PUSH EAX PUSH EBX PUSH ECX PUSH EDX PUSH EBP PUSH DS PUSH ES MOV EAX, CS //acторем сегментный регистр DS MOV DS,EAX //а этот сегмент MOV EAX, 40h //acтроем регистр ES MOV ES,EAX //а область данных BIOS //aчнём обработку символа, скопировав его из кольцевого //уфера ввода вEAX, но не изымая его при этом из буфера MOV EBX, 1Ah //дрес очередного символа MOV EAX,EBX //ведённый символ -> вEAX CMP EAX, 1000H //lt_Q //ажата клавиша завершения ? JE New_09h //а, на восстановление вектора CMP AH, 2 //кен-код меньше 2-х ? JB FreHom //а, на выход из прерывания CMP AH, 12 //кен-код больше 12-ти ? JA FreHom //а, на выход из прерывания //кен-код в заданных пределах. Ho нажата-ли клавиша // ? TEST BYTE PTR ES: 17h,40h //лаг - бит 6 JZ FreHom //ет, на выход из прерывания //eжим включен и нажата клавиша //<1/!> . . . <-/_> PUSH EBX //X нам понадабится MOV EBX, KeybCod //дрес таблицы трасляции XCHG AH,AL //кен-код в AL для XLAT db 215 //LAT //рансляция POP EBX //occтановимEBX MOV EBX,EAX //аменим код ASCII // кольцевом буфере //epнёмся в прерваную программу FreHom: POP ES //occтaнoвим coxpaнённые POP DS //анее регистры POP EBP POP EDX POP ECX POP EBX POP EAX //eset_09hLen = $ - Reset_09h //афиксировать подпрограмму контролёра //ппаратного доступа клавиатуры INT 09h, //езидентно в памяти для дальнейших операций MOV EAX, 0009h //дрес вектора MOV EBX, 1 //искриптор занятости MOV ECX, 0128h //онец тела резидента MOV EDX, Reset_09h //ачало тела резидента PUSH EAX //анять в качестве рабочих, PUSH ES //ти же регистры CLD //аполнять буфер вперёд REP STOSB //иксация подпрограммы в буфере //бросить флаги, перед новой операцией POPF //ткрыть доступ, непосредственно к устройству //онтроллера клавиатуры MOV EDX, 0009h //орт контролёра MOV AL, 11h //КИ1: будет СКИ3 db 238 //UT EDX, AL //ервый контакт с //стройством. INC EAX //егистромEAX к нему, теперь //ткрыт постоянный доступ. MOV AL, 09h //едомый вектор тоже задействован. db 238 //UT EDX, AL //еперь, всё готово для работы с //стройством генератора. //ывод из кольцевого буфера клавиатуры //анных о всех 127-ми стандартных скен-кодов //нопок на клавиатуре MOV EDX, 0009h //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима чтения MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0127h //исло байтов данных о //екущем времени. MOV EDX, KeybCod //агрузка буфера памяти //ля концентрации прочитанных //анных. INC EDX //X = 0009h - Регистр данных. IN AL, 09h //осылка пробного сигнала IN AL, 09h // порт устройства клавиатуры IN AL, 09h //з 3-х байтов. CMP ECX, 03h //иксировать 3 задействованых байта OUT 09h, AL //олучение ответного сигнала из OUT 09h, AL //орта устройства CMOS-генератора OUT 09h, AL //з 3-х байтов. CMP ECX, 03h //иксировать 3 прочитанных байта //езидентная фиксация в выделеном буфере памяти //анных об исправном доступе к клавиатуре, для //альнейшего использования программой пользователя. XCHG AL, AH //начение регистра AL, должно //оответствовать региструEAX MOV ECX, 0003h // прочитанных байта данных MOV EDX,EAX //рочитанные данные о времени MOV EBX, 0000h //иксировать с нолевой ячейки CLD //иксировать вперёд REP STOSB //ама фиксация в оперативной памяти STI //азрешить прерывания RET //окинуть обработчик //EYBFUN0 ENDP KeybInit1: //EYBFUN1: //бработчик прерываний от клавиатуры (другой). New_09h: MOV AH, 09h //начала перейдём в драйвер 09h MOV EBX, 00h //ектор 09h ещё не определён MOV ECX, 2 //дрес вектора, должен содержать 2 байта MOV EDX, OFFSET Key_atd //агрузить блок для вектора MOV EDX, 0009h //аполнить блок его указанием CLD //бозначить вектор REP STOSB //авербовать вектор 09h в памяти KeyPush: PUSH EAX //охранить PUSH EBX //спользуемые PUSH ES //егистры. IN AL, 60h //вести скен-код клавиши. CMP AL, 4Eh //ерый плюс? JE Old_09h //а, на продолжение. POP EAX //ет, восстановить POP EBX //охранённые POP ES //егистры. Old_09h: //ойти в системный обработчик //онтролёра клавиатуры. IN AL, 09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL, 09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX, CS CMP EAX,EBX POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL, 09h //игнал в порт 09h MOV EDX, 0062 CMP EBX, 0001h JNZ Nxt2 MOV EDX, 0061 db 236 //N AL,EDX AND AL, 09h OR AL, 09h OUT 61, AL Nxt2: PUSH ECX MOV ECX, 0001 PUSH EDX POP ECX IN AL, 09h MOV AL, 20 OUT 20, AL POP EDX POP EAX CMP AL, 00h JZ Qt2 CMP AL, 02h JZ Qt2 MOV EAX, 0000h MOV EBX, 0001h MOV ECX, 0101h MOV EDX, 1111h IN AL, 09h //игнал в порт 09h PUSH DS MOV EAX, 4333 MOV DS,EAX MOV BYTE PTR CdEx1, 01h PUSH DS MOV EAX, 4333 MOV DS,EAX MOV BYTE PTR CdEx2, 02h POP DS POP EAX PUSH DS MOV EAX, 4333 MOV DS,EAX XOR BYTE PTR CdEx3, 04h POP DS POP EAX JB Plus Qt2: MOV EDX, 1111h MOV ECX, 0101h MOV EBX, 0001h MOV EAX, 0000h IN AL, 09h //игнал в порт 09h //ернулись из системного обработчика. //еперь поработаем со своим. Plus: PUSH EAX PUSH DS MOV AL, 61h //аправить запрос в IN AL, 61h //онтролёр клавиатуры, OR AL, 80h //тобы снять скен-код OUT 61h, AL //ажатой клавиши и AND AL, 7Fh //азрешить дальнейшую OUT 61h, AL //аботу контролёра. MOV AL, 20h //ослать в контролёр прерываний OUT 20h, AL //игнал EOI //олучить адрес флага InSys MOV EBX, In_sys //истема свободна? CMP EBX, 0 //ет, придётся ждать. JNE Wait_sys //ействие вызываемое нажатием клавиши. //а выход из обработчика. JMP Out_09h //становить флаг запроса запуска. Wait_sys: MOV EDX, 0000H //ask_reg INC EDX //ask_reg //NC BYTE PTR CS: Task_reg //ew_09hLen = $ - New_09h //афиксировать подпрограмму контролёра //ппаратного доступа клавиатуры INT 09h, //езидентно в памяти для дальнейших операций MOV EAX, 0009h //дрес вектора MOV EBX, 1 //искриптор занятости MOV ECX, 0128h //онец тела резидента MOV EDX, New_09h //ачало тела резидента PUSH EAX //анять в качестве рабочих, PUSH ES //ти же регистры CLD //аполнять буфер вперёд REP STOSB //иксация подпрограммы в буфере //бросить флаги, перед новой операцией POPF Out_09h: MOV AL, 20h //ослать в контролёр OUT 20h, AL //рерываний сигнал EOI POP ES //остановить сохранённые POP EBX //егистры. POP EAX STI //азрешить прерывания RET //окинуть обработчик //EYBFUN1 ENDP KeybInit2: //EYBFUN2: CLI //апретить прерывания PUSH EAX //начала перейти в драйвер 09h IN AL,09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL,09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX,CS CMP EAX,EBX POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL,09h //игнал в порт 09h MOV EDX,0062 CMP EBX,0001h MOV EDX,0061 db 236 //N AL,EDX AND AL,09h OR AL,09h OUT 61,AL MOV ECX,0001 PUSH EDX POP ECX IN AL,09h MOV AL,20 OUT 20,AL POP EDX CMP AL,01h POP EAX CMP AL,00h MOV EAX,0000h MOV EBX,0001h MOV ECX,0101h MOV EDX,1111h IN AL,09h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx1, 01h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx2, 02h POP DS POP EAX PUSH DS MOV EAX,4333 MOV DS,EAX XOR BYTE PTR CdEx3, 04h POP DS POP EAX MOV EDX,1111h MOV ECX,0101h MOV EBX,0001h MOV EAX,0000h IN AL,09h //игнал в порт 09h //ернулись из него. Сохраним все //ребуемые регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX PUSH EBP PUSH DS PUSH ES MOV EAX, CS //acторем сегментный регистр DS MOV DS,EAX //а этот сегмент MOV EAX, 40h //acтроем регистр ES MOV ES,EAX //а область данных BIOS //aчнём обработку символа, скопировав его из кольцевого //уфера ввода вEAX, но не изымая его при этом из буфера MOV EBX, 1Ah //дрес очередного символа MOV EAX,EBX //ведённый символ -> вEAX CMP EAX, 1000H //lt_Q //ажата клавиша завершения ? MOV EAX,EBX //ведённый символ -> вEAX CMP AH, 2 //кен-код меньше 2-х ? MOV EAX,EBX //ведённый символ -> вEAX CMP AH, 12 //кен-код больше 12-ти ? TEST BYTE PTR ES: 17h,40h //лаг - бит 6 PUSH EBX //X нам понадабится XCHG AH,AL //кен-код в AL для XLAT db 215 //LAT //рансляция POP EBX //occтановимEBX MOV EBX,EAX //аменим код ASCII // кольцевом буфере STI //азрешить прерывания RET //окинуть обработчик //EYBFUN2 ENDP KeybInit3: //EYBFUN3: CLI //апретить прерывания PUSH EAX //начала перейти в драйвер 09h IN AL,09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL,09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX,CS CMP EAX,EBX //OV WORD PTR [DI-34],EAX //MP WORD PTR [DI-34],00 //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-34] DB 184, 1, 255 //OV WORD PTR [DI-0Ch],EAX //DD BYTE PTR [BX+SI],AL //OV WORD PTR [DI-0Ch], 0000h //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //USH WORD PTR [DI-0Ch] //OV ECX,WORD PTR [DI-08] DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL PUSH CS //DD BYTE PTR [BX+SI],AL //DD BYTE PTR [BX+SI],AL ADD ESP,04 //OV WORD PTR [DI-38],EAX //MP WORD PTR [DI-38],00 //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-38] DB 184, 1, 255 //OV WORD PTR [DI-10],EAX //DD BYTE PTR [BX+SI],AL //OV WORD PTR [DI-10], 0000h //DD BYTE PTR [BX+SI],AL //OV EAX,WORD PTR [DI+10] //OV WORD PTR [DI-14],EAX //OV EAX,WORD PTR [DI-14] //USH WORD PTR [BX+SI+04] POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL,09h //игнал в порт 09h MOV EDX,0062 CMP EBX,0001h MOV EDX,0061 db 236 //N AL,EDX AND AL,09h OR AL,09h OUT 61,AL MOV ECX,0001 PUSH EDX POP ECX IN AL,09h MOV AL,20 OUT 20,AL POP EDX CMP AL,01h POP EAX CMP AL,00h MOV EAX,0000h MOV EBX,0001h MOV ECX,0101h MOV EDX,1111h IN AL,09h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx1, 01h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx2, 02h POP DS POP EAX PUSH DS MOV EAX,4333 MOV DS,EAX XOR BYTE PTR CdEx3, 04h POP DS POP EAX MOV EDX,1111h MOV ECX,0101h MOV EBX,0001h MOV EAX,0000h IN AL,09h //игнал в порт 09h //ернулись из него. Сохраним все //ребуемые регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX PUSH EBP PUSH DS PUSH ES STI //азрешить прерывания RET //окинуть обработчик //EYBFUN3 ENDP KeybInit4: //EYBFUN4: CLI //апретить прерывания PUSH EAX //начала перейти в драйвер 09h IN AL,09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL,09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX,CS CMP EAX,EBX //OV WORD PTR [DI-34],EAX //MP WORD PTR [DI-34],00 //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-34] DB 184, 1, 255 //OV WORD PTR [DI-0Ch],EAX //DD BYTE PTR [BX+SI],AL //OV WORD PTR [DI-0Ch], 0000h //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //USH WORD PTR [DI-0Ch] MOV ECX,08 DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL PUSH CS //DD BYTE PTR [BX+SI],AL //DD BYTE PTR [BX+SI],AL ADD ESP,04 //OV WORD PTR [DI-38],EAX //MP WORD PTR [DI-38],00 //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-38] DB 184, 1, 255 //OV WORD PTR [DI-10],EAX //DD BYTE PTR [BX+SI],AL //OV WORD PTR [DI-10], 0000h //DD BYTE PTR [BX+SI],AL //OV EAX,WORD PTR [DI+10] //OV WORD PTR [DI-14],EAX //OV EAX,WORD PTR [DI-14] //USH WORD PTR [BX+SI+04] POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL,09h //игнал в порт 09h MOV EDX,0062 CMP EBX,0001h MOV EDX,0061 db 236 //N AL,EDX AND AL,09h OR AL,09h OUT 61,AL MOV ECX,0001 PUSH EDX POP ECX IN AL,09h MOV AL,20 OUT 20,AL POP EDX CMP AL,01h POP EAX CMP AL,00h MOV EAX,0000h MOV EBX,0001h MOV ECX,0101h MOV EDX,1111h IN AL,09h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx1, 01h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx2, 02h POP DS POP EAX PUSH DS MOV EAX,4333 MOV DS,EAX XOR BYTE PTR CdEx3, 04h POP DS POP EAX MOV EDX,1111h MOV ECX,0101h MOV EBX,0001h MOV EAX,0000h IN AL,09h //игнал в порт 09h //ернулись из него. Сохраним все //ребуемые регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX PUSH EBP PUSH DS PUSH ES DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //OV ECX,WORD PTR [DI-08] DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //OV ECX,WORD PTR [DI-08],EAX DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //OV ECX,WORD PTR [DI-08] DB 184, 1, 255 MOV ECX,EAX DB 184, 1, 255 //OV WORD PTR [DI-24],EAX //DD BYTE PTR [BX+SI],AL DB 155, 220, 194 //ADD QWORD PTR [BX+SI] //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-24] DB 184, 1, 255 //OV WORD PTR [DI-28],EAX //MP WORD PTR [DI-28],00 //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI-24] //OV ECX,WORD PTR [DI-28] DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //OV ECX,WORD PTR [DI-08] DB 184, 1, 255 MOV ECX,EAX DB 184, 1, 255 //OV WORD PTR [DI-2Ch],EAX //MP WORD PTR [DI-2Ch],00 STI //азрешить прерывания RET //окинуть обработчик //EYBFUN4 ENDP KeybInit5: //EYBFUN5: CLI //апретить прерывания DB 155, 222, 194 //ADDP ST(2),ST OR AL,34 DB 155, 222, 194 //ADDP ST(2),ST OR AL,75 DB 155, 222, 137, 172, 54 //IMUL WORD PTR [BX+DI-53CAh] ADC BH,BH PUSH CS CLD REP STOSB //DC CL,BYTE PTR [BP+DI] //EG BYTE PTR [BP-3D] PUSH EAX PUSH ESI PUSH EDI PUSH DS PUSH EAX //начала перейти в драйвер 09h IN AL,09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL,09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX,CS CMP EAX,EBX //OV WORD PTR [DI-34],EAX //MP WORD PTR [DI-34],00 //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-34] DB 184, 1, 255 //OV WORD PTR [DI-0Ch],EAX //DD BYTE PTR [BX+SI],AL //OV WORD PTR [DI-0Ch], 0000h //DD BYTE PTR [BX+SI],AL //USH WORD PTR [DI+10] //USH WORD PTR [DI-0Ch] //OV ECX,WORD PTR [DI-08] DB 184, 1, 255 //OV WORD PTR [DI-04],EAX //DD BYTE PTR [BX+SI],AL PUSH CS //DD BYTE PTR [BX+SI],AL //DD BYTE PTR [BX+SI],AL ADD ESP,04 //OV WORD PTR [DI-38],EAX //MP WORD PTR [DI-38],00 //DD BYTE PTR [BX+SI],AL //OV ECX,WORD PTR [DI-38] DB 184, 1, 255 //OV WORD PTR [DI-10],EAX //DD BYTE PTR [BX+SI],AL //OV WORD PTR [DI-10], 0000h //DD BYTE PTR [BX+SI],AL //OV EAX,WORD PTR [DI+10] //OV WORD PTR [DI-14],EAX //OV EAX,WORD PTR [DI-14] //USH WORD PTR [BX+SI+04] POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL,09h //игнал в порт 09h MOV EDX,0062 CMP EBX,0001h MOV EDX,0061 db 236 //N AL,EDX AND AL,09h OR AL,09h OUT 61,AL MOV ECX,0001 PUSH EDX POP ECX IN AL,09h MOV AL,20 OUT 20,AL POP EDX CMP AL,01h POP EAX CMP AL,00h MOV EAX,0000h MOV EBX,0001h MOV ECX,0101h MOV EDX,1111h IN AL,09h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx1, 01h PUSH DS MOV EAX,4333 MOV DS,EAX MOV BYTE PTR CdEx2, 02h POP DS POP EAX PUSH DS MOV EAX,4333 MOV DS,EAX XOR BYTE PTR CdEx3, 04h POP DS POP EAX MOV EDX,1111h MOV ECX,0101h MOV EBX,0001h MOV EAX,0000h IN AL,09h //игнал в порт 09h //авершить работу системной //одпрограммы и выйти из //бработчика. KeybExit: POP EAX POP EBX POP EDX POP EDX STI //азрешить прерывания RET //окинуть обработчик //EYBFUN5 ENDP //EYBORD ENDP //ункции работы с клавиатурой реализуемые //истемной подпрограммой INT 16h //ntr16hLen = $ - Intr16h //онец подпрограммы обработчика INT 16h //истемная программа INT 17h Intr17h: PRINT: CLI //апретить прерывания //ачать процедуру распознавания функции //аботы с дисковым носителем по запросу //ользователя (вызов этой системной программы //з буфера таблицы резидента BIOS, находящегося // базовой части оперативной памяти, через //рерывание INT 17h) PUSH EAX //адействовать регистрEAX //ля дальнейших действий POP EBX //егистрEBX оставить //вободным для фиксации //казание на мнимый флаг AH илиEAX, //ри отсутствии ясной фиксации управлящей //рограммы процессора AAS //одсчитаем, что занятый флаг AH илиEAX //уществует в любом случае, как-бы то //ибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB PUSH EAX //оррекция управляющего регистра //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая функция системной программы //ыла затребована пользователем, вмести с вызовом //рерывания INT 17h //ействия в зависимости от занятого флага CMP AH, 00h JE Prnt1 //ечать страницы CMP AH, 01h JE Prnt2 //ыяснение порта CMP AH, 02h JE Prnt3 //олучение системной информации //абота с печатью на стандартном //ёрнобелом принтере Prnt1: MOV AH,2Dh MOV EBX,0001h MOV EAX,0000h MOV EAX,0002h MOV AH,34 MOV EBX,0001h DB 180, 75 //OV AH,4B MOV AL,00 MOV AH,3Dh MOV AL,00 MOV AH,4Fh MOV EAX,0002 MOV AH,2Dh MOV EBX,0001h MOV EAX,0000h MOV EAX,0002h MOV AH,34 MOV EBX,0001h DEC ESI INC EDX //OR BYTE PTR [BX+SI],BH DB 155, 220, 194 //ADD DWORD PTR [BP+SI] //ontrol tochka 1 // этой команды, печать идёт... RET //окинуть обработчик //ыяснение порта к которому подсоединён принтер. Prnt2: PUSH EDX //R1 //USH Word Ptr ES:[4602] //USH Word Ptr [BP+06] PUSH DS POP ESI //USH Word Ptr [BP+06] ADD ESP, 04 INC EAX ADD ESP, 0Ch CMP EAX, 0Ch PUSH ESI POP EDI ADD ESP, 04 ADD ESP, 0Ch ADD ESP, 04 MOV EBX, EAX ADD EDI, 0Bh CMP EDI, 0Bh PUSH ESI POP EDI ADD ESP, 0Bh MOV ESI, EBP PUSH DS PUSH EBP PUSH EDI ADD ESP, 08 RET //окинуть обработчик //ыяснение параметров системного принтера Prnt3: ADD ESI, 03 MOV EBX, 04 CMP EBX, 02 PUSH EDX POP ECX //USH Word Ptr ES:[4F44h] //USH Word Ptr ES:[2E7Ah] //USH Word Ptr ES:[2E78h] ADD ESP, 08 //USH Word Ptr ES:[4F44h] //USH Word Ptr ES:[2E7Ah] //USH Word Ptr ES:[2E78h] PUSH DS PUSH ESI ADD ESP, 04 INC EAX PUSH EAX PUSH ECX PUSH DS PUSH ESI STI //еперь, прерывания уже //ожно использовать RET //окинуть обработчик //RINT ENDP //ntr17hLen = $ - Intr17h //онец подпрограммы обработчика INT 17h //истемная программа INT 18h LOADSYS: CLI //апретить прерывания // начала инициировать подпрограмму работы //аботы сопративления сопроцессора INT 75h. //на нужна, будет для пересылки тела //сполняемой программы из буфера памяти, //а процессор для выполнения. PUSHF //oxpaнить флaги для команды IRET MOV AH, 75h //начала перейдём в драйвер 75h MOV EBX, 00h //ектор 75h ещё не определён MOV ECX, 2 //дрес вектора, должен содержать 2 байта MOV EDX, OFFSET atd2 //агрузить блок для вектора MOV EDX, 0075h //аполнить блок его указанием CLD //бозначить вектор REP STOSB //авербовать вектор 75h в памяти //роцедура IOS инициализации программы прерывания 75Н Proces: PUSH EAX POP EBX POP ECX PUSH EDX XOR AL, AL CMP EAX, 75h TEST EAX, 75h OUT 75h,EAX IN EAX, 75h MOV EAX, 0001h OUT 75h,EAX MOV EAX, 0001h IN EAX, 75h CMP EAX, 0Ah TEST EAX, 0Ah OUT 0Ah,EAX IN EAX, 0Ah OUT 75h,EAX IN EAX, 75h IN AL, 0Ah OUT 0Ah, AL POP EDX POP EAX //rocesLen = $ - Proces //афиксировать подпрограмму сопративления //опроцессора INT 75h, резидентно в памяти //ля дальнейших операций MOV EAX, 0075h //дрес вектора MOV EBX, 1 //искриптор занятости MOV ECX, 0064h //онец тела резидента MOV EDX, Proces //ачало тела резидента PUSH EAX //анять в качестве рабочих, PUSH EDX //ти же регистры CLD //аполнять буфер вперёд REP STOSB //иксация подпрограммы в буфере //бросить флаги, перед новой операцией POPF //oxpaнитьEAX прерваной программы PUSH EAX IN AL, 0Ah //едомое устройство CMP AL, 0 JNE NxtBoot //cли регистр AL = 0 //олевое определение устройства ? POP EAX //осстановитьEAX //.. и перейти в системный обработчик NxtBoot: MOV EDX, Old_disk //aша собственная обработка прерываний, от сопроцессора. //режде всего следует выполнить определённые действия, // порте (75h) программируемого программного интерфейса OR AL, 0Ah OUT 75h, AL AND AL, 7Fh OUT 75h, AL //ействия по нажатию по приёму системных запросов. PUSH EBP MOV EBP,ESP //агрузить адрес аварийного завершения в стёк, на место //ормального адреса возврата. Стёк сейчас смещён, //тносительно адреса возврата, на 2 слова (командами //USHEAX и PUSHEBP) MOV EBP, Old_disk POP EBP //occтановитьEBP //эширование доступа к контралёру дискового //акопителя MOV EDX, 0Ah //орт контролёра MOV AL, 11h //КИ1: будет СКИЗ db 238 //UT EDX, AL INC EDX //торой порт контролёра MOV AL, 8 //КИ2: базовый вектор db 238 //UT EDX, AL MOV AL, 4 //КИЗ: ведомый подключен // уровню 2 db 238 //UT EDX, AL MOV AL, 1 //КИ4: 80x86, требуется EOI db 238 //UT EDX, AL //нициализация ведомого контролёра прерываний MOV EDX, 0Ah //орт контролёра MOV AL, 11 //КИ1: будет СКИЗ db 238 //UT EDX, AL INC EDX //торой порт контролёра MOV AL, 70h //КИ2: базовый вектор db 238 //UT EDX, AL MOV AL, 2 //КИЗ: ведомый подключен // уровню 2 db 238 //UT EDX, AL MOV AL, 1 //КИ4: 80x86, требуется EOI db 238 //UT EDX, AL ADD AL, "1" //реобразовать в символьную форму. MOV AH, 1Eh //роизвольный аттрибут пиксела. //нициализация доступа к дисковому накопителю, // которого предстоит загрузить операционную //истему. PUSH EAX //охранить используемые в PUSH ES //бработчике регистры. POP EBX //свободить нужные регистры с POP ECX // которыми, мы будем работать. POP EDX MOV EAX, 0A800h //астроить ES MOV ES,EAX //а адрес буфера памяти. MOV EBX, 0000h // запросе подаётся битовая маска, MOV EBX,EAX //остоящая из 2-х свободных байтов. MOV ECX, 2 //од запроса устройства - 2 байта. OUT 0Ah, AL //ослать в контролёр прерываний //оманду 0Ah - разрешения чтения. //егистра ISR. MOV EAX,EBX //рочитать ответный сигнал с ведомого IN AL, 0Ah //стройства ISR. CLD //иксация в памяти. REP STOSB //апомнить данные вектора в памяти. MOV EAX, 1680 //роцессор готов к операции //о вводу/выводу с устройства. //ыяснение типа дискового накопителя: //Ah - Ведомый доступ к устройству//0Eh - Гибкий дисковод/ //6h - Жёсткий диск//70h - ПЗУ-микросхема, 72h - Накопитель //естандартного типа (CD-дисковод, Переносной ZIP-Drive, //SB-диск и т.д.). Resume: MOV EBX, 0001h //о одному байту MOV ECX, 0002h //азмер полученного кода - 2 байта. CMP EDX, 000Ah //бщая шина доступа ко всем внешним JE PhisikDisk //стройствам. JNE PortDrive CMP EDX, 0070h //ЗУ-микросхема. JE PhisikDisk JNE PortDrive CMP EDX, 000Eh //ибкий дисковод. JE PhisikDisk JNE PortDrive CMP EDX, 0076h //ёсткий диск. JE PhisikDisk JNE PortDrive CMP EDX, 0072h //естандартное устройство JE PortDrive JNE PhisikDisk //ЕЗ ДРАЙВЕРОВ //епосредственное выполнение программы, с устройства //анной битовой маски, без соответствующего драйвера. //агрузить в оперативную память и выполнить ту //рограмму на которую поступил запрос. //роцедура выполнения программы процессором. PhisikDisk: MOV ES,EAX //астроить регистр ES MOV EAX,EDX //дрес вектора ycтройства. MOV EBX, 0001h //искриптор задействован. PUSH CS //ам понадобиться CS. POP ES //егистр ES опустим. Здесь он нам //е нужен. XOR EDI,EDI //S:DI -> начало блока. MOV CL, 0 //ластер. MOV DH, 0 //ектор. INC DL //иск по умалчанию. //OV DL, BYTE PTR Old_disk SHL DH, CL //двиг номер кластера на № сектора. OR DH, 0 //ли значение 1, может быть 2. MOV DS,EAX //астроить регистр DS XOR EDI,ESI //S:EDI -> начало блока. MOV ECX, 1024 //колько читать (размер, в байтах), //024 байта - размер загрузочного сектора. MOV EDX, OFFSET BootProg //агрузка буфера памяти. MOV EDI,EAX //ткуда брать данные //роизвольного доступа. PUSH EAX //ам понадобитьсяEAX. POP EBX //егистрEBX опустим. Здесь он нам не нужен MOV EDX, 13h //ектор доступа к устройству //13h - гибкий дисковод или жёсткий диск. XCHG AL, AH //одготовка читаемых кодов INC ECX //егистра AL для трансляции. MOV CL, 08h //айтовый принцеп: по 8 IN AL, 13h // IN AL, 13h // IN AL, 13h // IN AL, 13h // IN AL, 13h // IN AL, 13h // IN AL, 13h // IN AL, 13h // db 215 //LAT //расляция байтов процессором. CLD //аправляем байты вперёд. REP STOSB //ыпонение программы процессором. POP EAX //осстановитьEAX. Чтобы вывести с //роцессора отработанные байты, //оступившие из оперативной памяти. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //еперь, наоборот послать на устройство проверочный сигнал // том, что устройство исправно и с него можно, загружать //очернею BOOT-программу. MOV ES,EAX //астроить регистр ES MOV EAX,EDX //дрес вектора ycтройства. MOV EBX, 0001h //искриптор задействован. PUSH CS //ам понадобиться CS. POP ES //егистр ES опустим. Здесь он нам //е нужен. XOR EDI,EDI //S:DI -> начало блока. MOV CL, 0 //ластер. MOV DH, 0 //ектор. INC DL //иск по умалчанию. //OV DL, BYTE PTR Old_disk SHL DH, CL //двиг номер кластера на № сектора. OR DH, 0 //ли значение 1, может быть 2. MOV DS,EAX //астроить регистр DS XOR EDI,ESI //S:EDI -> начало блока. MOV ECX, 1024 //колько посылать (размер, в байтах), //024 байта - размер загрузочного сектора. MOV EDX, OFFSET BootProg //агрузка буфера памяти. MOV EDI,EAX //ткуда брать данные //роизвольного доступа. PUSH EAX //ам понадобитьсяEAX. POP EBX //егистрEBX опустим. Здесь он нам не нужен MOV EDX, 13h //ектор доступа к устройству //13h - гибкий дисковод или жёсткий диск. INC ECX //одготовка читаемых кодов XCHG AL, AH //егистра AL для трансляции. MOV CL, 08h //айтовый принцеп: по 8 OUT 13h, AL // OUT 13h, AL // OUT 13h, AL // OUT 13h, AL // OUT 13h, AL // OUT 13h, AL // OUT 13h, AL // OUT 13h, AL // db 215 //LAT //расляция байтов процессором. CLD //аправляем байты вперёд. REP STOSB //ыпонение программы процессором. POP EAX //осстановитьEAX. Чтобы вывести с //роцессора отработанные байты, //оступившие из оперативной памяти. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //ерейти на работу с установочными функциями по //пределению работоспособности и файловой системы //искогового накопителя, в том случае, если при попытке //агрузки программы BOOT-сектора была выявлена ошибка //тения данных с диска или из последовательного //орта, типа COM, LPT, USB и пр. JMP FatBoot //епосредственное выполнение программы, с устройства //анной битовой маски, без соответствующего драйвера. //агрузить в оперативную память и выполнить ту //рограмму на которую поступил запрос. //роцедура выполнения программы процессором. PortDrive: MOV ES,EAX //астроить регистр ES MOV EAX,EDX //дрес вектора ycтройства. MOV EBX, 0001h //искриптор задействован. PUSH CS //ам понадобиться CS. POP ES //егистр ES опустим. Здесь он нам //е нужен. XOR EDI,EDI //S:DI -> начало блока. MOV CL, 0 //ластер. MOV DH, 0 //ектор. INC DL //иск по умалчанию. //OV DL, BYTE PTR Old_disk SHL DH, CL //двиг номер кластера на № сектора. OR DH, 0 //ли значение 1, может быть 2. MOV DS,EAX //астроить регистр DS XOR EDI,ESI //S:EDI -> начало блока. MOV ECX, 1024 //колько читать (размер, в байтах), //024 байта - размер загрузочного сектора. MOV EDX, OFFSET BootProg //агрузка буфера памяти. MOV EDI,EAX //ткуда брать данные //роизвольного доступа. PUSH EAX //ам понадобитьсяEAX. POP EBX //егистрEBX опустим. Здесь он нам не нужен MOV EDX, 14h //ектор доступа к устройству //14h - последовательный порт COM, LPT и пр. INC ECX //одготовка читаемых кодов XCHG AL, AH //егистра AL для трансляции. MOV CL, 08h //айтовый принцеп: по 8 IN AL, 14h // IN AL, 14h // IN AL, 14h // IN AL, 14h // IN AL, 14h // IN AL, 14h // IN AL, 14h // IN AL, 14h // db 215 //LAT //расляция байтов процессором. CLD //аправляем байты вперёд. REP STOSB //ыпонение программы процессором. POP EAX //осстановитьEAX. Чтобы вывести с //роцессора отработанные байты, //оступившие из оперативной памяти. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //еперь, наоборот послать на устройство проверочный сигнал // том, что устройство исправно и с него можно, загружать //очернею BOOT-программу. MOV ES,EAX //астроить регистр ES MOV EAX,EDX //дрес вектора ycтройства. MOV EBX, 0001h //искриптор задействован. PUSH CS //ам понадобиться CS. POP ES //егистр ES опустим. Здесь он нам //е нужен. XOR EDI,EDI //S:DI -> начало блока. MOV CL, 0 //ластер. MOV DH, 0 //ектор. INC DL //иск по умалчанию. //OV DL, BYTE PTR Old_disk SHL DH, CL //двиг номер кластера на № сектора. OR DH, 0 //ли значение 1, может быть 2. MOV DS,EAX //астроить регистр DS XOR EDI,ESI //S:EDI -> начало блока. MOV ECX, 1024 //колько посылать (размер, в байтах), //024 байта - размер загрузочного сектора. MOV EDX, OFFSET BootProg //агрузка буфера памяти. MOV EDI,EAX //ткуда брать данные //роизвольного доступа. PUSH EAX //ам понадобитьсяEAX. POP EBX //егистрEBX опустим. Здесь он нам не нужен MOV EDX, 14h //ектор доступа к устройству //14h - последовательный порт COM, LPT и пр. INC ECX //одготовка читаемых кодов. XCHG AL, AH //егистра AL для трансляции. MOV CL, 08h //айтовый принцеп: по 8 OUT 14h, AL // OUT 14h, AL // OUT 14h, AL // OUT 14h, AL // OUT 14h, AL // OUT 14h, AL // OUT 14h, AL // OUT 14h, AL // db 215 //LAT //расляция байтов процессором. CLD //аправляем байты вперёд. REP STOSB //ыпонение программы процессором. POP EAX //осстановитьEAX. Чтобы вывести с //роцессора отработанные байты, //оступившие из оперативной памяти. //аполнить второй байт сигмента, для контроля //OV BYTE PTR ES:[DI], 0 //ерейти на работу с установочными функциями по //пределению работоспособности и файловой системы //искогового накопителя, в том случае, если при попытке //агрузки программы BOOT-сектора была выявлена ошибка //тения данных с диска или из последовательного //орта, типа COM, LPT, USB и пр. //агрузка стандартных параметров файловой системы FAT и //айтовые сигналы на устройство FatBoot: MOV EDX, OFFSET SizeDrv //агрузка параметров IN AL, 0Ah //осылка сигналов OUT 0Ah, AL //олучение ответных сигналов // устройства MOV EDX, OFFSET SizeCol1 //агрузка параметров IN AL, 0Ah //осылка сигналов OUT 0Ah, AL //олучение ответных сигналов // устройства MOV EDX, OFFSET SizeCol2 //агрузка параметров IN AL, 0Ah //осылка сигналов OUT 0Ah, AL //олучение ответных сигналов // устройства MOV EDX, OFFSET SizeCol3 //агрузка параметров IN AL, 0Ah //осылка сигналов OUT 0Ah, AL //олучение ответных сигналов // устройства MOV EDX, OFFSET SizeCol4 //агрузка параметров IN AL, 0Ah //осылка сигналов OUT 0Ah, AL //олучение ответных сигналов // устройства MOV EDX, OFFSET SizeCol5 //агрузка параметров IN AL, 0Ah //осылка сигналов OUT 0Ah, AL //олучение ответных сигналов // устройства //еперь прочитать по байту с устройства POP ES //осстановить сохранённые POP EAX //егистры ADD AL, "0" //реобразовать в символьную форму MOV AH, 4Eh //трибут для наглядности другой MOV EAX, 1690 MOV AL, 0Eh //игнал EOI PUSH EAX //aзрешить прерывания от контролёра дискового IN AL, 21h //рочитать текущею маску AND AL, 0FEh //бросить выборочно бит 0 OUT 0Ah, AL //ослать в регистр маски //рансляция отдельного байта MOV EAX, OFFSET Bytes SBB AL, 00 //расляция каждого кластера MOV EBX, OFFSET BytClast DEC ESP LAHF //агрузка младшего байта в AH PUSHF //агрузка регистра в стёк POP EAX //иксирование прочитанных данных со //тандартными параметрами файловой //истемы FAT IN EAX, 0Ah MOV ECX, 01FFh //азмер кластера - 512 байт MOV EDX, OFFSET SizeDrv //исло кластеров на дорожке MOV EBX,ESI CLD //равнивать вперёд REP CMPSB //равнение //расляция каждого кластера MOV EBX, OFFSET BytClast DEC ESP LAHF //агрузка младшего байта в AH PUSHF //агрузка регистра в стёк POP EAX //верка параметров прочитанного кластера IN EAX, 0Ah MOV EAX, 0008h //исло битов в байте MOV ECX, 01FFh //азмер кластера - 512 байт MOV EDX, OFFSET SizeDrv //исло кластеров на дорожке CLD //равнивать вперёд REP CMPSB //равнение //читать содержимое каждого кластера в буфер //перативной памяти для концентрации MOV ECX, 01FFh //азмер кластера - 512 байт MOV EAX, OFFSET BytClast MOV ES,EAX MOV ESI, OFFSET BytClast MOV EDI, OFFSET BytClast REPE CMPSB //онцентрация задействована //адействовать прочитанную информацию, для //озможных последующих действий со стороны //ользователя (чтения, записи, форматирования, //канирования на наличие ошибок доступа и т.д.) MOV ECX, 0512h MOV EAX, DS //acтpoить сегментный MOV ES,EAX //eгиcтp на область дaнных MOV ESI, OFFSET BytClast MOV EDI, OFFSET BytClast //агрузить содержимое REP MOVSB //рочитанные данные открыты для доступа //иксирование прочитанных данных в буфере //перативной памяти для нужд пользователя OUT 0Ah,EAX MOV EAX,8 //исло битов в байте MOV ECX, 01FFh //азмер кластера - 512 байт MOV EDX, OFFSET SizeDrv //исло кластеров на дорожке CLD //равнивать вперёд REP CMPSB //равнение //акрепить параметры для последующих операций PUSH EAX POP EBX MOV AL,0232 MOV DH,0032 MOV ESI,00 //расляция каждого кластера MOV EBX, OFFSET BytClast DEC ESP LAHF //агрузка младшего байта в AH PUSHF //агрузка регистра в стёк PUSH EAX PUSH EBX PUSH EDX POP ECX ADD AH,BH CLD //равнение //расляция каждого кластера MOV EBX, OFFSET BytClast DEC ESP LAHF //агрузка младшего байта в AH PUSHF //агрузка регистра в стёк POP EAX //олучить индекс SFT из JFT, находящийся в PSP MOV EDI, 18h ADD EDI,EAX MOV CL, DL XOR CH, CH //олучить доступ, к системной таблице файлов MOV EDI,EBX CMP ECX,EDI JB Here SUB ECX,EDI MOV EDI,EBP //aшли ту SFT, в которой наш индекс Here: MOV EAX, 59 MUL CL ADD EDI, 6 ADD EDI,EAX MOV EAX, 11h MOV EDX, 13h MOV EDI, 8 MOV BL, 8 INC BL XOR BH, BH MOV CL, 9 SHL EBX, CL MOV ESI,EBX MUL EDX NOT ECX //нверсия читаемых байтов //егистр данныхEDX займём, а регистр счётчика //айтECX, наоборот освободим PUSH EDX POP ECX //рансляция каждой из дорожек дискового накопителя MOV EDX, OFFSET Path PUSHF //охранить флаги для дальнейшей операции DB 240, 1 SBB EAX,EBP //оследний этап трансляции перед загрузкой MOV AL,08 //исло бит в байте SBB EBX,ESP MOV ECX,01FFh //азмер кластера - 512 байт MOV EDX,0000h //од завершения текущей функции CLD //равнивать вперёд REP CMPSB //равнение //адействовать буфер оперативной памяти, для загрузки // него исполняемой программы с целью, последующей //одачи на процессор для её выполнения MOV AL,08 //исло бит в байте SBB EBX,ESP MOV ECX,03FFh //азмер буфера - 1024 байта MOV EDX,0000h //од завершения текущей функции CLD //егистрировать буфер вперёд REP STOSB //иксация буфера памяти //ополнительные программные установочные //роцедуры (не обязательны к выполнению, //.к. программа BOOT-сектора, уже загружена). LdProg: POPF //бросить занятость флагов PUSH EAX POP EDX //дрес начала программного файла, в таблице FAT. MOV EDX, OFFSET BootProg MOV CL, 06 //искриптор чтения программного файла. SHL DH, CL OR DH, BYTE PTR CodeLoady //озможные особенности. //осылка каждого читаемого байта из памяти на процессор, //ля выполнения. MOV ECX,EDX XCHG CL, CH //нициализация выполнения процессором, программы системного файла. MOV DL, BYTE PTR BootProg MOV DH, BYTE PTR CodeLoady //агрузка программы на выполнение MOV EAX, OFFSET CodeLoady MOV ECX, OFFSET SizeProg //акс. размер программы CLD //аполнять вперёд REP STOSB //аполнение выделенного блока IN EAX, 75h //осылка 8-ми ричного IN EAX, 75h //айтового сигнала IN EAX, 75h //а процессор IN EAX, 75h IN EAX, 75h //5h - код сопративления IN EAX, 75h //опроцессора IN EAX, 75h IN EAX, 75h //роверить тот-ли флаг занят и закрыть //екущею операцию MOV EAX,0075h OUT 75h,EAX CMP EAX, 75h JNE Err_Load JE Exitprg OUT 75h,EAX CMP EAX, 75h JNE Err_Load JE Exitprg //сли, обнаружена ошибка доступа, то //астроить сегментный регистр ES на страницу //идеобуфера... Err_Load: MOV EAX, 0B800h MOV ES, EAX //.. и вывеcти на дисплей текстовую строку, по //оответствующей процедуре выполнения команд IOS, //ез запроса прерываний BIOS и DOS // PUSH 0 // PUSH OFFSET Err_Mes // PUSH OFFSET Err_Mes // PUSH 0 // CALL _imp__MessageBoxA@16 MOV EBX, OFFSET Err_Mes //дрес строки MOV EDI, 22 * 80 * 1 + 1 * 2 // низ экрана MOV ECX, 0052H //rr_MesLen //лина строки REP MOVSB //афиксировать передачу в заданной позиции Exitprg: TEST EAX,EDX POP EAX POP EBX POP ECX POP EDX STI //азрешить прерывания RET //окинуть обработчик //анные об стандартных параметрах дискового накопителя. //анные о прогамме начальной загрузки операционной //истемы, хранящейся в BOOT-секторе системного диска. //OADSYS ENDP //ntr18hLen = $ - Intr18h //онец подпрограммы обработчика INT 18h //истемная программа INT 19h Intr19h: RESTART: CLI //ез запроса прерываний //ама программа перезагрузки //омпьютера по процедуре IOS MOV EAX, 4000h PUSH EAX POP DS //emminy MOV WORD PTR [0072h], 1234 db 199, 6, 114, 0, 52, 18 db 184, 255, 255 //OV EAX, FFFFh PUSH EAX MOV EAX,0000h PUSH EAX RET //ыхода не предусмотрено, //ак как данная программа //ерезагружает систему. //ополнительные парамеры, которые могут //ыть затребованы подпрограммой INT 19h OR ESI,1Eh CMP ECX,0153 JE Rstr CMP ECX,0147 JE Rstr CMP ECX,014Fh JE Rstr CMP ECX,014Dh JE Rstr CMP ECX,014Bh JNZ Rstr2 MOV EAX,EDI DEC EAX JE Rstr3 DEC EAX JE Rstr2 CMP ECX, 4Bh JNZ Rstr2 CMP ECX, 6Bh JE Rstr3 STC DEC EBP JE Rstr2 CMP ECX, 6Dh JNZ Rstr3 CMP ECX, 20 JL Rstr3 CMP ECX,2EFFh JGE Rstr2 PUSH EAX PUSH EBX ADD ESP, 04 MOV EAX, 110Eh MOV EDX, 1110h Rstr: PUSH EAX CMP ECX, 20 CMP EDX, 22 JL Rstr2 CMP ECX,2EFFh JGE Rstr2 Rstr2: ADD ESP, 04 MOV EDX, 544Fh MOV EAX, 2E8Ah POP EDX NOP PUSH CS POP EBX CMP EDI, 01 JZ Rstr3 AND EBP,02FFh JNZ Rstr2 PUSH EDX PUSH ECX PUSH EAX ADD ESP, 06 ADD EDI, 03 MOV EAX, 0000h Rstr3: ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI ADD EBX,ESI //ESTART ENDP //ntr19hLen = $ - Intr19h //онец подпрограммы обработчика INT 19h //истемная программа INT 1Ah CMOS: CLI //апретить прерывания MOV EBP,EAX MOV EAX, ES // начала инициировать подпрограмму работы //аботы сопративления сопроцессора INT 08h. //на нужна, будет для пересылки тела //сполняемой программы из буфера памяти, //а процессор для выполнения. PUSHF //oxpaнить флaги для команды IRET MOV AH, 08h //начала перейдём в драйвер 08h MOV EBX, 00h //ектор 08h ещё не определён MOV ECX, 2 //дрес вектора, должен содержать 2 байта MOV EDX, OFFSET atd8 //агрузить блок для вектора MOV EDX, 0008h //аполнить блок его указанием CLD //бозначить вектор REP STOSB //авербовать вектор 08h в памяти //бработчик прерываний тактового генератора по INT 08h //обработка аппаратного прерывания). Reset_08h: PUSH EAX //охраним используемые в PUSH ES //бработчике регистры MOV EAX, 0B800h //астроим ES на адрес видеобуфера MOV ES,EAX MOV AL, 0Bh //ошлём в контролёр прерываний OUT 20h, AL //оманду 0Bh - разрешения чтения //егистра ISR JMP $+2 //eбольшая задержка IN AL, 20h //рочитаем регистр ISR ADD AL, "0" //реобразуем в символьную форму MOV AH, 1Eh //роизвольный аттрибут символа MOV EAX, 1680 MOV AL, 20h //ошлём в ведущий контролёр OUT 20h, AL //оманду EOI JMP $+2 //eбольшая JMP $+2 //адержка IN AL, 20h //нова прочитаем регистр ADD AL, "0" //реобразуем в символьную форму MOV AH, 4Eh //трибут для наглядности другой MOV EAX, 1690 //ыведем на экран в другое место POP ES //осстановить сохранённые POP EAX //егистры //eset_08hLen = $ - Reset_08h //афиксировать подпрограмму контролёра //актового генератора CMOS - памяти INT 08h, //езидентно в памяти для дальнейших операций MOV EAX, 0008h //дрес вектора MOV EBX, 1 //искриптор занятости MOV ECX, 0064h //онец тела резидента MOV EDX, Reset_08h //ачало тела резидента PUSH EAX //анять в качестве рабочих, PUSH ES //ти же регистры CLD //аполнять буфер вперёд REP STOSB //иксация подпрограммы в буфере //бросить флаги, перед новой операцией POPF //ткрыть доступ, непосредственно к устройству //актового генератора CMOS - памяти MOV EDX, 0008h //орт контролёра MOV AL, 11h //КИ1: будет СКИ3 db 238 //UT EDX, AL //ервый контакт с //стройством. INC EAX //егистромEAX к нему, теперь //ткрыт постоянный доступ. MOV AL, 08h //едомый вектор тоже задействован. db 238 //UT EDX, AL //еперь, всё готово для работы с //стройством генератора. //ывод из тактового генератора CMOS - памяти //анных о текущих времени и дате. //начала о текущем времени. MOV EDX, 0008h //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима чтения MOV EBX, 0000h //ачать с байта 0 по ASCII MOV ECX, 0003h //исло байтов данных о //екущем времени. MOV EDX, OFFSET Tims //агрузка буфера памяти //ля концентрации прочитанных //анных. INC EDX //X = 0008h - Регистр данных. IN AL, 08h //осылка пробного сигнала IN AL, 08h // порт устройства CMOS-генератора IN AL, 08h //з 3-х байтов. CMP ECX, 03h //иксировать 3 задействованых байта OUT 08h, AL //олучение ответного сигнала из OUT 08h, AL //орта устройства CMOS-генератора OUT 08h, AL //з 3-х байтов. CMP ECX, 03h //иксировать 3 прочитанных байта //езидентная фиксация в выделеном буфере памяти //анных тактового CMOS - генератора о текущем //ремени, для дальнейшего использования программой //ользователя. XCHG AL, AH //начение регистра AL, должно //оответствовать региструEAX MOV ECX, 0003h // прочитанных байта данных MOV EDX,EAX //рочитанные данные о времени MOV EBX, 0000h //иксировать с нолевой ячейки CLD //иксировать вперёд REP STOSB //ама фиксация в оперативной памяти //еперь о текущей дате. MOV EDX, 0008h //орт вывода данных MOV AL, 0 //ежим записи 0 db 238 //UT EDX, AL //становка режима чтения MOV EBX, 0003h //ачать с байта 3 по ASCII MOV ECX, 0004h //исло байтов данных о //екущей дате. MOV EDX, OFFSET Dats //агрузка буфера памяти //ля концентрации прочитанных //анных. INC EDX //X = 0008h - Регистр данных. IN AL, 08h //осылка пробного сигнала IN AL, 08h // порт устройства CMOS-генератора IN AL, 08h //з 4-х байтов. IN AL, 08h CMP ECX, 04h //иксировать 4 задействованых байта OUT 08h, AL //олучение ответного сигнала из OUT 08h, AL //орта устройства CMOS-генератора OUT 08h, AL //з 4-х байтов. OUT 08h, AL CMP ECX, 04h //иксировать 4 прочитанных байта //езидентная фиксация в выделеном буфере памяти //анных тактового CMOS - генератора о текущей //егодняшней дате, для дальнейшего использования //рограммой пользователя. XCHG AL, AH //начение регистра AL, должно //оответствовать региструEAX MOV ECX, 0004h // прочитанных байта данных MOV EDX,EAX //рочитанные данные о дате MOV EBX, 0003h //иксировать с третий ячейки CLD //иксировать вперёд REP STOSB //ама фиксация в оперативной памяти PUSHF //охранить занятые флаги, для //ранзитного процесса. STI //азрешить прерывания RET //окинуть обработчик //MOS ENDP //ntr1AhLen = $ - Intr1Ah //онец подпрограммы обработчика INT 1Ah //истемная программа INT 1Bh BREAK_: CLI //апретить прерывания // начала инициировать подпрограмму работы //аботы сопративления сопроцессора INT 09h. //на нужна, будет для пересылки тела //сполняемой программы из буфера памяти, //а процессор для выполнения. PUSHF //oxpaнить флaги для команды IRET MOV AH, 09h //начала перейдём в драйвер 09h MOV EBX, 00h //ектор 09h ещё не определён MOV ECX, 2 //дрес вектора, должен содержать 2 байта MOV EDX, OFFSET atd12 //агрузить блок для вектора MOV EDX, 0009h //аполнить блок его указанием CLD //бозначить вектор REP STOSB //авербовать вектор 09h в памяти //бработчик прерываний контролёра клавиатуры по INT 09h //обработка аппаратного прерывания). //ереход на секцию инициализации Reset2_09h: PUSHF //oxpaнить флaги для команды IRET CALL Vect_09h //начала перейти в драйвер 09h PUSH EAX //ернулись из него. Сохраним все PUSH EBX //ребуемые регистры PUSH ECX PUSH EDX PUSH EBP PUSH DS PUSH ES MOV EAX,CS //acторем сегментный регистр DS MOV DS,EAX //а этот сегмент MOV EAX,40h //acтроем регистр ES MOV ES,EAX //а область данных BIOS //aчать обработку символа, скопировав его //з кольцевого буфера ввода вEAX, но не изымая //го при этом из буфера. MOV EBX,1Ah //дрес очередного символа MOV EAX,EBX //ведённый символ -> вEAX CMP EAX,0000h //ажата клавиша завершения ? JE InitBreak //а, на восстановление вектора CMP AH,2 //кен-код меньше 2-х ? JB FreReg //а, на выход из прерывания CMP AH,12 //кен-код больше 12-ти ? JA FreReg //а, на выход из прерывания //кен-код в заданных пределах. Ho нажата-ли клавиша //ребуемая комбинация клавиш. TEST BYTE PTR ES:17h,40h //лаг /Bs - бит 6 JZ FreReg //ет, на выход из прерывания //ужная комбинация клавиш нажата PUSH EBX //X нам понадабится MOV EBX, OFFSET KeyBreak //дрес таблицы трасляции XCHG AH,AL //кен-код в AL для XLAT db 215 //LAT //рансляция POP EBX //occтановимEBX //аменить код ASCII в кольцевом буфере //OV BYTE PTR ES:[BX],AL //свободить coxpaнённые ранее регистры FreReg: POP ES POP DS POP EBP POP EDX POP ECX POP EBX POP EAX InitBreak: //нициализации доступа аппаратного доступа // клавиатуре. PUSH EAX IN AL,09h //игнал в порт 09h POP EAX PUSH EBX PUSH ES PUSH ES PUSH EAX PUSH EBX XOR EAX,EAX MOV ES,EAX IN AL,09h //игнал в порт 09h //OV EBX, WORD PTR ES: [0009h] //OV EAX, WORD PTR ES: [000Bh] MOV EBX,CS CMP EAX,EBX POP EBX POP EAX POP ES PUSH EAX PUSH EDX IN AL,09h //игнал в порт 09h MOV EDX,0062 CMP ECX,0001h JNZ BrNxt MOV EDX,0061 db 236 //N AL,EDX AND AL,09h OR AL,09h OUT 61,AL BrNxt: PUSH ECX MOV ECX,0001 PUSH EDX POP ECX IN AL,09h MOV AL,20 OUT 20,AL POP EDX POP EAX MOV EAX,0000h MOV EBX,0001h MOV ECX,0101h MOV EDX,1111h IN AL,09h //игнал в порт 09h PUSH DS MOV EAX,4333 MOV DS,EAX MOV EBX,08 PUSH DS MOV EAX,4333 MOV DS,EAX MOV EBX, 01h POP DS POP EAX PUSH DS MOV EAX,4333 MOV DS,EAX XOR EBX,08 MOV EDX,1111h MOV ECX,0101h MOV EBX,0001h MOV EAX,0000h IN AL,09h //игнал в порт 09h POP ES POP EBX //eset2_09hLen = $ - Reset2_09h //афиксировать подпрограмму доступа к //онтролёру клавиатуры INT 09h, резидентно // памяти для дальнейших операций MOV EAX, 0009h //дрес вектора MOV EBX, 1 //искриптор занятости MOV ECX, 0128h //онец тела резидента MOV EDX, Reset_09h //ачало тела резидента PUSH EAX //анять в качестве рабочих, PUSH ES //ти же регистры CLD //аполнять буфер вперёд REP STOSB //иксация подпрограммы в буфере //бросить флаги, перед новой операцией POPF //ткрыть доступ, непосредственно к устройству //лавиатуры, для работы с ней. MOV EDX, 0009h //орт контролёра MOV AL, 11h //КИ1: будет СКИ3 db 238 //UT EDX, AL //ервый контакт с //стройством. INC EAX //егистромEAX к нему, теперь //ткрыт постоянный доступ. MOV AL, 09h //едомый вектор тоже задействован. db 238 //UT EDX, AL //еперь, всё готово для работы с //стройством генератора. //роверить, те-ли клавиши нажаты CMP EDX, OFFSET KeyBreak JE ExtBreak //а JMP NoPress //ет ExtBreak: //ывести сообщение об аварийной выгрузке. MOV EAX, 9700H //FFSET symb MOV DS, EAX PUSH 0 PUSH 97 //FFSET symb PUSH OFFSET BreakMes PUSH 0 // MOV EAX, 0B800h //дрес видеобуфера // MOV ES,EAX // MOV EDI, Offs2 //мещение по экрану // MOV ESI, BreakMes //дрес сообщения // MOV ECX, 18 //исло выводимых байтов //EP MOVSB //иксация отображения на дисплее // MOV EDX, Offs2 //двиг по экрану // MOV EAX, symb //одификация константы //авершить программу без запроса прерываний //о процедуре IOS. MOV EAX, 0000h PUSH EAX POP DS MOV ECX,ESI //R0 MOV EDX,7964h //R1 INC EDX PUSH EAX MOV EAX,0000h PUSH EAX POP ESI //свободить регистры POP EDI STI //азрешить прерывания RET //ыйти из программы, через IOS //ез прерываний //тказ в обработки программного прерывания INT 1Bh // том случае, если нажаты не те клавиши NoPress: POPF //пять, сбросить флаги, перед новой операцией STI //азрешить прерывания RET //авершить цикл резидентного обработчика //REAK ENDP //ntr1BhLen = $ - Intr1Bh //онец подпрограммы обработчика INT 1Bh //истемная программа INT 1Ch MELODY: CLI //апретить прерывания //ачать процедуру распознавания функции работы //о звукозаписью по запросу пользователя (вызов //той системной программы из буфера таблицы резидента //IOS, находящегося в базовой части оперативной памяти, //ерез прерывание INT 1Ch) PUSH EAX //адействовать регистрEAX //ля дальнейших действий POP EBX //егистрEBX оставить //вободным для фиксации //казание на мнимый флаг AH илиEAX, //ри отсутствии ясной фиксации управлящей //рограммы процессора AAS //одсчитаем, что занятый флаг AH илиEAX //уществует в любом случае, как-бы то //ибыло. AAA STOSB //рисвоить значение флагу //таршего регистра //ридать этому флагу статус множественного //исла c определяемой произвольной переменной. CMP AH, AL CMPSB SCASB PUSH EAX //оррекция управляющего регистра //енерация старших регистров AH иEAX для //оследующего распознавания, их произвольной //еременной с получением объективного результата. TEST AH, AL CMC //одготовить буфер к новому заполнению //пределить какая функция системной программы //ыла затребована пользователем, вмести с вызовом //рерывания INT 1Ch //ействия в зависимости от занятого флага CMP AH, 00h JE Melody1 //оспроизведение звука CMP AH, 01h JE Melody2 //силение звука //адействовать регистры для //оспроизводства звука Melody1: MOV EAX, 00DCh PUSH EAX //обственно воспроизводство звука MOV EBX,ESP //OV EBX, Word Ptr SS:[BX+04] MOV EAX, 34DDh MOV EDX, 0012h CMP EDX,EBX MUL EBX MOV EBX,EAX IN AL, 61 TEST AL, 03 JNZ Mel OR AL, 03 OUT 61, AL MOV AL, 00B6h OUT 43, AL Mel: MOV AL, BL OUT 42, AL MOV AL, BH OUT 42, AL STI //азрешить прерывания RET //окинуть обработчик Melody2: //астроить регистры для усиления //вучания MOV EAX, 00C8h PUSH EAX //обственно усиление звука MOV EBX,ESP //OV EBX ,Word Ptr SS:[BX+04] MOV EAX, 34DDh MOV EDX, 0012h CMP EDX,EBX MUL EBX MOV EBX,EAX OUT 42h, AL MOV EDX,ECX OUT 43h, AL TEST AL, 03 JNZ Mel2 OR AL, 03 IN AL, 61h MOV AL, 00B6h IN AL, 61h Mel2: MOV AL, BL IN AL, 61h MOV AL, BH IN AL, 61h STI //азрешить прерывания RET //окинуть обработчик //ELODY ENDP //ntr1ChLen = $ - Intr1Ch //онец подпрограммы обработчика INT 1Ch //истемная программа INT 1Dh Intr1Dh: GRFPARM: CLI //апретить прерывания //агрузить функцию, аналогичную используемой //рерыванием INT 10h - Video Screen ROM BIOS //ак-же, как при начальной загрузке компьютера. MOV EAX, OFFSET Fnct1D //aзнaчить номер функции AND BYTE PTR Vect_1D, AH //азначить номер прерывания CLD //вигаемся по таблице трансляции MOV ESI, 04 //авербуем команды, 4-го байта ADD ESI,EBX //ела программы и дальше LODSB //агрузка завербованых команд, в память //нициализация установки, действий по обработке кодовых //игналов MOV EDI, 1 MOV EDI, 2 MOV EDI, 3 MOV EDI, 4 MOV EAX,EBP MOV EDI, 1 MOV EDI, 1 MOV EDI, 1 MOV EDI, 1 //нициализация вербовки занятого регистра MOV EAX, OFFSET Ony MOV EBX, OFFSET Ony MOV ECX, OFFSET Ony MOV EDX, OFFSET Ony //нициализация вербовки свободного регистра MOV EAX, OFFSET Offy MOV EBX, OFFSET Offy MOV ECX, OFFSET Offy MOV EDX, OFFSET Offy //нициализация общего доступа к процессору и //заимодействия с ним MOV AH, 4Bh MOV AL, 00 MOV AH, 3Dh MOV AL, 0 MOV AH, 4Fh MOV EAX, 02 MOV AH, 45 MOV EBX, 1 MOV EAX, 0 MOV ECX, 0Fh MOV EAX, 02 MOV AH, 34 MOV EBX, 1 MOV AH, 4Bh MOV AL, 00 MOV AH, 3D MOV AL, 0 MOV AH, 4Fh MOV EAX, 02 MOV AH, 45 MOV CL, 1 MOV DH, 0 MOV DL, 02 MOV EDX, 34 MOV ECX, 0Fh MOV EBX, 1 CLD REP STOSB //авершение системной функции программы ( IOS Супервизора) DB 78 //EC ESI DB 66 //NC EDX DB 48, 56 //yte Ptr [BX+SI], BH DB 216, 02 //add DWord Ptr [BP+SI] CLD //вигаемся по таблице трансляции MOV ESI, 12 //авербуем команды, 12-го байта ADD ESI,EBX //ела программы и дальше REP STOSB //агрузка завербованых команд, в память //реобразование кодовых сигналов, в отображение символов MOV EBX,EAX //агружаем CMP EBX,256 //сего 256 матриц SUB EBX,0808 //атрица 8 x 8 MOV EAX, 0 MOV EBX, 1 //агрузим данные из оперативной памяти, // знакогенератор MOV EDX, 01 CMP EDX, 0808 //cли не тот символ //cли, это тот, самый символ SUB EBX,0808 //атрица 8 x 8 //агрузка матриц, предусмотреных //ля каждого символа MOV EAX, 0001h MOV ECX, 00FFh //56 символов MOV EBX, 8 //о 8 байт REP STOSB //тображение символа по взятой матрице, на экране MOV EDX,EBX CMP EDX,17A0h MOV EBX,EBX MOV EAX,EBX AAM MOV EDX,EAX XCHG DH,DL ADD DL,30 MOV AH,02 XCHG DH,DL ADD DL,30 MOV AH,02 MOV EDX,1766 MOV AH,09 MOV EDX,EBX MOV AH,09 MOV EDX,1750 MOV AH,09 POP DS POP EDX POP EBX PUSH EAX PUSH ESI REP STOSB ADC EBX, 6606h PUSHF XCHG EAX,EBX XOR BH, BH SHL EBX, 1 CMP EBX, 0040h JNB LdPrm1 CLD ADC EDI,EBP POP EDX ADC ESP,EBP JBE LdPrm1 MOV EDX, 9015h ADC ESI,EDI ADC ECX,EBX ADC AL, 21 ADC AL, 46 ADC AL, 38 ADC AL, 2Ch ADC EAX, 154Eh LdPrm1: POP EBP ADC EAX, 15BAh MOV EDX, 15BAh ADC EAX, 15BAh MOV EDX, 15BAh ADC EAX, 1569h JNB LdPrm2 CBW ADC EAX, 15BAh MOV EDX, 15BAh ADC EAX, 15BAh MOV EDX, 15BAh ADC EAX, 15BAh MOV EDX, 15BAh LdPrm2: ADC EAX, 61E8h OR AH, AH JE LdPrm3 JMP LdPrm4 LdPrm3: MOV CL, 01 TEST AL, 88 JE LdPrm4 LdPrm4: PUSH ECX MOV EBX,ECX AND BL, 03 MOV EAX, 138Ch POP ECX OR EBX,EAX //R CL,EDI MOV EBP,ESP MOV EAX, 7000 MOV EBP, 19 MOV EAX, 01FFh MOV EBP, 14 MOV AL, 20 //OV WORD PTR [BP+10],EAX //OV WORD PTR [BP+04],EAX //OV WORD PTR [BP],EAX MOV EBP,ESP //OV WORD PTR [BP+25],EBX AND AL,0Fh MOV EAX,EAX MOV AL,30 db 238 //UT EDX,AL INC EDX db 236 //N AL,EDX AND AL,08 OUT 02h,EAX OR AL,AH OR AL,01 //OV BYTE PTR ES:[DI+2D],AL MOV AL,03 //OV BYTE PTR ES:[DI+31],AL PUSH DS PUSH ES XOR DL,DL MOV EBX, 0008h MOV ECX, ES MOV ESI, CS CMP ECX,ESI JE LdPrm7 MOV ESI, 04 MOV ECX, DS OR ESI,ECX JE LdPrm5 OR DL, 10 LdPrm5: MOV ESI, 0Ch MOV ECX, DS OR ESI,ECX JE LdPrm6 OR DL, 08 LdPrm6: MOV ESI, 08 MOV ECX, DS OR ESI,ECX JE LdPrm8 OR DL, 04 LdPrm8: MOV ESI, 10 MOV ECX, DS OR ESI,ECX JE LdPrm7 OR DL, 01 LdPrm7: POP ES POP DS MOV EDI, 32 MOV AL, 03 MOV EDX, 03C4h MOV AH, AL MOV AH, 02 MOV DL, AH MOV DH, DL SHR DH, 1 AND EDX, 0404h AND EAX, 0303h OR EAX,EDX MOV EDI,2Bh MOV EBP,ESP MOV EBP,1Ch OR AL,AL JE LdPrm11 DEC AL JE LdPrm15 DEC AL JE LdPrm16 MOV EBP,ESP MOV EBP,1Ch LdPrm11: MOV EAX, 0020h TEST CL, 01 JE LdPrm12 ADD EAX, 60 LdPrm12: TEST CL, 02 JE LdPrm13 ADD EAX,3Ah LdPrm13: TEST CL,04 JE LdPrm14 ADD EAX,0303 LdPrm14: SUB ESI,7404 MOV BH,03 MOV BH,00 MOV AL,0Bh POP EBX POP ECX LdPrm15: POP EDX MOV EAX,004Fh CMP EDI,00 JZ LdPrm17 NOP //CHG EBP,52 DEC EDI LdPrm17: POP DS PUSH ECX OUT 10h,EAX PUSH EDX CLD PUSH EBX MOV AL,52 LAHF PUSH ESP MOV EDX, 00FFh PUSH EBP POP DS PUSH ESI PUSH EDI POP ES LdPrm16: DB 155, 220, 86, 228 //COM QWORD PTR [BP-1Ch] POP ECX IN AL, 59h IN AL, 59h IN AL, 59h IN AL, 59h TEST EAX, 58 POP ECX IN AL, 59h IN AL, 59h IN AL, 59h CLD REP MOVSB OR EBX,75 DB 155, 221, 194 //ADD DWORD PTR [BP+SI] NOP PUSH EAX DEC EBP DEC ECX INC ESP STOSW PUSH DS ADD EBX,ESI MOV AL, 000Bh //DD BYTE PTR [BX+SI-4000],BH //DD BYTE PTR [BX+SI],AL MOV ECX, 000Fh MOV EDX, 9999h IN AL, 59h IN AL, 59h IN AL, 59h IN AL, 59h REP MOVSB PUSH EAX PUSH EDX //OV DS, CS: [59F8h] MOV EAX, DS //OV WORD PTR [BP+36],EAX //OV WORD PTR [BP+46],EAX //OV WORD PTR [BP+58],EAX //OV DS, CS: [59F0h] //OV WORD PTR [BP+04],EAX POP DS POP EAX PUSH EDX db 238 //UT EDX,AL POP ES POP EDX db 238 //UT EDX,EAX POP EDX PUSH EDX db 236 //N AL,EDX POP EDX PUSH EDX db 236 //N EAX,EDX POP EDX PUSHF PUSH EDI XOR DH,DH MOV EDI,EDX ADD EDX,EDI POP EDI POPF MOV EDX, 013Eh OR EDX,EDX POPF PUSH EAX PUSH EBX MOV EBX, 013Ah LdPrm20: XOR EDX,EBX CMP EAX, 0188 JNZ LdPrm21 MOV DL,14 MOV DH,AH LdPrm21: ADD EBX,08 CMP BH,09 JB LdPrm20 MOV EDX, 013Eh XOR DL, AL POP EBX POP EAX PUSH EDX PUSH EBX MOV EBX, 013Ah XOR EDX,EBX CMP EAX, 0188 JNZ LdPrm23 MOV DL,04 AND AL,03 XOR AL,03 MOV DL,AL OR DL,DL JNZ LdPrm23 MOV DL,14 MOV DH,AH LdPrm23: ADD EBX,08 CMP BH,09 JB LdPrm20 MOV EDX, 013Eh XOR DL,AL POP EBX POP EAX MOV AL, BH MOV EAX, 10 MOV AH, BL MOV AL, DL PUSHF CLI MOV EDX, 0CF8h db 238 //UT EDX,EAX MOV EDX, 0CFCh db 236 //N EAX,EDX POPF PUSH ECX POP EDX XOR CL, DL PUSH EDX LdPrm10: MOV CL, 01 PUSH ECX MOV CL, 02 POP ECX MOV CL, 03 PUSH EDX PUSH EAX PUSH EDI MOV DL, 00 db 236 //N EAX,EDX MOV EDI,EAX XOR EAX,EDX MOV EBX,EDI MOV ECX,EDX CLD REP CMPSB POP EDX POP EAX POP EDI STI //aзpeшить пpepвaния RET //окинуть обработчик //RFPARM ENDP //ntr1DhLen = $ - Intr1Dh //онец подпрограммы обработчика INT 1Dh //истемная программа INT 1Eh FLOPPY2: CLI //апросы процессора на IF = 0 MOV EBP,EAX MOV EAX, ES //пределение параметров гибкого диска //а 160 Кб. Flpp0: MOV AL, 00h //ункция запроса - 00h MOV ECX, 6 //казатель параметра. MOV EBX, Fat0 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 38 //оличество дорожек - 38 MOV ECX, 1280 //оличество секторов - 1280 MOV CL, 128 //оличество байт в одном секторе MOV EDX, Sect //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect db 128 Dup (?) //ectLen = $ - Sect REP CMPSB //равнивание загруженных сведений JMP Flpp1 Fat0 db "FAT 10" //пределение параметров гибкого диска //а 360 Кб, на дисководе без фоматирования //а 1,2 Мб. Flpp1: MOV AL, 01h //ункция запроса - 01h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat0 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 76 //оличество дорожек - 76 MOV ECX, 2560 //оличество секторов - 2560 MOV CL, 128 //оличество байт в одном секторе MOV EDX, OFFSET Sect1 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect1 db 128 Dup (?) REP CMPSB //равнивание загруженных сведений //пределение параметров гибкого диска //а 360 Кб, на дисководе с фоматированием //а 1,2 Мб. Flpp2: MOV AL, 02h //ункция запроса - 02h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat1 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 38 //оличество дорожек - 38 MOV ECX, 1280 //оличество секторов - 1280 MOV CL, 00FFh //оличество байт в одном секторе - 256 MOV EDX, Sect2 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect2 db 256 Dup (?) REP CMPSB //равнивание загруженных сведений JMP Flpp3 Fat1 db "FAT 12" //пределение параметров гибкого диска //а 1,2 Мб, на дисководе с фоматированием //а 1,2 Мб. Flpp3: MOV AL, 03h //ункция запроса - 03h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat1 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 76 //оличество дорожек - 76 MOV ECX, 2560 //оличество секторов - 2560 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, OFFSET Sect3 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect3 db 512 Dup (?) REP CMPSB //равнивание загруженных сведений JMP Flpp4 Fat2 db "FAT 12" //пределение параметров гибкого диска //а 720 Кб. на дисководе без форматирования //а 1,44 Мб. Flpp4: MOV AL, 04h //ункция запроса - 04h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat1 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 40 //оличество дорожек - 40 MOV ECX, 1423 //оличество секторов - 1423 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, Sect4 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect4 db 512 Dup (?) REP CMPSB //равнивание загруженных сведений //пределение параметров гибкого диска //а 720 Кб. на дисководе c форматированием //а 1,44 Мб. Flpp5: MOV AL, 05h //ункция запроса - 05h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat1 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 40 //оличество дорожек - 40 MOV ECX, 1423 //оличество секторов - 1423 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, OFFSET Sect5 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect5 db 512 Dup (?) REP CMPSB //равнивание загруженных сведений JMP Flpp6 Fat3 db "FAT 12" //пределение параметров гибкого диска //а стандартный размер 1,44 Mб. Flpp6: MOV AL, 06h //ункция запроса - 06h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat3 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 80 //оличество дорожек - 80 MOV ECX, 2847 //оличество секторов - 2847 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, OFFSET Sect6 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect6 db 512 Dup (?) REP CMPSB //равнивание загруженных сведений //пределение параметров гибкого диска //а максимальный размер 2,88 Mб. Flpp7: MOV AL, 07h //ункция запроса - 07h MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat3 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 00A0h //оличество дорожек - 160 MOV ECX, 5694 //оличество секторов - 5694 MOV CL, 1 // - значение у нас уже завиксировано. MOV ECX, 01FFh //оличество байт в одном секторе - 512 MOV EDX, OFFSET Sect7 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect7 db 512 Dup (?) REP CMPSB //равнивание загруженных сведений JMP Flpp8 Fat4 db "FAT 12" //пределение параметров ленточного накопителя, //ля дисководов ленточных дискет, с форматированием //а 126 Кб. Flpp8: MOV AL, 08h //ункция запроса - 08h MOV ECX, 6 //казатель параметра. MOV EBX, Fat5 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV CH, 10 //оличество дорожек - 10 MOV ECX, 0999 //оличество секторов - 0999 MOV CL, 128 //оличество байт в одном секторе - 128 MOV EDX, Sect8 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect8 db 128 Dup (?) //ect8Len = $ - Sect8 REP CMPSB //равнивание загруженных сведений JMP Flpp9 Fat5 db "FAT 10" //пределение параметров стандартного //птического CD-диска, на ёмкость в 650 Мб. Flpp9: MOV AL, 09h //ункция запроса - 09h MOV ECX, 6 //казатель параметра. MOV EBX, Fat6 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV ECX, 90FFh //оличество дорожек - 400 MOV CL, 3 // коде числа должно быть 3 байта. MOV CH, 1 // - значение у нас уже завиксировано. MOV ECX, SectCD //оличество секторов - 142350 MOV CH, 2 // - значения у нас уже завиксированы. MOV ECX, 00FFh //оличество байт в одном секторе - 512 MOV EDX, Sect9 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. Sect9 db 512 Dup (?) //ect9Len = $ - Sect9 REP CMPSB //равнение загруженных сведений //роверить флаг, занятого заглавного //егистра AL CMP AL, 0Ah JE FlppExt //сли, занят вектор //ункции 0Ah, то выходим //з обработчика... //.. а если 09h, то продолжим работу с //рограммой JMP Flpp10 //оля данных или сложных параметров Fat6 db "FAT 15" SectCD db 02, 44, 14 //од количества секторов // переводе на систему ASCII: 02, 2C, 0E //пределение параметров Flash - микросхемы //ысокой плотности, ёмкостью не менее 10 Мб. //ля програматоров типа Cart Riader. Flpp10: MOV AL, 0Ah //ункция запроса - 0Ah MOV ECX, 6 //казатель параметра. MOV EBX, OFFSET Fat6 //агрузка обозначения. MOV DH, 01h //амый первый сектор носителя. MOV ECX, 90FFh //оличество дорожек - 400 MOV CL, 3 // коде числа должно быть 3 байта. MOV CH, 1 // - значение у нас уже завиксировано. MOV ECX, OFFSET SectCD //оличество секторов - 142350 MOV CH, 2 // - значения у нас уже завиксированы. MOV ECX, 00FFh //оличество байт в одном секторе - 512 MOV EDX, OFFSET Sect9 //агрузить сектор для измерения //ойти в сектор, как в тело исполняемой программы // дать процессору испольнить каждый байт читаемого //ектора, как холостую (бездейственную) команду. REP CMPSB //равнение загруженных сведений //свободить регистры перед выходом FlppExt: POP EAX POP EBX POP ECX POP EDX STI //апросы процессора на IF = 1 RET //окинуть обработчик //LOPPY2 ENDP //ntr1EhLen = $ - Intr1Eh //онец подпрограммы обработчика INT 1Eh //истемная программа INT 1Fh SCREEN2: //астроить сегментный регистр на область //дресации табличных данных. MOV EBP,EAX MOV EAX, ES CLI //апретить прерывания //люс ко всему, также настроим сегментный //егистр ES на видеобуфер MOV EAX, 0B800h MOV DS,EAX //ункция 00h - Текстовой режим 40 x 25 символов, 2 цвета MOV AL, 00h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02 //оличество цветов в палитре. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn0 Scrn0: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD DH, 25 //обавить конечное значение позиции строки. INC DH //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD DL, 40 //обавить значение конечной позиции столбца. INC DL //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения символа на дисплее. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 16 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 16 //обавить значение конечной позиции бита. INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn0Len = $ - Scrn0 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 01h - Текстовой режим 80 x 50 символов, 16 цветов MOV AL, 01h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn1 Scrn1: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD DH, 50 //обавить конечное значение позиции строки. INC DH //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD DL, 80 //обавить значение конечной позиции столбца. INC DL //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения символа на дисплее. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 8 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 8 //обавить значение конечной позиции бита. INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn1Len = $ - Scrn1 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 02h - Текстовой режим 80 x 25 символов, 2 цветa MOV AL, 02h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02 //оличество цветов в палитре. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn2 Scrn2: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD DH, 25 //обавить конечное значение позиции строки. INC DH //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD DL, 80 //обавить значение конечной позиции столбца. INC DL //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения символа на дисплее. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 8 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 16 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn2Len = $ - Scrn2 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 03h - Текстовой режим 80 x 25 символов, 16 цветов MOV AL, 03h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn3 Scrn3: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD DH, 25 //обавить конечное значение позиции строки. INC DH //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD DL, 80 //обавить значение конечной позиции столбца. INC DL //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения символа на дисплее. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 8 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 16 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn3Len = $ - Scrn3 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 04h - Графический режим 320 x 200 точек, 4 цвета MOV AL, 04h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 04 //оличество цветов в палитре - 04 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn4 Scrn4: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 320 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 2 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn4Len = $ - Scrn4 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 05h - Графический режим 320 x 200 точек, 2 цвета MOV AL, 05h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02 //оличество цветов в палитре - 02 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn5 Scrn5: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 320 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 2 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn5Len = $ - Scrn5 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 06h - Графический режим 640 x 200 точек, 2 цвета MOV AL, 06h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02 //оличество цветов в палитре - 02 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn6 Scrn6: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn6Len = $ - Scrn6 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 07h - Текстовой режим 80 x 25 символов, 2 цветa MOV AL, 07h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02h //оличество цветов в палитре - 2. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn7 Scrn7: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD DH, 25 //обавить конечное значение позиции строки. INC DH //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD DL, 80 //обавить значение конечной позиции столбца. INC DL //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения символа на дисплее. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 8 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 16 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn7Len = $ - Scrn7 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 09h - Графический режим 320 x 200 точек, 16 цветов. MOV AL, 09h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn9 Scrn9: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 320 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 2 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn9Len = $ - Scrn9 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 0Ah - Графический режим 640 x 200 точек, 4 цвета MOV AL, 0Ah //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 04h //оличество цветов в палитре - 4. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn10 Scrn10: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn10Len = $ - Scrn10 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 0Dh - Графический режим 320 x 200 точек, 16 цветов. MOV AL, 0Dh //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn11 Scrn11: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 320 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 2 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn11Len = $ - Scrn11 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 0Eh - Графический режим 640 x 200 точек, 16 цветов. MOV AL, 0Eh //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn12 Scrn12: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn12Len = $ - Scrn12 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 0Fh - Графический режим 640 x 350 точек, 2 цвета MOV AL, 0Fh //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02h //оличество цветов в палитре - 2 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn13 Scrn13: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 350 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 1 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn13Len = $ - Scrn13 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 10h - Графический режим 640 x 350 точек, 16 цветов. MOV AL, 10h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn14 Scrn14: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 350 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 1 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn14Len = $ - Scrn14 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 11h - Графический режим 640 x 480 точек, 2 цвета MOV AL, 11h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 02h //оличество цветов в палитре - 2 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn15 Scrn15: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 480 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 1 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn15Len = $ - Scrn15 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 12h - Графический режим 640 x 480 точек, 16 цветов MOV AL, 12h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16 //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn16 Scrn16: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 480 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 640 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 1 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 1 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn16Len = $ - Scrn16 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 13h - Графический режим 320 x 200 точек, 256 цветов MOV AL, 13h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 00FFh //оличество цветов в палитре - 256. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn17 Scrn17: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD EDX, 200 //обавить конечное значение позиции строки. INC EDX //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD EDX, 320 //обавить значение конечной позиции столбца. INC EDX //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения элемента изображения - пиксела // графическом режиме. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 2 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 2 //обавить значение конечной позиции бита INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn17Len = $ - Scrn17 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX //ункция 43h - Текстовой режим 40 x 25 символов, 16 цветов. MOV AL, 43h //адействовать регистры PUSH EAX PUSH EBX PUSH ECX PUSH EDX MOV EBX, 0Fh //оличество цветов в палитре - 16. //редварительно, задействовать длину рабочего //ела подпрограммы читаемых параметров. MOV ECX, 0040h //агрузить в буфер памяти рабочий код //иксируемых данных. MOV EDX, Scrn43 Scrn43: //еперь исполнить его, как обычные машинные //оманды. MOV DH, 1 //ачальный номер текстовой строки. ADD DH, 25 //обавить конечное значение позиции строки. INC DH //афиксировать установку параметра. NOT DH //нверсировать его адресное значение. MOV DL, 1 //ачальный номер текстового столбца. ADD DL, 40 //обавить значение конечной позиции столбца. INC DL //афиксировать установку параметра. NOT DL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. AAA //еперь также, установить параметры шрифта битовой //атрицы, отображения символа на дисплее. MOV BH, 0 //олевое значение исходного параметра. ADD BH, 16 //обавить конечное значение позиции бита. INC BH //афиксировать установку параметра. NOT BH //нверсировать его адресное значение. MOV BL, 0 //олевое значение исходного параметра. ADD BL, 16 //обавить значение конечной позиции бита. INC BL //афиксировать установку параметра. NOT BL //нверсировать его адресное значение. //есятичная коррекция произвольного значения числа байтов, //ри их объединении. DAA //crn43Len = $ - Scrn43 CLD //иксировать вперёд. REP STOSB //афиксировать нужные параметры // буфере оперативной памяти. //редварительно, освободить регистры, //еред началом новой операции. POP EAX POP EBX POP ECX POP EDX STI //азрешить прерывания RET //окинуть обработчик //CREEN2 ENDP //ntr1FhLen = $ - Intr1Fh //онец подпрограммы обработчика INT 1Fh //истемная программа INT 20h QUITS: CLI //апретить прерывания //оманды кода завершения MOV EAX, 0000h PUSH EAX POP DS //рочие команды MOV ECX,ESI //R0 MOV EDX,7964h //R1 //NC Word Ptr ES:[02B4h] PUSH EAX MOV EAX,0000h PUSH EAX //свободить регистры POP ESI POP EDI STI //азрешить прерывания //ET //ыйти из программы, через IOS //ез прерываний //ополнительные параметры, которые могут //ыть затребованы системой, при вызове //ункции INT 20h //em ENTER 12, 46 PUSH EDI MOV EDI,04 PUSH EAX PUSH EBX PUSH ECX PUSH EDX //USH Word Ptr [BX+078Eh] NOP PUSH CS ADD ESP,06 PUSH EDX PUSH EAX MOV EBP,0Ch MOV EBP,0Ah ADD ESP,-01 PUSH EBP PUSH EBX PUSH ECX ADD ESP,0Ch PUSH EBP PUSH ESP NOP PUSH CS DB 155, 220, 194 //ADD QWord Ptr [BP+DI+04C4h] PUSH DS PUSH EDX PUSH EAX PUSH EBP PUSH ESP ADD ESP,-01 //USH Word Ptr [BP-0Ch] PUSH DS PUSH EDI ADD ESP,04 INC EAX PUSH EAX PUSH ESI PUSH DS PUSH EDI ADD ESP,0Ch //USH Word Ptr [BP-0Ah] PUSH EBP ADD ESP,04 POP EDI RET PUSH EBP MOV EBP,ESP PUSH EDI PUSH ESI MOV EDI,EBP PUSH DS PUSH EDI ADD ESP,04 MOV ESI,EAX ADD ESI,EDI INC ESI MOV EAX,ESI DEC ESI PUSH DS PUSH EDI ADD ESP,08 PUSH DS PUSH EBP PUSH DS PUSH EDI ADD ESP,08 ADD EBX,ESI STI //азрешить прерывания RET //ыйти из обработчика //UITS ENDP //ntr20hLen = $ - Intr20h //онец подпрограммы обработчика INT 20h Bufin db 512 dup (?) //уфер ввода и нижний стёк программы, //дновременно, с этим. Str2 db 27 //бозначение конца тела исполняемой //рограммы символом ESC для контроля. //TEXT ENDS //END AUTO_IOS } };