Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .model small
- .stack 200h
- .486
- .data
- old_handler_offset dw ? ; Старый обработчик прерывания (смещение)
- old_handler_seg dw ? ; Старый обработчик прерывания (сегмент)
- counter dw 0 ; счетчик
- timer dw 10 ; таймер
- time_const dw 18 ; константа времени для перевода в секунды
- exit_flag db 0 ; флаг выхода из программы
- sleep_flag dw 0 ; флаг сна
- sleep_time dw 18; сколько тиков надо спать
- sleep_now dw 0 ; сколько тиков уже поспали
- old_int_offset dw ? ; старый сдвиг прерывания
- old_int_seg dw ? ; старый сегмент прерывания
- .code
- sleep_int proc far; процедура задержки
- ;local _END_INT, _WAKE_UP
- pusha
- mov ax, sleep_flag
- ; проверка флага сна
- cmp ax, 0 ; если флаг 0, то
- je _END_INT; НЕ СПАТЬ
- ; иначе СПИМ
- mov ax, sleep_now
- inc ax
- mov sleep_now, ax
- mov bx, sleep_time
- cmp ax, bx
- jge _WAKE_UP; если поспали больше или сколько надо, то просыпаемся
- jmp _END_INT
- _WAKE_UP:
- ; ПРОСНУЛИСЬ
- mov ax, 0
- mov sleep_now, ax
- mov sleep_flag, ax
- _END_INT:
- popa
- iret
- sleep_int endp
- ; макрос для удобного сна
- sleep macro
- local _sleep_loop, _sleep_end
- pusha
- ; установим флаг сна
- mov ax, 1
- mov sleep_flag, ax
- _sleep_loop: ; спим
- nop
- mov ax, sleep_flag
- cmp ax, 0
- je _sleep_end
- jmp _sleep_loop
- _sleep_end: ; проснулись
- popa
- endm sleep
- Main PROC
- mov ax,@data
- mov ds,ax
- ; получим адреса прерываний, которые были ещё до нас
- mov ah, 35h ; получить вектор прерывания
- mov al, 1Ch ; прерывание таймера
- int 21h
- ; в bx записался сдвиг старого прерывания
- ; в ex записался сегмерт старого прерывания
- ; их надо запомнить, чтобы потом вернуть всё на место
- mov old_int_offset, bx
- mov old_int_seg , es
- ; теперь можем написать что-то своё заместо прошлого прерывания
- ; пусть функция sleep_int будет нашим прерыванием
- push ds ; будем трогать ds так что надо положить его в стек, чтобы не потерять
- mov dx, offset sleep_int
- mov ax, seg sleep_int
- mov ds, ax ; можно поменять только через ax
- mov ah, 25h ; поменять вектор прерывания
- mov al, 1Ch ; наше прерывание таймера
- int 21h
- pop ds
- mov ax,3
- int 10h
- mov bh,0
- xor ax,ax
- int 33h
- xchg ax,cx
- jcxz exit
- mov ax,0Ch
- mov cx,10100b
- push cs
- pop es
- mov dx,offset mouse
- int 33h
- mov ax,1
- int 33h
- for:
- mov ah,0
- int 16h
- dec ah
- jnz for
- mov ax,14h
- xor cx,cx
- int 33h
- int 20h
- exit:
- ; надо вернуть всё как было
- mov dx, old_int_offset
- mov ax, old_int_seg
- mov ds, ax ; можно поменять только через ax
- mov ah, 25h ; поменятьменять вектор прерывания
- mov al, 1Ch ; наше прерывание таймера
- int 21h
- mov ah,4Ch
- int 21h
- Main ENDP
- mouse proc
- mov ax,2; Спрятать курсор
- int 33h
- mov ax, cx; ax <- x
- mov cl, 3
- shr ax, cl ; x : px -> #symbol
- shr dx, cl ; y : px -> #symbol
- mov dh, dl
- mov dl,al
- MOV AH,02
- MOV BH,00
- INT 10H
- MOV AH,09 ;Функция вывода
- MOV al,'#' ;Выводимый символ
- MOV CX,1 ;Число повторений символа
- MOV BH,00
- MOV BL,0FH
- INT 10H ;Вызвать BIOS
- call enter_check
- int 10H
- mov ax,1 ; Возвращаем курсор
- int 33h
- retf
- mouse endp
- enter_check proc
- back:
- mov bl,al ; сохраняем bl в dx
- mov ah,08h ; задаем функцию
- back_enter:
- int 21h ; вызов прерывания
- cmp al,0Dh ; проверяем нажатие Enter
- je click_enter ; если нажали Enter, то выход
- cmp al,30h ; проверяем нажатие Enter
- je exit_program ; если нажали Enter, то выход
- cmp al, 38h; провверяем нажатие '8'
- je click_8
- cmp al, 32h; провверяем нажатие '2'
- je click_2
- cmp al, 34h; провверяем нажатие '4'
- je click_4
- cmp al, 36h; провверяем нажатие '6'
- je click_6
- mov bl,al
- jmp back_enter
- click_8:
- sleep ; сначала поспать
- dec dh
- call izmen_poloj_kursora
- call vivod_sim
- inc dh
- call izmen_poloj_kursora
- jmp back
- click_2:
- sleep ; сначала поспать
- inc dh
- call izmen_poloj_kursora
- call vivod_sim
- dec dh
- call izmen_poloj_kursora
- jmp back
- click_6:
- sleep ; сначала поспать
- inc dl
- call izmen_poloj_kursora
- call vivod_sim
- dec dl
- call izmen_poloj_kursora
- jmp back
- click_4:
- sleep ; сначала поспать
- dec dl
- call izmen_poloj_kursora
- call vivod_sim
- inc dl
- call izmen_poloj_kursora
- jmp back
- click_enter:
- ret
- exit_program:
- mov ah,4Ch
- int 21h
- enter_check endp
- vivod_sim proc
- MOV AH,09 ;Функция вывода
- MOV al,'#' ;Выводимый символ
- MOV CX,1 ;Число повторений символа
- MOV BH,00
- MOV BL,0FH
- INT 10H ;Вызвать BIOS
- ret
- vivod_sim endp
- izmen_poloj_kursora proc
- MOV AH,02 ;Установить положение курсора
- MOV DH,dh ;Строка
- MOV DL,dl ;Столбец
- INT 10H ;Вызвать BIOS
- ret
- izmen_poloj_kursora endp
- end Main
Advertisement
Add Comment
Please, Sign In to add comment