Листинг программы, продолжение


;_——== процедура обращения к часам ==——

; зависит от 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

;_________

Загрузка...