BIOS i zlportio

0

Chciałbym się pobawić biosem z poziomu mojego programu. Np. ustawić, żeby się komp włączył, odczytać temperaturę, itd. itd. Wiem, że muszę użyć komponentu ZlPortio (no, może nie muszę, ale będzie najlepiej, jak właśnie tak zrobię :P). Tylko jak ja mam te porty odzczytywać? znaczy się: skąd mam wiedzieć, które porty? szukałem jakichś map cmosu, biosu, ... już się w tym gubię szczerze powiedziawszy. A wszystkie próby moje polegające na próbie odczytywania czasu, kończyły się niepowodzeniem. To chyba zbyt wiele jak na moją małą główkę...

0

To pewnie dlatego, że odczytywałeś porty, podczas gdy BIOS widziany jest jako pamięć tzn. odczytuje sie odpowiednie ardesy pomięci (będziesz musiał poszukac mapy).
Nie bardzo już pamiętam jak napisany jest zlportio, ale chyba nie przyda Ci się. Nie czyta pamięci, a pod windami 9x/ME w ogóle nie używa sterowników, więc jakby co to winda i tak nie pozwoli na odczyt niektórych adresów.
Ja sprawdziłem WinIO - poradził sobie z odczytem pamięci przechowującej adresy portów (przy pomocy vxd, bo winda nie pozwala programom exe/dll), zwrócił prawidłowe wartości, ale mimo wszystko windoza dostała głupawki.

0

ZLPortIO się przyda, a wszystko co potrzebujesz jest opisane w CHIP 10/2001

0

ZLPortIO się przyda...

A niby do czego?
Pytam z ciekawości, bo bawiłem nim się dość dawno temu i nie przypominam sobie by pozwalał czytać pamięć (z resztą z jakiegoś powodu uznałem go za nie przydatny, ale już nie pamiętam dlaczego, chyba poszło o bezpośredni dostęp do portów).

0

To pewnie dlatego, że odczytywałeś porty, podczas gdy BIOS widziany jest jako pamięć tzn. odczytuje sie odpowiednie ardesy pomięci (będziesz musiał poszukac mapy).

Obsługa BIOSu następuje przez porty, więc zanim coś napiszesz sprawdź swoje informacje.

0

Oto co robię:
w uses mam ZLPortio, w folderze z moim programem wszystkie potrzebne pliki (ZlPortio.pas, ddkint.pas, zlportio.sys). W onCreate dla sprawdzenia, czy wszystko ok mam:

if not ZlIOStarted then
  ShowMessage('Błąd!');

I rzeczywiście, jak wywale plik zlportio.sys, to jest błąd, jak wszystko ok, to błędu nie ma.
Dalej mam Edita (Edit1) i przycisk. Procedurka ButtonClick wygląda tak:

portwriteb($70,$00);
sleep(50);
Edit1.Text:=IntToStr(portreadb($71));

Teoretycznie powinienem odczytać sekundy. Próbowałem z innymi portami - zawsze otrzymuję "0". Próbowałem też zamiast $70 dać 112 i zamiast $71 113 - też nic. Czy to ma może znaczenie, że mój system to Windows 2000 ? A może gdzie indziej popełniam błąd?

//Jeszcze jedno pytanie, tym razem dotyczące exampla dołączonego do modułu zlportio. Otóż projekt ten używa "rdtsc" - co to jest?! jak to wykasowałem, to też działało ;] (w właściwie jak nie wykasowałem, to nie działało :P)
//Już wiem, co to ;]

0

rzeczywiscie odczytujesz sekundy, tylko ze one sa zapisane w kodzie BCD, tzn. kazde 4 bity koduja jedna cyfre dziesietna.

nie znam komponentu zlportio, ale jesli chodzi o mapy pamieci cmos, to mialem podobny problem. znalazlem kilka, ale starych. w nowych biosach wiekszosc starych obszarow nie jest juz uzywana. zeby bylo smieszniej poszczegolne obszary pamieci sa przez poszczegolnych producentow biosow uzywane do czego innego

troche inforamacji znajdziesz w ksiazce 'bios dla programistow c/c++' billy'ego taylora, troche jest w 'anatomii pc' i podobno w 'w sercu biosa', ale do tej ostatniej nie udalo mi sie dotrzec.

chyba najlepsza strona, do jakiej udalo mi sie dotrzec jest pod tym adaresem:
http://irb.cs.uni-magdeburg.de/~zbrog/asm/cmos.html
moze znajdziesz cos na stronie phoenixa.
mozesz tez sprobowac cos poszukac w googlach (cmos+memory), ale raczej beda to gorsze (czytaj starsze) materialy od tego powyzej.

pamietaj, ze jesli pozmieniasz cos w biosie, to musisz zmienic tez sume kontrolna.

pozdrawiam
uranos

ps. jesli znajdziesz jakas aktualna mape pamieci, to podaj adres

0

No dobrze, ale wydawało mi się, że te początkowe bajty pamięci CMOS mają zawsze takie same zastosowanie...
Swoją drogą zastanawia mnie jeszcze jedna sprawa - zrobiłem wszystko jak w CHIPie 10/2001 (thx to Johnny_Bit!) i... ZONK! wynik to "2000" "0" "0" (to 2000 bo tam jest '200'+inttostr(...) :P).
Jak na razie - dzięki za wskazówki! Pokombinuję z tym BCD i może coś się uda... ;]

//Yyy... jeszcze coś. Skoro wszystko robię dobrze, a liczba w bcd pozostaje nadal po prostu bajtem (czy tam ciągiem 0 i 1) to czy nie powinienem mieć czegoś innego niż "0" ?!

0

faktycznie, nie powinno byc samych zer. nie wiem dlaczego tak sie dzieje. nie mam pojecia, jak to jest w delphi. ja pisalem pod borlandem c++ 3.11 i pod win xp chodzilo bez problemu. kod mozesz zobaczyc tutaj:
http://willow.iie.uz.zgora.pl/~adabrows/cmos.cpp
jesli chodzi o poczatkowe bajty to rzeczywiscie maja takie same zastosowania, ale czesc z nich nie jest juz uzywana.

pozdrawiam
uranos

0

Hehe - nie idzie w delphi - zrobim w starym, poczciwym basic-u!! Ja się będę delphim przejmował :P Pierwsze podejście do tego - i od razu sukces ;] BASIC return!
Btw. Dzięki za zainteresowanie - temat znalazł się u mnie na 3 stronie i już byłem pewien, że nikt tu nie zajrzy ;]

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0