Защищенный режим процессоров Intel


Пример мультизадачного монитора - часть 9


По своим функциям ; напоминает прерывание INT 16 реального ; режима. PROC _Int_30h_Entry NEAR push ax dx ; Ожидаем прерывание от клавиатуры keyb_int_wait: sti nop nop cli ; Проверяем флаг, который устанавливается ; обработчиком аппаратного прерывания клавиатуры mov al, [_key_flag] cmp al, 0 jz keyb_int_wait ; Сбрасываем флаг после прихода прерывания mov al, 0 mov [_key_flag], al sti pop dx ax iret ENDP _Int_30h_Entry END

Файл screen.c содержит процедуры, необходимые для вывода информации на экран дисплея. Работа этих процедур основана на непосредственной записи данных в видеопамять.

Листинг 14. Процедуры для работы с видеоадаптером. Файл screen.c ----------------------------------------------------------- #include <stdio.h> #include <dos.h> #include <conio.h> #include <stdlib.h> #include "tos.h" void vi_putch(unsigned int x, unsigned int y ,char c, char attr); char hex_tabl[] = "0123456789ABCDEF"; // Вывод байта на экран, координаты (x,y), // выводится шестнадцатеричное представление // байта chr с экранными атрибутами attr. void vi_put_byte(unsigned int x, unsigned int y, unsigned char chr, char attr) { unsigned char temp; temp = hex_tabl[(chr & 0xf0) >> 4]; vi_putch(x, y, temp, attr); temp = hex_tabl[chr & 0xf]; vi_putch(x+1, y, temp, attr); } // Вывод слова на экран, координаты (x,y), // выводится шестнадцатеричное представление // слова chr с экранными атрибутами attr. void vi_put_word(unsigned int x, unsigned int y, word chr, char attr) { vi_put_byte(x, y, (chr & 0xff00) >> 8, attr); vi_put_byte(x+2, y, chr & 0xff, attr); } // Вывод символа c на экран, координаты - (x,y), // атрибут выводимого символа - attr void vi_putch(unsigned int x, unsigned int y ,char c, char attr) { register unsigned int offset; char far *vid_ptr; offset=(y*160) + (x*2); vid_ptr=MK_FP(VID_MEM_SELECTOR, offset); *vid_ptr++=c; *vid_ptr=attr; } // Вывод строки s на экран, координаты - (x,y), // атрибут выводимой строки - attr void vi_print(unsigned int x, unsigned int y, char *s, char attr) { while(*s) vi_putch(x++, y, *s++, attr); } // Вывод стоки сообщения о запуске программы void vi_hello_msg(void) { vi_print(0, 0, " Protected mode monitor *TINY/OS*, " "v.1.2 for CPU 80286 ¦ © Frolov A.V., 1992 ", 0x30); }

Последний файл - tossyst.asm - содержит уже знакомые вам процедуры для входа в защищённый режим и возврата обратно в реальный режим.


Начало  Назад  Вперед



Книжный магазин