Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
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

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

×