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

letzter Beitrag von ITDS am

Zeiger auf eine Adresse an Subroutine übergeben

  • Hallo zusammen,


    ich hänge an einem Problem, dessen Lösung mir auch nach Blick in 7 Bücher nicht gelungen ist. Ich bin seit Jahren von Hochsprachen so verwöhnt, dass ich nicht mehr weiß, wie man in Assembler an eine Subroutine eine Adresse übergibt. Die Übergabe von Parametern via Stack (wenn sinnvoll) oder Zeropage ist mir geläufig.


    Mein Vorhaben: Beliebig viele Einzeltexte, die im DATA-Bereich abgelegt und Nullterminiert sind, in einer Subroutine ausgeben. Den Cursor über $fff0 positionieren und einen Text dann über BSOUT ($ffd2) ausgeben, ist kein Problem. Aber ich will die ganze Prozedur nicht jedesmal für einen neuen Text-Teil erneut in den Quelltext einfügen müssen:


    ;cursor positionieren
    ...
    jsr write
    ...
    ...
    ...
    ;text ausgeben
    write
    ldx #$00
    .schleife
    lda text,x [1]
    beq end_write
    jsr BSOUT
    inx
    jmp .schleife
    end_write
    rts


    ;--- DATA ---


    text1 !by "A",0
    text2 !by "B",0


    [1] hier liegt der Hase im Pfeffer. Wie kann ich "text" übergeben, die Adressen heissen ja text1 und text2. Wie kommt eigentlich eine Adresse, die ja zwei Byte lang ist in ein Register, das nur ein Byte fasst? OK, das sind dann schon zwei Fragen.


    Vielen Dank schon mal


    Gruß aus der (ziemlich) sonnigen Pfalz


    Siggi

  • Boah Diddl, dat war flott.


    Danke für die schnelle Antwort. Lo und Hi-Byte der Adresse in der ZP ablegen war mein Ansatz. Aber wie krieg ich die beiden Werte aus der ZP dann in der Ausgabeschleife (write) in das ein-bytige Adressregister (lda text,x) rein? Da hängts leider bei mir.

  • Muss der Code ROM fest sein, oder darf der sich selbst verändern? Hier was selbst veränderndes:

  • Wenn du ganz oft viel Text ausgeben willst, dann kannst du es auch SO machen:



    Code
    1. jsr SPAR_PRINTSTRING
    2. dc.b CLRHOME,YELLOW,FONT2,RVSON,"tESTSTRING AUSGEBEN",CR,0





    Du brauchst dann halt ein paar hilfsroutinen ... ;)



  • Gleich mal ausprobiert:


    ;cursor positionieren
    jsr cpos


    ;textausgabe vorbereiten
    lda <t_aus1
    sta $fa
    lda >t_aus1
    sta $fb
    jsr write
    ...
    ...
    ...
    ;text ausgeben
    write
    ldy #$00
    .schleife
    lda ($fa),y
    beq end_write
    jsr BSOUT
    iny
    jmp .schleife
    end_write
    rts


    ;--- DATA ---


    text1 !by "A",0
    text2 !by "B",0


    Leider kein Erfolg. An der richtigen Stelle wird jetzt nur "/7" ausgegeben. Im übrigen, ich nutze im Moment acme in VICE.

  • Ihr seid viel zu schnell mit den Antworten, vielen Dank. Die anderen Tipps werd ich erst heut Abend ausprobieren können. Ich will das Ganze ja auch nachvollziehen können.

  • lda <t_aus1
    sta $fa
    lda >t_aus1


    Hmm, also erstens kann ich in Deinem Beispielcode das Label "t_aus1" nicht entdecken, aber wahrscheinlich meinst Du "text1".
    Und zweitens fehlt hier das #-Zeichen, da Du ja einen absoluten Wert (nämlich die Adresse von "text1") laden willst und nicht den Inhalt einer Speicherstelle.


    Also:

    Code
    1. lda #<text1
    2. sta $fa
    3. lda #>text1
    4. sta $fb


    CU
    Kratznagel

  • Danke Kratznagel, das hat mich eben wieder 15 Minuten meinens Lebens gekostet, das rauszukriegen. Hab zu spät hier rein geguckt. Ja t_aus1 ist text1, da ich den Code nicht kopiert sondern von Hand geschrieben habe.

  • :winke: Vielen Dank an alle.


    Die Version von Bastet Furry scheint mir am wenigsten Speicher zu verbraten und hat alles was ich brauche. Ich bin alle anderen Vorschläge auch durchgegangen und hab heut viel gelernt. Jetzt schau ich mir noch mal in Ruhe die Adressierungsarten an und experimentiere weiter. Als ich damals (kurz nach dem Krieg, Die Freundin würde jetzt wieder Fragen: Dem 30jährigen?) auf dem C64 rumhackte, war selbst modifizierender Code noch nicht so In. Sieht aber schick aus.


    Gruß aus der (ziemlich) sonnigen Pfalz


    Siggi