codefordumm!ies: the cool logo
en développement !

J'apprends la programmation avec l'assembleur x86, partie 6

notre écran vert

http://www.ctyme.com/intr/int.htm

Le code source de green.asm

; =====
; green
; =====
;
; C:\nasm -fbin green.asm -o green

org 0x100

global main

VGA_MEMORY_SEGMENT  equ 0xa000  ; segment mémoire de la carte VGA
VGA_WIDTH       equ 320     ; nombre de pixels horizontaux en VGA
VGA_HEIGHT      equ 200     ; nombre de pixels verticaux en VGA

section .text

main:
    call enter_vga      ; on entre dans le mode VGA
    call draw_something ; on dessine un truc
    call wait_key       ; on attend une touche au clavier
    call quit_vga       ; on quitte le mode VGA

    mov ax, 0x4c00      ; on quitte sans erreur
    int 0x21

enter_vga:
    mov ah, 0x0f        ; le service 0x0f de l'int 0x10 récupère le mode vidéo en cours
    int 0x10            ; dans al
    mov [old_mode], al  ; on conserve cette valeur dans old_mode

    mov ah, 0x00        ; le service 0x00 de l'int 0x10 change le mode vidéo
    mov al, 0x13        ; pour celui de al 
    int 0x10            ; ici al = 0x13 soit VGA 320x200x256 couleurs

    ret

quit_vga:
    mov ah, 0x00        ; on restaure le mode vidéo 
    mov al, [old_mode]  ; conservé dans old_mode
    int 0x10

    ret

wait_key:
    mov ah, 0x01        ; le service 0x01 de l'int 0x16 
    int 0x16            ; vérifie si une touche a été appuyée
    jz wait_key         ; si ZF est activé, aucune touche n'a été appuyée

    ret

draw_something:
    mov ax, VGA_MEMORY_SEGMENT      
    mov es, ax          
    xor di, di          ; es:di = 0xa000:0000 -> début de la mémoire VGA

    mov cx, VGA_WIDTH * VGA_HEIGHT  ; 320 x 200 = 64000 répétitions
    mov al, 0xf0        ; couleur 240 sur 256, un vert kaki
    rep stosb           ; on remplie l'écran avec les 64000 pixels

    ret

section .data
old_mode: db 0          ; variable pour conserver le mode vidéo précédent

Pour m'entrainer

En modifier uniquement la fonction draw_something essayez d'obtenir l'écran suivant :

plein de couleurs

On affiche des pixels dont la couleur de départ 0 est incrémentée jusqu'à 255, puis retourne à 0, et ainsi de suite.
(si un registre de 8bits valant 255 est incrémenté, il passe de nouveau à 0)

Solution