Hallo Besucher, der Thread wurde 1,5k mal aufgerufen und enthält 5 Antworten

letzter Beitrag von olly am

Meine ersten Gehversuche in Assembler

  • Hallo,


    ich bin absoluter Assembler und Maschinensprache Anfänger und habe erste Gehversuche der Maschinensprachprogrammierung auf meinem C128D unternommen was ich hier gerne mal vorzeigen möchte wenn ich darf. Die Profis werden sich zwar kringeln, aber das macht nichts und ich trau mich mal das hier zu zeigen.


    Durch die Möglichkeit, die RTC der 1541UII+ auslesen zu können, habe ich mir in den Kopf gesetzt, eine Routine in Assembler zu entwickeln, die die RTC mit Datum der UII+ ausliest und auf dem 80 Zeichen-Schirm in einer zusätzlichen 26. Zeile in den Systeminterrupt eingeklinkt ausgibt. Die 26. zusätzliche Zeile habe ich eingerichtet, weil die vom Betriebssystem unbeeinflusst bleibt.


    Für einen Anfänger vielleicht nicht die beste Wahl für einen Anfang, aber wenn ich mir was in den Kopf gesetzt habe, lässt mich das nicht mehr so schnell los. Es war auch nicht wirklich einfach, aber die Uhr läuft. Zwar nicht sehr stabil, weil ja VDC und Interrupt so ihre Probleme miteinander haben aber ich bin schon stolz, dass ich es so hinbekommen habe. Den Fastmodus mag die Routine auch nicht wirklich.


    Für die Routine zum Auslesen der UII+ habe ich bei Tokra seiner für GEOS abgeschaut. Ich hoffe das ist erlaubt. Ich habe sehr viel recherchiert, gelesen, assembler gelernt, und Assemblerlistings auseinander genommen um zu verstehen was da so abläuft. So habe ich eine funktionierende Routine gebastelt. Jetzt habe ich einen guten Eindruck, was Assemblerprogrammierung bedeutet.


    Zuerst wird die zusätzliche 26. Zeile eingerichtet. Dann wird die RTC der UII+ ausgelesen und in CIA-TOD schreiben. Dann das Datum in der 26. Zeile ausgeben, die Interruptroutine vorbereiten und die Vektoren verbiegen. Die Interruptroutine sollte eignetlich weitere Interrupts tollerieren, aber da bin ich mir noch nicht so sicher. Auf jeden Fall wird der SP überprüft, ob zwischen den IRQ´s irgendetwas am VDC passiert ist. Wenn dem so ist, wird die neue IRQ-Routine einfach übersprungen. Das klappt zwar, aber nicht wirklich zuverlässig. Ich habe aber keine andere Möglichkeit gefunden das wirklich stabil hin zu kriegen (als blutiger Anfänger). Habe das ganze auch mal noch über einen NMI gemacht. Das läuft auch.


    Wie auch immer, wer möchte kann sich das ja mal anschauen.


    Die Programme laufen ausschließlich auf dem 128er im 80 Zeichenmodus. Wenn keine 1541UII+ angeschlossen ist, merkt das das Programm und wird ohne Ausgabe beendet. Mindestvorraussetzung ist die 1541 Ultimate II+ Firmware 3.1a_500+_v4 von MarcusC64 und aufwärts.


    1x mit Sekundenanzeige und 1x ohne Sekunden.
    Start ist mit SYS3027. Die Routinen liegen ab $0C00. Idealerweise im Slow-Modus. Im Fast-Modus ist die Routine irgendwie hackelig.


    Benutzung auf eigene Gefahr ;) und wer mag, kann ja dazu mal was sagen. Aber bitte, ich bin absoluter Anfänger. Das ist mein absolut 1. Assemblerprogramm.


    Viel Spaß und Grüße.

  • Habe mal das D64 runtergeladen und sehe gerade, dass es nur die PRG dabei hat.
    Auf x128.exe (VICE) bringt's logischerweise nix.


    WIllst Du den Source vielleicht auch posten?

  • WIllst Du den Source vielleicht auch posten?

    Klar, warum nicht. Hab ich in dem Moment garnicht dran gedacht. Den Source (EDASS-Format) muss ich aber voher noch ein bissel ausmisten und kommentieren. Momentan ist der Zusatnd so nicht vorzeigbar. :/


    Aber, das mache ich die Tage mal. Und vielleicht hat ja ein Profi noch einen guten Tip wie man Dinge anders oder Besser machen könnte. Besonders das Zusammenspiel mehrerer Interruptroutinen parallel und die Programmierung einer zuverlässigen Prozessorstacküberwachung im Hinblick auf den VDC im IRQ interressieren. Im groben hab ich zwar raus wie´s geht, aber bestimmt nicht das Optimum. Nächster Schritt wird einen Mauszeiger gleichzeitig zu der Uhr im 80 Zeichenmodus. Die Mousepointerroutine läuft auch im IRQ und ist solo schon da. Mal schaun, da bin ich aber noch am recherchieren und per try and fail am probieren und testen. Im GEOS 128 geht das im 80 Zeichenmodus ja auch irgendwie. Ich vermute dort aber in einem Grafikmodus und nicht im Textmodus. Darin wird wohl der kleine aber entscheidende Unterschied liegen.


    Bis dahin.

  • WIllst Du den Source vielleicht auch posten?

    Das bin ich ja noch schuldig. Hat bissel gedauert, sorry.


    Hab den Source noch bissel aufgeräumt und etwas mehr auskommentiert (hoffe, man kann es lesen). Die Routine ist definitiv nicht pefekt, aber sie funktioniert erstmal (ein bisschen).
    Wie schon geschrieben, macht die Routine folgendes: (im VDC 80-Zeichen-Modus in einer eigenen IRQ-Routine)

    Soweit, so gut. Bin eigentlich ganz stolz, soweit gekommen zu sein.


    Hier ist nun das dokumentierte Assemblerlisting im EDASS-Format (Start nach dem Assemblieren oder des angehängten Objektcode mit SYS4864): Im VICE funktioniert das logischerweise nicht! ^^
    Und natürlich nur mit 1541 Ultimate II+ bei mir letzte FW.Revision 3.2a (110).
    Wenn jemand noch Ideen dazu hat, immer gerne. Würde mich freuen. Im Anhang noch die Dateien dazu.

    Screenshot:



    Cheers :winke: