Hello, Guest the thread was called2.1k times and contains 31 replays

last post from MC64 at the

C64, C128 und andere CBM's: Übersicht der Einstiegsadressen der Kernalroutinen

  • gibts eine tabelle mit den einstiegsadressen für kernalroutinen ?

    ziel ist es meine routinen auf andere computer übertragbar zu machen.

    konkret geht es mir derzeit um die routine $e257 (c64) das pendant für c128

    such ich. in meiner literatur werd ich da nicht fündig.


    $e257 nutze ich um einen string an ein assembler programm mittels eines sys zu übergeben.

    ich brauch die adresse für den c128 modus.

  • war64burnout

    Changed the title of the thread from “c64 c128 und andere cbmś übersicht der einstiegsadressen der kernalroutinen” to “C64, C128 und andere CBM's: Übersicht der Einstiegsadressen der Kernalroutinen”.
  • Was Du hier verwendest ist ein nicht standardisierter Einsprung in den Kernal. Ist ja schon die Frage ob das bei einem alternativen ROM (z.B. JiffyDOS) noch die gleiche Adresse ist. In Deinem Fall übergibst Du einen Filenamen als String (glaubt man "C64 für Insider").


    Du kannst natürlich das ROM-Listing des 128er verwenden ("C128 intern"). Gefühlt könnte bei $9236 das stehen was Du suchst.


    Code
    1. 9236 20 EB 91 JSR $91EB ;Auf Komma und weitere Zeichen prüfen
    2. 9239 20 7B 87 JSR $877B ;Stringausdruck auswerten und Parameter holen
    3. 923C A6 24 LDX $24 ;Adresse des Filenamens
    4. 923E A4 25 LDY $25 ;laden
    5. 9240 4C 50 92 JMP $9250 ;Filenamenparameter setzen

    In "C64 für Insider" steht bei $e257 ähnliches.... Text aus "C128 Intern OCR" kopiert...

  • Ich hatte in den 90ern auch mal ein BASIC-Programm und eine Ass-Erweiterung geschrieben die mit SYS xxx,"TEXT" funktioniert. Hab damals auch direkte ROM-Adressen verwendet. Was nicht heißen soll das dies Sinnvoll ist. Damals war die Welt für mich noch eine Insel ;)



    Heute würde ich mir glaube ich eigene Routinen entwickeln oder die Kernal-Routinen kopieren. Oder zumindest prüfen ob an der Adresse der richtige Befehl steht und ggf eine Meldung einlenden "Falsches ROM" oder so...


    P.S. Screenshot stammt von meinem "Super Input de Luxe" von 1990... war eine Erweiterung für den Input-Befehl... Position und Länge festlegen, versteckter Text, Farbe usw... gab da viele Optionen.

  • allerdings $9236 funktioniert so leider nicht.

    Ja... bekomme da auch nur "Syntax error". Vom ROM-Listing her ist das der entsprechende Code, das dumme ist: der 128er ist anders als der 64er... der hat zwei Speicherbänke. Evtl. beruht das Problem darauf. Aber da muss Dir jemand anderes helfen, 128er ist Teufelszeugs ;)

  • bin zu dem selben ergebnis gekommen. muss wohl mal $e257 zerpflücken und gucken was da beim 128er anders läuft.

    anscheinend benutzt auch niemand $e257. find im internet nix dazu. aber das ist schon so wie du sagst, weil das keine

    standardkernal routine ist.

  • bin zu dem selben ergebnis gekommen. muss wohl mal $e257 zerpflücken und gucken was da beim 128er anders läuft.

    Das ist nicht nur bank#0/1 sondern auch diverse Register wie MMU($FF00)&Co. Da werden dann je nach Einstellung verschiedene Speicherbereiche eingeblendet (Shared Memory usw). Musste mich vor ein paar Monaten auch damit rumärgern.

  • da hab ich mich bischen eingelesen. hatte ehrlich gesagt bisher die hoffnung, das ich da vorerst drauf verzichten kann. das thema common area usw ist nicht ganz ohne.

    So ist es... mir ist das fast zu hoch. Hab damals nur das notwendigste rausgezogen... und jetzt Ad Acta gelegt. Ich wünsch Dir dabei viel Glück.:thumbup:

  • bin zu dem selben ergebnis gekommen. muss wohl mal $e257 zerpflücken und gucken was da beim 128er anders läuft.

    anscheinend benutzt auch niemand $e257. find im internet nix dazu. aber das ist schon so wie du sagst, weil das keine

    standardkernal routine ist.

    Also das Äquivalent wäre $9239 (nicht $9236, wo ein Check-Comma noch dabei ist, was beim C64 mit $E257 auch nicht dabei ist. Beim C64 wird an der Stelle nur das String-Housekeeping zusätzlich aufgerufen, was bei BASIC 7 nicht notwendig ist, da die String-Organisation anders ist.

    Bei den entsprechenden Routinen wird m.E. die notwendige Bank im ROM von sich aus gesetzt (meist Bank 15). Die Ausdrucksauswertung ruft CHRGET auf, das auch wiederum die BASIC-Text-Bank von sich aus setzt. Also ich glaube nicht, dass da hier ein Banking-Problem vorliegt ...

  • Du kannst Dir gern das C128 Listing ansehen: C128 Kernal & BASIC 7.0

    Die Datei C128.lst enthält das komplette, kommentierte Listing.


    Die hier erwähnten Einsprungadressen $9236 und $9239 halte ich allerdings nicht für geeignet, da sie dazu da sind, einen Filenamen zu definieren, der dann in einem folgenden OPEN Befehl verwendet wird. Siehe

    Code
    1. 9236 20 eb 91 JSR Need_Comma_And_Byte
    2. ; ********************
    3. 9239 Get_Filename ; $9239
    4. ; ********************
    5. 9239 20 7b 87 JSR Eval_String ; read filename
    6. 923c a6 24 LDX INDEXA ; fn address low
    7. 923e a4 25 LDY INDEXA+1 ; fn address high
    8. 9240 4c 5d 92 JMP B_SETNAM ; declare filename

    Im C128 ist der Mix aus BASIC und selbst geschriebenen Assemblerprogrammen in der Tat sehr tricky. BASIC arbeitet permanent mit 3 Bank-Konfigurationen. Der BASIC Interpreter selbst liegt im ROM $4000 - $BFFF, BASIC Programme werden in der RAM Bank 0 gespeichert, während alle Variablen, und damit auch Strings, in der RAM Bank 1 landen. Dafür hat der Interpreter viele kleine Routinen in den Common Bereich kopiert, um dann Routinen aufrufen zu können, die z.B. Zahlen wahlweise aus dem ROM, RAM 0 ode RAM 1 lesen, indem sie auf die entsprechende Konfiguration umschalten, auslesen und wieder zurückschalten.

    Hier z.B. eine Routine aus dem Listing:

    Ich glaube, ich würde Dein Problem so angehen, dass ich für den String immer eine bestimmte Variable verwende, z.B. AA$, und den Speicherort dieser Variablen im Assemblerprogramm suche, um die Daten dann auszulesen.


    Viele Grüße,

    Bit Shifter

  • danke erstmal für eure hilfe. $9239 funktioniert so auch nicht. wie bitshifter schon sagt, wird damit der filename gesetzt.

    aber ich werd da mal weiter forschen und dann berichten.

    Du könntest die Funktion Eval_String $877b verwenden.

    Die liest aus dem BASIC Programm einen String oder einen String-Ausdruck, wertet ihn aus und liefert nach dem Aufruf einen String-Descriptor in den Registern zurück. Nach dem Aufruf enthält (A) die Länge des Strings, (X) das Low Byte der Adresse und (Y) das High Byte.

    Vor dem Aufruf von Eval_String musst Du sicher stellen, dass das BASIC ROM eingeschaltet ist (Bank 15).

    Zum Zugriff auf den String, der sich in Bank 1 (RAM 1) befindet, verwendest Du am besten die Routine Fetch_1, die im Common Bereich liegt. Deshalb kann die Routine von jeder Bank aus aufgerufen werden. Du musst vor dem Aufruf NICHT auf eine andere Bank schalten.


    Code
    1. ; *******************
    2. 877b Eval_String ; $877b
    3. ; *******************
    4. 877b 20 ef 77 JSR Eval_Expression
  • Ich habe noch 2 verschiedene Vergleichslisten der Speicherbelegung div. Commodorerechner gescant. Bei Interesse könnt ihr die Euch gerne unter den folgenden Links runterladen: