ASCII-Codes in Bildschirmcodes umrechnen (und umgekehrt)?

Es gibt 74 Antworten in diesem Thema, welches 8.039 mal aufgerufen wurde. Der letzte Beitrag (5. Dezember 2022 um 21:30) ist von Mike.

  • Falls du das Ganze unter TSB durchführst: warum nimmst du nicht FCHR? Das erledigt auch die Positionierung mit und du sparst dir die Konvertierung. Müsste geschwindigkeitsmäßig mit PRINT AT plus Konvertierung locker mithalten können.


    Arndt

    GoDot C64 Image Processing
    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.

  • Falls du das Ganze unter TSB durchführst: warum nimmst du nicht FCHR?

    Ich glaube nicht das FCHR in diesem Fall schneller ist. Das ist sicher sauschnell wenn man viermal das gleiche Zeichen ausgeben will.

    Aber wenn man vier unterschiedliche Zeichen braucht dann ist PRINT AT(x,y)A$(0) meiner Einschätzung nach schneller.

    Und die Konvertierung findet ja schon am Programmanfang statt. Das verbraucht dann später keine Zeit mehr.

    Da werden bereits beim Start alle 4er Zeichenblöcke in ein Array gefüllt und können dann schnell und elegant mit dem Index abgerufen werden.

  • Wenn ich mir das so recht überlege, ist die Funktion von Mr.SyS perfekt geeignet.

    Es ist ja eigentlich ganz einfach: Die Bildschirmcodes 0-127 sind die normalen,- und 128-255 die inversen Zeichen.

    Dann braucht man ja nur zur prüfen, ob der übergebene Bildschirmcode >127 ist. Und wenn ja dann zieht man 128 ab und merkt sich das.

    Ich habe das jetzt mal so gelöst und ich denke das funktioniert in jedem Fall immer.

    Code
    100 def fn ba(b)=b+64+64*(b<64 and b>31)+32*(b<96 and b>63)
    110 input"bildschirmcode";bc
    115 if bc>127 then bc=bc-128:rv=1
    120 as=fn ba(bc)
    125 b$=str$(as)
    130 if rv=0 then a$=b$
    150 if rv=1 then a$="18,"+b$+" ,146"
    160 print"ascii-code(s):"
    170 print a$

    Und ja: Ich schreibe hier ASCII-Codes. Weil es im Handbuch des C64 an mehreren Stellen so genannt wird.

    Die Bezeichnung PETSCII kommt im Handbuch des C64 nicht vor. Als Alternative würde ich noch vorschlagen: Choplifter-Codes. Findet man aber auch nur in spezieller, mit Epson-Druckern gedruckter, Fachliteratur. :D

  • Und ja: Ich schreibe hier ASCII-Codes. Weil es im Handbuch des C64 an mehreren Stellen so genannt wird.

    Die Bezeichnung PETSCII kommt im Handbuch des C64 nicht vor. Als Alternative würde ich noch vorschlagen: Choplifter-Codes. Findet man aber auch nur in spezieller, mit Epson-Druckern gedruckter, Fachliteratur. :D

    Leg einfach mal eine ASCII- und eine PETSCII-Code Tabelle nebeneinander. Dann ist der Unterschied nicht schwer zu erkennen.

    Aber solange man sich aus der C64-Welt nicht rausbewegt und nichts anderes kennt, ist es auch egal. ^^

  • Aber solange man sich aus der C64-Welt nicht rausbewegt und nichts anderes kennt, ist es auch egal. ^^

    Da wir hier über ein C64-Programm reden, ist es tatsächlich egal. Du bist also schon einen Schritt weiter gekommen.

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Omega schaue dir doch mal den Post 35 an.. da habe ich das gestern abend mal probiert.. Das Programm gibt dir dann den string aus so wie du das wolltest.

  • Omega schaue dir doch mal den Post 35 an.. da habe ich das gestern abend mal probiert..

    Äh, ja. Ich bin gestern Abend gar nicht zum Angucken gekommen weil ich da mit meinem Tablet rumgewurschtelt habe.

    So eine voll ausgearbeitete Lösung wollte ich noch gar nicht. Erstmal nur wissen, wie man von Bildschirmcode nach ASCII kommt.

    Das ist ja jetzt geklärt. Mit Deiner Funktionsdefinition geht das ja ganz wunderbar.

    Wie es dann weitergeht, muss sich erst noch aus dem Zusammenhang ergeben.

  • PETSCII ist eigentlich ASCII. Aber in einer Version aus den 60er Jahren.
    Überall wurde das durch eine Version aus den 70ern abgelöst und dort dann natürlich immer noch ASCII genannt.

    PETSCII ist eine Wortschöpfung. Offiziell richtig ist schon auch am Commodore der Begriff ASCII. Aber halt irreführend

    YouTube Kanäle über Basic, den C128 und den VDC-Chip
    Bitte melde dich an, um diesen Link zu sehen. --- Bitte melde dich an, um diesen Link zu sehen.
    Commodore 8-Bit Projekte
    auf Bitte melde dich an, um diesen Link zu sehen.
    Bitte melde dich an, um diesen Link zu sehen. zu Commodore 8-bit Hardware
    auf printables.com
  • Aber selbst mit vorberechneten Strings ist der Geschwindigkeitsgewinn doch minimal, wenn man noch die Ausgabe der Ctrl-Codes dazunimmt. Wenn es überhaupt schneller ist.

    Dann probieren wir das doch einfach mal aus. :)

    Bitte melde dich an, um diesen Anhang zu sehen.

    Bitte melde dich an, um diesen Anhang zu sehen.

    Dateien

    Bitte melde dich an, um diesen Link zu sehen. - Ratespiel • Bitte melde dich an, um diesen Link zu sehen. - BASIC-Erweiterung • Bitte melde dich an, um diesen Link zu sehen. - Sprite-Editor • Bitte melde dich an, um diesen Link zu sehen. - Zeichensatz-Editor Bitte melde dich an, um diesen Link zu sehen. - 2048 Blöcke

  • Die folgende wissenschaftliche Illustration verdeutlicht dies zusätzlich :prof::

    Bitte melde dich an, um diesen Anhang zu sehen.

  • Und die Konvertierung findet ja schon am Programmanfang statt.

    Warum findet die Konvertierung erst am Programmanfang statt und nicht schon vorher, also beim Programmieren?

    10 x=rnd(-1963):fori=1to81:y=rnd(1):next
    20 forj=1to5:printchr$(rnd(1)*16+70);:next
    30 printint(rnd(1)*328)-217

    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.

  • A=(CAND127)+(CAND64)+2*(C+32AND32)

    Ich benutze diesen Einzeiler von JeeK , auf den Lynx hingewiesen hat. Funktioniert wunderbar! (In C ist der Bildschirmcode.)

    Arndt

    GoDot C64 Image Processing
    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.

  • A=(CAND127)+(CAND64)+2*(C+32AND32)

    Ich benutze diesen Einzeiler von JeeK , auf den Lynx hingewiesen hat. Funktioniert wunderbar! (In C ist der Bildschirmcode.)

    Arndt

    Ja, auch nicht schlecht. Die Funktionsdefinition von Mr.SyS ist aber auch nicht ohne.

    def fn ba(b)=b+64+64*(b<64 and b>31)+32*(b<96 and b>63)

  • Warum findet die Konvertierung erst am Programmanfang statt und nicht schon vorher, also beim Programmieren?

    Genau, darauf zielte auch meine Frage, ob man die Konvertierung nicht schon auf dem PC machen könnte.

    Und dann das Ergebnis z.B. mit "petcat" (Teil von "vice") in das C64-Programm bringen.

  • Edit: Hatte hier Code gepostet, aber die Berechnungen scheinen nicht zu stimmen. Also lösche ich das erstmal wieder. Sorry ...

  • Was ist denn das jetzt? Wenn ich diese Tabelle zugrundelege,

    Bitte melde dich an, um diesen Link zu sehen.

    und ich will ich einen Screen-Wert von 96 nach PETSCII konvertieren, dann steht rechts "96-127", und da muß man "+64" rechnen, um zum Ausgsangswert links (160) zurückzukommen.

    Jetzt steht aber rechts zwei Zeilen darunter auch noch "96-126", und man soll "+128" rechnen.

    Das heißt, die Zuordnung ist gar nicht eindeutig?

    Kommt mir komisch vor - und verwirrt natürlich mein Programm.

  • Die Zuordnung ist leider nur in eine Richtung eindeutig. Das allmächtige Wiki spricht:

    ab Code 192 wiederholen sich die Zeichen:

    Code
    Codes 192-223 wie Codes  96-127
    Codes 224-254 wie Codes 160-190
    Code  255     wie Code  126

    D.h. für einige Zeichen gibt es potentiell zwei mögliche PETSCII-Werte. Frohlock!

    C64Studio: Bitte melde dich an, um diesen Link zu sehen. - Bitte melde dich an, um diesen Link zu sehen. --- C64Studio WIP: 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.

  • Diese Übersicht listet alle PETSCII-Codes von 0-255 und zeigt mit rot auch an, welche der doppelten Zeichen nicht benutzt werden sollte:

    Bitte melde dich an, um diesen Link zu sehen.

  • Diese Übersicht listet alle PETSCII-Codes von 0-255 und zeigt mit rot auch an, welche der doppelten Zeichen nicht benutzt werden sollte:

    Bitte melde dich an, um diesen Link zu sehen.

    Wow, die kannte ich noch gar nicht. Hätte ich neulich gebrauchen können für die Konvertierungsfunktion im Studio-Calculator. Dann werde ich das mal abgleichen. Obwohl ich mir dabei selbst schon ausgiebig Gedanken gemacht hatte, welcher Bezug der sinnvollere ist.

    Das Thread-Thema hab ich allerdings trotzdem noch nicht wirklich verstanden. Wofür sollte ich in BASIC die Umwandlung von PETSCII nach Screen-Code brauchen, wenn dies der BASIC-Interpreter bereits selbst macht? Wenn ich schreibe PRINT "DEINE MUDDA!", dann habe ich den Screen-Code doch schon im Bildschirmspeicher. Wenn überhaupt, hatte ich eine Umwandlung bislang immer nur beim Programmieren gebraucht, aber doch nicht während der Laufzeit des Programms. ?(