Hello, Guest the thread was called3.9k times and contains 35 replays

last post from wizball6502 at the

Locate ersatz? Courser Positionieren?

  • Quote

    Original von Roland
    ja...sowas geht mit ein paar POKES.... weiss ich aber nicht auswendig....
    Kommt aber bestimmt gleich ein Schlauer (oder Dummer mit schlauem Buch) vorbei, der dir das sagen kann...


    Ich bin ein Dummer mit C64 Wiki, gilt das auch?


    POKE 211,SP :POKE 214, ZE: SYS 65520: PRINT "A"


    Das Beispiel ruft die KERNAL-Routine PLOT ($FFF0) auf, positioniert den Cursor auf die angegebene Bildschirmspalte (SP) und -zeile (ZE) und danach gibt PRINT dort den Buchstaben "A" aus.

  • Cursor-Platzierung I
    Das Betriebssystem des C64 kennt eine einfache Routine, die es erlaubt einen Text an eine beliebige Stelle des Bildschirms auszugeben:

    Code
    1. POKE 214,{Zeile}: POKE211,{Spalte}: SYS 58640: PRINT"Text"


    Cursor-Platzierung II
    Mit dieser Programmzeile kann man den Cursor an eine beliebige Stelle des Bildschirms Positionieren.

    Code
    1. POKE 781,Z:POKE 782,S:POKE 783,PEEK(783) AND 254: SYS65520 (Z=Zeile,S=Spalte)


    Quelle:
    Emu-Ecke

    8 Bit sind genug, sonst komme ich morgens nicht aus dem Bett. %)


    „Nous sommes dans un pot de chambre et nous y serons emmerdés.“
    („Wir sitzen in einem Nachttopf und wir werden darin zugeschissen werden“)
    2.9.1870, Auguste-Alexandre Ducrot


    www.emu64-projekt.de/acme The home of ACME win32 compile.

  • Interessant, interessant.


    Die im C64 Wiki angegebenen Befehle sehen ja wie eine Kombination der beiden von der EMU-Ecke aus.
    Mal ausprobieren...


    Aus C64-Wiki:
    POKE 211,SP :POKE 214, ZE: SYS 65520: PRINT "Text"
    Das tut.


    EMU-Ecke#1:
    POKE 214,{Zeile}: POKE211,{Spalte}: SYS 58640: PRINT"Text"
    Das tut.


    EMU-Ecke#2:
    POKE 781,Z:POKE 782,S:POKE 783,PEEK(783) AND 254: SYS65520:PRINT"Text"(Z=Zeile,S=Spalte)
    Das tut.


    Alle Wege führen nach Rom?

  • Quote

    Original von AntaBaka
    Aus C64-Wiki:
    POKE 211,SP : POKE 214, ZE: SYS 65520: PRINT "Text"
    Das tut.


    Nicht zuverlässig. Es hängt davon ab, ob Bit 0 in Speicherstelle 783 gelöscht oder gesetzt ist. Ist es gelöscht, funktioniert der Weg nicht.
    Deshalb gibt es hier:


    Quote


    EMU-Ecke#2:
    POKE 781,Z: POKE 782,S: POKE 783,PEEK(783) AND 254: SYS65520: PRINT"Text"(Z=Zeile,S=Spalte)


    Den POKE 783,PEEK(783) AND 254. Er stellt sicher, dass das Carry-Flag (783, Bit 0) den richtigen Wert hat.


    Hintergrund: $FFF0 kann die Cursor-Position setzen (aus X und Y Registern) oder lesen (aus Speicherstellen 211, 214). Ist das Carry gelöscht, dann wird die Position gesetzt (781, 782 sind für den SYS-Befehl die X und Y Register), indem X nach 211 und Y nach 214 kopiert wird und dann die erforderlichen Berechnungen gemacht werden.


    Ist das Carry hingegen gesetzt, dann wird nur die Position gelesen (aus 211, 214) - die Speicherstellen bleiben also unverändert. Danach werden aber trotzdem die erforderlichen Berechnungen ausgeführt.


    Die Adresse 58640 wiederum ist die Routine, die von $FFF0 aufgerufen wird, damit die erforderlichen Berechnungen gemacht werden. Sie benötigt die Werte schon in 211/214.


    Also: Variante 1 ist unsicher, würde ich nicht nutzen.


    Gruß,
    Spiro

  • Quote

    Original von strik


    Nicht zuverlässig. Es hängt davon ab, ob Bit 0 in Speicherstelle 783 gelöscht oder gesetzt ist. Ist es gelöscht, funktioniert der Weg nicht.


    Ich bin nicht ganz einverstanden. Wenn du SYS zum ersten Mal ausführst, ist in 783 standardmäßig %00000000 (783 ist Prozessorflag-Byte bei SYS, wird beim Booten genullt), also das Carry ist aus, daher setzt PLOT ($FFF0) den Cursor. Nach SYS ist der letzte Prozessorstatus in 783, d.h. nach PLOT bleibt das Carry aus, denn PLOT ändert nichts daran.


    Wenn du allerdings ganz sicher gehen willst (weil du im Programm SYS auch für andere Sachen verwendet hast), dann füg obiger Zeile einfach ein POKE 783,0 hinzu, dann geht's sicher.


    Übrigens, das ist schnell. Noch ein paar Zyklen schneller gehts mit nem Direkteinsprung (SYS 58634). (Für Interessierte: der Befehl SYS beginnt bei $E12A (57642) und ist schon bei $E155 mit RTS zu Ende.


    Arndt

  • Hallo Arndt,

    Quote

    Original von GoDot
    Ich bin nicht ganz einverstanden. Wenn du SYS zum ersten Mal ausführst, ist in 783 standardmäßig %00000000 (783 ist Prozessorflag-Byte bei SYS, wird beim Booten genullt), also das Carry ist aus, daher setzt PLOT ($FFF0) den Cursor.


    Hast recht, in der Hitze das Tages ;) habe ich das wohl durcheinandergeworfen.


    Meine Kern-Aussage bleibt aber: Nicht zuverläßig. Du weißt nicht, ob nicht vielleicht sonst jemand ein SYS ausgeführt hat, oder diese Speicheradresse aus anderen Gründen verändert hat. Daher ist der POKE unbedingt wichtig. Das war meine Kernaussage.


    Quote

    Wenn du allerdings ganz sicher gehen willst (weil du im Programm SYS auch für andere Sachen verwendet hast), dann füg obiger Zeile einfach ein POKE 783,0 hinzu, dann geht's sicher.


    Genau das sollte meine Kernaussage sein. Ist wohl nicht so ganz rübergekommen, was?


    Quote


    Übrigens, das ist schnell. Noch ein paar Zyklen schneller gehts mit nem Direkteinsprung (SYS 58634). (Für Interessierte: der Befehl SYS beginnt bei $E12A (57642) und ist schon bei $E155 mit RTS zu Ende.


    Mist ist zwar nicht ganz klar, was die SYS-Routine mit der Schnelligkeit der PLOT-Routine zu tun hat, aber - na ja, egal. ;)


    Gruß,
    Spiro

  • Quote

    Original von strik
    Mist ist zwar nicht ganz klar, was die SYS-Routine mit der Schnelligkeit der PLOT-Routine zu tun hat, aber - na ja, egal. ;)


    Weil MS DOS fragte:

    Quote

    Joa besten dank für die vielen Antworten, und welcher der Methoden ist nun am Schnellsten und saubersten?


    Das war meine Antwort. Über $FFF0 (65520) ist's am saubersten, über $E50A (58634) ist es ein bisschen schneller (PLOT wird damit direkt aufgerufen, ohne Umweg über den Systemverteiler).


    Arndt

  • Hallo Arndt,

    Quote

    Original von GoDot
    Das war meine Antwort. Über $FFF0 (65520) ist's am saubersten, über $E50A (58634) ist es ein bisschen schneller (PLOT wird damit direkt aufgerufen, ohne Umweg über den Systemverteiler).


    Schon klar. Bloß: Du hast die SYS-Routine benannt. Die wird bei allen 3 Varianten benötigt, also ist sie garantiert nicht der bestimmende Unterschied zwischen den einzelnen Varianten bezüglich der Geschwindigkeit. Das war es, was mir so komisch vorkommt... ;)


    Gruß,
    Spiro

  • Moin! Ich tüftel gerade ein wenig herum und suche nach einer Möglichkeit ein Zeichen in der letzten Zeile anzuzeigen, ohne dass dabei der Bildschirm in die nächste Zeile springt. Geht das?


    Das hier funktioniert leider nicht:


    Code
    1. 1 poke 781,24: REM Zeile
    2. 2 poke 782,0: REM Spalte
    3. 3 poke 783,0
    4. 4 sys 58634
    5. 5 Print "x"
    6. 6 goto 6

    Ich beschreibe gerne deine Flashbausteine oder eproms, gegen Versandkosten. Schreib' mich einfach an und ich schaue ob meine Geräte deinen Baustein beschreiben können :winke:

  • Poke es doch hin, nicht getestet, sollte aber nicht umblättern:
    poke 1024+x,Zeichen


    1024 ist normalerweise die obere linke Ecke unter Basic, dann plus x (0 - 999 für die untere rechte Ecke). Zeichenkode musst du aus der Tabelle raussuchen (siehe hier).

  • Moin! Ich tüftel gerade ein wenig herum und suche nach einer Möglichkeit ein Zeichen in der letzten Zeile anzuzeigen, ohne dass dabei der Bildschirm in die nächste Zeile springt. Geht das?


    Das hier funktioniert leider nicht:


    Code
    1. 1 poke 781,24: REM Zeile
    2. 2 poke 782,0: REM Spalte
    3. 3 poke 783,0
    4. 4 sys 58634
    5. 5 Print "x"
    6. 6 goto 6


    Setz doch mal ein ';' hinter den Print-Befehl.

  • Danke für die Antwort, Gerrit - das funktioniert an sich, nur leider nicht beim allerletzten Zeichen ganz rechts unten.


    Das mit dem Poken in den Bildschirmspeicher sieht bis jetzt ganz gut aus, aber ich bräuchte noch Unterstützung für eine Zeichenfarbe.. ich POKE gerade ein wenig herum, finde aber noch nichts Passendes..

    Ich beschreibe gerne deine Flashbausteine oder eproms, gegen Versandkosten. Schreib' mich einfach an und ich schaue ob meine Geräte deinen Baustein beschreiben können :winke:

  • Moin! Ich tüftel gerade ein wenig herum und suche nach einer Möglichkeit ein Zeichen in der letzten Zeile anzuzeigen, ohne dass dabei der Bildschirm in die nächste Zeile springt. Geht das?


    Das hier funktioniert leider nicht:


    Code
    1. 1 poke 781,24: REM Zeile
    2. 2 poke 782,0: REM Spalte
    3. 3 poke 783,0
    4. 4 sys 58634
    5. 5 Print "x"
    6. 6 goto 6


    Das Scrollen in der letzten Zeile unterdrückte man einfach, indem man PRINT daran hinter in die nächste Zeile zu gehen:

    Code
    1. 5 Print "x";


    Haken dabei: bei der rechten unteren Ecke

    Code
    1. POKE 781,24:POKE 782,39

    ist ein Scrolling unvermeidlich (also mal abgesehen von irgendwelchen POKEs oder Patches in BASIC/KERNAL, die das Scrolling generell unterdrücken). Da ist die bereits vorgestellte Variante sicher praktikabler.
    (Sorry, hab Gerrits Antwort nicht gleich gesehen, aber jetzt hab ich's schon mal geschrieben). :whistling: