Page 1 sur 2

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

Publié : dim. 25/août/2013 18:06
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?

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

Publié : lun. 26/août/2013 8:50
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

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

Publié : lun. 26/août/2013 18:27
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

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

Publié : lun. 26/août/2013 20:17
par djes
Avec plaisir :)

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

Publié : mar. 27/août/2013 23:08
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

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

Publié : mar. 27/août/2013 23:45
par G-Rom
tu as les fichier IM1 & IM2 en ligne ?

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

Publié : mer. 28/août/2013 9:07
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!!!!!)

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

Publié : mer. 28/août/2013 9:43
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.

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

Publié : mer. 28/août/2013 17:54
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é.

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

Publié : jeu. 29/août/2013 14:28
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

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

Publié : jeu. 29/août/2013 20:27
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

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

Publié : ven. 30/août/2013 21:20
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

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

Publié : sam. 31/août/2013 10:21
par G-Rom
ton grabsprite ne sert à rien ? tu as deja dessiner dedans non ?

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

Publié : sam. 31/août/2013 13:10
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.

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

Publié : dim. 01/sept./2013 11:31
par G-Rom
j'ai eu le temps de testé ton code, chez moi , ca marche bien , win7 x64.