Programmation graphique en mode 12h

Signaler
Messages postés
2
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
28 mai 2005
-
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
-
J'aimerai poser surement une bete question.
Comment puis-je faire pour travailler dans le mode 12h (640x480 en 16 couleurs)
en accedant directement à la mémoire vidéo et sans utiliser le VESA.
(puisque dans ce mode je dépasse 64Ko)

Si il n'y a pas moyen de faire cela, j'aimerai qu'on m'explique pourquoi quand j'écris directement dans la memoire en mode 12h de la maniere suivante :

mettre un byte (pour donner une couleurou allumer un pixel ) à la position de l'écran
ES:[DI] en incrémentant DI de 1 à chaque fois, j'obtiens à la place d'une ligne plusieurs point écarté.

j'ai éssayé d'agrandir la valeur de mon byte (ex: al) et je n'obtient plus des point mais un petite ligne.

ce serait cool si quelqu'un pourrai m'expliquer le pourquoi de la chose.

je re-précise que j'ai initialisé le segment à 0A000h et que je suis en mode 12 h
Le but de ceci est de me permettre d'afficher par exemple un rectangle d'une couleur donné dans ce mod evideo mais d'une maniere instantané puisqu'en utilisant les int. ça prend beaucoup trop de temps.

Merci d'avance.

5 réponses

Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
29
Les paramètres sont dans la pile

(c'est un programme pour Turbo Basic)

(couleur, position X, position Y, Longeur X, Longeur Y)


DEB: PUSH BP

MOV BP, SP

PUSH DS



; couleur dans CH

LDS SI, [BP+22] ; couleur

MOV CH, [SI] ; dans CH



; controleur graphique: registre 1 = Enable Set/Reset

; la valeur inscrite provient du registre Set/Reset

MOV DX, 3CEh

MOV AX, 0F01h

OUT DX, AX



; controleur graphique: registre 0 = Set/Reset

; détermine la valeur pour les différents plans de bits

XOR AX, AX

MOV DS, AX

MOV AH, CH

OUT DX, AX



; calcul adresse vidéo

MOV SI, 44Ah ;nombre colonnes / ligne

MOV CX, [SI]

PUSH CX

LDS SI, [BP+14] ; position Y


LODSW
; dans AX

MUL CX

LDS SI, [BP+18] ; position X

MOV DI, [SI] ; dans DI

MOV DX, DI ; et dans DX

AND DX,7

MOV CL,3

SHR DI, CL

ADD DI, AX

MOV AX, 0A000h

MOV ES, AX



; masque et nombre de bits

LDS SI, [BP+10] ; Longueur X


LODSW
; dans AX

DEC AX

ADD AX, DX

MOV BX, 0FF80h

MOV CX, DX

SHR BH, CL ; BH = masque début

MOV CX, AX

AND CL, 7

SAR BL, CL ; BL = masque fin

MOV CL, 3

SHR AX, CL

MOV CX, AX



; controleur graphique: registre 8 = Bit Mask

MOV DX, 3CEh

MOV AL, 8

OUT DX, AL

INC DX



LDS SI, [BP+6] ; Longueur Y


LODSW
; dans AX

POP
BP
; reprise nb colonne/ligne

DEC BP

SUB BP, CX



; début Ligne

P10: PUSH AX

PUSH CX

; masque début

M10: MOV AL, BH

JCXZ M30

OUT DX, AL

MOV AH, ES:[DI] ; chargement des reg. Latches

STOSB

; milieu ?

DEC CX

JZ M35

; masque fin

M20: MOV AL, 0FFh

OUT DX, AL



M25: REP STOSB

JMP short M35



M30: MOV AL, BH

AND AL, BL

JMP $+4



M35: MOV AL, BL

OUT DX, AL

MOV AH, ES: [DI]

STOSB

; boucle

P20: POP CX

ADD DI, BP

POP AX

DEC AX

JNZ P10

; on remet les registres

P30: DEC DX

MOV AX,1

OUT DX, AX

MOV AX, 0FF08h

OUT DX, AX



FIN: POP DS

POP BP



Daniel
Messages postés
2
Date d'inscription
mardi 15 mars 2005
Statut
Membre
Dernière intervention
28 mai 2005

merci de m'avoir répondu Daniel.
Comme je suis débutant, c'est plutot difficile pour moi de déchiffrer ton code mais, j'essayerai à partir de là pour un peu avancé.
Messages postés
13
Date d'inscription
lundi 29 juillet 2002
Statut
Membre
Dernière intervention
7 octobre 2009

salut ca fait longtempt qu'il n'y à plus de post ici mais je vais quand même
essayer ...
as tu regler ton probleme car j'ai le meme les pixel sont eclaté et je sais pas pourquoi ?

merci d'avance un debutant
Messages postés
116
Date d'inscription
samedi 4 juin 2005
Statut
Membre
Dernière intervention
10 avril 2013
1
Le mode 12h est en 16 couleurs (4bits). Dans ce mode la carte video est composée de 4 plans de 38400 octets chacun (640 * 480) / 8

Le pixel a la position 0,0 est composé du:
-bit 7 de l'octet 0 du plan 0
-bit 7 de l'octet 0 du plan 1
-bit 7 de l'octet 0 du plan 2
-bit 7 de l'octet 0 du plan 3

Le pixel a la position 1,0 est composé du:
-bit 6 de l'octet 0 du plan 0
-bit 6 de l'octet 0 du plan 1
-bit 6 de l'octet 0 du plan 2
-bit 6 de l'octet 0 du plan 3

etc...


Port 3C4h index 2 (r/W):
Sequencer: Map Mask Register<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />


bit 0 Autorize écriture plan 0 si 1


1 Autorize écriture plan 1 si 1


2 Autorize écriture plan 2 si 1


3 Autorize écriture plan 3 si 1

Il y a plusieurs technique pour écrire dans la ram video, selon le travail a effectuer:
-1 seul pixel a écrire
-une zone de couleur unie
-une zone de couleur différente.
-etc...

Un liens pour l'utilisation des registres de la carte graphique:
http://www.ibiblio.org/pub/linux/X11/devel/supervga-info/vga.doc

A+
Messages postés
3140
Date d'inscription
vendredi 14 mai 2004
Statut
Membre
Dernière intervention
11 mars 2019
29
La couleur d'un pixel est composé par les 4 bits correspondants des 4 plans de bits,

ce qui donne 16 couleurs possibles.


Controleur Graphique:



Registre 1: Enable Set/Reset

Pour l'utilisation du mode Write 0, les bits 0 à 3 déterminent si la valeur inscrite

dans les 8 bits de l'octet d'un plan de bit adressé doit être extraite de l'octet CPU

ou du Registre Set/reset

c'est ce mode qui est choisi, les 4 bits sont positionnés à 1, ce qui veut dire qu'en

une seule opération, 8 bits pourront être traités en même temps.



Registre 0: Set/Reset

c'est ici qu'on met la couleur une seule fois au début.



Registre 8: Bit Mask

ensuite on joue sur les masques pour déterminer les bits que l'on va traiter.

3 cas sont à prévoir:

- le masque de début intervient pour les premiers bits qui ne sont pas à traiter,

- masque FFh pour traiter tous les octets complets entre début et la fin

cas pas toujours présent d'où le test milieu ?

- masque de fin pour les derniers bits qui sont pas à traiter.



pour modifier un octet:

- on charge le masque correspondant

- on lance une lecture

qui petmet de Lire les 4 registres Latches correspondants

ceux ci sont seulement utilisés en interne

ça évite de modifier les bits non traités (grace au masque)

- on lance une écriture d'un octet complet

les 4 Registres Latches sont écrits dans la mémoire vidéo



Il n'y a plus qu'à boucler Ligne par Ligne jusqu'à la fin.

puis on remet les Registres à leur valeur par défaut.

et c'est fini




Daniel