atarionline.pl Mads - dyrektywa #IF - 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:
         
        CommentAuthorxeen
      • CommentTime25 Apr 2013 11:04 zmieniony
       
      wydaje mi się, że dyrektywa #IF nie zawsze dobrze rozpoznaje zagnieżdzenia. W przypadku konstrukcji

      #IF
      kod
      #END
      #IF
      kod
      #END
      #IF
      kod
      #END
      #IF
      kod
      #END

      miałem problem, dopiero wstawienie spacji między #END i #IF pomogło. Straciłem masę czasu na diagnozie czemu coś nie działa - to wklejam - ale na razie na zasadzie podejrzeń, może ktoś kiedyś tez się zatnie.

      Zastanawiam się, jak bardzo "nie opłaca" się używać tej dyrektywy kosztem pure asma - ile się traci na wydajności, bo przejrzystość jest ogromna.
      • 2: CommentAuthortebe
      • CommentTime25 Apr 2013 11:04
       
      nie spotkałem się z czymś takim jeszcze, jakby co to jest jeszcze #ELSE

      a kod jaki generuje zawsze możesz podejrzeć
      • 3: CommentAuthorcalypso2k
      • CommentTime25 Apr 2013 12:04
       
      @xeen a mógłbyś, jeśli to nie tajemnica, wkleić rzeczony kawałek kodu? Albo taki, który cierpi na tą przypadłość.

      Wygląda, żę #END łyka kolejnego #IF w jakimś skrajnym przypadku, ale nijak to się ma do źródła mads'a...
      • 4:
         
        CommentAuthorxeen
      • CommentTime25 Apr 2013 12:04
       
      tak, postaram się zapodać wieczorem :)
      • 5:
         
        CommentAuthorxeen
      • CommentTime25 Apr 2013 15:04 zmieniony
       
      bzdurę napisałem. przepraszam
      nie ma tematu - to wynik nocy i półprzytomności.
      • 6: CommentAuthorcalypso2k
      • CommentTime25 Apr 2013 15:04
       
      patrząc po kodzie mads'a, tak przypuszczałem :P
      ale miałem w życiu już do czynienia z takimi warunkami granicznymi, że nie będę nikomu podważał, że mu nie działa :)
      • 7:
         
        CommentAuthormgr_inz_rafal
      • CommentTime26 Nov 2014 11:11 zmieniony
       
      Podepnę się pod wątek, żeby nie zaczynać nowego.

      Kompiluję taki oto kawałek kodu:
      .proc is_on_map_3030(.word part2) .var
      ldx #0
      #if .word part2 = game_state.current_map+2 .and .word game_state.current_map = #$3030
      inx
      #end
      rts
      .endp


      I jako output dostaję:
      :?J/2-1 ORA#0
      immovabl.asm (352) ERROR: Value out of range
      Writing listing file...
      Linia 352 to linia z #if-em

      Czy ten komunikat błędu może mnie jakoś nakierować na przyczynę problemu? Podobne konstrukcje z powodzeniem kompilują się w innych miejscach.

      Wersja: mads 1.9.8 build 46 (11 Jan 14)

      ------ EDYTA ------
      Wychodzi na to, że zarówno "lewa" jak i "prawa" strona .and osobno kompilują się poprawnie. Może jakiś specyficzny problem z wyrażeniem logicznym?

      Dodam też, że 5 linijek niżej jest prawie identyczny #if i ten kompiluje się nawet z .and

      :/
      • 8: CommentAuthorwieczor
      • CommentTime26 Nov 2014 11:11
       
      A jak wygląda deklaracja game_state.current_map ?
      • 9:
         
        CommentAuthormgr_inz_rafal
      • CommentTime26 Nov 2014 11:11 zmieniony
       
      .STRUCT game
      current_map .dword
      .ENDS

      .var game_state game


      PS. W międzyczasie namierzyłem też inne, problematyczne #if-y, które nie operują na "game_state".
      • 10: CommentAuthorwieczor
      • CommentTime26 Nov 2014 12:11
       
      Ale moment może się nie znam, ale tu masz double word a w ifie word? To chyba o to chodzi
    1.  
      Nie, to akurat jest OK (if-uję osobno dwie części dworda).

      Muszę chyba spróbować metodą eliminacji "czegoś wcześniej" w kodzie - projekt jest już dość duży.

      Albo przepiszę te #ify na normalny, ludzki ASM :)
      • 12: CommentAuthorwieczor
      • CommentTime26 Nov 2014 15:11 zmieniony
       
      Zrobiłem na próbę wersję minimalistyczną:

      org $2000
      .def part2

      .STRUCT game
      current_map .dword
      .ENDS

      .var game_state game

      .proc is_on_map_3030(.word part2) .var
      ldx #0
      #if .word part2 = game_state.current_map+2 .and .word game_state.current_map = #$3030
      inx
      #end
      rts
      .endp


      i nic nie krzyczy, więc Ci kłamie że to tutaj :)

      Edit: ej, ale w wygenerowanym kodzie nie ma żadnego ORA... Więc coś tu jest nie tak
    2.  
      Tak, wersja minimalistyczna działa. Bliźniaczy #if utworzony parę linijek niżej przez copy&paste, gdzie #$3030 zamieniłem na #$3031 też działa.

      Mnóstwo takich ifów w innych miejscach kompiluje się poprawnie i ten fakt, w połączeniu z dziwnym komunikatem błędu (":?J/2-1 ORA#0") sugeruje, że to MADS się lekko pogubił.
      • 14: CommentAuthorwieczor
      • CommentTime26 Nov 2014 21:11
       
      A w out of range nie chodzi czasem o miejsce w pamięci itp? Taki komunikat dostajesz np przy uzyciu .zpvar i przekroczeniu granicy strony 0.
    3.  
      Dobra, sytuacja wstępnie wyjaśniona.

      Mały background: instalowałem parę dni temu system od nowa i przy okazji porządkowałem też środowisko pracy "do Atari". W swojej naiwności stworzyłem od nowa skrypt do kompilacji i odruchowo dodałem w nim przełącznik "-x" do MADS [Exclude unreferenced procedures].

      Myślę sobie... K*.*a, na drugim kompie przecież TEN SAM kod kompiluje mi się TYM SAMYM kompilatorem :/ Zacząłem porównywać detale i rzeczywiście jedyną różnicą był ten pieprzony "-x" :/

      W tym momencie przypomniało mi się, że już ten problem miałem jakiś mniej więcej rok temu gdy wprowadzałem do Rzygonia coś a'la DLL :)

      No i istotnie procedurka is_on_map_3030() nie jest wywoływana w żadnym miejscu projektu, ale odwołanie do niej jest zawarte dopiero w doładowywanej binarce.

      Zatem, "-x" jest wielce niepożądany, gdyż kod zawarty w procedurze musi zostać skompilowany, bo mimo braku bezpośrednich odwołań, 6502 prędzej czy później tam wskoczy.

      Wnioskuję więc, że MADS może mieć jakiś problem w rozwijaniu pseudorozkazów jak np. #if wewnątrz procedur, które ostatecznie są usuwane. Skutkuje to właśnie takim dziwnym, nic nie mówiącym komunikatem błędu.

      Autor MADSa chyba tu bywa, więc może rzuci przy okazji trochę światła.

      A ja wracam do zabawy :)
      Writing listing file...
      Writing object file...
      7582 lines of source assembled in 8 pass
      15956 bytes written to the object file
    4.  
      Tak, wydaje mi się, że potwierdziłem problem w MADS. Wziąłem, wieczor, Twoją wersję minimalistyczną i dopisałem na końcu "lda", żeby coś tam się jednak kompilowało:
      org $2000
      .def part2

      .STRUCT game
      current_map .dword
      .ENDS

      .var game_state game

      .proc is_on_map_3030(.word part2) .var
      ldx #0
      #if .word part2 = game_state.current_map+2 .and .word game_state.current_map = #$3030
      inx
      #end
      rts
      .endp

      lda #0


      I teraz kompilacja bez opcji "-x":
      c:\>mads.exe -l:test.lst -o:test.xex test.asm
      Writing listing file...
      Writing object file...
      23 lines of source assembled in 4 pass
      67 bytes written to the object file


      Oraz z "-x":
      c:\>mads.exe -x -l:test.lst -o:test.xex test.asm
      :?J/2-1 ORA#0
      test.asm (12) ERROR: Value out of range
      Writing listing file...
      • 17: CommentAuthorwieczor
      • CommentTime27 Nov 2014 03:11
       
      O widzisz, dobrze wiedzieć, dzięki za info.