;_——== процедура обращения к часам ==——
; зависит от AL: al = 00h — секунды
; al = 02h — минуты
; al = 04h — часы
; Честно содрана с одного резидента.Спасибо автору
read_clock PROC NEAR
out 70h,AL
jmp short $+2
jmp short $+2
jmp short $+2
in AL,71h
ret
read_clock ENDP
;_____________________________________________________________________________
;_——== CLICK программка простого пиканья.Временно. ==——
click proc near
mov cx, 0002
repc1: ;cli
mov word ptr cs:[clck], 08000h
call simp
mov word ptr cs:[clck], 02000h
call simp
;sti
loop repc1
ret
simp: mov dx, 00C8H
in al, 61H
and al, 0FEH
repc2: or al, 02
out 61H, al
mov cx, cs:[clck]
loop $
and al, 0FDH
out 61H, al
mov cx, cs:[clck]
loop $
dec dx
jne repc2
pop cx
ret
click endp
;_____________________________________________________________________________
;_——== Проверка командной строки на время ==——
com_time PROC NEAR ;такая обработка была в SPY. Но уж очень идея понра-
;вилась
new_nomber:
mov di,82h
mov dl,[di]
cmp dl,20h ;это пробел ?
je new_nomber
cmp dl,’0′
jb bad_exit
cmp dl,’9′
ja bad_exit
mov ax,[di] ;первые 2 символа
cmp ah,’:’ ; разделитель ?
jne short sec_nomber ; Нет, продолжим поиск
dec di ;да, => символ один, взять его
shl ax,8 ;
sec_nomber:
mov bx,[di+3] ;взять следующие 2 символа
cmp bh,0Dh ;последний — Enter ?
je short loc_105 ; Да
cmp bh,0 ; Это 0 ?
je short loc_105 ; Да
cmp bh,20h ; ‘ ‘ ?
je short loc_105 ; Да
jmp short loc_106 ;нет, это символ 0>
loc_105:
shl bx,8 ;символ один,сотрем лишнее из BX
loc_106:
xchg al,ah ;при получении числа, оно записывается первым символом в AL
;а вторым в AH, меняемся ими
xchg bl,bh ;то же и с BX, где находится второе число
sub al,30h ; ‘0’ Убе
sub ah,30h ; ‘0’ рем
sub bl,30h ; ‘0’ лиш
sub bh,30h ; ‘0’ нее
shl ah,4 ; и преобразуем так, чтобы в AX и BX вместо
shl bh,4 ;Hex кодов были именно числа, переданные в ко-
or al,ah ;мандной строке. Эти числа окажутся в AL и BL
or bl,bh ;
mov ah,al ;получим в AX время
mov al,bl
mov ds:tim,ax
end_com_time:
jmp com_continue
bad_exit:
stc ;плохая командная строка, выйдем с установкой флага
jmp norm_exit
com_continue:
cld ;будем передвигаться вперед
mov SI,DI ;источник
com_cycle:
lodsb
cmp AL,0DH ;это ENTER ?
je norm_exit
mov di,ds:count
mov ds:message[di],al
inc ds:count ;счетчик
inc ds:mes_long
jmp com_cycle
norm_exit:
ret
com_time ENDP
;_____________________________________________________________________________
;_—-== выводится символ из AL с аттрибутом из attrib. ==—-
;Интересная процедурка и я очень благодарен автору проги,в которой я ее нашел
show_symbol PROC NEAR
mov ES:[DI],AL
inc DI
mov AL,CS:attrib
mov ES:[DI],AL
inc DI
ret
show_symbol ENDP
;_____________________________________________________________________________
;_—-== вывести сообщение с рамочкой ==—-
mes_out PROC NEAR
;Вывести рамочку
mov AX,0b800h ;адрес видеопамяти в ES
mov ES,AX
mov AL,CS:mes_long
cbw
mov CL,2
div CL
xor AH,AH
mul CL ;избавляемся от нечетного mes_long
;чтобы не возникало угловатостей
mov CS:ev_len,AL
sub CS:cur_pos,AX ;начало вывода рамки ‘+’ : 1680 — ev_len
; mov AX, ;в DI
mov DI,CS:cur_pos
; mov SI,CS:savescr
mov AL,’+’
call show_symbol
mov AL,CS:mes_long ;горизонтальные линии
cbw
mov CX,AX ;число повторов
hor_ln:
mov AL,’-‘
call show_symbol ;——-
add DI,318 ;|
mov AL,’-‘ ;|
call show_symbol ;|
sub DI,320 ;|
loop hor_ln ;——-
mov AL,’+’
call show_symbol
mov AX,CS:cur_pos ;левая |
add AX,160
mov DI,AX
mov AL,’¦’
call show_symbol
mov AX,CS:mes_off
mov SI,AX ;начало строки в SI
mov cx,cs:count
next_let: ;вывести строку на экран
mov al,CS:[SI]
cmp AL,’$’
je all_done
call show_symbol
inc SI
loop next_let
all_done:
mov AL,’¦’ ;правая
call show_symbol
mov AX,CS:cur_pos
mov DI,AX
add DI,320
mov AL,’+’
call show_symbol
mov AL,CS:mes_long
cbw
add DI,AX
add DI,AX
mov AL,’+’
call show_symbol
;_______ восстановим первоначальное значение
mov CS:cur_pos,1680
ret
mes_out ENDP
;_________
