[comp.os.msdos.programmer] Interrupt driven Serial Communication

schmke@nntp-server.caltech.edu (Kevin Todd Schmidt) (01/24/91)

I am trying to write a simple terminal emulator in assembly language and
wish to directly access the hardware registers for the serial port and
the interrupt controller.  What I am trying to do in the following code
fragment is set up COM1 for 9600 baud, no parity, 8 data bits, 1 stop bit,
with an interrupt being generated when data is received.  That interrupt
should then be handled by the readcom subroutine.  The problem is that
the interrupt is never generated when data is received.  If anyone can
help I would appreciate it.  Please Email responses and I will summarize.


; code fragment
;
         mov dx, 3FBh               ; set DLAB=1
         mov al, 80h
         out dx, al

         mov dx, 3F8h               ; low byte
         mov al, 0Ch                ; 9600 baud
         out dx, al
         mov dx, 3F9h
         mov al, 0                  ; high byte
         out dx, al

l1:      mov dx, 3FBh               ; put port in normal mode
         mov al, 3                  ; 8 data, 1 stop, no parity
         out dx, al

         mov dx, 3F9h               ; enable interrupt when rec'd data is avail
         mov al, 1
         out dx, al

         push es
         mov ax, 350Ch              ; get int 0Ch vector
         int 21h
         mov word ptr intvec, bx    ; and save it
         mov word ptr intvec[2], es

         mov dx, offset readcom     ; set new vector
         mov ax, 250Ch
         int 21h
         pop es

         in al, 21h                 ; unmask IRQ4
         and al, 0EFh
         out 21h, al
         mov al, 20h
         out 20h, al

;
;
; other code to receive characters from PC and send out com1
; this part works
;


;
; this code is never reached because the interrupt is not generated
;
readcom  PROC FAR

         push ax
         push dx

         mov dx, 3FAh               ; read the interrupt id register
         in al, dx
         cmp al, 2
         jnz rc9

         mov dx, 3F8h               ; get character
         in al, dx
         mov dl, al

         mov ah, 02h                ; and write to screen
         int 21h

rc9:     mov al, 20h
         out 20h, al

         pop dx
         pop ax

         iret

readcom  ENDP

______________________________________________________________________________
        _  ____   _  |                           |
       / // _  \ / / | Kevin T. Schmidt          | schmke@gap.cco.caltech.edu
      / // /_/ // /  | Jet Propulsion Laboratory | schmidt@mars.jpl.nasa.gov
 _   / // ____// /   | 4800 Oak Grove Dr.        |
/ /_/ // /    / /___ | M/S 301-355               |
\____//_/    /_____/ | Pasadena, CA  91109       |

-- 
______________________________________________________________________________
        _  ____   _  |                           |
       / // _  \ / / | Kevin T. Schmidt          | schmke@gap.cco.caltech.edu
      / // /_/ // /  | Jet Propulsion Laboratory | schmidt@mars.jpl.nasa.gov