Grafikdaten für den CPC6128 aufarbeiten...

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von super_castle »

Ich möchte ein s/w-Bild in der Grösse 320*200 Byteweise abspeichern.
Dieses Format hat auch der CPC6128.
Bloss der Bildschirmaufbau beim CPC ist nicht Zeilenweise untereinander.

Wenn ich die ersten 80Byte einlese, wird die nächste Zeile ab dem 81. Byte 8 Pixelzeilen tiefer angefangen.
Wenn ich unten rechts angekommen bin , fängt der Grafikaufbau bei der 2. Zeile oben links an, so geht es weiter bis zur 8. Zeile.

Wie kann man jetzt die Daten oben abspeichern, das diese Byte einfach nur vom CPC eingelesen werden und ausgegeben werden.
Irgendwie finde ich für Purebasic den Weg nicht.

Gruss
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von Kaeru Gaman »

die Reihenfolge ist simpel eine Frage der Schleifenschachtelung.

Pseudocode:

Code: Alles auswählen

For Staffel = 0 To 7
  For Linie = 0 To 24
    For ByteStueck = 0 To 79
      ByteInhalt = 0
      For EinzelBit = 0 To 7
        If Point( ByteStueck * 8 + 7 - Einzelbit , Linie * 8 + Staffel )
          ByteInhalt + 2 ^ Einzelbit
        EndIf
      Next
      Output( ByteInhalt )
    Next
  Next
Next
ob die Ausrichtung der 8 bits so richtigrum ist, oder ob du sie umdrehen musst, musst du ausprobieren.
ist halt die Frage, ob das erste Pixel durch die 128 oder durch die 1 repräsentiert wird.
so wie's oben steht ist die 128 links, so ist das eigentlich üblich.

aber ob es genügt, die RAW Daten in der richtigen Reihenfolge hintereinander zu packen, damit der CPC sie lesen kann, ist eben die Frage.
wenn du die als ein File speichern willst, wirst du auch noch einen Header benötigen.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von super_castle »

Jup, danke.
aber ob es genügt, die RAW Daten in der richtigen Reihenfolge hintereinander zu packen, damit der CPC sie lesen kann, ist eben die Frage.
Es werden die Daten der Reihenfolge nach eingelesen. Wenn er das 81.Byte einliest, dann wird es 8Pixelreihen tiefer ganz links gesetzt und dann geht es daneben wieder weiter...

Gruss
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von super_castle »

Code: Alles auswählen

ByteInhalt + 2 ^ Einzelbit
Dieses zeichen gibt es nicht ^ in Pure. Was setzt man da.

Gruss
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von Kaeru Gaman »

Code: Alles auswählen

ByteInhalt + ( 1 << Einzelbit )
... deswegen stand da pseudocode dran...
man beschreibt das eben als "zwei hoch bitstelle", aber in PB gibt es nur eine Pow-Funktion für Floats, die ist hier unangebracht, deswegen Bitshift verwenden.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von super_castle »

Jup, jetzt funktioniert es. Ich kann das Bild direkt im Mode 2 einlesen (s/w-Bild) beim Cpc6128.
BmpBild 320x200 2Farbig wird einlesen und als Bin-Datei ausgegeben.

Man muss am ende des Bildschirm immer 48 Byte dazusetzen weil die Bildzeile bis 2048 zählt, also 25*80+48.

Jup , Danke.

Gruss

Code: Alles auswählen

Global ByteInhalt.c,Staffel.l,Linie.l,ByteStueck.l,EinzelBit.l,zz.l
  
  InitSprite()
  OpenWindow(0,0,0,800,600,"cpctest",#PB_Window_SystemMenu|#PB_Window_SizeGadget|#PB_Window_ScreenCentered)
  OpenWindowedScreen(WindowID(0),10,10,700,400,0,0,0)
  
  OpenConsole()
  
  ClearScreen(RGB(255,255,0))
  
  LoadSprite(0, "cpctest.bmp", #PB_Sprite_Texture)
  DisplaySprite(0,0,0)
  
  Repeat
    
    Event.l = WindowEvent()   
    
    If GetAsyncKeyState_(#VK_Q)   
      If CreateFile(0, "byte.bin")  
        PrintN("es gehtlos..")
        StartDrawing(SpriteOutput(0))     
        For Staffel = 0 To 7
          For Linie = 0 To 24
            For ByteStueck = 0 To 79
              ByteInhalt = 0
                For EinzelBit = 0 To 7
                  If Point( ByteStueck * 8 + 7 - Einzelbit , Linie * 8 + Staffel ) 
                    ByteInhalt + ( 1 << Einzelbit )
                  EndIf
                Next
              WriteCharacter(0, ByteInhalt)
            Next
          Next
          ByteInhalt=0
          For zz=0 To 47
            WriteCharacter(0, Byteinhalt)
          Next  
        Next 
      EndIf
      StopDrawing()
      CloseFile(0)  
      PrintN("fertig...")
    EndIf
     
    FlipBuffers() 
     
    Until Event = #PB_Event_CloseWindow   

End 
LCD
Beiträge: 107
Registriert: 23.01.2008 13:13
Wohnort: Wien

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von LCD »

Sowas hatte ich auch schon in meinem Retro-X verwendet, allerdings ist da ein kompletter Konverter dran, der nicht nur die CPC, sondern auch einige C64, Spectrum, Amiga usw. Modes beherrscht. Die Retro-Computer Bildformate sind faszinierend, vor allem aber kompliziert.
PB 4.61Beta1 32/64Bit. AMD FX6100, 8 GB RAM, ATI Radeon 5750, Win7 64 (64 bit ist mist weil 16-Bit Programme wie MakeTZX nicht mehr darauf funktionieren).
super_castle
Beiträge: 557
Registriert: 29.11.2005 15:05

Re: Grafikdaten für den CPC6128 aufarbeiten...

Beitrag von super_castle »

ist da ein kompletter Konverter dran, der nicht nur die CPC, sondern auch einige C64, Spectrum, Amiga usw. Modes beherrscht.
Zuviel da drin ist ungesund.

Ich mag das nicht wenn das Programm so zugemüllt wird.
ConvImgCpc
Der für den CPC und CPC+ ist auch so vollgemüllt.

Darum habe ich meinen eigenen.


Gruss
Antworten