Kurs programowania w asemblerze
Pamięć CMOS
W komputerach klasy AT są zainstalowane baterie, które zasilają zegar czasu rzeczywistego oraz 64 bajty pamięci CMOS. W pamięci tej zapisana jest konfiguracja komputera, ustawienia BIOS'u, hasło, itp. Dzięki zasilaniu z baterii pamięć ta po odłączeniu zasilania nie zostaje skasowana. Kiedy natomiast do naszego komputera zostaje podłączone zasilanie, bateria automatycznie się ładuje. Programista do tej pamięci ma dostęp dzięki dwóm portom: 70H i 71H. Do portu 70H zapisujemy adres komórki pamięci, która nas interesuje, następnie możemy odczytać lub wpisać do tej komórki wartość przy pomocy portu 71H. Szczegółowe informacje na temat obsługi portów znajdziesz w rozdziale Porty.
W pamięci CMOS istnieją tzw. adresy chronione tzn., że w innych komórkach zapisana jest suma kontrolna wszystkich tych adresów. Zmiana komórki chronionej spowoduje niezgodność sumy kontrolnej z rzeczywistą sytuacją podczas startu systemu, co w rezultacie spowoduje reset BIOS'u. Kiedy chcemy więc zmienić wartość takiej komórki musimy policzyć na nowo sumę kontrolną i ją również zapisać.
RESET BIOSU jest czasem pożyteczny. W nowszych BIOS'ach, gdzie istnieje opcja auto konfiguracji, zostaną ustawione domyślne wartości wszystkich komórek. Jeśli więc mamy założone hasło na BIOS (NIE NA SYSTEM) i je zapomnimy, a nie znamy hasła serwisowego możemy po prostu zresetować BIOS, a przy okazji zdjąć z niego hasło.
Struktura pamięci CMOS
| Adres | Opis |
|---|---|
| 0 | aktualna sekunda zegara czasu rzeczywistego w kodzie BCD |
| 1 | sekunda ustawienia budzika w kodzie BCD |
| 2 | aktualna minuta w kodzie BCD |
| 3 | minuta ustawienia budzika w kodzie BCD |
| 4 | aktualna godzina w kodzie BCD |
| 5 | godzina ustawienia budzika w kodzie BCD |
| 6 | dzień tygodnia (1-niedziela, 2-poniedzialek itd.) |
| 7 | dzień miesiąca w kodzie BCD |
| 8 | miesiąc w kodzie BCD |
| 9 | rok w kodzie BCD (dwie ostatnie cyfry) |
| AH | RTC rejestr stanu A Bity 0,1,2,3 - wybór tępa (ustawione na 0110) Bity 4,5,6 - 22 stanowy dzielnik częstotliwości (ustawiony na 010) Bit 7 - trwa aktualizacja (UIP), 0 oznacza, że można czytać |
| BH | RTC rejestr B Bity 0 - 1=czas letni; 0-standardowy (ustawione na 0) Bit 1 - 0=tryb 12 godzinny; 1-tryb 24-godzinny (ustawione na 1) Bit 2 - 1=dane zapisywane dwójkowo, 0=BCD (ustawione na 0) Bit 3 - 1=włącza fale proste (ustawione na 0) Bit 4 - 1=umożliwia przerwanie po aktualizacji (ustawione na 0) Bit 5 - 1=umożliwia przerwanie budzika (ustawione na 0) Bit 6 - 1=umożliwia przerwanie co stały okres (ustawione na 0) Bit 7 - 1=trwa aktualizacja (UIP),0=można czytać CMOS |
| CH | RTC rejestr stanu C. Tylko do odczytu-bity stanu przerwań |
| DH | RTC rejestr stanu D. Bit 7 - 1=CMOS ma zasilanie,0=baterie są wyczerpane |
| EH | Bajt stanu ustawiony przez POST Bity 0,1 - 0 Bit 2 - poprawność czasu (1=nie jest dzisiaj 30 lutego) Bit 3 - 1=zły dysk twardy, nie można z niego wystartować systemu Bit 4 - niewłaściwy rozmiar RAM. 1=POST znalazł inny rozmiar Bit 5 - 1=nie zgadza się konfiguracja Bit 6 - 1=nie zgadza się suma kontrolna CMOS'u Bit 7 - 1=wysiadły baterie zegara |
| FH | Powód wyłączenia Bajt ten jest sprawdzany przed POST, aby określić sposób jak komputer był resetowany, i jak ma się odpalić 0 = Gorący restart (Alt+Ctrl+Del) 1 = Wyłączenie po określeniu wielkości pamięci 2 = Wyłączenie po wykonaniu testu pamięci 3 = Wyłączenie po błędzie parzystości pamięci 4 = Restart na żądanie BOOTtrap loadera 5 = Zimny restart programowy (wyzerowanie kontrolera przerwań i FAR JMP 0:[467H] 6,7,8 = Restart po teście pracy wirtualnej 9 = Restart po wykonaniu przesyłania w bloku wirtualnym AH = Zimny restart programowy (FAR JMP 0:[467H] |
| 10H | Typ stacji dysków w systemie Bity 0,1,2,3 - pierwszy napęd Bity 4,5,6,7 - drugi napęd 0000 - nie zainstalowana, 0001 - 360KB, 0010 - 1.2M, 0011 - 1.44M |
| 11H | Zarezerwowane |
| 12H | Typ dysku twardego (dla C: i D: jeśli ich typ mieści się w przedziale między 1 i 14, w przeciwnym wypadku patrz komórki 19H i 1AH Bity 0,1,2,3 - Pierwszy dysk twardy C: Bity 4,5,6,7 - Drugi dysk twardy D: 0000-brak, 1111-typ znajduje się w 19H/1AH, pozostałe=typ dysku |
| 13H | Zarezerwowane |
| 14H | Bajt wyposażenia komputera Bit 0 - 1= Napęd(y) dyskietek zainstalowany Bit 1 - 1=Koprocesor matematyczny 80287 zainstalowany Bity 2,3 - 0 Bity 4,5 - pierwotny typ obrazu; 00 - żaden lub EGA,01-40 kolumnowy CGA, 10-80kolumnowy CGA,11-monochromatyczny Bity 6,7 - Liczba stacji dysków w systemie (00-1, 01-2, 10-3, 11-4) |
| 15H | Pamięć podstawowa RAM (dolny bajt) 0100H=256KB; 0200H=512KB |
| 16H | Pamięć podstawowa RAM (górny bajt) 0280H=640KB |
| 17H | Pamięć rozszerzona ponad 1MB (dolny bajt) (KB) |
| 18H | Pamięć rozszerzona ponad 1MB (górny bajt) |
| 19H | Typ dysku twardego 0 (napęd C:) |
| 1AH | Typ dysku twardego 1 (napęd D:) |
| 1BH-2DH | Zarezerwowane |
| 2EH | Suma kontrolna komórek 10H do 20H CMOS (górny bajt) |
| 2FH | Suma kontrolna komórek 10H do 20H CMOS (dolny bajt) |
| 30H | Pamięć rozszerzona ponad 1MB (dolny bajt) (KB) |
| 31H | Pamięć rozszerzona ponad 1MB (górny bajt) (KB) |
| 32H | liczba 19 w kodzie BCD |
| 33H | Różne informacje Bit 7-IBM 128KB Bit 6-używany przez SETUP |
| 34H-37H | |
| 38H-3FH | Hasło (na układach MC 146818) |
