What allows processor to communicate with peripheral devices?

Our focus will be the common bus. As you might imagine, we must ensure that every byte sent reaches the correct device and any received must be correctly labeled as to where it came from.

One way to do this is to reserve a set of memory locations for this purpose. Then a set of memory addresses represent the data byte, others represent the control registers in the device. This is a simple approach but in today's multi-processing systems, there is a lack of control that is not acceptable.

Another approach is to use ports. On the PC, there are 65,536 ports, each one separately addressable. Input/output operations are then performed by the instructions IN and OUT, which read and write directly to the ports. They have two operands, the accumulator and a port specified.

It is possible to use an accumulator of any size, AL, AX, EAX, and a port address in the range of 0 to 65535 (0FFFFh). However, yoou can not specify a port of greater than 255 as an immediate operand. To exceed that, you must use a register:

mov    dx, 3D8h         ; store port number in DX
out    al, dx                ; send byte contained in AL to port 3D8h;
    

Many of the ports are already reserved for IBM-Compatible PCs.

Port AddressDevice Connected020h - 023hProgrammable interrupt controller 8259030h - 03FhInterrupt controller 1 (AT and PS/2)040h - 043hTimer060h - 06FhPPI on PC and XT, keyboard on AT and PS/21F0h - 1F8hFixed disk controller (AT)278h - 27BhParallel printer (LPT2)2E8h - 2EFhSerial Port 42F8h - 2FFhSerial Port 2378h - 37BhParallel printer (LPT1)3B0h - 3BBhMDA or VGA video adapter3BCh - 3BFhParallel printer (LPT3)3C0h - 3CfhEGA/VGA video adapter3D0h - 3DFhCGA/VGA video adapter3E8h - 3EFhSerial port 33F0h - 3F7hFloppy disk control3F8h - 3FFhSerial port 1

The Basics of Controlling the Peripherals

I/O ports are physically located in different chips belonging either to the motherboard (the timer) or to other cards (disk or video controllers). The chips that used to be most commonly used are:Peripheral interfaceIntel 8255Interrupt controllerIntel 8259TimerIntel 8253Serial PortUART 8250

It must be noted that not all systems use the same chips and some of the chips have been upgraded. Sometimes it is helpful to have your program determine which system you have:

;
;       Program DetPC 
;       Copyright 1993, Vitaly Maljugin, Jacov Izrailevich, Semyon Lavon
;                       Aleksandr Sopin
;
        .model large

HiBios  segment at 0F000h
        org     0FFFEh
PcType  db      ?               ; Computer idenifier
HiBios  ends

        .code
        ASSUME  es:HiBios       ; ES wil be used for accessing ROM BIOS area
Begin:  mov     ax,@data        ; load segment address of DATA segement
        mov     ds,ax           ; DS points to DATA segment
        mov     ax,HiBios       ; load segment address or ROM BIOS data
        mov     es,ax           ; ES points to ROM BIOS segment
        mov     cx,Ltable       ; Load length of table to be searched
        mov     dl,PcType       ; Extract the type from BIOS area

Search: mov     bx,cx           ; Address of current table element
        cmp     dl,TypeTbl[bx-1] ;Compare type and element of table
        je      EndSear         ; If found, stop searching
        loop    Search          ; Test next element of table

EndSear:mov     al,cl           ; number element found passed as return code
        mov     ah,4Ch          ; DOS service 4H - terminate process
        int     21h             ; DOS service call


        .data                   ;

;       Table of microprocessors' types

        db      0               ;  0 - Uknown type
TypeTbl db      0F8h            ;  1 - IBM PS/2 model 80
        db      0F9h            ;  2 - IBM PC Convertible
        db      0FAh            ;  3 - IBM PS/2 Model 30
        db      0FBh            ;  4 - PC XT Ext keyboard, 3.5" drives
        db      0FCh            ;  5 - PC-AT or PS/2 Models 50,60
        db      0FDh            ;  6 - IBM PC-JR
        db      0FEh            ;  7 - PC-XT
        db      0FFh            ;  8 - IBM PC
        db      09Ah            ;  9 - Compaq XT / Compaq Plus
        db      030h            ; 10 - Sperry PC
        db      02Dh            ; 11 - Compaq PC / Compaq Deskpro
Ltable  equ     $-TypeTbl
        end     begin
  

Methods of Controlling the Hardware

There are two types of interrupts, hardware and software, that are in use here. This allows us to have two different approaches for I/O, polling and event-driven (where the event is an interrupt).

If it is polling, the computer must continual, even constantly, check to see if there is any event. If the program is constantly checking, it can do nothing else. This makes the program very easy to debug, but it prevents any other useful work from being perform, which lowers the overall speed and program efficiency.

The other approach is to use hardware interrupts. The interrupt handle is activated when there is a key pressed on the keyboard. The handler preserves the state of the CPU, gets the input and deals with it.

;
;       Program ScanCodD
;       Copyright 1993, Vitaly Maljugin, Jacov Izrailevich, Semyon Lavon
;                       Aleksandr Sopin
;
       .model  small
       .stack
       .data

CR      equ     00Dh            ; Carriage return code
LF      equ     00Ah            ; Line feed code
EscScan equ     001h            ; Scan code for ESC key
KbdPort equ     060h            ; PPI 9225 port A
EndMsg  equ     024h            ; Dollar sign - end of message for DOS service
NewHand dd      NewInt9         ; Reference to the new handler for int 09
ScanCod db      0
BegMsg  db      CR,LF,LF

        db      '   SCAN CODES BROWSER 3.0 ', CR,CR,LF
        db      'Interrupt 09h handler totally replaced',CR,LF
        db      EndMsg
Kbd83   db      CR,LF,'You have a standard 83-key keyboard',CR,LF,EndMsg
Kbd101  db      CR,LF,'You have an enhanced 101/102 keyboard',CR,LF,EndMsg
InsMsg  db      CR,LF,'Press ESC to exit else',CR,LF
        db      'Press and relese any other key',CR,LF,LF,EndMsg
FinMsg  db      CR,LF,'       Job terminated',CR,LF
        db      ' Standard value of interrupt vector 09h '
        db      'has been restored.', CR,LF, EndMsg

        .code
OutB    PROC    NEAR USES AX
        cmp     al,0Ah          ; Is it decimal digit ( 0 - 9)?
        jb      NoCorr          ; No correction - first 10 hex digit are dec
        cmp     al,10h          ; Is it hexadecimal digit ( A - F )?
        jb      HexCyph         ; If so correct for character representation
        mov     al,' '          ; If not, replace it with blank
        jmp     OutScr          ;   and output
HexCyph:add     al,07h          ; This transform hex digits A - F
NoCorr: add     al,30h          ; Convert integer to character
OutScr: mov     ah,0Eh          ; Function 0Eh - write character
        int     10h             ; BIOS video service
        inc     NumL
        cmp     NumL,60
        jl      NoNewL
        mov     al,CR
        int     10h
        mov     al,LF
        int     10h
        mov     NumL,0
NoNewL: ret
NumL    dw      0
OutB    ENDP

PrtByte PROC    near uses AX DX
      mov     ah,0            ; Clear high part of AX
      mov     dx,0010h        ; Divider into BX
      div     dl              ; AL - result, AH - remainder
      mov     dx,ax           ; Save results
      call    OutB
      mov     al,dh
      call    OutB
      mov     al,' '          ; Character to be printed is a blank
      call    OutB
      ret                     ; Return to the caller
PrtByte ENDP

EndInt  PROC    NEAR
      in      al,61h          ; read Port B
      or      al,80h          ; set bit 7 to 1
      out     61h,al          ; output to port B
      jmp     $+2             ; delay (needed for fast PC)
      and     al, not 80h     ; clear bit 7
      out     61h,al          ; output to port B
      mov     al,20h          ; EOI code into AL
      out     20h,al          ; signal EOI
      ret
EndInt  ENDP    


NewInt9 PROC  near
      mov     SaveAX,ax
ContKey:pushf                   ; save original flags
      in      al,60h          ; read scan code
      cmp     al,EscScan      ; ESC pressed?
      je      Fin             ; if so, return
      call    PrtByte         ; output scan code
      Call    EndInt
      sti                     ; allow interrupts
      popf                    ; restore original flags
      iret

Fin:  Call    EndInt
      mov     ax,SaveAX
      popf
Jmp9    db      0EAh            ; opcode for JMP FAR
OldInt9 dw      ?,?             ; Address of old handler for interrupt 09h
SaveAX  dw      ?       
NewInt9 ENDP

.startup
      lea     dx,BegMsg       ; Addres of start message into DX
      mov     ah,09           ; Function 09h - output text string
      int     21h             ; Dos service call

      mov     ax,40h          ; 40h - segment address for BIOS data area
      mov     es,ax           ; Place this address into ES
      test    byte ptr es:[96h],10h   ; Bit 4 - 101-key keyboard indicator
      jnz     Pres101
      lea     dx,Kbd83        ; Addres of start message into DX
      mov     ah,09           ; Function 09h - output text string
      int     21h             ; Dos service call
      jmp     PrtInstr

Pres101:
      lea     dx,Kbd101       ; Addres of start message into DX
      mov     ah,09           ; Function 09h - output text string
      int     21h             ; Dos service call

PrtInstr:
      lea     dx,InsMsg       ; Addres of start message into DX
      mov     ah,09           ; Function 09h - output text string
      int     21h             ; Dos service call

      mov     ah,35h          ; Function 35h - Get interrupt vector
      mov     al,09h          ; Interrupt number is 09h
      int     21h             ; DOS service call
      mov     OldInt9[0],bx         ; Save offset addres of old handler
      mov     OldInt9[2],es         ; Save segment address of old handler
      push    ds              ; DS will contain the segment of new handler
      lds     dx,NewHand      ; Full addres of new handler into DS:DX
      mov     ah,25h          ; Function 25h - set interrupt vector
      int     21h             ; DOS service call
      pop     ds              ; Restore the data segment register

NextKey:mov     ah,0Ch          ; Function 0Ch - clear the keyboard buffer
      int     21h             ; Dos service call
      mov     ah,0            ; Function 00h - read character from keyboard
      int     16h             ; BIOS keyboard service
      cmp     ah,EscScan      ; Is the ESC key pressed?
      jne     NextKey         ; If not - process the next key

Finis:  lea     dx,FinMsg       ; Addres of start message into DX
      mov     ah,09           ; Function 09h - output text string
      int     21h             ; Dos service call

      mov     dx,OldInt9[0]   ; Offset address for old handler into DX
      mov     ds,OldInt9[2]   ; Segment address for old handler into DS
      mov     ax,2509h        ; Set interrupt vector for INT 9
      int     21h             ; DOS service call

      mov     ax,4C00h        ; Function 4Ch - terminate process
      int     21h             ; DOS service call

      END
  

Parallel Ports LPT1 - LPT3 (Printer Output)

There can be three printers on a PC (four on a PS/2), however the number on a given system can be different from system to system. There is a reference to a parallel port, which refers to the plug where the printer cable attaches, and there are PC ports which are used to talk to a device. LPT1 uses PC ports 378h to 37Bh. Every printers port has its own adapter, which is controlled by by three registers, available through the corresponding I/O ports. The I/O ports belonging to a parallel port have sequentially increasing address, the first of swhich is referred to as the base address of a corresponding parallel port. The base address for LPT1 is stored in the BIOS data area at locatiion 0040h:0008h. If the value of the base address is zero, then the port is not installed. There is also a Configuration Word at 0040h:0010h, whose bits 14-15 holds the number of parallel ports installed.

The three parallel port registers are:

  • Output Data Register
    Receives the byte which is being printed. The address of the this register for LPT1 is stored in the word 0040h:0008h.
  • Status register
    Describes the most recent I/O operation. To get the address of the port connected to this register, simply add 1 to the base address, eg. for LPT1 it is 379h. It bits are:The Printer Status RegisterBitMeaning if set0Timeout1-2Not used3I/O error4Printer is On-Line5Out of Paper6Acknowledge (if zero, normal setting)7Printer is not busy
  • Control Register
    Initializes the adapter and controls the output of data to the printer. Its address is equal to the addres of the output data register (base address) + 2, eg. for LPT1 it is 37Ah, the meanings of the bits are:The Printer Control RegisterBitMeaning if set0sending byte1CR treated as CR + LF2normal setting (reset printer when 0)3select printer4enable printe IRQ (IRQ 7 for LPT1)5 - 7not used

Levels of Access to the Printer

There are three levels of mastering the hardware:Logical levelMS-DOS service available through functions of interrupt 21hBasic levelBIOS service available through interrupt 17hLow levelControlling the printer ports directlyThe logical level is what high-level languages use to implement I/O. This allows the programmer to output strings and not worry about the details.

The basic level allows you to programmically check on the status of things and to provide a different type of control, instead of relying on the standard DOS functions.

The low level is the most powerful and most difficult. In the case of the printer, there is not too much different in low level and the basic level, except that there can be a slight improvement in speed.

Mouse Input

When the mouse is moved or when its keys are presed, signals are generated. They are accepted by the mouse driver and used for controlling a special screen pointer called the mouse cursor. Key presses must also include the information about which key was pressed.

Programs which support the mouse must be capable of receiving and interpreting the signals generated by the mouse. There are different types of mice, and each requires a unique driver.

All signals generated by a mouse could be processed in a user program, however very few applicaitons actually do this. Normally, the program uses the servcies of the mouse driver.

The Mouse Driver

Interrupt 33h is used for as the handler for the mouse service functions. Old versions of the operating system did not have an interrupt handler for this and the interrupt table pointed to 0000h:0000h.

Make sure that if you are programming with a mouse, that you don't call the null address!

An application program that uses a mouse gets information about its state and location and performs a relevant action. One of the most common uses of the mouse in applications is for selecting an item in a menu. This process involves the following steps:

  • Output the menu to the screen.
  • Check the mouse state - has a button be pressed? If not, repeat this step.
  • Get the coordinates of the mouse when a button was pressed. It is was within a certain area of the screen, do that selection.

The mouse cursor is generated by the mouse driver that changes its location as you move the mouse. "When it is moved, the mouse generates short impulses called mickeys (christened by Bill Gates). The number of mickeys per inches is dependent on how the mouse was built and typically ranges from 200 to 400 mickeys per inch. Usually, the drivers moves the cursor by 1 pixel per mickey horizontally and 2 pixes per mickey vertically.

;***********************************************************************
;  Program PMouse2 ( Chapter 10 )
;
;  The demo program for mouse (the menu selection, Text Mode)
;
;  Author:  A.I.Sopin, Voronezh University. 1993
;
;  The interrupt 33h (mouse service) is used
;
;  Mouse driver must be installed
;
;***********************************************************************

NAME    PMOUSE2
        .DOSSEG
        .MODEL  SMALL
        .STACK  100h

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

        .DATA
BELL    EQU     07      ;  sound signal
LF      EQU     10      ;  Line Feed
CR      EQU     13      ;  Carriage Return
TEXT0   DB      " The MOUSE demo program  (INT 33h). "
        DB      "  Press any key to continue...", BELL, CR, LF, "$"
TEXT1   DB      " The mouse driver is not installed !!!."
        DB      "  Press any key...", BELL, CR, LF, "$"
TEXT2   DB      " An active mouse driver found."
        DB      "  Press any key...", BELL, CR, LF, "$"
TEXT3   DB      'The menu command selection using the mouse (text mode).'
Ltxt3   EQU     $-TEXT3
TEXT8   DB      "Select Command and press Left Button:"
Ltxt8   EQU     $-TEXT8

TEXT10  DB      "1 - Command one  "
Ltxt10  EQU     $-TEXT10
TEXT11  DB      "2 - Command two  "
Ltxt11  EQU     $-TEXT11
TEXT12  DB      "3 - Command three"
Ltxt12  EQU     $-TEXT12
TEXT13  DB      "4 - Command four "
Ltxt13  EQU     $-TEXT13
TEXT14  DB      "5 - Command five "
Ltxt14  EQU     $-TEXT14
TEXT15  DB      "6 - Exit         "
Ltxt15  EQU     $-TEXT15

TXT3L   DB      "Left button pressed.  Command  "
NumSel  DB      20h
        DB       "   selected."
        DB      BELL, "$"

VMODE   DB      0                       ;  video mode saved
ATTR    DB      0                       ;
ROW0    DB      0
COL0    DB      0
CX0     DW      0
DX0     DW      0

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

        .CODE
OutMsg  MACRO   Txt                     ;=======   output text message
        lea     dx,Txt                                             ;  adders of message
        mov     ah,09h                  ;  function 09h - output text string
        int     21h                     ;  DOS  service call
        ENDM

WaitKey MACRO                           ;=======   Wait for a key pressed
        xor     ah,ah                   ;  function 0 - wait for key pressed
        int     16h                     ;  BIOS keyboard service
        ENDM

SetCurs MACRO   Row,Column              ;=======   Move the cursor
        mov     ah,2                    ;  function 02h - set cursor position
        xor     bh,bh                   ;  video page 0 is used
        mov     dh,&Row                 ;  cursor row
        mov     dl,&Column              ;  cursor column
        int     10h                     ;  BIOS vide service call
        ENDM

PutStr  MACRO   Row,Column,Text,Leng,Attrib
        Local   M0
        push    si
        mov     cx,Leng                 ;  string length
        lea     si,Text                 ;  DS:SI - address of text string
        mov     dl,Column               ;  initial position (column)
        cld                             ;  process strings from left to right
;  Outputting one character
M0:     SetCurs Row,dl                  ;
        lodsb                           ;  AL - character to be output
        mov     bl,Attrib               ;  BL - attribute
        mov     ah,9                    ;  function 09 - output char+attr
        xor     bh,bh                   ;  video page 0 is used
        push    cx                      ;  save cycle counter
        mov     cx,1                    ;  number of characters output
        int     10h                     ;  BIOS video service call
        pop     cx                      ;  restore cycle counter
        inc     dl                      ;  next position for output
        loop    M0                      ;  next cycle step
        pop     si                      ;
        ENDM

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

.STARTUP
        mov     ah,0Fh                  ;  function 0Fh - get video mode
        int     10h                     ;  BIOS video service call
        mov     VMODE,al                ;  save current video mode
        mov     ah,0                    ;  function 0 - set video mode
        mov     al,3                    ;  80x25  Text
        int     10h                     ;  BIOS video service call
;  Output initial message
        OutMsg  TEXT0                   ;  output initial message
        WaitKey
;  check for mouse driver present
        mov     ax, 03533h              ;  function 35h - get interrupt vector
        int     21h                     ;  DOS service call
        mov     ax,es                   ;  segment address of handler
        or      ax,bx                   ;  AX - segment .OR. offset of int 33
        jz      Nomouse                 ;  if full adders is 0 - no mouse
        mov     bl,es:[bx]              ;  get first instruction of handler
        cmp     bl,0CFh                 ;  is this IRET instruction?
        jne     Begin                   ;  if not - driver installed

Nomouse:
        OutMsg  TEXT1                   ;  output message "driver not found"
        WaitKey                         ;  wait for key pressed
        jmp     Exit                    ;  Exit program

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

Begin:  OutMsg  TEXT2                   ;  output message "driver installed"
        WaitKey                         ;  wait for key pressed

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

;  Initialize mouse and report status (function 0 of INT 33h)
Func0:
        xor     ax,ax                   ;  Initialize mouse
        int     33h                     ;  mouse service call
        cmp     ax,0                    ;  is mouse installed?
        jnz     Clear25                 ;  if so, pass to function 10
        jmp     Exit                    ;  if not, exit program

;  Fill the screen (yellow character on blue background)
Clear25:SetCurs 0,0                     ;  cursor to left upper corner
        mov     ah,9                    ;  function 09h - output char+attr
        xor     bh,bh                   ;  video page  0 is used
        mov     al,20h                  ;  character to be output
        mov     bl,1Eh                  ;  attribute - yellow on blue
        mov     cx,2000                 ;  number of characters to be output
        int     10h                     ;  BIOS video service call

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

;  Output the header and the menu text onto the screen
        PutStr   2,16,TEXT3, Ltxt3, 1Eh
        PutStr   8,20,TEXT8, Ltxt8, 1Eh
        PutStr  10,20,TEXT10,Ltxt10,1Fh
        PutStr  11,20,TEXT11,Ltxt11,1Fh
        PutStr  12,20,TEXT12,Ltxt12,1Fh
        PutStr  13,20,TEXT13,Ltxt13,1Fh
        PutStr  14,20,TEXT14,Ltxt14,1Fh
        PutStr  15,20,TEXT15,Ltxt15,1Fh
        SetCurs 25,80                   ;  move cursor out of screen

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

;  Function 10 - define text cursor
Func10: mov     ax,10                   ;  define text cursor
        xor     bx,bx                   ;  software cursor is used
        mov     cx,0FFFFh               ;  screen Mask
        mov     dx,4700h                ;  cursor Mask
        int     33h                     ;  mouse service call

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

;  Function 1 - show the mouse cursor
Func1:  mov     ax,1                    ;  function 01 - show mouse cursor
        int     33h                     ;  mouse service call

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

;  Determining mouse keys pressed
Func3:  mov     ah,1                    ;  function 01h - check keyboard buffer
        int     16h                     ;  BIOS keyboard service
        jz      ContF3                  ;  if no key pressed, continue
        jmp     Exit                    ;  exit if key pressed
ContF3: mov     ax,3                    ;  func. 03 - button status and location
        int     33h                     ;  mouse service call
        mov     CX0,cx                  ;  save  X coordinate (column)
        mov     DX0,dx                  ;  save  Y coordinate (row)
        test    bx,1                    ;  left button pressed?
        jnz     X_Range                 ;  OK !
        jmp     short Func3             ;  no button pressed - check again
;  Check horizontal cursor location

X_Range:mov     ax,CX0                  ;  X coordinate (Column)
        mov     cl,3                    ;  number bits to shift
        shr     ax,cl                   ;  shift by 3 - divide by 8
        cmp     ax,20                   ;  cursor on the left ?
        jb      Func3                   ;  not - continue check
        cmp     ax,36                   ;  cursor on the right?
        ja      Func3                   ;  not - continue check
;  Check vertical cursor location

Y_Range:mov     ax,DX0                  ;  X coordinate (Column)
        mov     cl,3                    ;  number bits to shift
        shr     ax,cl                   ;  shift by 3 - divide by 8
        cmp     ax,10                   ;  cursor on the top ?
        jb      Func3                   ;  not - continue check
        cmp     ax,15                   ;  cursor on the bottom?
        ja      Func3                   ;  not - continue check

;  report the number of the command selected
        mov     ax,DX0                  ;  Y coordinate (Row)
        mov     cl,3                    ;  number bits to shift
        shr     ax,cl                   ;  shift by 3 - divide by 8
        cmp     ax,15                   ;  line 15 (Exit) ?
        je      Exit                    ;  if so - finish
        sub     ax,9                    ;  number of command selected
        or      al,30h                  ;  convert to ASCII character
        mov     NumSel,al               ;  put number to output message
        SetCurs 17,20                   ;  move cursor
        OutMsg  TXT3L                   ;  output message "command selected"
        jmp     short Func3             ;  check again

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

;  Terminate program and exit to DOS
Exit:   mov     al,VMODE                ;  remember video mode on entry
        mov     ah,0                    ;  function 0 - set video mode
        int     10h                     ;  BIOS video service
        Call    CLRKEY                  ;  clear keyboard buffer
        mov     ax,4C00h                ;  function 4Ch - terminate process
        int     21h                     ;  DOS service call

;-------------------------------------------------------------------
;
;   This procedure clears the keyboard buffer
;
;-------------------------------------------------------------------

CLRKEY  PROC    NEAR uses ax es
        mov     ax,40h                  ;  address of BIOS data segment
        mov     ES,ax                   ;  ES points to BIOS data
        cli                             ;  no interrupts - system data modified
        mov     ax,ES:[1Ah]             ;  buffer head printer
        mov     ES:[1Ch],ax             ;  clear buffer (head ptr = tail ptr)
        sti                             ;  buffer cleared - allow interrupts
        ret
CLRKEY  ENDP
        END
  

The Serial Ports - COM X

Parallel transfers are done with all bits being transmitted at the same time, with each bit being transferred down a separate wire in the cable. Serial transfers are done by sending one bit at a time down the same wire.

Sending or receiving one byte of data through the serial channel actuall involves transferring the following sequence of bits:

  • Header (one start bit)
  • Information bits (8, 7, 6, 5, or 4, depending on the work mode)
  • Parity bit (optional)
  • Stop bits (one or two)
This transfer takes place at a speed (measured in bauds).

A special chip, the Intel UART8250 (Universal Asynchronous Receiver Transmitter) was designed to support serial data transfers. Access to this chip is thorough the I/O ports.

MS-DOS support two basic communications ports - COM1 and COM2. Their base addresses are stored in the BIOS data area at 0040:0000h (COM1) and 0040:0002h (COM2). The ports used by COM1 and COM2 are not fixed, but 3F8h and 2F8h are common, but so is the reverse. Alway get the port numbers from the BIOS data area. Many different devices can be connected via the serial ports.

The 8250 chip is programmed by 10 one-byte registers, available through the corresponding I/O ports. Some registers are write-only, some are read only and the remainder can be both.

The Asynchronous Adapter RegistersPortMode valueDLABMeaning3F8hOUT0Transmitter holding register3F8hIN0Receiver holding register3F8hOUT1Divisor latch (low byte)3F9hOUT1Divisor latch (high byte)3F9hOUT0Interrupt enable register3FAhINInterrupt identification register3FBhOUTLine control register3FChOUTModem control register3FDhINLine status register3FEhINModem status register

This range covers only 7 addresses, you can increase the number of registers actually available to 10 by setting the 7th bit of the line control register (3FBh). This bit is called DLAB - Divisor Latch Access Bit).

Levels of controlling the serial ports

The three ways of controlling ports are:
  • Using the MS-DOS services
  • Using the BIOS service
  • Direct Control
The MS-DOS service provides function 40h (Write File with Handle) of interrupt 21h. This method treats the communications port as a standard file named AUX with a logical number (descriptor) equal to 3. (This is only for COM1.) it is set to 2400 baud with no parity control, one stop bit and 8 bits per symbol.

You can use the BIOS service through interrupt 14h. These functions allow you to initialize the port, set parameters for transferring data such as number of stop bits, the type of parity control and the speed of transfer. however, it will only allow you to set the speed to 9600 baud.

Low-level programming lets you use all the UART 8250 chip facilities, including working with the transfer speed to 115K and over, but requires that the hardware interrupt related to communications ports be processed by your program.

Peripheral Interface - PPI

The PPI was originally based on the 8255A chip, and is used for controlling the keyboard, the internal sound generator, and for getting information about the system configuration.

The 8255A chip is controlled by the ports that are attached to it.

The Programmable Peripheral InterfaceDenotationAddressTypePurposePort A60hR/WKeyboard inputPort B61hR/WConfiguratin info, speaker and keyboard controlPort C62hRGet system information63hRMode control for ports A-Ch4hRKeyboard status (AT or PS/2)Port B of PPI - The Port 61hBitMeaning0Timer 2 gate (speaker)1Timer 2 data2Must be 031 = read high switches; 0 = read low swithces40 = enable RAM parity checking; 1 = disable50 = enable I/O channel check60 = hold keyboard clock low70 = enable keyboard; 1 = disable keyboardContents of PPI Port A (Bit 7 of Port B is set)BitContents00 - no floppy drives1Not used2-3The number of memory banks on the system board4-5Display mode
  11 = monochrome
  10 - color 80x25
  01 - color 40x256-7PC: The number of floppy disk drivesThe Contents of Port CBitMeaning0Values of DIP switches as in Equipment List1"2"3"4Must be 05If set - Time channel 2 out6if set - I/O channel check7if set RAM parity check error occurred

The Interrupt Controller - Intel 8259

The 8259 is also known as the PIC (Programmable Interrupt Controller) and it ensures that hardware interrupts are processed according to their priorities. The interrupt singal is generated by the hardware and sent to the microprocessor to inform it that the hardware state has changed and certain operations need to be performed.

In order to handle multiple interrupts occurring at the same time, there are 8 or 16 interrupt levels (using one or two 8259's). We know them as IRQ0 - IRQ7 and IRQ8 - IRQ15. The smaller the number, the higher the priority is for that interrupt. The highest priority IRQ0 is for the system timer. IRQ1 is for the keyboard. There is an interrupt vector in the BIOS for each IRQ. You can disable some or all of the interrupts. You disable all of them with the CLI (Clear Interrupt) and enable all of them with STI (Set Interrupt). NOTE: IRQ2 (I/O channel) can not can not be disabled and is called a non-maskable interrupt.

There is an Interrupt Mask Register (IMR) that allows you to disable only certain interrupts. The least significant bit is IRQ0 and if it is set to 1, the interrupt is disabled. The first 8 interrupts are controlled through port 21h and the second 8 are controlled through port 0A1h.

The Hardware InterruptsLevelVectorEnable MaskDisable MaskMeaningIRQ008hXXXX XXX0XXXX XXX1TimerIRQ109hXXXX XX0XXXXX XX1XKeyboardIRQ20AhXXXX X0XXXXXX X1XXI/O channelIRQ30BhXXXX 0XXXXXXX 1XXXCOM2 (AT), COM1 (XT)IRQ40ChXXX0 XXXXXXX1 XXXXCOM1 (AT), COM2 (XT)IRQ50DhXX0X XXXXXX1X XXXXHDD (LPT2 for AT)IRQ60EhX0XX XXXXX1XX XXXXFDD controllerIRQ70fh0XXX XXXX1XXX XXXXLPT1IRQ870hXXXX XXX0XXXX XXX1Real-time ClockIRQ971hXXXX XX0XXXXX XX1XTranslated into IRQ2IRQ1072hXXXX X0XXXXXX X1XXReservedIRQ1173hXXXX 0XXXXXXX 1XXXReservedIRQ1274hXXX0 XXXXXXX1 XXXXReservedIRQ1375hXX0X XXXXXX1X XXXXMath co-processorIRQ1476hX0XX XXXXX1XX XXXXHDD controllerIRQ1577h0XXX XXXX1XXX XXXXreserved

The Programmable Timer

The timer has three channels and operate at 1.193Mhz under control of the 8284A generator. The channels are available through ports 40h, 41h, and 42. The command register is available through port 43h.The Programmable Timer Command RegisterBitMeaning00 - binary data, 1 - BCD1-3Number of mode used (000-101)4-5Operation Type
  00 - send the value of counter
  01 - read/write high byte
  10 - read/write low/byte
  11 - read/write both high and low bytes6-7Number of channel to be programmed

Channel 0 is used by teh system clock to calculate the time of day. It is programmed for 18.2 pulses per second (called ticks) and stored in the BIOS data area at 0040h:006Ch. Every pulse initiates a timer interrupt 8h (IRQ0). Don't mess with this one!

Channel 1 is responsible for refreshing RAM and counts the pulses during disk operations, so that it can reset the timer counter upon completion of an operation. This is also not a good one to mess with.

Channel 2 (port 42h) is connected to the computer's speaker and issues square wave pulses used to make sounds. You can change the sound frequency with this channel.The 8255 chip, (PPI) is also involved in generating sound and that bits 0 and 1 of port 61h also control the speaker.

Which computer bus which allows the processor to communicate with the peripheral devices?

The system bus connects the CPU with the other components, like memory storage and I/O devices, to facilitate communications between those components. This is all done through the physical wiring etched on the motherboard. The system bus is also called the front side bus.

Which technique is used to communicate with peripheral devices?

Direct Memory Access (DMA) is a method of transferring data directly between an peripheral and system RAM. The driver can setup a device to do a DMA transfer by giving it the area of RAM to put its data into. It can then start the DMA transfer and allow the CPU to continue with other tasks.