Text Highlighting unter BasicV2

Es gibt 21 Antworten in diesem Thema, welches 1.931 mal aufgerufen wurde. Der letzte Beitrag (18. Oktober 2024 um 17:54) ist von BinaryDigitSix.

  • Moin :)

    Ich bastel gerade an einem Programm, dort kommen mehrere Textbildschirme zum Einsatz und der Nutzer muss einen Eintrag wählen. Da ich gerne die kompletten 40 Zeichen einer Zeile nutzen möchte und somit keine Auswahlmöglichkeit ala "Drücken sie Taste 1,2,3 oder 4" noch zusätzlich auf dem Bildschirm haben möchte, läuft das ganze darauf hinaus, dass die aktuelle Auswahl invertiert dargestellt wird, z.B. so :

    Bitte melde dich an, um diesen Anhang zu sehen.

    Jetzt ist meine Frage wie ich das ganze am besten in BasicV2 umsetzen kann.

    Ich kann natürlich alle Einträge in Variablen stopfen und nach der Auswahl einfach den gleichen String nochmal invertiert darstellen, allerdings wollte ich eigentlich gerne über den Bildschirmspeicher arbeiten, dann könnte ich mit A=PEEK(1024+X) die Zeichen auslesen und mit POKE 1024+X,A+128 das Zeichen direkt invertieren, allerdings dürfte das SEHR langsam sein ...

    Gibt es eventuell (ausser Maschinencode) noch eine andere Möglichkeit die ich noch nicht kenne :) ???

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Wenn es einer weiss wie man das in V2 macht, dann müsste das BIF sein.

    Ansonsten könntest du dir eine kleine Routine z.B. in den Kassettenpuffer legen die dir die Arbeit des invertieren abnimmt.

    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.

  • Also ich würde das über ein Array lösen.

    Und dann in einer Schleife wie (Achtung Pseudo-Code)

    for m=1 to 5

    if m=wahl then print"<revers on>";

    print menu$(m)

    next

    Früher waren 64k unglaublich viel, heute reicht es nicht mal mehr für "Hello, world!".

  • allerdings wollte ich eigentlich gerne über den Bildschirmspeicher arbeiten, dann könnte ich mit A=PEEK(1024+X) die Zeichen auslesen und mit POKE 1024+X,A+128 das Zeichen direkt invertieren, allerdings dürfte das SEHR langsam sein ...

    kannst mal ausprobieren, statt A+128 ein A AND 128 zu machen. Vielleicht ist das schneller.

    Uninvertieren dann mit A OR 255-128 (besser gleich 127)

    Evtl kann man die Schleife noch optimieren. Dh diese direkt mit den richtigen Adressen laufen lassen, um darin dann die Additionen +X zu sparen.


    Direkt im Bildschirmspeicher kann das nur der VDC Chip vom 128er. Beim VIC-II gibts kein extra AttributRAM, was man invertieren könnte.

    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
  • A AND 128

    A OR 255-128 (besser gleich 127)

    Umgekehrt! Bit 7 setzen: a OR 128, Bit 7 löschen: a AND 127.

    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 AND 128

    A OR 255-128 (besser gleich 127)

    Umgekehrt! Bit 7 setzen: a OR 128, Bit 7 löschen: a AND 127.

    Arndt

    Ach, richtig :biggrin:

    Danke!

    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
  • Hier eine Beispiellösung, die hoffentlich das gewünschte umsetzt (falls ich den Eingangsbeitrag hier richtig verstanden habe): Bitte melde dich an, um diesen Link zu sehen.

  • Ansonsten könntest du dir eine kleine Routine z.B. in den Kassettenpuffer legen die dir die Arbeit des invertieren abnimmt.

    Klar, aber es sollte schon in Basic realisiert werden :)

    Also ich würde das über ein Array lösen.

    Und dann in einer Schleife wie

    Aber dann würde er ja immer ALLE Einträge neu PRINTen, das stelle ich mir bei einem kompletten Bildschirm schwierig vor :gruebel

    Ich hab ausserdem vergessen, dass der alte Eintrag dann ja auch noch wieder als nicht-invertiert dargestellt werden muss ... hmmm, wahrscheinlich macht es doch mehr Sinn, den Eintrag mit einem Sonderzeichen davor zu markieren und das wandert dann einfach auf den ausgewählten Eintrag.

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • SkulleateR Hmm... wenn Du das mit einer Schleife wie von mir erwähnt erledigst, ist der nicht gewählte Eintrag doch automatisch nicht invertiert? Ich glaube, es ist so die schnellste Methode, wenn Du nicht über einen kurzen Assembler-Schnipp gehen willst.

    Früher waren 64k unglaublich viel, heute reicht es nicht mal mehr für "Hello, world!".

  • SkulleateR Hmm... wenn Du das mit einer Schleife wie von mir erwähnt erledigst, ist der nicht gewählte Eintrag doch automatisch nicht invertiert? Ich glaube, es ist so die schnellste Methode, wenn Du nicht über einen kurzen Assembler-Schnipp gehen willst.

    Ja das stimmt, da aber unter Umständen bis zu 25 Einträge auswählbar sein werden und mit einer Schleife immer alles neu gePRINTet wird, dauert das u.U. länger als PEEK/POKE .... ich teste das mal aus ...

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Ja das stimmt, da aber unter Umständen bis zu 25 Einträge auswählbar sein werden und mit einer Schleife immer alles neu gePRINTet wird, dauert das u.U. länger als PEEK/POKE .... ich teste das mal aus ...

    Aber du musst doch gar nicht alle 25 Einträge neu printen? Du setzt den Cursor auf die invertierte Zeile und printest da die Normalversion hin. Dann setzt du den Cursor auf die ausgewählte Zeile und printest dort die invertierte Version hin - feddisch!

    Und generell: Im Bildschirm rumzuPOKEn ist saulangsam, mit PRINT ist man fast immer besser dran.

    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

  • Aber du musst doch gar nicht alle 25 Einträge neu printen? Du setzt den Cursor auf die invertierte Zeile und printest da die Normalversion hin. Dann setzt du den Cursor auf die ausgewählte Zeile und printest dort die invertierte Version hin - feddisch!

    Und generell: Im Bildschirm rumzuPOKEn ist saulangsam, mit PRINT ist man fast immer besser dran.

    Ja, das ist klar. Ich bekomme aber ein Problem, wenn ich z.B. vier volle Bildschirme mit Auswahlmöglichkeiten habe, brauche ich bereits 100 Variablen, und da kommen dann ja nochmal einige dazu für das Programm selber. Daher hatte ich überlegt das über den Bildschirmspeicher direkt zu lösen ;)

    Ich schreib mal ein paar Testroutinen, die von hexfile erwähnte Lösung von Mike sieht schon sehr gut aus :)

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • SkulleateR :

    Hier mal meine kleine Select-Demo:

    Bitte melde dich an, um diesen Anhang zu sehen.

    ==> Zu steuern mit CURSOR-Tasten.

    Never ever kriegt man das mit POKE auch nur annähernd so schnell hin!

    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

  • Never ever kriegt man das mit POKE auch nur annähernd so schnell hin!

    Die Geschwindigkeit ist mir ehrlich gesagt voll Banane :D

    Aber dein Programm ist klasse, ich guck mal ob ich damit zum Ziel komme, super :thumbsup:

    "Werter Pöbel, wertes Gesocks ... aus dem Arsche zieht euch den Stock ..."

  • Mit Stringarrays ist das doch kein Problem.

    Aber POKEs gehen auch schnell, wenn man das Programm am Schluss kompiliert (was man eh machen sollte :) ).

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

  • Einfach einen String mit Reverse-On vor dem Menü-String ausgeben? So wie hier?

    Dateien

    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.

  • Abwegiger Gedanke: Die Menüpunkte mit Farbe statt mit Revers als ausgewählt darstellen.

    Dann könnte man den Bildschirmspeicher kurz verschieben und die Auswahl per Scrolling verschieben. Zum Runterscrollen braucht man noch einen Poke, und man kommt glaub ich nicht an die erste Bildschirmzeile ran. Aber ansonsten: Es ist Basic (wenn auch Bif-Basic) und printed die Zeilen nicht neu.

  • Die Menüpunkte mit Farbe statt mit Revers als ausgewählt darstellen.

    Das sagt Retrofan ja auch schon immer... :wink:

    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.

  • Das sagt Retrofan ja auch schon immer... :wink:

    Wobei ich das meist auf Bitmap-Ausgabe beziehe (passt aber vielleicht auch hier). Bei Bitmap-Darstellung müsste man ja jeden einzelnen Pixel invertieren, was arschlangsam ist – im Vergleich zum Setzen der Vorder- oder Hintergrund-Farbe von 8x8-Blöcken.

    Aber weil wir schon beim Einfärben sind – noch ein Vorschlag: Underlay mit gestreckten Sprites. Da muss man die Chars gar nicht mehr anfassen und könnte von der Performance her sogar ausprobieren, ob man die Zeilen-Einfärbung (die ich dann über die ganze Zeile gehen lassen würde) ganz cool pixelweise unter die nächste Textzeile schieben kann.

    Und noch eine kleine Ergänzung: Egal ob Invertierung oder anderes Verfahren, meistens sehen Text-Hervorhebungen besser aus mit einem Font, der in der Versalhöhe nur 6 px statt der C64-typischen 7 px verwendet. Z.B. mein Bitte melde dich an, um diesen Link zu sehen.. ;)

    Bitte melde dich an, um diesen Anhang zu sehen.

    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.

  • Aber dann würde er ja immer ALLE Einträge neu PRINTen, das stelle ich mir bei einem kompletten Bildschirm schwierig vor :gruebel

    Nein. Das Prinzip ist, einen Eintrag - den bisher aktivierten - nochmal, nicht-invertiert darzustellen und einen weiteren - den ab jetzt aktivierten - nochmal invertiert anzuzeigen - also zwei PRINT-Statements.

    Hier mal ein BASIC-Unterprogramm für vertikale Menüs, dass ich in den Achtzigern geschrieben habe. Kurzes überfliegen sagt mir:

    1. gewünschte Position des Menüs in den Variablen X/Y ablegen, Anzahl der Menü-Einträge in UH, die Menü-Einträge selbst in AA$(1) bis AA$(UH).
    2. mit GOSUB 40 aufrufen. Menü wird Cursor-Tasten und Return bedient, STOP (oder CONTROL+C, wenn STOP nicht per POKE unschädlich gemacht wurde) bricht das Menü ab.
    3. Nach Aufruf des Menüs steht die Nummer des ausgewählten Menüpunkts in der Variable B. Ist diese Variable 0, wurde das Menü abgebrochen.
    4. Sonstige vom Unterprogramm (intern) benutzte Variablen: RR$, A$. Irgendwo im Programm sollte man natürlich noch AA$() auf die maximal mögliche Anzahl von Menü-Einträgen DIMensionieren.

    Der von dir gewünschte Ansatz "über den Bildschirmspeicher" wird niemals schnell genug arbeiten.

    Code
    40 poke214,y:fora=1touh:poke211,x:sys58640:printaa$(a):next
    41 b=1:rr$="{rvon}":gosub47
    42 poke198,0:wait198,1:geta$:ifa$="{stop}"thenb=0:return
    43 ifa$=chr$(13)thenreturn
    44 ifa$="{down}"thenrr$="":gosub47:b=b+1+(b=uh)*uh:rr$="{rvon}":gosub47:goto42
    45 ifa$="{up}"thenrr$="":gosub47:b=b-1-(b=1)*uh:rr$="{rvon}":gosub47:goto42
    46 goto42
    47 poke211,x:poke214,y+b-1:sys58640:printrr$;aa$(b):return