IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

[Tetris] Dessiner array mode 13h


Sujet :

x86 16-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 52
    Points : 36
    Points
    36
    Par défaut [Tetris] Dessiner array mode 13h
    Bonjour, je reprends mon Tetris de plus belle.

    J'essaye de dessiner un array en Assembleur, il doit faire 20*10, j'utilise l'int13 mode et Dosbox pour simuler.
    J'ai déjà le code suivant ; pour être clair, j'essaye de dessiner le blockarray :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    PROC setVideoMode
        ARG mode RETURNS eax
        mov     eax, [mode]
        int     10h
        ret
    ENDP setVideoMode
    PROC waitKey
        mov     eax, 0
        int     16h
        ret
    ENDP waitKey
    PROC start
            sti                             ; Set The Interrupt Flag
            cld                             ; Clear The Direction Flag
            push ds      	; Put value of DS register on the stack
            pop es        ; And write this value to ES
     ; Your code comes here
     call setVideoMode, 13h
     mov     edi, 0a0000h
     ; setup colors
     mov     esi, offset pal     ; set the palette (DAC) address
     mov     ecx, 2 * 3          ; set color 0 and 1 (2 indexes in total, 2 * 3 bytes)
     mov     dx, 03c8h           ; VGA DAC set port
     mov     al, 0               ; set start color index
     out     dx, al
     inc     dx
     rep     outsb
     add     edi, 360 *10 +160
      mov     [dword ptr edi], 1
     call    waitKey
     call    setVideoMode, 3h
            mov eax, 4c00h                  ; AH = 4Ch - Exit To DOS
            int 21h                         ; DOS INT 21h
    ENDP start
    ;北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北?
    ; DATA
    ;北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北北?
    DATASEG
    ; Your data comes here
    pal db 0, 0, 0, 63, 63, 63
    blockarray db 200 dup(1)
    Merci pour votre aide

  2. #2
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 492
    Points : 43 325
    Points
    43 325
    Par défaut
    Regardes du coté des modes VESA.

    Voir la doc des fonctions.

    Ces modes permettent l'accès en mémoire un pixel=1 valeur 32 bits (avec 1 octet pour chaque couleur).

    Il te suffit ensuite de calculer le décalage depuis le début de la mémoire pour afficher tel ou tel pixel.

    Attention, utilisable uniquement en mode DOS.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  3. #3
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    "de plus belle"
    Mais je salue ta persévérance (c'est assez rare pour le signaler je trouve)

    Chrstophe, je ne suis pas sûr de l'utilité de faire une interface en "haute définition" pour plusieurs raisons :
    - le vesa en mode réel c'est chiant (accès à la ram vidéo par buffers de 64Ko)
    - un Tetris n'a pas beaucoup d'informations à afficher donc ça tient très bien dans un écran en 320x200
    - Si son code est bien écrit, le passage VGA -> VESA ne lui posera pas de problème pour la suite

    Bon, alors voyons ce code....
    Ok... dis donc ça n'a pas beaucoup bougé depuis la dernière fois

    Donc tu veux afficher ton tableau blockarray qui fait 200 octets, en 20 lignes de 10 colonnes c'est ça ?
    Peux-tu nous dire sur quoi tu butes exactement ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 52
    Points : 36
    Points
    36
    Par défaut
    fair 2 buffer (dsl je sais pas comment on dis en francais) fair un buffer de array 200 valeur (20*10) et fair tombé mes block dedans une fois qu'une ligne de 10 sera repli la fair disparaitrer pour ca que jessaye d'abord de dessiné le block de 20*10

  5. #5
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 492
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 492
    Points : 43 325
    Points
    43 325
    Par défaut
    le vesa en mode réel c'est chiant (accès à la ram vidéo par buffers de 64Ko)
    Avec le mode LFB (Linear Frame Buffer), pas de fenêtre , il faut activer le bit 15 (ajout de 0x4000 au mode) et récupérer l'adresse à l'offset 0x28 du bloc récupéré par la fonction ax=0x4f01 int 0x10. A vérifier siu c'est exploitable en mode réel.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  6. #6
    Membre chevronné
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    @chrstophe : Il faut être en mode FLAT pour pouvoir écrire en direct, et DosBox n'aime pas du tout

    @Denzi...
    Oui, mais non, il faut que tes demandes soient plus précises.
    On ne sais même pas comment tu comptes gérer ce buffer (ça va bien en Français aussi)
    Chaque "case" de ton écran de jeu occupe 1 octet.
    J'imagine que c'est pour y stocker le type de bloc qui va s'y trouver.
    par exemple :
    octet = 0 = case vide
    octet = 1 = case avec un bloc bleu
    octet = 2 = case avec un bloc vert
    octet = 3 = case avec un bloc rouge
    octet = 4 = case avec un bloc jaune
    ...
    ...

    Mais je n'en sais rien, c'est ton programme, Tu parles de 2 buffers... pourquoi deux ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. vertex arrays ~ mode immédiat
    Par Frifron dans le forum OpenGL
    Réponses: 4
    Dernier message: 01/08/2008, 12h22
  2. Dev C++ et mode VGA (13h)
    Par bootix dans le forum Dev-C++
    Réponses: 11
    Dernier message: 09/12/2007, 14h52
  3. [MFC] Dessin dynamique mode console
    Par MAGNUM_HEAD dans le forum MFC
    Réponses: 20
    Dernier message: 15/05/2007, 16h51
  4. [Jeux] Projet tetris dessiner la grille
    Par tortuegeniale65 dans le forum Graphisme
    Réponses: 4
    Dernier message: 01/05/2006, 23h55
  5. Mode 13h et palette
    Par Biglo dans le forum Assembleur
    Réponses: 10
    Dernier message: 31/05/2003, 16h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo