АпаратнотАУпрограмний комплекс 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стра