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