АпаратнотАУпрограмний комплекс GSM-МТМ
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
чик на поточну область даних
mov si,CURRENT_AREA
push es
mov AREA1.int_hndlr,OFFSET int_hndlr1
mov AREA2.int_hndlr,OFFSET int_hndlr2
mov AREA3.int_hndlr,OFFSET int_hndlr3
mov AREA4.int_hndlr,OFFSET int_hndlr4
; зберiгаСФмо старий вектор переривання
mov ah,35H
mov al,int_com[si]; номер переривання
int 21h
; записуСФмо в перемiннi old_com_off i old_com_seg
; вiдповiдно сегмент i зсув старого вектора переривання
mov old_com_off[si],bx
mov bx,es
mov old_com_seg[si],bx
pop es
pop si
mov sp,bp
pop bp
ret
_save_comENDP
; install_com: установити активний порт
; повертаСФ в регiстрi ax - 1 при успiшнiй установцi
; i 0 у випадку помилки
_install_com PROC FAR
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
push es
cmp installed[si],1
jne go_install
jmp alredy_ok
; очищаСФмо лiчильники помилок
go_install:
mov WORD PTR EOVFLOW[si],0; переповнення буфера передавача
mov WORD PTR EOVRUN[si],0; помилка переповнення при прийомi
mov WORD PTR EBREAK[si],0; виявлений запит на переривання
mov WORD PTR EFRAME[si],0; помилка синхронiзацiСЧ
mov WORD PTR EPARITY[si],0; помилка парностi
mov WORD PTR EXMIT[si],0; помилка при передачi
mov WORD PTR EDSR[si],0; не отриманий сигнал DSR
mov WORD PTR ECTS[si],0; не отриманий сигнал CTS
; визначаСФмо базова адреса використовуваного COM порту
mov bx,BIOS_VAR
mov es,bx
ASSUME es:BIOS_VAR
cmp port[si],1; порт 1?
je adr_3F8
cmp port[si],2; порт 2?
je adr_2F8
cmp port[si],3; порт 3?
je adr_3E8
cmp port[si],4; порт 4?
je adr_2E8
int 20H
adr_3F8:
mov ax,3F8H
jmp cmp_bios
adr_2F8:
mov ax,2F8H
jmp cmp_bios
adr_3E8:
cmp rs232_base+4,0
je adr_3E8_A
mov ax,rs232_base+4
jmp cmp_bios
adr_3E8_A:
mov ax,3E8H
mov rs232_base+4,ax
jmp cmp_bios
adr_2E8:
cmp rs232_base+6,0
je adr_2E8_A
mov ax,rs232_base+6
jmp cmp_bios
adr_2E8_A:
mov ax,2E8H
mov rs232_base+6,ax
; перевiряСФмо чи iснуСФ визначена вiдповiдна змiнна
; BIOS
cmp_bios:
cmp ax,rs232_base
je set_reg_adr
cmp ax,rs232_base+2
je set_reg_adr
cmp ax,rs232_base+4
je set_reg_adr
cmp ax,rs232_base+6
jne bad_exit
set_reg_adr:
mov bx,DATREG
mov cx,7
set_next_reg_adr:
mov WORD PTR [si][bx],ax
inc ax
add bx,2
loop set_next_reg_adr
; установлюСФмо вектор переривання на наш оброблювач
mov AREA1.int_hndlr,OFFSET int_hndlr1
mov AREA2.int_hndlr,OFFSET int_hndlr2
mov AREA3.int_hndlr,OFFSET int_hndlr3
mov AREA4.int_hndlr,OFFSET int_hndlr4
mov ah,25H
mov al,int_com[si]; номер переривання
mov dx,OFFSET DGROUP:int_hndlr[si]
push ds
push cs
pop ds
int 21h
pop ds
; пiднiмаСФмо прапор - порт установлений
alredy_ok:
mov installed[si],1
pop es
; повертаСФмо 1
mov ax,1
pop si
mov sp,bp
pop bp
ret
; порт не встановлений
bad_exit:
mov installed[si],0
pop es
; повертаСФмо 0
mov ax,0
pop si
mov sp,bp
pop bp
ret
_install_com ENDP
; вiдновлення векторiв переривань
_restore_com PROC FAR
push bp
mov bp,sp
push si
; вiдзначаСФмо COM порт як не активний
mov si,CURRENT_AREA
mov installed[si],0
; вiдновлюСФмо вектор переривання
mov ah,25H
mov al,int_com[si]
mov dx,old_com_off[si]
mov bx,old_com_seg[si]
push ds
mov ds,bx
int 21h
pop ds
pop si
mov sp,bp
pop bp
ret
_restore_com ENDP
; вiдкрити COM порт
; скидання буферiв передавача i приймача,
; iнiцiалiзацiя регiстрiв UART 8250
; дозвiл переривань вiд UART 8250
; (програмування контролера переривань)
; [bp+6] = швидкiсть обмiну
; [bp+8] = спосiб зСФднання - M(Модем), D(Нуль-модем)
; [bp+10] = парнiсть - N(ONE), O(DD), E(VEN), S(PACE), M(ARK)
; [bp+12] = кiлькiсть стопових бiтiв 1, 2
_open_com PROC FAR
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
; забороняСФмо переривання
cli
mov ax,[bp+6]
mov baud_rate[si],ax
mov bh,[bp+8]
mov device_conn[si],bh
mov bl,[bp+10]
mov parity[si],bl
mov ch,[bp+12]
mov stop_bits[si],CH
; скидаСФмо буфери i покажчики
mov start_s_data[si],0
mov end_s_data[si],0
mov start_r_data[si],0
mov end_r_data[si],0
mov size_s_data[si],0
mov size_r_data[si],0
; чи перевiряСФмо установлений вже оброблювач переривань
test installed[si],1
jnz reset_uart
jmp exit_open
reset_uart:
; установлюСФмо регiстри UART 8250
; скидаСФмо регiстр керування модемом
mov al,0
mov dx,MCR[si]
out dx,al
jmp $+2
; скидаСФмо регiстр стану лiнiСЧ
mov dx,LSR[si]
in al,dx
jmp $+2
; скидаСФмо регiстр даних
mov dx,DATREG[si]
in al,dx
jmp $+2
; скидаСФмо регiстр стану модему
mov dx,MSR[si]
in al,dx
; визначаСФмо дiльник частоти тактового генератора
mov ax,50
mul DIV50
div baud_rate[si]
mov bx,ax
; переключаСФмо регiстир даних i регiстр керування перериваннями
; для введення дiльника частоти тактового генератора
mov dx,LCR[si]
mov al,80H
out dx,al
jmp $+2
; уводимо молодший байт дiльника частоти тактового генератора
mov dx,WORD PTR DLL[si]
mov al,bl
out dx,al
jmp $+2
; уводимо старший байт дiльника частоти тактового генератора
mov dx,WORD PTR DLH[si]
mov al,bh
out dx,al
jmp $+2
; визначаСФмо парнiсть i кiлькiсть стоп-бiтiв
mov al,03H
cmp parity[si],O
jne next1
mov al,0ah
jmp short next3
next1:
cmp parity[si],E
jne next2
mov al,1ah
jmp short next3
next2:
cmp parity[si],M
jne next3
mov al,2ah
next3:
test stop_bits[si],2
jz stop1
or al,4
stop1:
mov dx,LCR[si]
out dx,al
; дозволяСФмо переривання для 8259 i 8250
; установлюСФмо регiстр маски переривань щоб
; дозволити переривання вiд асинхронного порту
in al,IMR
and al,d_irq[si]
out IMR,al
; дозволяСФмо генерацiю переривань при готовностi прийнятих
; даних, по станi "BREAK" i помилково
mov dx,IER[si]
mov al,0Dh
out dx,al
jmp $+2
; установлюСФмо DTR, RTS, OUT2
mov dx,MCR[si]
mov al,0bh
out dx,al
exit_open:
sti
pop si
mov sp,bp
pop bp
ret
_open_comENDP
; забороняСФмо переривання вiд асинхронного порту
_close_comPROC FAR
push bp
mov bp,sp
push si
mov si,CURRENT_AREA
test installed[si],1
jz exit_close
; забороняСФмо переривання UART 8250
mov dx,IER[si]
mov al,0
out dx,al
; маскуСФмо переривання вiд UART
mov dx,IMR
in al,dx
or al,e_irq[si]
jmp $+2
out dx,al
exit_close:
pop si
mov sp,bp
pop bp
ret
_close_comENDP
;процедура повертаСФ 1 якщо з МТМ надiйшо