Ir ao conteúdo
  • Cadastre-se
Entre para seguir isso  
lcorr

Como gerar uma interrupção com o 8250 em loopback

Recommended Posts

Tenho tentado conseguir com que uma interrupcao seja gerada, a partir da pastilha

8250, programada convenientemente, em modo loopback. O codigo que estou usando (que deveria funcionar) é o que segue, porém, não entendo por que não funciona. Alguem pode me ajudar, por favor?

;*******************************************************************

; IRQINT - teste de IRQ

; Correa, L nov-2004

;*******************************************************************

code segment byte 'code'

assume cs:code

org 0100h

inicio:

jmp start

vetor_int_velha dd ?

mensagem db 'IRQ4 GEROU INT12!',10,13,'$'

;----------------------------------------

; PROG_8250 - programa o 8250

;----------------------------------------

PROG_8250 proc

; programqa a velocidade de comunicação para 1001 Baund (N = 115):

mov dx, 3FBh ; seta DLAB em 1

in al, dx ;

or al, 10000000b ;

out dx, al ;

mov dx, 3F8h ; Seta byte

mov al, 73h ; menos significativo

out dx, al ; em DLL.

mov dx, 3F9h ; Seta byte

xor al, al ; mais significativo

out dx, al ; em DLM.

; formata comunicacao assincrona em 8 bits, sem paridade, sem bit de parada:

mov dx, 03FBh

mov al, 00000011b

out dx, al

; seta 8250 para gerar interrrupcao quando receber um caracter:

mov dx, 03FCh ; Seta MCR para habilitar interrupcoes e

mov al, 00001001b ; ativar DTR.

out dx, al ;

; habilita interrupcoes em IER:

mov dx, 03FBh ; seta DLAB em 0

in al, dx ;

and al, 01111111b ;

out dx, al ;

mov dx, 3F9h ; Habilita interrupcoes em IER quando

mov al, 00000010b ; um byte for transmitido.

out dx, al ;

; carrega buffer de transmissão:

mov dx, 3FBh ; inicializa buffer setando DLAB em 0

in al, dx ;

and al, 01111111b ;

out dx, al ;

mov dx, 3F8h ; Carrega buffer

mov al, 41h ; de transmissao

out dx, al ; com o caracter 'A'.

ret

PROG_8250 endp

; ---------------------------------------------------------------------

; NOVA_INT - Novo rotina tratadora da interrupçao 12

; ---------------------------------------------------------------------

NOVA_INT proc

; salva registradores

push si

push di

push ds

; habilita novas interrupções:

MOV AL, 20h ; Habilita

OUT 20h, AL ; novas interrupcoess no 8259

; trata a nova interrupção

mov dx, offset mensagem ; mostra mensagem se ocorrer a interrupcao

mov ah, 9h

int 21h

; recupera registradores salvos

pop ds

pop di

pop si

iret ; retorna da interrupcao

NOVA_INT endp

; ---------------------------------------------------------------------------------------

; ASSUME_INT_VELHA - Intercepta e salva vetor de tratamento da interrupção 12

; ---------------------------------------------------------------------------------------

ASSUME_INT_VELHA proc

MOV AX, 0 ; Fixa ES na

MOV ES, AX ; pagina 0.

MOV AX,WORD PTR es:[12*4] ; Salva na variavel

MOV DS:WORD PTR VETOR_INT_VELHA,AX ; VETOR_INT_VELHA, o

MOV AX,WORD PTR es:[12*4+2] ; vetor original da

MOV ds:WORD PTR VETOR_INT_VELHA+2,AX ; interrupção interceptada.

MOV AX,OFFSET NOVA_INT ; Assume o vetor da

MOV WORD PTR ES:[12*4],AX ; interrupção interceptada

MOV AX, CS ; com o vetor da rotina

MOV WORD PTR ES:[12*4+2],AX ; da nova interrupção.

RET ; Volta a quem chamou.

ASSUME_INT_VELHA endp

; ----------------------------------------------------------------------------------------------

; RESTAURA_INT_VELHA - Restaura a rotina tratadora original da interrupção 12

; ---------------------------------------------------------------------------------------------

RESTAURA_INT_VELHA PROC

MOV AX, 0 ; acessa dados da

MOV ES, AX ; página 0.

MOV AX, DS:WORD PTR VETOR_INT_VELHA ; Restaura vetor

MOV WORD PTR ES:[12*4], AX ; do BIOS de

MOV AX, DS:WORD PTR VETOR_INT_VELHA+2 ; tratamento

MOV WORD PTR ES:[12*4+2], AX ; da IRQ12.

RET

RESTAURA_INT_VELHA ENDP

;-----------------------------------

; PROGRAMA PRINCIPAL

; ----------------------------------

start:

; assume nova rotina tratadora da interrupção alvo:

call ASSUME_INT_VELHA

; insere mascara da IRQ4:

cli

in al, 021h

and al, 11101111b

out 021h, al

jmp $+2

sti

; programa o 8250

call PROG_8250

; restaura rotina antiga tratadora da interrupção:

call RESTAURA_INT_VELHA

; retorna ao DOS

mov ah, 4Ch

int 21h

code ends

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora
Entre para seguir isso  





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×