1 M. Rebaudengo Routine di servizio dell’interrupt
2 M. Rebaudengo Main in C Extern void UART_init(); Extern void fine_isr(); void main() { char stringa[20], *pstringa; char eos=0; pstringa = stringa; UART_init(); while (eos == 0) {/* CPU FA NULLA IN ATTESA CHE TERMINA IL PROCESSO DI GESTIONE VIA INTERRUPT*/} printf(“%s\n”, stringa); fine_isr(); }
3 M. Rebaudengo Scheletro Assembler EXTRN pstringa:WORD EXTRN eos:BYTE rbrequ03f8h dlr_lsbequ03f8h dlr_msbequ03f9h lcrequ03fbh ierequ03f9h lsr equ03fDh fifo_crequ03fah mcrEQU03FCH.model small,c.DATA old_int0C_offset dw ? old_int0C_segment dw ?.code
4 M. Rebaudengo Routine di servizio dell’interrupt ISR_UART proc FAR PUSH DS STI MOV AX, SEG pstringa MOV DS, AX MOV SI, pstringa mov dx,rbr in al, dx ; then write the byte MOV [si], AL INC pstringa CMP AL, 0 JNE fine MOV eos, 1 fine: OUT 20h, 20h ; EOI master POP DS pop dx iret ISR_UART endp
5 M. Rebaudengo Inizializzazione 8250 UART_init proc PUSH ES movdx, lcr in al, dx;lettura del contenuto di LCR oral, 80h;set DLAB outdx, al;scrittura in LCR ; bit-rate: 9600 movax, 000ch movdx, dlr_lsb outdx, al mov al, ah incdx outdx, al ; 1 bit di stop, 8 bit/carattere, parita’ ; DLAB = 0 moval, 0Bh movdx, lcr outdx, al
6 M. Rebaudengo Inizializzazione 8250 (cont.) ; disabilitazione fifo control register xor al, al mov dx, fifo_cr out dx, al ; abilitazione delle richieste di interruzione per trasmissionwe mov al, 01h movdx, ier outdx, al MOV DX, MCR MOV AL, 0Bh ; abilitazione out2 OUT DX, AL
7 M. Rebaudengo Inizializzazione 8250 (cont.) mov ax, 0 mov es, ax ; segmento ES=0000 mov bx, 0Ch ; tipo di interrupt shl bx, 2 ; moltiplica per 4: offset IVT ; salva l’indirizzo della vecchia ISR mov ax, es:[bx] mov old_int0C_offset, ax mov ax, es:[bx+2] mov old_int0C_segment, ax cli ; disabilita interrupt prima di ; scrivere nella IVT ; carica l’indirizzo della nuova ISR mov ax, OFFSET isr_uart mov es:[bx], ax mov ax, SEG isr_uart mov es:[bx+2], ax sti ; riabilita interrupt POP ES ret UART_init endp
8 M. Rebaudengo Ripristino della situazione iniziale fine_isr PROC Push es mov ax, 0 mov es, ax ; segmento ES=0000 mov bx, 0Ch ; tipo di interrupt shl bx, 2 ; moltiplica per 4: offset IVT ; salva l’indirizzo della vecchia ISR cli ; disabilita interrupt prima di ; scrivere nella IVT ; carica l’indirizzo della nuova ISR mov ax, old_int0C_offset mov es:[bx], ax mov ax, old_int0C_segment mov es:[bx+2], ax sti ; riabilita interrupt pop es ret fine_isr ENDP