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