sta ($F9)+8,y nicht möglich?

  • sta ($F9)+8,y nicht möglich?

    Neu

    Hallo alle zusammen,

    ich bräuchte mal eine kleine Hilfe bei der Assemblerprogrammierung

    Ist bei der indirekten Y-nachindizierten Zeropage-Adressierung denn ein Konstrukt wie im Titel möglich?

    Ich nutze das CBM prg Studio falls diese Info benötigt wird :D


    Grüße
  • Neu

    Nein,
    es gibt ja STA (zp),y welches mit y=8 an die Adresse zp+8 schreibt und STA (zp,x) welches mit x=8 and die adresse schreibt die bei zp+8 steht.

    Du kannst Dir das auch anders merken:
    am C64/6502 ist jeder opcode genau 8 bit breit mit 8 oer 16 bit 'daten'.
    Wenn es 16 bit sind, ist das IMMER eine absolute Adresse.
    Fuer Deine '8' im Beispiel waere also gar kein Platz.
  • Neu

    Ok,

    dann muss ich etwas ausholen.

    Ich möchte innerhalb einer Schleife an die Adressen zp und zp+8 schreiben, wobei eben die Zieladresse mit jedem Schleifendurchlauf um eins erhöht werden soll. Wie kann ich denn sowas nun lösen?

    Benötige ich dazu nun zwei Zähler?
  • Neu

    Ja dann hol ich mal noch weiter aus ...

    Ich möchte ein Zeichen (8x8) auf dem Grafikbildschirm anzeigen.
    Dieses Zeichen liegt nun nicht im praktischen Raster sondern zum einen um vier Bit nach rechts verschoben sowie um 4 Bit nach unten.

    Hier mal mein bisheriger Versuch:


    Brainfuck-Quellcode

    1. LDY #$00
    2. floop LDA ZeichenAdr,Y
    3. AND #%00001111
    4. STA $2034,Y
    5. LDA ZeichenAdr,Y
    6. AND #%11110000
    7. STA $2034+8,Y
    8. INY
    9. CPY #$04
    10. BNE floop
    11. floop2 LDA ZeichenAdr,Y
    12. AND #%00001111
    13. STA $216C,Y
    14. LDA ZeichenAdr,Y
    15. AND #%11110000
    16. STA $216C+8,Y
    17. INY
    18. CPY #$08
    19. BNE floop2
    Alles anzeigen

    Was ja nun gar kein Problem ist die ZeichenAdr über die ZP bereit zu stellen.
    Nun wollte ich halt noch die Startadresse (hier also $2034) in der ZP bereit stellen und das ganze dann einfach als Funktion aufrufen.

    Mein Problem sind nun also die Zieladressen und da hab ich entweder nen Knoten im Hirn oder es gibt keine einfache Lösung ?(


    Grüße,
    derSchnippe
  • Neu

    Ob das einfacher ist, weiss ich nicht, aber wie wär's mit sowas:

    Quellcode

    1. zp1 = $fb ;Zeichenadresse
    2. zp2 = $fd ;Zieladresse
    3. ;oder andere Adressen in der ZP ;-)
    4. LDY #$04
    5. floop LDA (zp1),Y
    6. AND #%00001111
    7. STA (zp2),Y
    8. INY
    9. CPY #8
    10. BNE floop
    11. LDY #12
    12. floop2 LDA (zp1),Y
    13. AND #%11110000
    14. STA (zp2),Y
    15. INY
    16. CPY #16
    17. BNE floop2
    18. ;und dann analog für die zweite Zeile
    Alles anzeigen
  • Neu

    Mahlzeit zusammen...


    mc71 schrieb:

    Lies das Datenblatt, da steht alles drin was geht.
    Klasse Idee - wieso nur ist mir das nicht selber eingefallen 8o ;)

    Hätte ja sein können dass es nen relativ einfachen Trick gibt der mir nicht eingefallen ist?


    Gelöst habe ich das ganze nun so:

    Quellcode

    1. show_sym lda $f9
    2. clc
    3. adc #$08
    4. sta $fb
    5. lda $fa
    6. sta $fc
    7. ldy #$00
    8. sym_loop lda ($F7),y
    9. AND #%00001111
    10. STA ($F9),y
    11. lda ($F7),y
    12. AND #%11110000
    13. STA ($FB),y
    14. iny
    15. cpy #$04
    16. BNE sym_loop
    17. lda $f9
    18. clc
    19. adc #$38
    20. sta $f9
    21. adc #$08
    22. sta $fb
    23. inc $fa
    24. lda $fa
    25. sta $fc
    26. sym_loop2 lda ($F7),y
    27. AND #%00001111
    28. STA ($F9),y
    29. lda ($F7),y
    30. AND #%11110000
    31. STA ($FB),y
    32. iny
    33. cpy #$08
    34. BNE sym_loop2
    35. rts
    Alles anzeigen

    Es funktioniert soweit und tut was es soll - ob das nun gut ist oder man das noch viel einfacher lösen kann ist ne ganz andere Frage :D


    Danke erstmal für die Hilfe,

    derSchnippe
  • Neu

    ... oder gleich mit "lax" laden ... dann braucht man nur noch den "txa".
    Anderes Problem ist: Was ist, wenn bei der Addition von #8 auf $f9 ein Überlauf passiert ?
    Besser zwischen "lda $fa" und "sta $fc" ein "adc #$00" einfügen ...
  • Neu

    Mac Bacon schrieb:

    Statt das gleiche Byte ein zweites Mal zu laden (kostet fünf oder sechs Taktzyklen), kannst Du den Wert in X aufbewahren (TAX...TXA kostet zwei mal zwei Taktzyklen).
    Über Zeitverbrauch hab ich mir noch gar keine Gedanken gemacht - muss ich mal im weiteren Verlauf etwas darauf achten.

    peiselulli schrieb:

    ... oder gleich mit "lax" laden ... dann braucht man nur noch den "txa".
    Anderes Problem ist: Was ist, wenn bei der Addition von #8 auf $f9 ein Überlauf passiert ?
    Besser zwischen "lda $fa" und "sta $fc" ein "adc #$00" einfügen ...
    Was für ein Problem könnte mir denn ein Überlauf verursachen (mal abgesehen davon dass dann ja eh keine Zieladresse mehr stimmen würde) und ginge statt dem "adc #$00" auch ein "clc"?
  • Neu

    Das High-Byte muss entsprechend korrigiert werden, wenn es zum Überlauf des Low-Bytes kommt. Wie z.B. mit den Anpassungen unten.
    Wie schon oben angemerkt, wird das brachliegende X-Register mitverwendet, hier aber für das High-Byte, da man das bei einer Kettenaddition
    öfter angreifen muss und billiger zu manipulieren ist.
    Ok, die Carry-Optimierungen kann ich mir nicht abgewöhnen ... muss nicht sein, wenn es nicht um Speed geht.

    Quellcode

    1. show_sym lda $f9
    2. clc
    3. adc #$08
    4. sta $fb
    5. lda $fa
    6. adc #00 ; !!!!!
    7. sta $fc
    8. ldy #$00
    9. sym_loop lda ($F7),y
    10. AND #%00001111
    11. STA ($F9),y
    12. lda ($F7),y
    13. AND #%11110000
    14. STA ($FB),y
    15. iny
    16. cpy #$04
    17. BNE sym_loop
    18. ldx $fa ; high-byte für transfer und korrektur vorbereiten
    19. lda $f9
    20. ;clc ; kann man sich sparen, da das cpy oben C=1 setzt
    21. adc #$37 ; um eins weniger weil C=1 ist
    22. sta $f9
    23. bcc + ; überlauf?
    24. inx ; im high-byte berücksichtigen
    25. clc ; nur im überlauffall C für folgende add. auf 0
    26. + inx ; + $0100
    27. stx $fa ; ($f9) = ($f9) + $0138
    28. adc #$08 ; C ist 0
    29. sta $fb
    30. bcc ++ ; etwaiger überlauf
    31. inx ; ins high-byte bringen
    32. ++ sta $fb ; ($fb) = ($f9) + 8
    33. stx $fc
    34. ;inc $fa ; passiert schon oben
    35. ;lda $fa ; ersetzt durch vorige zeilen
    36. ;sta $fc
    37. sym_loop2 lda ($F7),y
    38. AND #%00001111
    39. STA ($F9),y
    40. lda ($F7),y
    41. AND #%11110000
    42. STA ($FB),y
    43. iny
    44. cpy #$08
    45. BNE sym_loop2
    46. rts
    Alles anzeigen