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


Программа, которая работает с прерываниями - часть 8


По своим функциям ; напоминает прерывание INT 16h реального режима. ; В AX возвращается скан-код нажатой клавиши, ; в BX - состояние переключающих клавиш. ; ----------------------------------------------------- PROC Int_30h_Entry NEAR push dx ; запрещаем прерывания и cli ; сбрасываем признак mov al, 0 ; готовности скан-кода mov [key_flag], al ; в буфере клавиатуры ; Ожидаем прихода прерывания от клавиатуры. ; Процедура клавиатурного прерывания установит ; признак в переменной key_flag. 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 ; готовности mov ax, [key_code] ; записываем скан-код mov bx, [keyb_status] ; и состояние переключающих ; клавиш sti ; разрешаем прерывания pop dx iret ENDP Int_30h_Entry ; ------------------------------------------- ; TIMER section ; ------------------------------------------- DATASEG timer_cnt dw 0 CODESEG PROC Timer_int NEAR cli push ax ; Увеличиваем содержимое счётчика времени mov ax, [timer_cnt] inc ax mov [timer_cnt], ax ; Примерно раз в секунду выдаём звуковой сигнал test ax, 0fh jnz timer_exit call beep timer_exit: ; Посылаем команду конца прерывания mov al,EOI out MASTER8259A,al pop ax sti iret ENDP Timer_int ; -------------------------------------------------- ; Процедуры обслуживания видеоконтроллера ; -------------------------------------------------- DATASEG columns db 80d rows db 25d rl_crt dw COLOR_SEG vir_crt dw CRT_DESCR curr_line dw 0d text_buf db " " CODESEG ; ----------------------------------------- ; Определение адреса видеопамяти ; ----------------------------------------- PROC set_crt_base NEAR mov ax,40 mov es,ax mov bx,[WORD es:4a] mov [columns],bl mov bl,[BYTE es:84] inc bl mov [rows],bl mov bx,[WORD es:PORT_6845] cmp bx,COLOR_PORT je color_crt mov [rl_crt],MONO_SEG mov [vir_crt],MDA_DESCR color_crt: ret ENDP set_crt_base ; ------------------------------------- ; Запись строки в видеопамять ; ------------------------------------- PROC writexy NEAR push si push di mov dl,[columns] mul dl add ax,bx shl ax,1 mov di,ax mov ah,dh write_loop: lodsb stosw loop write_loop pop di pop si ret ENDP writexy ; --------------------------------------- ; Стирание экрана (в реальном режиме) ; --------------------------------------- PROC clrscr NEAR xor cx,cx mov dl,[columns] mov dh,[rows] mov ax,0600 int 10 ret ENDP clrscr DATASEG hello_msg db " Protected mode monitor *TINY/OS*, v.1.1 for CPU 80286 ¦ © Frolov A.V., 1992 " CODESEG ; ------------------------------------ ; Вывод начального сообщения ; в защищённом режиме ; ------------------------------------ PROC write_hello_msg NEAR mov ax,[vir_crt] mov es,ax mov si,OFFSET hello_msg mov bx,0 mov ax,[curr_line] inc [curr_line] mov cx,SIZE hello_msg mov dh,30h call writexy call beep ret ENDP write_hello_msg ; ---------------------------------------------- ; Процедура выводит на экран содержимое AX ; (x,y) = (bh, bl) ; ---------------------------------------------- PROC Print_Word near push ax push bx push dx push ax mov cl,8 rol ax,cl call Byte_to_hex mov [text_buf], dh mov [text_buf+1], dl pop ax call Byte_to_hex mov [text_buf+2], dh mov [text_buf+3], dl mov si, OFFSET text_buf mov dh, 70h mov cx, 4 mov al, bh mov ah, 0 mov bh, 0 call writexy pop dx pop bx pop ax ret ENDP Print_Word DATASEG tabl db '0123456789ABCDEF' CODESEG ; ----------------------------------------- ; Преобразование байта в шестнадцатеричный ; символьный формат ; al - входной байт ; dx - выходное слово ; ----------------------------------------- PROC Byte_to_hex near push cx push bx mov bx, OFFSET tabl push ax and al,0fh xlat mov dl,al pop ax mov cl,4 shr al,cl xlat mov dh,al pop bx pop cx ret ENDP Byte_to_hex DATASEG reg_title db " CS IP AX BX CX DX SP BP SI DI " ; .... .... .... .... .... .... .... ....


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



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