Scroll- und Type-Routinen in BASIC V2

Es gibt 66 Antworten in diesem Thema, welches 11.224 mal aufgerufen wurde. Der letzte Beitrag (4. März 2015 um 22:19) ist von BIF.

  • Bytebreaker:
    Die Funktion holt einfach nur die Stringadresse aus 34/35. Der Rest sorgt dafür, daß die Adresse in 34/35 auftaucht.
    (a$..) ist immer Null, so daß peek(34/35) nicht geändert wird, sorgt aber dafür, daß die Stringadresse in 34/35 auftaucht.
    Ansonsten denke ich, daß peek schneller ist als read oder asc(mid .
    Außerdem macht es keine GBC.

    Schönen Gruß.

  • Man kann also sagen, daß der Sinn der Rechnung nicht darin liegt etwas zu berechnen, sondern die Register 34/35 mit der gewünschten String-Adresse zu laden.

    Schönen Gruß.

  • "Typer-Effekt"

    Naja, ich hatte die Wahl irgendeinen Starteffekt zu verwenden. Ich habe eben den gewählt. Alternativ wäre auch möglich gewesen, die erste Zeile gleich komplett anzuzeigen (das erschwert aber die Lesbarkeit) oder aber alles von Rechts reinzuschieben (dieses wäre sogar der simpelste Fall gewesen, aber wer will schon "simpel"; Leerzeichen im Scrolltext braucht's dazu allerdings keine, man muss nur den SPC-Befehl statisch machen, kann also den K/KK-Kram weglassen und immer S$ ausgeben).

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

  • @ BIF

    Und wenn man mehrere 40-Zeichen-Strings hat (a$,ab$,c$..), dann steht in 34/35 der Initiale Wert ab dem die Strings anfangen? d.h. man kommt per Offset an jeden Buchstaben ran?

  • Wenn man mehrere Strings hat, kann man das Unterprogramm mehrmals aufrufen.
    -Oder man kann die Strings, die sich ja innerhalb des Programms befinden in den Stringram-Bereich kopieren.
    Mit a$=a$+"":
    -Oder man addiert einfach mehrere Strings zusammen. Ein String kann ja bis zu 255 Zeichen erhalten, was immerhin über 6 Zeilen x 40 Zeichen Scrolltext sind.
    Pro String versteht sich.

    Schönen Gruß.

  • Zitat von BIF

    Bytebreaker:
    Die Funktion holt einfach nur die Stringadresse aus 34/35. Der Rest sorgt dafür, daß die Adresse in 34/35 auftaucht.
    (a$..) ist immer Null, so daß peek(34/35) nicht geändert wird, sorgt aber dafür, daß die Stringadresse in 34/35 auftaucht.
    Ansonsten denke ich, daß peek schneller ist als read oder asc(mid .


    Also wieder das gleiche Spielchen: ein "Trick", der auf einer Nebenwirkung beruht, die aus dem Programmtext als solches nicht hervorgeht. Das wäre ja an und für sich nicht schlimm, aber Du wirfst dieses Programmfragment einfach so in den Thread rein, trägst aber nichts zur eigentlichen Problemlösung bei, und läßt dir die Erklärung der Funktionweise deiner Programmfragmente auch noch gerne aus der Nase ziehen.

    Es muß hier wirklich von Programmfragmenten gesprochen werden, denn was Du im Regelfall ablieferst, sind ja nicht mal für sich ablauffähige Programme. Und was bringt es, wenn das Programm in Post Bitte melde dich an, um diesen Link zu sehen. einfach nur die Codenummer von "H", bzw. "H" selbst ausgibt? Das kann ich auch haben, ohne mir die Adresse von A$ zu holen - mit ASC(A$) und LEFT$(A$,1).

    Ich weiß auch, daß dich selbst diese Einwendungen einen S********ck interessieren werden, darum schreibe ich das hier weniger für dich, sondern als Bitte an Bytebreaker, dich nicht mit noch mehr Kartoffeln zu füttern.

  • Sehr schlank und verdammt flott :thumbsup: .

    Zu flott eigentlich. In Zeile 13 stand doch bestimmt vorher eine FOR/NEXT-Bremse :prof: . Scheixx schnelles BASIC :D .

    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.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • Mike:
    Herzlichen Glückwunsch!
    Auch wenn ich natürlich bemängeln könnte, daß die Erklärung zu deinem letzten Listing etwas knapp ist, sage ich hier einmal daß die Lösung wirklich ziemlich fix arbeitet.

    Schönen Gruß.

  • Drei Zeilen Code und das Ding rennt sofort los. Cool. :thumbup:

    Edit:
    In Mikes POKE-Listing auf Seite 2 fährt er eine sich 2x wiederholende (für sauberes Loopen) lange im RAM liegende Textzeile entlang mit einem 40-Zeichen-Sichtfenster, das per Print Befehl ausgegeben wird. Der Pointer (A) wird zwar umgebogen auf die neue "Cursor-Position" durch die POKEs in Zeile 19, das Basic denkt aber immer noch, a$ ist 40 Zeichen lang, daher klappt das mit den Ausschnitten. Mike setzt das Ende des Basic-Listings auf Adresse 16384 durch die POKEs in die Adressen 46 und 45 ganz zu Beginn. Dadurch setzt Basic den String-Start auf 16387, was Mike weiß und in seinem Code schon fest eingeplant hat durch Definition A=16387.

    Der CLR-Befehl am Anfang ist zwingend nötig, warum weiß ich nicht. Ich habe nur ausprobiert, dass das Programm ohne diesen Befehl nicht läuft.

    On- (Bedingung) Goto13:Goto14

    heißt, dass bei Nichterfüllen der Bedingung der Interpreter hinter dem Doppelpunkt weitermacht. Dadurch kommt es zu der Kopieraktion ins RAM, von der ich zwar gewusst habe dass sie stattfinden muss, aber nirgendes eine funktionierende Schleife dazu entdeckt hatte, weil ich die BASIC Syntax "On-" nicht kannte.

    Ich habe eben jetzt erst wirklich verstanden was das Programm macht. Ich dachte davor an so Sachen wie "Mike schreibt in die Bitplane" wegen der Adressen die er benutzt hat. und mich dann gewundert warum er ohne Grafikmodus auskommt. Naja, Anfänger-Schnellschuss-Denken.

    Ich schreibe diese Zeilen auch für oobdoo und alle anderen, die offen von sich sagen, dass sie hier und da noch dazulernen wollen, weil sie noch nicht alles wissen. Wer weiß wer von den Mitlesern noch in ähnliche Denkfallen getappt ist.

  • Hier noch einmal ein Code auf der Basis der Stringadresse, der durch die Arbeit mit peek, keine GBC und keine Data-Zeilen benötigt.

    Code
    5 ::b=50:print"[clr]z-roll:":print::b$="[hoch,rechts]"+chr$(20)+"[runter,links]"
    10 :a$="hallo, wie geht es euch ? ":gosub20
    11 :a$="und so weiter und so fort. ":gosub20:goto10
    19 :
    20 :fora=peek(34+0*len(a$))+peek(35+0*len(a$))*256toa+len(a$)-1:fori=0tob:next
    21 :printb$chr$(peek(a));:next:return


    Schönen Gruß.

  • Für einen Geschwindigkeitsvergleich kann man mal die Variable b in Zeile.5 auf Null setzen.
    Oder die Verögerungsschleife in Zeile.20 durch ein rem ausschalten.

    Schönen Gruß.

  • Für die Freunde der Garbage-Collection-Vermeidung:

    Der Kenner hat sicherlich erkannt, daß die Stringaddition in Zeile.5 zu einer GBC führen kann.
    Daher kann man bei dem b$-Ausdruck noch das chr$(20) entfernen und durch ein Leerzeichen ersetzen.
    Selbes Leerzeichen kann man dann mit einem reversen-t + Return überschreiben.
    Das ersetzt dann das chr$(20).
    Damit spart man dann gleich dreifach:
    1. an Programmcode
    2. den Stringmüll+String im Stringram
    3. einen eventuellen Zeitverlust durch die GBC

    Schönen Gruß.

  • Für einen Geschwindigkeitsvergleich kann man mal die Variable b in Zeile.5 auf Null setzen.
    Oder die Verögerungsschleife in Zeile.20 durch ein rem ausschalten.


    Warum machst du es dann nicht einfach und hängst auch mal ein .prg ran?

    Abgesehen davon, dass man es ja schon optisch sieht: 'Mike's Routine ist bei 40 Zeichen/Sekunde; deine bei 65 Zeichen/Sekunde. Glückwunsch.

    Als autarke Code-Schnipsel müsste man aber eh' beide runterbremsen. Sagt also nix. Käme auf die Verwendung an.

    Aber wenn ich mir deinen Code angucke und den von Mike, fällt die Entscheidung leicht:

    Pro Mike:

    - die DATAs können liegen wo sie wollen
    - man könnte zudem den Text einmalig in String-Arrays einlesen
    - man könnte problemlos weitere Aktionen einbinden für ein Intro o. ä. (vor dem "-ON"). Praktisch wie in einem IRQ
    - schön lesbarer, verständlicher Code

    Pro BIF:

    - ?

    Wo würdest du weiteren Code einbauen? In die Schleife vor dem NEXT?

    Zudem finde ich das wiederholte A$/GOSUB gruselig.

    Der Kenner hat sicherlich erkannt


    Sischer, sischer... :blah!

    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.

    Ex-TLI (The Level 99 Industries) & Ex-TNP (The New Patriots) & Ex-TEA (The East Agents) & ?

  • Äh ja, ich könnte die Geschwindigkeit ja noch steigern, wenn ich z.B. die Doppelpunkte am Anfang weglasse.
    Also, was ich sagen wollte, ist, daß auch mein Programm noch nicht völlig optimiert ist, aber dennoch, finde ich, schon zeigt, wie man es mit der Methode machen kann.

    Schönen Gruß.

  • Was natürlich von der Anwendung abhängt.

    Auch mein Programm hat natürlich seine Vorteile:
    -kein Stringmüll,
    -keine GarbageCollection,
    -es werden keine CLR´s benötigt.
    -es wird kein externer Speicherplatz verwendet,
    -es wird kein Maschinenprogramm benötigt.

    -Abgesehen davon kann man natürlich auch bei meiner Methode den Text in Datazeilen ablegen und einlesen, muß man aber nicht.
    -Als weiteren Vorteil könnte man ansehen, daß auch meine Lösung mit 3 Zeilen relativ kurz ist. Aber auch da kann man vermutlich noch was kürzen.

    Schönen Gruß.

  • Hexworx:

    Wo ich weiteren Code einfügen würde ?
    Das bleibt natürlich das Geheimnis des Programmierers.

    Wie wäre es mit einem gosub50 statt der Verzögerungsschleife.

    Schönen Gruß.