eine Frage zu Madass


eine Frage zu Madass

von Koche » Mo 6. Dez 2010, 13:00
Hi,

ich brauche mal einen Tipp oder Hilfe. Und zwar möchte ich mit Madass innerhalb einer "rept" Wiederholungsanweisung ein paar Label in diesem Format erzeugen:

"Labelname_"+"_"+"akt. Zähler der Wiederholung"

so dass dies hier heraus kommen könnte:

Code: Alles auswählen
test_1
test_2
test_3
test_4


Das Problem ist einfach dies, dass ich nicht weiß, wie ich den "Schleifenzähler" (mittels "#" ermittelbar) zum Aufbau des Labels mit heranziehen kann,.

Ein

Code: Alles auswählen
test_#


ergibt wie alles andere einen schönen saftigen Fehler. Auch der Umweg über eine extra temp. Variable scheitert daran, dass Madass leider nicht den Wert dieser Variable einträgt, sondern das Label lediglich um den Variablennamen erweitert.

!!!! Ganz vergessen:

Es ginge an sich folgendes ....

Code: Alles auswählen
.REPT 10, #
label:1           ; LABEL0, LABEL1, LABEL2 ... LABEL9
.ENDR


Ich verwende diese Wiederholung jedoch in einem Macro, das ebenfalls ein paar Variablen übergeben bekommt und diese über :1 bis :ultimo bereit stellt. Das obige Beispiel bringt mir in meinem Fall & innerhalb der Wiederholung für ":1" leider nicht den Schleifenzähler sondern den Inhalt der Macro Variablen ":1" ;-(



Weiß jemand Rat ???? ;-)

Danke schon mal und Grüße
Alexander

Re: eine Frage zu Madass

von Jac » Di 14. Dez 2010, 00:34
Hi,

Wenn Du das in ein Macro packst, sind die Label eh wieder lokal. Was wäre also ihr Sinn? Erklär doch mal kurz, was Du eigentlich erreichen willst.

Re: eine Frage zu Madass

von Koche » Di 14. Dez 2010, 19:01
Hallo Peter,

erst mal Glückwunsch zu deinem tollen Demo und auch von meiner Seite vielen vielen Dank auch für die für mich inzwischen unverzichtbare "WUDSN IDE". ;-)

Nun gut, wenn ich das so im Nachhinein lese hab ich mich ein wenig unglücklich ausgedrückt bzw. das Pferd vom falschen Ende aufgezäumt.

Ich habe in etwa dies hier .... (der Sinn oder Unsinn sei mal dahin gestellt ;-)n )

Ein Macro, das als Parameter einen Namen für ein globales Label und einen Zähler mitbekommt. Gelesen werden sollen "Zähler" Bytes, jedoch steht hier die Adresse nicht von vornherein fest, der Lo Adressanteil muß von Zeit zu Zeit geändert werden.

Code: Alles auswählen
                       macro dings                             ; mit :1 = Bezeichner für ein globales Label, :2 = Zähler

                        ; Programmteil, der den lo Adressanteil ändert .............. ab und an !!!!
:1_sometimes
                        .def :1_sometimes             ; brauche ich im Moment global

                        lda #"neues Lo"
                        .rept   :2                              ; Zähler, welcher dem Macro übergeben wird
                        sta labelxy_nr_???+1
                        .endr

                        ; ........................ tu dies, tu das
                        ; .... zum Beispiel den Aufruf der Funktion :1_sometimes in einen Aufruf der Funktion :1 verwandeln
                        ; da letztere des öfteren und erster nur bei geänderten Bedingungen benötigt wird

                        ; Programmteil, in dem Werte von sich ändernden Adressen gelesen und
                        ; auf Adresse so-und-so gespeichert werden 

:1                      ; wird um einiges öfter als ":1_sometimes" benötigt
                        .rept   :2                              ; Zähler, welcher dem Macro übergeben wird

labelxy_nr_???
                        lda     $e000                        ; Adresse jetzt mal zufällig gewählt
                        sta     $d000                        ; Adresse jetzt mal zufällig gewählt

                        .endr

                        ; ........................... u.s.w.

                        endm


Das Problem ist der lokale Bezeichner "labelxy_nr_???". Wobei die ??? für Zahlen von 1 bis "Zähler" stehen und eine entsprechende Anzahl an unterschiedlichen Labels ergeben. Diese kommen aber einfach nicht zustande .... egal welchen der oben beschriebenen Wege ich gehe.

Wahrscheinlich ist es ganz einfach. Ich brauche nur einen Weg, wie ich den Schleifenzähler "#" zur Labelbildung mit heranziehen kann. Achtung!, wie geschrieben funktioniert etwas wie dies hier

Code: Alles auswählen
.REPT 10, #
label:1           ; LABEL0, LABEL1, LABEL2 ... LABEL9
.ENDR


nicht.

Viele Grüße
Alexander

Re: eine Frage zu Madass

von Jac » Do 23. Dez 2010, 15:06
Hi Alexander,

Das war eine harte Nuss. Dein Problem ist das Macro. Sowohl ".MACRO" als auch ".REPT" verwenden ":1" .. ":9" als formale Parameter. Innerhalb eines Macros hat das Macro Priorität und "#" funktioniert nur an Operandenpositionen. Die Lösung ist, ein zweites/inneres Macro.

Code: Alles auswählen
   opt l+

   .macro m1

   .REPT 10, #, #
   .echo "m1, ", #, :1, :2
   .byte 0+#
   m2 # :1 :2
   .ENDR

   .endm


   .macro m2
   .echo "m2: ", :1, :2, :3
label_:3_:2_:1   .byte :3, :2, :1
   .endm


   org $2000
   
jam   .byte $02
   
   m1 1 2
   
   run jam


Code: Alles auswählen
     3                .echo "m1, ", #, 1, 2
     3             m1, $0000$0001$0002
     4 2001 00            .byte 0+#
     1                .echo "m2: ", 0, 1, 2
     1             m2: $0000$0001$0002
     2 2002 02 01 00      label_2_1_0   .byte 2, 1, 0
     3                .echo "m1, ", #, 1, 2
     3             m1, $0001$0001$0002
     4 2005 01            .byte 0+#
     1                .echo "m2: ", 1, 1, 2
     1             m2: $0001$0001$0002
     2 2006 02 01 01      label_2_1_1   .byte 2, 1, 1
     3                .echo "m1, ", #, 1, 2
     3             m1, $0002$0001$0002
     4 2009 02            .byte 0+#
     1                .echo "m2: ", 2, 1, 2
     1             m2: $0002$0001$0002
     2 200A 02 01 02      label_2_1_2   .byte 2, 1, 2


Ab einer gewissen Komplexität macht er aber natürlich Sinn, den Code zu generieren, statt ihn vorab zu erzeugen. Hier mein Standard Building Block:
Code: Alles auswählen
;===============================================================
;   General purpose code generation routines

   .proc poke

   .proc poke_rts
   lda #$60
   bne poke_a
   .endp

   .proc poke_nops
   cpx #0
   beq poke_nonops
poke_nops_loop
   lda #$ea
   jsr poke_a
   dex
   bne poke_nops_loop
poke_nonops
   rts
   .endp

   .proc poke_bit_zp
   ldx #$24   ;bit $00, 3 cycles
   ldy #$00
   beq poke_xy
   .endp

   .proc poke_axy
   jsr poke_a
   .endp
   
   .proc poke_xy
   txa
   jsr poke_a
   tya
   .endp
   
   .proc poke_a
   sta $ffff
   .endp
poke_adr = *-2
   inc poke_adr
   beq inc_high
   rts
inc_high
   inc poke_adr+1
   rts
   .endp