Seite 1 von 1

Grafikdaten für den CPC6128 aufarbeiten...

Verfasst: 26.11.2009 12:28
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

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

Verfasst: 26.11.2009 13:23
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.

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

Verfasst: 26.11.2009 13:48
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

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

Verfasst: 26.11.2009 14:18
von super_castle

Code: Alles auswählen

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

Gruss

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

Verfasst: 26.11.2009 14:27
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.

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

Verfasst: 26.11.2009 17:00
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 

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

Verfasst: 28.11.2009 20:50
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.

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

Verfasst: 04.12.2009 18:33
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