АпаратнотАУпрограмний комплекс GSM-МТМ
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
? дзвiнок
_com_ring proc far
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_com_ring
xor ax,ax
mov al,BYTE PTR RING[si]
nop
mov RING[si],0
nop;
exit_com_ring:
pop si
mov sp,bp
pop bp
ret
_com_ring endp
; ДОПОМРЖЖНРЖ ФУНЦРЖРЗ
; знiмаСФмо сигнал DTR
_dtr_offPROC FAR
push bp
mov bp,sp
push si
pushf
push ax
push dx
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_dtr_off
; установлюСФмо регiстр керування модемом,
; скидаСФмо сигнали DTR i RTS
mov dx,MCR[si]
mov al,08H
out dx,al
exit_dtr_off:
pop si
pop dx
pop ax
popf
pop si
mov sp,bp
pop bp
ret
_dtr_offENDP
; установлюСФмо сигнал DTR
_dtr_on PROC FAR
push bp
mov bp,sp
push si
pushf
push ax
push dx
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_dtr_on
; установлюСФмо регiстр керування модемом,
; установлюСФмо сигнали DTR, RTS, OUT2
mov dx,MCR[si]
mov al,0bh
out dx,al
exit_dtr_on:
pop si
pop dx
pop ax
popf
pop si
mov sp,bp
pop bp
ret
_dtr_on ENDP
;
; повертаСФмо в регiстрi ax число байтiв у регiстрi приймача,
; а в регiстрi dx загальний розмiр буфера приймача
_r_countPROC FAR
push bp
mov bp,sp
push si
pushf
push si
mov si,CURRENT_AREA
mov ax,0
mov dx,R_SIZE
test installed[si],1
jz exit_r_count
; записуСФмо в регiстр ax число символiв у буферi приймача
mov ax,size_r_data[si]
exit_r_count:
pop si
popf
pop si
mov sp,bp
pop bp
ret
_r_countENDP
; одержуСФмо черговий символ з буфера приймача,
; отриманий символ вiддаляСФться з буфера
_receive_comPROC FAR
push bp
mov bp,sp
push si
pushf
push bx
push si
mov si,CURRENT_AREA
mov ax,-1
test installed[si],1
jz exit_receive_com
; повертаСФмося якщо буфер приймача порожнiй
cmp size_r_data[si],0
je exit_receive_com
mov ah,0
mov bx,start_r_data[si]
mov al,reciave_buf[si][bx]
cmp parity[si],N
je no_parity
; якщо виробляСФться перевiрка на парнiсть, то маскуСФмо старший бiт
and al,7FH
no_parity:
inc bx
cmp bx,R_SIZE
jb rec_ptr_no_max
mov bx,0
rec_ptr_no_max:
mov start_r_data[si],bx
dec size_r_data[si]
exit_receive_com:
pop si
pop bx
popf
pop si
mov sp,bp
pop bp
ret
_receive_comENDP
; функцiя повертаСФ в регiстрi ax число вiльних байт у
; буферi передавача, а в регiстрi dx загальний розмiр буфера передавача
_s_countPROC FAR
push bp
mov bp,sp
push si
pushf
push si
mov si,CURRENT_AREA
mov ax,0
mov dx,S_SIZE
test installed[si],1
jz exit_s_count
mov ax,S_SIZE
sub ax,size_s_data[si]
exit_s_count:
pop si
popf
pop si
mov sp,bp
pop bp
ret
_s_countENDP
; помiстити символ у буфер передавача
; [bp+6] - символ
_send_comPROC FAR
push bp
mov bp,sp
push si
mov al,[bp+6]
pushf
push ax
push bx
push dx
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_send_com
cmp size_s_data[si],S_SIZE
jl no_s_EOVFLOW
; вiдбулося переповнення буфера передавача
inc WORD PTR EOVFLOW[si]
jmp short exit_send_com
no_s_EOVFLOW:
mov bx,end_s_data[si]
mov send_buf[si][bx],al
inc bx
cmp bx,S_SIZE
jl no_send_ptr_max
mov bx,0
no_send_ptr_max:
mov end_s_data[si],bx
inc size_s_data[si]
; зчитуСФмо регiстр керування перериваннями
mov dx,IER[si]
in al,dx
; завершуСФмо функцiю якщо дозволенi переривання пiсля передачi байта
test al,2
jnz exit_send_com
; дозволяСФмо переривання пiсля передачi байта, пiсля прииема байта,
; при виявленнi стану "BREAK" i при виникненнi помилки
mov al,7
out dx,al
exit_send_com:
pop si
pop dx
pop bx
pop ax
popf
pop si
mov sp,bp
pop bp
ret
_send_comENDP
; передаСФмо вилученому модему сигнал "BREAK"
_break_comPROC FAR
push bp
mov bp,sp
push si
pushf
push ax
push cx
push dx
mov si,CURRENT_AREA
test installed[si],1
jz exit_break_com
; передаСФмо сигнал "BREAK"
mov dx,LCR[si]
in al,dx
jmp $+2
or al,40h
out dx,al
mov cx,0C000h
do_BREAK:
loop do_BREAK
and al,0BFh
out dx,al
exit_break_com:
pop dx
pop cx
pop ax
popf
pop si
mov sp,bp
pop bp
ret
_break_comENDP
; повертаСФмо в dx:ax покажчик на лiчильники помилок
_com_errors PROC FAR
push bp
mov bp,sp
mov ax,OFFSET DGROUP:CURRENT_AREA
add ax,error_block
mov dx,ds
mov sp,bp
pop bp
ret
_com_errors ENDP
; заповнюСФмо лiчильники помилок
set_err PROC NEAR
test al,2
jz test1
inc WORD PTR EOVRUN[si]
test1:
test al,4
jz test2
inc WORD PTR EPARITY[si]
test2:
test al,8
jz test3
inc WORD PTR EFRAME[si]
test3:
test al,16
jz exit_set_err
inc WORD PTR EBREAK[si]
exit_set_err:
ret
set_err ENDP
; протокол модему для передачi даних
modem_protocol PROC NEAR
cmp device_conn[si],M
jne no_modem
; установлюСФмо сигнали DTR, RTS i OUT2
mov dx,MCR[si]
mov al,00001011B
out dx,al
jmp $+2
; очiкуСФмо поки модем вiдповiсть про готовнiсть сигналом DSR
mov cx,1000
mov dx,MSR[si]
wait_dsr:
in al,dx
test al,20H
jnz test_cts
loop wait_dsr
; модем не вiдповiв сигналом DSR
inc WORD PTR EDSR[si]
jmp short no_modem
test_cts:
; очiкуСФмо поки модем вiдповiсть про готовнiсть сигналом CTS
mov cx,1000
wait_cts:
in al,dx
test al,10H
jnz test_lcr
loop wait_cts
; модем не вiдповiв сигналом CTS
inc WORD PTR ECTS[si]
test_lcr:
no_modem:
; чи перевiряСФмо порожнiй регситр збереження передавача
mov dx,LSR[si]
in al,dx
test al,20H
jnz s_reg_empty
; помилка при передачi
inc WORD PTR EXMIT[si]
s_reg_empty:
ret
modem_protocol ENDP
; оброблювач переривань вiд COM1
int_hndlr1 PROC FAR
push si
mov si,OFFSET DGROUP:AREA1
jmp short handle_int
; оброблювач переривань вiд COM2
int_hndlr2 PROC FAR
push si
mov si,OFFSET DGROUP:AREA2
jmp short handle_int
; оброблювач переривань вiд COM3
int_hndlr3 PROC FAR
push si; SAVE si
mov si,OFFSET DGROUP:AREA3
jmp short handle_int
;
; оброблювач переривань вiд COM4
int_hndlr4 PROC FAR
push si; SAVE si
mov si,OFFSET DGROUP:AREA4
;
; оброблювач переривань
handle_int:
push ax
push bx
push cx
push dx
push bp
push di
push ds
push es
mov ax,DGROUP
mov ds,ax
next_pr:
; передаСФмо контролеру переривань команду кiнця обробки
; переривання
mov dx,OCR
mov al,eoi[si]
out dx,al
next_inter:
; зчитуСФмо значення регiстра