problem z branjem z diska

Klemen Pernus klemen.pernus at guest.arnes.si
Tue Oct 2 11:58:48 CEST 2001


Zivijo

Imam funkcijo ki bere podatke iz diska. Branje poteka v PIO nacinu. 
Funkciji podam naslov prvega sektorja in stevilo sektorjev ki naj jih
prebere iz diska.

Sama funkcija deluje nekako takole (upam da boste vedeli kaj hocem
povedat :)


  IDE_SELECT_REG = 0xe0 (s tem omogocim LBA naslove in izberem mastra)

while (stevilo_sektorjev-- > 0) {

  pocakam da se pobrise BSY bit v IDE_STATUS_REG
    ce se po dolocenem casu ne 
      vrnem stevilo_prebranih_sektorjev 

  IDE_NSECTOR_REG = 1 
  IDE_SECTOR_REG = biti 0-7 naslova_prvega_sektorja
  IDE_LCYL_REG = biti 8-15 naslova_prvega_sektorja
  IDE_HCYL_REG = biti 16-23 naslova_prvega_sektorja
  IDE_SELECT_REG = 0xe0 | biti 24-27 naslova_prvega_sektorja

  IDE_STATUS_REG = 0x20 (komada za branje)

  pocakam da se pobrise BSY bit v IDE_STATUS_REG
    ce se po dolocenem casu ne 
      vrnem stevilo_prebranih_sektorjev

  ce je postavljen ERR bit v IDE_STATUS_REG ali ce DRQ bit ni postavljen
    vrnem stevilo_prebranih_sektorjev 

  256x preberem IDE_DATA_REG

  stevilo_prebranih_sektorjev++
}


problem nastane, ker ta funkcija skoraj NIKOLI ne prebere toliko sektorjev
kolikor jih hocem: 

  stevilo_prebranih_sektorjev < stevilo_sektorjev

torej se po nekaj branjih postavi ERR bit ali pa se DRQ ne postavi!

funkcija deluje nekoliko bolje ce namesto 
  IDE_NSECTOR_REG = 1 
uporabim
  IDE_NSECTOR_REG = 0 
in s tem berem po 256 sektorjev naenkrat in temu
primerno povecujem stevilo_prebranih_sektorjev, stevilo branj
IDE_DATA_REG in zmansujem stevilo_sektorjev 
toda funkcija se vedno vsakic ne prebere vseh sektorjev!

A mogoce kdo ve, zakaj ta funkcija ne dela oz. cesa ne delam pravilno? 


LP
	Klemen




More information about the lugos-prog mailing list