Hallo Besucher, der Thread wurde 1,8k mal aufgerufen und enthält 3 Antworten

letzter Beitrag von Courage am

Vass 16 Frage

  • Also, ich habe ein selbsmodifizierendes Program
    geschrieben und musste nach dem assemblieren feststellen,dass das program das Bankbyte unterschlagen hat.Habe ich hier etwas falsch gemacht??


    Bsp:


    *=020000


    lda $00d011
    lsr
    lsr
    adc #12
    sta aa+1


    aa .by $12


    so und nun wir das Lable "aa" als 16bit Adresse interpretier.muss aber da es alles in bank 2 liegt eine 24 Bit breite Adresse haben

  • Schwupps! Und schon erhielt ich Antwort von Chester/PTV:


    Also, das Label aa hat doch eine 24-Bit-Adresse, weil's in dem Bereich liegt, den Du mit "*=020000" eingeleitet hast. Nur ist der Befehl "STA aa+1"
    leider ein 16Bit-Befehl und geht daher auf Bank $00. Das fehlende Bankbyte zur Bildung der vollständigen 24-Bit Adresse ergänzt die CPU dann aus dem Data-Bankbyte-Register, und das ist halt defaultmäßig $00.


    Wenn Du ein Programm in einer anderen Bank als $00 (in Deinem Fall $02) laufen lassen willst, dann musst Du der CPU auch noch mitteilen, dass von
    nun an auch DATEN dort zu finden sind, damit LDA und STA in der richtigen Bank arbeiten.


    Du kannst Dein Programm SO anfangen:


    * = 020000


    PHK
    PLB


    Dass pusht dass Programm-Bankbyte-Register ($02) auf den Stapel und pullt es wieder von dort in das Data-Bankbyte-Register. Von nun an wirkt ein LDA $xxxx wie ein LDA $02xxxx. Somit funktioniert dann auch Dein "STA aa+1" wie erwartet.


    Dein LDA $00D011 muss natürlich in Langschreibweise bleiben, weil ein LDA $D011 sonst als LDA $02D011 assembliert wird - nicht das, was Du willst! :)