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
     
    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
     
    .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 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
     
    .macro tst

    :+:1 sta :2

    .endm
    • 5:
       
      CommentAuthorYosh
    • CommentTime4 Aug 2018
     
    .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
     
    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
     
    .macro tst
    ?sta=:2
    .rept :1
    sta ?sta
    ?sta+=10
    .endr
    .endm

    tst 5,710
    • 8: CommentAuthorrobert
    • CommentTime5 Aug 2018 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
     
    nie działa, bo REPT też rozpoznaje argumenty, poza makrem zadziała
    • 10:
       
      CommentAuthorYosh
    • CommentTime5 Aug 2018
     
    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
     
    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
     
    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