;08PrepZp.asm ; Program prepne do chraneneho rezimu a zpet v IBM PC/AT. ; 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. desc STRUC ; Definice polozky tabulky popisovacu segmentu Limit dw 0 ; GDT,LDT: limit segmentu (15-0) Base_l dw 0 ; baze segmentu (15-0) Base_m db 0 ; baze segmentu (23-16) Access db 0 ; pristupova prava Gran db 0 ; PRO 386! G, s, 0, AVL, limit (19-16) PRO 386 ! Base_h db 0 ; PRO 386! baze segmentu (31-24) PRO 386 ! desc ENDS ; Kazda polozka tabulky popisovacu ma velikost 8 slabik. ; Definice GDT: DefGDT desc <> ; Prvni polozka GDT je "neplatny selektor" (nepouziva se) ; Limit DPL Typ DefSupC desc <0FFFFh,0,0,10011010b,0,0> ; 0FFFFh 0 instrukcni,C=0,R=1 DefSupD desc <0FFFFh,0,0,10010010b,0,0> ; 0FFFFh 0 datovy, ED=0, W=1 DefSupE desc <0FFFFh,8000h,0Bh,10010010b,0,0> ; 0FFFFh 0 datovy, ED=0, W=1 DefSupS desc < 0,0,0,10010110b,0,0> ; 0 0 zasobnik, ED=1,W=1 SzGDT equ $-DefGDT ; Konec GDT. SzGDT je velikost GDT ve slabikach. ; Segment DefSupC je segment s vlastnim programem v chranenem rezimu. ; DefSupD je datovy segment, ktery ukazuje na popisovace. ; DefSupE je datovy segment, ktery ukazuje do oblasti ; Video-RAM (od adresy 0B8000h), kam se provede ; testovaci zapis. ; DefSupS je segment pro zasobnik. ; Hodnoty selektoru segmentu: SelSupC equ DefSupC-DefGDT ; Instrukcni segment ridiciho procesu. SelSupD equ DefSupD-DefGDT ; Datovy segment ukazujici na popisovace. SelSupE equ DefSupE-DefGDT ; Datovy segment ukazujici na Video-RAM. SelSupS equ DefSupS-DefGDT ; Zasobnikovy segment ridiciho procesu. ; ; ; Promenne a konstanty dLimit dw 0 ; Pomocna prom. pro instrukce LGDT a LIDT. dBase_l dw 0 ; dBase_h dw 0 ; Tyto tri prom. musi byt (!!) vedle sebe! Zprava db 'P r o c e s o r b y l p r e p n u t d o ' db 'c h r a n e n e h o r e z i m u . ' ; Retezec se zpravou, mezery mezi znaky jsou ; atributy, protoze zpravu budeme kopirovat ; primo do Video-RAM. Delka dw $-Zprava ; Delka retezce Zprava ve slabikach. ZpravaReal DB 'Nyni jsme opet v realnem rezimu.',10,13,10,10,'$' 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. 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. ; V realnem rezimu smazeme sluzbou BIOSu obrazovku mov AX,600h ; Sluzba 6, smazani okna xor CX,CX ; CX := 0 (levy horni roh) mov DX,184Fh ; DX := (24,79) (pravy dolni roh) int 10h ; Skupina sluzeb zobrazovani ; 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 RealnyRezim ; Offset mov AX,CS mov WORD PTR ES:0469h,AX ; Segment ; Definice makra: ; MACRO SetBase vygeneruje posloupnost instrukci, ktera v popisovaci segmentu ; "segm" nastavi bazi na hodnotu (segr x 16), kde "segr" je segmentovy registr. SetBase MACRO segr,segm mov AX,segr ; AX := segmentovy registr shr AH,4 ; Do horni casti baze patri bity mov segm&.Base_m,AH ; 23-16 kompletni 24bitove adresy. mov AX,segr ; AX := segmentovy registr shl AX,4 ; Do dolni casti baze patri bity mov segm&.Base_l,AX ; 15-0 kompletni 24bitove adresy. ENDM ; ; Nastaveni bazi pro segmenty DefSupC a DefSupS SetBase CS,DefSupC ; DefSupC.base := CSx16 SetBase DS,DefSupD ; DefSupS.base := DSx16 SetBase SS,DefSupS ; DefSupS.base := SSx16 ; Nastaveni GDTR pred prepnutim do chraneneho rezimu. mov AX,DS ; AX := DS shr AX,12 ; Po vynasobeni 16 zustane v hornim mov dBase_h,AX ; slove pouze 1 hexa cislice, tu uloz ; do pomocne promenne pro LGDT. mov AX,DS ; AX := DS shl AX,4 ; AX := DSx16 lea BX,DefGDT ; BX := OFFSET DefGDT v ramci DS. add BX,AX ; BX := Linearni adresa DefGDT (dolni slovo) mov dBase_l,BX ; Naplnime pomocnou promennou pro mov dLimit,SzGDT-1 ; instrukci LGDT. lgdt QWORD PTR dLimit; Naplneni GDTR bazi a limitem GDT. ; Prepnuti do chraneneho rezimu. smsw AX ; Precti stavajici obsah rid. reg. MSW. or AL,1 ; Nastav na jednicku bit 0 (Prot.Enable) lmsw AX ; Napln MSW novym obsahem. jp ZrusFrontu ; Kratky skok pro zruseni instrukcni ZrusFrontu: ; fronty predvybranych instrukci. ; Nastaveni obsahu vsech segmentovych registru. mov AX,SelSupD ; Naplneni DS adresou datoveho segmentu mov DS,AX ; s daty programu. mov AX,SelSupE ; Naplneni ES adresou datoveho segmentu mov ES,AX ; s Video-RAM v textovem rezimu. mov AX,SelSupS ; AX := selektor segmentu se zasobnikem. mov SS,AX ; Napln SS selektorem zasobnik. segmentu. db 0EAh ; Proved instrukci pro naplneni CS: dw NaplnCS,SelSupC ; jmp FAR PTR SelSupC:NaplnCS NaplnCS: ; Vlastni operace v chranenem rezimu: ; Do Video-RAM okopirujeme obsah zpravy ; a skoncime. cld ; Retezce se budou zpracovavat zepredu. mov SI,OFFSET Zprava ; SI := offset zpravy v ramci DS. ; DS:SI je adresa zdroj. retezce. mov CX,Delka ; CX := delka zpravy xor DI,DI ; DI := 0 ; ES:DI je adresa ciloveho mista. rep movsb ; Prenes CX slabik do Video-RAM ; ; Prepnuti z chraneneho rezimu zpet do realneho v IBM PC/AT. ; --------------------------------------------------------- ; 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 RealnyRezim: ; ; Nyni jsme opet v realnem rezimu ; ------------------------------- mov AX,DATA ; Obsahy registru se ztratily, musime mov DS,AX ; obnovit DS. ; SS ponechame na nekoho jineho. mov AH,2 ; Sluzba nastaveni pozice kurzoru mov DX,200h ; DX := radek 2, sloupec 0 int 10h ; Skupina sluzeb zobrazovani. mov AH,9 ; Vypis zpravu o realnem rezimu. mov DX,OFFSET ZpravaReal 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.