Simples ASM Programm

Es gibt 13 Antworten in diesem Thema, welches 3.160 mal aufgerufen wurde. Der letzte Beitrag (6. Dezember 2016 um 20:05) ist von Kongo-Otto.

  • Ich stehe auf dem Schlauch.

    Wenn ich im Monitor des C16 ein simples asm Listing eingebe, funktioniert es:

    Code
    1000 inc $ff15
    1003 jmp $1000


    -> sys 4096

    Jetzt möchte ich aber über ACME kompilieren und da klappt ein simples

    Code
    !cpu 6502
    !to "build/c16test.prg",plain    ; output file
    
    
    * = $1000                              
    
    
    main
        inc $ff15
        jmp main


    nicht. Die Datei wird zwar erzeugt, aber offensichtlich nicht so, wie ich das möchte.
    Was übersehe ich?

  • Wenn Du es an den BASIC-Anfang lädst, läuft einmal der Relinker drüber, weil er die Daten für ein BASIC-Programm hält, und dann ist der Maschinencode Matsch.

    Abhilfe: entweder woanders hin laden (und mit NEW die verdrehten BASIC-Pointer wieder besänftigen), oder einen BASIC-Stub mit einer SYS-Zeile vor den Maschinencode setzen. Letzteres hat dann noch den Charme, daß Du den Maschinencode einfach mit RUN starten kannst. :)

    Bitte melde dich an, um diesen Link zu sehen. ^^

    Edit: achso, ja, im *.prg File fehlt auch noch die Ladeadresse.

  • An der Länge 6 bytes sieht man schon, da fehlt wohl die Load-Adresse $1000 vorne dran. Wie man das dem ACME beibringt, weiß ich allerdings nicht, im XA mach ich da einfach immer ein ".word $1000" vorn dran.

  • !to "build/c16test.prg",cbm

    Wenn einer, der mit Mühe kaum, geklettert ist auf einen Baum, schon meint, daß er ein Vogel wär, so irrt sich der.

    Wilhelm Busch

  • !to "build/c16test.prg",plain ; output file

    "plain" sagt, dass ein PRG erzeugt wird OHNE die Ladeadresse !

    Ersetze "plain" mit "cbm" dann funzt es ;)

    EDIT : grrrr, Messerjocke of Stonehead war schneller ;)

    Viele Grüße,
    GI-Joe
    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. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.

  • :winke:

    Die Nachricht ist zu kurz. Der Text muss mindestens 2 Wörter enthalten

    Wenn einer, der mit Mühe kaum, geklettert ist auf einen Baum, schon meint, daß er ein Vogel wär, so irrt sich der.

    Wilhelm Busch

  • Code
    !cpu 6502
    !to "build/c16test.prg",cbm    ; output file
    
    
    * = $1000                             
    
    
    main
        inc $ff15
        jmp main

    Wohin lege ich denn den Code am besten? Laut Memory Map beginnt bei $1000 BASIC, welcher Speicherbereich wird denn üblicherweise für ASM Programme genutzt?

    Obiges Listing im Monitor ergibt seltsamerweise

    1000 INC $1007
    1003 JMP $1000

  • Passt schon, vielleicht den ASM-Code ein Paar Bytes höher und nen Basic-Start davor basteln.
    Pro-Tip: Im Basic mal SYS <Startadresse> eintippen, in den Monitor wechseln und gucken was der Interpreter daraus gemacht hat. ;) .

    Wenn einer, der mit Mühe kaum, geklettert ist auf einen Baum, schon meint, daß er ein Vogel wär, so irrt sich der.

    Wilhelm Busch

  • Da lege ich dir nahe, den Link in meinem vorherigen Posting zu lesen (auch wenn er in Englisch ist), und anstelle der $1201 im dort angegebenen Beispiel als Ladeadresse $1001 zu verwenden.

    Bitte nicht $1000 verwenden und da 0 drin haben. Daß da eine Null drinsteht, da kümmert sich schon der BASIC-Interpreter drum (Du *müßtest* sonst den Code immer mit ",8,1" laden - so reicht dann ",8").

    Edit: Glückwunsch. Du siehst genau den Effekt vor dem ich da auch schon gewarnt hab. Der BASIC-Relinker hat dein Programm beim Laden zerschossen.

  • Laut Memory Map beginnt bei $1000 BASIC, welcher Speicherbereich wird denn üblicherweise für ASM Programme genutzt?

    Willst Du denn parallel zu Deinem ASM-Code überhaupt BASIC benutzen ? wenn nicht, kannste doch direkt n BASIC-Header mit einbauen und dort laufen lassen.
    Eigentlich kannste das überall laufen lassen, wo freier Speicher vorhanden ist ... für son Kleinkram missbrauche ich den Anfang des Stacks auch mal ganz gern ;)


    oder einfach so:

    Viele Grüße,
    GI-Joe
    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. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.

    Einmal editiert, zuletzt von GI-Joe (6. Dezember 2016 um 17:14)

  • Da lege ich dir nahe, den Link in meinem vorherigen Posting zu lesen, und anstelle der $1201 im dort angegebenen Beispiel als Ladeadresse $1001 zu verwenden.

    Danke Mike, das hatte ich mir durchgelesen, aber offenbar reicht mein Goldfischgedächtnis heute nicht aus, um daraus was lauffähiges abzuleiten.

    Danke GI-Joe für den funktionierenden Code!
    Den kann ich auch für die 64er Sachen gut gebrauchen, klasse.

  • Danke GI-Joe für den funktionierenden Code!

    Du musst öfter mal auf den MYD-FTP gucken, da liegt so einiges an code rum zur "freien" Verwendung ;)

    Viele Grüße,
    GI-Joe
    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. * Bitte melde dich an, um diesen Link zu sehen. * Bitte melde dich an, um diesen Link zu sehen.

  • awsm, halb so wild. :)

    Wegen "freier" Speicherbereiche: für kleine Programme bietet sich auf dem C16/C116/+4 der Bereich von 1630..1771 an. Der war ursprünglich mal für den Sprachsynthesizer vorgesehen - da der aber nur mit den Vorführexemplaren des 364 realisiert wurde, liegt der Bereich jetzt brach.

    Der Tape-Buffer liegt etwas anders, von 818..1010, läßt sich aber genauso verwenden wie beim C64 oder VC-20.

    Weiterhin kannst Du die RAM-Grenze absenken (Pointer ist in 55/56) - da nicht vergessen, mit CLR auch andere Pointer zu korrigieren, deshalb machst Du das am besten unmittelbar nach Programmstart. Nachteil hier: auf den 16K Maschinen wird derart platzierter Code durch eingeschaltete Hires-Grafik in der Regel überschrieben. Außerdem sperrt die Methode bei einer 64K Maschine evtl. unnötig viel Speicher weg.

    Zum Schluß noch die Variante, welche den Maschinencode (und evtl. noch Zeichensatz, etc.) zusammen mit einem BASIC-Stub *vor* das eigene Nutzlast-BASIC-Programm setzt. Hat den Charme, daß das Mehr an Speicher bei einer 64K Maschine immer noch verfügbar bleibt, ist aber etwas schwieriger zu realisieren.