Bild wird nicht richtig erstellt für den Vic20.

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Bild wird nicht richtig erstellt für den Vic20.

Beitrag von funkheld »

Hallo, guten Tag.

Ich möchte bitte eine Grafik 176x176 Pixel umwandeln in eine Bin-Datei für den Vic20.
Es klappt mit meiner Berechnung nicht.
Das Bild ist bei jeder Zeile verschoben , das rechte Bit im Byte fängt links an und umgekehrt.
Auch die letzten Zeilen sind verschoben und passen nicht in den Screen 176x176.

Der Screen vom Vic20 ist so aufgeteilt.
- das 1. Char ist links oben und 16 Byte hoch und 1 Byte breit. in einer reihe sind 22 solcher chars.
- es sind 11 char-reihen untereinander . in jeder neuen reihe fangen die chars wieder links an.

Ich habe 3872 Byte ausgerechnet : 22x16x11
Meine Bin-datei hat 3872 Byte.

Wer kann bitte einmal helfen.
Komme damit nicht zurecht : Procedure speicher_bild()

Hier kann man das Bild sehen:
http://sleepingelephant.com/ipw-web/bul ... f=2&t=9555

Danke.
Gruss

Code: Alles auswählen

Global ByteInhalt.a,Linie.l,ByteStueck.l,EinzelBit.l,yy.l,bild.l,geladen.l
Global text1.s,text2.s,farbe.l,xline.l,yline.l,x.l,y.l

Declare lade_bild()
Declare speicher_bild()

Enumeration
  #Window_0
  #Button_0
  #Button_1
  #String_0
EndEnumeration

InitSprite()
InitKeyboard()

OpenWindow(#Window_0,780,600,500,220,"vi20 hires", #PB_Window_SystemMenu)

ButtonGadget(#Button_0, 10,10, 80, 25, "Bild laden")
ButtonGadget(#Button_1, 10,35, 80, 25, "Bild erstellen")
StringGadget(#String_0, 10, 100, 100, 20, "")

CreateImage(0, 176,176)
StartDrawing(ImageOutput(0))
Box(0,0,176,176, RGB(255,255,255))
StopDrawing()

ImageGadget(0, 160, 10, 0, 0, ImageID(0))

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
      
      If EventGadget = #Button_0
        Pattern$ = "Text (*.bin;*.bmp)"
        Pattern = 0    
        text1 = OpenFileRequester("Bitte Datei zum Laden auswählen", StandardFile$, Pattern$, Pattern)
        text1=GetFilePart(text1)
        SetGadgetText(#string_0, text1)
        lade_bild()
      EndIf
      
      If EventGadget = #Button_1
        speicher_bild()
      EndIf
      
    Case #PB_Event_CloseWindow
      EventWindow = EventWindow()
      If EventWindow = #Window_0
        CloseWindow(#Window_0)
        Break
      EndIf
  EndSelect
  
ForEver

Procedure speicher_bild()
  If text1=""
    Goto weiter
  EndIf
  
  text1=Left(text1,Len(text1)-4)
  
  CreateFile(0, "d:\winvice\bilder\"+text1+".bin")
  
  StartDrawing(ImageOutput(0))
  For yline=0 To 175 Step 16
    For xline=0 To 175 Step 8
      ByteInhalt = 0
      For y=yline To yline+15
        For x=xline To xline+7
          farbe=Point(x,y)
          If (farbe <> 0)
            ByteInhalt | (1 << (x%8))
          EndIf
          If (x % 8 = 7)
            WriteByte(0, ByteInhalt)
            ByteInhalt = 0
          EndIf
        Next
      Next
    Next
  Next
  
  StopDrawing()
  CloseFile(0)
  
  SetGadgetText(#string_0, "gespeichert")
  weiter:
  text1=""
EndProcedure

Procedure lade_bild()
  LoadImage(1,"d:\winvice\bilder\"+text1)
  StartDrawing(ImageOutput(0))
  DrawImage(ImageID(1), 0,0)
  StopDrawing()
  ImageGadget(0, 160, 10, 0, 0, ImageID(0))
EndProcedure

Gruss
Sommertv
Beiträge: 68
Registriert: 26.04.2019 10:31
Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
Wohnort: Mühldorf am Inn

Re: Bild wird nicht richtig erstellt für den Vic20.

Beitrag von Sommertv »

Schönen Abend,
soweit ich mich erinnere beherrscht der VC20 und ebenso der C64 kein Zeilensprung Verfahren.
Damit fehlt geht dem Commodore 1 Zeile (624 statt wie bei PAL üblich 625 Zeilen).
Die Pal Fernseher werden mit so einem Signal "fertig" und können das sauber darstellen.
Du erzeugst eine Bitmap mit 176x176 Pixel, ich glaube das ist auch nicht die richtige Grösse...
Zusätzlich müssen in das Bild noch die Sync Informationen mit rein, sehr wahrscheinlich ist
deshalb dein Bild bei der Darstellung verschoben.
Schau dir doch mal den Aufbau eines VC20 Bildes in einen Hexeditor an...
Hab hier leider kein Commodore Buch mehr rumliegen, aber da würd ich erst mal ansetzen.
Vielleich kann dir jemand aus dem C64 Forum einen Tip geben, der Link dazu ist:
https://www.forum64.de/index.php?board/15-vc20/

Schöne Grüsse
Kurt
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Bild wird nicht richtig erstellt für den Vic20.

Beitrag von funkheld »

Hallo, guten Tag.

Den Vic20 kann man in den Grafikmodus versetzen.
dann hat er 22 Chars in einer Reihe und 11 Chars senkrecht.
Senkrecht haben die Chars dann 16 Byte.
Wenn ich dann A und B reinschreibe erscheinen die Untereinander weil die Chars nur 8 Byte hoch sind.
Ich liege da richtig 16x22x11.

Die Grafik wird wie beim C64 gesetzt, nur das es hier 16 Byte untereinander sind und nur 22 nebeneinander.

Vielleicht kannst du mir die für 8 Byte untereinander mal herstellen bzw für den C64 Screen..
Das Prinzip zu den 16 ist dann nicht schwer für mich.

Ich verstehe die Sache mit den Bit setzen nicht damit 1 Byte voll wird von links nach rechts.

danke.
Gruss
Sommertv
Beiträge: 68
Registriert: 26.04.2019 10:31
Computerausstattung: Lenovo W500, Debian Stable, Purebasic 5.70 (momentan die Testversion)
Wohnort: Mühldorf am Inn

Re: Bild wird nicht richtig erstellt für den Vic20.

Beitrag von Sommertv »

Guten Morgen,

ein Bit wird gesetzt, indem man ein Byte mit einem bestimmten Wert ODER verknüpft.

Ein Beispiel: das ursprüngliche Byte ist $00 (binär 00000000) und es soll das 4. Bit gesetzt werden.
Dazu muss das Byte mit $08 (binär 00001000) ODER verknüpft werden.
In 6502 Assembler gibt es dazu den Maschinenbefehl ORA (ODERE den Akkuinhalt)

LDA #$ 00 Lade Akku mit 00000000
ORA #$ 08 odere den Akkuinhalt mit 00001000 (4. Bit Zählweise beginnt immer rechts)
Im Akku steht jetzt 00001000 (STA... store Akku)

Ein weiteres Beispiel:
LDA #$ 47 Lade Akku mit 01000111
ORA #$ 08 odere mit 00001000 (4. Bit setzen)
damit steht im Akku 01001111 also $4F

Willst du bei den Beispielen Bit 5 setzen, müsstest du mit $10 also 00010000 ODERN

Um ein Bit zu löschen geht man wie folgt vor:

Beispiel:
LDA #$ 4F Lade Akku mit 01001111
AND #$ 47 UNDiere mit 01000111 (Bit 4 ist 0 also löschen)

Für ODER gilt : 1 oder 1 = 1 sowie 1 oder 0 = 1 sowie 0 oder 0 = 0
Für UND gilt: 1 und 1 = 1 sowie 0 und 1 = 0

Hab mich noch nicht damit befasst, aber die binären Verknüpfungen gibt es sicher auch in Purebasic und die Vorgehensweise ist die gleiche.


Schöne Grüsse
Kurt
Wenn einem die einfachen Dinge net einfallen, klappt's meistens umständlich...
funkheld
Beiträge: 636
Registriert: 31.12.2009 11:58

Re: Bild wird nicht richtig erstellt für den Vic20.

Beitrag von funkheld »

Danke für die Info.


Gruss
Antworten