;09TypPrc.asm ; Program zjistuje typ a verzi procesoru podle DX po RESETu. ; Program lze spustit pouze v realnem rezimu pod operacnim systemem MS-DOS. .286p ; Program bude pouzivat instrukcni repertoar procesoru 80286. Skupina GROUP DATA,STKSEG,CODE DATA SEGMENT PUBLIC USE16 'DATA' ; Segment podle 16bitovych pravidel. ZasobnikSS dw 0 ; Obsah registru SS pred RESETem. ZasobnikSP dw 0 ; Obsah registru SP pred RESETem. ZpravaTyp db 'Typ procesoru = $' ZpravaVerze db 'h Verze procesoru = $' Zprava db 'h',10,13,'$' DATA ENDS ; Konec datoveho segmentu. ; STKSEG SEGMENT para STACK USE16 'STACK' ; Segment se zasobnikem DB 2000h DUP(?) ; hloubky 2 KB. STKSEG ENDS ; Zde je dno zasobniku. ; CODE SEGMENT PUBLIC USE16 'CODE' ; Vlastni program v segmentu opet ASSUME CS:CODE,SS:STKSEG,DS:DATA ; podle 16bitovych pravidel. tAL PROC ; Podprogram pro vypis obsahu AL na obrazovku ve forme push AX ; dvou setstnactkovych (hex) cislic. shr AL,4 ; Nejprve 1 cislice vyssiho radu. call hex ; Vypis 1 cislici. pop AX ; Potom 1 cislice nizsiho radu. and AL,0fh call hex ; Vypis 1 cislici. ret ; Navrat z podprogramu. tAL ENDP ; hex PROC ; Preved hex cislici v AL na ASCII a vypis na obrazovku. or AL,30h ; Uprav cislici podle pravidel ASCII kodu. cmp AL,3Ah ; Je to jeste cislice? jl Cislce ; Ano. add AL,7 ; Neni, proved korekci na pismeno. Cislce: mov AH,14 ; Vypis ASCII znak z AL na obrazovku pomoci int 16 ; sluzby ROM-BIOSu (viz Vypis). ret ; Navrat z podprogramu. hex ENDP Zacatek PROC ; Vstupni bod programu v realnem rezimu. mov AX,DATA ; Segmentovou cast adresy datoveho mov DS,AX ; segmentu DATA ulozime do DS. cli ; Preruseni bude po celou dobu behu programu zakazano. ; Na adresy 0:467h a 0:469h nastavime offset a segment mista, ; kam ma ROM-BIOS po RESETu procesoru predat rizeni. ; ----------------------------------------------------------- xor AX,AX mov ES,AX ; ES := 0 mov WORD PTR ES:0467h,OFFSET PoRESETu ; Offset mov AX,CS mov WORD PTR ES:0469h,AX ; Segment ; Resetem se ztrati obsahu registru, dulezite si poznacime do pameti. mov ZasobnikSP,SP mov AX,SS mov ZasobnikSS,AX ; ; RESET procesoru ; --------------- ; Do pameti CMOS zaznamename informaci, ze po RESETu procesoru se ; ma provest vzdaleny skok podle obsahu adresy 0:467h. Do slabiky ; oznacene "Shutdown Status Byte" zapiseme kod 0Ah. ; mov AL,0Fh ; Adresa Shutdown Status Byte v CMOS. out 070h,AL ; Tuto adresu zapiseme na V/B branu 70h. jmp Zpozdeni ; Malicke zpozdeni. Zpozdeni: mov AL,0Ah ; Nyni naplnime Shutdown Status Byte out 071h,AL ; kodem 0Ah - po RESET udelej FAR JMP. mov AL,0FEh ; Zapisem 0FEh na V/V branu 64h out 064h,AL ; vyvolame RESET procesoru. Halt: ; Na RESET musime pockat ve stavu Halt. hlt ; Zastaveni procesoru jmp Halt ; Pri pripadnem NMI opet navrat PoRESETu: ; ; Nyni jsme v realnem rezimu po RESETu ; ------------------------------------ cli ; Zakazeme preruseni. mov AX,DATA ; Obsahy registru se ztratily, musime mov DS,AX ; dulezite obnovit. mov AX,ZasobnikSS ; Naplnime SS:SP. mov SS,AX mov SP,ZasobnikSP push DX ; Uloz DX s informaci o procesoru do zasob. mov AH,9 ; Vypis zpravu "Typ procesoru = " mov DX,OFFSET ZpravaTyp int 21h pop DX push DX mov AL,DH call tAL ; Vytiskni obsah originalniho DH mov AH,9 ; Vypis zpravu "Verze procesoru = " mov DX,OFFSET ZpravaVerze int 21h pop DX mov AL,DL call tAL ; Vytiskni obsah originalniho DL mov AH,9 ; Vypis zpravu: novy radek. mov DX,OFFSET Zprava int 21h mov AH,4Ch ; Konec programu sluzbou MS-DOSu cislo 4Ch int 21h ; a navrat do MS-DOSu. Zacatek ENDP ; Konec instalacni casti programu. CODE ENDS ; Konec instrukcniho segmentu. END Zacatek ; Startovaci bod je Zacatek.