Hello, Guest the thread was called1.3k times and contains 9 replays

last post from Zirias/Excess at the

SYS Zeile in Turboassembler...

  • Hallo.


    Bin momentan Assembler am lernen. Ich arbeite mit Turboassembler (TASM aus dem Retroreplay) direkt am C64. Ich habe ein kleines Programm geschrieben. Es liegt an Speicherstelle $1000. Wenn ich das assemblierte Programm im Basic von Diskette lade kann ich es mit RUN nicht starten. Ich muss es mit SYS 4096 starten. Wie kann ich im Turboass assemblieren, dass ein Einzeiler Basic Programm entsteht mit SYS 4096, dass ich das Programm direkt mit RUN starten kann ?
    Im Crossassembler geht das mit dem !byte Befehl. Die Anwendung ist mir klar. Aber im TurboAss am Cevi geht das nicht. Der Befehl .byte schreibt die darauf folgenden bytes direkt in den Speicher und wenn ich im Monitor disassembliere benutzt er die bytes natürlich als Opcodes und Daten.


    Wie krieg ich das Programm mit RUN ins laufen ??



    Danke !


    Gruss Jan

  • Im Crossassembler geht das mit dem !byte Befehl. Die Anwendung ist mir klar. Aber im TurboAss am Cevi geht das nicht. Der Befehl .byte schreibt die darauf folgenden bytes direkt in den Speicher und wenn ich im Monitor disassembliere benutzt er die bytes natürlich als Opcodes und Daten.

    Bin mir nicht sicher, ob ich dich richtig verstehe. Was soll beim Deassemblieren eines BASIC-Programms denn anderes rauskommen als Bytes, die fälschlich als Opcodes interpretiert werden?


    Wenn du im BASIC-Eingabemodus des C64 als Programm etwas wie 2018 SYS4096 eingibst, hast du doch deine Bytes, die du so

    Code
    1. * = $0801
    2. .byte $0b,$08,$e2 [...]
    3. * = $1000
    4. [...]

    in den Quellcode einfügen kannst. Nach dem Assemblieren musst du dann nur noch den Bereich von $0801 bis zum Ende deines Programms speichern. Danach hast du ein mit RUN lauffähiges Programm.


    Alternativ kannst du einen Cruncher nehmen, der ein RUN bei reinen Maschinenprogrammen unterstützt. Da wird dann eine entsprechende BASIC-Zeile automatisch hinzugefügt. Edit: Das ist missverständlich. Der Crucher erzeugt eine durch RUN startbare komprimierte Version deines Programms und kann nach dem Dekomprimieren dein Programm direkt per JMP aufrufen. Das Ergebnis ist aber natürlich trotzdem, dass du eine durch RUN startbare Version deines Programms erhältst.

  • Wie kann ich im Turboass assemblieren, dass ein Einzeiler Basic Programm entsteht mit SYS 4096, dass ich das Programm direkt mit RUN starten kann ?
    Im Crossassembler geht das mit dem !byte Befehl. Die Anwendung ist mir klar. Aber im TurboAss am Cevi geht das nicht. Der Befehl .byte schreibt die darauf folgenden bytes direkt in den Speicher und wenn ich im Monitor disassembliere benutzt er die bytes natürlich als Opcodes und Daten.

    Du schreibst "Die Anwendung ist mir klar". Aber dann verstehe ich nicht, warum Du die Basic-Zeile im Monitor disassemblierst?!
    Wenn Du ein reines Maschinenprogramm mit Ladeadresse $1000 erzeugt bekommst, dann kannst Du auch "Basiczeile mit SYS und angehängtem Maschinenprogramm mit Ladeadresse $0801" erzeugen, eben mit besagtem .byte-Gedöns vorneweg.

  • Ok, es läuft.


    Ich wollte: 2018 SYS 4096


    Ich hab folgendes im Turbo Ass eingegeben:


    *=1000
    .byte $0b,$10,$e2,$07,$20,$9e
    .byte $20,$34,$30,$39,$36
    .byte $00,$00,$00


    Ich meinte mit "Die Anwendung ist mir klar", dass ich weiß, welches bytes ich setzen muss, um die SYS Zeile zu erzeugen. TRB hat es richtig geschrieben, so funktioniert es jetzt. Ich hätte müssen den Anfang für das Basic Programm auf $0801 setzen.


    *=$0801
    .byte $0c,$08,$e2,$07,$20,$9e
    .byte $20,$34,$30,$39,$36
    .byte $00,$00,$00
    *=$1000


    So geht es jetzt.



    Danke !!!!!


    Gruss Jan

  • ABER, in meinem Basic Programm ist jetzt eine ungewollte 2.Zeile. Ich dachte, die könnte man mit den letzten 3 00-bytes verhindern ?!

    Richtig, die drei Null-Bytes beenden ein BASIC-Programm. Hast du die zweite Zeile evtl. versehentlich erzeugt in der BASIC-Eingabe, nachdem du die erste BASIC-Zeile erstellt hast?

  • Ich hatte ganz vergessen, dass Basic Programme zwingend bei $801 starten müssen... oder hab ich da was falsch in Erinnerung ?

    Richtig, beim C64 ist das die reguläre Startadresse für BASIC-Programme, die so auch vom Betriebssystem erwartet wird. Eigentlich ist es $0800, aber das erste Byte an der BASIC-Startadresse muss immer Null sein (wird so vom Betriebssystem erwartet/verwaltet), weshalb diese erste Adresse manchmal nicht erwähnt wird. Die Ladeadresse für BASIC-Programme ist standardmäßig beim C64 eben $0801. Das erste Null-Byte im BASIC-RAM wird also nicht gespeichert.


    Andere Commodore 8-Bitter verwenden als Standard aufgrund ihrer Architektur andere BASIC-Startadressen. Diese Adressen lassen sich prinzipiell aber immer variieren, so auch beim C64. Das allerdings nicht ohne Änderungen im Vorfeld, um eben den BASIC-Start zu verlegen - sei es nun per speziellem Startprogramm (gibt's durchaus) oder eine Änderung des Betriebssystems (ist zumindest mir nicht bekannt). Bei der Änderung des BASIC-Starts ist dann natürlich wieder darauf zu achten, dass die sich auf das erste Byte im RAM bezieht, wo immer eine Null stehen muss.

  • Ich habe es jetzt noch etwas verbessert. *=1000 wurde entfernt, so wird das Programm kleiner. Im Maschinensprachemonitor habe ich dann geschaut wo die neue Startadresse von dem eigentlichen Programm ist. Die neue Startadresse ist dezimal 2065. Dementsprechend habe ich es abgeändert. Es geht jetzt alles wie ich mir das vorgestellt habe.. :-)

  • Ich habe es jetzt noch etwas verbessert. *=1000 wurde entfernt, so wird das Programm kleiner.


    Ja, klar. Du füllst dann nicht den Bereich von $801... bis $1000 mit unnützem Zeug (wahrscheinlich Nullen) im Outputfile.


    Falls Du aus welchen Gründen auch immer (evtl. Datenbereiche die für den VDC richtig aligned sein sollen) Dein Programm trotzdem an einer anderen Adresse laufen lassen willst, muß der SYS Befehl auf eine Routine springen, die Dein Programm an die richtige Stelle kopiert, und dann anspringt.


    Viele Grüße,
    chris

  • Falls Du aus welchen Gründen auch immer (evtl. Datenbereiche die für den VDC richtig aligned sein sollen) Dein Programm trotzdem an einer anderen Adresse laufen lassen willst, muß der SYS Befehl auf eine Routine springen, die Dein Programm an die richtige Stelle kopiert, und dann anspringt.

    Wenn man schon SO weit ist nimmt man in der Regel einen Cruncher her -- macht die Datei kleiner und Entpacken an die Zieladresse dauert nicht wesentlich länger als dorthin zu kopieren -- der Vorteil bei der Ladezeit von Diskette ist viel größer.