Pr¡klad identifik cie obvodov Trident Install: // Tu zaŸ¡name asm{ mov dx,0x3C4 // Adresa portu 3C4 mov al,0x0E // Index Mode Control #1 register out dx,al // Nastav index inc dx // Adresa portu 3C5 in al,dx mov bh,al // Odpam„tanie starej hodnoty registra xor ax,ax // Nuluj register ax out dx,al // Zap¡ç nov£ hodnotu in al,dx // NaŸ¡taj nov£ hodnotu and al,0x0F // Len bity 0 a§ 3 maj£ zmysel mov bl,al // Odpam„tanie novej hodnoty mov al,bh out dx,al // Z pis p“vodnej hodnoty mov ch,0 // Implicitne predpoklad me, §e to nie je Trident obvod cmp bl,0x02 // Kontrola, Ÿi PAGE bit m  hodnotu==1 a ostatn‚ bity ==0 jne Cont // Ak to nie je obvod Trident pokraŸuj inou cestou mov ch,0x01 // Nastav, §e je to Trident obvod dec dx // Adresa portu 3C4 mov al,0x0B // Index Hardware Version register out dx,al // Nastav index inc dx // Adresa portu 3C5 xor ax,ax // Nuluj register ax out dx,al // Fikt¡vny z pis in al,dx // NaŸ¡taj hodnotu mov byte ptr Type_Chip,al // Nastav premenn£, hodnota >= 3 obvod 8900, hodnota <3 obvod 8800 }; Cont: asm{ mov byte ptr Type_Card,ch // Nastav premenn£ and ch,ch // Test na nulu jnz Next // Ak je to obvod Trident, pokraŸuj norm lne Ôalej inak mov byte ptr Err,0x01 // nastav chybu }; Next: // Tu konŸ¡me ********************* Pr¡klad funkcie na prep¡nanie baniek // Funkcia Set_Bank_Trident // Z pis Ÿ¡sla banky pre 64KB pam„œov‚ mapovanie do New Mode Control Register #1. // Funkcia oŸak va vstupn£ hodnotu (Ÿ¡slo banky) v ,,al" registri. // void Set_Bank_Trident(void) { asm{ and al,0x0F // Iba 16 baniek je dovolenìch mov ah,byte ptr Act_Page // ¬¡slo videostr nky do registru 'ah' or ah,al // Nastavenie Ÿ¡sla banky, ber£c do £vahy videostr nkovanie mov dx,0x03C4 // Adresa portu 3C4 mov al,0x0E // Index na Mode Control #1 Register xor ah,02 // Nastavenie PAGE bitu out dx,ax // Z pis Ÿ¡sla banky }; } ***************** Pr¡klad na nastavovanie zaŸiatoŸnej adresy zobrazovania void far set_visual(void) // Nastavovanie zaŸiatoŸnej adresy zobrazovania { // ¬¡slo videostr nky vstupuje v registri 'al' asm{ push ds // Odlo§enie obsahu registrov na z sobn¡k push cs pop ds // ds=cs and al,0x01 // Iba dve obrazov‚ str nky s£ povolen‚ mov bl,al // Odlo§ Ÿ¡slo str nky do registra ,,bl' cmp byte ptr Graph_Mode,3 // Ak je nastavenì mod 1024x768x256, ukonŸi je End // preto§e §iaden adapt‚r neadresuje 2 MB pam„ti cmp byte ptr Type_Card,0 // Kontrola, Ÿi je nastavenì spr vny adapt‚r je End // Ak nie koniec mov dx,0x3CC // Adresa portu pre miscellaneous register in al,dx // NaŸ¡taj jeho obsah and al,0x01 // Ak bit 0 je nastavenì na hodnotu 0 jz Mono // potom je pripojenì jednofarebnì monitor mov dx,0x3D0 // Ak je nastavenì na hodnotu 1, je pripojenì farebnì monitor jmp Cont // Adresy CRTC-portov pre farebnì monitor na 3Dx }; Mono: asm mov dx,0x3B0 // Adresy CRTC-portov pre jednofarebnì monitor na 3Bx Cont: asm{ add dx,0x04 // Nastav spr vnu adresu portu 3x4 mov al,0x1E // Index pre CRTC Module Testing register out dx,al // Nastav CRTC Module Testing register inc dx // Adresa portu 3x5 in al,dx // NaŸ¡taj aktu lne nastavenie and al,0xDF // Nuluj Start Address Bit16, bit S16 cmp bl,0x01 // Je nastavenìch hornìch 256KB ? jne No128 // Ak nie, pokraŸuj inou vetvou mov cx,5 shl bl,cl // Rotuj p„œkr t or al,bl // Nastav spr vny bit or al,0x80 // Povo– zobrazovanie hornìch 256 KB, teda A16=S16=1 jmp Cont1 }; No128: asm and al,0x7F // Povol zobrazovanie dolnìch 256 KB, teda A16=S16=0 Cont1: asm out dx,al // Zap¡ç novì obsah registra End: asm pop ds // obnov p“vodnì obsah v registri ,,ds" } ************** Pr¡klad na vìpoŸet fyzickej adresy v obrazovej pam„ti // GETPIXEL // Funkcia sa pou§¡va pre naŸ¡tanie hodnoty urŸit‚ho pixelu v grafickom mode s 256 farbami. // Na vstupe s£ s£radnice pixelu, ktor‚ho hodnota sa m  naŸ¡taœ. // Vìstup je hodnota pixelu. // void getpixel(void) { asm{ mov cx,ax // Register ,,ax" je s£radnica x mov ax,bx // Register ,,bx" je s£radnica y mov bl,byte ptr Graph_Mode // NaŸ¡taj Ÿ¡slo grafick‚ho modu xor bh,bh // bh=0 shl bx,1 // VìpoŸet adresy v poli byt_row, ktor‚ je typu ,,int" mov di,word ptr byt_row[bx] // NaŸ¡taj poŸet bajtov na jeden riadok pixelov mul di // N sob reg. ,,ax" s ,,di" a vìsledok je v ,,dx:ax" add ax,cx // Ak prechod medzi bankami nie je na konci riadku, je nutn‚ jnc No_inc // otestovaœ, Ÿi nie je niekde v riadku inc dl // Ak  no, priŸ¡taj k Ÿ¡slu banky jedna }; No_inc: asm{ mov di,ax // ,,ax" register je z roveå offset mov al,dl // Nastav Ÿ¡slo pam„œovej banky call near ptr _Set_Bank_Trident // Prepni banku mov ax,0xA000 // Nastav ,,es" register na segment AOOO mov es,ax mov ah,es:[di] // NaŸ¡taj hodnotu pixelu, pre mody v 256 farb ch je to 8 bitov mov dl,ah // Vlo§ do registru ,,dl" xor dh,dh // Funkcia vracia hodnotu pixelu v registri ,,dx" }; }