Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1571 connectés 

 


 Mot :   Pseudo :  
 
 Page :   1  2  3
Auteur Sujet :

programmation graphique 800*600

n°764353
bjone
Insert booze to continue
Posté le 15-06-2004 à 14:13:51  profilanswer
 

Reprise du message précédent :
avec OpenWatcom, l'asm il vaux mieux l'utiliser comme ça:
 

Code :
  1. #pragma intrinsic (Show_Mouse)
  2. void Show_Mouse(void);
  3. #pragma aux Show_Mouse = "mov ax,1" \
  4.                          "int 33h"  \
  5.                          modify [ eax ];

mood
Publicité
Posté le 15-06-2004 à 14:13:51  profilanswer
 

n°765195
ptitchep
Posté le 16-06-2004 à 00:57:03  profilanswer
 

#pragma intrinsic (Show_Mouse)  
  void Show_Mouse(void);  
  #pragma aux Show_Mouse = "mov ax,1" \  
                           "int 33h"  \  
                           modify [ eax ];  
Ca veut dire koi tout ca?

n°765197
ptitchep
Posté le 16-06-2004 à 00:58:13  profilanswer
 


   
  #pragma intrinsic (Show_Mouse)  
  void Show_Mouse(void);  
  #pragma aux Show_Mouse = "mov ax,1" \  
                           "int 33h"  \  
                           modify [ eax ];  
Ca veut dire koi tout ca?

n°765198
ptitchep
Posté le 16-06-2004 à 00:59:01  profilanswer
 

dsl pour le double message, fausse manip...

n°765223
bjone
Insert booze to continue
Posté le 16-06-2004 à 03:56:20  profilanswer
 

c'est un exemple ou le driver souris est appellé pour afficher la souris.

n°765709
ptitchep
Posté le 16-06-2004 à 13:57:38  profilanswer
 

et pour ajouter simplement de l'assembleur du style
mov ax,4f02h
mov bx,103h
int 10h
?

n°765755
HelloWorld
Salut tout le monde!
Posté le 16-06-2004 à 14:25:02  profilanswer
 

lire la doc


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°765766
bjone
Insert booze to continue
Posté le 16-06-2004 à 14:29:18  profilanswer
 

ça peut être plus chiant.
comme dit à la fin de http://bbs.ee.ntu.edu.tw/boards/Programming/10/19.html
 
le Watcom est une brute en optimisation (à l'époque il sortait vraiment du lot), et le compilo n'utilise pas un asm/_asm, et préfère une déclaration du code asm séparée, avec un placement explicite des variables passé, et des registres modifiés, afin d'optimiser le code C/C++ autour de la routine asm.
 
pour ton 4f02h: ce serait un truc du genre:
 
short VBE_SetMode(short Mode, short CRTC_Seg, short CRTC_Offset);
#pragma aux = "mov ax,4f02h" \
              "int 10h"
              parm [ebx][es][edi] value [eax];
 
parm défini les registres mappés par pour chaque paramètre
Mode => BX de EBX
CRTC_Seg => ES
CRTC_Offset => DI de EDI
 
modify peut définir les registres altérés par le code (par exemple modify [ecx]).
 
et value [eax] indique que la valeur de retour est passé par AX de eax.
 
 
 

n°766587
ptitchep
Posté le 16-06-2004 à 23:40:00  profilanswer
 

Après bien des complications, j'ai réussi a creer un prog en assembleur mode protégé mais maintenant, quand je défini mon mode vidéo 800*600*8 je ne peux pas obtenir l'adresse de la mémoire vidéo parceque la fonction 4f01h de l'int 10h demande que es:[di] pointe sur un buffer de 256 octets, or je n'ai plus de segments... et l'int ne marche pas!...

n°766618
bjone
Insert booze to continue
Posté le 17-06-2004 à 00:30:27  profilanswer
 

hé ouiiiiiiiiii
 
- welcome to the real world -
 
il faut que tu alloues un buffer dans l'espace mémoire < 1 Mo, attends je regarde ce que j'avais codé à l'époque et je te dis quelle appel DPMI permet de faire ça.

mood
Publicité
Posté le 17-06-2004 à 00:30:27  profilanswer
 

n°766621
bjone
Insert booze to continue
Posté le 17-06-2004 à 00:33:29  profilanswer
 

valà c'est ça:
 
http://www.tenberry.com/dpmi/09.html#01
 
tu as les decriptions de l'api DPMI, api renforcé par le Dos Extender que tu utilises (DOS4G(W) PMODE(W))

n°766626
bjone
Insert booze to continue
Posté le 17-06-2004 à 00:41:57  profilanswer
 

autant pour moi l'asm en ligne a été rajouté à la version 11 !!!

n°766629
ptitchep
Posté le 17-06-2004 à 00:46:21  profilanswer
 

Merci bien, je vais voir ce que je peux en tirer...

n°766644
ptitchep
Posté le 17-06-2004 à 01:26:24  profilanswer
 

Ok l'interruption 31h fonctionne, j'obtient bien un segment en retour mais des que je modifie es, le programme plante sauf si je modifie es comme ca:
mov ax,es
mov es,ax
ce qui ne sert pas à grand chose...
sinon, au moindre mov es,... ca plante
quand je debug avec soft ice, au moment de l'instruction mov es,... je me retrouve avec un changement de segment de code (comme un call far)et mon prog s'arrète après m'avoir affiché le contenu des registres...

n°766737
HelloWorld
Salut tout le monde!
Posté le 17-06-2004 à 09:22:05  profilanswer
 

mov es, <val> ?
Normalement c'est pas possible.
C'est soit comme t'as fait, soit push <val>, pop es


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°766987
ptitchep
Posté le 17-06-2004 à 11:46:13  profilanswer
 

ouais mais  
mov ax,<val>
mov es,ax
ca plante (pas a la compilation, pendant l'execution)
mov es,<val> ca plante a la compilation
je vais tenter push/pop

n°767138
bjone
Insert booze to continue
Posté le 17-06-2004 à 12:59:18  profilanswer
 

en mode protégé, les registres de segments sont des sélecteurs: des pointeurs sur une table décrivant le segment, qui sera chargé dans un cache spécialisé au moment de la modification du registre.
 
contrement au mode réel, il faut obsolument que ce que tu vas mettre dans un ds/es... ayes une "consistance". (ie tu peux pas mettre n'importequoi)
 
donc y'a deux manières:
 
soit tu mets dans ES ce que te retourne le DPMI dans le registre DX.
 
soit tu linéarise le segment du mode réel retourné dans AX. (soit un shift de 4 bits).
 
perso pour ma librairie vesa 2.0 de l'époque, je faisait une linéarisation des segments réels pour y accéder en mode protégé. (je passais po par le sélecteur PM)

n°767560
HelloWorld
Salut tout le monde!
Posté le 17-06-2004 à 15:38:05  profilanswer
 

En mode protégé modifier un registre de  segment est une instruction privilégiée aussi.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°767607
bjone
Insert booze to continue
Posté le 17-06-2004 à 15:57:00  profilanswer
 

exact, mais comme avec un DosExtender, l'appli est en ring 0 :D

n°768000
ptitchep
Posté le 17-06-2004 à 19:18:09  profilanswer
 

C'est cool ça marche j'ai obtenu une zone de mémoire que je peux remplir, je l'ai rempli avec des caractères que j'ai affichés avec l'int 21h. Le seul prob c'est que la fonction 4f01h de l'int 10h me renvoie tjs une opération non conforme meme avec le bon es et le bon di (j'ai vérifié avec soft-ice)
Merci pour tout ce ke vs avez deja fait, ca avance petit à petit.

n°768003
bjone
Insert booze to continue
Posté le 17-06-2004 à 19:26:11  profilanswer
 

-je suis con-
 
j'ai oublié de te dire un truc, attends je vérifies...

n°768006
bjone
Insert booze to continue
Posté le 17-06-2004 à 19:31:47  profilanswer
 

bon blague que j'ai totallement zappé:
 
bon:
 
en mode protégé, tu dois absolument avoir dans DS/ES... des selecteurs existants.
 
oki.
 
problème:
 
quand tu appelles le BIOS VESA, il te faut un segment : offset du mode réel ( < 1Mo).
 
conséquence:
 
si tu mets un SEGMENT : OFFSET dans ES : DI pour que le VESA te retourne ta structure remplie, le mode protégé te gueule dessus au moment de la modification de ES.
 
logique.
 
donc pour tous les appels VESA nécessitant un passage de segment : offset dans ES : DI par exemple tu dois utiliser la fonction DPMI 300h.
 
http://www.tenberry.com/dpmi/1101.html


Message édité par bjone le 17-06-2004 à 19:32:48
n°768010
bjone
Insert booze to continue
Posté le 17-06-2004 à 19:45:46  profilanswer
 

tiens la librairie que je m'étais faite à l'époque:
 
http://site.voila.fr/bjone/vesa.7z
 
pas de critiques, j'aimais bien tout coder en ASM, et c'était l'époque de nioubage avec du C dans des CPP :D

n°768013
ptitchep
Posté le 17-06-2004 à 19:49:39  profilanswer
 

Moi aussi j'aime bien tout coder en asm c'est plus rigolo pour debugger!
oups c'est plus dur a digérer ca...
Je m'y met tt de suite!

n°768029
ptitchep
Posté le 17-06-2004 à 20:29:31  profilanswer
 

Euh...
Tu pourrais m'expliquer un peu plus stp?

n°768030
bjone
Insert booze to continue
Posté le 17-06-2004 à 20:30:20  profilanswer
 

par rapport à l'appel DPMI ?

n°768217
bjone
Insert booze to continue
Posté le 18-06-2004 à 02:47:08  profilanswer
 
n°769461
ptitchep
Posté le 18-06-2004 à 17:36:52  profilanswer
 

comment je fais pour le virer?
Oui pour l'appel DPMI j'ai pas bien compris ce qu'il falait envoyer et ce que la fonction retournait...

n°769564
bjone
Insert booze to continue
Posté le 18-06-2004 à 19:39:05  profilanswer
 

tu l'édites, et tu as une case à cocher pour le supprimmer.
 
pour l'appel DPMI, tu as une structure à remplir, cette structure contiens l'état des registres qui seront utilisé lors de l'appel de l'interruption en mode réel.
 

n°769567
bjone
Insert booze to continue
Posté le 18-06-2004 à 19:40:38  profilanswer
 

la description de la structure est là:
http://www.tenberry.com/dpmi/11.html

n°769948
ptitchep
Posté le 19-06-2004 à 16:11:08  profilanswer
 

Je n'ai aucun problème pour "émuler" (je c pas si ce mot peux s'employer) en mode réel certaines interruption (choix du mode 800*600*8, affichage d'une chaine de caractères).
La fonction 4f01h de l'int 10h qui doit mes renvoyer des infos dont l'adresse de la mem écran ne fonctionne tjs pas! A la fin de l'int 31h je me retrouve avec mes registres "virtuels" modifiés et _ax=4f c'est à dire que la l'int 10h à fonctionné mais la zone es:di est tjs remplie avec des 0...

n°769950
ptitchep
Posté le 19-06-2004 à 16:13:04  profilanswer
 

dsl pour le smiley je voulais dire es: di

n°769952
bjone
Insert booze to continue
Posté le 19-06-2004 à 16:16:44  profilanswer
 

attention, avec la fonction 4f01h, c'est toi qui défini le ES:DI avant l'interruption mode réel (donc la structure).
 
le bios ne modifies pas ES:DI après 4f01h !!!

n°769953
bjone
Insert booze to continue
Posté le 19-06-2004 à 16:16:51  profilanswer
 

lol

n°769970
ptitchep
Posté le 19-06-2004 à 17:22:26  profilanswer
 

j'ai dans mes données des variables
_edi dd ?
_esi dd ?
...
en respectant l'ordre donné sur la page dont tu m'as filé le lien et avant de lancer int 31 je fais pointer es:edi sur _edi (le début de la structure).
Dans cette structure j'ai mis dans _es et _edi les valeurs pour que ça pointe sur la zone de mémoire qui me sert de buffer pour les données que me renvoie la fonction 4f01h. Zone mémoire qui est remplie de zéro et qui le reste malheureusement.
J'ai aussi essayé de mettre la structure dans un segment de la mémoire <1Mo (int 31h ax,100h) mon buffer est aussi dans cette mémoire. Meme résultat: 00000000000000000000...

n°769973
bjone
Insert booze to continue
Posté le 19-06-2004 à 17:35:40  profilanswer
 

dans la structure contenant le contexte de registre, dans ES : DI, tu dois mettre le segment : offset (mode réel) du buffer pour la fonction 4f01h.
 
cette structure n'a pas besoin d'être allouée < 1 Mo.

n°769998
ptitchep
Posté le 19-06-2004 à 18:41:15  profilanswer
 

Ca commence a faire un bout de tps que je m'arrache les cheveux la dessus...voila mon code, je capte pas pourquoi ça marche pas:
.386
 
.model flat
 
.stack
db 20000 dup(?)
 
.data
segment_reel dw ?
 
_edi dd 0
_esi dd 0
_ebp dd 0
     dd 0
_ebx dd 0
_edx dd 0
_ecx dd 0
_eax dd 0
_flags dw 0
_es dw 0
_ds dw 0
_fs dw 0
_gs dw 0
_ip dw 0
_cs dw 0
_sp dw 0
_ss dw 0
                   
.code
start:
mov ax,100h            
mov bx,300h
int 31h
mov segment_reel,dx
 
push es      
mov es,dx   ;on met ts les octets du futur buffer à 0
xor di,di
mov cx,300h
mise_a_zero:
mov es:[di],0
inc di
dec cx
jnz mise_a_zero    ;ya des zeros partout
 
 
mov _eax,4f01h        ;contexte de registre
mov _ecx,103h    ;mode 800*600*8=103h
mov _edi,00
mov ax,segment_reel
mov _es,ax
 
push ds             ;info pour l'int 31
pop es
mov ebx,10h
lea edi,_edi
mov eax,300h
int 31h
 
mov ax,segment_reel    ;maintenant on va voir dans le buffer
mov es,ax
xor di,di
mov ax,word ptr es:[di]
pop es
test ax,ax
jz fin                   ;si c'est encore 0, y'a une erreur
xor eax,eax     ;attend une touche si le buffer est rempli
int 16h
fin:
mov ax,4c00h
int 21h
end start

n°770005
bjone
Insert booze to continue
Posté le 19-06-2004 à 18:55:37  profilanswer
 

stop.
 
après l'int 31h / 100h, le segment en mode réel c'est dans AX qu'il est.
 
ce que tu peux mettre dans ES en mode protégé c'est le sélecteur retourné dans DX.
 
pour effacer ton buffer, fais plustôt un REP STOSD
 
de +, ton mov es:[di],0 on sait pas quelle est la taille de ton opérande.

n°770025
ptitchep
Posté le 19-06-2004 à 20:00:50  profilanswer
 

quand je mets ce qu'il y a dans ax dans es, j'ai une opération non conforme pas avec ce qu'il y a dans dx
Je peux lire et modifier sans problème le segment de mémoire obtenu ainsi.  
pour es:[di], mon assembleur me met byte ptr par defaut donc je le met jms

n°770031
bjone
Insert booze to continue
Posté le 19-06-2004 à 20:25:01  profilanswer
 

AX, le segment réel du buffer alloué, c'est dans ES de la structure qu'il faut le mettre.
 
le ES courant, le vrai, c'est DX qu'il faut mettre pour accéder au buffer alloué, mais plus tard.  
 
lors de l'appel au service de simulation d'interruption en mode réel, tu copies DS dans ES et l'offset du premier élément de ta structure dans DI pour que le service prennent bien ta structure de contexte.
 
après, pour accéder aux infos du mode:
 
soit tu remets le DX de l'étape d'allocation du buffer dans ES.
 
soit tu linéarise le segment mode réel du BUFFER en le shiftant de 4 bits vers la gauche, ce sera l'adresse linéaire & physique du buffer en mode réel. (vu qu'en mode protégé sous DOS, via un Dos Extender comme DOS/4G & PMODE, le segment de donné est basé en 0)

n°770032
bjone
Insert booze to continue
Posté le 19-06-2004 à 20:26:24  profilanswer
 

perso je prefère avoir ES&DS qui sont au même sélecteur, et de linéariser les segment mode réel en adresse linéaire/physique.

mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3

Aller à :
Ajouter une réponse
 

Sujets relatifs
programmation 32 bitsinterface graphique (ms VC++ 6 // Borland C++ builder)
Interface graphique : comment docker des JPanel de maniere définitive?Liste des languages de programmation. [Scriptol vous connaissez?]
Petit Probleme de programmationl'affichage graphique sous visual fortran avec developer studio
affichage graphique menu langage CProgrammation en Vax
Programmation OS & API Windowsalgorithme et programmation en langage c
Plus de sujets relatifs à : programmation graphique 800*600


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR