Render-Engine für Proportionalfonts im Bitmap Mode

Es gibt 240 Antworten in diesem Thema, welches 59.260 mal aufgerufen wurde. Der letzte Beitrag (21. April 2023 um 12:02) ist von Retrofan.

  • Ja, bisher sind es nur die drei ersten Menüs. Ich habe erst noch die Save Restore Funktionen testen wollen. Ausserdem habe ich schon öfter die Ideen für ein dynamisches Menü verworfen. Die Subroutinen sollen später ja auch einfach von jedem übernommen werden können. Ich muss das vielleicht noch mal ganz anders angehen. Kennst du eigentlich eine Asm Routine für line, die würde ich gern noch mit einhängen, für Rahmen und so.

    Mit "fill8" könntest Du auch sehr einfach zumindest horiz. Linien zeichen, d.h. Du müsstest nur 8 Bytes haben, die eine horizontale Linie wiedergeben; also bspw. (0,0,0,255,255,0,0,0) und dann damit eine Zeile/die gewünschte Breite füllen.
    Für die vertikalen müstest Du derzeit eine For-Schleife nutzen bzw. wäre es auch mit Hilfe der .restore-Funktion möglich, wenn man max. 200 Bytes (min. Höhe der längsten Linie) reserviert und mit einem Muster füllt bspw. (48,48,48,48,48,48,48,48). Info: Dezimal 48 = Binär %00011000
    Für die Ecken: vier einzelne Aufrufe von "fill8".

    Die Alternative wäre, den Font mit Rahmenzeichen anzureichern, d.h. hier müsstest Du dann auch die Zeichenbreite mit rein speichern.
    Du könntest die zusätzlichen Zeichen nach dem Laden von "Prop" hinzufügen, weil die Startadresse von CHARSET mit in der Tabelle steht.

    Eine ganz andere Form wäre, die Menüs nur mit einer eigenen Hintergrundfarbe anzudeuten.
    In der GUI nutzen wir einen 8x8-Font für das Zeichnen der Rahmen, wobei der obere Teil keine eigenen Zeichen benötigt, sondern komplett nur durch die Farben umgesetzt ist.

  • Retrofan
    Nur zur Info: Ich habe gerade beim Rumspielen mit dem breiten Font im Reader bemerkt, dass die Datei "tut_01.txt" einen Absturz verursacht. Ich gehe stark davon aus, dass das an dem bereits erwähnten Bug mit den breiten Zeichen und best. Positionen auf dem Bildschirm liegt. Du kannst ja mal bei Gelegenheit ausprobieren, ob Du mit Deinem neuen schmaleren Font einen Absturz provozieren kannst.

  • Ich probiere mal eine Mischung aus Farbe und vielleicht horizontalen Linien, damit alles flott bleibt. Steht der jetzige Aufbau des Fonts eigentlich hier irgendwo im Thred. Erstmal mache ich zwar erst mal was anderes, aber vielleicht lohnt es sich ja später den Font dynamisch anzupassen. Retrofan deine Fonts sind klasse, aber es kann ja sein das man später mal Sonderzeichen braucht.

  • Ich probiere mal eine Mischung aus Farbe und vielleicht horizontalen Linien, damit alles flott bleibt. Steht der jetzige Aufbau des Fonts eigentlich hier irgendwo im Thred. Erstmal mache ich zwar erst mal was anderes, aber vielleicht lohnt es sich ja später den Font dynamisch anzupassen.

    Im Grunde wird man im Thread alle nötigen Informationen finden aber hier nochmal zusammengefasst:

    Bitte melde dich an, um diesen Anhang zu sehen.

    Die Belegung entspricht ISO Latin 9 (ISO 8859-15), was eine Untermenge von ASCII beinhaltet (die ersten 128 Positionen sind also ASCII). Die Belegung der oberen 128 Zeichen sorgen für eine internationale (west-europäische) Nutzungsmöglichkeit und (wichtig) Kompatibilität zum PC/Mac (für die enthaltenen Sonderzeichen, wie Umlaute etc.). Das ist natürlich vor allem für Programme wichtig, die auf Datenaustausch ausgelegt sind, wie Betriebssysteme, Browser, Text-Reader, Editoren, Textverarbeitungen, Datenbanken, Chat-Clients etc.

    Wenn man also z.B. ein Spiel schreibt und den Font ausschließlich für die Bildschirmausgabe nutzen will, kann man natürlich die nicht verwendeten Zeichen anders nutzen oder eine komplett andere Belegung wählen – man käme ja nicht in Gefahr, inkompatibel zu irgendwas modernem zu werden, mit dem man kommunizieren müsste.

    Die grundsätzliche Belegung meiner ISO-Fonts ist aber:

    Die grünen Bereiche enthalten alle druckbaren Zeichen des Latin 9-Encodings.

    Der rote Bereich ist für den Font-Header reserviert. Der violette Unterbereich enthält den Font- (Familien-) Namen (16 Zeichen). Im Beispiel steht dort "PXLfont". Zusätzlich werden dort später der Schnitt (bold, italic usw.), einige Größen- und Zusatzangaben, der Ersteller usw. genannt werden können. Das lege ich noch fest.

    Der gelbe Bereich enthält (bei einem Proportional-Font) die Breiten-Tabelle für alle Zeichen als Nibbles (4-Bit-Werte). Die ersten 16 Byte (bzw. 2 Chars) könnte man evtl. dem Header zuschlagen, falls nötig.

    Der blaue Bereich ist frei für eigene Zeichen (die nicht für den Datenaustausch wichtig sind), z.B. GUI-Symbole etc.

    Bitte melde dich an, um diesen Link zu sehen. | Meine Lieblings-Themen im Forum64:

    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

  • Trivia: Die Latin 9-Belegung ist eine Weiterentwicklung von ISO Latin 1, welche bis auf wenige Belegungen kompatibel zum Bitte melde dich an, um diesen Link zu sehen. ist. Man bleibt also im weitesten Sinne "Commodore-kompatibel", wenn man sich an die ISO 8859 hält. ;) Ein deutschsprachiger Text mit unseren Umlauten könnte also problemlos wechselweise zwischen PC/Mac (bei korrekt gewähltem 8-Bit-Encoding), Amiga und C64 (mit ISO Latin-Encoding) ausgetauscht werden. Bei PETSCII (oder dem GEOS-ASCII-Encoding) hat man beim Datenaustausch immer Probleme, spätestens bei der Verwendung von Umlauten, Akzent-Buchstaben, vielen Sonderzeichen usw.

    Bitte melde dich an, um diesen Link zu sehen. | Meine Lieblings-Themen im Forum64:

    Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen. | Bitte melde dich an, um diesen Link zu sehen.

  • @Retrofam Danke, die Zusammenfassung ist perfekt.

    Und an den Rest:

    Ich habe mit meinem Test-Menü weitergemacht.

    Es ist noch nicht perfekt, oder optimiert, aber es läuft.

    (Ich habe keine Ahnung warum das ding immer das Hilfe-Untermenü falsch aufbaut)

    Das ganze hat noch deutliche schwächen, aber schon jetzt ist es ausreichen performant.

    Wobei man sagen muss es ist in Basic geschrieben und mein Basic ist ganz schön eingerostet.

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Hi,

    Ich bin gerade dabei alles noch mal zu überarbeiten und mir einen Editor für die Menüs zu schreiben.

    Für den Editor nutze ich ein paar kleine asm Routinen. Wo kann ich diehinlegen, damit sie sich nicht mit den Grafiken und Routinen für die Schrift beißen?

  • Ich bin schon etwas weiter gekommen.

    Das Platzproblem habe ich durch heruntersetzen des Basicendes gelöst, da kommen sich die Codes nicht ins Gehege.

    Da ich nicht wirklich gut in Asm bin, habe ich etwas bei dir ( 5ace) abgeschrieben.

    Ich hoffe das ist ok. Ich brauchte etwas mehr Geschwindigkeit, bei meinem Menüeditor.

  • Ich hatte nun etwas Zeit und habe mein Menü überarbeitet.

    Im Zipfile sind die C64Studio Projekte zu einem Beispiel und einem Editor zum erstellen von Menü-Dateien.

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Frohes neues Jahr euch allen.

    Ich habe die Unterprogramme für die Anzeige des Menüs jetzt komplett in den Editor übernommen.

    Das hatte ich vorher nicht gemacht, weil sich wohl meine und 5ace ASM Routinen nicht vertragen. Wahrscheinlich hat das was damit zu tun, dass ich das Basicende verschiebe.

    Das Problem besteht auch immer noch, das Anzeigen des Menüs im Editor endet immer in einem Fehler. Aber ich dachte, ich mach das mal so fertig und einer von euch Profis ist so nett und schaut mal drüber und sagt mir was ich umbauen muss.

    Wäre schön wenn ich das Projekt zu ende bringen könnte.

  • Zyrian
    Ich habe nach dem Laden Deines Programms "PRINT PEEK(45)+PEEK(46)*256" eingegeben, um dessen Länge herauszufinden (siehe Bitte melde dich an, um diesen Link zu sehen.). Das Ergebnis war 18377.
    Meine Vermutung ist, dass die Bitmap bei Adresse 8192 (=$2000) genau in Deinem Basic Programm liegt und beim Löschen/Füllen des Bildschirms dieses auch z.T. löscht.
    Die Lösung wäre, die Konstanten SCREEN und BITMAP in der basicProp.asm zu ändern und in den Funktionen ".hiresOn" und ".hiresOff" die VIC-Bank zu setzen bzw. zurückzusetzen (siehe oben den zweiten Kasten Bitte melde dich an, um diesen Link zu sehen.).

    Ich finde Dein Programm gut, weil es mehr beherbergt, als man auf den ersten Blick erkennen kann (Bspw. die eigene Eingaberoutine beim Eingeben eines Namens oder das Laden der Directory beim Öffnen eines gespeicherten Menüs).

  • Zyrian Ich würde die Markierung der Menüeinträge voll durchziehen und nicht da aufhören lassen, wo der Eintrag aufhört. Sieht besser aus.

    Bitte melde dich an, um diesen Link zu sehen. (Bitte melde dich an, um diesen Link zu sehen.)Bitte melde dich an, um diesen Link zu sehen.Bitte melde dich an, um diesen Link zu sehen.
  • WebFritzi gute Idee. Wenn der Rest läuft, kann ich das mal testen.

    5ace Ich habe jetzt 1 1/2 Stunden versucht den Bitmap Bereich zu verschieben. Und, schon mal vorweg, ich habe es nicht hinbekommen. Ich hänge das aktuelle Zip noch mal an. Die Änderungen in basicProp.asm habe ich noch mal auskommentiert und die alten werte gesetzt. Kannst du mal schauen was da bei meinen Änderungen falsch war. Ich habe jetzt einen Knoten im Hirn. Ich habe mich noch nie an Bitmap Grafik versucht.

  • Zyrian
    Ich schreibe mal etwas ausführlicher.

    Allg. sind 3 Schritte zu erledigen:
    1.) Position für SCREEN und BITMAP überlegen
    2.) VIC-Bank einstellen
    3.) $d018 setzen

    -------

    Zu 1.)
    Ich sehe, dass Du SCREEN = $4000 und BITMAP = $6000 setzen möchtest.
    Soweit ok.

    (((Mein erster Gedanke: Evtl. wäre es umgekehrt sinnvoller, d.h.

    - BITMAP = $4000 und SCREEN = $6000 oder auch

    - SCREEN = $5c00 und BITMAP = $6000,

    damit kein Platz zwischen den beiden bleibt.

    Ich vertraue mal darauf, dass Du es besser weisst als ich bzw. kann man das ja noch im Nachhinein einfach umstellen.

    (Wichtig ist, und das weisst Du bestimmt bereits bzw. hast es gelesen, dass der VIC an $1000-$2000 und $9000-$a000 immer das CHARROM sieht, d.h. diese Bereiche eignen sich weniger für die zwei Konstanten. Außerdem muss die CPU für einen Teil der basicProp.asm Routinen auch lesend auf die Bereiche zugreifen können, d.h. sie dürften derzeit nicht unter dem ROM, sondern müssen im direkt lesbaren RAM liegen.))))

    -------


    Zu 2.)

    Die VIC-Bank hast Du in .hiresOn korrekt eingestellt, d.h.

    Code
    lda $dd00
    and #%11111100
    ora #%00000010 ;<- bank1: $4000-$7fff
    sta $dd00

    würde zu den beiden Konstanten passen.


    Bei .hiresOff müsstest Du die bank0 wählen, falls Du beim Abschalten der Bitmap den Textmode-Screen wieder bei $0400 haben möchtest.

    Code
    lda $dd00
    and #%11111100
    ora #%00000011 ; -> bank0: $0000-$3fff
    sta $dd00

    -------


    Zu 3.)
    Ich denke, dass hier der Fehler lag:

    Code
    lda #%01001000 ; <- würde den SCREEN auf $5000 setzen und die BITMAP auf $6000
    sta $d018

    richtig wäre:

    Code
    lda #%00001000 ; <- würde den SCREEN auf $4000 setzen und die BITMAP auf $6000
    sta $d018


    -------
    Das war es auch schon, falls ich nichts übersehen habe.

    Ich hätte noch folgende Empfehlung zur .hiresOn.
    Du könntest versuchen die Formeln aus Bitte melde dich an, um diesen Link zu sehen. einzufügen, so dass man beim Ändern der beiden Konstanten in Zukunft nicht mehr nachdenken/nachschlagen müsste.
    (Ich weiß nur nicht, ob die Schreibweise unverändert so verstanden wird.)

    Code: http://codebase64.org/doku.php?id=base:quick_vicii_screen_setup
    ; Select VIC bank
    lda #((SCREEN ^ $ffff) >> 14)
    sta $dd00
    
    ; Set VIC screen and font pointers
    lda #(((SCREEN & $3fff) / $0400) << 4) + (((BITMAP & $3fff) / $0800) << 1)
    sta $d018

    Ich hoffe, der Text konnte Dir helfen.

  • Danke. Ich werde es versuchen.

    Ich habe in der 80ern fast nur un Basic programmiert und nur wenn es garnicht anders ging in Assembler. Später hauptsächlich in Pascal. Die einzige große Ausnahme war mein Abi Projekt. Ein Farbscanner mit Hardware und als Software ein Plugin in AmicaPaint. Ich erzähle das alles, weil ich glaube, das du für zu gut einschätzt. Ich lerne immer noch alles wieder neu. Das meiste ist bei mit theoretisches Wissen. Es macht mir aber sehr viel Spaß mit dem beengten Möglichkeiten auf dem C64 zu kämpfen.

    Super, das du dir so viel Mühe mit mir gibst.

  • Hallo,

    ich habe die Änderungen hinbekommen. Ich habe aber dann doch Bank2 genommen, weil Bank1 auch noch im Basicprogramm lag.

    Der Bitmap-Modus wird aktiviert, und das Menue funktioniert. Ich komme auch wieder in den Textmodus zurück und kann auch nochmals in den Bitmap-Modus.

    Aber irgendwie scheint er jetzt den Bitmap-Font nicht mehr zu finden.

  • Zyrian
    Ich habe gerade mal drübergeschaut.
    Du setzt SCREEN = $8000 und BITMAP = $a000.
    Ich nehme mal stark an, dass das Basic ROM ab $a000 während der Menü-Anzeige eingeschaltet ist und deshalb die Zeichen nicht korrekt auf dem Bildschirm ausgegeben werden können, weil
    - PutChar auch lesend auf die BITMAP zugreifen können muss, da die Bitmuster mit OR gesetzt werden. Da das ROM eingeschaltet ist, werden die Bitmuster der Zeichen mit dem ROM kombiniert.
    Die Lösung lautet, dass Du entweder einen anderen Platz findest, oder beim Nutzen der PutChar oder PutString-Fkt die IRQs abstellst und das RAM über die Speicherstelle $01 ein- und danach wieder ausschaltest. (Hier könntest Du Dir auch überlegen, ob sich die Bank 3 dafür evtl. besser eignen würde.)

    Siehe noch folgendes Bild zur Verdeutlichung:
    Bitte melde dich an, um diesen Link zu sehen.

    ---

    Mir fällt noch eine andere mögl. Ursache ein: Es könnte nat. auch sein, dass der CHARSET evtl. überschrieben wird und die Char-Breiten dann falsche Werte haben, was zu einem ähnlichen optischen Effekt führen könnte. Hierzu könntest Du die Position des Charsets ausfindig machen (steht in der Var "FA" CHARSETADDR) und dann prüfen/nachschauen, ob der Speicherbereich evtl. durch eine andere Routine (evtl. Basic-Variablen?) genutzt/überschrieben wird.

  • Sorry, aber ich habe erst Heute Zeit gehabt. Und ich habe da gerade mal rumprobiert, aber ich bekomme das nicht hin. Und ich habe da jetzt auch mal eine Frage. Wohin sollten wir eigentlich das Bitmap und die ASM Routinen packen, wenn man ein etwas umfangreicheres Basic Programm mit der proportional Schrift nutzen will. Ich weiß gerade nicht wo ich das überhaupt unterbringen soll. Mit vielem nachladen hatte ich ja schon gerechnet, aber der Editor ist ja schon zu groß, um das Bitmap in den Basic-Speicher legen zu können. Und das Basic-ROM kann ich ja leider auch nicht ausblenden, weil die Logik ja in Basic ist. Vielleicht verstehe ich das auch irgendwie nicht richtig.

    Also, ich will euch nicht zur Last fallen, aber ich verstehe nicht mehr, wie ich Basic und proportional Schrift nebeneinander nutzen soll. Schön wäre es wenn ich es hinbekommen würde, dann können auch andere die Optik der neuen Schrift nutzen, ohne viel auszuprobieren.

    Ich habe mal aufgeschrieben wie das Memory Layout jetzt aussieht.

    Wäre super wenn ich das nutzbar machen könnte, aber ich brauche da noch mal Hilfe.


    Code
    Speicher
    
    $0801-$47C9   Basic Programm       |
    $7800-$7B8C   Meine Routinen       |
    $8000         Screen ???           |
    $A000         Bitmap ???           | $A000 Basic ROM  ???
    $C000-$CFFF   Proportional Schrift |