Assembler-Debugger gesucht

  • Hallo,


    Ich schreib gerade ein kleines Programm, mit dem man durch Druck auf p/P oder o/O den Bildinhalt nach links oder rechts schieben kann. Dazu werden Subroutinen aufgerufen, in denen der bildschirmspeicherinhalt links oder rechts rotiert wird.


    Irgend einen doofen Fehler habe ich aber gemacht, denn das Programm hängt nach dem ersten Tastendruck und tut nicht, was es soll:



    Kann mir jemand weiterhelfen?

  • Das stürzt ab, weil HL recht schnell an die Adresse #0000 gelangt und dort die Bits munter weiterrotiert werden, was an dieser Stelle sehr schlecht ist.
    Statt


    RL (HL)
    INC H
    JR NZ,L1
    INC L
    JR NZ,L1


    sollte es


    RL (HL)
    INC L
    JR NZ,L1
    INC H
    JR NZ,L1


    heißen.
    Aber dann wird es nach dem zweiten Scrolling abstützen, weil HL dann auf 0 steht und in Deiner Schleife nicht wieder auf #C000 gesetzt wird.


    Das Scrolling wird so auch nur nach rechts funktionieren, wenn Du auf diese Weise nach links scrollen willst, mußt Du den Bildschirmspeicher rückwärts von #FFFF bis #C000 durchgehen, damit jeweils das links rausfallende Bit im vorhergehenden Byte landet.


    CU,
    Prodatron

  • Oh, danke. Doofer Fehler!

  • Jetzt, wo es prinzipiell funktioniert, sehe ich: Das Linksscrollen mit RL funktioniert nicht so, wie ich mir das dachte. Da muss ich noch mal ran ...

  • Das Scrolling wird so auch nur nach rechts funktionieren, wenn Du auf diese Weise nach links scrollen willst, mußt Du den Bildschirmspeicher rückwärts von #FFFF bis #C000 durchgehen, damit jeweils das links rausfallende Bit im vorhergehenden Byte landet.


    Sag ich ja ;)

  • Ja, wer lesen kann, ist klar im Vorteil. :D


    So einfach scheint das aber auch nicht zu sein:


    Code
    1. .links
    2. LD HL,&FFFF
    3. L1:
    4. RL (HL)
    5. DEC H
    6. JR NZ,L1
    7. DEC L
    8. JR NZ,L1
    9. ret


    ... macht's jedenfalls nicht.

  • Zum Debugger: Schau dir mal WinApe an, der hat einen integrierten Debugger (und Assembler). Ich persönlich nehme sogar noch lieber den Debugger von WinCPC von Flynn. Der gefällt mir noch etwas besser. Damit kannst du dann sowas gut nachstellen.


    Noch ein kleiner Tipp: wenn du in deinem Assemblercode ein "db &ed, &ff" einfügst, springt WinApe automatisch in den Debugger. Damit wird nämlich ein Breakpoint signalisiert :).

  • Ich meinte natürlich eher einen menschlichen Debugger. :D

  • Du hast halt wieder H und L vertauscht ;)
    Das reicht allerdings auch nicht. Du mußt außerdem dafür sorgen, daß H nur bis #C0 runtergezählt wird.
    Sähe dann so aus:


    Code
    1. .links
    2. LD HL,&FFFF
    3. L1:
    4. RL (HL)
    5. DEC L
    6. JR NZ,L1
    7. DEC H
    8. BIT 6,H
    9. JR NZ,L1
    10. ret


    Folgendes wäre übrigens schneller (pro Byte nur 5 statt 8 Mikrosekunden):



    Nur mal um das Prinzip zu zeigen, wie man solche Schleifen beschleunigt :)


    CU,
    Prodatron

  • DANKE!!!


    Es soll aus Demonstrationsgründen langsam sein.