Assembler - язык неограниченных возможностей


Мультиплексорное прерывание - часть 8


; процедура save_screen ; сохраняет в буфере screen_buffer содержимое области экрана, которую закроет ; наше окно

save_screen proc near mov si,START_POSITION push 0B800h ; DS:SI - начало этой области в видеопамяти pop ds push es push cs pop es mov di,offset screen_buffer ; ES:DI - начало буфера в программе mov dx,18 ; DX = счетчик строк save_screen_loop: mov cx,33 ; CX = счетчик символов в строке rep movsw ; скопировать строку с экрана в буфер add si,(80-33)*2 ; увеличить SI до начала следующей строки dec dx ; уменьшить счетчик строк, jnz save_screen_loop ; если он не ноль - продолжить цикл pop es ret save_screen endp

; процедура restore_screen ; восстанавливает содержимое области экрана, которую закрывало наше ; всплывающее окно данными из буфера screen_buffer

restore_screen proc near mov di,START_POSITION ; ES:DI - начало области в видеопамяти mov si,offset screen_buffer ; DS:SI - начало буфера mov dx,18 ; счетчик строк restore_screen_loop: mov cx, 33 ; счетчик символов в строке rep movsw ; скопировать строку add di,(80-33)*2 ; увеличить DI до начала следующей строки dec dx ; уменьшить счетчик строк, jnz restore_screen_loop ; если он не ноль - продолжить ret restore_screen endp

; процедура display_all ; выводит на экран текущее состояние всплывающего окна нашей программы display_all proc near

; шаг 1: вписать значение текущего выделенного байта в нижнюю строку окна mov al,byte ptr current_char ; AL = выбранный байт push ax shr al,4 ; старшие четыре байта cmp al,10 ; три команды, sbb al,69h ; преобразующие цифру в AL das ; в ее ASCII-код (0 - 9, А - F) mov byte ptr hex_byte1,al ; записать символ на его ; место в нижней строке pop ax and al,0Fh ; младшие четыре бита cmp al,10 ; то же преобразование sbb al,69h das mov byte ptr hex_byte2,al ; записать младшую цифру

; шаг 2: вывод на экран окна. Было бы проще хранить его как массив и выводить ; командой movsw, как и буфер в процедуре restore_screen, но такой массив займет ; еще 1190 байт в резидентной части. Код этой части процедуры display_all - всего ; 69 байт. ; шаг 2.1: вывод первой строки mov ah,1Fh ; атрибут белый на синем mov di,START_POSITION ; ES:DI - адрес в видеопамяти mov si,offset display_line1 ; DS:SI - адрес строки mov cx,33 ; счетчик символов в строке display_loop1: mov al,byte ptr [si] ; прочитать символ в AL stosw ; и вывести его с атрибутом из АН inc si ; увеличить адрес символа в строке loop display_loop1




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