; Remplit une bande à travers l'écran avec des barres verticales dans tous ; les 256 attributs, puis parcourt la palette jusqu'à ce qu'une touche clavier ; soit pressée ; Assemblé avec TASM 4.0, lié avec TLINK 6.10 ; Testé par Jim Mischel 11/21/94 ; USE_BIOS equ 1 ;à 1 pour utiliser les fonctions ;BIOS pour accéder au DAC, 0 pour ;lire et écrire dans le DAC ;directement GUARD_AGAINST_INTS equ 1 ;1 pour désactiver les interruptions ;et paramétrer l'index Write avant de ;charger chaque emplacement du DAC, ;0 pour compter sur l'auto- ;incrémentation du DAC a1 WAIT_VSYNC equ 1 ;à 1 pour attendre le SSV NOT_8088 equ 0 ;à 1 pour employer REP INSB et REP O ;UTSB lors d'un accès direct ;du DAC, 0 pour employer ;IN/STOSB et LODSB/OUT CYCLE_SIZE equ 256 ;nombre d'emplacements du DAC ;à parcourir, 256 maximum SCREEN_SEGMENT equ 0a000h;segment de la mémoire ;vidéo en mode 13h SCREEN_WIDTH_IN_BYTES equ 320 ;nombre d'octets à travers ;l'écran en mode 13h INPUT_STATUS_1 equ 03dah ;port du registre input ; status 1 DAC_READ_INDEX equ 03c7h ;registre DAC Read Index DAC_WRITE_INDEX equ 03c8h ;registre DAC Write Index DAC_DATA equ 03c9h ;registre DAC Data if NOT_8088 .286 endif ;NOT_8088 .model small .stack 100h .data ;Stockage des 256 emplacements du DAC, organisé comme un triplet RVB de trois ;octets par couleur (en fait trois valeurs sur 6 bits; les deux bits supérieurs de ;de chaque octet ne sont pas significatifs). PaletteTemp db 256*3 dup(?) .code start: mov ax,@data mov ds,ax ;Sélectionne le mode graphique 256 couleurs standard de VGA, mode 13h. mov ax,0013h ;AH = 0: fonction d'initialisation ;du mode, int 10h ;AL = 13h: numéro de mode à paramétrer ;Lit les 256 emplacements du DAC dans PaletteTemp (3 valeurs sur 6 bits, une pour ;le rouge, le vert, et le bleu, par emplacement du DAC). if WAIT_VSYNC ;Attend le SSV; ce qui assure que ;nous lisons le début du DAC pendant la période de non affichage ;vertical. mov dx,INPUT_STATUS_1 WaitNotVSync: ; Attend le front montant du SSV in al,dx and al,08h jnz WaitNotVSync WaitVSync: in al,dx and al,08h jz WaitVSync endif ;WAIT_VSYNC if USE_BIOS mov ax,1017h ;AH = 10h: fonction de paramétrage ;du DAC , ; AL = 17h: sous-fonction de lecture du bloc DAC sub bx,bx ;commence à l'emplacement 0 du DAC mov cx,256 ;lit les 256 emplacements mov dx,seg PaletteTemp mov es,dx mov dx,offset PaletteTemp ;ES:DX pointe sur le ;tableau dans lequel stocker ; les valeurs du DAC int 10h ;lit le DAC else ;USE_BIOS if GUARD_AGAINST_INTS mov cx,CYCLE_SIZE ;nombre d'emplacements du DAC ;à charger mov di,seg PaletteTemp mov es,di mov di,offset PaletteTemp ; sub ah,ah ;commence avec l'emplacement 0 du DAC DACStoreLoop: mov dx,DAC_READ_INDEX mov al,ah cli out dx,al ;paramètre le numéro de l'emplacement ;du DAC mov dx,DAC_DATA in al,dx ;récupère le composant rouge stosb in al,dx ;récupère le composant vert stosb in al,dx ;récupère le composant bleu stosb sti inc ah loop DACStoreLoop else ;!GUARD_AGAINST_INTS mov dx,DAC_READ_INDEX sub al,al out dx,al ;met à 0 l'emplacement initial du DAC mov di,seg PaletteTemp mov es,di mov di,offset PaletteTemp ; mov dx,DAC_DATA if NOT_8088 mov cx,CYCLE_SIZE*3 rep insb ;lit les CYCLE_SIZE emplacements ;du DAC en une seule fois else ;!NOT_8088 mov cx,CYCLE_SIZE ;nombre d'emplacements du DAC ;à charger DACStoreLoop: in al,dx ;récupère le composant rouge stosb in al,dx ;récupère le composant vert stosb in al,dx ;récupère le composant bleu stosb loop DACStoreLoop endif ;NOT_8088 endif ;GUARD_AGAINST_INTS endif ;USE_BIOS ;Affiche une série de barres verticales larges de 1 pixel à travers l'écran dans ;les attributs 1 à 255. mov ax,SCREEN_SEGMENT mov es,ax mov di,50*SCREEN_WIDTH_IN_BYTES ;ES:DI pointe sur ;le début de la ligne ; 50 sur l'écran cld mov dx,100 ;affiche 100 lignes de haut RowLoop: mov al,1 ;commence chaque ligne avec ;l'attribut 1 mov cx,SCREEN_WIDTH_IN_BYTES ;traverse une ligne ;complète ColumnLoop: stosb ;affiche un pixel add al,1 ;incrémente l'attribut adc al,0 ;si l'attribut dépasse de justesse ;0, l'incrémenter de 1 ;car nous n'allons pas parcourir ;l'emplacement 0 du DAC, aussi ;l'attribut 0 ne changera pas loop ColumnLoop dec dx jnz RowLoop ;Parcourt la plage spécifiée des emplacements du DAC jusqu'à une touche clavier. CycleLoop: ;Effectue une rotation des couleurs 1-255 d'une position dans le tableau ;PaletteTemp; l'emplacement 0 reste toujours tel quel afin que le fond et ;les bords ne changent pas. push word ptr PaletteTemp+(1*3) ;met de coté ;PaletteTemp push word ptr PaletteTemp+(1*3)+2 ; ;paramétrage de l'attribut 1 mov cx,254 mov si,offset PaletteTemp+(2*3) mov di,offset PaletteTemp+(1*3) mov ax,ds mov es,ax mov cx,254*3/2 rep movsw ;effectue une rotation des paramètres ;de PaletteTemp ;pour les attributs 2 à 255 aux ;attributs 1 à 254 pop bx ;récupère le paramétrage original pop ax ;pour l'attribut 1 et le passe stosw ; à l'emplacement PaletteTemp mov es:[di],bl;pour l'attribut 255 if WAIT_VSYNC mov dx,INPUT_STATUS_1 WaitNotVSync2: in al,dx and al,08h jnz WaitNotVSync2 WaitVSync2: in al,dx and al,08h jz WaitVSync2 endif ; if USE_BIOS ;Paramètre la nouvelle palette ayant effectué une rotation. mov ax,1012h ;AH = 10h: fonction de paramétrage ;du DAC, ; AL = 12h: sous-fonction paramétrage de bloc du DAC sub bx,bx ;commence à l'emplacement 0 du DAC mov cx,CYCLE_SIZE ;nombre d'emplacements du DAC à ;paramétrer mov dx,seg PaletteTemp mov es,dx mov dx,offset PaletteTemp ;ES:DX pointe sur le ;tableau à partir duquel ;il faut charger le DAC int 10h ;charge le DAC else ;!USE_BIOS if GUARD_AGAINST_INTS mov cx,CYCLE_SIZE ;nombre d'emplacements du DAC ;à charger mov si,offset PaletteTemp ;charge le DAC à partir ;de ce tableau sub ah,ah ;commence avec l'emplacement 0 ;du DAC DACLoadLoop: mov dx,DAC_WRITE_INDEX mov al,ah cli out dx,al ;paramètre le numéro d'emplacement ;du DAC mov dx,DAC_DATA lodsb out dx,al ;paramètre le composant rouge lodsb out dx,al ;paramètre le composant vert lodsb out dx,al ;paramètre le composant bleu sti inc ah loop DACLoadLoop else ;!GUARD_AGAINST_INTS mov dx,DAC_WRITE_INDEX sub al,al out dx,al ;paramètre l'emplacement initial du ;DAC à 0 mov si,offset PaletteTemp ;charge le DAC à partir ;de ce tableau mov dx,DAC_DATA if NOT_8088 mov cx,CYCLE_SIZE*3 rep outsb ;charge les emplacements CYCLE_SIZE ;du DAC en une seule fois else ;!NOT_8088 mov cx,CYCLE_SIZE ;nombre d'emplacements du DAC à ;charger DACLoadLoop: lodsb out dx,al ;paramètre le composant rouge lodsb out dx,al ;paramètre le composant vert lodsb out dx,al ;paramètre le composant bleu loop DACLoadLoop endif ;NOT_8088 endif ;GUARD_AGAINST_INTS endif ;USE_BIOS ;Vérifie si une touche a été pressée. mov ah,0bh ; int 21h and al,al jz CycleLoop mov ah,1 int 21h ;Restore text mode and done. mov ax,0003h ;AH = 0: fonction paramétrage du mode int 10h ;AL = 03h:numéro du mode à paramétrer mov ah,4ch ;Exit vers DOS int 21h end start