Hallo Besucher, der Thread wurde 4k mal aufgerufen und enthält 26 Antworten

letzter Beitrag von Mac Bacon am

File nachladen

  • Hallo zusammen,
    ich habe mir aus der Codebase64 folgendes Schnipsel gezogen, um ein File nachzuladen:



    Nachgeladen und direkt gestartet werden soll also ein Programm "test", welches sich im D64 Image befindet.
    Was allerdings passiert: das aufrufende Programm wird immer wieder aufgerufen (bzw immer wieder geladen, genau habe ich das noch nicht verstanden).
    Hab ich irgendwas offensichtliches übersehen?

  • Das dürfte wohl an dem "jsr BASIC RUN start" liegen. Überhaupt macht der Codeschnipsel ziemlich viel neben dem eigentlichen Gelade, vergisst dafür aber beim Laden eventuelle Fehler abzufangen, und die Kommentare ergeben auch nicht wirklich Sinn, ich würd daher vielleicht lieber mit diesem didaktisch wertvolleren Beispiel anfangen :)

  • Nur um sicherzugehen:
    -Ist das nachzuladende Programm BASIC oder Maschinensprache?
    -Wird der Dateiname korrekt (d.h. PetSCII-) kodiert? Bau mal hinter dem jsr $ffd5 ein bcs load_error ein, sonst merkst Du ja gar nicht, wenn das Laden schiefgeht.


    Grundsätzlich: Der Codeschnipsel ist grauenhaft. Wo die Kommentare nicht fehlen, sind sie falsch. ;)


    EDIT: Colt war mal wieder schneller.


    EDIT2: Nach Konsultation von codebase: Ah, Richard Bayliss, das erklärt es. Dessen Tutorials unterbieten das Niveau von Data Becker. :whistling:

  • Das von Colt verlinkte Beispiel erledigt nur das Laden selbst, den Aufruf von BASIC-RUN musst Du danach natürlich noch selbst machen.
    Dass der Code nicht vom nachgeladenen Programm überschrieben werden sollte, hast Du bedacht?

  • So, nach ein paar weiteren Experimenten stehe ich nun wieder auf dem Schlauch.
    Ich nutze nun die besser verständliche Routine von hier: http://codebase64.org/doku.php?id=base:loading_a_file


    Allerdings mache ich vermutlich so einiges falsch, aber der Reihe nach. Ich will ein BASIC Programm nachladen (und natürlich auch starten), keine Ahnung ob ein JMP $0801 überhaupt funktioniert für diesen Zweck? Soweit komme ich aber eh nicht, da mir laut Errorcode immer ein File Not Found ausgegeben wird.
    Ich gehe so vor: Ich kompiliere das File und füge es einem D64 hinzu, welches die Datei "abspann" bereits enthält.
    Bis dahin zu kommen war schon ein Learning, aber jetzt geht's ohne einen Schubs in die richtige Richtung nicht weiter.




    Die $d020er sind nur für's schnelle Debugging drin.
    Vielen Dank für Eure Hilfe.

  • ein jmp $080x wird auch nicht gehen bei reinen BASIC Programmen.
    Du willst ja den Basic-Interpreter damit fuettern und nicht den BasicQuelltext an die CPU weiterreichen direkt.
    Da ginge zB Folgendes:

    Code
    1. jsr $e453 ; prepare BASIC pointers for RUN
    2. jsr $a660 ;
    3. jsr $a68e ; RUN
    4. jmp $a7ae ;


    Benutzt in meinem Mini-TurboTape-loader ;-)
    http://www.codebase64.org/doku…turbotape_loader_source&s[]=turbo&s[]=tape

  • Eigentlich sollte es wohl !pet und nicht !scr sein, da die Kernal-Routine PETSCII und keine Screencodes erwartet. Aber das macht glaube ich keinen Unterschied zu Ryk's Vorschlag...

  • Jetzt sind wir schon ein ganzes Stück weiter!
    Ich glaube beide Fixes waren notwendig. Jetzt wird das BASIC Programm zumindest geladen (bricht, anders als sonst, allerdings mit einem OUT OF MEMORY ab).




    Euch auf jeden Fall schonmal vielen Dank für die Blitzantworten!

  • Fehlt da nicht noch das Setzen des BASIC-Ende-Zeigers in $2d/$2e vor dem jsr $e453?


    Edit: IIRC müssten zwei Befehle reichen:

    Code
    1. bcs error ; if carry set, a load error has happened
    2. stx $2d ; Neu!
    3. sty $2e ; Neu!
    4. jsr $e453 ; prepare BASIC pointers for RUN
  • Das war's!!


    Klasse, es läuft!
    Vielen Dank an alle Beteiligten. 15 Minuten und die Sache war gelöst - kann mit kein besseres Forum vorstellen.


    Hier nochmal der lauffähige Code falls später mal jemand ein ähnliches Problem hat:


  • Wenn du dein Maschinensprache Programm bei $C000 beginnen lässt, wäre es kontraproduktiv, eine BASIC-SYS-Zeile bei $0801 mit abuzuspeichern.


    Du würdest die KERNAL Load Routine nutzen mit Ziel $C000 und am Ende dann einfach JMP/JSR $C000 machen nach dem Ladevorgang