atarionline.pl MADS - ERROR: Infinite loop by label (WTF?) - 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:
         
        CommentAuthorPecus
      • CommentTime23 Apr 2025 14:04 (11 godzin temu) zmieniony
       
      Piszę sobie jakiśtam kod dzisiaj i nagle przy drobnej zmianie dostaję powyższy błąd!
      Nie będę tutaj wklejał całości, ale fragmenty które pokazują jak wygląda ten kawałek kodu i co zmieniam.


      ;--------------------------------------------------
      .proc TitlesDLI1
      ;--------------------------------------------------
      pha
      sta WSYNC
      mva #0 COLBAK
      mwa #TitlesDLI1.DLI2 VDSLST
      pla
      rti
      DLI2
      pha
      ...
      mwa #TitlesDLI1.DLI3 VDSLST
      pla
      rti
      DLI3
      pha
      ...
      mwa #TitlesDLI1.DLI4 VDSLST
      pla
      rti
      DLI4
      pha
      ...
      inc SyncByte
      pla
      rti
      .endp
      ;--------------------------------------------------
      .proc IngameDLI1
      ;--------------------------------------------------
      pha
      ...
      mwa #IngameDLI1.DLI2 VDSLST
      pla
      rti
      DLI2
      pha
      ...
      mwa #IngameDLI1.DLI3 VDSLST
      pla
      rti
      DLI3
      pha
      ...
      inc SyncByte
      mwa #IngameDLI1.DLI4 VDSLST
      pla
      rti
      DLI4
      pha
      ...
      mwa #IngameDLI1.DLI5 VDSLST
      pla
      rti
      DLI5
      pha
      ...
      mwa #IngameDLI1.DLI6 VDSLST
      pla
      rti
      DLI6
      pha
      lda StateFlag
      cmp #1 ; game
      bne @+
      sta WSYNC
      sta WSYNC
      sta WSYNC
      mva GameColors+c_pants COLPF2
      @ pla
      rti
      .endp
      ;--------------------------------------------------


      Ten fragment to przerwania DLI dla ekranu tytułowego i drugi zestaw dla gry.
      Tak to wygląda w tej chwili (oczywiście trochę więcej prostego kodu tam jest, ale by nie zaciemniać pomijam).
      To co widać kompiluje się o działa (razem z resztą kodu gry oczywiście) i jest powoli rozbudowywane od jakiegoś czasu. I proszę mi tu nie pisać, że można to zrobić lepiej/inaczej/porządniej :))

      Na początku, po etykiecie TitlesDLI1 jest jeden rozkaz "sta WSYNC" .... potrzebuję tam jeszcze jedną linię poczekać. czyli wymieniam na ":2 sta WSYNC" i .... dostaję wspomniany błąd!
      Oczywiście jeśli "ręcznie" wpiszę dwa razy "sta WSYNC" jest to samo.
      No i nie wiem co jest grane.

      Aaaaa na początku kompilowałem starszym MADsem (i dopiero jak napotkałem ten błąd/ostrzeżenie zaktualizowałem bo pomyślałem, że może już jest poprawiony) i wtedy otrzymywałem: "WARNING: Infinite loop by label INGAMEDLI1.DLI6" ... więc jakaś zmiana była.

      No i utkłem w moim programie. Co robić? !!!!

      edit:
      Dodałem po tych 2 * sta WSYNC jeszcze jedno dodatkowe STA (bo tam kolor się zmienia) i znowu się kompiluje. Co nie zmienia faktu, że coś jest nie tak chyba z MADSem

      edit2:
      O.K. Chyba wiem co się zadziać mogło. Prawdopodobnie przy jakimś konkretnym ułożeniu kodu w pomięci, któryś z adresów DLI miał równe bajty starszy i młodszy. Optymalizacja jednego z mwa zadziałała wtedy tak:

      mwa #IngameDLI1.DLI6 VDSLST

      zamieniła na:
      lda #<IngameDLI1.DLI6
      sta VDSLST
      sta VDSLST+1

      no po tej optymalizacji skracającej kod o 2 bajty, występujący PO nim adres "IngameDLI1.DLI6" się zmienił więc w następnym przebiegu nie miał równych młodszego i starszego bajtu i optymalizacja nie zadziałała i dostaliśmy:
      lda #<IngameDLI1.DLI6
      sta VDSLST
      lda #>IngameDLI1.DLI6
      sta VDSLST+1

      no i przy braku optymalizacji wróciły 2 bajty i adres "IngameDLI1.DLI6" się zmienił więc w następnym przebiegu znowu miał równe młodszy i starszy bajt i optymalizacja znowu zadziałała ... itd. .... :)
      Czyli klasyczny Phase Error z MAC65 :) - tyle, że MADS zrobił 20 przebiegów zanim wyrzucił ten błąd :)))

      Moja culpa.