ASCII-Codes in Bildschirmcodes umrechnen (und umgekehrt)?

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

  • Oder anders gesagt: Ich weiß, dass ich die Bildschirmcodes 64-67 brauche. Ich möchte diese vier Zeichen aber mit PRINT auf den Bildschirm bringen und nicht mit POKE.

    Ich brauche keine Umwandlung in Bildschirmcodes sonder ich möchte VON den Bildschirmcodes zu den ASCII-Codes gelangen, damit ich sie hinPRINTen kann.

    Ich verstehe immer noch nicht, warum du nicht direkt die PETSCII der Zeichen in den String reinschreiben kannst. Wozu die Umwandlung?

    Das hat auch noch den Vorteil, dass du die Zeichen genau so siehst, wie sie auf dem Bildschirm erscheinen sollen.

    Wenn in den Strings aus irgendeinem Grund (den ich nicht verstehe) Bildschirm-Codes drinstehen sollen, dann ist das eigene Wandeln in PETSCII auf jeden Fall langsamer, als wenn du mit POKE arbeitest.


    Und nochmal: der C64 kennt kein ASCII. Das verwirrt nur in der Diskussion. Bei ASCII sind Groß- und Kleinbuchstaben ganz anderes codiert.

    Bitte melde dich an, um diesen Link zu sehen.

    3 Mal editiert, zuletzt von detlef (4. Dezember 2022 um 00:00)

  • Und zum Thema ASCII-Code: Der C64 verwendet keinen ASCII-Code, sondern PETSCII.

    "ASCII" war hier offensichtlich als Synonym zu PETSCII gemeint.

    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

  • detlef: Also ich habe einen Zeichensatz der in Blöcke von jeweils 4 Zeichen unterteilt ist.

    Zeichen 64-67 = Block1

    Zeichen 68-71 = Block2

    Zeichen 72-75 = Block3

    usw.

    Und nun möchte ich diese Blöcke auf den Bildschirm bringen aber nicht mit POKE sondern mit PRINT weil das schneller geht.

    Die Frage des Tages ist also: Wie bringe ich die Zeichencodes 64-67 mit PRINT auf den Bildschirm?

    Übrigens:

    Im C64 Handbuch steht ASCII und CHR$ Codes. Wie soll ich sie Deiner Meinung nach nennen?

  • Siehe dazu auch das Video

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

    Sein Beispiel zeigt zwar die Umwandlung PETSCII => BSCode, aber dies andersherum zu gestalten ist daraus leicht abzuleiten.

  • Und zum Thema ASCII-Code: Der C64 verwendet keinen ASCII-Code, sondern PETSCII.

    "ASCII" war hier offensichtlich als Synonym zu PETSCII gemeint.

    Ist aber falsch. Wenn ich ASCII lese und gehe ich auch von ASCII aus. Die Umwandlung sieht anders aus.

  • Übrigens:

    Im C64 Handbuch steht ASCII und CHR$ Codes. Wie soll ich sie Deiner Meinung nach nennen?

    Wenn es um Umwandlung geht, dann auf jeden Fall PETSCII. Wenn es nicht um Umwandlungen geht, dann ist es egal.

    Die Frage des Tages ist also: Wie bringe ich die Zeichencodes 64-67 mit PRINT auf den Bildschirm?

    Was sind das für Zeichen? Ist das jetzt PETSCII oder Bildschirm-Code? Zeichencode sagt mir leider überhaupt nichts.

    Bitte melde dich an, um diesen Link zu sehen.

    2 Mal editiert, zuletzt von detlef (4. Dezember 2022 um 00:09)

  • Na, gut. Dann nennen wir es eben PETSCII Codes.

    Das Problem, das ich bei der Umrechnung von Bildschirmcodes in PETSCII Codes habe ist, dass bei bestimmten Bildschirmcodes noch RVS ON und RVS OFF hinzugefügt werden muss.

    Wahrscheinlich ist das Programm von Mr.SyS ein guter Ansatz. Aber ich bin zu dumm das zu Ende zu denken.

  • goloMAK: Nicht das ich zu faul wäre, das herauszufinden. Aber Du weißt nicht zufällig wie diese IF-Abfrage aussehen müsste? :)

    Na ja, wenn ich von den Funktionen ausgehe, die Mr.SyS hier gepostet hat (habe ich nicht getestet), dann sollte es doch so gehen:

    Code
    40 rem bildschirmcode nach ascii
    50 def fn ba(b)=b+64+64*(b<64 and b>31)+32*(b<96 and b>63)
    60 s=b and 127 : rem bit7 ausblenden
    70 p$=chr$(fn ba(s)) : rem petscii-zeichen
    80 if b>127 then p$=chr$(18)+p$+chr$(146) : rem rvs on und rvs off
    90 print p$ : rem tada

    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

  • Ist aber falsch. Wenn ich ASCII lese und gehe ich auch von ASCII aus.

    Tja, mal überlegen... was könnte jemand wohl meinen, wenn er in Bezug auf einen C64 von ASCII spricht... hm....

    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

  • Und das ist jetzt schneller als POKE ohne Wandlung?

    Ja. Weil die fertigen Zeichenblöcke in einem Array stehen.

    Dann braucht man für den ersten Zeichenblock nur noch schreiben: PRINT A$(1).

    Und nicht POKE..., POKE..., POKE...

    In den Bildschirmspeicher zu POKEn ist immer deutlich langsamer als PRINT.

  • Und das ist jetzt schneller als POKE ohne Wandlung?

    In der Form vielleicht nicht, aber wenn man die Strings am Anfang einmal zusammenstellt und dann mehrfach verwendet, lohnt sich das schon. Habe ich so ähnlich auch in "meinem" Bitte melde dich an, um diesen Link zu sehen. gemacht (mit dem BRAVO-Logo). :)

    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

  • so habe ich das verstanden....

    nur mal auf die schnelle was geschrieben...

  • Ist aber falsch. Wenn ich ASCII lese und gehe ich auch von ASCII aus.

    Tja, mal überlegen... was könnte jemand wohl meinen, wenn er in Bezug auf einen C64 von ASCII spricht... hm....

    Dass er zum Beispiel auf einem Epson-Drucker mit ASCII-Zeichensatz drucken will und deswegen nach ASCII wandeln will?

    Oder dass er ein Terminalprogramm programmieren möchte und deswegen von ASCII nach PETSCII oder Bildschirm-Code wandeln will?

    Er hatte ja nicht geschrieben, was er vor hat.

  • Und das ist jetzt schneller als POKE ohne Wandlung?

    Ja. Weil die fertigen Zeichenblöcke in einem Array stehen.

    Dann braucht man für den ersten Zeichenblock nur noch schreiben: PRINT A$(1).

    Und nicht POKE..., POKE..., POKE...

    In den Bildschirmspeicher zu POKEn ist immer deutlich langsamer als PRINT.

    Das mit dem PRINT A$(1) klappt aber so nicht. Du musst den String vorher mit MID$ durchlaufen und jedes Zeichen einzeln konvertieren.

    Das ist definitiv viel viel langsamer als POKE.

    Naja, ich lass euch mal machen und schaue mir an, was da rauskommt. :popcorn:

    Bitte melde dich an, um diesen Link zu sehen.

    2 Mal editiert, zuletzt von detlef (4. Dezember 2022 um 01:12)

  • Und das ist jetzt schneller als POKE ohne Wandlung?

    In der Form vielleicht nicht, aber wenn man die Strings am Anfang einmal zusammenstellt und dann mehrfach verwendet, lohnt sich das schon. Habe ich so ähnlich auch in "meinem" Bitte melde dich an, um diesen Link zu sehen. gemacht (mit dem BRAVO-Logo). :)

    Kostet halt einiges an Speicher (sowohl Programm- als auch String-Speicher).

    Aber selbst mit vorberechneten Strings ist der Geschwindigkeitsgewinn doch minimal, wenn man noch die Ausgabe der Ctrl-Codes dazunimmt. Wenn es überhaupt schneller ist.

  • Da fiel mir auf, dass ich in bestimmten Tabellen die Bildschirmcodes hinterlegt habe.

    Wie sich herausgestellt hat, brauche ich aber in einem bestimmten Programmteil die ASCII (CHR$) Codes.

    Was sind das für Tabellen? Müssen die so im C64-Speicher sein?

    Oder kann man die Umrechnung außerhalb im PC machen (z.B. in Python), und nur das Ergebnis in den C64-Speicher schreiben?

    Python
    def ab(a)
        return a + 33 * (a == 255) + 64 * (a > 63) + 32 * (a < 96) - 32 * (a < 160)+ 64 * (a > 191)
    print(ab(80))