atarionline.pl MADS .makro argumenty +. rept - Forum Atarum

    Jeśli chcesz wziąć udział w dyskusjach na forum - zaloguj się. Jeżeli nie masz loginu - poproś o członkostwo.

    • :
    • :

    Vanilla 1.1.4 jest produktem Lussumo. Więcej informacji: Dokumentacja, Forum.

      • 1:
         
        CommentAuthorYosh
      • CommentTime4 Aug 2018 20:08
       
      Hej mam sobie taki kawałek makra

      .if args > 0
      LDA #:1
      STA :2
      .endif
      .if args > 1
      LDA #:3
      STA :4
      .endif

      a chciałbym go ujechać
      .rept args
      ..
      ..
      .endr

      da się ?
      • 2: CommentAuthortebe
      • CommentTime4 Aug 2018 21:08
       
      .macro tst

      .rept 10

      ift #>0
      lda #:1
      sta :2
      eif

      ift #>1
      lda #:3
      sta :4
      eif

      .endr
      .endm
      • 3:
         
        CommentAuthorYosh
      • CommentTime4 Aug 2018 21:08 zmieniony
       
      Kurka, za zwięźle się wypowiedziałem - sorki. Upraszczając

      .macro tst
      .rept :0
      sta :1
      .endr
      .endm

      to zadziała ale wklei pierwszy argument :0 razy, ja bym chciał żeby to dla wszystkich parametrów makra wygenerowało sta

      cos w stylu
      sta :#
      • 4: CommentAuthortebe
      • CommentTime4 Aug 2018 22:08
       
      .macro tst

      :+:1 sta :2

      .endm
      • 5:
         
        CommentAuthorYosh
      • CommentTime4 Aug 2018 23:08
       
      .macro tst
      :+:0 sta :1
      .endm

      tst 10 20 30

      generuje
      sta 10
      sta 10
      sta 10

      a chciałbym:
      sta 10
      sta 20
      sta 30
      • 6: CommentAuthortebe
      • CommentTime5 Aug 2018 11:08
       
      chcesz wygenerować kod zależnie od liczby przekazanych argumentów, czy masz z góry określoną liczbę argumentów ?
      • 7: CommentAuthortebe
      • CommentTime5 Aug 2018 12:08
       
      .macro tst
      ?sta=:2
      .rept :1
      sta ?sta
      ?sta+=10
      .endr
      .endm

      tst 5,710
      • 8: CommentAuthorrobert
      • CommentTime5 Aug 2018 12:08 zmieniony
       
      .macro tst
      .rept :0, #+1
      lda :1
      .endr
      .endm

      Zdaje się, że takie coś powinno działać, ale nie działa, bo argument :1 jest brany na sztywno z .macro a nie z .rept. Czyli np. tst 10 20 30 generuje 3 razy lda 10. Jeśli zmienić lda :1 na lda :2 to zamiast błędu dla .rept, po wywołaniu tst 10 20 30 generuje 3 razy lda 20. To samo dla lda :3, generuje 3 razy lda 30. Dopiero lda :4 generuje błąd, ale bład adresowania LDA $FFFFFFFF -> ERROR: Illegal addressing mode (CPU 6502). Zdaję sobie sprawę, że trochę dziwna ta konstrukcja, tzn. .rept wewnątrz .macro z sięganiem po argumenty piętro wyżej (takie coś podobne do adresowania pośredniego). Argument :1 sięga do argumentu .macro, a nie do .rept, więc nie pobiera kolejnych w pętli. Chyba o to chodziło dla Yosh i byłoby uniwersalne dla dowolnej ilości i wartości argumentów .macro.
      • 9: CommentAuthortebe
      • CommentTime5 Aug 2018 12:08
       
      nie działa, bo REPT też rozpoznaje argumenty, poza makrem zadziała
      • 10:
         
        CommentAuthorYosh
      • CommentTime5 Aug 2018 23:08
       
      ok, dzięki, czyli argumenty .rept przysłaniają te z .macro. Spoko, tak podejrzewałem ale myślałem że jest tam jakiś hak w stylu:

      .rept :0, :!@#$%^

      gdzie :!@#$%^ "wszystkie argumenty makra po sobie", coś jak c-owe va_arg.
      • 11: CommentAuthortebe
      • CommentTime6 Aug 2018 07:08
       
      możesz spróbować zapisać parametry (byte) przez .put a potem odczytać je przez .get

      .put 3,5,7,9

      .get[0]
      .get[3]
      ...
      ...
      • 12:
         
        CommentAuthorYosh
      • CommentTime6 Aug 2018 13:08
       
      a pewnie, że używam :) myślałem że da się ładniej

      apropo, skoro jest
      .GET [index] 'filename'["filename"][*][+-value][,+-ofset[,length]]
      .WGET [index]
      .LGET [index]
      .DGET [index]

      to może i put dorobi się W L D wariantów

      .PUT [index] = value

      :D