Quel est le codage mèmoire d'un ecran EGA ?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

Bonjour à tous,
En ce moment, je dois créer un programme pour le boulot qui doit afficher à l"écran le synoptique d'une installation provenant de deux fichiers binaires issue d'une résolution EGA. De plus, ces fichiers sont issues du code suivant en PowerBasic.

Code : Tout sélectionner

SYNOPTIQUES:

	SCREEN 9,0,1,1
	IF SYNO%=1 THEN RETURN
	SYNO%=1
	ec=4+INT((640*2+7)/8)*200
	DIM image%(ec),image1%(ec)
	DEF SEG=VARSEG(image%(0))
		BLOAD "c:\SYRIUS\"+SYNO$+"IM1",VARPTR(image%(0))
	DEF SEG

	DEF SEG=VARSEG(image1%(0))
		BLOAD "c:\SYRIUS\"+SYNO$+"IM2",VARPTR(image1%(0))
	DEF SEG

	PUT (0,0),image%
	PUT (0,200),image1%
	ERASE image%,image1%
RETURN
La résolution de cet écran est 640 x 350 x 16 couleurs.
J'ai fais une recherche sur le net et ils disent que le codage est RVBrvb donc 6 bits par pixels. Mais j'arrive pas à afficher ces deux morceaux d'image.

Avez-vous une piste?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par djes »

Voilà les modes graphiques disponibles sur les cartes EGA : http://webpages.charter.net/danrollins/ ... p/0089.HTM

Le 640x350x16 couleurs est le mode $10, chaque octet contient huit pixels, et il y a quatre plans (correspondant aux 4 bits nécessaires pour former le numéro de la couleur choisie dans la palette).

Voilà les spécifications complètes du mode EGA : http://www.minuszerodegrees.net/oa/OA%2 ... dapter.pdf

Et l'instruction screen du GW : http://www.antonis.de/qbebooks/gwbasman/screens.html
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

Salut cher voisin,

Merci pour ces infos. je vais regarder les documents.

Quand tu veux pour ch'ti café, je suis en vacance.

Cordialement
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par djes »

Avec plaisir :)
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

je dois être une quiche, l'image s'affiche décalée.

Je lis les plans grace à :

Valeur_plan(plan) = 28000*plan + y*80 +x/8

je me suis servis du code suivant (je n'utilise que 16 couleurs sur les 64).

Code : Tout sélectionner

DataSection
	Image1:
	IncludeBinary "65801.IM1"
	Image2:
	IncludeBinary "65801.IM2"
EndDataSection
Dim Couleur(15)
Couleur(0)=0
Couleur(1)=RGB(255,0,0)
Couleur(2)=RGB(0,255,0)
Couleur(3)=RGB(0,0,255)
Couleur(4)=RGB(255,0,255)
Couleur(5)=RGB(0,255,255)
Couleur(6)=RGB(255,255,255)
Couleur(7)=RGB(128,255,255)
Couleur(8)=RGB(128,128,255)
Couleur(9)=RGB(128,128,128)
Couleur(10)=RGB(0,128,128)
Couleur(11)=RGB(0,0,128)
Couleur(12)=RGB(128,0,0)
Couleur(13)=RGB(128,128,0)
Couleur(14)=RGB(64,128,64)
Couleur(15)=RGB(64,64,64)
InitKeyboard()
InitSprite()
OpenScreen(1024,768,32,"Synoptique Images")


ClearScreen(0)
x=0:y=0

Dim Plane_set.u(4)

StartDrawing(ScreenOutput())
*Image=?Image1
Repeat
	; lecture de huit pixels par plan
	For i=0 To 3
		Plane_set(i)=PeekA(*image+28000*i+y*80+(x/8))
	Next i
	; recherche de la couleur de chaque pixel
	For i=0 To 7
		n1=(Plane_set(0)>>i) & %1
		n2=(Plane_set(1)>>i) & %1
		n3=(Plane_set(2)>>i) & %1
		n4=(Plane_set(3)>>i) & %1
		
		Index=(n1<<3 | n2<<2 | n3<<1 | n4)/4
		
		Plot(x+(7-i),y,couleur(Index))
	Next i
	x+8
	If x>639
		x=0
		y+1
	EndIf
Until y>349

StopDrawing()
FlipBuffers()
Repeat
	ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par G-Rom »

tu as les fichier IM1 & IM2 en ligne ?
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par djes »

Le code ne m'a pas l'air mal, il doit y avoir une petite erreur à la con. G-Rom a raison, il nous faut les images pour aller plus loin, mais j'imagine que tu ne veux pas qu'on les voit (il faut quand même une sacrée bonne raison pour vouloir récupérer des images EGA!!!!!)
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

Donner moi vos adresse Email et je vous donnerai accès à mon Drive Google ou se trouvent mes fichiers.

@Djes, le but est de réaliser un éditeur graphique en purebasic pour modifier le synoptique et sauver sous forme de ces deux fichiers le résultat.
Car nous ne voulons pas modifier le logiciel d'origine qui lui est sous Powerbasic.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par G-Rom »

j'ai pas trop eu le temps de me pencher dessus , à première vue y a un truc qui cloche avec l'alignement des pixels :

Code : Tout sélectionner

Valeur_plan(plan) = 28000*plan + y*80 +x/8
n'a pas l'air d'être bon avec le reste,

Code : Tout sélectionner

For i=0 To 3
      Plane_set(i)=PeekA(*image+28000*i+y*80+(x/8))
   Next i
tu lis les 4 premiers byte pour la couleur , ok
mais ta formule ne me parait pas correcte , les fichiers font 64016 bytes , même en faisant 28000*3+349*80+(639/8) , avec les valeurs maximum donc, je n'arrive jamais à lire partout dans le fichier, d'ou je pense l'image tronqué.
Avatar de l’utilisateur
djes
Messages : 4252
Inscription : ven. 11/févr./2005 17:34
Localisation : Arras, France

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par djes »

Je me suis trompé dans la doc, c'est celle-ci qui est valable : http://www.gladir.com/CODER/POWERBASIC/screenproc.htm
Du coup la proc de lecture/sauvegarde ne correspond pas.

Voilà :

Code : Tout sélectionner

DataSection
   Image1:
   IncludeBinary "65801.IM1"
   Image2:
   IncludeBinary "65801.IM2"
EndDataSection
Dim Couleur(15)
Couleur(0)=0
Couleur(1)=RGB(255,0,0)
Couleur(2)=RGB(0,255,0)
Couleur(3)=RGB(0,0,255)
Couleur(4)=RGB(255,0,255)
Couleur(5)=RGB(0,255,255)
Couleur(6)=RGB(255,255,255)
Couleur(7)=RGB(128,255,255)
Couleur(8)=RGB(128,128,255)
Couleur(9)=RGB(128,128,128)
Couleur(10)=RGB(0,128,128)
Couleur(11)=RGB(0,0,128)
Couleur(12)=RGB(128,0,0)
Couleur(13)=RGB(128,128,0)
Couleur(14)=RGB(64,128,64)
Couleur(15)=RGB(64,64,64)
InitKeyboard()
InitSprite()
OpenScreen(1024,768,32,"Synoptique Images")


ClearScreen(0)
x=0:y=0

Dim Plane_set.u(4)

StartDrawing(ScreenOutput())
*Image=?Image1 + 10 ; je ne sais pas à quoi servent les 10 premiers octets...?
Repeat
	; lecture de huit pixels par plan
	pos = y*320+(x/8)
   For i=0 To 3
      Plane_set(i)=PeekA(*Image+80*i + pos)
   Next i
   ; recherche de la couleur de chaque pixel
   For i=0 To 7
      n1=(Plane_set(0)>>i) & %1
      n2=(Plane_set(1)>>i) & %1
      n3=(Plane_set(2)>>i) & %1
      n4=(Plane_set(3)>>i) & %1
      
      Index=(n1<<3 | n2<<2 | n3<<1 | n4)
      
      Plot(x+(7-i),y,couleur(Index))
   Next i
   x+8
   If x>639
      x=0
      y+1
   EndIf
 Until y>199
 
 *Image=?Image2 + 10
 x = 0
 y = 0
 Repeat
	; lecture de huit pixels par plan
	pos = y*320+(x/8)
   For i=0 To 3
      Plane_set(i)=PeekA(*Image+80*i + pos)
   Next i
   ; recherche de la couleur de chaque pixel
   For i=0 To 7
      n1=(Plane_set(0)>>i) & %1
      n2=(Plane_set(1)>>i) & %1
      n3=(Plane_set(2)>>i) & %1
      n4=(Plane_set(3)>>i) & %1
      
      Index=(n1<<3 | n2<<2 | n3<<1 | n4)
      
      Plot(x+(7-i),y+200,couleur(Index))
   Next i
   x+8
   If x>639
      x=0
      y+1
   EndIf
 Until y>149

StopDrawing()
FlipBuffers()
Repeat
   ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End
Au début de chaque image, il y a quelques octets dont j'ignore l'utilité. Peut-être est-ce la palette ? Il faudrait la doc complète de PUT/GET du powerbasic, ce que j'ai est incomplet : http://www.gladir.ca/CODER/POWERBASIC/get.htm
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

Merci à vous deux, et vous aviez raison. le décalage était dus au nombre d'octets d'un plan et des 10 octets de début de fichier.
en voici le code final.

Code : Tout sélectionner

DataSection
	Image1:
	IncludeBinary "66901.IM1"
	Image2:
	IncludeBinary "66901.IM2"
	Image3: 
	
	Table_Couleurs:
	Data.s "$000000","$0000aa","$00aa00","$00aaaa","$aa0000","$aa00aa","$aaaa00","$aaaaaa"
	Data.s "$000055","$0000ff","$00aa55","$00aaff","$aa0055","$aa00ff","$aaaa55","$aaaaff"
	Data.s "$005500","$0055aa","$00ff00","$00ffaa","$aa5500","$aa55aa","$aaff00","$aaffaa"
	Data.s "$005555","$0055ff","$00ff55","$00ffff","$aa5555","$aa55ff","$aaff55","$aaffff"
	Data.s "$550000","$5500aa","$55aa00","$55aaaa","$ff0000","$ff00aa","$ffaa00","$ffaaaa"
	Data.s "$550055","$5500ff","$55aa55","$55aaff","$ff0055","$ff00ff","$ffaa55","$ffaaff"
	Data.s "$555500","$5555aa","$55ff00","$55ffaa","$ff5500","$ff55aa","$ffff00","$ffffaa"
	Data.s "$555555","$5555ff","$55ff55","$55ffff","$ff5555","$ff55ff","$ffff55","$ffffff"
	; les index des 16 couleur par défaut
	Index_Couleurs:
	Data.b 0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63
EndDataSection
Dim Couleur.l(15)
Dim Palette.s(64) ; Valeurs RVB

Restore Table_Couleurs
For i=0 To 63
	Read.s Palette(i)

Next i

Restore Index_Couleurs
For i=0 To 15
	Read.b Index
	Couleur(i)=Val(Palette(Index))
Next i
InitKeyboard()
InitSprite()
OpenScreen(640,480,32,"Synoptique Images")


ClearScreen(0)
x=0:y=0

Dim Plane_set.u(4)
StartDrawing(ScreenOutput())
*Image=?Image1 + 10 ; je ne sais pas à quoi servent les 10 premiers octets...?
Repeat
		; lecture de huit pixels par plan
		pos = y*320+(x/8)
		For i=0 To 3
			Plane_set(i)=PeekA(*Image+80*i + pos)
		Next i
		; recherche de la couleur de chaque pixel
		For i=0 To 7
			n1=(Plane_set(0)>>i) & %1
			n2=(Plane_set(1)>>i) & %1
			n3=(Plane_set(2)>>i) & %1
			n4=(Plane_set(3)>>i) & %1
			
			Index=(n1<<3 | n2<<2 | n3<<1 | n4)
			
			Plot(x+(7-i),y,couleur(Index))
		Next i
		x+8
		If x>639
			x=0
			y+1
		EndIf
Until y>199

*Image=?Image2 + 10
x = 0
y = 0
Repeat
		; lecture de huit pixels par plan
		pos = y*320+(x/8)
		For i=0 To 3
			Plane_set(i)=PeekA(*Image+80*i + pos)
		Next i
		; recherche de la couleur de chaque pixel
		For i=0 To 7
			n1=(Plane_set(0)>>i) & %1
			n2=(Plane_set(1)>>i) & %1
			n3=(Plane_set(2)>>i) & %1
			n4=(Plane_set(3)>>i) & %1
			
			Index=(n1<<3 | n2<<2 | n3<<1 | n4)
			
			Plot(x+(7-i),y+200,couleur(Index))
		Next i
		x+8
		If x>639
			x=0
			y+1
		EndIf
Until y>149

StopDrawing()
FlipBuffers()
Repeat
		ExamineKeyboard()
Until KeyboardPushed(#PB_Key_Escape)
End
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

Une chose très bizarre se passe lors la sauvegarde de l'image. L'image affichée à les bonnes couleurs alors que l'image sauvée sur le disque a subi un changement de couleurs comme un "xor". Après vérification, mon compilateur avait en option sous système "DirectX11".
Si je supprime l'option, l'image affichée ne comporte plus les bonnes couleurs.
Sans compter que l'instruction Savesprite donne une image vide.

Code : Tout sélectionner

DataSection
	Image1:
	IncludeBinary "66901.IM1"
	Image2:
	IncludeBinary "66901.IM2"
	Image3: 
	
	Table_Couleurs:
	Data.s "$000000","$0000aa","$00aa00","$00aaaa","$aa0000","$aa00aa","$aaaa00","$aaaaaa"
	Data.s "$000055","$0000ff","$00aa55","$00aaff","$aa0055","$aa00ff","$aaaa55","$aaaaff"
	Data.s "$005500","$0055aa","$00ff00","$00ffaa","$aa5500","$aa55aa","$aaff00","$aaffaa"
	Data.s "$005555","$0055ff","$00ff55","$00ffff","$aa5555","$aa55ff","$aaff55","$aaffff"
	Data.s "$550000","$5500aa","$55aa00","$55aaaa","$ff0000","$ff00aa","$ffaa00","$ffaaaa"
	Data.s "$550055","$5500ff","$55aa55","$55aaff","$ff0055","$ff00ff","$ffaa55","$ffaaff"
	Data.s "$555500","$5555aa","$55ff00","$55ffaa","$ff5500","$ff55aa","$ffff00","$ffffaa"
	Data.s "$555555","$5555ff","$55ff55","$55ffff","$ff5555","$ff55ff","$ffff55","$ffffff"
	; les index des 16 couleur par défaut
	Index_Couleurs:
	Data.b 0,1,2,3,4,5,20,7,56,57,58,59,60,61,62,63
EndDataSection
Dim Couleur.l(15)
Dim Palette.s(64) ; Valeurs RVB

Restore Table_Couleurs
For i=0 To 63
	Read.s Palette(i)
	
Next i

Restore Index_Couleurs
For i=0 To 15
	Read.b Index
	Couleur(i)=Val(Palette(Index))
Next i

Enumeration
	#Image_synoptique
	#Sprite_synoptique
EndEnumeration

InitKeyboard()
;KeyboardMode(#PB_Keyboard_International)
InitSprite()
OpenScreen(640,480,32,"Synoptique Images")

UsePNGImageEncoder()
UseJPEGImageEncoder()
ClearScreen($aaaaaa)
x=0:y=0
CreateImage(#Image_synoptique,640,350,32)
CreateSprite(#Sprite_synoptique,640,350,#PB_Sprite_AlphaBlending)
Dim Plane_set.u(4)
StartDrawing(ImageOutput(#Image_synoptique))
*Image=?Image1 + 10 ; je ne sais pas à quoi servent les 10 premiers octets...?
Repeat
	; lecture de huit pixels par plan
	pos = y*320+(x/8)
	For i=0 To 3
		Plane_set(i)=PeekA(*Image+80*i + pos)
	Next i
	; recherche de la couleur de chaque pixel
	For i=0 To 7
		n1=(Plane_set(0)>>i) & %1
		n2=(Plane_set(1)>>i) & %1
		n3=(Plane_set(2)>>i) & %1
		n4=(Plane_set(3)>>i) & %1
		Index=(n1<<3 | n2<<2 | n3<<1 | n4)
		;Index=(n4<<3 | n3<<2 | n2<<1 | n1)
		
		Plot(x+(7-i),y,Couleur(Index))
	Next i
	x+8
	If x>639
		x=0
		y+1
	EndIf
Until y>199
*Image=?Image2 + 10
x = 0
y = 0
Repeat
	; lecture de huit pixels par plan
	pos = y*320+(x/8)
	For i=0 To 3
		Plane_set(i)=PeekA(*Image+80*i + pos)
	Next i
	; recherche de la couleur de chaque pixel
	For i=0 To 7
		n1=(Plane_set(0)>>i) & %1
		n2=(Plane_set(1)>>i) & %1
		n3=(Plane_set(2)>>i) & %1
		n4=(Plane_set(3)>>i) & %1
		
		Index=(n1<<3 | n2<<2 | n3<<1 | n4)
		;Index=(n4<<3 | n3<<2 | n2<<1 | n1)
		Plot(x+(7-i),y+200,Couleur(Index))
	Next i
	x+8
	If x>639
		x=0
		y+1
	EndIf
Until y>149

StopDrawing()
ClearScreen(0)
	StartDrawing(ScreenOutput())
	DrawingMode(#PB_2DDrawing_Default )
	DrawImage(ImageID(#Image_synoptique),0,0)
	StopDrawing()
FlipBuffers()
Repeat
	ExamineKeyboard()
	ClearScreen(0)
	StartDrawing(ScreenOutput())
	DrawingMode(#PB_2DDrawing_Default )
	DrawImage(ImageID(#Image_synoptique),0,0)
	StopDrawing()
	
	
	If KeyboardPushed(#PB_Key_S)
		GrabSprite(#Sprite_synoptique,0,0,640,350,#PB_Sprite_AlphaBlending)
		SaveSprite(#Sprite_synoptique,GetCurrentDirectory()+"Synoptique.png",#PB_ImagePlugin_PNG)
		SaveImage(#Image_synoptique,GetCurrentDirectory()+"Synoptique.bmp",#PB_ImagePlugin_BMP)
	EndIf
	FlipBuffers()
Until KeyboardPushed(#PB_Key_Escape)
FreeImage(#Image_synoptique)
FreeSprite(#Sprite_synoptique)
End
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par G-Rom »

ton grabsprite ne sert à rien ? tu as deja dessiner dedans non ?
Avatar de l’utilisateur
Eric
Messages : 79
Inscription : dim. 08/juil./2007 21:38
Localisation : Nord
Contact :

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par Eric »

Crois-tu que c'est cela qui donne un sprite vide ?
A la base, je voulais récupérer que les 350 premières lignes de l'image.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Quel est le codage mèmoire d'un ecran EGA ?

Message par G-Rom »

j'ai eu le temps de testé ton code, chez moi , ca marche bien , win7 x64.
Répondre