Hallo Besucher, der Thread wurde 6,2k mal aufgerufen und enthält 24 Antworten

letzter Beitrag von dqh_ am

VICE x128 und VDC: Kein Interlace möglich?

  • Ich konvertiere gerade die C128-Sachen von GoDot nach ACME (muss mich etwas von meinen anderen Projekten: goDos und NUFLI erholen) und probiere dabei natürlich alles aus (und nötigenfalls wird die Sachen auch mal eben verbessert). Dabei handelt es sich so gut wie durchgehend um Module, die sich mit dem VDC beschäftigen (also die GoDot-Grafik auf dem VDC in verschiedenen Auflösungen anzeigen). Dabei stelle ich fest, dass alle Module, die irgendwie im VDC den Hardware-Interlace aktivieren wollen (Register 8), scheitern. Vor langer Zeit hab ich mal ein VDC-Untersuchungsmodul geschrieben (VDCEd), das ich natürlich sofort wieder hervorgekramt hab. Auch dort funktioniert der Interlace nicht. Darüber hinaus hat die Veränderung von sehr vielen Registern keinerlei Auswirkungen auf die VDC-Anzeige von VICE. Das Umschalten in den doppelt breiten Zeichenmodus (Register 25) führt sogar zu einem Totalabsturz. Was ist da los? Ist die VDC-Emulation etwa buggy (um nicht zu sagen völliger Schrott)?


    Das wäre echt sch*e, denn ich hab meinen DCR (Blech) nicht mehr und kann das alles nicht auf real Hardware checken!


    Arndt

  • Die VDC-Emulation in VICE ist in der Tat... ...suboptimal. Verändert man z.B. die Zeichengröße auf 9x10 Pixel (was einen 1901-Monitor besser ausnutzt und die Lesbarkeit enorm steigert), zeigt VICE nur ein schwarzes Bild. Wäre dem nicht so, hätte ich diese Registermanipulation in meine letzten beiden VDC-Programme eingebaut, so wie damals(tm).
    Sowas wie Interlace würde ich daher in naher Zukunft eher nicht erwarten.


    Ja, theoretisch könnte ich durchaus dazu beitragen, diese Situation zu verbessern, aber praktisch hat man halt nicht unendlich viel Zeit...

  • Die VDC-Emulation von VICE ist in der Tat SEHR verbesserungsbedürfig. Anscheinend ist der ursprüngliche Programmierer aber gar nicht mehr aktiv im VICE-Team und für Interlace wäre vermutlich ein komplettes Refactoring notwendig. Die Chancen stehen also sehr gering.


    Allerdings gibt es mit Z64K inzwischen einen Emulator, der dies hervorrgagend bewältigt. Hier klappen die ganzen VDC-Interlace-Modes einwandfrei. BTW: Auch für den NTSC-VIC-20 ist dies der einzige Emulator, der den Interlace-Mode beherrscht.

  • Allerdings gibt es mit Z64K inzwischen einen Emulator, der dies hervorrgagend bewältigt.

    Holla! Das ist ja mal eine super Information! Danke, danke, danke! Das Teil läuft bereits - bestens! :-) :-) :-)


    Arndt

  • So, Testphase beendet. Ich bin nicht ganz sicher, ob die VDC-Anzeigen *wirklich* dem entsprechen, was ein echter C128 zeigen würde. Mir fällt jedenfalls auf, dass bei Z64 das VDC-Fenster (sehr viel!) größer oder kleiner wird, wenn man an den Registern herummanipuliert. Soll *das* die veränderte Auflösung darstellen? Hehe, ein witziger Versuch! :kruecke:


    Wer verrät mir denn mal eine stabile Registereinstellung des VDC für 640x400 interlaced monochrom? Ich krieg auch mit Z64 da nichts Vorzeigbares hin. Immerhin hab ich jetzt 640x200 sauber rausgetüftelt. Hier:



    Das ist mit GoDots ShowVDCFloyd (noch nicht auf der Disk und im Online-Handbuch) gemacht. Die Höhe 200 wird beim Rendern verdoppelt, so dass das Bild die Maße 640x400 hat. Die Pixel sind hier also doppelt hoch. Im Interlace sollte ein echtes 640x400-Bild dabei rauskommen. Es wird von ShowVDCFloyd auch so gerendert, aber eine korrekte Anzeige klappt nicht.


    Arndt

  • Für Interlace-Modes ist wichtig, dass Register 4 und 6 den selben Wert haben und auch Register 9 und 5. Sonst klappt Interlace überhaupt nicht.


    Daher würde ich sagen hier die VDC-Register wie folgt setzen:
    - Register 4 und 6 auf jeweils 64 (NTSC) oder 76 (PAL).
    - Register 7 auf 58 (NTSC) oder 64 (PAL)
    - Register 5 und 9 auf 7
    - Register 25 natürlich auf 135.


    Zu beachten ist bei Interlace weiterhin, dass (weil Register 4 und 6 gleich sein müssen), der gesamte anzeigbare Bereich auch Grafikdaten aufnehmen kann. Die erforderliche Gleichheit von Register 5 und 9 addiert noch ein paar weitere Zeilen. D.h. die reale Auflösung ist z. B. bei PAL: (76+1)*8+7=623 Zeilen. Dies ist so nah am PAL-Standard wie man kommt. Man muss dann aber natürlich die entsprechenden Zeilen im Bild oben und unten schwärzen (also mit 0 füllen).


    Man könnte theoretisch sicher auch einen Mode mit nur 400 anzeigbaren Zeilen definieren, den würde aber kaum ein Monitor vernünftig anzeigen können, das wäre damit unpraktikabel.

  • Allerdings gibt es mit Z64K inzwischen einen Emulator, der dies hervorrgagend bewältigt.

    Den bekomme ich nicht ordentlich zum Laufen. Was muss man den machen, wenn man ein Sternchen wie bei RUN"*" eintippen will? Ich habe die gesamte Tastatur abgesucht ... Fehlanzeige!

  • Kann man auf 0 setzen sicherheitshalber. Ich würde sagen, dies ist vor allem wichtig bei horizontalen Auflösungen > 640 und wenn man Attribute nutzt. Mir ist jedenfalls kein Fall bekannt, wo das Setzen auf 0 *negative* Effekte gehabt hätte.


    Für andere Auflösungen kannst Du mal in mein VDC Mode Mania schauen. Die Registerbelegungen für die verschiedenen Auflösungen sind da im BASIC-Source-Code hinterlegt.

  • Was muss man den machen, wenn man ein Sternchen wie bei RUN"*" eintippen will?

    Wie vorgeschlagen: In der Konfiguration den Keyboard-Editor aufrufen, am besten vorher die VICE-Tastatur aus dem C64-Wiki ausdrucken, die zu ändernde Taste anklicken und auf dem Keyboard die gewünschte Taste drücken, am Schluss "sparen" (hehe..., das soll dann wohl "speichern" heißen) anklicken. Am besten auch Save on Exit anhaken, dann ist die ganze Konfiguration gesichert.


    die VDC-Register wie folgt setzen:
    - Register 4 und 6 auf jeweils 64 (NTSC) oder 76 (PAL).
    - Register 7 auf 58 (NTSC) oder 64 (PAL)
    - Register 5 und 9 auf 7
    - Register 25 natürlich auf 135.

    Funktioniert nicht. Ich hab jetzt weiter rumprobiert und eine Einstellung gefunden, die fast richtig ist:



    Die senkrechte Positionierung ist um 8 Pixel falsch. Ich finde aber nichts, wo ich das beeinflussen könnte. Das muss man tun:


    In der Konfiguration die Bildschirmgröße auf "Single" stellen (wichtig!), Deinterlacing auf "Weaving" (sonst hat man senkrechte Streifen). Jetzt die Register (PAL):


    8 auf 3 (Interlace ein)
    9 auf 15 (Zeichenhöhe auf 16 (Wert+1))
    4 auf 76 (wie vorgeschlagen)
    6 auf 50 (das ist eben die doppelte Höhe des Standardbildschirms, die Zeichenhöhe ist ja auch doppelt groß)
    7 auf 62 (das rückt die Ausgabe ungefähr in die VDC-Screen-Mitte)
    Adjust (5) kann so bleiben, hat keine hier Auswirkungen, ebenso VSync (3, upper nibble).
    DRam (36) hab ich noch nicht ausprobiert.


    Für andere Auflösungen kannst Du mal in mein VDC Mode Mania schauen.

    Oh, interessant! Farbe! ;-)


    Arndt

  • Also meine Einstellung oben hab ich auf dem C128 und 1901-Monitor getestet gestern abend. Bei den ganzen VDC-Sachen darfst Du eigentlich niemals auf die Emulatoren vertrauen. Deine Einstellungen geben beim C128 und 1901 nur ein durchlaufendes Bild. Also immer erst auf dem C128 mit 1901 oder 1084 testen und dann schauen, ob es im Emu auch noch läuft (Z64K ist dafür momentan die beste Wahl, aber eben noch work-in-progress). Der Programmierer des Emulators hat seinen Emulator dahingehend optimiert, dass er die VDC Mode Mania-Modes (und ein paar andere) darstellen kann. Das heißt aber nicht, dass da nicht noch einiges fehlen würde.


    Grundsätzlich muss man beim VDC immer so einige Sachen mehr bedenken, damit es auch auf möglichst vielen Monitoren darstellbar ist. Du kannst mit den VDC-Registern die Bildhorizontal- und Vertikalfrequenzen quasi selber festlegen. Das geht soweit, dass man sogar die Frequenzen von VGA erreichen kann und dann ohne besonderen Konverter (nur RGBI->RGBA) auf VGA-Monitoren Bilder darstellen kann: VDC VGA Mania.

  • Deine Einstellungen geben beim C128 und 1901 nur ein durchlaufendes Bild.

    Hab ich befürchtet...

    Grundsätzlich muss man beim VDC immer so einige Sachen mehr bedenken, damit es auch auf möglichst vielen Monitoren darstellbar ist.

    Ich glaube, das ist der Grund, warum sich so wenige an die Programmierung des VDC ranmachen, wo er doch eigentlich so super Eigenschaften hat! :-( Wenn man sich nie sicher sein kann, dass das Programm, was man gerade schreibt, irgendwoanders auch tatsächlich laufen wird... :-(


    Arndt

  • Ich glaube, das ist der Grund, warum sich so wenige an die Programmierung des VDC ranmachen, wo er doch eigentlich so super Eigenschaften hat! :-( Wenn man sich nie sicher sein kann, dass das Programm, was man gerade schreibt, irgendwoanders auch tatsächlich laufen wird...

    Na, ganz so schlimm ist es ja nun nicht. Wenn man die Timings gleich bzw. möglichst ähnlich belässt und nur an anderen Parametern dreht (andere Kachelgröße, Semigrafik, andere Zahl sichtbarer Zeilen/Spalten), dann wird das Bild auch vom Monitor angezeigt. Vielleicht nicht vom Emu, aber das ist ja ein ganz anderes Problem.
    Gut, dieser Einwand hilft Dir jetzt nicht beim Erstellen von 640x400 interlaced, aber ich wollte dem Erzeugen neuer Gerüchte bei VDC-Anfängern vorbeugen... ;)

  • @GoDot: Wenn Du mir ein D64 gibst, kann ich gerne ausprobieren, ob mein C128 (64k VDC) zusammen mit dem Scart -> HDMI Adapter damit ein brauchbares Bild erzeugen.
    Bei solchen Sachen mag es ja sinnvoll sein, das auch mal auf nicht original Commodore Monitor ausprobiert zu haben.


    PS: D64 deshalb, damit ich das schnell per FTP aus die Ultimate schieben kann und dann einfach ausprobieren kann.

  • Wenn Du mir ein D64 gibst, kann ich gerne ausprobieren, ob mein C128 (64k VDC) zusammen mit dem Scart -> HDMI Adapter damit ein brauchbares Bild erzeugen.

    Gerne! Die (immer) aktuelle GoDot-Version (auf drei D64) findest du hier als ZIP zum Download. Das Modul ist auf der dritten Disk und heißt "mod.ShowVDCFloyd" (ziemlich vorne im Directory). Die Registerwerte für die Register 0 bis 9 stehen ab der Adresse $c2c2 (bzw. $e2c2, wenn das Modul nicht gerade aktiv ist). Die Stelle ist folgendermaßen aufgebaut:


    Code
    1. ; -------------------------------------- VDC settings
    2. ; 0 1 2 3 4 5 6 7 8 9
    3. regs !by 126, 80, 102, $49, 36, 0, 25, 30, 0, $e7 ; 16K
    4. !by 126, 80, 102, $49, 76, 0, 50, 62, 3, $ef ; 64K

    Arndt


    Edit: Der komplette Sourcecode ist auf Github (siehe Signatur)

  • Ah ja. Mit dem VDC kenne ich mich leider überhaupt nicht aus, so dass ich an den Registerwerten eher nicht rumbasteln werde.


    Allerdings kann ich zwischendurch natürlich gerne konkret mitgeteilte Werte (idealerweise per POKE vor dem Programmstart) ausprobieren. Halt einfach nur, damit die Kompatibilität auf einen weiteren Gerät geprüft ist.


    Ich prüfe zwischendurch mal die Version aus der d64.

  • Liege ich richtig, C64 Modus, Modul einladen und mit SYS <LADEADRESSE> starten, also SYS 49152?


    Dann bekomme ich auf den VDC-Ausgang auch was zu sehen, aber kein stabiles Bild.



    Im C128 Modus bekomme ich das nicht gestartet... ich nehme also mal an, dass der C64 Modus richtig ist.



    Nachtrag: Sollte das ROM bei einen Test einen Unterschied machen: Kein Problem, ein kleiner Hinweis reicht, mit welchen ROM ich etsten soll, dank Superkernal 128 kann ich mit jedem Kernal-ROM testen.

  • Kann gerne auch alles mögliche testen und helfen. Ich hab einen 1901, einen 1084, und einen TV, der via dem bit-c128.com Adapter per Scart angeschlossen ist (RGBI->RGBA).
    Hab aber ebenfalls keine Ahnung wie ich das Modul testen soll. Noch nie was mit GoDot gemacht.


    Meine Empfehlung wäre jedenfalls mit den Registereinstellungen möglichst auf NTSC oder PAL zu zielen, damit sollten die meisten TVs klarkommen.


    Register 0 sollte dafür bei NTSC stehen auf 126 ($7e), und bei PAL auf 127 ($7f) - so macht es auch Commodore selber mit dem ROM von 1986 (im 1985er ROM war die PAL-Kompatiblität noch schlechter):


    Berechnung: Der VDC hat 16 Mhz Pixeltakt, also
    für NTSC: 16000000 / ((126+1) * 8 ) = 16000000 / 1016 = 15748 Hz Horizontalfrequenz (NTSC = 15734,26 Hz)
    für PAL: 16000000 / ((127+1) * 8 ) = 16000000 / 1024 = 15625 Hz Horizontalfrequenz (PAL = 15625 Hz)


    An der Horizontalfrequenz (Register 0) sollte man auch nicht ohne Not rumspielen, der Toleranzbereich der meisten Anzeigegeräte ist da eher klein.


    Für die Vertikalfrequenz ist Register 4 zuständig. NTSC hat den Wert 32, PAL den Wert 38 (1986er ROM), also bei Zeichenhöhe von 8 (Register 9 = 7) ergibt sich dann:
    für NTSC: (32+1)*(7+1) = 264 Zeilen
    für PAL: (38+1)*(7+1) = 312 Zeilen


    Teilt man jetzt Horizontalfrequenz durch Anzahl der Zeilen hat man die Bildwiederholrate:
    für NTSC: 15748 Hz / 264 = 59,65 Hz
    für PAL: 15625 Hz / 312 = 50,08 Hz


    Commodore ist also ziemlich dicht an den für die jeweilige Fernsehnorm geforderten Werten gelandet und die meisten Anzeigegeräte kommen damit auch klar.
    Bei Interlace hat man natürlich noch granularere Möglichkeiten, möglichst dicht an PAL oder NTSC zu kommen. Man muss nur immer aufpassen bei den VDC-Registern, weil einige einen +1 Wert speichern und andere einen -1 Wert. Das gibt irgendwann einen Knoten im Gehirn, vor allem weil bei Interlace teilweise andere Regeln gelten... Das ist aber alles im C128 Programmer's Reference Guide in der Dokumentation angegeben. Da sollte man sich relativ strikt dran halten.