Hallo Besucher, der Thread wurde 4,8k mal aufgerufen und enthält 33 Antworten

letzter Beitrag von 63er am

ZEICHENSATZ-PROGRAMMIERUNG

  • DEUTSCHE-UMLAUTE:



    Da ich angemailt wurde, wie man Deutsche Umlaute programmiert, veröfftliche ich hier noch mal dieses Z-10 Listing.


    Das Programm besteht aus 3 Teilen,

    1. ROM-RAM-Kopie
    2. Zeichen-Installer
    3. Zeichen-Datas für äÄöÖüÜß

    Natürlich kann das Programm auch noch mit weiteren Data-Zeilen/Zeichen(8-Byte) beliebig erweitert werden.


    Schönen Gruß,

  • Z10: ZEICHEN-EDITOR:



    Passend zum Thema hier noch einmal der Z-!0 Zeilchen-Editor.
    Am besten man speichert den erst mal auf eine Diskette/ oder in eine D.64 Datein.

    Danach kann man dann mit L/S den Satz speichern und laden.

    Editiert wird mit Cursor und Return und Leertaste.

    Der abgespeicherte Zeichensatz kann dann mit folgendem Lade-Code in ein Basic-Programm eingebunden werden.

    0 :ifa=0then:a=1:load"zs-0,u",8,1

    1 :poke648,204:print"[clr]neuer satz:":poke56576,4:poke53272,48:


    Schönen Gruß.

  • Z10: MINI-GRAFIK:




    Dieses Listing zeigt, wie man Zeichsatz-Daten im Grafik-Modus verwendet.

    Mit eingebaut ist ein kleiner Editor.
    Der Zeichensatz befindet sich vollständig in einem 8-Byte Strings-Feld, so daß der Programmierer jedes Zeichen leicht selber ändern oder neubestimmen kann.
    Darüberhinaus können ähnlich wie mit print Zeichenfolgen als Strings ausgegeben werden.
    Als Demo sind gelich 4 Umlaut-Zeichen ÄÖÜß als 8Byte-Stringcode mit angefügt.

    Schönen Gruß.

  • Der abgespeicherte Zeichensatz kann dann mit folgendem Lade-Code in ein Basic-Programm eingebunden werden.

    0 :ifa=0then:a=1:load"zs-0,u",8,1

    1 :poke648,204:print"[clr]neuer satz:":poke56576,4:poke53272,48:

    Hallo BIF. Sehr interessant. Es klappt bei mir sehr gut. Könntest du evtl. erläutern, was das kleine Programm im Einzelnen macht? Ich verstehe nicht einmal die Zeile "ifa=0then", weil da nach dem "then" nichts steht. Und was bedeutet ",u" nach dem Dateinamen? In der zweiten Zeile verstehe ich bis auf den print-Befehl und der Tatsache, dass 53272 der Pointer für den ZS ist, nichts. Danke im Voraus!


    EDIT: Oh, und warum friert "RUN/STOP-RESTORE" nach dem Laden des neuen ZS's den C64 ein?

  • Erläuterungen zum Programmcode:

    0 :ifa=0then:a=1:load"zs-0,u",8,1

    1 :poke648,204:print"[clr]neuer satz:":poke56576,4:poke53272,48:



    -Also in Zeile 0 wird der Zeichensatz "zs-0,usr" geladen.
    "zs-0" ist der Zeichensatzname und ,u bedeutet usr-Datei.
    ifa=0then:a=1: bewirkt, daß der Zeichensatz nur einmal geladen wird, da der LOAD-Befehl die Eigenart hat nach dem LOAD ein goto Programmanfang auszuführen. Das heißt, daß der Interpreter nach dem Load-Befehl wieder beim If then-Befehl in Zeile 0 weiterarbeitet.
    Da nun :a=1: ist wird dann in Zeile 1 weitergearbeitet.

    -Nachdem der Zeichensatz in Zeile 0 geladen wurde, wird er dann in Zeile 1 eingeschaltet.
    Der geladene Zeichensatz steht im Speicher ab 49152, einem Speicherbereich, der auch oberes RAM genannt wird.

    Es gibt also keine Überschneidung mit dem Baisic-Programm RAM(2048-40959) und der Zeichensatz ist vor Überscheiben geschützt.
    Um den Zeichensatz ab 49152 einzuschalten muß aber zusätzlich noch der Bildschirm(1024) ins obere RAM verlegt werden.

    :poke648,204: schaltet die Bildschirm-Ausgabe bei Adresse 52224 an.
    :danach lösche ich den neuen Bildschirm-Bereich mit print"[clr]"

    :poke56576,4: schaltet den VIC-Arbeitsbereich(16kB) auf 49152 um. Das heißt, daß nun die oberen 16kB als Grafikbereich aktiviert sind.

    :poke53272,48: hat zwei Aufgaben das Low-Byte schaltet den Zeichensatz und das High-Byte den Bildschirm-Bereich um.


    Man hat also 48= 0+3*16.
    Das heißt, der Zeichensatz steht bei 0*1024+49152=49152
    und der Bildschirm steht bei 3*1024+49152=52224.


    Nach dem Ausführen von Zeile 1 kann man dann also wie gewohnt mit dem Bildschirm arbeiten.
    Nur daß der Bildschirm und Zeichensatz jetzt im oberen RAM ist.

    Für den Programmierer bedeutet das, daß er jetzt die oberen 16kB für Grafik nutzen kann.
    Und daß der alte Bildschirm-Speicherbereich(1024-2047) jetzt für andere Zwecke genutzt werden kann.

    Schönen Gruß.

  • Wow, BIF. Vielen Dank! Daraus habe ich einiges gelernt. Wusste gar nicht, dass man den Grafikspeicher verlegen kann. Aber warum ist das hier nötig? Das sehe ich noch nicht so.


    Und auch der Doppelpunkt bei IF war mir neu. Normalerweise bewirkt IF bla THEN bla1:bla2, dass wenn bla stimmt, dann bla1 UND bla2 ausgeführt werden. Ich verstehe, dass jetzt so, dass IF bla THEN :bla1:bla2 bewirkt, dass NUR bla1 ausgeführt wird, wenn bla stimmt. bla2 wird in jedem Fall ausgeführt (wie eine neue Zeile). Stimmt das so?

  • WebFritzi :
    Für die Zeichensatz und Grafik-Programmierung ist es günstiger, wenn man die oberen 16 kB des C64 nutzt.

    Hier hat man ab 49152-65535 volle 16 kB für die Grafik-Programmierung zur Verfügung.

    Das Problem bei der Standard-Konfig ist, daß ein Zeichensatz oder eine Grafik den Basic-Programmspeicher einschränkt.
    Als ich angefangen habe, wurde ein Zeichensatz ab 2048 empfohlen.
    Das ist aber natürlich identisch mit dem Basic-Programmanfang.
    Man muß also erst einmal den Basic-Anfang auf 4096 hochsetzen um dann den Zeichensatz ab 2048 zu installieren.


    Bei der Oberen RAM-Konfiguration gibt es dagegen keine Überschneidungen mit dem Basic-Programm RAM.
    Und keine Einschränkung mit der Basic-Programm-Länge.


    Schönen Gruß.

  • Hier noch mal das Listing zum Anhängen eines Zeichensatzes an ein Basic-Programm:

    Zeile10: Erzeugen eines Anhangs mit 8 Blocks =2048 kB = Länge eines ZeichensatzesZeile 20: Berechnen des Anhang-Anfangs
    Zeile 30: Kopieren des Zeichensatzes in den Anhang.
    Zeile 35: Nochen einen Block anhängen.
    Zeile 12: Programm mit Anhang/Zeichensatz speichern.

    0 :b=8::rem---prg+zeichensatz

    10: poke2,b:poke46,peek(46)+b:clr:b=peek(2)*256

    12 :gosub20:gosub30:gosub35:save"mod",8:end

    19 :

    20 :a=peek(45)+peek(46)*256-b:h=53248:return

    29 :

    30 :rem---zeichen kopie

    31 :c=peek(1):poke56334,.:poke1,c-4

    32 :fori=.tob-1:pokea+i,peek(h+i):next

    33 :poke1,c:poke56334,1:return

    34 :

    35 :poke46,peek(46)+1:clr:b=256:gosub20:fori=atoa+b-1:pokei,1:next:return


    Schönen Gruß.

  • Großschrift-Programmierung(4x4):


    Hier die Zeichen ! - Z in 4x4-Vergrößerung.


    Das Unterprogramm aus Merkers-Memory


    Natürlich kann man die Zeichensatz-Daten ab 53248 auch zur Erzeugung von Großschrift-Zeichen benutzen.
    Das Listing zeigt die den Vergrößerer, den ich im Spiel Merkers-Memory verwendet habe.
    Der Zugriff auf das Zeichen-ROM erfolgt mit

    :poke56334,.:poke1,51:a=peek(53248+i):poke1,55:sys65374

    Je 8 Byte bilden ein Zeichen (8 Byte * 8Bit= 64 Bit).

    In Zeile 32 wird der Code (0-15) berechnet und in Zeile 33 dann in String-Zeichen umgesetzt.

    Schönen Gruß.

  • <OT>

    Ich habe hier hereingeschaut, weil es um Zeichensätze geht (und mich das grundsätzlich interessiert). Dabei fiel mir wieder auf, wie anstrengend lesbar doch diese eng geschriebenen BASIC-Listings sind. Und u.a. für diesen Zweck hatte ich ja mal meinen neuen C64-Systemzeichensatz entworfen. Von daher würde es mich interessieren, ob auch andere durch die zusätzlich freie Pixelzeile gerade bei solchen Listings eine Verbesserung beim Lesen der Zeilen bemerken. Zum Vergleich habe ich das obige Listing einmal mit meinem Charset dargestellt.



    (links original-Zeichensatz, rechts PXLfont)


    Das einzige "Problem", das ich persönlich sehe, ist die spezielle Schreibweise mit den vielen Doppelpunkten, denn die sind in meinem Font etwas dicker als im Original (dem normalen Punkt angeglichen). Aber diese Schreib-Art ist ja nicht sehr verbreitet, soweit ich weiß – und doll stören tut es eigentlich auch nicht.

    </OT>

  • Retrofan:
    Ob das therapierbar ist weiß ich natülich nicht.
    Ich denke einmal, daß die Doppelpunkte technisch gesehen kein Problem darstellen.

    Falls doch, kannst du natürlich auch als Programmier-Anfänger damit experimentieren und interessante Effekte erzielen.

    Selbstverständlich könntest du die deiner Meinung nach überflüssigen Doppelpunkte auch entfernen und ein Bild damit posten, auch Programmieranfängern sollte das theoretisch möglich sein..


    Thread:Doppelpunkt Spiel


    Schönen Gruß.

  • Ich denke einmal, daß die Doppelpunkte technisch gesehen kein Problem darstellen.

    Mir ist (im Gegensatz zu anderen) die Doppelpunkt-Dichte in deinen Listings relativ egal. Ich frage mich nur, ob sie der Code-Lesbarkeit eher dienlich oder eher hinderlich sind. Ich schwanke in der Ansicht noch. Aber selbst mit den Doppelpunkten finde ich meinen 6px-hohen Font im BASIC-Listing besser lesbar als den 7px-hohen Originalfont (bei starker Nutzung von invertierten Steuerzeichen noch mehr). Ich wollte eigentlich nur wissen, ob du (und andere BASIC-Fans hier) das im direkten Vergleich ähnlich siehst (sehen). Schließlich verbringst ja gerade du sehr viel Zeit im C64-BASIC-Editor und könntest davon evtl. profitieren.