Suche die KÜRZESTE Routine um einen Cursor blinken zu lassen oder "kurz abzuwarten" (ohne IRQ)

Es gibt 18 Antworten in diesem Thema, welches 1.224 mal aufgerufen wurde. Der letzte Beitrag (8. Oktober 2024 um 15:14) ist von aitsch.

  • Moin,

    der Titel klingt blöd aber mir ist nicht s besseres eingefallen.

    Bestimmt gibt es einen Trick (z.Bsp. ein Standard-Register oder eine ZP-Adresse) den man nutzen kann um einen Cursor blinken zu lassen oder eine kurze Zeitspanne (0,5 - 1 Sek.) abzuwarten und ich kenne ihn mal wieder nicht ;(

    !!! Und zwar ohne den IRQ umbiegen zu müssen !!!

    Also z.Bsp.:

    Code
    .wait 
      lda timer
      beq .wait
    ; blinken
      lda screenposition
      eor #%10000000
      sta screenposition
      jmp .wait
      ...

    Eine simple Verzögerungsschleife mit verschachtelten X & Y-Registern ist natürlich kein Problem

    aber es soll ja möglichst KURZ sein.

    Meine VC20 Projekte:

    🕹 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.

  • aitsch 7. Oktober 2024 um 18:22

    Hat den Titel des Themas von „Suche die kürzeste Routine um einen Cursor blinken zu lassen odder "kurz abzuwarten" (ohne IRQ)“ zu „Suche die KÜRZESTE Routine um einen Cursor blinken zu lassen oder "kurz abzuwarten" (ohne IRQ)“ geändert.
  • Kann man sich nicht bei $cf bedienen?

    Zitat

    Flagge für Blinkzustand des Cursors

    In dieser Speicherzelle wird festgehalten, in welcher der beiden Blink-Phasen - normal oder revers - der Cursor sich gerade befindet. Eine 0 bedeutet reverses Zeichen, eine 1 bedeutet ein normales Zeichen.

    ungetestet:

    lda $cf

    ror

    ror

    eor screenposition

    sta screenposition

  • Mit dem $cf-Register hatte ich auch schon geliebäugelt aber da steht immer "0" drin.

    Meine VC20 Projekte:

    🕹 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.

  • !!! Und zwar ohne den IRQ umbiegen zu müssen !!!

    Whatchamean? Bist Du im Startup-Screen unterwegs und hast den IRQ-Pointer nicht angefasst und mittels SEI gesperrt oder hast Du Deinen eigenen IRQ-Pointer und möchtest den cursor im "Hauptprogramm" laufen lassen?

  • Probier' mal dies:

    Code
      lda #$00
      sta $cc

    Gruss,

    Neptun

    Ja, das funktioniert.

    Allerdings zu gut :D dadurch wird auch der Basiccursor eingeblendet.

    Ich habe meinen Cursor selbst programmiert und brauche nur einen Timer für die Blinkfrequenz.

    Damit blinken dann zwei Cursor auf dem Bildschirm ;)

    Bitte melde dich an, um diesen Anhang zu sehen.

    Sorry, ich hatte mein Problem nicht gut beschrieben.

    Nachtrag: rayden siehe oben ich brauche eigentlich einen Timer für die Blinkfrequenz eines Cursors

    Meine VC20 Projekte:

    🕹 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.

  • Allerdings zu gut :D dadurch wird auch der Basiccursor eingeblendet.

    Versuche mal $d3 außerhalb des sichtbaren Bereichs (z.B. #$40) zu setzen. Die Frage ist dann allerdings, ob das alles dann noch viel kürzer ist, als eine mittels x & y verschachtelte Schleife.

  • Neptun Den Basiccursor zu aktivieren ist trotzdem genial.

    so erspare ich mir das Invertieren des Characters unterhalb den Cursors:

    Code
      ldx cursor_xpos
      ldy cursor_ypos
      clc
      jsr PLOT                ; $fff0
      lda #0
      sta $cc                 ; Cursor an
    - ; warte auf Eingabe
      jst CHRIN               ; ffe4
      bne -
      inc $cc                 ; Cursor aus

    in Summe ist das schomal kürzer als mein Custom-Cursor :thumbsup:

    Meine VC20 Projekte:

    🕹 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.

  • Du könntest noch

    Code
    clc
    jsr $fff0

    durch

    Code
    jsr $e50c

    ersetzen. 1 Byte gespart, aber dafür die Sprungtabelle missachtet.

    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

  • Wird gemacht. Ich nehme jedes Byte mit :)

    Falls ihr noch eine Idee für einen 0.5 bis 1.0 sek. Verzögerungstimer habt, immer her damit.

    Sowas suche ich noch:

    Code
    ; Ton an
      ...
    -
      lda delay_register
      bne -
    
    ; Ton aus  ...

    Meine VC20 Projekte:

    🕹 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.

  • Ich löse sowas entweder so

    oder mittels IRQ (imho flexibler einsetzbar)

  • Für 1 Sekunde hab ich folgenden Snippet in Fundus:

    Code
    LDX #$32 ; = 50 Frames
    .wait
    BIT $d011
    BPL .wait
    -
    BIT $d011
    BMI -
    DEX
    BNE .wait

    "Führungskräfte verrichten keine Arbeit." — Schülerduden Physik

  • Das ist alles Teil des VC20-Assemblers?
    Vielleicht lässt der sich auch "andersrum" denken: Der normale Basic-Editor bleibt weitgehend aktiv, und nur bei Druck auf Enter wird Dein Programm aktiv und sieht sich die Eingaben an?

  • Hoogo ich bin mir nicht sicher, ob ich verstehe was Du meinst. Was ist denn zu tun, um den Basic Editor soweit zu zu reduzieren?

    Das was auf dem Screenshot zu sehen ist ist ein VC20-Assembler den ich gerade entwickle bzw. ist er zu 95% fertig und ich versuche hier und da noch ein paar Bytes rauszukizeln.

    Meine VC20 Projekte:

    🕹 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.

  • Hoogo ich bin mir nicht sicher, ob ich verstehe was Du meinst. Was ist denn zu tun, um den Basic Editor soweit zu zu reduzieren?

    Wenn ich mich da mal erinnern könnte :nixwiss:

    Da war irgendein Vektor. Wenn man Return drückt, dann wird die aktuelle Zeile tokenisiert, und auf dem Weg dorthin gab es einen Vektor...

  • Da war irgendein Vektor. Wenn man Return drückt, dann wird die aktuelle Zeile tokenisiert, und auf dem Weg dorthin gab es einen Vektor...

    Der Vektor bei ($0302) "greift" bereits vorher, und hat die Zeileneingabe fix drin, der Weg zur Tokenisierung der Eingabe ist nicht vektoriert - siehe ROM $C480..$C499: JSR $C579 macht die Umwandlung und mit JMP $C7E1 wird in die Interpreterschleife gesprungen.

    Jetzt greift zwar direkt am Anfang von $C579 der Vektor ($0304), wird der aber verbogen, hat man sozusagen kein BASIC mehr: die Routine macht wirklich alles um die Eingabe zu parsen und tokenisieren und hat man da jetzt was anderes drin, dann ist man komplett verantwortlich dafür - daß bei der Rückkehr irgendwas im Eingabepuffer steht, was der Interpreter verarbeiten kann (denn die Rückkehr hinter JSR $C579 ist ja immer noch auf dem Stack).

    ...

    Für die verlangte Extra-Funktionalität des Screen-Editors (u.a. das bi-direktionale Scrolling) braucht es jetzt halt auch Extra-Code. Von nichts kommt nichts. Das bedeutet im schlimmsten Fall eben, einen großen Teil des Screen-Editors nachzubauen. VICMON implementiert dies teilweise über den Interrupt, daneben gibt es auch noch den Tastatur-Dekodier-Vektor bei $028F, bei man ggfs. einspannen kann - letzteres macht z.B. die Programmer's Aid Cartridge um dort die erweiterten Screen-Editor-Funktionen zu implementieren.

    In allen Fällen ist jeder weiterer gebrauchter Vektor einer, der sich möglicherweise mit dem Gebrauch desselben Vektors im Benutzerprogramm (also, außerhalb der Programmierumgebung, d.h. der Monitor) beißt: überschreibt das Benutzerprogramm den Vektor, steht die Programmierumgebung blank da. Je weniger so etwas wie ein Monitor in die normalen Abläufe des Rechners eingreift bzw. eingreifen muß, umso besser und robuster ist die ganze Angelegenheit.

  • ...

    Für die verlangte Extra-Funktionalität des Screen-Editors (u.a. das bi-direktionale Scrolling) braucht es jetzt halt auch Extra-Code. Von nichts kommt nichts. Das bedeutet im schlimmten Fall eben, einen großen Teil des Screen-Editors nachzubauen

    ...

    Das ist alles schon erledigt.

    Ich bin aktuell in der Optimierungsphase.

    Meine VC20 Projekte:

    🕹 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.

  • Ich bin aktuell in der Optimierungsphase.

    Neben dem benötigten Platzbedarf eines Programms und der erwünschten möglichst geringen Laufzeit gibt es mindestens noch eine weitere Dimension, die man beim Programmieren optimieren kann: die Zeit nämlich, die man mit dem Programmieren selbst verbringt. ;)

    Wenn dein Tool also schon einsatzfähig ist und keine unmittelbar erkennbaren Probleme aufweist, was spricht dagegen, es schon mal in dieser Version zu veröffentlichen und so auch mal den Blick frischer Augen auf das (Zwischen-)Produkt zu ermöglichen? Da kommt möglicherweise mehr bei rum, als wenn Du alleine da jetzt noch weitere Tage/Wochen/Monate dran sitzt.

  • Das werde ich in Kürze tun. Momentan könnte noch ein weiteres Feature dazu kommen.

    Einen erste Testversion sollte m.E. zumindest vollständig sein und eine kleinen Anleitung ist auch notwendig.

    Meine VC20 Projekte:

    🕹 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.