Hello, Guest the thread was viewed721 times and contains 7 replies

last post from dddaaannn at the

Brauche Hilfe mit Xemu & Mega65

  • Hi,


    ich benötige einen Rat im Umgang mit dem Mega65 Emulator.


    Meine Umgebung ist:

    - Xemu 20230201214849

    - ROM 920377.


    Folgendes Programm lasse ich laufen:

    Das Programm schreibt eine Konstante an eine Adresse im oberen 32K Bereich, liest sie aus und schreibt diesen Wert an eine Adresse im unternen 32K Bereich.

    Der Vorgang läuft zweimal. Einmal als Assembler Routine, einmal in Basic. Das Ergebnis wird jeweils angezeigt.

    RUN

    Code
    1. VORHER : 0 0
    2. MIT MCODE: 191 12
    3. MIT BASIC: 12 12

    Die Ausgangswerte sind beliebig. Hier jetzt


    "Mit Mcode" zeigt das Ergebnis des Assemblerprogramms. 191 ist der Wert aus Bank 2 Adresse $BFF0 und nicht Bank 0.

    "Mit Basic" zeigt das erwartete Verhalten.

    Nun kenne ich die Routinen für PEEK und POKE und weiß, daß mit _lda_far und _sta_far Routinen im Rom gearbeitet wird, aber ich hatte gehofft, daß ich bei Adressen kleiner als $C000 noch sicher bin.

    Ja, und "BANK 0" setzt nur eine Speicherzelle.


    Ist dieses Programm-Verhalten normal, oder mache ich einen Fehler?

    Leider habe ich keinen Mega65, um zu prüfen, ob es zwischen Emulator und Gerät einen Unterschied gibt.


    Danke für Eure Zeit :-)

  • Ich denke in BASIC sieht die CPU andere Speicherbereiche wie in Assembler (nach dem SYS Aufruf).

    Genauer kann ich dazu nix sagen, denn das Thema Speicherverwaltung ist beim C65/Mega65 ziemlich komplex.


    Du kannst hier mal reinschauen:

    https://github.com/MEGA65/c65-…ster/c65manualupdated.txt


    Das ist das ursprüngliche Pflichtenheft aus der Entwicklungszeit des C65 Ende der 1980er.

    Aber die Speicherverwaltung/Aufteilung ist aktuell noch die gleiche wie die im original C65 Modus.

    Du musst dir ab Kap. 1.5.2 anschauen.

    Das fand ich sehr erhellend, als ich mich damit mal beschäftigt hatte.


    Ich hab mir die Speicherverwaltung bzw. den MAP Befehl der CPU mal genauer angeschaut.

    Aber irgendwann bekommt man Kopfschmerzen, und dann bin ich da ausgestiegen.

    Das ist alles sehr speziell beim C65/Mega65.


    Die Beschreibung des SYS Befehls kannst du dir auch mal anschauen.


    Sorry, weiter kann ich dir nicht helfen.

  • Ist dieses Programm-Verhalten normal, oder mache ich einen Fehler?

    Mit dem ROM 920377 (und auch mit den neueren) ist es "normal".


    Bei Benutzung des SYS-Befehls ist für das aufgerufene Maschinenprogramm in diesen ROM ab $A000 standardmäßig "BANK 2" eingestellt. Das ist vom ROM so vorgegeben worden, man wollte den SYS-Befehl "sicherer" machen und den Bereich ab $C000 "fix eingeblendet" haben. Allerdings ist das fehlerhaft und schon ab $A000 der Fall. Siehe dazu auch diesen Beitrag bzw. den ganzen Thread dazu.


    Bis Adresse $9FFF klappt dein Beispiel noch:




    BTW: Mit meinem ROM BASIC65.EX ist beim SYS-Befehl der größere Bereich verfügbar und dein Beispiel klappt damit:




    Es liegt also definitiv am verwendeten ROM, dass dein Beispiel bei $BFF0 nicht klappt. ;)

  • Bank 2 enthält C64 ROM, in dem Fall landest Du also im BASIC V2 ROM des C64 Modus. Warum dort, wenn doch eigentlich MAP und $D030 nichts dort eingeblendet haben sollten? Weil Register $01 auch noch da ist - hat zwar die niedrigste Mapping-Prio von allen Memory-Map Methoden, aber greift eben trotzdem, wenn alles andere aus ist. Wenn Du im ASM Programm das C64 Basic ROM ausblendest, landet das LDA auch in Bank 0.

  • Update: I agree with kibo that the default boot state of the $0001 register is inappropriately set to $FF. I have filed a bug to research why it is set this way and whether we can change it. I agree that the MEGA65 boot state should not be using C64-style mapping to block access to RAM. https://github.com/MEGA65/mega65-rom-public/issues/61