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
} };