Page 1 of 1

What is wrong with this floppy read function

Posted: Thu Mar 16, 2006 1:19 pm
by earlz
I am having some problems with this floppy disk read function
can anyon see something wrong with it

it ends at wait_for_fdd
wait_for_fdd waits for the floppy irq

Code: Select all

unsigned int fdd_read(drive_geometry g,unsigned char drive){
   fdd_wr_status rety;DMA_block info;unsigned char tmp;unsigned char secnum;
   info.page=0xB;
   info.offset=800;
   info.length=512;
   if (drive>1){rety.worked=0;return 0;}
   fdd_motor_timer=0;
   outportb(CcrReg,0);
   rety.status=0x80;
   if(fdd_seek(g.track,drive)==0){rety.worked=0;return 0;}
   tmp=inportb(MsReg);
   //test tmp
     fdd_motor_on();
   StartDMA(2,info,0x44);
   //read sector command
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,0xE6);
   //drive
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,drive);
   //track
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,g.track);
   //head
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,g.head);
   //sector
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,g.sector);
   //sector size
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,0x02);
   //sectors to a track
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,0x12);
   //gap length
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,0x1B);
   //data length
   if(fdc_send_byte_ready()==0){return 0;}
   outportb(DtReg,0xFF);
   //wait for floppy irq
   fdd_done=0;
     printf("8");
   if(wait_for_fdd()==0){return 0;}
   printf("9");
   if(fdc_get_byte_ready()==0){return 0;}
   tmp=inportb(DtReg);
   if(fdc_get_byte_ready()==0){return 0;}
   inportb(DtReg);
   if(fdc_get_byte_ready()==0){return 0;}
   inportb(DtReg);
   if(fdc_get_byte_ready()==0){return 0;}
   inportb(DtReg);
     if(fdc_get_byte_ready()==0){return 0;}
   inportb(DtReg);
   if(fdc_get_byte_ready()==0){return 0;}
   secnum=inportb(DtReg);
   if(fdc_get_byte_ready()==0){return 0;}
   inportb(DtReg);
   fdd_motor_off();
     return secnum;
}

Re:What is wrong with this floppy read function

Posted: Fri Mar 17, 2006 2:51 am
by bubach
could you try to make it more readable, and maybe post the rest of the code aswell?

Re:What is wrong with this floppy read function

Posted: Fri Mar 17, 2006 6:42 am
by Pype.Clicker
[me=Pype.Clicker]suggests[/me]

Code: Select all

#define inb_or_die(REG) ({if(!fdc_get_byte_ready())return 0; inportb(REG);})
#define outb_or_die(REG,v) ...
that would then mean

Code: Select all

   outb_or_die(DtReg,0xe6); //read sector command
   outb_or_die(DtReg,drive); //drive
// ...
  secnum=inb_or_die(DtReg);
  inb_or_die(DtReg);
  fdd_motor_off();

Re:What is wrong with this floppy read function

Posted: Fri Mar 17, 2006 9:42 am
by earlz
thats a good idea
except for the inb part because sometimes i need the value

Re:What is wrong with this floppy read function

Posted: Fri Mar 17, 2006 9:48 am
by paulbarker
In gcc, code between ({ and }) evaluates to the final statement. So

Code: Select all

secnum=inb_or_die(DtReg);
Would work like:

Code: Select all

if(!fdc_get_byte_ready())
     return 0;
secnum=inportb(DtReg);