News:

Build a stunning handcrafted website with IT Acumens

Main Menu

C Program to write data in DMA Mode

Started by Kalyan, Mar 23, 2008, 03:52 PM

Previous topic - Next topic

Kalyan

Program to write data in DMA Mode


# include<iostream.h>
# include<stdio.h>
# include<conio.h>
# include<stdlib.h>
# include<dos.h>

void main()
{
    clrscr();
    union REGS regs;
    int ans;
    char arr[1000];

    outp(0x3f2,0x1c);  //Motor On
    delay(200);
    outp(0x3f5,0x0f);  //Command Code
    delay(200);
    outp(0x3f5,0x00);  //Command Code
    delay(200);
    outp(0x3f5,0);     //Cylinder no.
    delay(200);
    outp(0x3f5,0x08);  //Sense Interrupt Command
    delay(200);

    ans=inp(0x3f5);    //Reading ST0 in data register
    delay(100);
    ans=inp(0x3f5);    //pcn

    cout<<endl<<hex<<ans;
    delay(200);
    outportb(0x12,0);           /*initialization of DMA Mode*/
    delay(200);
    outportb(0x11,10);          /*supplying Mode Byte*/

    int ar=FP_OFF(arr);
    int ar1=FP_SEG(arr);
    outportb(0x10,2);          /*supplying channel no. on port 10*/

       regs.h.ch = (ar1)&(0x0f00);
       regs.x.ax = regs.h.ah+ar;
       (regs.h.ch)++;

       outportb(0x04,regs.h.al);
       delay(200);

       outportb(0x04,regs.h.ah);
       delay(200);
       outportb(0x81,regs.h.ch);
       delay(200);
       outportb(0x05,1);
       // DMA End

       //READ command
       delay(200);
       outportb(0x3f5,46); //Command Code
       delay(200);
       outportb(0x3f5,0); //Command Code
       delay(200);

       outportb(0x3f5,0); //Cylinder no.
       delay(200);

       outportb(0x3f5,0); //Head Addr
       delay(200);
       outportb(0x3f5,3); //Record
       delay(200);
       outportb(0x3f5,2); //Sector size
       delay(200);
       outportb(0x3f5,5); //EOT
       delay(200);
       outportb(0x3f5,21); //GPL
       delay(200);
       outportb(0x3f5,10); //DTL

       //result
       delay(200);


     //  st0

      int st0 = inportb(0x3f5);
      printf("
st0 = %x",st0);
      if(inportb(0x3f5) & (192)!=0)
       {
             printf("
st0= %d",st0);
             cout<<"
Abnormal termination  st0";
             delay(200);
             outp(0x3f2,0x0c);   //Motor off
             exit(0);
       }

       delay(200);

       int st1 = inportb(0x3f5);
       printf("
st1 = %x",st1);
       if((st1=inportb(0x3f5)) !=0)
       {
             printf("
st1=%d ",st1);
             cout<<"
Abnormal termination  st1";
             delay(200);
             outp(0x3f2,0x0c);   //Motor off
             exit(0);
       }

       delay(200);

       int st2 = inportb(0x3f5);
       printf("
st2 = %x",st2);
       if((st2=inportb(0x3f5)) != 0)
       {
             cout<<"st2= "<<st2;
             cout<<"
Abnormal termination st2";
             delay(200);
             outp(0x3f2,0x0c);   //Motor off
             exit(0);
       }

       cout<<"
Successful Termination";
       delay(200);

       cout<<"
c= "<<inportb(0x3f5);
       delay(200);

       cout<<"
h= "<<inportb(0x3f5);
       delay(200);

       cout<<"
r= "<<inportb(0x3f5);
       delay(200);

       cout<<"
n= "<<inportb(0x3f5);
       delay(200);

       outp(0x3f2,0x0c);   //Motor off

getch();

}