Jak MS-DOS přebírá čas z RTC?

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Zpráva
Autor
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

Jak MS-DOS přebírá čas z RTC?

#1 Příspěvek od Andrea »

Zdravím všechny DOSovské programátory (i v důchodu).
Neví prosím někdo jakým způsobem MS-DOS přebírá při svém spuštění aktuální čas z hodin reálného času? BIOS poskytuje služby hodin na přerušení int 1Ah. DOS při startu zavolá funkce Čti čas z RTC a Čti datum z RTC, datum převezme, ale na čas se mi vykašle a nastaví ho na 12:00. Přitom BIOS ten časový údaj vrací ve správném formátu, je to porovnáno se standardním PC, ale DOS ten údaj ignoruje. Dalo by se to vyřešit krátkou utilitkou, která by přečetla čas z RTC a zavolala službu DOSu nastav čas a spouštět ji z autoexecu, ale mě by zajímalo jak to udělat bez ní. Nějak to musí jít, když na standardním PC to jde. Předem díky za přínosné rady a nápady. :)
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#2 Příspěvek od piitr »

S RTC jsem si teda nikdy nehrál, ale vůbec by mě nepřekvapilo, kdyby to četl přímo z té CMOSky. Čte se to:

Kód: Vybrat vše

mov al, adresa
out 70h, al
jmp $+2 ;prostě nějaké zpoždění
in al, 71h
Rozložení paměti:
0 - current second for real-time clock
1 - alarm second
2 - current minute
3 - alarm minute
4 - current hour
5 - alarm hour
6 - current day of week (1=Sunday)
7 - current date of month
8 - current month
9 - current year (final two digits, e.g. 87)
10 - 13 - nějaké další registry hodin, status, atd.
Mám tu nějaký popis (thelp), kdybys to chtěla.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#3 Příspěvek od piitr »

Tohle se mi nechce opisovat.
Přílohy
rtc2.png
(23.34 KiB) Staženo 112 x
rtc1.png
(21.8 KiB) Staženo 127 x
Uživatelský avatar
rnbw
Příspěvky: 37418
Registrován: 21 bře 2006, 00:00
Bydliště: Bratislava

#4 Příspěvek od rnbw »

Predpokladam, ze to vsetko Andera a vie. A vyzera to tak, ze ma naprogramovany nejaky BIOS, ale DOS si z neho nevie nastavit cas.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#5 Příspěvek od Andrea »

Díky, tohle všechno vím, já mám ale v systému jiné RTC na jiné adrese. Ale jak píšu, DOS volá ohledně RTC službu BIOSu, ale vrácený výsledek v případě časového údaje ignoruje, datum vrácený službou BIOSu normálně vezme a datum podle něj nastaví.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#6 Příspěvek od piitr »

Chápu. Právě mám obavu, že by to klidně mohl číst natvrdo přes ty porty 70h. Co mám zkušenost, tak pro čtení sektorů taky asi nepoužíval int 13h, ale dělal si to po svým. Respektive mám dojem, že přímo nahradil vektor int 13h. Zkrátka, vůbec by mě nepřekvapilo, kdyby si to dělal sám přes ty porty. Proč teda ten datum bere přes službu, nevím, ale i to je možné, tenkrát se s tím nikdo moc nepáral.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#7 Příspěvek od Andrea »

piitr píše:Chápu. Právě mám obavu, že by to klidně mohl číst natvrdo přes ty porty 70h. Co mám zkušenost, tak pro čtení sektorů taky asi nepoužíval int 13h, ale dělal si to po svým. Respektive mám dojem, že přímo nahradil vektor int 13h. Zkrátka, vůbec by mě nepřekvapilo, kdyby si to dělal sám přes ty porty. Proč teda ten datum bere přes službu, nevím, ale i to je možné, tenkrát se s tím nikdo moc nepáral.

Nene, to se pleteš, kdyby DOS na něco šahal přímo, tak mi tu nepoběží, mám počítač hardwarově nekompatibilní s PC, ale BIOS jsem napsala tak, aby se na venek co se týče služeb tvářil jako v PC a DOS na tom normálně běží. Jako disky mám DataFlash a SD kartu a DOSu je to fuk, leze na to přes int 13h a nepozná, že to nejsou HDD. Jen s tím časem mi to hapruje, ale já na to přijdu a pak uvidí :twisted:
Přílohy
rachotina188.jpg
(113.8 KiB) Staženo 206 x
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#8 Příspěvek od piitr »

Já se do toho nikdy takhle moc nešťoural, tak nevím, ale stalo se mi tohle: Měl jsem v DOSu napsaný program, který volal int 13h. Četl jsem si s ním sektory. Při čtení hodně sektorů najednou byl v pohodě. Pak jsem dělal to samé bez DOSu, v master bootu, a chovalo se to jinak. Šlo číst vždycky jen několik sektorů najednou. Těžko říct, co ten DOS udělal, ale něco tam předělal. Je teda možné, že ten DOS nakonec i tak volal tu původní rutinu, to jsem nezkoumal, ale něco tam dělal. Každopádně, pokud máš kompatibilitu jen na úrovni služeb, budeš mít problémy. Třeba klávesnici a časovač si obcházel snad každý program.
Uživatelský avatar
piitr
Příspěvky: 1003
Registrován: 19 říj 2007, 00:00
Kontaktovat uživatele:

#9 Příspěvek od piitr »

Taky je teda něco jinýho ms-dos, dr-dos, free-dos atd.
Uživatelský avatar
Maskot
Příspěvky: 1772
Registrován: 19 lis 2004, 00:00
Bydliště: Wien

#10 Příspěvek od Maskot »

Prikaz Time vrati spravnou hodnotu,neo take tech 12:00?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#11 Příspěvek od Andrea »

piitr píše:Každopádně, pokud máš kompatibilitu jen na úrovni služeb, budeš mít problémy. Třeba klávesnici a časovač si obcházel snad každý program.

Každý ne, co je horší, že většina programů zapisuje přímo do videopaměti, takové mi tu samozřejmě nefungujou. Ale co, já si jen tak hraju, hlavně že na tom běží Turbo Assembler a už mám napsaný textový editor, co víc si přát :)

Maskot: Jestli myslíš command line příkaz time, tak právě ten vrací těch 12:00, ale vrací to i volání služby DOSu přes int 21h, je to stejná funkce.
Uživatelský avatar
Maskot
Příspěvky: 1772
Registrován: 19 lis 2004, 00:00
Bydliště: Wien

#12 Příspěvek od Maskot »

Pak asi neni Bios v pameti tam,kde ho Dos ceka,asi by to chtelo to zrcadleni ci jak se tomu rikalo udelat trochu jinak.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#13 Příspěvek od Andrea »

Maskot píše:Pak asi neni Bios v pameti tam,kde ho Dos ceka,asi by to chtelo to zrcadleni ci jak se tomu rikalo udelat trochu jinak.

BIOS je tam kde v PC a poskytuje služby jako v PC. Proč teda funguje datum a nefunguje čas, jsou to dvě služby na jednom přerušení BIOSu.
A navíc, když čas pomocí příkazu time nastavím, tak se správně nastaví i v RTC, DOS normálně zavolá Int 1Ah, Fn 3 "Nastav RTC čas".
Uživatelský avatar
Maskot
Příspěvky: 1772
Registrován: 19 lis 2004, 00:00
Bydliště: Wien

#14 Příspěvek od Maskot »

:) Tak to vzdavam,tak hluboko do systemu nevidim,mozna,teda jiste jen blby napad,zda neco pri startu nekoliduje a neprepise tu adresu nesmyslem,ale to asi je fakt blbost.(V Biosu snad hodiny drzi spravne predpokladam)
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#15 Příspěvek od Andrea »

Už jsem to asi našla :) Zase chyba v Sysmanu. BIOS má na adrese 0000:046Ch čítač tiků časovače. V Sysmanu píšou, že je to čítač tiků od resetu, ale to byla pravda nejspíš jen u PC/XT, které nemělo RTC. V Interrupt Helperu píšou, že je to čítač tiků od půlnoci. A z něj bere DOS ten čas. Volá periodicky službu int 1Ah, Fn 0, "Čti počet tiků od půlnoci" a z toho asi počítá čas. Já ho samozřejmě v domění, že to je čítač tiků od resetu, nastavuju při resetu na hodnotu 0 a to je právě těch 12:00. Zkusila jsem ho nastavit na jinou hodnotu a skutečně se změnil čas v DOSu. Pak ale nechápu, proč DOS při startu čte ten čas z RTC, když se pak na něj vykašle :? A taky už mě štve sysman, to už je několikátá věc, která mě stála x hodin bádání, než jsem přišla na to, že to tam mají blbě popsané :?
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“